WSL2上にDockerインストールし、GPUを使用できるように環境構築を行います。
windows環境でdockerを利用するにはWSLのインストールが必要になります。
WSL (Windows Subsystem for Linux) は、Windows 10およびWindows Server 2019で実行されるLinux環境を提供する機能です。これにより、Windows上でLinuxプログラムを実行することができます。
WSLは、Windows上でUbuntu、Debian、OpenSUSE、Kali LinuxなどのLinuxディストリビューションを実行することができます。
WSLを使用すると、Windows上でLinuxコマンドラインツールやシェルスクリプトを実行したり、Linux用のプログラムやツールをインストールして実行したりすることができます。
WSL2では、より高速なファイルシステムアクセスやネットワークパフォーマンスの向上、Dockerのサポートなどが追加されました。
私の構築した際の前提条件は下記になります。
- windows11
- GeForce 3060Ti
- NVIDIA Driver 531.68
Driver未インストールの場合はwindows用のNVIDIA DriverにWSL用のドライバが含まれているので、ダウンロードページまたはFeForce Experienceからwindows用ドライバをダウンロードします。
WLSのインストール

PowerShellまたはコマンドプロンプトを管理者モードで開き、wsl --install
コマンド入力ます。こちらのコマンドでWSL2をインストールするだけでなく、Ubuntuもインストールしてくれます。
wsl --install
インストール済みの場合は念のためアップデートをします。
wls --update
WSL2でUbuntuが動作しているか確認をします。(私の場合はUbuntu-22.04になります。)
VERSIONが2になっていることを確認します。
wsl -l -v
NAME STATE VERSION
* Ubuntu-22.04 Running 2
WLS用のNVIDIA Driverの確認

wsl -d <Distribution Name>
コマンドでWSLを起動します。(私の場合はUbuntu-22.04になります。)
wsl -d Ubuntu-22.04
WSLで起動したubuntuの /usr/lib/wsl/lib 配下にドライバ関連のファイルがあります。この中にnvidia-smi
があるので実行してGPUの認識確認を行います。
ubuntu@omen:/$ ls /usr/lib/wsl/lib
libcuda.so libd3d12core.so libnvdxdlkernels.so libnvidia-opticalflow.so libnvwgf2umx.so
libcuda.so.1 libdxcore.so libnvidia-encode.so libnvidia-opticalflow.so.1 nvidia-smi
libcuda.so.1.1 libnvcuvid.so libnvidia-encode.so.1 libnvoptix.so.1
libd3d12.so libnvcuvid.so.1 libnvidia-ml.so.1 libnvoptix_loader.so.1
ubuntu@omen:/$ nvidia-smi
Sun Apr 23 06:16:12 2023
+---------------------------------------------------------------------------------------+
| NVIDIA-SMI 530.47 Driver Version: 531.68 CUDA Version: 12.1 |
|-----------------------------------------+----------------------+----------------------+
| 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 3060 Ti On | 00000000:01:00.0 On | N/A |
| 30% 32C P8 15W / 200W| 712MiB / 8192MiB | 17% Default |
| | | N/A |
+-----------------------------------------+----------------------+----------------------+
+---------------------------------------------------------------------------------------+
| Processes: |
| GPU GI CI PID Type Process name GPU Memory |
| ID ID Usage |
|=======================================================================================|
| No running processes found |
+---------------------------------------------------------------------------------------+
ubuntu@omen:/$
Dockerのインストール

公式サイトの手順通りにインストールを行います。
Dcokerのセットアップ
Docker公式スクリプトからのUbuntu上にDocker-CEセットアップを行います。
$ curl https://get.docker.com | sh \
&& sudo systemctl --now enable docker
ユーザー権限でDockerを起動できるようにします。
$ sudo usermod -aG docker $USER
NVIDIA Container Toolkitのセットアップ
順番にターミナルで実行していきます。
パッケージレポジトリとGPGキーのセットアップを行います。
$ distribution=$(. /etc/os-release;echo $ID$VERSION_ID) \
&& curl -fsSL https://nvidia.github.io/libnvidia-container/gpgkey | sudo gpg --dearmor -o /usr/share/keyrings/nvidia-container-toolkit-keyring.gpg \
&& curl -s -L https://nvidia.github.io/libnvidia-container/$distribution/libnvidia-container.list | \
sed 's#deb https://#deb [signed-by=/usr/share/keyrings/nvidia-container-toolkit-keyring.gpg] https://#g' | \
sudo tee /etc/apt/sources.list.d/nvidia-container-toolkit.list
パッケージリストのアップデートを行い、nvidia-container-toolkit
をインストールします。
$ sudo apt-get update
$ sudo apt-get install -y nvidia-container-toolkit
NVIDIA Container Runtimeを認識するようにDocker daemonを構成します。
$ sudo nvidia-ctk runtime configure --runtime=docker
Docker daemonを再起動します。
$ sudo systemctl restart docker
ここでCUDA containerが正常に動作するかテストをします。
$ sudo docker run --rm --runtime=nvidia --gpus all nvidia/cuda:11.6.2-base-ubuntu20.04 nvidia-smi
下記が動作結果になります。
Unable to find image 'nvidia/cuda:11.6.2-base-ubuntu20.04' locally
11.6.2-base-ubuntu20.04: Pulling from nvidia/cuda
846c0b181fff: Pull complete
b787be75b30b: Pull complete
40a5337e592b: Pull complete
8055c4cd4ab2: Pull complete
a0c882e23131: Pull complete
Digest: sha256:9928940c6e88ed3cdee08e0ea451c082a0ebf058f258f6fbc7f6c116aeb02143
Status: Downloaded newer image for nvidia/cuda:11.6.2-base-ubuntu20.04
Sat Apr 22 20:10:11 2023
+---------------------------------------------------------------------------------------+
| NVIDIA-SMI 530.47 Driver Version: 531.68 CUDA Version: 12.1 |
|-----------------------------------------+----------------------+----------------------+
| 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 3060 Ti On | 00000000:01:00.0 On | N/A |
| 30% 31C P8 15W / 200W| 628MiB / 8192MiB | 19% Default |
| | | N/A |
+-----------------------------------------+----------------------+----------------------+
+---------------------------------------------------------------------------------------+
| Processes: |
| GPU GI CI PID Type Process name GPU Memory |
| ID ID Usage |
|=======================================================================================|
| No running processes found |
+---------------------------------------------------------------------------------------+
先ほどのnvidia-smiと同じ結果になればOKです。
GPU環境下でDockerを動かす

NVIDIA GPU CloudにあるPytorchのイメージで動作を試してみます。
とりあえず、一番新しいイメージを引っ張ってきてDockerを起動します。
$ docker pull nvcr.io/nvidia/pytorch:23.03-py3
$ docker run --name torch -it --rm --gpus all --shm-size=8g nvcr.io/nvidia/pytorch:23.03-py3
Dockerを起動させて、nvidia-smi
を試します。
# nvidia-smi
Sat Apr 22 22:15:32 2023
+---------------------------------------------------------------------------------------+
| NVIDIA-SMI 530.47 Driver Version: 531.68 CUDA Version: 12.1 |
|-----------------------------------------+----------------------+----------------------+
| 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 3060 Ti On | 00000000:01:00.0 On | N/A |
| 30% 31C P8 15W / 200W| 710MiB / 8192MiB | 21% Default |
| | | N/A |
+-----------------------------------------+----------------------+----------------------+
+---------------------------------------------------------------------------------------+
| Processes: |
| GPU GI CI PID Type Process name GPU Memory |
| ID ID Usage |
|=======================================================================================|
| No running processes found |
+---------------------------------------------------------------------------------------+
ついでにPython3を実行してPytorchからGPUが確認できるか試してみます。
# python3
Python 3.8.10 (default, Nov 14 2022, 12:59:47)
[GCC 9.4.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import torch
>>> print(torch.cuda.is_available())
True
しっかりとTrueが返ってきておりました!
さいごに

なんとかwindowsのPCでもGPU使って計算処理ができるようになりました。
最後までご覧いただきありがとうございます。
コメント