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導入手順は以下の記事と同じでした。

手順の流れ

  1. Cuda-toolkitのインストール
  2. Nvidia-container-toolkitのインストール
  3. GPUコンテナの実行
  4. 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オプションで実行可能だった