WSL2 の Podman で CUDA する
WSL2 の Docker で CUDA する でコンテナから GPU を使う環境を作りました。今度は Podman で構成してみます。基本的な流れは Docker の場合と同じですが、Podman 特有の手順もありました。
WSL で Ubuntu をインストール
こちらは普通に PowerShell から wsl --install
コマンドを実行して Ubuntu をインストールします。今回はバージョン 24.04 を使用しました。
wsl --install -d Ubuntu-24.04
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
パッケージ情報を更新して、nvidia-container-toolkit
パッケージをインストールします。
sudo apt update
sudo apt-get install -y nvidia-container-toolkit
Ubuntu に Podman をインストール
apt コマンドを使ってインストールします。podman
と podman-compose
パッケージをインストールしました。
インストールすると podman がサービスで動作していますが、rootless で動作させるため、以下のコマンドを実行してユーザー権限で起動するように変更します。
sudo systemctl stop podman.socket
sudo systemctl disable podman.socket
systemctl --user enable podman.socket
systemctl --user start podman.socket
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
念のため確認します。以下のコマンドを実行して、GPU がリストアップされていれば大丈夫です。
nvidia-ctk 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
このように 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 の情報が出力されます。
※podman-docker
パッケージをインストールしていると、podman compose
の構文が使えますが、こちらの実行方法だと CDI が認識されないのか、GPU の記述でエラーになります。そのため、podman-compose
コマンドを使う必要がありました。
これで podman でも問題なく GPU を使った処理ができそうです。
背景
ちょっとわかりにくいのですが、手元では 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 で統一するほうへ設定してみました。