UbuntuのdockerでGPUを使う場合snapでインストールしてはいけない
この記事について
この記事は筆者がUbuntu 21.04でdockerでGPUを使おうとしたときにハマった落とし穴のメモです。
経緯
UbuntuではSnappyというaptにかわるパッケージマネージャが用意されています(コマンドはsnap)。
Ubuntu Server 21.04ではOSの初期インストール時にdockerやmicrok8sなどのパッケージをこのsnapでインストールできるオプションがあり、筆者はこれでdockerをインストールしていました。
その後、dockerでGPUを使うためにNVIDIA Container Toolkitをインストールしたのですが、この途中でaptからdockerをインストールしてしまったようです。
インストールガイドに書かれている明示的なdockerインストールのコマンドは実行していないので、おそらく依存関係で勝手にインストールされたのだと推測されます。
この状態でOSを再起動すると、snap版とapt版の二種類のdockerが同時に起動してしまいます。
systemctlではそれぞれsnap.docker.dockerd.serviceとdocker.serviceという名称で、systemctl status <サービス名>で確認するとそれぞれ異なるログが確認できます。
Dockerイメージも別々に管理されるようで、完全に別物のようです。
NVIDIA Container Toolkitの対応状況としてはapt版のdockerはGPUを使えましたが、snapのdockerでは--gpus allのオプションをつけるとエラーになり、コンテナを起動できませんでした。
筆者の環境では、両方起動している状態では、dockerコマンドはsnap版が優先されました。
そのため、二重起動している状態ではdocker --gpus allが失敗し、snap版dockerを停止すると成功する、という状況になります。
対策
snap版をサービスとして無効化するsystemctl disable snap.docker.dockerd.serviceかアンインストールsnap remove dockerしてapt版だけ使うようにすればGPUが使えるようになりました。
Discussion