Windows11 + WSL2 (Ubuntu22.04) のNVIDIA GPUについて。とnvidia-dockerをすこし
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-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両方を上手く利用して開発していきたいなと思います。
Discussion