이것이 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())
모듈을 가져온 후이 줄을 붙여 넣으면 이제 모든 코어에서 예제를 실행합니다.
지금까지의 경험은 이것이 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
.
- multiprocessing.map과 joblib은 Ubuntu 10.10에서 12.04로 업그레이드 한 후 CPU 1 개만 사용합니다.
- 파이썬 멀티 프로세싱은 하나의 코어 만 사용합니다
- 단일 코어에 고정 된 풀 프로세스
CPU 선호도 ( taskset
)를 실험 해 보는 것이 좋습니다 .