복붙노트

[PYTHON] 파이썬에서리스트 - 이해력 계산을 병렬화하는 방법?

PYTHON

파이썬에서리스트 - 이해력 계산을 병렬화하는 방법?

목록 이해력과지도 계산은 적어도 이론적으로는 병렬 처리가 비교적 쉽습니다. 목록 이해력 내의 각 계산은 다른 모든 요소의 계산과는 독립적으로 수행 될 수 있습니다. 예를 들어 표현식

[ x*x for x in range(1000) ]

각 x * x- 계산은 (적어도 이론적으로) 병렬로 수행 될 수 있습니다.

내 질문은 : (모든 16 / 32 / ... 코어를 사용하거나 컴퓨터 그리드 또는 계산을 통해 계산을 배포하기 위해 목록 이해 계산을 병렬화하기 위해 파이썬 모듈 / 파이썬 구현 / 파이썬 프로그래밍 트릭이 있습니까? 클라우드를 통해)?

해결법

  1. ==============================

    1.Ken이 말했듯이, 아닙니다. 2.6의 다중 처리 모듈을 사용하면 계산을 병렬화하는 것이 매우 쉽습니다.

    Ken이 말했듯이, 아닙니다. 2.6의 다중 처리 모듈을 사용하면 계산을 병렬화하는 것이 매우 쉽습니다.

    import multiprocessing
    
    try:
        cpus = multiprocessing.cpu_count()
    except NotImplementedError:
        cpus = 2   # arbitrary default
    
    
    def square(n):
        return n * n
    
    pool = multiprocessing.Pool(processes=cpus)
    print pool.map(square, xrange(1000))
    

    Managers를 사용하여이를 수행하는 방법을 보여주는 설명서에도 분산 계산을 허용해야하는 예제가 있습니다.

  2. ==============================

    2.IMHO, 추가 정보 (예 : OpenMP의 지시문을 사용하여 제공되는 정보)가 없으면 목록 이해의 효과적인 자동 병렬 처리가 불가능하거나 기본 제공 유형 / 방법 만 포함하는 표현으로 제한 될 수 있습니다.

    IMHO, 추가 정보 (예 : OpenMP의 지시문을 사용하여 제공되는 정보)가 없으면 목록 이해의 효과적인 자동 병렬 처리가 불가능하거나 기본 제공 유형 / 방법 만 포함하는 표현으로 제한 될 수 있습니다.

    각 목록 항목에 대해 수행 된 처리가 부작용이 없다는 보장이 없으면 순서가 잘못되어 결과가 유효하지 않을 수도 있습니다 (또는 적어도 다른 경우).

    # Artificial example
    counter = 0
    
    def g(x): # func with side-effect
        global counter
        counter = counter + 1
        return x + counter
    
    vals = [g(i) for i in range(100)] # diff result when not done in order
    

    작업 배포 문제도 있습니다. 문제 공간은 어떻게 분해되어야 하는가?

    각 요소의 처리가 작업 (~ 작업 팜)을 구성하면 사소한 계산이 포함 된 많은 요소가있을 때 작업을 관리하는 오버 헤드가 병렬 처리의 성능 향상을 막습니다.

    또한, 문제 공간이 이용 가능한 프로세스들 사이에서 동등하게 분할되는 데이터 분해 접근법을 취할 수있다.

    목록 이해력이 발전기와도 작동한다는 사실은 약간 까다 롭습니다. 그러나 사전 반복의 오버 헤드가 용인되는 경우에는 아마이 점을 보여줄 수 없습니다. 물론 후속 품목이 조기에 반복 될 경우 결과를 변경할 수있는 부작용이있는 발전기도있을 수 있습니다. 매우 가능성은 없지만 가능합니다.

    더 큰 관심사는 프로세스 전반에 걸친 부하 불균형입니다. 각 요소가 처리하는 데 동일한 시간이 걸릴 것이라고 보장 할 수 없으므로 정적으로 분할 된 데이터로 인해 유휴 시간 동안 대부분의 작업이 수행 될 수 있습니다.

    목록을 더 작은 덩어리로 나누고 각 자식 프로세스가 사용 가능할 때이를 넘겨주는 것은 좋은 절충안입니다. 그러나 청크 크기의 선택은 응용 프로그램에 따라 달라 지므로 사용자가 더 많은 정보를 얻지 못하면 수행 할 수 없습니다.

    몇 가지 다른 답변에서 언급했듯이 하나의 요구 사항에 따라 다양한 접근 방식과 병렬 컴퓨팅 모듈 / 프레임 워크 중에서 선택할 수 있습니다.

    병렬 처리를 위해 Python을 사용해 본 경험이없는 MPI (C 언어)만을 사용했기 때문에, 나는 어떤 것을 보증 할 수있는 위치에 있지 않습니다 (빠른 스캔을 통해, 멀티 프로세싱, jug, pp 및 pyro가 눈에.니다).

    요구 사항이 목록 작성에 최대한 가깝게 머물러 있다면 조끼가 가장 근접한 것으로 간주됩니다. 이 자습서에서 여러 인스턴스에 태스크를 분배하는 작업은 다음과 같이 간단합니다.

    from jug.task import Task
    from yourmodule import process_data
    tasks = [Task(process_data,infile) for infile in glob('*.dat')]
    

    이는 다중 처리와 유사한 작업을 수행합니다 .Pool.map ()은 프로세스를 동기화하고 중간 결과 (redis, 파일 시스템, 메모리)를 저장하기 위해 여러 백엔드를 사용할 수 있습니다. 이는 프로세스가 클러스터의 노드에 걸쳐 있음을 의미합니다.

  3. ==============================

    3.새로운 3.2 concurrent.futures 패키지의 Future.Null (Thread, Process) PoolExecutor.map (func, * iterables, timeout = None) 및 futures.as_completed (future_instances, timeout = None) 함수를 사용하면 도움이 될 수 있습니다.

    새로운 3.2 concurrent.futures 패키지의 Future.Null (Thread, Process) PoolExecutor.map (func, * iterables, timeout = None) 및 futures.as_completed (future_instances, timeout = None) 함수를 사용하면 도움이 될 수 있습니다.

    또한 2.6+ 백 포트로 사용할 수 있습니다.

  4. ==============================

    4.공유 메모리 병렬 처리의 경우 joblib을 권장합니다.

    공유 메모리 병렬 처리의 경우 joblib을 권장합니다.

    from joblib import delayed, Parallel
    
    def square(x): return x*x
    values = Parallel(n_jobs=NUM_CPUS)(delayed(square)(x) for x in range(1000))
    
  5. ==============================

    5.아니요. 목록 이해 자체가 일종의 C 최적화 매크로이기 때문입니다. 그것을 빼내 병렬 처리하면 목록 이해가되지 않습니다. 단지 오래된 구식 MapReduce 일뿐입니다.

    아니요. 목록 이해 자체가 일종의 C 최적화 매크로이기 때문입니다. 그것을 빼내 병렬 처리하면 목록 이해가되지 않습니다. 단지 오래된 구식 MapReduce 일뿐입니다.

    그러나 예제를 쉽게 병렬화 할 수 있습니다. 다음은 Python의 병렬화 라이브러리에서 MapReduce를 사용하는 방법에 대한 좋은 자습서입니다.

    http://mikecvet.wordpress.com/2010/07/02/parallel-mapreduce-in-python/

  6. ==============================

    6.AFAIK 목록에 없습니다.

    AFAIK 목록에 없습니다.

    기존의 for 루프 및 다중 처리 / 스레딩 모듈을 사용하여 확실히 수행 할 수 있습니다.

  7. ==============================

    7.파이썬에 대한 포괄적 인 병렬 패키지 목록은 다음과 같습니다.

    파이썬에 대한 포괄적 인 병렬 패키지 목록은 다음과 같습니다.

    http://wiki.python.org/moin/ParallelProcessing

    목록 이해력의 분할을 직접 처리 할 수 ​​있는지 확실하지 않지만 여러 가지 프로세서에 쉽게 포킹 될 수있는 비 - 목록 이해 방식으로 동일한 문제를 공식화하는 것이 쉽습니다. 클라우드 컴퓨팅 병렬화에 익숙하지는 않지만 멀티 코어 컴퓨터 및 클러스터에서 mpi4py를 사용하여 성공했습니다. 생각해야 할 가장 큰 문제는 통신 오버 헤드가 문제를 병렬화하여 얻을 수있는 이익을 없앨 수 있는지 여부입니다.

    편집 : 또한 다음과 같은 관심이있을 수 있습니다 :

    http://www.mblondel.org/journal/2009/11/27/easy-parallelization-with-data-decomposition/

  8. from https://stackoverflow.com/questions/5236364/how-to-parallelize-list-comprehension-calculations-in-python by cc-by-sa and MIT license