はじめに
RamaLamaは、AIモデルをコンテナ上でローカル実行するためのCLIツールです。ramalama run <モデル名> を実行すると、裏でPodmanを通じてllama-serverコンテナが起動し、モデルの推論が行われます。
このとき、ホストのGPUに応じたコンテナイメージが自動で選択されるのですが、AMD GPU環境で調べてみたところ、想定と違う動作だったので深掘りしてみました。
環境
- OS: Ubuntu 24.04
- GPU: AMD Radeon 890M(iGPU)
- RamaLama: 0.24.0
- Podman: 4.9.3
GPU別コンテナイメージの一覧
RamaLamaのソースコード(llama_cpp.py L210-L218)には、GPU別のイメージマッピングが定義されています。
_LLAMA_CPP_IMAGES: dict[str, str] = {
"ASAHI_VISIBLE_DEVICES": version_tagged_image("quay.io/ramalama/asahi"),
"ASCEND_VISIBLE_DEVICES": version_tagged_image("quay.io/ramalama/cann"),
"CUDA_VISIBLE_DEVICES": version_tagged_image("quay.io/ramalama/cuda"),
"HIP_VISIBLE_DEVICES": version_tagged_image("quay.io/ramalama/rocm"),
"INTEL_VISIBLE_DEVICES": version_tagged_image("quay.io/ramalama/intel-gpu"),
"OPENVINO_VISIBLE_DEVICES": version_tagged_image("quay.io/ramalama/openvino"),
"MUSA_VISIBLE_DEVICES": version_tagged_image("quay.io/ramalama/musa"),
}
表にすると:
| GPU環境変数 | イメージ | サイズ(v0.24) |
|---|---|---|
| CUDA_VISIBLE_DEVICES(NVIDIA) | quay.io/ramalama/cuda |
- |
| HIP_VISIBLE_DEVICES(AMD ROCm) | quay.io/ramalama/rocm |
6.44 GB |
| (Vulkan選択時はdefault_imageへフォールバック) | quay.io/ramalama/ramalama |
1.1 GB |
| INTEL_VISIBLE_DEVICES | quay.io/ramalama/intel-gpu |
- |
| ASAHI_VISIBLE_DEVICES | quay.io/ramalama/asahi |
- |
AMD GPUなのにROCmイメージが使われない?
AMD GPU(Radeon 890M)の環境で ramalama info を実行すると:
{
"Accelerator": "hip",
"Image": "quay.io/ramalama/ramalama:0.24"
}
Accelerator は hip(= AMD ROCm)と検出されていますが、Image は quay.io/ramalama/ramalama:0.24(ベースイメージ)です。rocm イメージではありません。
--dryrun で確認しても、デバイスのパススルー(/dev/dri、/dev/kfd)やROCm環境変数(HIP_VISIBLE_DEVICES=0)は設定されるのに、イメージはベースイメージのままです。
$ ramalama --dryrun run granite 2>&1
podman run ... --device /dev/dri --device /dev/kfd --device /dev/accel \
-e HIP_VISIBLE_DEVICES=0 ... \
quay.io/ramalama/ramalama:0.24 llama-server ...
バックエンド優先順位がポイント
原因はソースコードの get_gpu_backend_preferences() (L142-L160) にありました。
def get_gpu_backend_preferences(gpu_type: str) -> list[str]:
preferences = {
"HIP_VISIBLE_DEVICES": ["vulkan", "rocm"], # AMD: Vulkan preferred
"CUDA_VISIBLE_DEVICES": ["cuda", "vulkan"], # NVIDIA: CUDA preferred
"INTEL_VISIBLE_DEVICES": ["vulkan", "sycl", "openvino"], # Intel: Vulkan preferred
"ASAHI_VISIBLE_DEVICES": ["vulkan"], # Asahi: Vulkan only
"ASCEND_VISIBLE_DEVICES": ["cann"], # Ascend: CANN only
"MUSA_VISIBLE_DEVICES": ["musa"], # MUSA: MUSA only
"GGML_VK_VISIBLE_DEVICES": ["vulkan"], # Vulkan: Vulkan only
}
if is_windows_or_wsl():
preferences["HIP_VISIBLE_DEVICES"] = ["rocm", "vulkan"] # WSL2では逆
preferences["INTEL_VISIBLE_DEVICES"] = ["sycl", "vulkan", "openvino"]
return preferences.get(gpu_type, [])
AMD GPUの場合、バックエンドの優先順位は ["vulkan", "rocm"] — つまりVulkanが第1候補です。
get_container_image() (L353-L385) でautoモードの場合:
if backend == "auto":
preferences = get_gpu_backend_preferences(detected_gpu_type)
# preferences = ["vulkan", "rocm"]
gpu_type = backend_to_gpu_env(preferences[0])
# backend_to_gpu_env("vulkan") → "GGML_VK_VISIBLE_DEVICES"
preferences[0](= "vulkan")が選ばれ、gpu_type は "GGML_VK_VISIBLE_DEVICES" になります。しかし _LLAMA_CPP_IMAGES にこのキーは存在しないため、最終行の config.default_image(= quay.io/ramalama/ramalama)にフォールバックします。
return _LLAMA_CPP_IMAGES.get(gpu_type, config.default_image)
ベースイメージの中身
では、ベースイメージ(quay.io/ramalama/ramalama:0.24)には何が入っているのか。
$ podman run --rm quay.io/ramalama/ramalama:0.24 sh -c \
'find / -name "*.so" 2>/dev/null | grep -iE "vulkan|ggml"'
/usr/lib64/libvulkan_radeon.so # AMD GPU
/usr/lib64/libvulkan_intel.so # Intel GPU
/usr/lib64/libvulkan_nouveau.so # NVIDIA GPU
/usr/lib64/libvulkan_lvp.so # CPU(ソフトウェアレンダリング)
/usr/lib64/libggml-base.so
/usr/lib64/libggml.so
/usr/bin/libggml-cpu-icelake.so # CPU最適化ライブラリ(各アーキ向け)
/usr/bin/libggml-cpu-skylakex.so
/usr/bin/libggml-cpu-haswell.so
...
- ROCmやCUDAのライブラリは含まれていない
- 代わりに各GPU向けのVulkanドライバが入っている(
libvulkan_radeon.so、libvulkan_intel.soなど) - CPU向けのアーキテクチャ別最適化ライブラリも含まれている
VulkanはクロスプラットフォームのGPU APIなので、1つのイメージで複数メーカーのGPUに対応できます。
なぜVulkanがデフォルトなのか
イメージサイズの差を見ると理由が明確です。
| イメージ | バックエンド | サイズ |
|---|---|---|
quay.io/ramalama/ramalama:0.24 |
Vulkan | 1.1 GB |
quay.io/ramalama/rocm:0.24 |
ROCm | 6.44 GB |
約6倍の差があります。初回ダウンロード時間やディスク消費を考えると、Vulkanで十分な場面ではベースイメージの方が合理的です。
なお、Windows/WSL2の場合はVulkanがうまく動作しないため、is_windows_or_wsl() の判定により優先順位が ["rocm", "vulkan"] に逆転します。
--backend rocm で切り替えられる?
--backend rocm オプションで明示的にROCmバックエンドを指定できます。ただし、v0.24の時点では**--dryrunではイメージ選択には反映されません**。
$ ramalama --dryrun run gpt-oss --backend rocm
podman run ... quay.io/ramalama/ramalama:0.24 llama-server ...
--backend rocm を指定しても、イメージは quay.io/ramalama/ramalama:0.24(Vulkanベースイメージ)のままです。
実際に動かすとどうなるか
--backend rocm はイメージ選択には反映されませんが、ランタイムの挙動には反映されます。実際に実行してみると、デフォルト(Vulkan)とは異なる結果になりました。
$ ramalama run gpt-oss --backend rocm
...
2026-09-23 16:29:57 - ERROR - Failed to serve model gpt-oss-20b-GGUF, for ramalama run command
コンテナはexit code 139(SIGSEGV)で終了しました。VulkanベースイメージにはROCmライブラリが含まれていないため、llama-serverがROCmバックエンドで推論しようとしてクラッシュしています。
--image でROCmイメージを指定した場合
では、--image でROCmイメージを直接指定すればどうなるか。
$ ramalama run gpt-oss --image quay.io/ramalama/rocm:0.24
...
2026-09-23 16:39:25 - ERROR - Command 'health check of container ramalama-s6LZsgXYNi' timed out after 180 seconds
今度はSEGVではなくタイムアウトです。ログを確認すると llama threadpool init までは進んでおり、その先のGPU初期化で止まっています。
今回使用したRadeon 890MはVRAMが2GBのiGPUです。20Bモデルは大半をCPUにオフロードする必要があり、ROCmバックエンドでの初期化が180秒のヘルスチェックに間に合わなかったと考えられます。
結果まとめ
| 指定 | イメージ | 結果 | 原因 |
|---|---|---|---|
| デフォルト | ramalama:0.24 |
動作する | Vulkanバックエンドで推論 |
--backend rocm |
ramalama:0.24 |
SEGV(exit 139) | イメージにROCmライブラリがない |
--image rocm:0.24 |
rocm:0.24 |
タイムアウト | iGPU VRAM 2GBで20Bモデルの初期化が間に合わない |
--backend rocm を指定するとランタイムはROCmに切り替わるものの、イメージはVulkanベースのままという不整合が発生します。--backend に連動してイメージも切り替わるのが自然な動作に思えるので、これはバグか今後の改善ポイントかもしれません。
まとめ
| GPUメーカー | デフォルトバックエンド | イメージ |
|---|---|---|
| NVIDIA | CUDA | quay.io/ramalama/cuda |
| AMD(Linux) | Vulkan | quay.io/ramalama/ramalama |
| AMD(Windows/WSL2) | ROCm | quay.io/ramalama/rocm |
| Intel | Vulkan | quay.io/ramalama/intel-gpu |
- RamaLamaはGPUを自動検出してコンテナイメージを選択する
- AMD GPUの場合、ROCmではなくVulkanバックエンドがデフォルト
- Vulkanがデフォルトになっている理由は3つ:
- イメージサイズ: Vulkan 1.1GB vs ROCm 6.44GB
- クロスGPU対応: 1つのイメージでAMD・NVIDIA・Intelに対応
- iGPU環境での安定性: VRAM 2GBのようなiGPU環境でもVulkanなら安定動作する
-
--backend rocmはランタイムの挙動には反映されるが、イメージ選択には反映されない(v0.24時点) - ROCmイメージを使う場合は
--image quay.io/ramalama/rocm:<version>で明示指定が必要