programing

멀티프로세싱은 왜 numpy를 가져온 후에 하나의 코어만 사용합니까?

telecom 2023. 11. 1. 22:09
반응형

멀티프로세싱은 왜 numpy를 가져온 후에 하나의 코어만 사용합니까?

이것이 OS 문제로 더 중요한지는 잘 모르겠지만, 파이썬 엔드에서 통찰력을 가진 사람이 있다면 여기에 물어봐야겠다고 생각했습니다.

중앙처리장치(CPU)가 무거운 것을for루프 사용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이 스크립트가 실행되는 동안:

htop

저는 우분투 12.10 (3.5.0-26)을 4개의 코어가 있는 노트북에서 실행하고 있습니다.확실히.joblib.Parallel산란은 작업자별로 별도의 프로세스가 적용되나, 이러한 프로세스를 다른 코어에서 실행할 수 있는 방법은 없습니까?

구글 검색을 좀 더 한 후에 는 여기서 답을 찾았습니다.

특정 파이썬 모듈(numpy,scipy,tables,pandas,skimage...) 가져오기 시 핵심 친화도를 엉망으로 만듭니다.제가 아는 한, 이 문제는 특히 멀티 스레드 OpenB에 대한 링크로 인해 발생한 것으로 보입니다.LAS 라이브러리.

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

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

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

htop_workaround

지금까지 제 경험으로는 이것이 어떤 부정적인 영향을 미치지 않는 것 같습니다.numpy성능은 기계와 작업에 따라 다를 수 있습니다.

업데이트:

OpenB의 CPU 선호도 재설정 동작을 사용하지 않도록 설정하는 두 가지 방법도 있습니다.LAS 자체.런타임에 환경 변수를 사용할 수 있습니다.OPENBLAS_MAIN_FREE(또는GOTOBLAS_MAIN_FREE), 예를 들어

OPENBLAS_MAIN_FREE=1 python myscript.py

아니면 OpenB를 컴파일하는 경우에는소스의 LAS를 편집하여 빌드 시간에 영구적으로 사용하지 않도록 설정할 수 있습니다.Makefile.rule선을 포함시키다

NO_AFFINITY=1

이제 파이썬 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를 실험해 볼 것을 제안합니다.

언급URL : https://stackoverflow.com/questions/15639779/why-does-multiprocessing-use-only-a-single-core-after-i-import-numpy

반응형