3 minute read

事象

WSL2 の Podman で CUDA する で作った環境で、コンテナ内から GPU にアクセスできなくなっていることに気が付きました。OpenWeb UI を起動すると、GPU を使ってくれず CPU のみで処理をしていますし、ComfyUI にいたってはコンテナが起動すらしません。以前は GPU が使えたはずのそれらのコンテナの中から nvidia-smi コマンドを実行してみると、

Failed to initialize NVML: N/A

と表示され、GPU 情報が表示されませんでした。

対策

この事象が出る前に、Windows11 側の NVIDIA App よりドライバー更新のお知らせがあったので、更新をしていました。この場合、ドライバーのパスなどが変更される (ことがある?) ため、sudo nvidia-ctk cdi generate --output /etc/cdi/nvidia.yaml を再実行し、正しいパスで定義しなおす必要がありました。

なお、Dokcer の場合は GPU を認識させる仕組みが違うため、ドライバーを更新してもコンテナ内から GPU にアクセスすることが可能でした。

詳細

事象に気が付いた後に、WSL2 の Podman で CUDA する の記事で動作確認用に実行した、

podman run --rm \
--device nvidia.com/gpu=all \
--security-opt=label=disable \
ubuntu nvidia-smi -L

を実行すると、以下のような結果になっていました。

init fail

このとき、同じ PC 内の別の WSL ディストリビューション (Docker を残したままにしていた環境) では、以下のように GPU の情報が出力されていたので、WSL 側へ認識できていることは間違いなさそうです。

docker

なお、Podman が入っている WSL 環境で、コンテナの外で nvidia-smi コマンドを実行すると GPU の情報が表示されたので、Podman で GPU の情報がうまくコンテナ内から参照できない状態のように見えます。

nvidia-container-toolkit パッケージの再インストールもしてみましたが、結果は変わりませんでした。NVIDIA のドライバーのバージョンアップでエラーになる、という症状は検索して見つけたのですが、その場合はバージョンが違うとかのエラーメッセージのようだったので、今回のエラーとは違うのかな、と思っていました。

しかし、nvidia-ctk コマンドで出力する /etc/cdi/nvidia.yaml ファイルの内容を参照してみると、以下のように nvmdi.inf_amd64_8ae620a6c455be0a を参照しています。

nvidia.yaml

このパスを見てみると、nvmdi.inf_amd64_8ae620a6c455be0anvmdi.inf_amd64_f088ae99b5a2f5fd の 2 つのディレクトリがあり、明らかに後者が最近更新されたパスのようです。

driver timestamp

そのため、sudo nvidia-ctk cdi generate --output /etc/cdi/nvidia.yaml を実行して、ファイルを再作成してみました。

cdi generate

出力を見ると、タイムスタンプが新しかった nvmdi.inf_amd64_f088ae99b5a2f5fd を認識しているようです。この状態で動作確認してみると、

gpu enabled

正常に nvidia-smi コマンドが実行でき、GPU 情報も取得できるようになりました。NVIDIA のドライバーを更新したときは、Podman は CDI の定義をし直したほうがよさそうです。

更新日時: