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


127

이것이 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다른 작업자를 위해 별도의 프로세스를 생성하지만 이러한 프로세스를 다른 코어에서 실행할 수있는 방법이 있습니까?


stackoverflow.com/questions/15168014/…- 대답이 없습니다. 두렵지 만 같은 문제처럼 들립니다.
NPE



여전히 문제입니까? Python 3.7로 이것을 다시 만들고 multiprocessing.Pool ()을 사용하여 numpy를 가져 오려고하는데 모든 스레드를 사용해야합니다 (필요한대로). 이 문제가 해결되었는지 확인하십시오.
Jared Nielsen

답변:


148

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

그것은 그 어떤 파이썬 모듈 (밝혀 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

귀하의 솔루션으로 문제가 해결되었습니다. 하나의 질문, 나는 동일한 코드를 가지고 있지만 다른 기계를 견인 할 때 다르게 실행됩니다. 두 시스템 모두 Ubuntu 12.04 LTS, python 2.7이지만이 중 하나만 있습니다. 왜 그런지 아십니까?
iampat

두 시스템 모두 OpenBLAS (OpenMPI로 빌드)가 있습니다.
iampat

2
오래된 스레드이지만 다른 사람 이이 문제를 발견하면 정확한 문제가 있었고 실제로 OpenBLAS 라이브러리와 관련이 있습니다. 가능한 두 가지 해결 방법과 관련 토론 은 여기 를 참조 하십시오 .
Gabriel

2
CPU 선호도를 설정하는 또 다른 방법은을 사용하는 것psutil 입니다.
Ioannis Filippidis

2
@JHG 파이썬이 아닌 OpenBLAS의 문제이므로 파이썬 버전이 차이를 만드는 이유를 알 수 없습니다
ali_m

27

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}

1
오류> AttributeError : 'os'모듈에 'sched_getaffinity'속성이 없습니다. Python 3.6
Paddy

4
@Paddy 링크 된 문서에서 : 일부 유닉스 플랫폼에서만 사용할 수 있습니다.
BlackJack

2
나는 같은 문제가 있지만 상단의 os.system을 ( "taskset -p에서 0xff % D"%의 os.getpid ())에서이 같은 라인을 통합해야하지만이 모든 CPU 사용
rajeshcis

12

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

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


Python on Ubuntu이것은 Windows 및 기타 OS에서 문제없이 작동한다는 것을 의미합니다. 그렇습니까?
Mast
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.