Featured image of post WSL2内のDockerコンテナでGPUを使えるようにする

WSL2内のDockerコンテナでGPUを使えるようにする

これはなに Link to this heading

WSL2内のDockerコンテナからNVIDIA GPUを利用するための設定方法のメモ。

環境 Link to this heading

  • OS: Windows 11
  • WSL2 : Ubuntu distribution (22.04.1 LTS)
  • GPU: RTX 3060Ti
  • Docker Desktop for Windows、またはDocker Engine in WSL2

WSL2のDockerでGPUを活用するための環境構築手順 Link to this heading

前提条件を満たすか確認する Link to this heading

まずは、WSL2とDockerでGPUを使用できるようにするための前提条件を確認する。 以下のサイトに前提条件が書かれている。

's image

docs.nvidia.com

docs.nvidia.com

執筆当時の前提条件は以下のとおりだった。

  1. GNU/Linux x86_64 with kernel version > 3.10
  2. Docker >= 19.03 (recommended, but some distributions may include older versions of Docker. The minimum supported version is 1.12)
  3. NVIDIA GPU with Architecture >= Kepler (or compute capability 3.0)
  4. NVIDIA Linux drivers >= 418.81.07 (Note that older driver releases or branches are unsupported.)

よって、前提条件を満たすかコマンドで確認する。

Linux kernelのバージョンは、WSLのバージョンの確認でわかる。

PowerShell
$ 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コマンドで表示できる。

WSL2
$ docker -v
Docker version 23.0.5, build bc4487a

NVIDIA Driverが入っているかどうかと、そのバージョンの確認は、nvidia-smiコマンドで確認できる。何も表示されない場合はNVIDIA Driverが入っていないので、NVIDIAの公式サイト からダウンロードしてインストールする。

WSL2
$ 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をインストールする Link to this heading

次に、NVIDIA Container Toolkitをインストールする。 このToolkitはDockerと密接に連携し、コンテナからNVIDIA GPUを活用できるようにする。

インストールは公式ドキュメント の手順に従う。 公式ドキュメントの方法が最新の方法なので、それに従うのがベストである。

's image

docs.nvidia.com

docs.nvidia.com
念のため執筆時のインストール方法を残しておく

パッケージリポジトリと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が認識されるか確認する Link to this heading

環境が正しく設定され、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を削除して実行する。

[WSL2]docker: Error response from daemon: Unknown runtime specified nvidia. の対処法 - Qiita's image

[WSL2]docker: Error response from daemon: Unknown runtime specified nvidia. の対処法 - Qiita

--runtime=nvidia を --gpus all に変更する。参考: https://github.com/NVIDIA/nvidia-docker/issues/838#issueco…

qiita.com

以下のように結果が表示されれば成功。

+---------------------------------------------------------------------------------------+
| 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を利用する Link to this heading

あとは、GPUを利用したいコンテナを実行するときに、以下のコマンドのように--gpus allあるいは--gpus=allのオプションをつけて実行すればよい。

sudo docker run --rm --gpus all nvidia/cuda:11.6.2-base-ubuntu20.04 nvidia-smi

参考文献・URL Link to this heading

Dockerを使って爆速でGPUを設定する方法 - Qiita's image

Dockerを使って爆速でGPUを設定する方法 - Qiita

#はじめに機械学習をやろうと思ったら、まずやってくるのが GPUの設定 ですよね。ドライバインストールしてCUDAとcudnnインストールして、、、。これが本当にめんどくさい!そんな方には Doc…

qiita.com
Dockerを使ってpytorch+cudaの環境を構築する - やったことの説明's image

Dockerを使ってpytorch+cudaの環境を構築する - やったことの説明

はじめに 研究をやっていると 査読対応のために実験を追加したいが,環境をいじってしまっている 既存手法を実行するために,tensorflowの特定のバージョンを使いたい.それに伴って特定のバージョンのcudaをインストールしなければならない みたいなことが発生する. pythonだけならcondaやpipenvでなんとかなるが,cudaなどが絡んでくると色々めんどくさくなる. そこで,Dockerを使って環境を構築することでこの問題を解決することを試みる. もう1台のパソコンや会社のPCで同じことをやるので記録を残す. cuda+dockerで検索するとnvidia-docker2を使うように…

ksknw.hatenablog.com
Licensed under CC BY-NC-SA 4.0
最終更新 5月 21, 2023
Hugo で構築されています。
テーマ StackJimmy によって設計されています。