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ドライバの最低バージョンが決まっているので、ホスト側にインストールされたドライバのバージョンは確認しておく。基本最新版入れておけばいいのかもしれない。(自分はゲーム用の最新を入れている)
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