🐧

WSL2でGPUを使う

に公開

Windows11のWSL2でUbuntuをインストールして、GPUを使えるようにするところの備忘録。

前提

  • ホスト側(Win11)では、NVIDIAドライバは最新版をインストール済み
  • ホスト側(Win11)では、CUDA関連は一切インストールしてない

Win11でWSLのセットアップ

インストール可能なディストリビューション一覧(Ubuntuのみ抜粋)

wsl --list --online

Ubuntu-22.04
Ubuntu-24.04

インストール

wsl --install -d Ubuntu-22.04

wslイメージのバックアップなど

以下は、そのまま利用したくなったので、いったんイメージをエクスポート&インポートして名称などを変更してます。
必須作業ではない。

現在のディストリビューションのイメージをtar形式でエクスポート

wsl --export Ubuntu-22.04 ubuntu-22.04.tar

エクスポートしたイメージを名前を指定してインポートする

wsl --import <新しい名前> <インストール先> <tarファイルのパス>
wsl --import ubuntu22.04 ubuntu22.04 ubuntu-22.04.tar
wsl --set-default ubuntu22.04

WSLディストリビューションの設定

インポートしたディストリビューションを使うと、デフォルトユーザがrootになるので、利用したいユーザを設定しておく。あとついでにほかのパラメータも設定。

/etc/wsl.conf に以下を追加。(ユーザはubuntuに変更)

[boot]
systemd=true

[user]
default=ubuntu

[automount]
enabled = true
root = /mnt/

[interop]
enabled = true
appendWindowsPath = false

設定を反映するためにシャットダウンして再度ログインする

wsl --shutdown

NVIDIAドライバとCUDAの関係

GPUをプログラムで使う場合、CUDAのインストールとセットアップを行うが、PytorchやTensorflowなどで厳密にバージョンが決まっていたりして、とても苦労する。一般的にはDockerコンテナ内でフレームワークのバージョンを整えて使うのが推奨されていて、直接Ubuntu上にインストールなどは避ける。

GPUプログラムを動作させるためには、NVIDIAドライバCUDAが必要だが、WSL2内のUbuntuにはNVIDIAドライバをインストールする必要はなく、ホスト側(Win11)のNVIDIAドライバが自動的に使われる。

CUDAについては、上記のように、Dockerイメージ内にインストールしたものを基本利用するので、Ubuntuには何もインストールしなくていいし、すべきではない。

注意点としては、特定バージョンのCUDAを使うためには、NVIDIAドライバの最低バージョンが決まっているので、ホスト側にインストールされたドライバのバージョンは確認しておく。基本最新版入れておけばいいのかもしれない。(自分はゲーム用の最新を入れている)

https://docs.nvidia.com/cuda/cuda-toolkit-release-notes/index.html#id6

CUDA Toolkit Version Minimum Driver Version (Linux) Minimum Driver Version (Windows)
CUDA 12.4 550.54.14 552.12
CUDA 12.3 545.23.08 546.33
CUDA 12.2 535.54.03 536.25
CUDA 12.1 530.30.02 531.14
CUDA 12.0 525.60.13 528.24
CUDA 11.8 510.47.03 511.65
CUDA 11.7 515.43.04 516.94
CUDA 11.6 510.39.01 511.23

NVIDIA版Dockerのインストール

通常のDockerではなく、NVIDIAがチューニングした?Dockerをインストールする必要がある。通常版Dockerだと後述する--gpus allなどのコンテナ内でGPUを指定するオプションが使えない。

sudo mkdir -p /etc/apt/keyrings
curl -fsSL https://nvidia.github.io/libnvidia-container/gpgkey | \
  sudo gpg --dearmor -o /etc/apt/keyrings/nvidia-container-toolkit.gpg
distribution=$(. /etc/os-release; echo $ID$VERSION_ID)
curl -s -L https://nvidia.github.io/libnvidia-container/$distribution/libnvidia-container.list | \
  sed 's#deb https://#deb [signed-by=/etc/apt/keyrings/nvidia-container-toolkit.gpg] https://#' | \
  sudo tee /etc/apt/sources.list.d/nvidia-container-toolkit.list

sudo apt update
sudo apt install -y nvidia-container-toolkit

Dockerグループにubuntu(筆者のユーザなので適宜読み替える)を追加

sudo usermod -aG sudo ubuntu

Docker の設定を更新して GPU 対応にする。通常版Dockerがすでにある場合は、以下だけでいいのか不明。

sudo nvidia-ctk runtime configure --runtime=docker
sudo service docker restart

WSL2内でpytorch+cudaのコンテナを実行してGPU利用確認する

では、Pytorch+CUDAの公式コンテナを使って、pythonプログラムを実行してみる。

プログラムでは、CUDAの利用可否、GPU名、GPUメモリサイズを取得してprintしている。もし環境的にGPUが使えなければただしくプログラムは動作しない。

Pytorch + CUDAコンテナをインストール

docker pull pytorch/pytorch:2.6.0-cuda12.6-cudnn9-devel

コンテナ内で、GPU情報を取得して出力。GPU名やメモリサイズが正しければOK。

docker run --rm --gpus all pytorch/pytorch:2.6.0-cuda12.6-cudnn9-devel python -c "import torch; print('Cuda: %s'%(torch.cuda.is_available())); print('Device: %s'%(torch.cuda.get_device_name(0))); print('Memory: %.1f GB'%(torch.cuda.get_device_properties(0).total_memory / 1024**3))"

実行結果の最後に以下のように表示される。環境のGPUやメモリサイズが正しければOK

Cuda: True
Device: NVIDIA GeForce RTX 3090
Memory: 24.0 GB

GPUが認識できてないと、Cuda: Falseだけ表示されて、プログラムが終了する。

Discussion