WSL2上のDockerコンテナ内でホストのGPUを使う【2024年末版】
手元の環境で試したので、ざっくりと手順を残しておく。
やりたいこと
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公式ページ
以下の記事も参考にさせていただきました。
これをインストールすることで、今回の場合はホスト、つまり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