👀

Windows11 + WSL2 (Ubuntu22.04) のNVIDIA GPUについて。とnvidia-dockerをすこし

2022/06/05に公開

WSL2(Widnwos Subsystem for Linux)は数年前と比べて格段と良くなりましたね。

WindowsをインストールしてからWSL2を使えるようにした際にnvidia-smi をWSL2で使うまでを記事で書こうとしました。

結果

ホスト側にドライバを入れたら勝手にWSL2にnvidia-smiが入っていて、普通に使えた。

😲😲😲😲😲

おまけ

あまりにも素っ気なかったので、nvidia-dockerをWSL2側のDockerEngineにnvidia-dockerを建ててnvidia-smiが実行出来るか試してみました。

dockerを入れる

まだインストールしたばっかりだったのでDockerが入っていません。
とりあえず公式ドキュメントの通りに入れてみます。

 !  ~  sudo apt-get remove docker docker-engine docker.io containerd runc                                                                                          Sat 04 Jun 2022 11:32:45 PM JSTReading package lists... Done
Building dependency tree... Done
Reading state information... Done
E: Unable to locate package docker-engine
 !  ~  sudo apt-get update                                                                                                                                 161ms  Sat 04 Jun 2022 11:32:49 PM JSTHit:1 http://archive.ubuntu.com/ubuntu jammy InRelease
Get:2 http://security.ubuntu.com/ubuntu jammy-security InRelease [110 kB]
Get:3 http://archive.ubuntu.com/ubuntu jammy-updates InRelease [109 kB]
Get:4 http://security.ubuntu.com/ubuntu jammy-security/main amd64 Packages [130 kB]
Get:5 http://archive.ubuntu.com/ubuntu jammy-backports InRelease [99.8 kB]
Get:6 http://archive.ubuntu.com/ubuntu jammy-updates/main amd64 Packages [238 kB]
Get:7 http://security.ubuntu.com/ubuntu jammy-security/main Translation-en [34.0 kB]
Get:8 http://security.ubuntu.com/ubuntu jammy-security/main amd64 c-n-f Metadata [2,172 B]
Get:9 http://security.ubuntu.com/ubuntu jammy-security/universe amd64 Packages [59.5 kB]
Get:10 http://security.ubuntu.com/ubuntu jammy-security/universe amd64 c-n-f Metadata [960 B]
Get:11 http://archive.ubuntu.com/ubuntu jammy-updates/main Translation-en [59.5 kB]
Get:12 http://archive.ubuntu.com/ubuntu jammy-updates/main amd64 c-n-f Metadata [3,980 B]
Get:13 http://archive.ubuntu.com/ubuntu jammy-updates/restricted amd64 Packages [140 kB]
Get:14 http://archive.ubuntu.com/ubuntu jammy-updates/restricted Translation-en [21.4 kB]
Get:15 http://archive.ubuntu.com/ubuntu jammy-updates/restricted amd64 c-n-f Metadata [460 B]
Get:16 http://archive.ubuntu.com/ubuntu jammy-updates/universe amd64 Packages [102 kB]
Get:17 http://archive.ubuntu.com/ubuntu jammy-updates/universe Translation-en [34.2 kB]
Get:18 http://archive.ubuntu.com/ubuntu jammy-updates/universe amd64 c-n-f Metadata [1,848 B]
Get:19 http://archive.ubuntu.com/ubuntu jammy-backports/universe amd64 Packages [2,036 B]
Get:20 http://archive.ubuntu.com/ubuntu jammy-backports/universe Translation-en [7,012 B]
Get:21 http://archive.ubuntu.com/ubuntu jammy-backports/universe amd64 c-n-f Metadata [212 B]
Fetched 1,157 kB in 2s (673 kB/s)
Reading package lists... Done
 ~  sudo apt-get install \                                                                                                                                 3849ms  Sat 04 Jun 2022 11:33:02 PM JST
             ca-certificates \
             curl \
             gnupg \
             lsb-release
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
ca-certificates is already the newest version (20211016).
ca-certificates set to manually installed.
gnupg is already the newest version (2.2.27-3ubuntu2).
gnupg set to manually installed.
lsb-release is already the newest version (11.1.0ubuntu4).
lsb-release set to manually installed.
curl is already the newest version (7.81.0-1ubuntu1.2).
curl set to manually installed.
0 upgraded, 0 newly installed, 0 to remove and 27 not upgraded.
 ~  sudo mkdir -p /etc/apt/keyrings                                                                                                                         237ms  Sat 04 Jun 2022 11:33:21 PM JST ~  curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg                                                    Sat 04 Jun 2022 11:33:40 PM JST
 ~  echo \                                                                                                                                                          Sat 04 Jun 2022 11:33:45 PM JST
           "deb [arch=(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
       (lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
 ~  sudo apt-get update                                                                                                                                             Sat 04 Jun 2022 11:34:03 PM JST
E: Malformed entry 1 in list file /etc/apt/sources.list.d/docker.list ([option] not assignment)
E: The list of sources could not be read.

????

Fishshell用に書き換えたのがダメだったようです。

cat  /etc/apt/sources.list.d/docker.list                                                                                                                       
deb [arch=(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu   (lsb_release -cs) stable

それぞれコマンドを叩いて出力された物に書き換えました。ちゃんと通っているみたいですね。

最後にDocker Engineをインストールします。

sudo apt-get install docker-ce docker-ce-cli containerd.io docker-compose-plugin                                                                       1206ms  Sat 04 Jun 2022 11:37:39 PM JST
Reading package lists... Done
Building dependency tree... Done
...

Docker確認!!

docker ps                                                                                       
Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?

systemctl status docker
System has not been booted with systemd as init system (PID 1). Can't operate.
Failed to connect to bus: Host is down

そりゃそうですよね。

こちらの記事を参考に init.d を設定してみます。

$ cat <<EOF >> ~/.bashrc
# For Docker service start
sudo /etc/init.d/docker start
EOF

🤔🤔🤔🤔🤔🤔🤔🤔🤔🤔🤔🤔🤔🤔🤔🤔🤔🤔🤔🤔🤔🤔🤔🤔

tail -f /var/log/docker.log
...省略
failed to start daemon: Error initializing network controller: error obtaining controller instance: unable to add return rule in DOCKER-ISOLATION-STAGE-1 chain:  (iptables failed: iptables --wait -A DOCKER-ISOLATION-STAGE-1 -j RETURN: iptables v1.8.7 (nf_tables):  RULE_APPEND failed (No such file or directory): rule in chain DOCKER-ISOLATION-STAGE-1
 (exit status 4))

なるほどわからん。

WSLのバグっぽい事が書かれていましたので、とりあえず暫定対応します。

sudo update-alternatives --config iptables                                                                                                                                                 
There are 2 choices for the alternative iptables (providing /usr/sbin/iptables).

  Selection    Path                       Priority   Status
------------------------------------------------------------
* 0            /usr/sbin/iptables-nft      20        auto mode
  1            /usr/sbin/iptables-legacy   10        manual mode
  2            /usr/sbin/iptables-nft      20        manual mode

Press <enter> to keep the current choice[*], or type selection number: 1
update-alternatives: using /usr/sbin/iptables-legacy to provide /usr/sbin/iptables (iptables) in manual mode

Dockerのインストールが完了しました。

Nvidia Doker イメージを実行する

Nvidia Dockerを実行するには、デフォルトのruntimeをnvidiaに変更する必要があります。

Nvidia公式ドキュメント

を見ながらやって行きます。が、とりあえずnvidia-docker2で入れられるっぽいことが書いてあるので

Container Toolkit - Install Guide : Nvidia公式

の方を見ながらやってきます。

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

deb [signed-by=/usr/share/keyrings/nvidia-container-toolkit-keyring.gpg] https://nvidia.github.io/libnvidia-container/stable/ubuntu18.04/$(ARCH) /
#deb [signed-by=/usr/share/keyrings/nvidia-container-toolkit-keyring.gpg] https://nvidia.github.io/libnvidia-container/experimental/ubuntu18.04/$(ARCH) /

ubuntu18.04 🤔

For distribution values of ubuntu20.04 or ubuntu22.04 the file will contain ubuntu18.04 URLs

😌

sudo apt-get update
sudo apt-get install -y nvidia-docker2
sudo /etc/init.d/docker restart

無事成功しました。

動作確認

公式通りに配布されているDocker Imageからnvidia-smiを実行してみます。

$ sudo docker run --rm --gpus all nvidia/cuda:11.0.3-base-ubuntu20.04 nvidia-smi
Unable to find image 'nvidia/cuda:11.0.3-base-ubuntu20.04' locally
11.0.3-base-ubuntu20.04: Pulling from nvidia/cuda
d5fd17ec1767: Pull complete
ea7643e57386: Pull complete
622a04926279: Pull complete
18fcb7509e42: Pull complete
21e5db7c1fa2: Pull complete
Digest: sha256:1db9418b1c9070cdcbd2d0d9980b52bd5cd20216265405fdb7e089c7ff96a494
Status: Downloaded newer image for nvidia/cuda:11.0.3-base-ubuntu20.04
Sat Jun  4 15:02:44 2022
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 510.68.02    Driver Version: 512.95       CUDA Version: 11.6     |
|-------------------------------+----------------------+----------------------+
| 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 ...  On   | 00000000:0A:00.0  On |                  N/A |
|  0%   37C    P8    18W / 290W |   1900MiB /  8192MiB |     11%      Default |
|                               |                      |                  N/A |
+-------------------------------+----------------------+----------------------+

+-----------------------------------------------------------------------------+
| Processes:                                                                  |
|  GPU   GI   CI        PID   Type   Process name                  GPU Memory |
|        ID   ID                                                   Usage      |
|=============================================================================|
|  No running processes found                                                 |
+-----------------------------------------------------------------------------+

$ sudo docker run --rm --gpus all nvidia/cuda:11.0.3-base-ubuntu20.04 nvidia-smi -L
GPU 0: NVIDIA GeForce RTX 3070 Ti (UUID: GPU-

成功です。

最後に

WSL2 で nvidia-docker を実行する記事になってしまいましたが、WSLでここまで出来ればWindowsがあれば何でも出来ますね。
開発のしやすさなど、Windowsの進歩がすごいと感じました。

仕事ではMacbookProを使ってますが、arm機としてのMacとamd64機としてのWindows両方を上手く利用して開発していきたいなと思います。

GitHubで編集を提案

Discussion