2014-10-16 2 views
1

큰 데이터 세트에서 k- 평균을 실행 중입니다. 나는 이것을 다음과 같이 설정했다.KMeans 병렬 처리가 실패 함

from sklearn.cluster import KMeans 
km = KMeans(n_clusters=500, max_iter = 1, n_init=1, 
    init = 'random', precompute_distances = 0, n_jobs = -2) 

# The following line computes the fit on a matrix "mat" 
km.fit(mat) 

내 컴퓨터에는 8 개의 코어가있다. 설명서에 "n_jobs = -2이면 모든 CPU가 사용되지만 하나는 사용됩니다." km.fit이 실행되는 동안 몇 가지 추가 파이썬 프로세스가 실행되는 것을 볼 수 있지만 하나의 CPU 만 사용됩니다.

GIL issue처럼 들리니? 그렇다면 모든 CPU가 작동하도록하는 방법이 있습니까? (그것이 있어야하는 것처럼 보입니다 ... 그렇지 않으면 n_jobs 인수의 요점은 무엇입니까).

나는 기본적인 것을 놓치고있는 중이며 누군가 내 두려움을 확인하거나 다시 궤도에 올릴 수 있다고 생각합니다. 그것이 실제로 더 복잡하다면, 나는 실례를 설정하는 것으로 바뀔 것이다.

사실

enter image description here

난에 사용자 만이 아니에요 :

업데이트 단순 1., 나는 여기 2. 실행 중에 내 시스템에 무슨 일이야되어 긍정적으로 n_jobs 전환 (램 사용량이 위의 스크린 샷에서 적어도 27 %처럼 보이는 때문에, 나에게 혼란) 기계,하지만

free | grep Mem | awk '{print $3/$2 * 100.0}' 

는 RAM의 88 %가 무료임을 나타냅니다.

업데이트 2.sklearn 버전을 0.15.2로 업데이트했으며 위에보고 된 top 출력에서 ​​변경된 사항은 없습니다. 비슷한 값의 n_jobs을 실험 해 보면 비슷한 효과가 없습니다.

+1

'KMeans'는 스레드가 아닌 프로세스를 생성하기 때문에 GIL 문제가 아닙니다. 얼마나 많은 데이터를 먹고 있습니까? 충분한 기억이 있습니까? 어떤 Scikit-Learn 버전입니까? 'n_jobs = -1' 또는'n_jobs = 2' (검증하기 위해)을 시도 했습니까? –

+0

업데이트를 참조하십시오. 데이터는 pandas -> numpy를 통해 읽는 약 3 기가의 csv이고, 머신 RAM은 24 기가입니다. 나는 기억이 어떻게 문제인지를 볼 수 없다. 현재 업데이트는'n_jobs = 2'를 사용합니다. – zkurtz

+0

버전 : scikit-learn == 0.14.1 – zkurtz

답변

2

KMeans에 대한 병렬 처리는 여러 개의 초기화를 병렬로 실행하는 것입니다. n_init = 1로 설정하면 초기화가 하나만 수행되고 병렬 처리는 없습니다. n_jobs에 대한 docstring은 현재 잘못된 것 같습니다. 나는 그곳에서 무슨 일이 일어 났는지 확신하지 못한다.

+0

해결되었습니다 (웹 사이트에 곧 있어야 함). –

+0

흥미 롭다면 나는 그 가능성에 대해 생각하지 않았다. 사실 실망 스럽습니다. 단일 초기화 내에서도 병렬 처리가 많이 필요하기 때문입니다. 500 (내 경우에는) 초기 센터와 나머지 모든 포인트 사이에는 엄청난 수의 거리 계산이 있습니다. – zkurtz

+0

이들은 모두 BLAS를 통해 이루어지며 BLAS가 멀티 코어라면 병렬 처리됩니다. –

관련 문제