>  기사  >  백엔드 개발  >  Numpy가 Joblib의 다중 처리 코어 할당을 방해하는 이유는 무엇입니까?

Numpy가 Joblib의 다중 처리 코어 할당을 방해하는 이유는 무엇입니까?

Susan Sarandon
Susan Sarandon원래의
2024-10-30 19:58:30559검색

Why Does Numpy Interfere with Multiprocessing Core Assignment in Joblib?

Numpy가 다중 처리 코어 할당을 방해

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 환경 변수를 설정하기 전에 스크립트 실행:
OPENBLAS_MAIN_FREE=1 python myscript.py
  • 컴파일 시간: OpenBLAS를 컴파일할 때 Makefile.rule을 편집하고 다음 줄을 추가하세요.
NO_AFFINITY=1

위 내용은 Numpy가 Joblib의 다중 처리 코어 할당을 방해하는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.