機械学習のための GPU 関連ライブラリの設定 (podman 利用)

機械学習のための GPU 関連ライブラリの設定 (venv 利用) が設定されているものとする.

docker は root 権限が実質的に必要なので,podman を使うことにする.

podman, NVIDIA Container Toolkit のインストール

$ sudo apt update
$ sudo apt install podman nvidia-container-toolkit

CDI の設定

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

確認

$ cat /etc/cdi/nvidia.yaml | grep "name:"

subuid の作成. ユーザ admin01 の場合の例.

# usermod --add-subuids 100000-165535 admin01

コンテナイメージの置き場をホームディレクトリ (NFS マウント) からローカルディスクへ変更する. NFS 上に保管するようにすると上手く動かない.

# vi /etc/containers/storage.conf

  [storage]
  driver = "overlay"
  graphroot = "/pool1/containers/storage"
  rootless_storage_path = "/pool1/containers/storage/$USER"

  [storage.options.overlay]
  mount_program = "/usr/bin/fuse-overlayfs"
  force_mask = "700"

# vi /etc/containers/registries.conf

  unqualified-search-registries = ["docker.io"]

設定ファイルの指定

# vi /etc/profile.d/podman_strage.sh

 if [ "\$USER" != "root" ]; then
     # 設定ファイルのパスも固定
     export CONTAINERS_STORAGE_CONF=/etc/containers/storage.conf
 fi

ローカルディスクの設定

# mkdir -p /pool1/containers/storage
# chmod 1777 /pool1/containers/storage

読み込まれる設定ファイルと,コンテナを保管する場所が正しくなっているかの確認.

$ podman info --format '{{.Store.ConfigFile}}'
 /etc/containers/storage.conf

$ podman info --format '{{.Store.GraphRoot}}'
 /pool1/containers/storage/admin01

テスト

インストールされていないコンテナ (以下の例では nvidia/cuda:12.1.1-runtime-ubuntu22.04) を指定すると, 自動的にコンテナイメージがダウンロードされる.

$ podman run --rm --device nvidia.com/gpu=all --security-opt label=disable \
  nvidia/cuda:12.1.1-runtime-ubuntu22.04   nvidia-smi -L
  ....
  GPU 0: NVIDIA A100 80GB PCIe (UUID: GPU-f93bcfaf-8668-bf96-32af-d366fd13c746)
  GPU 1: NVIDIA A100 80GB PCIe (UUID: GPU-e4a7c3aa-06b3-fc2a-acd2-fea39b81b653)
  GPU 2: NVIDIA A100 80GB PCIe (UUID: GPU-6e8145c7-ae6c-040e-d958-2a1336caf70f)

NVIDIA Container Toolkit のバージョン情報は以下で確認できる

$ nvidia-container-cli info

  NVRM version:   565.57.01
  CUDA version:   12.7

  Device Index:   0
  Device Minor:   0
  Model:          NVIDIA A100 80GB PCIe
  Brand:          Nvidia
  GPU UUID:       GPU-f93bcfaf-8668-bf96-32af-d366fd13c746
  Bus Location:   00000000:3b:00.0
  Architecture:   8.0

  ...(以下, 略)...

docker version のバージョン情報は以下で確認できる

$ podman version

現時点でインストールされている docker イメージは以下のコマンドで取得できる.

$ podman images

  # docker images
  REPOSITORY    TAG                          IMAGE ID       CREATED         SIZE
  nvidia/cuda   12.1.1-runtime-ubuntu22.04   0495908f9381   13 months ago   2.24GB

利用する GPU を指定する.

docker の --gpus オプションで GPU 番号を指定する.

adm01@ncsv2:~$ podman run --device nvidia.com/gpu=0 --rm nvidia/cuda:12.1.1-runtime-ubuntu22.04 nvidia-smi -L

  GPU 0: NVIDIA A100 80GB PCIe (UUID: GPU-f93bcfaf-8668-bf96-32af-d366fd13c746)

adm01@ncsv2:~$ podman run --device nvidia.com/gpu=2 --rm nvidia/cuda:12.1.1-runtime-ubuntu22.04 nvidia-smi -L

  GPU 0: NVIDIA A100 80GB PCIe (UUID: GPU-e4a7c3aa-06b3-fc2a-acd2-fea39b81b653)

adm01@ncsv2:~$ podman run --device nvidia.com/gpu=3 --rm nvidia/cuda:12.1.1-runtime-ubuntu22.04 nvidia-smi -L  

  GPU 0: NVIDIA A100 80GB PCIe (UUID: GPU-6e8145c7-ae6c-040e-d958-2a1336caf70f)