2016-10-18 2 views
12

scikit-learn을 사용하여 많은 양의 LDA 모델에 적합합니다. 관련 코드 조각은 다음과 같습니다 : 나는 "어떤 공간을 받고하지있어 약간의 시간이 장치에서 떠난 후 Sklearn 모델에 맞는 동안 "장치에 남은 공간 없음"오류가 발생했습니다.

lda = LatentDirichletAllocation(n_topics = n_topics, 
           max_iter = iters, 
           learning_method = 'online', 
           learning_offset = offset, 
           random_state = 0, 
           evaluate_every = 5, 
           n_jobs = 3, 
           verbose = 0) 
lda.fit(X) 

(. 내가 여기있는 유일한 가능성 관련 세부 내가 여러 작업을 사용하고 있다는 추측)

"오류 디스크의 충분한 공간과 사용 가능한 메모리가 충분하더라도. 두 번 다른 컴퓨터에서 (로컬 컴퓨터와 원격 서버에서) 동일한 코드를 여러 번 시도했습니다. 먼저 python3을 사용하고 python2를 사용하고 같은 오류가 발생할 때마다 시도했습니다.

데이터의 작은 샘플에서 동일한 코드를 실행하면 모든 것이 잘 동작합니다.

전체 스택 추적 :

Failed to save <type 'numpy.ndarray'> to .npy file: 
Traceback (most recent call last): 
    File "/home/ubuntu/anaconda2/lib/python2.7/site-packages/sklearn/externals/joblib/numpy_pickle.py", line 271, in save 
    obj, filename = self._write_array(obj, filename) 
    File "/home/ubuntu/anaconda2/lib/python2.7/site-packages/sklearn/externals/joblib/numpy_pickle.py", line 231, in _write_array 
    self.np.save(filename, array) 
    File "/home/ubuntu/anaconda2/lib/python2.7/site-packages/numpy/lib/npyio.py", line 491, in save 
    pickle_kwargs=pickle_kwargs) 
    File "/home/ubuntu/anaconda2/lib/python2.7/site-packages/numpy/lib/format.py", line 584, in write_array 
    array.tofile(fp) 
IOError: 275500 requested and 210934 written 


IOErrorTraceback (most recent call last) 
<ipython-input-7-6af7e7c9845f> in <module>() 
     7         n_jobs = 3, 
     8         verbose = 0) 
----> 9 lda.fit(X) 

/home/ubuntu/anaconda2/lib/python2.7/site-packages/sklearn/decomposition/online_lda.pyc in fit(self, X, y) 
    509      for idx_slice in gen_batches(n_samples, batch_size): 
    510       self._em_step(X[idx_slice, :], total_samples=n_samples, 
--> 511          batch_update=False, parallel=parallel) 
    512     else: 
    513      # batch update 

/home/ubuntu/anaconda2/lib/python2.7/site-packages/sklearn/decomposition/online_lda.pyc in _em_step(self, X, total_samples, batch_update, parallel) 
    403   # E-step 
    404   _, suff_stats = self._e_step(X, cal_sstats=True, random_init=True, 
--> 405          parallel=parallel) 
    406 
    407   # M-step 

/home/ubuntu/anaconda2/lib/python2.7/site-packages/sklearn/decomposition/online_lda.pyc in _e_step(self, X, cal_sstats, random_init, parallel) 
    356            self.mean_change_tol, cal_sstats, 
    357            random_state) 
--> 358    for idx_slice in gen_even_slices(X.shape[0], n_jobs)) 
    359 
    360   # merge result 

/home/ubuntu/anaconda2/lib/python2.7/site-packages/sklearn/externals/joblib/parallel.pyc in __call__(self, iterable) 
    808     # consumption. 
    809     self._iterating = False 
--> 810    self.retrieve() 
    811    # Make sure that we get a last message telling us we are done 
    812    elapsed_time = time.time() - self._start_time 

/home/ubuntu/anaconda2/lib/python2.7/site-packages/sklearn/externals/joblib/parallel.pyc in retrieve(self) 
    725     job = self._jobs.pop(0) 
    726    try: 
--> 727     self._output.extend(job.get()) 
    728    except tuple(self.exceptions) as exception: 
    729     # Stop dispatching any new job in the async callback thread 

/home/ubuntu/anaconda2/lib/python2.7/multiprocessing/pool.pyc in get(self, timeout) 
    565    return self._value 
    566   else: 
--> 567    raise self._value 
    568 
    569  def _set(self, i, obj): 

IOError: [Errno 28] No space left on device 
+0

아마도 멀티 프로세싱 ('''n_jobs = 1''')없이 작동 할 것입니다. scikit-learn 경로가 일부 임시 데이터를 사용하고 있는지 확실하지 않습니다. tmp 파티션의 크기는 어느 정도입니까? – sascha

+0

감사합니다. @ 사샤, 한 번만 시도해 보겠습니다. 'tmpfs'가 tmp 파티션 (나는 그것이라고 생각 하는가?)이라면 1.6GB이다. 이것이 문제가 될 수 있습니까? 그렇다면이 문제를 해결할 수있는 방법이 있습니까? – machaerus

답변

15

LatentDirichletAllocation과 같은 문제가 있었다. 공유 메모리가 부족합니다 (df -h을 실행하면 /dev/shm). 환경 변수 JOBLIB_TEMP_FOLDER을 다른 값 (예 : /tmp)으로 설정하십시오. 제 경우에는 문제가 해결되었습니다.

LDA를 교육 할 기계에 대한 적절한 권한이있는 경우 공유 메모리의 크기를 늘리십시오.

+7

이것은 나를 위해 일했습니다. 도커 컨테이너에서 iPython을 사용하여 다음과 같은 모델의 유효성 검사를 시도합니다.'best_knn_clf = KNeighborsClassifier (weights = 'distance', n_neighbors = 4, n_jobs = -1) score = cross_val_score (best_knn_clf, X_train_expanded, y_train_expanded, cv = 3, n_jobs = -1, 자세한 정보 = 3)'. 노트북에'% env JOBLIB_TEMP_FOLDER =/tmp'가 추가되었습니다. –

0

n_jobs = 3으로 설정했기 때문입니다. 학습을 1 시간으로 설정하면 학습에 더 많은 시간이 걸리지 만 공유 메모리는 사용되지 않습니다. 위 답변에 따라 joblib 캐시 디렉토리를 선택할 수 있지만 데이터 세트에 따라이 캐시가 디스크를 빠르게 채울 수 있다는 점을 기억하십니까? 디스크 트랜잭션은 작업 속도를 저하시킬 수 있습니다.

0

이 문제는 공유 메모리가 소비되고 I/O 작업이 허용되지 않을 때 발생합니다. 이것은 Kaggle 사용자의 대부분이 기계 학습 모델 또는 관련 작업을 수행하는 동안 발생하는 실망스러운 문제입니다.

다음 코드를 사용하여 JOBLIB_TEMP_FOLDER 변수를 설정하여이 문제를 극복했습니다.

%env JOBLIB_TEMP_FOLDER=/tmp 
관련 문제