podmanでCUDAをコンテナ実行するためのホストマシンを0からセットアップする。筆者はCI/CD環境を整えるために物理サーバーマシンを用意して作業した。 これで ga_runner でGitHub ActionsでCUDAがお手軽に使えるようになる(はず。今後確認したら追記)
ホスト環境は: Intel(R) Core(TM) i7-10700T CPU, 64GB mem, NVIDIA GeForce RTX 4060 Ti 16GB
- Ubuntu 24.04.2では、インストール時に3rd party driversを有効化してしまうと、NVIDIA driver 550がインストールされる。これは非常に不安定であり、クリーンインストール直後であってもWaylandがクラッシュして復帰が難しい問題がある(将来的に改善される可能性はある)。
- これを回避しようと Ubuntu 22.04系列を使うと、podmanが古くて後述のCDIが使えないので注意。
- そこで、24.04.2はsafe graphics modeでインストールを行い、3rd party driversのチェックを外してインストールする。インストール後に
apt update
,apt upgrade
でパッケージを更新して、それからAdditional drivers
アプリケーションで、NVIDIA driverの570以降を手動でインストールすると回避できる。 - NVIDIA driverは、oss driverとproprietary driverがあるが、properietary driverしか試していないので、oss driverでもCUDAやCDIが動くかどうかは不明。
CUDAをホスト環境で使用可能にする。
- 基本的にこのドキュメントの通りやる。最後のステップのドライバ更新は不要: https://developer.nvidia.com/cuda-downloads
- 以下のコマンドでGPUが見えることを確認。もしanaconda環境などで実際のCUDAの実行確認が出来るならなお良い:
$ nvidia-smi -L GPU 0: NVIDIA GeForce RTX 4060 Ti (UUID: GPU-15e793d7-7365-2265-986b-3edf727993ad)
ここまでで、ホスト側のCUDAは使用可能になった。コンテナを使わずにanacondaとかで直接CUDAする場合は、これ以降の作業は不要。
これを入れることで、dockerやCDI対応のコンテナエンジンで、コンテナ内部からCUDAが使えるようになる。
- 基本的にこのドキュメントの通りやる。dockerはインストールしないので、ここではdockerによる確認は行わない: https://docs.nvidia.com/datacenter/cloud-native/container-toolkit/latest/install-guide.html
- toolkitインストール後はCDIの有効化ステップを実行する。手順はここ: https://docs.nvidia.com/datacenter/cloud-native/container-toolkit/latest/cdi-support.html
- CDIが有効化されていれば、podmanのコンテナ内からCUDAが使えるはず。以下のコマンドで確認するようにドキュメントには書かれているが、これは
nvidia-smi
コマンドなので、GPUの存在が確認出来るだけ(CUDAで計算をしていない)であることに注意:$ podman run --rm --device nvidia.com/gpu=all --security-opt=label=disable ubuntu nvidia-smi -L Resolved "ubuntu" as an alias (/etc/containers/registries.conf.d/shortnames.conf) Trying to pull docker.io/library/ubuntu:latest... Getting image source signatures Copying blob 2726e237d1a3 done | Copying config 602eb6fb31 done | Writing manifest to image destination GPU 0: NVIDIA GeForce RTX 4060 Ti (UUID: GPU-15e793d7-7365-2265-986b-3edf727993ad)
- 実際にCUDAを使う例として、YOLO11でサンプル画像の学習を実行する例。これはYOLO11のドキュメントに書かれているdockerを使う例をpodmanに置き換えている。podmanに与える引数はCDI準拠となるためdockerとは多少異なる。その他に共有メモリのエラーが発生するので広げるオプション
--shm-size
も追加している:$ t=docker.io/ultralytics/ultralytics:8.3.104 $ podman run --rm -it --shm-size=256m --device nvidia.com/gpu=all --security-opt=label=disable $t root@99a089c7bf03:/ultralytics# yolo train data=coco8.yaml model=yolo11n.pt epochs=10 lr0=0.01 : Epoch GPU_mem box_loss cls_loss dfl_loss Instances Size 10/10 0.83G 0.9703 1.79 1.241 13 640: 100%|██████████| 1/1 [00:00<00:00, 14.01it/s] Class Images Instances Box(P R mAP50 mAP50-95): 100%|██████████| 1/1 [00:00<00:00, 34.5 all 4 17 0.649 0.85 0.863 0.628 10 epochs completed in 0.002 hours. Optimizer stripped from /ultralytics/runs/detect/train/weights/last.pt, 5.5MB Optimizer stripped from /ultralytics/runs/detect/train/weights/best.pt, 5.5MB Validating /ultralytics/runs/detect/train/weights/best.pt... Ultralytics 8.3.104 🚀 Python-3.11.11 torch-2.6.0+cu126 CUDA:0 (NVIDIA GeForce RTX 4060 Ti, 15950MiB) YOLO11n summary (fused): 100 layers, 2,616,248 parameters, 0 gradients, 6.5 GFLOPs Class Images Instances Box(P R mAP50 mAP50-95): 100%|██████████| 1/1 [00:00<00:00, 45.6 all 4 17 0.625 0.85 0.888 0.655 person 3 10 0.611 0.6 0.603 0.287 dog 1 1 0.553 1 0.995 0.796 horse 1 2 0.731 1 0.995 0.674 elephant 1 2 0.386 0.5 0.745 0.283 umbrella 1 1 0.589 1 0.995 0.995 potted plant 1 1 0.878 1 0.995 0.895 Speed: 0.3ms preprocess, 1.8ms inference, 0.0ms loss, 0.6ms postprocess per image Results saved to /ultralytics/runs/detect/train