🐳 AI/データワークロード必須設定: Docker共有メモリ (shm_sizeとipc) 完全理解
AIおよび大規模データ処理ワークロードで OSError: No space left on device のような不明なエラーを経験した場合、多くは Dockerコンテナの共有メモリ(shm_size)設定が不足しているために発生します。
このポストでは、コンテナ環境において共有メモリがなぜ重要か、shm_sizeとipc: hostオプションをどのように正しく設定すべきかを明確に整理します。
1. shm_sizeの役割と重要性
役割: コンテナの共有メモリサイズの決定
shm_sizeはコンテナ内部の /dev/shm (POSIX shared memory) ファイルシステムの 最大サイズを設定するオプションです。
-
Dockerデフォルトは 64MB と非常に小さいです。
-
注意:
/dev/shmは ホストRAMを使用するtmpfs(一時ファイルシステム)であり、VRAM(GPUメモリ)とは無関係です。
なぜ重要か?
AI/データ処理作業はプロセス間で大量のデータをやり取りする際にこの 共有メモリを核心的に活用します。
-
PyTorch DataLoader:
num_workers > 0設定時、ワーカープロセス間でテンソル/バッチを共有メモリで渡します。このスペースが不足するとOSError: No space left on deviceエラーが発生します。 -
TensorRTエンジンのビルド/サービング: 大規模中間アーティファクトやIPCバッファに共有メモリを大きく使用し、不足するとエンジンのビルド失敗やセグメンテーションフォルトが発生する可能性があります。
-
マルチプロセスおよびIPC通信: NCCL、OpenCV、NumPyなどでプロセス間の大規模配列/バッファを共有するために必須です。
2. ipc設定: 共有メモリの隔離範囲
IPC (Inter-Process Communication) namespaceは、コンテナのプロセス間通信空間(共有メモリ、セマフォなど)をどの範囲で隔離するか決めるDockerのオプションです。
| ipc設定 | 動作方式 | /dev/shmサイズの決定 |
|---|---|---|
| デフォルト (省略) | コンテナは自身のIPCネームスペースを使用(隔離) | shm_sizeで指定されたサイズ(デフォルト64MB) |
ipc: host |
コンテナがホストのIPCネームスペースを共有 | ホストの/dev/shmサイズ(一般的にRAMの半分) |
ipc: container:<ID> |
指定した他のコンテナとIPCを共有 | 共有対象コンテナの設定に従う |
3. shm_sizeとipc: host同時使用時の動作原理 (例え分析)
一般的にAI/LLM作業ではshm_size: "16g"とipc: hostを同時に設定することが多いです。この時にどの設定が適用されるのかを実際の例を通じて確認します。
例: 設定および結果分析
| Docker Compose設定スニペット | コンテナ内部df -h /dev/shm確認結果 |
|---|---|
| shm_size: "16g" ipc: host |
Filesystem tmpfs Size 60G Used 8.3M Avail 60G Use% 1% Mounted on /dev/shm |
結論: ipc: hostはshm_sizeを無視します。
-
ipc: hostが適用されると:コンテナはホストのIPCネームスペースをそのまま使用します。 -
shm_size: "16g"は無視される:このオプションは自身のIPCネームスペースを使用する際のみ意味があります。 -
60Gの出所:ホストLinuxシステムは基本的に
/dev/shmを全RAMの半分程度に設定することが多いです。従って、上記の例でコンテナはホストの120Gの半分、60Gをそのまま見ているのです。
核心まとめ
ipc: hostを設定すると、コンテナはホストの共有メモリ空間をそのまま使用するため、shm_size設定は実際には適用されません。
4. 推奨運転法およびメモリ上限管理
💡 実務推奨選択肢
-
✅ 安定性優先 (推薦):
ipc: host維持-
設定:
ipc: hostのみ維持(あるいはshm_sizeとともに設定しても良い) -
結果: ホストの広々とした
/dev/shmサイズを使用します(例: 60G)。 -
利点: 大多数のAI/データ作業で共有メモリ不足エラーを根本的に防止し、最も安定的です。60Gは最大値であり、実際の使用量のみがRAMを占有するため、メモリ圧迫がなければそのままにしておくのが便利です。
-
-
✅ コンテナごとの上限強制:
ipc: hostを削除-
設定:
ipc: host削除 +shm_size: "8g"または"16g"明示 -
結果: コンテナ専用の16GB
/dev/shmが生成されます。 -
利点: 複数のコンテナが稼働する際に、各コンテナの共有メモリ使用上限を明確に制限できるため、ホストRAM保護と隔離に有利です。
-
⚙️ ホスト/dev/shmサイズ調整方法 (選択肢1使用時)
ipc: hostを使用しながらホストの/dev/shmサイズそのものを変更したい場合、tmpfs設定を変更する必要があります。
- 一時的にサイズ変更 (再起動時に元に戻る):
sudo mount -o remount,size=16G /dev/shm
(すべてのプロセス/コンテナに即時適用されます。)
- 永続的にサイズ変更 (
/etc/fstab修正):
# /etc/fstabファイルに次の行追加/修正
tmpfs /dev/shm tmpfs defaults,size=16G 0 0
保存後に再起動するか、上記の`remount`コマンドで即時適用。
いつ増やすべきか? DataLoaderワーカーが多い場合やTensorRTエンジンビルド中に間欠的に
No space left on deviceエラーが発生する場合、shm_sizeまたはホスト/dev/shmサイズを最低8G以上に調整する必要があります。
コメントはありません。