tropicbirdのブログ

データサイエンスとかに関するメモ

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]]
原因(おそらく)

NVIDIA公式の方法に従って作業をする前に、Docker Desktop for Windowsを先にPCにインストールしていたため。

解決方法

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