0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

RamaLamaのコンテナイメージ自動選択の仕組み

0
Posted at

はじめに

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> で明示指定が必要
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?