joblibやscikit-learnでOSError: [Errno 28] No space left on device

dockerコンテナ内でscikit-learnやjoblibを使っていた際に表題のエラー。

OSError: [Errno 28] No space left on device

ハードディスクには十分な空き容量があったため、何のスペースが足りないのか分からなかった。

scikit-learnの内部ではjoblibが使われているため、joblib側に何か原因があるのではと予想。

Some scikit-learn estimators and utilities can parallelize costly operations using multiple CPU cores, thanks to the following components:

via the joblib library. In this case the number of threads or processes can be controlled with the n_jobs parameter.

via OpenMP, used in C or Cython code.

8.3. Parallelism, resource management, and configuration
Parallelism: Some scikit-learn estimators and utilities parallelize costly operations using multiple CPU cores. Dependin...

joblib.Parallelのドキュメントを見てみると、shared memoryに関連する引数を発見。

temp_folder: str, optional


Folder to be used by the pool for memmapping large arrays for sharing memory with worker processes. If None, this will try in order:

a folder pointed by the JOBLIB_TEMP_FOLDER environment variable,

/dev/shm if the folder exists and is writable: this is a RAM disk filesystem available by default on modern Linux distributions,

the default system temporary folder that can be overridden with TMP, TMPDIR or TEMP environment variables, typically /tmp under Unix operating systems.

Only active when backend=”loky” or “multiprocessing”.

joblib.Parallel — joblib 1.5.dev0 documentation

実行中の環境にはしっかりと/dev/shmが存在しており、joblibが実行されると枯渇していることが確認できた。

/dev/shmよりもJOBLIB_TEMP_FOLDERが優先されるようなので、環境変数をセットして再度実行するとエラーは出なくなった。

import os
os.environ['JOBLIB_TEMP_FOLDER'] = '/tmp'

参考

"No space left on device" error while fitting Sklearn model
I'm fitting a LDA model with lots of data using scikit-learn. Relevant code piece looks like this: lda = LatentDirichlet...
OSError: [Errno 28] No space left on device · Issue #127 · nalepae/pandarallel
Hi, Hi, How can I prevent the space error bellow ? Traceback (most recent call last): File "/anaconda/lib/python3.6/mult...

コメント

タイトルとURLをコピーしました