GPUをWSL2とDockerで使えるようにする方法
はじめに
Dockerの初学者です。Dockerを使い始めるにあたり、WSL2とDockerでGPUを使えるようするために環境の構築を行ったのですが、エラーが連発したので、その記録と解決方法を紹介します。
WSL2上でdockerを使ってGPUを使用する方法は、NVIDIA公式のCUDA on WSL :: CUDA Toolkit Documentationに詳しく説明されています。日本語だとついにWSL2+docker+GPUを動かせるようになったらしいので試してみる - Qiitaが分かりやすいです。私のPCの環境はWindows10 Homeです。
エラー内容①
Docker Desktop for Windowsをインストールして、WSL2と連携したはずなのにWSL2上で以下のコマンドを入力してもDockerが反応しなかった。
$ sudo service docker stop $ sudo service docker start
エラー内容②
WSL2上でGPUが認識されているか確認するためにNVIDIA公式に記載の以下のコードを入力しても、
$ docker run --gpus all nvcr.io/nvidia/k8s/cuda-sample:nbody nbody -gpu -benchmark
以下のようなエラーが発生した。
docker: Error response from daemon: could not select device driver "" with capabilities: [[gpu]]
解決方法
1. PCにDocker Desktop for Windowsがインストール済みの場合は、「アプリと機能」からDocker Desktopをアンインストールする。
2.NVIDIA公式の方法に従って作業する。この時、以下のコードをところで、「既にdockerがマシンに入っているからトラブル起きる可能性あるよ(意訳)」という警告文が発生し、それでも進めようとすると、「WSL2環境があるときにはDocker Desktop for Windowsを使いましょう。(意訳)」と警告文が出るけど無視して進める。
$ curl https://get.docker.com | sh
3.引き続きNVIDIA公式の方法に従って作業し、
$ docker run --gpus all nvcr.io/nvidia/k8s/cuda-sample:nbody nbody -gpu -benchmark
の箇所で、以下のエラーが発生した場合は、
docker: Error response from daemon: cgroups: cannot find cgroup mount destination: unknown. ERRO[0000] error waiting for container: context canceled
以下のようにディレクトを作成してマウントする。
$ sudo mkdir /sys/fs/cgroup/systemd $ sudo mount -t cgroup -o none,name=systemd cgroup /sys/fs/cgroup/systemd
すると、
$ docker run --gpus all nvcr.io/nvidia/k8s/cuda-sample:nbody nbody -gpu -benchmark
が正常に動作します。以上です。
【解決方法の参考サイト】
cuda - GPU/Docker not working Ubuntu 20.04 in the WSL 2 of Windows - Ask Ubuntu
https://github.com/docker/for-linux/issues/219#issuecomment-375160449