0

병렬 루프 내에서 sklearn (n_jobs 인수 지원)을 실행할 수있는 방법이 있습니까? 내가 multiprocessing.Pool 내부 n_jobs> 1 sklearn 기능을 실행하려고하면, 나는 중첩 된 parallelisation 수 있습니다 경고 병렬 경로 내에서 n_jobs> 1의 sklearn 함수를 실행하는 간단한 방법

UserWarning: Multiprocessing-backed parallel loops cannot be nested, setting n_jobs=1 
    for s in split_list(seeds, n_jobs)) 

그래서 일부 병렬 라이브러리를 존재

을 가지고?

답변

0

이 경고는 sklearn에 사용 된 다중 처리 라이브러리 joblib에서 유래합니다. 병렬 메커니즘이 하위 프로세스를 생성 할 수없는 daemonic 작업자를 사용하는 multiprocessing.Pool에 의존하기 때문에 발생합니다.

sklearn과 함께이 제한 사항을 전달하는 간단한 방법은 없습니다. 프로세스를 수동으로 생성하고 관리하고자 할 수 있습니다. 무엇을하고 있는지 알고 계신다면 Process을 작성하여 기능을 n_jobs > 1과 함께 실행하십시오.
이것은 프로세스를 관리하는 동시에 여러 프로세스를 한 번에 실행하지 않는 것을 의미합니다. daemonic도 제작하지 않는 것이 중요합니다. 예를 들어 : 모든 프로세스가 동시에 실행이가 순차 구현보다 더 최악의 실적으로 이어질 수 있음을

def target(j): 
    from time import sleep 
    from sklearn.ensemble import RandomForestClassifier 
    rf = RandomForestClassifier(n_jobs=2) 
    rf.fit(np.random.random(size=(100, 100)), np.random.random(100)> .6) 
    print(j, 'done') 
pr = [mp.Process(target=target, args=(i,)) for i in range(10)];\ 
[p.start() for p in pr] 
[p.join() for p in pr] 

참고.

그렇다고해서 중첩 된 병렬 처리를 사용하는 것이 좋은 아이디어는 아닙니다. 모든 코어는 더 많은 시간을 소모하는 작업에 사용해야하며 다른 작업은 순차적으로 실행되어야합니다.