【備忘録】Windows11 + WSL2 + GPU + devcontainer
はじめに
本記事は、毎回Windowsセットアップ時に調べるのが面倒になったため備忘録として設定を残した記事である。
【Windows11にCUDAをインストール】し、それを【WSL2上のDocker】で【vscode上のdevcontainer】として動作させるための環境構築である。
検証環境
- Windows11 Pro
- RAM: 32GB
- RTX4070
環境構築手順
Windows11にCUDAをインストール
最新のWSL2だとWindowsにインストールしたCUDAを認識するようなので、Windows側にCUDA環境を整える。
基本的にはこちらを参考に、
- NVIDIAドライバ
- NVIDIA CUDA Toolkit (ここでは11.8)
- NVIDIA cuDNN
をインストールする。
WSL2のインストール
公式の手順に沿ってWindows11にWSL2をインストールする。
- WSLをインストール
# Powershell上で実行 >wsl.exe --install
- WSLが最新のカーネルか確認
# Powershell上で実行 >wsl.exe --update
- CUDAを確認
# Powershellで実行 >wsl # 以下はWSL上で実行 $nvidia-smi Sat Mar 9 14:22:24 2024 +-----------------------------------------------------------------------------------------+ | NVIDIA-SMI 550.60.01 Driver Version: 551.76 CUDA Version: 12.4 | |-----------------------------------------+------------------------+----------------------+ | 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 RTX 4070 ... On | 00000000:01:00.0 On | N/A | | N/A 39C P8 2W / 115W | 79MiB / 8188MiB | 0% Default | | | | N/A | +-----------------------------------------+------------------------+----------------------+ +-----------------------------------------------------------------------------------------+ | Processes: | | GPU GI CI PID Type Process name GPU Memory | | ID ID Usage | |=========================================================================================| | No running processes found | +-----------------------------------------------------------------------------------------+
Dockerのインストール
今回はDocker Desktopではなく、WSL2上に素のDockerを公式の手順でインストールする。
(※2024/03/08時点での手順)
-
下準備
# 以下はWSL上で実行 $sudo apt-get update $sudo apt-get install ca-certificates curl
-
Dockerのインストール
$sudo install -m 0755 -d /etc/apt/keyrings $sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc $sudo chmod a+r /etc/apt/keyrings/docker.asc # Add the repository to Apt sources: $echo \ "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu \ $(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \ sudo tee /etc/apt/sources.list.d/docker.list > /dev/null $sudo apt-get update $sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
-
GPUを認識するか確認
$sudo docker run --gpus all nvcr.io/nvidia/k8s/cuda-sample:nbody nbody -gpu -benchmark Unable to find image 'nvcr.io/nvidia/k8s/cuda-sample:nbody' locally nbody: Pulling from nvidia/k8s/cuda-sample 22c5ef60a68e: Pull complete 1939e4248814: Pull complete 548afb82c856: Pull complete a424d45fd86f: Pull complete 207b64ab7ce6: Pull complete f65423f1b49b: Pull complete 2b60900a3ea5: Pull complete e9bff09d04df: Pull complete edc14edf1b04: Pull complete 1f37f461c076: Pull complete 9026fb14bf88: Pull complete Digest: sha256:59261e419d6d48a772aad5bb213f9f1588fcdb042b115ceb7166c89a51f03363 Status: Downloaded newer image for nvcr.io/nvidia/k8s/cuda-sample:nbody Run "nbody -benchmark [-numbodies=<numBodies>]" to measure performance. -fullscreen (run n-body simulation in fullscreen mode) -fp64 (use double precision floating point values for simulation) -hostmem (stores simulation data in host memory) -benchmark (run benchmark to measure performance) -numbodies=<N> (number of bodies (>= 1) to run in simulation) -device=<d> (where d=0,1,2.... for the CUDA device to use) -numdevices=<i> (where i=(number of CUDA devices > 0) to use for simulation) -compare (compares simulation results running once on the default GPU and once on the CPU) -cpu (run n-body simulation on the CPU) -tipsy=<file.bin> (load a tipsy model file for simulation) 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 8.9 is undefined. Default to use 128 Cores/SM MapSMtoArchName for SM 8.9 is undefined. Default to use Ampere GPU Device 0: "Ampere" with compute capability 8.9 > Compute 8.9 CUDA device: [NVIDIA GeForce RTX 4070 Laptop GPU] 36864 bodies, total time for 10 iterations: 25.249 ms = 538.226 billion interactions per second = 10764.521 single-precision GFLOP/s at 20 flops per interaction
これでWSL2上のDocker環境でGPUが認識できることが確認できた。
vscodeの設定
今回はDocker Desktopを使っていないのでdevcontainerを使うのに少し手間がかかる。
- vscodeのインストール
公式からインストールする。 - 拡張機能のインストール
Remote Developmentをインストールする。 - 設定の変更
上記までの手順だとdevcontainer起動時にエラーが出るため、こちらを参考にvscodeの設定を変更する。
(自分はこの設定が抜けておりかなり時間を要した。)
動作確認
動作確認用にフォルダを作成し、以下のようなdevcontainer.jsonとDockerfileで動作確認を行う。
コンテナの中身はAnacondaのPython環境のみをインストールする。
- フォルダ構成
.
├── .devcontainer
│ └── devcontainer.json
└── Dockerfile
- devcontainer.json
{
"name": "example_gpu_test",
"dockerFile": "../Dockerfile",
"workspaceFolder": "/workspace",
"workspaceMount": "source=${localWorkspaceFolder},target=/workspace,type=bind,consistency=cached",
"customizations": {
"vscode": {
"extensions": [
"ms-python.python",
"ms-toolsai.jupyter"
],
"settings": {
"workbench.colorCustomizations": {
"titleBar.activeBackground": "#19549C",
"titleBar.activeForeground": "#ffffff",
"activityBar.background": "#02A7E3",
"activityBar.foreground": "#ffffff"
}
}
}
},
"runArgs": ["--gpus", "all"] # ここは必須
}
- Dockerfile
FROM nvcr.io/nvidia/cuda:11.8.0-cudnn8-devel-ubuntu20.04 # 自分の環境にあったベースイメージを使うこと
RUN apt-get update && \
DEBIAN_FRONTEND=noninteractive TZ=Asia/Tokyo apt-get install -y tzdata && \
ln -fs /usr/share/zoneinfo/$TZ /etc/localtime && \
dpkg-reconfigure --frontend noninteractive tzdata && \
apt-get clean && \
rm -rf /var/lib/apt/lists/*
RUN apt-get update && apt-get install -y sudo wget libeigen3-dev ffmpeg git
WORKDIR /opt
RUN wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh && \
bash Miniconda3-latest-Linux-x86_64.sh -b -p /opt/miniconda3 && \
rm -r Miniconda3-latest-Linux-x86_64.sh
ENV PATH /opt/miniconda3/bin:$PATH
RUN pip install --upgrade pip && conda update -n base -c defaults conda && \
conda init
WORKDIR /workspace
CMD ["/bin/bash"]
起動方法
ここが少しめんどくさく、
- Windows上でプロジェクトをvscodeで開く
- vscode上で、「WSLでフォルダをもう一度開く」を実行
- WSL上のvscodeで、「コンテナーでリビルドして再度開く」を実行
これでようやくdevcontainer環境に入れる。(もっと楽な方法がないかは要調査)
動作確認
今回はAnaconda環境にPytorchをインストールしてGPUを認識するか確認する。
- Pytorchのインストール
$conda install pytorch torchvision torchaudio pytorch-cuda=11.8 -c pytorch -c nvidia
- 動作確認
$python Python 3.12.1 | packaged by Anaconda, Inc. | (main, Jan 19 2024, 15:51:05) [GCC 11.2.0] on linux Type "help", "copyright", "credits" or "license" for more information. >>> import torch >>> torch.version.cuda '11.8' >>> torch.cuda.is_available() True >>> torch.cuda.device_count() 1 >>> torch.cuda.get_device_name() 'NVIDIA GeForce RTX 4070 Laptop GPU' >>> torch.cuda.get_device_capability() (8, 9) >>> torch.cuda.get_arch_list() ['sm_50', 'sm_60', 'sm_61', 'sm_70', 'sm_75', 'sm_80', 'sm_86', 'sm_37', 'sm_90', 'compute_37'] >>>
問題なくPytorchでGPUデバイスを認識することができた。
おわりに
今回は新しいWindows11にGPU環境を構築する手順をまとめた。
公式のインストール手順などは時期によって変わる可能性があるので注意したい。
今後は、devcontainerの起動を簡略化できる調査して、より楽にGPU環境を扱えるようにしたい。
Discussion