WSL2でCUDAを使う


更新日から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の項目に従って導入します。
簡単に流れを書くと、以下の手順になります。

  1. Insider Previewに登録して、Fast Ringを導入する
    • OSビルドの表記が20145以上であれば大丈夫です
  2. NvidiaのPreview driver for WSL2をインストール
    • 上記リンクのGet CUDA Driverのリンク先で入手できます。
  3. 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最高では?


コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です