はじめに
前回 (NVIDIA パススルー) の続きです!また、Immich の記事でもあげましたがこちらは AMD GPU をコンテナにパススルーする、というもののみをピックアップした記事にしようと思います!
自宅サーバーにしているミニ PC に高性能な内蔵 GPU (Radeon 780M) を搭載しているので、これを Proxmox 上の LXC コンテナにパススルーしてみました。
この記事では、ホスト側の設定からコンテナ内での ROCm 認識まで、一連の流れをメモのような形で紹介します。
目次
-
ホスト側の準備
1-1. IOMMU とカーネルパラメータの設定
1-2. ROCm / ドライバーのインストール
1-3. デバイスファイルの権限設定 (udev) -
LXC コンテナの設定 (Device Passthrough)
2-1. コンテナの作成
2-2. パススルー設定 (GUI) -
コンテナ内の設定
3-1. ROCm のインストール (DKMSなし)
3-2. 環境変数の設定 - 動作確認
- おわり
環境
- OS: Proxmox VE 8.x
- GPU: AMD Radeon 780M (Ryzen 7 255)
- Container: Ubuntu 24.04 LTS (LXC, Unprivileged)
1. ホスト側の準備
LXC コンテナはホストのカーネルを共有するため、ホスト側で GPU が正しく認識され、適切なドライバがロードされている必要がある。
1.1 IOMMU とカーネルパラメータの設定
まずは BIOS/UEFI 設定で IOMMU が有効になっていることを確認。
その上で、Proxmox (ホスト) のブートローダー (GRUB) 設定を変更して、IOMMU をパススルーモードで有効化する。
# Proxmoxホストに ssh 接続
ssh root@<ホストのIPアドレス>
# 1. GRUB 設定ファイルを編集
nano /etc/default/grub
GRUB_CMDLINE_LINUX_DEFAULT の行を以下のように変更。quiet の後ろに追記する。
GRUB_CMDLINE_LINUX_DEFAULT="quiet iommu=pt amd_iommu=on"
編集したら保存して、設定を反映させる。
# 2. GRUB 設定の反映と再起動
update-grub
reboot
1.2 ROCm / ドライバーのインストール
続いて必要なドライバーをインストールする。
コンテナ内で ROCm を使用する場合、ホスト側にも必要なカーネルモジュールを入れる必要があるため、最新の ROCm をインストールする。
ROCm のバージョンは定期的に更新されるため、最新バージョンは AMD 公式リポジトリ で確認すること。
# 1. 必要なパッケージのインストール
apt update
apt install build-essential pve-headers-$(uname -r)
# 2. AMD GPU モジュール設定(パフォーマンス最適化)
cat > /etc/modprobe.d/amdgpu.conf << 'EOF'
options amdgpu ppfeaturemask=0xffffffff
options amdgpu dc=1
EOF
# 3. ROCmリポジトリの追加とインストール
wget https://repo.radeon.com/amdgpu-install/7.1.1/ubuntu/noble/amdgpu-install_7.1.1.70101-1_all.deb
apt install ./amdgpu-install_7.1.1.70101-1_all.deb
apt update
# 4. ドライバーのインストール (DKMS含む)
apt install amdgpu-dkms
# 5. initramfsの更新と再起動
update-initramfs -u -k all
reboot
LXC の場合、ホスト側で amdgpu-dkms を入れてカーネルモジュールを有効にしておく必要がある。
再起動後、GPU が正しく認識されているか確認する。
root@pve-server:~# lspci -nn | grep VGA
c8:00.0 VGA compatible controller [0300]: Advanced Micro Devices, Inc. [AMD/ATI] Phoenix3 [1002:1900] (rev ba)
# ドライバーが読み込まれているか確認
root@pve-server:~# lsmod | grep amdgpu
amdgpu 13299712 0
amdxcp 12288 1 amdgpu
i2c_algo_bit 16384 1 amdgpu
drm_ttm_helper 12288 1 amdgpu
ttm 98304 2 amdgpu,drm_ttm_helper
drm_exec 12288 1 amdgpu
gpu_sched 61440 1 amdgpu
drm_suballoc_helper 12288 1 amdgpu
drm_buddy 20480 1 amdgpu
drm_display_helper 225280 1 amdgpu
video 77824 2 amdgpu,nvidia_modeset
1.3 デバイスファイルの権限設定 (udev)
ここが AMD GPU パススルーの重要なポイント。
デフォルトでは /dev/dri/renderD128 などのデバイスファイルは root:render 権限になっており、非特権コンテナからアクセスできないことがある。
そこで、udev ルールを作成して、デバイスファイルのパーミッションを 0666 (全ユーザー読み書き可) に設定してしまう。
# 1. udevルールファイルの作成
cat > /etc/udev/rules.d/99-gpu-chmod666.rules << 'EOF'
# AMD GPU デバイスの権限設定
KERNEL=="renderD128", MODE="0666"
KERNEL=="kfd", MODE="0666", GROUP="render"
KERNEL=="card0", MODE="0666"
EOF
# 2. ルールの適用
udevadm control --reload-rules && udevadm trigger
確認してみる。
root@pve-server:~# ls -la /dev/dri/
total 0
drwxr-xr-x 3 root root 140 Dec 15 01:59 .
drwxr-xr-x 20 root root 5720 Dec 15 01:59 ..
drwxr-xr-x 2 root root 120 Dec 15 01:59 by-path
crw-rw-rw- 1 root video 226, 0 Dec 15 01:55 card0
crw-rw---- 1 root video 226, 1 Dec 15 01:59 card1
crw-rw-rw- 1 root render 226, 128 Dec 15 01:55 renderD128
crw-rw---- 1 root render 226, 129 Dec 15 01:59 renderD129
root@pve-server:~# ls -la /dev/kfd
crw-rw-rw- 1 root render 235, 0 Dec 15 01:55 /dev/kfd
rw-rw-rw- (0666) になっていれば OK。
crw-rw-rw- 1 root video 226, 0 ... /dev/dri/card0
crw-rw-rw- 1 root render 226, 128 ... /dev/dri/renderD128
crw-rw-rw- 1 root render 511, 0 ... /dev/kfd
2. LXC コンテナの設定 (Device Passthrough)
2.1 コンテナの作成
通常通り、非特権コンテナ (Unprivileged Container) を作成する。
テンプレートは ubuntu-24.04-standard などを使用。
# コンテナ作成例 (Web UI からやっても OK)
pct create 100 local:vztmpl/ubuntu-24.04-standard_24.04-2_amd64.tar.zst \
--hostname amd-gpu-container \
--cores 4 \
--memory 8192 \
--rootfs local-lvm:32 \
--unprivileged 1 \
--features nesting=1
2.2 パススルー設定 (GUI)
GUI の場合 (推奨)
- Proxmox Web UI で対象のコンテナ (100) を選択。
- Resources タブをクリック。
-
Add -> Device Passthrough を選択。
- 以下のデバイスを追加していく。
Mode は 0666 に設定し、GID はホスト側の render グループの ID (通常 104) などを指定しておくと確実だが、先ほど udev で 0666 にしているので空欄でも動くことが多い。
設定が終わったらコンテナを起動します。
3. コンテナ内の設定
コンテナ内でも ROCm ライブラリなどが必要だが、カーネルモジュール (DKMS) はインストールしない(ホストのものを使うため)。
3.1 ROCm のインストール (DKMSなし)
まずはコンテナ内の環境を最新にする。
# コンテナ内で実行
apt update && apt upgrade -y
apt install -y build-essential curl wget git
次に ROCm をインストールするが、--no-dkms オプション(またはユースケース指定)を使う。
このようにホストからコンテナにファイルを転送してインストールすることもできる。
root@pve-server:~# pct push 100 amdgpu-install_7.1.1.70101-1_all.deb /root/downloads/amdgpu-install_7.1.1.70101-1_all.deb
# 1. インストーラーのダウンロード (ホストと同じバージョン推奨)
wget https://repo.radeon.com/amdgpu-install/7.1.1/ubuntu/noble/amdgpu-install_7.1.1.70101-1_all.deb
apt install ./amdgpu-install_7.1.1.70101-1_all.deb
apt update
# 2. ROCm ランタイムのみインストール (DKMSなし!)
amdgpu-install --usecase=rocm --no-dkms
これでカーネルモジュールのビルドエラーを回避しつつ、必要なライブラリだけが入る。
root@pve-container:~# amd-smi
+------------------------------------------------------------------------------+
| AMD-SMI 26.2.0+021c61fc amdgpu version: Linuxver ROCm version: 7.1.1 |
| VBIOS version: 022.012.000.027.000001 |
| Platform: Linux Baremetal |
|-------------------------------------+----------------------------------------|
| BDF GPU-Name | Mem-Uti Temp UEC Power-Usage |
| GPU HIP-ID OAM-ID Partition-Mode | GFX-Uti Fan Mem-Usage |
|=====================================+========================================|
| 0000:c8:00.0 AMD Radeon Graphics | N/A N/A 0 N/A/0 W |
| 0 0 N/A N/A | N/A N/A 68/2048 MB |
+-------------------------------------+----------------------------------------+
+------------------------------------------------------------------------------+
| Processes: |
| GPU PID Process Name GTT_MEM VRAM_MEM MEM_USAGE CU % |
|==============================================================================|
| No running processes found |
+------------------------------------------------------------------------------+
3.2 環境変数の設定 (動かなければやると良いかも)
特に Radeon 780M (RDNA3) などの民生用 GPU を使う場合、ROCm が公式サポート外として認識しないことがある。
そこで、環境変数で「この GPU は GFX1100 (RDNA3) 互換だよ!」と教えてあげる必要がある。
# .bashrc に追記
echo 'export HSA_OVERRIDE_GFX_VERSION=11.0.0' >> ~/.bashrc
echo 'export PATH=$PATH:/opt/rocm/bin' >> ~/.bashrc
source ~/.bashrc
HSA_OVERRIDE_GFX_VERSION の値は GPU アーキテクチャによって異なる。
Radeon 780M (Phoenix/Hawk Point) は 11.0.0 で動くことが多いが、古い GPU の場合は 10.3.0 など適切な値を調べる。
4. 動作確認
コンテナ内で rocminfo や clinfo を実行してみる。
root@pve-container:~# rocminfo | grep "Marketing Name"
Marketing Name:
Marketing Name: AMD Radeon Graphics
このように GPU 名が表示されれば成功!
おわり
AMD GPU のパススルーは NVIDIA に比べて情報が少ないが、NVIDIA と同様にホストとコンテナに「同じバージョン」のドライバーをインストールすれば問題なく動作する。
ミニ PC などを使用していて、もし Proxmox に AMD GPU をパススルーしたい場合は、この記事を参考にしてみてください!
参考
