WSL2のUbuntuにおけるDocker Engineのインストール方法と、DockerイメージによるGPU版PyTorch環境構築方法

概要

WSL2のUbuntuでDocker Engineをインストールする方法と、そのDocker環境でGPU版のPyTorchのイメージを実行する方法の紹介です。Docker Desktopを利用せずWSL2内でDocker Engineを使用する例はいくつかあります(参考文献参照)が、最近のMicrosoft Store版WSLのアップデート等の状況も踏まえた手順を紹介します。

検証環境

ホストPC OS Windows 11 Home 22H2
OSビルド 22621.963
CPU Intel Core i7-12700
GPU GeForce RTX3080Ti
GPUドライバ 527.56
CUDA 12.0
WSL WSLバージョン 1.0.3.0
ディストリビューション Ubuntu 22.04
Docker Engine 20.10.22
NVIDIA Container Toolkit 1.11.0
PyTorch NGC Container nvcr.io/nvidia/pytorch:22.12-py3

動作の確認は主に上記のWindows 11のPCで行いましたが、WSLやDockerのインストールについてはWindows 10のPCでも動作を確認しました。

Microsoft Store版WSLのインストール

後述しますが、WSL内でsystemdを使用するため、Microsoft Store版のWSLをインストールします。

当初、Microsoft Store版はWindows 11のみのサポートでしたが、Windows 10もサポートされるようになりました。下記の記事の時点ではWindows 10のプレビュー版で可能とのでしたが、最新のWindows Updateを適用することで正式版でも利用可能です。

WSLのインストールについては、下記ページの手順に従います。

下記のコマンドによりWSLとUbuntuがインストールされます。この際、Windowsのバージョンが対応している場合はMicrosoft Store版のWSLが自動的にインストールされるので、自分でMicrosoft Storeにアクセスしてインストールする必要はありません。

wsl --install -d Ubuntu

インボックス版のWSL(OSの機能として提供されるWSL)が有効になっている場合は下記コマンドを実行することでMicrosoft Store版にアップデートできます。

wsl --update

以降、WSL2のUbuntu(22.04)を想定した手順を示します。

Docker Engineのインストールおよび諸設定

Docker Engineのインストール

Docker Engineのインストールについては一般的なUbuntuと同様で、下記ページの手順でインストール可能です。

下記の一連のコマンドをWSLのUbuntuで実行します。

1. 依存パッケージのインストール
sudo apt-get update
sudo apt-get install \
    ca-certificates \
    curl \
    gnupg \
    lsb-release
2. GPG Keyの追加
sudo mkdir -p /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
3. リポジトリの登録
echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
  $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
4. Docker関連パッケージのインストール
sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-compose-plugin

以上によりDocker Engineのインストールは完了です。

ルート権限なしでdockerコマンドを利用する設定を加える

このままでは、docker コマンドの実行にはルート権限が必要であり、毎回 sudo docker ... とする必要があります。ここでは、ルート権限なしで docker コマンドを実行できるように、下記ページの設定を加えます。

docker グループを作成します。(私の環境ではDocker Engineのインストールにより既に作成されていました。)

sudo groupadd docker

ユーザーを docker グループに追加します。

sudo usermod -aG docker $USER

設定を反映します。

newgrp docker

以上によりルート権限なしで docker コマンドを実行できるようになります。

WSLのsystemdを有効化する

WSLはしばらくsystemdをサポートしていなかったため、Dockerデーモンの起動は service コマンドから行う必要がありました。しかし、下記の記事の通り2022年9月にMicrosoft Store版のWSLでsystemdがサポートされるようになり、Dockerデーモンの管理がスムーズにできるようになりました。

デフォルトではsystemdは無効化されていますが、下記ページに記載の通り /etc/wsl.conf ファイルを作成することで有効化できます。

ここでは、vimを使って /etc/wsl.conf ファイルを作成します。

sudo vi /etc/wsl.conf

以下を書き込み保存します。

[boot]
systemd=true

設定後、WSLを再起動することでsystemdおよびDockerデーモンが有効化され、WSLのUbuntu内で docker コマンドが利用可能になります。

ちなみに、デーモンはUbuntuのシェルを起動した状態で有効です。シェルを閉じると一定時間でWSL自体がシャットダウンします。

DockerによるGPU版PyTorch環境構築

PyTorch NGC Container

PyTorchおよびGPUが利用可能なDockerイメージとして、PyTorch NGC Containerを利用します。

上記ページに記載のある通り、イメージの実行には以下が必要です。

Docker Engineは既にインストールされたので、NVIDIA GPU DriversとNVIDIA Container Toolkitのインストールを行います。

NVIDIA GPU Driversのインストール

NVIDIA GPU Drivers(GPUドライバ)をホストのWindows上でインストールします。PCやグラフィックボードの導入時にGPUドライバはインストールされていることが多いと思いますが、下記ページから最新のGPUドライバに更新しておきます。

また、お好みでGeForce Experienceをインストールしておくと、GPUドライバの更新確認やアップデートが簡単に行えるようになります。

GPUドライバのインストール後、ホストのWindowsやWSLのUbuntuから nvidia-smi コマンドでGPUが参照できていることが確認できます。

nvidia-smi

NVIDIA Container Toolkitのインストール

コンテナ内でGPUを利用するため、WSLのUbuntu上でNVIDIA Container Toolkitをインストールします。インストール手順は下記ページに記載の通りです。

https://docs.nvidia.com/datacenter/cloud-native/container-toolkit/install-guide.html

リポジトリと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-docker2 をインストールします。

sudo apt-get update
sudo apt-get install -y nvidia-docker2

Dockerデーモンを再起動します。

sudo systemctl restart docker

以上でコンテナ内でGPUが利用できるようになりました。

コンテナの起動

実際にコンテナを起動してGPUが利用できるか確認します。

docker compose を利用してコンテナを起動するため、compose.yaml ファイルを作成します。

vi compose.yaml

以下を書き込み保存します。

services:
  env:
    image: nvcr.io/nvidia/pytorch:22.12-py3
    stdin_open: true
    tty: true
    deploy:
      resources:
        reservations:
          devices:
            - capabilities: [gpu]

下記コマンドでコンテナが起動します。初回は8GB程度のイメージをプルする必要があるため、少し時間がかかります。

docker compose up -d

コンテナ内のPythonインタラクティブモードで起動します。

docker compose exec env python

torch.cuda.is_available() を呼び出し、CUDAが利用可能かを確認します。

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 が返されており、GPUを認識していることが確認できました。nvidia-smi コマンド等でもコンテナ内からGPUの情報が参照可能であることが確認できます。

docker compose exec env nvidia-smi

以上でGPU版のPyTorchの環境構築が完了しました。最近のWSLのアップデートに伴ってOSの制限がなくなったり、細かなハックが不要になるなど、WSLでの環境構築がより快適になってきた印象です。

参考文献

WSLに関するMicrosoft公式のアナウンス

WSL2へのDocker Engineのインストールに関する記事