これはなに
WSL2内のDockerコンテナからNVIDIA GPUを利用するための設定方法のメモ。
環境
- OS: Windows 11
- WSL2 : Ubuntu distribution (22.04.1 LTS)
- GPU: RTX 3060Ti
- Docker Desktop for Windows、またはDocker Engine in WSL2
WSL2のDockerでGPUを活用するための環境構築手順
前提条件を満たすか確認する
まずは、WSL2とDockerでGPUを使用できるようにするための前提条件を確認する。 以下のサイトに前提条件が書かれている。
執筆当時の前提条件は以下のとおりだった。
- GNU/Linux x86_64 with kernel version > 3.10
- Docker >= 19.03 (recommended, but some distributions may include older versions of Docker. The minimum supported version is 1.12)
- NVIDIA GPU with Architecture >= Kepler (or compute capability 3.0)
- NVIDIA Linux drivers >= 418.81.07 (Note that older driver releases or branches are unsupported.)
よって、前提条件を満たすかコマンドで確認する。
Linux kernelのバージョンは、WSLのバージョンの確認でわかる。
$ wsl --version
WSL バージョン: 1.2.5.0
カーネル バージョン: 5.15.90.1
WSLg バージョン: 1.0.51
MSRDC バージョン: 1.2.3770
Direct3D バージョン: 1.608.2-61064218
DXCore バージョン: 10.0.25131.1002-220531-1700.rs-onecore-base2-hyp
Windows バージョン: 10.0.22621.1702
Dockerのバージョンはdocker
コマンドで表示できる。
$ docker -v
Docker version 23.0.5, build bc4487a
NVIDIA Driverが入っているかどうかと、そのバージョンの確認は、nvidia-smi
コマンドで確認できる。何も表示されない場合はNVIDIA Driverが入っていないので、NVIDIAの公式サイト
からダウンロードしてインストールする。
$ nvidia-smi
Sun May 21 01:06:40 2023
+---------------------------------------------------------------------------------------+
| NVIDIA-SMI 530.50 Driver Version: 531.79 CUDA Version: 12.1 |
|-----------------------------------------+----------------------+----------------------+
| GPU Name Persistence-M| Bus-Id Disp.A | Volatile Uncorr. ECC |
| Fan Temp Perf Pwr:Usage/Cap| Memory-Usage | GPU-Util Compute M. |
| | | MIG M. |
|=========================================+======================+======================|
| 0 NVIDIA GeForce RTX 3060 Ti On | 00000000:01:00.0 On | N/A |
| 60% 53C P5 29W / 200W| 2855MiB / 8192MiB | 24% Default |
| | | N/A |
+-----------------------------------------+----------------------+----------------------+
+---------------------------------------------------------------------------------------+
| Processes: |
| GPU GI CI PID Type Process name GPU Memory |
| ID ID Usage |
|=======================================================================================|
| No running processes found |
+---------------------------------------------------------------------------------------+
それぞれのツールのインストールとバージョンが前提条件を満たしていることを確認したら、次へ進む。
NVIDIA Container Toolkitをインストールする
次に、NVIDIA Container Toolkitをインストールする。 このToolkitはDockerと密接に連携し、コンテナからNVIDIA GPUを活用できるようにする。
インストールは公式ドキュメント の手順に従う。 公式ドキュメントの方法が最新の方法なので、それに従うのがベストである。
念のため執筆時のインストール方法を残しておく
パッケージリポジトリとGPGキーをセットアップする。
distribution=$(. /etc/os-release;echo $ID$VERSION_ID) \
&& curl -fsSL https://nvidia.github.io/libnvidia-container/gpgkey | sudo gpg --dearmor -o /usr/share/keyrings/nvidia-container-toolkit-keyring.gpg \
&& curl -s -L https://nvidia.github.io/libnvidia-container/$distribution/libnvidia-container.list | \
sed 's#deb https://#deb [signed-by=/usr/share/keyrings/nvidia-container-toolkit-keyring.gpg] https://#g' | \
sudo tee /etc/apt/sources.list.d/nvidia-container-toolkit.list
パッケージリストを更新する。
sudo apt update
nvidia-container-toolkitパッケージ(および依存関係)をインストールする。
sudo apt install -y nvidia-container-toolkit
NVIDIA Container Toolkitのインストールを確認する。
nvidia-container-cli info
DockerデーモンがNVIDIA Container Runtimeを認識するように設定する。 Docker Desktop for Windowsを利用している場合は、この手順だけ飛ばしてよい。
sudo nvidia-ctk runtime configure --runtime=docker
最後に、Dockerデーモンを再起動する。 Docker Desktop for Windowsを利用している場合は、コマンドではなくDocker DesktopのほうでDockerデーモンを再起動する。
sudo systemctl restart docker
ちなみに、systemctl
が使えない場合は次のエラーが出る。
$ sudo systemctl restart docker
System has not been booted with systemd as init system (PID 1). Can't operate.
Failed to connect to bus: Host is down
この場合は下記リンクの内容に従って対処すること。
https://kyrieee.com/wsl-error/2109/ https://shikiyura.com/2022/11/systemd_supported_in_wsl/
GPUが認識されるか確認する
環境が正しく設定され、DockerコンテナからGPUが適切に認識されるか確認する。
sudo docker run --rm --runtime=nvidia --gpus all nvidia/cuda:11.6.2-base-ubuntu20.04 nvidia-smi
docker: Error response from daemon: unknown or invalid runtime name: nvidia.
というエラーが出る場合は、--runtime=nvidia
を削除して実行する。
以下のように結果が表示されれば成功。
+---------------------------------------------------------------------------------------+
| NVIDIA-SMI 530.41.03 Driver Version: 531.41 CUDA Version: 12.1 |
|-----------------------------------------+----------------------+----------------------+
| GPU Name Persistence-M| Bus-Id Disp.A | Volatile Uncorr. ECC |
| Fan Temp Perf Pwr:Usage/Cap| Memory-Usage | GPU-Util Compute M. |
| | | MIG M. |
|=========================================+======================+======================|
| 0 NVIDIA GeForce RTX 3060 Ti On | 00000000:01:00.0 On | N/A |
| 0% 55C P8 24W / 200W| 1846MiB / 8192MiB | 11% Default |
| | | N/A |
+-----------------------------------------+----------------------+----------------------+
+---------------------------------------------------------------------------------------+
| Processes: |
| GPU GI CI PID Type Process name GPU Memory |
| ID ID Usage |
|=======================================================================================|
| 0 N/A N/A 23 G /Xwayland N/A |
+---------------------------------------------------------------------------------------+
DockerコンテナからGPUを利用する
あとは、GPUを利用したいコンテナを実行するときに、以下のコマンドのように--gpus all
あるいは--gpus=all
のオプションをつけて実行すればよい。
sudo docker run --rm --gpus all nvidia/cuda:11.6.2-base-ubuntu20.04 nvidia-smi