scikit learn español python multithreading scikit-learn ioerror

python - español - Error "No queda espacio en el dispositivo" al instalar el modelo Sklearn



scikit learn español (3)

Este problema se produce cuando se consume memoria compartida y no se permite ninguna operación de E / S. Este es un problema frustrante que se presenta a la mayoría de los usuarios de Kaggle al ajustar los modelos de aprendizaje automático.

Superé este problema configurando la variable JOBLIB_TEMP_FOLDER usando el siguiente código.

%env JOBLIB_TEMP_FOLDER=/tmp

Estoy ajustando un modelo LDA con una gran cantidad de datos usando scikit-learn. La pieza de código relevante se ve así:

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)

(Supongo que el único detalle posiblemente relevante aquí es que estoy usando varios trabajos).

Después de un tiempo, aparece el error "No queda espacio en el dispositivo", aunque hay mucho espacio en el disco y mucha memoria libre. Intenté el mismo código varias veces, en dos computadoras diferentes (en mi máquina local y en un servidor remoto), primero usando python3, luego usando python2, y cada vez terminé con el mismo error.

Si ejecuto el mismo código en una muestra más pequeña de datos, todo funciona bien.

Todo el rastro de la pila:

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


Esto es porque has establecido n_jobs = 3. Puede configurarlo en 1, luego no se utilizará la memoria compartida, aunque el aprendizaje llevará más tiempo. Puede elegir seleccionar un directorio de caché de joblib según la respuesta anterior, pero tenga en cuenta que este caché también puede llenar su disco rápidamente, dependiendo del conjunto de datos. y las transacciones de disco pueden ralentizar su trabajo.


Tenía el mismo problema con LatentDirichletAllocation . Parece que se está quedando sin memoria compartida ( /dev/shm cuando ejecuta df -h ). Intente configurar la variable de entorno JOBLIB_TEMP_FOLDER en algo diferente: por ejemplo, a /tmp . En mi caso ha resuelto el problema.

O simplemente aumente el tamaño de la memoria compartida, si tiene los derechos adecuados para la máquina en la que está entrenando el LDA.