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.
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”.
実行中の環境にはしっかりと/dev/shmが存在しており、joblibが実行されると枯渇していることが確認できた。
/dev/shmよりもJOBLIB_TEMP_FOLDERが優先されるようなので、環境変数をセットして再度実行するとエラーは出なくなった。
import os
os.environ['JOBLIB_TEMP_FOLDER'] = '/tmp'
参考
コメント