M4 Mac MiniでコンテナからGPUを利用する環境を整える
はじめに
この記事は、M4 Mac MiniでローカルAIアプリケーションの開発をしたいが、環境を汚したくないのでコンテナからGPUを利用する環境を整備しようという記事です。
コンテナ環境の整備
環境整備としては、Podmanが利用できることが前提です。Dockerの活用についても検討できますが、GPU-コンテナ間の接続が困難です。そこで今回は、
$ podman -v
podman version 5.3.1
となっています。
※ 2024/12/31現在 Docker Desktopでは、WSL2経由のみでしかGPUを利用できません。Docker VMMでは、libkrun
が利用されていると噂されており、DockerからGPUが利用できるのではないかと噂されています。
Podmanの初期セットアップ
Podmanは通常podman machine init
で環境の初期セットアップをする必要があります。この時、Mac環境では自動的にPodman machine providerがapplehv
でセットアップされます(Podman v5.0以降)が、GPUを利用するために、libkrun
でセットアップをする必要があります。
まず、libkrunを利用するための環境開発ツールをインストールします。
$ brew tap slp/krunkit
$ brew install krunkit
次に、Podman machine providerをlibkrunを利用するように設定を変更します。
$ vim ~/.config/containers/containers.conf
[machine]
provider="libkrun"
※ ~/.config/containersがない場合 $ mkdir ~/.config/containers で作成
Podmanの環境の初期セットアップをします。
$ podman machine init --now
Looking up Podman Machine image at quay.io/podman/machine-os:5.1 to create VM
Extracting compressed file: podman-machine-default-arm64: done
Machine init complete
Starting machine "podman-machine-default"
This machine is currently configured in rootless mode. If your containers
require root permissions (e.g. ports < 1024), or if you run into compatibility
issues with non-podman clients, you can switch using the following command:
podman machine set --rootful
API forwarding listening on: /var/folders/ml/3yfmdg5n4qn0zq05f7sl34z40000gn/T/podman/podman-machine-default-api.sock
The system helper service is not installed; the default Docker API socket
address can't be used by podman. If you would like to install it, run the following commands:
sudo /opt/homebrew/Cellar/podman/5.1.1/bin/podman-mac-helper install
podman machine stop; podman machine start
You can still connect Docker API clients by setting DOCKER_HOST using the
following command in your terminal session:
export DOCKER_HOST='unix:///var/folders/ml/3yfmdg5n4qn0zq05f7sl34z40000gn/T/podman/podman-machine-default-api.sock'
Machine "podman-machine-default" started successfully
となれば、初期セットアップが完了です。
Podman machine環境の確認
実際に、providerがlibkrunとなっているのかとコンテナ上からGPUが利用可能な状態であるかを確認します。
VM TYPEが、libkrunであることを確認します。
$ podman machine ls
NAME VM TYPE CREATED LAST UP CPUS MEMORY DISK SIZE
podman-machine-default* libkrun 26 hours ago Currently running 5 2GiB 100GiB
次に、このマシンからGPUが認識されているのかを確認します。
$ podman machine ssh ls -l /dev/dri
total 0
drwxr-xr-x. 2 root root 80 Dec 31 22:39 by-path
crw-rw----. 1 root video 226, 0 Dec 31 22:39 card0
crw-rw-rw-. 1 root render 226, 128 Dec 31 22:39 renderD128
このように、/deb/driが(video、render)が認識されていれば、コンテナからホスト側の/dev/driが認識されている状態です。
ここまででGPUが利用できる環境になっていますが、念の為、コンテナ内のアプリケーションからも認識されることを確認します。今回はvulkaninfo
を用いて確認します。
$ podman run --rm -it --device /dev/dri --name gpu-info quay.io/slopezpa/fedora-vgpu vulkaninfo | grep "GPU"
GPU id = 0 (Virtio-GPU Venus (Apple M4))
GPU id = 1 (llvmpipe (LLVM 17.0.6, 128 bits))
GPU0:
deviceType = PHYSICAL_DEVICE_TYPE_INTEGRATED_GPU
deviceName = Virtio-GPU Venus (Apple M4)
このようにVirtio-GPU Venus (Apple M4)
が確認できましたので、コンテナ上からGPUを使う環境が整いました。
おわりに
次回は、実際にコンテナ上でmodelを動かしてみようと思います。
Discussion