llama.cpp GPU比較|Metal・CUDA・ROCm・Vulkan・SYCL

CHATGPT / AIChatGPTなどの生成AIを活用して運営・記事制作・更新を行っています。制作方針

llama.cppのMetal、CUDA、HIP/ROCm、Vulkan、SYCLを対応機器・OS・build条件で整理。速度順位は作らず、同じGGUFをllama-benchで比較する方法と限界を解説します。

ハードウェア別のGPUバックエンド候補を同一条件の実測比較へ集める選択図解

先に結論

Metal、CUDA、HIP/ROCm、Vulkan、SYCLは同じ種類の「速度順位」ではありません。backendごとに対象device、driver、compiler/runtime、対応operatorが違います。llama.cpp upstreamの対応表とbuild guideを入口に候補を絞り、手元で実際に検出されたdeviceと同一GGUFの測定結果を見て決めてください。この記事は公式資料による机上調査で、GPU実機のbuild・推論・速度比較はしていません。

まず対応機器と前提を照合する

backendupstream資料が示す主な対象構成を始める前に確認すること
MetalApple SiliconmacOSとAppleのMetal環境。macOSの標準buildではMetalが有効です。
CUDANVIDIA GPU対象GPUとOSに合うNVIDIA driverおよびCUDA Toolkit。
HIP / ROCmHIP対応AMD GPU対象GPU・OSがAMD ROCm 10.1.0のsupport matrixに含まれること。llama.cppのbackend名はHIPです。
VulkanVulkan対応GPUGPU driver、Vulkan SDK/loader、OSごとのbuild手順。macOSのVulkan driverはMetalへのtranslation layerを使います。
SYCL主にIntel GPUIntel GPU family、oneAPI compiler/runtime、driverの組合せ。upstream guideに記載されたOSとversionを確認します。

llama.cpp upstream READMEの一覧はbackendのtarget-deviceを示します。全model、全演算、全GPUで同一の対応や速度を保証する表ではありません。特にAMDでは「AMD GPUならすべてROCm/HIP対応」と決めつけず、AMDとllama.cpp両方の現行条件を照合します。

HIPのconfigure flagだけではbuild条件を決められません。llama.cppのLinux例はROCm環境に応じたHIPCXXとHIP_PATHを指定し、必要ならGPU architectureも選びます。Windowsの例は別のcompiler設定です。AMD側の対応表でもGPU、OS、kernel、driver等の組合せを選んで確認してください。

OpenVINOとOpenCLは別backendです。upstream READMEはOpenVINOを進行中とし、OpenCLはAdreno向けとして掲載しています。これらをSYCLと同じもの、または汎用GPUなら常に使える代替経路として扱わないでください。

build optionはbackendごとに異なる

必要なtoolchainを先に導入してから、current build guideの該当節にあるoptionでconfigureします。代表的なCMake flagは次のとおりです。

backendCMake option注意点
MetalmacOSでは既定で有効CPUのみで動かす場合は同guideのGPU無効化optionを確認します。
CUDA-DGGML_CUDA=ONNVIDIA CUDA Toolkitが必要です。移植先も含めるbuildはnative設定を別途確認します。
HIP / ROCm-DGGML_HIP=ONROCm/HIP compiler、target GPU、distributionの組合せを確認します。
Vulkan-DGGML_VULKAN=ONVulkan SDK/headersに加えて、driverとdeviceのruntime対応が必要です。
SYCL-DGGML_SYCL=ONIntel oneAPI compiler/runtimeが必要です。Linuxの公式例はicxとicpxを指定します。

CUDAの最小例です。ほかのbackendでは表のoptionへ置き換え、各backendの公式手順に書かれたdependencyも満たしてください。

cmake -B build -DGGML_CUDA=ON
cmake --build build --config Release

SYCLはoneAPI環境を有効にしたLinuxで、現行guideが例示するcompilerを使う構成の一例です。Windowsは同じcommandをそのまま使わず、guideのVisual Studio/oneAPI手順に従います。

cmake -B build \
  -DGGML_SYCL=ON \
  -DCMAKE_C_COMPILER=icx \
  -DCMAKE_CXX_COMPILER=icpx
cmake --build build --config Release

CMake configurationが通っても、実行時にGPUが使われているとは限りません。起動時のdevice表示を確認し、複数deviceがある場合はupstream server/CLIの--list-devicesと--deviceで表示された名称を使います。flag名、表示名、runtime選択肢は使用中のreleaseに合わせてください。

同じ条件で測る

llama-benchはprompt processing(-p)、generation(-n)、その両方(-pg)を分け、繰り返し回数を-rで指定できます。まず利用可能なdeviceを確認します。

./build/bin/llama-bench --list-devices

同じGGUFを5回測りJSONへ出す例です。-devを指定するときは--list-devicesで表示された実際のdevice名へ置き換えます。

./build/bin/llama-bench \
  -m /path/to/model.gguf \
  -dev "DEVICE_NAME_FROM_LIST" \
  -p 512 \
  -n 128 \
  -r 5 \
  -o json

backend同士を比べるときは、可能な範囲でmodel fileのhash、prompt、prompt長、生成token数、context depth、batch、GPU offload layer、KV cache type、build commit、compiler、driver、power modeを揃えて記録します。各backendで同じ条件にできないoptionは隠さず結果と一緒に残します。llama-benchの測定値にはtokenizationとsamplingの時間が含まれないため、アプリでの応答時間を知るにはserver/APIのend-to-end latencyも別に測ります。

数値を順位へ変換しない

  • prompt処理の速さとtoken生成の速さは別々に読みます。
  • modelがGPU memoryに収まらないとCPUやsystem memoryへの転送が影響します。
  • backendを変える際に量子化、build option、driverも変わると、差の原因をbackendだけに帰属できません。
  • llama-benchがdeviceを検出した事実と、利用するmodelの全演算がそのbackendで処理された事実は同じではありません。
  • 実測したsystem、model、条件を示さずに「最速backend」を一般化しません。

測定の差が小さい場合は、複数回の平均だけでなく各回の値とばらつき、load時間、peak memory、失敗やOOMも残します。結果が自分のpromptでの応答品質、安定性、運用要件と合うかは別に評価してください。

関連ガイド

llama.cppでGGUFを起動する手順はbackend比較前のmodel読み込み、llama.cppが遅い原因の確認順は実行後の調整、ローカルLLMのVRAM計算はmodel容量の見積もりを扱います。Qwen3.5を例にruntimeを動かす場合はQwen3.5ローカル実行ガイドを参照してください。

公式資料

表を拡大

左右にスワイプして読めます