2016-10-18 4 views
12

Я подгоняю модель LDA с большим количеством данных, используя scikit-learn. Соответствующий кусок кода выглядит следующим образом:Ошибка «Отсутствие места на устройстве» при установке. Модель 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

Спасибо @sascha, я попробую только с одним процессом. Если 'tmpfs' является tmp-разделом (я думаю, что это?), То это 1,6 ГБ. Это может быть проблема? Если это так, есть ли какое-либо обходное решение для этого? – machaerus

ответ

15

была такая же проблема с LatentDirichletAllocation. Кажется, что у вас закончилась общая память (/dev/shm при запуске df -h). Попробуйте установить переменную окружения JOBLIB_TEMP_FOLDER на что-то другое: например, до /tmp. В моем случае это решило проблему.

Или просто увеличьте размер разделяемой памяти, если у вас есть соответствующие права на машину, на которой вы обучаете LDA.

+7

Это сработало для меня. Используя iPython в контейнере докеров, вы пытаетесь проверить модель следующим образом: 'best_knn_clf = KNeighborsClassifier (weights = 'distance', n_neighbors = 4, n_jobs = -1) scores = cross_val_score (best_knn_clf, X_train_expanded, y_train_expanded, cv = 3, n_jobs = -1, verbose = 3) '. Добавленный '% env JOBLIB_TEMP_FOLDER =/tmp' в записной книжке сделал трюк. –

0

Это потому, что вы установили n_jobs = 3. Вы можете установить его в 1, тогда разделяемая память не будет использоваться, хотя обучение займет больше времени. Вы можете выбрать, чтобы выбрать директорию кэша joblib в соответствии с приведенным выше ответом, но помните, что этот кеш может быстро заполнить ваш диск, в зависимости от набора данных? и операции с дисками могут замедлить работу.

0

Эта проблема возникает, когда разделяемая память потребляется, и операция ввода-вывода не разрешена. Это разочаровывает проблему, которая возникает с большинством пользователей Kaggle при установке моделей машинного обучения или связанных с ними задач.

Я преодолел эту проблему, установив переменную JOBLIB_TEMP_FOLDER, используя следующий код.

%env JOBLIB_TEMP_FOLDER=/tmp 

 Смежные вопросы

  • Нет связанных вопросов^_^