更新日から1年以上経過しています。情報が古い可能性がございます。
Windows10 Insider PreviewのFast Ringの、WSL2でCUDAが利用可能になりました。
Windows 10プレビュー版、WSL上でCUDAが利用可能に
そこで早速手元の環境で動かしてみようと思います。
動作確認した環境は以下の通り。
- エディション : Windows 10 Pro Insider Preview
- バージョン : 2004
- OSビルド : 20150.1000
- GPU : TITAN RTX
- WSL2上のLinux : Ubuntu20.04
環境構築
Nvidiaの公式にWSLでGPUを使うまでの手順が記載されています。ここのドキュメントに沿って導入していきます。
https://developer.nvidia.com/cuda/wsl
ユーザーガイドの方のリンクをクリックして、Getting Startedの項目に従って導入します。
簡単に流れを書くと、以下の手順になります。
- Insider Previewに登録して、Fast Ringを導入する
- OSビルドの表記が20145以上であれば大丈夫です
- NvidiaのPreview driver for WSL2をインストール
- 上記リンクのGet CUDA Driverのリンク先で入手できます。
- WSL2をインストールする
以上で導入が済みます。
では順に追っていきましょう。
Fast Ringの登録
設定の更新とセキュリティからInsider Previewに登録します。この記事の時点ではFast Ringでの提供なので、Fast Ringに設定します。

Driverのインストール
特に問題ありません。
上記のGet CUDA Driverから辿っていけば入手できます。いつものドライバー導入と同様にインストールすれば良いです。
WSL2のインストール
MS公式ドキュメントに従ってWSL2をインストールします。
https://docs.microsoft.com/ja-jp/windows/wsl/install-win10
ここで、Windows Updateの詳細オプションの一番上の項目をオンにしておかないと、WSL2のKernel versionが古いままなので、ここをオンにしてWindows Updateをかけます。

WSL2上での環境構築
ここまで出来たらWindows storeからUbuntuをインストールします。私は20.04でやりましたが、公式で用意されているパッケージがまだ18.04向けまでなので、18.04の方が良いかもしれません。
Nvidiaの公式ドキュメントに従って進めていきます。
Dockerのインストール
私は下記ページを参考に導入しましたが、Nvidiaのドキュメントのスクリプトでも良いと思います。
https://docs.docker.com/engine/install/ubuntu/
curl https://get.docker.com | sh
Nvidia Container Toolkitの導入
こちらもNvidiaの公式ドキュメントの記載に従います。
$ distribution=$(. /etc/os-release;echo $ID$VERSION_ID)
$ curl -s -L https://nvidia.github.io/nvidia-docker/gpgkey | sudo apt-key add -
$ curl -s -L https://nvidia.github.io/nvidia-docker/$distribution/nvidia-docker.list | sudo tee /etc/apt/sources.list.d/nvidia-docker.list
$ curl -s -L https://nvidia.github.io/libnvidia-container/experimental/$distribution/libnvidia-container-experimental.list | sudo tee /etc/apt/sources.list.d/libnvidia-container-experimental.list
できたらパッケージのインストールです。
$ sudo apt update
$ sudo apt install -y nvidia-docker2
nvidia-docker2が入ったのでdockerを再起動します。
$ sudo service docker stop
$ sudo service docker start
これで準備が整います。
動作確認
Nvidiaの公式ドキュメントに従っていきます。
$ docker run --gpus all nvcr.io/nvidia/k8s/cuda-sample:nbody nbody -gpu -benchmark
以下の表示が出て、きちんとWSL2で立ち上げたコンテナからGPUが見えていることが確認できます。
NOTE: The CUDA Samples are not meant for performance measurements. Results may vary when GPU Boost is enabled.
> Windowed mode
> Simulation data stored in video memory
> Single precision floating point simulation
> 1 Devices used for simulation
MapSMtoCores for SM 7.5 is undefined. Default to use 64 Cores/SM
GPU Device 0: "TITAN RTX" with compute capability 7.5
> Compute 7.5 CUDA device: [TITAN RTX]
73728 bodies, total time for 10 iterations: 119.675 ms
= 454.215 billion interactions per second
= 9084.309 single-precision GFLOP/s at 20 flops per interaction
Jupyterを立ててみる
自前でJupyter用のコンテナを立ち上げます。
nvidia/cuda:10.2-cudnn7-runtime をベースに、Python3.8.3、Jupyter lab、PyTorchを入れたDockerfileを作成して立ち上げてみました。

ちゃんとCUDAもCuDNNも認識していますね!
気を付けること
始めひっかかったのですが、Docker Desktop for WindowsのバックエンドにWSL2を使う方法ではGPUは利用できませんでした。私はDocker Desktopを削除し、WSL2上にdocker環境を構築してできるようになりました。
最後に
これまでWindowsで使えないパッケージを使うために、UbuntuとWindowsを行ったり来たりしていたのですが、WSL2でGPUが使えるようになったことで、その必要がなくなりかなり開発が楽になりそうです。WSL2経由でのGPU処理は処理がネイティブよりは遅いそうですが、それでも十分すぎる恩恵が私にはあります。
Windows最高では?