概要
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での環境構築がより快適になってきた印象です。