"No space left on device" 拟合 Sklearn 模型时出错
"No space left on device" error while fitting Sklearn model
我正在使用 scikit-learn 拟合具有大量数据的 LDA 模型。相关代码片段如下所示:
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)
(我想这里唯一可能相关的细节是我正在使用多个作业。)
一段时间后,我收到 "No space left on device" 错误,即使磁盘上有大量 space 和大量可用内存。我在两台不同的计算机(在我的本地计算机和远程服务器上)上多次尝试相同的代码,首先使用 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
与 LatentDirichletAllocation
有同样的问题。看起来,您 运行 共享内存不足(/dev/shm
当您 运行 df -h
时)。尝试将 JOBLIB_TEMP_FOLDER
环境变量设置为不同的值:例如 /tmp
。就我而言,它已经解决了问题。
或者只是增加共享内存的大小,如果您对正在训练 LDA 的机器具有适当的权限。
这是因为您设置了n_jobs=3。你可以将它设置为 1,那么共享内存将不会被使用,尽管学习会花费更长的时间。您可以根据上述答案选择 select 一个 joblib 缓存目录,但请记住,此缓存也可以快速填满您的磁盘,具体取决于数据集?磁盘事务会减慢您的工作速度。
当共享内存被消耗且不允许 I/O 操作时会出现此问题。这是大多数 Kaggle 用户在拟合机器学习模型时遇到的令人沮丧的问题。
我通过使用以下代码设置 JOBLIB_TEMP_FOLDER 变量解决了这个问题。
%env JOBLIB_TEMP_FOLDER=/tmp
我知道有点晚了,但我通过设置 learning_method = 'batch'
解决了这个问题。
这可能会带来其他问题,例如延长训练时间,但它缓解了 space 共享内存不足的问题。
或者可以设置更小的 batch_size
。虽然我自己没有测试过。
@silterser 的解决方案帮我解决了问题
如果要在代码中设置环境变量,请执行以下操作:
import os
os.environ['JOBLIB_TEMP_FOLDER'] = '/tmp'
我正在使用 scikit-learn 拟合具有大量数据的 LDA 模型。相关代码片段如下所示:
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)
(我想这里唯一可能相关的细节是我正在使用多个作业。)
一段时间后,我收到 "No space left on device" 错误,即使磁盘上有大量 space 和大量可用内存。我在两台不同的计算机(在我的本地计算机和远程服务器上)上多次尝试相同的代码,首先使用 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
与 LatentDirichletAllocation
有同样的问题。看起来,您 运行 共享内存不足(/dev/shm
当您 运行 df -h
时)。尝试将 JOBLIB_TEMP_FOLDER
环境变量设置为不同的值:例如 /tmp
。就我而言,它已经解决了问题。
或者只是增加共享内存的大小,如果您对正在训练 LDA 的机器具有适当的权限。
这是因为您设置了n_jobs=3。你可以将它设置为 1,那么共享内存将不会被使用,尽管学习会花费更长的时间。您可以根据上述答案选择 select 一个 joblib 缓存目录,但请记住,此缓存也可以快速填满您的磁盘,具体取决于数据集?磁盘事务会减慢您的工作速度。
当共享内存被消耗且不允许 I/O 操作时会出现此问题。这是大多数 Kaggle 用户在拟合机器学习模型时遇到的令人沮丧的问题。
我通过使用以下代码设置 JOBLIB_TEMP_FOLDER 变量解决了这个问题。
%env JOBLIB_TEMP_FOLDER=/tmp
我知道有点晚了,但我通过设置 learning_method = 'batch'
解决了这个问题。
这可能会带来其他问题,例如延长训练时间,但它缓解了 space 共享内存不足的问题。
或者可以设置更小的 batch_size
。虽然我自己没有测试过。
@silterser 的解决方案帮我解决了问题
如果要在代码中设置环境变量,请执行以下操作:
import os
os.environ['JOBLIB_TEMP_FOLDER'] = '/tmp'