🐟

M4 Mac MiniでコンテナからGPUを利用する環境を整える

2025/01/02に公開

はじめに

この記事は、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