🐧

WSL2上のDockerコンテナ内でホストのGPUを使う【2024年末版】

2025/01/01に公開

手元の環境で試したので、ざっくりと手順を残しておく。

やりたいこと

Windows11マシンのWSL2環境内でDockerコンテナを起動し、
そのコンテナ内からWindows11マシンのGPUを使用できるようにします。

今回想定するユースケースは、

  • 私用のGPU付きWindowsPCで機械学習用の独立した環境を用意したい

としました。他にも、
特定CUDAバージョンの環境をホストを汚さず用意したい、などもありそうです。

実行環境

今回は以下の環境で実施しました。

  • ホストOS: Windows11 Pro
  • WSL2ゲストOS: Ubuntu24.04.1 LTS
  • GPU: NVIDIA GeForce RTX 4070 SUPER
  • NVIDIAドライバのバージョン: 560.94

おおまかな手順

以下の流れで実施します。

  • WSL2のインストール
    • 手順参考記事の紹介にとどめ、詳細は割愛
  • Dockerインストール
  • NVIDIA Container Toolkit のインストール
    • NVIDIAのGPUをDockerコンテナから使うための、NVIDIDA公式のパッケージ
  • 動作確認
    • pytorchの公式イメージを使い、コンテナ内のpytorchがGPUを認識できるか確認

詳細手順

以下、詳細手順を記載していきます。

WSL2のインストール

まずWSL2をWindowsのホストPC内にインストールします。
こちらはNVIDIAの公式Documentにも手順記載があるため、そちらに則り実施しました。

他には以下の記事が参考になりました。

今回はUbuntu24.04をゲストOSとしてインストールします。

WSL2環境内(かつDockerコンテナ外)でのGPUの利用について

参考:WSL2環境内(かつDockerコンテナ外)でのGPUの利用について

今回WSL上のDockerコンテナ内からGPUを利用する想定ですが、
コンテナ内からの利用の話の前に、そもそもWSLのゲストOS内でGPUを利用するには?
について、自分でも気になったので少し調べました。

結論としては、最近のWSL2およびNVIDIAドライバの対応により、
WSL2をGPU付きPCにインストールするだけで、ゲストOSからホストのGPUをすぐに使えるようになっています。
少し前はWSL内でNVIDIAドライバをインストールしたり、CUDAをインストールしたりが必要で、
そこでミスって環境作り直し...とかしていた記憶があったのですが、ここ最近はとても簡単になったようです。(いつ頃からだろう?)

このあたりはMicrosoftやNVIDIAの公式ドキュメントを見ると多少参考になりそうです。

以下、私のWSL2環境のUbuntu24.04インストール後の状態です。ドライバやCUDAパッケージのインストール作業は行っておらず、パッケージとしても明示的にUbuntu内にインストールされてはいませんが、
nvidia-smiコマンドを実行したところホストのGPUを認識できています。

ということで、WSLとGPUの連携について今回は特に気にせず、次の手順に進みます。

Dockerインストール

WSL2上UbuntuでDockerコンテナを利用するために、Dockerをインストールします。

こちらも現在、Docker公式ドキュメントの手順に従えばすんなり入りました。

以下、公式の手順に沿ってコマンドを実行していきます。

まずは、Dockerのaptリポジトリを準備してDockerのパッケージを apt-get install できるようにためのコマンドを実行します。

sudo apt-get update
sudo apt-get install ca-certificates curl
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

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

続いて、Dockerのインストールを行います

sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

インストールが完了しました。

sudoなしでDockerコマンド実行

参考:sudoなしでDockerコマンド実行

Docker利用者にはもはやお馴染みと思いますが、現状のままでは各Dockerコマンドの実行にsudoの付与が必要となります。

個人用WSL環境なので、面倒なためsudoなしで実行できるようにします。以下の手順を実施します。

docker group が作られていることを確認

cat /etc/group | grep docker

docker グループにユーザを追加

sudo gpasswd -a $USER docker

dockerサービス再起動

sudo systemctl restart docker

上記コマンドを一通り実行したらいったんUbuntuを終了して再起動します。

再起動後、以下のコマンドを実行すると、自ユーザがdockerグループに追加されています。

cat /etc/group | grep docker

これでsudoなしで、dockerコマンドを実行できるようになりました。

Docker動作確認

Dockerをインストールできたら、実際になにかしらのDockerイメージを使用してコンテナを実行してみます。
以下コマンドで、Docker公式のログ出力をするためだけの動作確認用のイメージをダウンロードし実行することができます。

docker run hello-world

docker images コマンドを実行すると、今ダウンロードしたDockerイメージがイメージ一覧追加されていることを確認できます。

ここまでで、Dockerのインストールと動作確認は完了です。

NVIDIA Container Toolkit のインストール

続いて、NVIDIA Container Toolkit をインストールします。

NVIDIA Container Toolkit とは

Dockerコンテナ内からコンテナをホストしているマシンのGPUを認識し、Dockerコンテナ内のアプリケーションがGPUを使えるようにするためのパッケージです。NVIDIA公式がリリースしています。

NVIDIA公式ページ

以下の記事も参考にさせていただきました。
https://qiita.com/tkusumi/items/f275f0737fb5b261a868

これをインストールすることで、今回の場合はホスト、つまりWSL2(Ubuntu)が認識しているWindowsマシンのGPUを使えるようになります。

以下インストール手順になります。こちらも公式の手順に沿ってコマンドを実行します。

レポジトリを準備します。

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/stable/deb/nvidia-container-toolkit.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

sed -i -e '/experimental/ s/^#//g' /etc/apt/sources.list.d/nvidia-container-toolkit.list

sudo apt-get update

nvidia-container-toolkit をインストールします。

sudo apt-get install -y nvidia-container-toolkit

DockerがNVIDIA Containerのランタイムを認識するように設定します

sudo nvidia-ctk runtime configure --runtime=docker

Dockerサービスを再起動します

sudo systemctl restart docker

ここまででインストール完了です。

既存のDockerイメージをダウンロードし、実行してみます。

docker run --rm --gpus all ubuntu nvidia-smi

上記コマンドでは以下のように、コンテナが認識できているGPUの情報をコンテナ内で表示します。
コンテナ内でWindowsマシンのGPUを認識できています。

動作確認

先ほどまでの手順で、やりたかった『Windows11マシンのWSL2環境内でDockerコンテナを起動し、
そのコンテナ内からWindows11マシンのGPUを使用できるようにする』は達成できました。

が、せっかくなのでpytorchをインストールしたコンテナを作り、PytorchがGPUを認識できるかどうかの確認までやってみたいと思います。

以下を実行し、pytorch公式イメージをダウンロード・実行します。

docker run pytorch/pytorch:2.0.1-cuda11.7-cudnn8-devel

イメージをダウンロードできたら、以下のコマンドを実行してコンテナ環境に入ってみます

docker run -it --rm pytorch/pytorch:2.0.1-cuda11.7-cudnn8-devel

GPUの確認をしてみます。

nvidia-smi

上記のコンテナ立ち上げコマンドのままでは、以下のようにコンテナ内からGPUを認識できません。

NVIDIAコンテナランタイムによりGPUを認識するようにDockerコンテナを立ち上げるには、
--gpus オプションでGPUを指定する必要があります。

以下の用にコマンドを修正してコンテナを立ち上げます。

docker run -it --rm --gpus all pytorch/pytorch:2.0.1-cuda11.7-cudnn8-devel

今度はGPUを認識できました。

最後に、立ち上げたpytorchのコンテナで、pytorchからGPUが利用できるかを確認します。
今回は簡潔に、torchパッケージ内の、CUDAが利用できるかを表示するメソッドを使います。

コンテナでpythonを立ち上げ、以下のように処理を実行しました。
無事、pytorchがGPUを認識できていることを確認できました。

root@0fe3359807a8:/workspace# python
Python 3.10.11 (main, Apr 20 2023, 19:02:41) [GCC 11.2.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import torch
>>> print(torch.__version__)
2.0.1
>>> print(torch.cuda.is_available())
True
>>>

まとめ・あとがき

  • GPU付きWindows11マシンで
  • WSL2環境(Ubuntu24.04)を用意し
  • WSL2上でDockerコンテナを起動し
  • コンテナ内からWndows11マシンのGPUを利用する

ような手順を紹介しました。

特に今のWSLやNVIDIAコンテナは非常に便利になっていて、厄介なドライバ等のインストールや環境設定はほぼなく、公式手順に則ってパッケージのインストールを行うだけで実現できました。

記載内容について、補足や間違いの指摘などは歓迎していますので、是非リアクションいただければと思います。


// 今回のpytorch利用は申し訳程度だったので、機会があれば学習や推論の記事も書きたい
// 記事書いてたら2024年終わってた

Discussion