joblib를 사용하여 CPU 집약적인 루프를 병렬화할 때 모든 작업자 프로세스가 단일 코어에 할당되는 문제가 발생할 수 있습니다. 성능 향상은 없습니다.
이 문제는 Numpy, Scipy, Pandas 및 Sklearn과 같은 특정 Python 모듈을 가져올 때 발생합니다. 이러한 모듈은 코어 선호도를 방해할 수 있는 다중 스레드 OpenBLAS 라이브러리에 연결됩니다.
이 문제를 해결하려면 다음 명령을 사용하여 작업 선호도를 재설정할 수 있습니다.
<code class="python">os.system("taskset -p 0xff %d" % os.getpid())</code>
이 명령은 현재 프로세스의 선호도를 사용 가능한 모든 코어로 재설정합니다. 해결 방법이 포함된 예제의 업데이트된 버전은 다음과 같습니다.
<code class="python">from joblib import Parallel, delayed import numpy as np import os 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') # Reset task affinity os.system("taskset -p 0xff %d" % os.getpid()) results = pool(delayed(testfunc)(dd) for dd in data) if __name__ == '__main__': run()</code>
이 해결 방법을 적용한 후 병렬화에 사용 가능한 모든 리소스를 활용하여 작업자 프로세스를 다른 코어에 할당해야 합니다.
해결 방법 외에도 다음 방법을 사용하여 OpenBLAS의 CPU 선호도 재설정 동작을 비활성화할 수도 있습니다.
OPENBLAS_MAIN_FREE=1 python myscript.py
NO_AFFINITY=1
위 내용은 Numpy가 Joblib의 다중 처리 코어 할당을 방해하는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!