CPU 사용량 및 메모리에 대한 scikit-learn n_jobs 매개 변수


12

scikit-learn의 대부분 추정기에는를 사용하여 병렬 작업을 작성하기위한 / 메소드에 n_jobs매개 변수가 있습니다. 이 프로세스 를 설정 하면 단 하나의 Python 프로세스 가 생성되고 코어가 최대가되어 CPU 사용량이 2500 %를 초과하는 것으로 나타났습니다 . 이것은 양의 정수> 1로 설정하는 것과는 매우 다르며 ~ 100 % 사용으로 여러 Python 프로세스를 만듭니다.fitpredictjoblib-1

이 설정은 다중 CPU Linux 서버의 CPU 및 코어 사용량에 어떤 영향을 줍니까? (예를 들어 n_jobs=88 개의 CPU가 완전히 잠겨 있거나 CPU가 다른 작업 / 프로세스를 위해 여전히 일부 코어를 예약합니까?)

또한 큰 데이터 세트를 MemoryError설정할 때 가끔씩 나타납니다 n_jobs=-1. 그러나 메모리 사용량은 일반적으로 단일 Python 프로세스의 경우 약 30-40 %입니다. 의 값에 따라 데이터 및 메모리를 어떻게 관리 / 복사 n_jobs합니까?


1
또한 -2로 설정할 수 있습니다. 사용 가능한 코어 중 1 개를 제외한 나머지는 모두 사용되므로 최소한 약간의 작동 상태가 유지됩니다. 메모리 문제가 일반적으로 많은 코어에 대해 물기 시작 함을 확실히 수정하십시오. 특히 데이터 세트가 큰 경우
Ken Syme

답변:


4

-1가용 한 모든 가용 자원이 사용 가능한시기와시기에 가치가 있다고 상상할 수 있습니다. 사용중인 기능에 따라 각 작업에 대해 데이터가 복사 된 것으로 보이므로 데이터 세트가 충분히 큰 경우 메모리 문제가 발생할 수 있습니다. 다음은 GridSearchCV 의 docstring에서 가져온 정보 스 니펫입니다 .

If `n_jobs` was set to a value higher than one, the data is copied for each
point in the grid (and not `n_jobs` times). This is done for efficiency
reasons if individual jobs take very little time, but may raise errors if
the dataset is large and not enough memory is available.  A workaround in
this case is to set `pre_dispatch`. Then, the memory is copied only
`pre_dispatch` many times. A reasonable value for `pre_dispatch` is `2 *
n_jobs`.

따라서 pre_dispatch메모리 소비에 상한을 두는 데 사용하는 것이 좋습니다 .

그렇지 않으면 왜 설정 -1합니까? 작업을 다중 스레드 할 수있는 경우 시스템의 실제 코어 수 또는이 수의 2 배로 설정해야합니다.

편집하다:

설정 n_jobs=-1은 실제로 모든 물리적 코어를 선택하고 사용을 최대화하는 것 같습니다 . 이 답변에서 StackOverflow대한 의견을 살펴보십시오 .

를 설정하지 않은 경우 pre_dispatch물론 복사를 많이 시도합니다. 그렇기 때문에 메모리가 부족합니다. 코어가 4 개인 경우, 기본적으로 8 개의 데이터 세트 사본이 만들어집니다 (위의 인용에서 설명한대로).

성능 측면에서 더 많은 다른 스레드 가 있습니다.


1
pre_dispatch를 사용하여 데이터의 복사본을 제한하지만 왜 -1로 설정되어 메모리 문제가 있습니까?

1
@sweetyBaby-추가 링크를 참조하십시오. 설정 n_jobs = -1은 메모리를 고려하지 않고 CPU의 코어 수만 고려하므로 메모리 문제가 발생할 수 있습니다.
n1k31t4
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.