멀티프로세싱은 왜 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
이 스크립트가 실행되는 동안:
저는 우분투 12.10 (3.5.0-26)을 4개의 코어가 있는 노트북에서 실행하고 있습니다.확실히.joblib.Parallel
산란은 작업자별로 별도의 프로세스가 적용되나, 이러한 프로세스를 다른 코어에서 실행할 수 있는 방법은 없습니까?
구글 검색을 좀 더 한 후에 저는 여기서 답을 찾았습니다.
특정 파이썬 모듈(numpy
,scipy
,tables
,pandas
,skimage
...) 가져오기 시 핵심 친화도를 엉망으로 만듭니다.제가 아는 한, 이 문제는 특히 멀티 스레드 OpenB에 대한 링크로 인해 발생한 것으로 보입니다.LAS 라이브러리.
해결 방법은 다음을 사용하여 작업 선호도를 재설정하는 것입니다.
os.system("taskset -p 0xff %d" % os.getpid())
모듈을 가져온 후 이 행을 붙여넣으면 이제 모든 코어에서 예제가 실행됩니다.
지금까지 제 경험으로는 이것이 어떤 부정적인 영향을 미치지 않는 것 같습니다.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
:
- Ubuntu 10.10에서 12.04로 업그레이드한 후 multiprocessing.map과 joblib 모두 1개의 cpu만 사용합니다.
- Python 멀티프로세싱은 하나의 코어만 사용합니다.
- 다중 가공프로세스를 단일 코어에 고정함
CPU 친화도()taskset
를 실험해 볼 것을 제안합니다.
언급URL : https://stackoverflow.com/questions/15639779/why-does-multiprocessing-use-only-a-single-core-after-i-import-numpy
'programing' 카테고리의 다른 글
데이터베이스 기반 애플리케이션을 유닛 테스트하는 가장 좋은 전략은 무엇입니까? (0) | 2023.11.06 |
---|---|
동시에 여러 CSS 애니메이션 재생 (0) | 2023.11.01 |
EXISTS 하위 쿼리를 포함하는 모든 MySQL SELECT 쿼리에 문제가 있으며 ON에서 외부 SELECT를 참조하는 왼쪽 조인 (0) | 2023.11.01 |
XML에서 '독립 실행형' 지시는 무엇을 의미합니까? (0) | 2023.11.01 |
파일의 MySQL 로드 데이터 - 가속? (0) | 2023.11.01 |