課題
Ubuntu 24.04 LTSのディストリビュートされているdocker.ioに対して、Nvidia docker containerでNvidia GPUを貼り付けたDockerコンテナを長期ランニングしていると、いつの間にかGPUが外れていることがある。
この事象が発生していると、Dockerコンテナのサービスが使用できなかったり、Dockerコンテナのサービス使用時にGPUの代わりにCPU負荷が急上昇したりする。そして、Dockerのログには、GPUが利用できないメッセージの出力があったりする。
例えば、ollama/ollamaの場合、この現象が発現すると、以下に示すようにno CUDA-capable device
を含んだエラーメッセージが出力される。
回避方法
この問題はNOTICE: Containers losing access to GPUs with error:"Failed to initialize NVML: Unknown Error"#48等で広く知られている。そして、その事象は、systemctl daemon-reload
の実行によって簡単に誘発されることが記されている。また、同記事には「5. Workarounds」で3つの回避方法が提案されている。
- nvidia-ctkの使用
- 明示的なsystemd cgroup管理の無効化
- dockerのダウングレード
今回は、この3つの方法の中、一番容易と思われる2で事態が解消されることを確認した。
以下に事象の発生の確認と回避方法の検証動画を示す。検証には、Dockerコンテナ内でのtorch.cuda.is_available()
によるGPUの使用可否で確認した。
現象の確認
systemctl daemon-reload
後、docker内のtorch.cuda.is_available()
がFalse
となる。
回避方法の効果確認
systemctl daemon-reload
後も、docker内のtorch.cuda.is_available()
がTrue
のまま。
注意
今回の回避策の検証では、DockerのCgroup Driverをsystemdからcgroupfsに変更することで実現している。つまり、Docker全体に影響することを意味する。
このため、製品やサービスへの適用する場合には、十分な見極めが必要と思われる。