Podman(WSL2,podman-machine-default)でnvidia-container-toolkitを導入してGPUコンテナを実行する
当サイトではアフィリエイト広告を利用しています
WSL2上のPodman(Distroはpodman-default-machine)においてNvidia-container-toolkitを導入し、GPUコンテナの実行を行うことが出来ました。
てっきりWSL2だとDockerだけGPU利用可能なのかと思ってましたが、Podmanでも実行することが出来るようです。
その手順やPodman-composeなどの設定を記録しておきます。
環境
利用環境のバージョンは次のようになっています。
- OS: Windows 10
- GPU: Geforce GTX 1660
- Win10にGPUドライバはインストール済み
- Podman: 4.6.0
- WSL2 Distro: podman-machine-default (Fedora37)
以下の記事とOSなどのバージョン差がありますが、これは前回の記事がノートPC(Win11)、今回のPCがGPU搭載のWin10となっているためです。
今回のPCへのWSL2,Podman導入手順は以下の記事と同じでした。
手順の流れ
- Cuda-toolkitのインストール
- Nvidia-container-toolkitのインストール
- GPUコンテナの実行
- Podman-composeでの設定
1. Cuda-toolkitのインストール
公式手順でpodman-machine-defaultにcuda-toolkitのインストールを行います。
選択項目は以下の通りにして、表示されたコマンドでpodman-machine-defaultにインストールを実行します。
- OS: Windows
- Architecture: x86_64
- Distribution: Fedora
- Version 37
- Installer: network
$ sudo dnf install 'dnf-command(config-manager)'
$ sudo dnf config-manager --add-repo https://developer.download.nvidia.com/compute/cuda/repos/fedora37/x86_64/cuda-fedora37.repo
$ sudo dnf clean all
$ sudo dnf -y module install nvidia-driver:latest-dkms
$ sudo dnf -y install cuda
$ nvidia-smi
+---------------------------------------------------------------------------------------+
| NVIDIA-SMI 535.54.03 Driver Version: 531.79 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 GTX 1660 On | 00000000:01:00.0 On | N/A |
| 0% 48C P8 10W / 120W | 490MiB / 6144MiB | 3% Default |
| | | N/A |
+-----------------------------------------+----------------------+----------------------+
+---------------------------------------------------------------------------------------+
| Processes: |
| GPU GI CI PID Type Process name GPU Memory |
| ID ID Usage |
|=======================================================================================|
| 0 N/A N/A 23 G d N/A |
+---------------------------------------------------------------------------------------+
ゲストOSからGPUが認識できていることが分かります。
2. Nvidia-container-toolkitのインストール
公式手順に従って進めます。
$ sudo dnf clean expire-cache \
&& sudo dnf install -y nvidia-container-toolkit-base
$ nvidia-ctk --version
NVIDIA Container Toolkit CLI version 1.13.5
commit: 6b8589dcb4dead72ab64f14a5912886e6165c079
# podmanなどで利用できるようにCDIを生成
$ sudo nvidia-ctk cdi generate --output=/etc/cdi/nvidia.yaml
/etc/cdi/nvidia.yaml
に記載されたCDI情報は以下の通りでした。
$ cat /etc/cdi/nvidia.yaml
cdiVersion: 0.3.0
containerEdits:
hooks:
- args:
- nvidia-ctk
- hook
- create-symlinks
- --link
- /usr/lib/wsl/drivers/nv_dispig.inf_amd64_19f3764f95906f94/nvidia-smi::/usr/bin/nvidia-smi
hookName: createContainer
path: /usr/bin/nvidia-ctk
- args:
- nvidia-ctk
- hook
- update-ldcache
- --folder
- /usr/lib/wsl/drivers/nv_dispig.inf_amd64_19f3764f95906f94
- --folder
- /usr/lib/wsl/lib
hookName: createContainer
path: /usr/bin/nvidia-ctk
mounts:
- containerPath: /usr/lib/wsl/drivers/nv_dispig.inf_amd64_19f3764f95906f94/nvcubins.bin
hostPath: /usr/lib/wsl/drivers/nv_dispig.inf_amd64_19f3764f95906f94/nvcubins.bin
options:
- ro
- nosuid
- nodev
- bind
- containerPath: /usr/lib/wsl/drivers/nv_dispig.inf_amd64_19f3764f95906f94/nvidia-smi
hostPath: /usr/lib/wsl/drivers/nv_dispig.inf_amd64_19f3764f95906f94/nvidia-smi
options:
- ro
- nosuid
- nodev
- bind
- containerPath: /usr/lib/wsl/drivers/nv_dispig.inf_amd64_19f3764f95906f94/libcuda.so.1.1
hostPath: /usr/lib/wsl/drivers/nv_dispig.inf_amd64_19f3764f95906f94/libcuda.so.1.1
options:
- ro
- nosuid
- nodev
- bind
- containerPath: /usr/lib/wsl/drivers/nv_dispig.inf_amd64_19f3764f95906f94/libcuda_loader.so
hostPath: /usr/lib/wsl/drivers/nv_dispig.inf_amd64_19f3764f95906f94/libcuda_loader.so
options:
- ro
- nosuid
- nodev
- bind
- containerPath: /usr/lib/wsl/drivers/nv_dispig.inf_amd64_19f3764f95906f94/libnvidia-ptxjitcompiler.so.1
hostPath: /usr/lib/wsl/drivers/nv_dispig.inf_amd64_19f3764f95906f94/libnvidia-ptxjitcompiler.so.1
options:
- ro
- nosuid
- nodev
- bind
- containerPath: /usr/lib/wsl/drivers/nv_dispig.inf_amd64_19f3764f95906f94/libnvidia-ml.so.1
hostPath: /usr/lib/wsl/drivers/nv_dispig.inf_amd64_19f3764f95906f94/libnvidia-ml.so.1
options:
- ro
- nosuid
- nodev
- bind
- containerPath: /usr/lib/wsl/drivers/nv_dispig.inf_amd64_19f3764f95906f94/libnvidia-ml_loader.so
hostPath: /usr/lib/wsl/drivers/nv_dispig.inf_amd64_19f3764f95906f94/libnvidia-ml_loader.so
options:
- ro
- nosuid
- nodev
- bind
- containerPath: /usr/lib/wsl/lib/libdxcore.so
hostPath: /usr/lib/wsl/lib/libdxcore.so
options:
- ro
- nosuid
- nodev
- bind
devices:
- containerEdits:
deviceNodes:
- path: /dev/dxg
name: all
kind: nvidia.com/gpu
3. GPUコンテナの実行
上記のCDI設定ファイルがあることで、以下のようにCDI specificationを指定してGPUコンテナの実行ができます。
gpu=all
ではなくてdeviceオプションでGPU利用を指定できる模様で、Podmanでは4.1.0から有効なオプションみたいです。
$ podman run --rm --device nvidia.com/gpu=all ubuntu nvidia-smi -L
Resolved "ubuntu" as an alias (/etc/containers/registries.conf.d/000-shortnames.conf)
Trying to pull docker.io/library/ubuntu:latest...
Getting image source signatures
Copying blob 3153aa388d02 done
Copying config 5a81c4b850 done
Writing manifest to image destination
Storing signatures
GPU 0: NVIDIA GeForce GTX 1660 (UUID: GPU-xxx)
これでFedora37, WindowsどちらのPodmanでも上記コマンドが実行されてGTX1660が動作することが認識できました。
4. Podman-composeでのGPU設定
さらにpodman-composeでGPUコンテナを実行するときの設定が以下の通りです。
以下のdocker-compose.yml
を用意します。これをpodman-compose up
でGPUが認識されてることを確認できました。devices
オプションがないとnvidia-smiを実行してもGPUが認識されませんでした。
version: '3'
services:
jupyter:
image: nvcr.io/nvidia/tensorflow:23.07-tf2-py3
ports:
- "8080:8080"
volumes:
- .workspace:/workspace
devices:
- "nvidia.com/gpu=all"
command: "nvidia-smi"
まとめ
- WSL2上のPodmanでGPUコンテナを実行するための設定をまとめた
- cuda-toolkit, nvidia-container-toolkitを導入した
- podman-composeでもdeviceオプションで実行可能だった