🐋

【備忘録】Windows11 + WSL2 + GPU + devcontainer

2024/03/09に公開

はじめに

本記事は、毎回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をインストールする。

  1. WSLをインストール
    # Powershell上で実行
    >wsl.exe --install
    
  2. WSLが最新のカーネルか確認
    # Powershell上で実行
    >wsl.exe --update
    
  3. 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時点での手順)

  1. 下準備

    # 以下はWSL上で実行
    $sudo apt-get update
    $sudo apt-get install ca-certificates curl
    
  2. 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
    
  3. 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を使うのに少し手間がかかる。

  1. vscodeのインストール
    公式からインストールする。
  2. 拡張機能のインストール
    Remote Developmentをインストールする。
  3. 設定の変更
    上記までの手順だと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"]

起動方法

ここが少しめんどくさく、

  1. Windows上でプロジェクトをvscodeで開く
  2. vscode上で、「WSLでフォルダをもう一度開く」を実行
  3. WSL上のvscodeで、「コンテナーでリビルドして再度開く」を実行

これでようやくdevcontainer環境に入れる。(もっと楽な方法がないかは要調査)

動作確認

今回はAnaconda環境にPytorchをインストールしてGPUを認識するか確認する。

  1. Pytorchのインストール
    $conda install pytorch torchvision torchaudio pytorch-cuda=11.8 -c pytorch -c nvidia
    
  2. 動作確認
    $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