6 minute read

WSL2 の Docker で CUDA する でコンテナから GPU を使う環境を作りました。今度は Podman で構成してみます。基本的な流れは Docker の場合と同じですが、Podman 特有の手順もありました。

WSL で Ubuntu をインストール

こちらは普通に PowerShell から wsl --install コマンドを実行して Ubuntu をインストールします。今回はバージョン 24.04 を使用しました。

wsl --install -d Ubuntu-24.04

wsl

Ubuntu に Nvidia Container Toolkit をインストール

まずは Nvidia Container Toolkit をインストールします。先にリポジトリを追加します。

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

container toolkit

パッケージ情報を更新して、nvidia-container-toolkit パッケージをインストールします。

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

install toolkit

Ubuntu に Podman をインストール

apt コマンドを使ってインストールします。podmanpodman-compose パッケージをインストールしました。

apt podman

apt podman-compose

インストールすると podman がサービスで動作していますが、rootless で動作させるため、以下のコマンドを実行してユーザー権限で起動するように変更します。

sudo systemctl stop podman.socket
sudo systemctl disable podman.socket
systemctl --user enable podman.socket
systemctl --user start podman.socket

systemctl

Container Device Interface (CDI) を設定

Docker と Podman が異なるところで、GPU をコンテナ内から使用するための設定がありました。Podman の場合は CDI というものを利用するようです。nvidia-ctk コマンドを使ってデバイス情報を書き出しておき、コンテナ作成時にデバイスを割り当てることでコンテナ内からも利用できるようになります。

デバイス情報の書き出し

Support for Container Device Interface に手順も含めて情報があります。デバイス情報を書き出すには、以下のコマンドを実行します。

sudo nvidia-ctk cdi generate --output=/etc/cdi/nvidia.yaml

cdi generate

念のため確認します。以下のコマンドを実行して、GPU がリストアップされていれば大丈夫です。

nvidia-ctk cdi list

cdi list

コンテナ起動

run

podman コマンドでコンテナを作成するときは、--device nvidia.com/gpu=all を引数にすれば GPU を使えます。引数は、CDI のリストに表示された文字列を使えばよさそうです。

podman run --rm \
--device nvidia.com/gpu=all \
--security-opt=label=disable \
ubuntu nvidia-smi -L

podman run

このように GPU 名が出力されれば OK です。

compose

compose.yml ファイルは以下のように記述します。

serivce:
    test-gpu:
        image: ubuntu
        devices:
            - "nvidia.com/gpu=all"
        security_opt:
            - "label=disable"
        command: nvidia-smi

compose.yml ファイルがあるディレクトリで podman-compose up を実行すると、GPU の情報が出力されます。

compose1 compose2

podman-docker パッケージをインストールしていると、podman compose の構文が使えますが、こちらの実行方法だと CDI が認識されないのか、GPU の記述でエラーになります。そのため、podman-compose コマンドを使う必要がありました。

これで podman でも問題なく GPU を使った処理ができそうです。

背景

environment

ちょっとわかりにくいのですが、手元では T480 を使っています。GeForce 2070 を乗せたデスクトップは別の部屋にあり、リモート接続で使用しています。Windows を使う場合は RDP で、Ubuntu を使うときは SSH で接続しています。Ubuntu に接続するときは、その上のコンテナを使って何かやる場合が多いので、VScode のリモート接続 (Remote - SSH) 拡張を使って接続することが多いです。また、T480 でもコンテナを使っていて、ブログの更新用の Jekyll 環境など、軽めの処理はこちらでやっていました。

これらの操作には、どうせコードやテキストを書くので、VScode から接続していました。ただ、デスクトップと T480 は環境を作ったタイミングが違っていて、コンテナ管理が Docker と Podman で異なるツールを使う状態になっていました。

この場合、VScode の Dev Containers 拡張で不便なことがあり、「開発コンテナ」一覧が表示できない場合があります。これは設定の Dev Containers: Docker Path 設定によるものなのですが、この設定の初期値は docker になっています。この場合、Docker を使うデスクトップのコンテナは表示できるのですが、Podman を使う T480 のコンテナは表示できません。 Dev Containers: Docker Path 設定を podman にすると、T480 のコンテナは表示できてデスクトップのコンテナが表示できなくなります。

そして、設定画面にもあるとおり、この Dev Containers: Docker Path 設定はワークスペースごとではなく、すべてのプロファイルで共通の設定らしく、Docker か Podman かどちらかを選ばないといけない状態でした。

設定を一か所変更すればいいだけ、ですが、やはり面倒なのでどちらかに寄せたいと思っていましたが、Docker を rootless で動かそうとするとそこそこ面倒だった記憶のほうが強いので、今回は Podman で統一するほうへ設定してみました。

更新日時: