[python] numpy를 가져온 후 멀티 프로세싱에서 단일 코어 만 사용하는 이유는 무엇입니까?

이것이 OS 문제로 간주되는지 확실하지 않지만 누군가 파이썬 끝에서 통찰력이있는 경우 여기에 물어볼 것이라고 생각했습니다.

for사용하여 CPU가 많은 루프 를 병렬화하려고 joblib했지만 각 작업자 프로세스가 다른 코어에 할당되는 대신 모든 코어가 동일한 코어에 할당되고 성능이 향상되지 않는 것으로 나타났습니다.

다음은 아주 간단한 예입니다.

from joblib import Parallel,delayed
import numpy as np

def testfunc(data):
    # some very boneheaded CPU work
    for nn in xrange(1000):
        for ii in data[0,:]:
            for jj in data[1,:]:
                ii*jj

def run(niter=10):
    data = (np.random.randn(2,100) for ii in xrange(niter))
    pool = Parallel(n_jobs=-1,verbose=1,pre_dispatch='all')
    results = pool(delayed(testfunc)(dd) for dd in data)

if __name__ == '__main__':
    run()

htop이 스크립트가 실행 되는 동안 내가 본 내용은 다음과 같습니다.

멈춤

4 개의 코어가있는 랩톱에서 Ubuntu 12.10 (3.5.0-26)을 실행 중입니다. 분명히 joblib.Parallel다른 작업자를 위해 별도의 프로세스를 생성하지만 이러한 프로세스를 다른 코어에서 실행할 수있는 방법이 있습니까?



답변

더 인터넷 검색을 한 후 여기 에서 답을 찾았습니다 .

그것은 그 어떤 파이썬 모듈 (밝혀 numpy, scipy, tables, pandas, skimage수입에 핵심 친화력 …) 엉망. 내가 알 수있는 한,이 문제는 특히 다중 스레드 OpenBLAS 라이브러리와 연결되어 있기 때문에 발생합니다.

해결 방법은 다음을 사용하여 작업 선호도를 재설정하는 것입니다.

os.system("taskset -p 0xff %d" % os.getpid())

모듈을 가져온 후이 줄을 붙여 넣으면 이제 모든 코어에서 예제를 실행합니다.

htop_workaround

지금까지의 경험은 이것이 numpy기계 및 작업별로 다르지만 성능 에 부정적인 영향을 미치지 않는 것으로 나타났습니다 .

최신 정보:

OpenBLAS 자체의 CPU 선호도 재설정 동작을 비활성화하는 두 가지 방법이 있습니다. 런타임에 환경 변수 OPENBLAS_MAIN_FREE(또는 GOTOBLAS_MAIN_FREE)를 사용할 수 있습니다.

OPENBLAS_MAIN_FREE=1 python myscript.py

또는 소스에서 OpenBLAS를 컴파일하는 경우 Makefile.rule줄을 포함하도록 편집하여 빌드 타임에 영구적으로 비활성화 할 수 있습니다

NO_AFFINITY=1


답변

Python 3은 이제 선호도를 직접 설정하는 메소드 를 제공합니다.

>>> import os
>>> os.sched_getaffinity(0)
{0, 1, 2, 3}
>>> os.sched_setaffinity(0, {1, 3})
>>> os.sched_getaffinity(0)
{1, 3}
>>> x = {i for i in range(10)}
>>> x
{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}
>>> os.sched_setaffinity(0, x)
>>> os.sched_getaffinity(0)
{0, 1, 2, 3}


답변

이것은 Ubuntu의 Python에서 일반적인 문제인 것으로 보이며 다음과 같은 것은 아닙니다 joblib.

CPU 선호도 ( taskset)를 실험 해 보는 것이 좋습니다 .


답변