LoginSignup
40
32

起動中のDockerコンテナでGPUが使えてたのにしばらくすると使えなくなる(Failed to initialize NVML: Unknown Errorになる)

Posted at

Dockerコンテナを立ち上げてでGPUが使えてたのに,しばらくするといつの間にかGPUが使えなくなる(Failed to initialize NVML: Unknown Errorになる,torch.cuda.is_available()がfalseになる)という現象に1ヶ月以上困っていたのですが,その解決方法が見つかったので書いておきます.

症状

  • Ubuntu22.04LTS
  • docker
  • 各種GPU

長らくUbuntu20.04LTSを使ってたのですが,22.04にアップグレードしました.それ以前はなんの問題もなく使っていたのに,アップグレード後は上記問題が発生しました.

  • 毎回発生する訳ではない.1週間ぐらい問題ないときもあれば,1日に複数回発生するときもある.およそ2−3日に1回程度は発生するが運次第.
  • マシン依存ではない.複数台のサーバでGPUも構成もバラバラなのに,発生する.
  • スクリプトをループ実行していつ頃発生するのかをモニターしたところ,どうやら発生した時刻の前後数秒で,daily cronのようなものが定期実行している様子.aptなどが悪さをしていると推測.
    • ちなみにnvidia driverがaptで自動アップデートされてしまうと起動中のコンテナからGPUが見えなくなるので,nvidia周りだけ自動アップデートはoffにしてある.(のになぜ? まあそれならFailed to initialize NVML: Unknown ErrorではなくてFailed to initialize NVML: Driver/library version mismatchとなるから違うはず)
    • ちなみにnvidia-runtimeのdebug logを取ってみても,問題発生時刻には何も出てこない.

情報

探しても「ホストでGPUが使えるのにコンテナから使えない」という情報なら見つかるのですが,

「起動中のコンテナでGPUが使えていたのに,しばらくすると使えない」というのは,日本語では探しても情報が見つからず.githubのissueでいくつか見つけました.

この中で有力なのは,systemctl daemon-reloadが実行されるとこの症状が発生する,というもの.

たしかにsyslogを見ると問題発生時刻にreloadされてる.手動でreloadしても現象が再現できた.

May 23 23:21:20 MYMACHINE systemd[1]: Reloading.

対処&問題解決

Nvidiaの中の人が対応策を3つ示していました.

  1. 問題は/dev/charがなぜか無くなってしまうことらしいので,ncidia-ctkで作成する.(でもこれだけではダメでdocker起動時にdevice指定のオプションをつける必要があるので面倒くさい)
  2. cgroupをsystemdが管理するのがダメなので,それをdisableにする.これが簡単.
  3. dockerをダウングレードする.イマイチな方法.

ということで2を実行."exec-opts"の部分がそれです.

/etc/docker/daemon.json
{
    "default-runtime": "nvidia",
    "runtimes": {
        "nvidia": {
            "args": [],
            "path": "nvidia-container-runtime"
        }
    },
    "exec-opts": ["native.cgroupdriver=cgroupfs"]
}

これでdockerを再起動したところ,問題が発生しなくなりました.これで解決.

その後

このnvidiaの人によると,

ということでこの人dockerにCDIサポートしろというissueも出してる.

40
32
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
40
32