llama.cppが遅い原因と高速化設定|確認順に解説

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

llama.cppが遅い原因を、ロード、プロンプト処理、トークン生成に分けて診断。GPUオフロード、メモリ、スレッド、batch、Flash Attention、KV cacheを安全な確認順で調整します。2026年8月2日時点の机上調査です。

推論の遅さを読み込み、入力処理、生成の3区間に分けて順番に調整する診断図解

先に結論

  • llama.cppの「遅い」は、model load、prompt processing、text generationのどこが遅いかで対策が変わります。まず同じGGUFと同じbuildでllama-benchを取り、推測でoptionを増やさないことが最短です。
  • 確認順は、Release buildと正しいbackend → GPU認識とoffload → RAM/VRAMの余裕 → CPU threads → batch/ubatch → Flash Attention/KV cacheです。
  • 2026年8月2日時点のCLIは、GPU layerがauto、device memoryへのfitがon、Flash Attentionがautoです。古い記事の-ngl 999などを最初から足すより、現在の自動判定結果と起動logを先に確認します。

おすすめ読者: 起動はするが返答が遅い人、GPUを使っているはずなのに速度が出ない人、設定変更を同条件で比較したい人。

確認日時: 2026年8月2日 14:24(Asia/Tokyo)
固定した版: llama.cpp master HEAD 11924d4c17abc27383376a1ac6a24fa3e36c1c0c
検証区分: 公式README、build資料、CLI自動生成引数表、llama-bench資料、performance troubleshooting資料とsourceを照合した机上調査です。掲載commandはBash/Zshとして構文確認しましたが、特定hardwareでのbenchmarkは実施していません。記事中に「何t/sなら速い」という実測値は置いていません。
画像: アイキャッチは推論経路のbottleneckと最適化を表した当サイトの要点図解で、benchmark結果ではありません。

「遅い」を3区間に分ける

最初に、体感ではなく遅い区間を特定します。

遅い区間画面上の症状主な確認候補
model load起動から入力可能になるまで長いstorage、file size、load mode、RAM不足、swap、初回download
prompt processing(PP)長い入力を送った後、最初のtokenまで待つbackend、GPU offload、batch/ubatch、入力token数、prompt cache
text generation(TG)返答は始まるが1 tokenずつ遅いmodel規模・量子化、offload、memory bandwidth、CPU threads、thermal

llama-cliの終了時timingではprompt evalevalが分かれます。llama-benchではPPを-p、TGを-nとして分離できます。APIの体感にはtokenization、sampling、network、queue待ちも含まれますが、公式資料によるとllama-benchの測定にはtokenizationとsampling時間が含まれません。この差を混同しないでください。

まだGGUFを正常に実行できていない場合は、先にllama.cppでGGUFを動かす方法を完了します。load errorならGGUFモデルが読み込めないときの対処法へ進みます。

手順1:変更前のbaselineを保存する

同じmodel file、prompt/generation長、build、電源状態で5回測る例です。MODEL_GGUFは絶対pathへ置き換えます。

MODEL_GGUF="/absolute/path/to/model.gguf"

./build/bin/llama-cli --version
./build/bin/llama-cli --list-devices

./build/bin/llama-bench \
  -m "$MODEL_GGUF" \
  -p 512 \
  -n 128 \
  -r 5 \
  -o json > bench-baseline.json

JSONにはbuild commit、CPU/GPU情報、backend、model size、parameter数、batch、ubatch、threads、GPU layer、KV type、Flash Attention、PP/TGの平均t/sと標準偏差などが入ります。最速の1回ではなく平均とばらつきを比較します。

測定前に固定するものは次の通りです。

  • 同じGGUFとSHA-256
  • 同じllama.cpp build/backend
  • 同じ-p-n、context depth
  • 同じbatch、ubatch、KV cache型
  • 同じ電源mode、冷却条件、background process

設定の意味はllama.cpp主要パラメータ一覧でも確認できます。

手順2:Release buildとbackendを確認する

Debug build、CPU向けbuildのままGPU optionを足しても、期待する経路にはなりません。公式build資料に沿い、対象hardwareのbackendでRelease buildします。

hardware最初のbackend候補build時の確認
Apple SiliconMetalmacOSでは既定で有効。--list-devicesで認識確認
NVIDIA GPUCUDA-DGGML_CUDA=ON、toolkit/driver条件を確認
AMD GPUHIP/ROCm対応GPU・OS・ROCm版を公式表で確認
Intel GPUSYCL等対象deviceと公式build手順を確認
GPUなしCPUISA、physical core、memory bandwidthを確認

backendごとのbuild例と判断基準はllama.cpp GPUバックエンド比較にまとめています。起動logにdeviceが出ない場合は次のtuningへ進まず、buildを直します。

手順3:GPU offloadとmemory fitを確認する

現行CLIの-nglauto-fitonが既定です。まず明示した状態で起動し、logに選ばれたdevice、offloaded layer数、buffer/KV cacheの配置が出るかを確認します。

MODEL_GGUF="/absolute/path/to/model.gguf"

./build/bin/llama-cli \
  -m "$MODEL_GGUF" \
  -c 4096 \
  -n 256 \
  -ngl auto \
  -fit on \
  -fitt 1024 \
  -fa auto \
  -cnv

-fitt 1024はdeviceごとに1,024MiBのmarginを目標にする指定です。ただし--fit未指定の引数を調整します。この例の-c 4096のように明示した値まで勝手に縮める指定ではありません。OOMやswapが出るなら、次の順で負荷を下げます。

  1. contextを必要量まで下げる。
  2. file sizeの小さい量子化またはparameter数の少ないmodelを選ぶ。
  3. 並列実行中ならsequence数を下げる。
  4. 必要に応じてGPUへ載せるlayerを減らし、CPUとのhybrid inferenceにする。

「fileがVRAM容量より小さい」だけでは収まる保証になりません。model weightに加えてKV cacheと実行bufferが必要です。事前計算はローカルLLMに必要なVRAMの計算方法を使ってください。

手順4:CPU threadsを測って決める

threadsは多いほど速いとは限りません。公式performance troubleshootingでも、過剰なthreadsでCPUが飽和するとTGが極端に遅くなるため、1から倍増させてbottleneckを探す手順が案内されています。

MODEL_GGUF="/absolute/path/to/model.gguf"

./build/bin/llama-bench \
  -m "$MODEL_GGUF" \
  -p 0 \
  -n 128 \
  -t 1,2,4,8 \
  -r 5

8を上限にする意味ではありません。自分のphysical core数に応じて候補を追加し、TGの平均とばらつきを見ます。GPU offload中もtoken生成にCPU処理が関わるため、GPU使用率だけを見てthreadsを最大化しないでください。prompt処理用の-tb-tと分けて設定できますが、最初は同じにして変数を増やしません。

手順5:batch/ubatchはPPだけを比較する

-bはlogical maximum batch、-ubはphysical maximum batchです。長いpromptの処理が遅い場合に、同じ入力長でubatchを比較します。

MODEL_GGUF="/absolute/path/to/model.gguf"

./build/bin/llama-bench \
  -m "$MODEL_GGUF" \
  -p 1024 \
  -n 0 \
  -b 2048 \
  -ub 128,256,512,1024 \
  -r 5

大きくすると必ず速くなるわけではなく、memory使用量とbackendの実装に依存します。OOM、速度低下、ばらつき増加が出た1段階手前を候補にします。公式build資料も、BLASによる改善は大きめbatchのprompt processingに関するもので、generation性能には影響しないと区別しています。

手順6:Flash AttentionをA/B比較する

現行の既定-fa autoは、modelとbackendに応じて可否を判断します。対応しているのにPPやmemory効率が悪い場合だけ、同条件でoffonを比較します。

MODEL_GGUF="/absolute/path/to/model.gguf"

./build/bin/llama-bench \
  -m "$MODEL_GGUF" \
  -p 1024 \
  -n 128 \
  -fa off,on \
  -r 5

onで未対応errorになる組み合わせは、強制して解決する対象ではありません。autoへ戻します。また、改善幅はhardware、model構造、prompt長で変わるため、別環境の割合をそのまま期待しないでください。

手順7:KV cacheを小さくするのはmemory対策として行う

長contextでmemoryが足りない場合、K/V cacheをf16からq8_0などへ量子化できる構成があります。

MODEL_GGUF="/absolute/path/to/model.gguf"

./build/bin/llama-cli \
  -m "$MODEL_GGUF" \
  -c 8192 \
  -ctk q8_0 \
  -ctv q8_0 \
  -fa on \
  -ngl auto \
  -fit on \
  -n 256 \
  -cnv

量子化V cacheにはFlash Attentionが必要です。backendによって対応するKV型やperformanceが異なり、量子化は品質にも影響し得ます。これは無条件の高速化optionではありません。memoryに余裕ができたか、PP/TG、代表promptの品質を別々に再測定します。multi-GPUのtensor splitでは量子化KVが未対応という現行制約もあるため、構成を混ぜないでください。

model loadだけが遅い場合

推論速度が正常で起動だけ遅いなら、計算backendよりload経路を見ます。現行CLIの--load-mode既定はmmapです。

確認意味
初回と2回目を分けるOS page cacheやdownloadの影響を区別する
local SSDとnetwork storageを分けるfile読み込み経路の差を確認する
RAM/swapを見るmodelが収まらずpageoutしていないか確認する
-lm mmapをbaselineにする現行既定を明示して比較する
-lm mlockは余裕がある場合だけ試すswap/圧縮を避ける一方、OS全体のmemoryを圧迫し得る

mlockは速度を保証するswitchではありません。modelとOS用のmemoryが十分にある環境でのみA/B比較し、失敗したらmmapへ戻します。旧--mmap--mlockは現行helpで--load-modeへの移行が案内されています。

serverで遅い場合はlatencyとthroughputを分ける

1 requestのTGを速くする設定と、複数requestを同時にさばく設定は別です。parallel slotやcontinuous batchingは全体throughputを上げられる一方、混雑時の個別latencyは長くなる場合があります。

次を別々に記録します。

  • queueに入ってから最初のtokenまでの時間
  • prompt processing時間
  • text generationのt/s
  • 同時request数と全request完了時間
  • timeout/error数

構成と再現commandはllama-serverの連続バッチング設定を使ってください。単一userの対話が目的なら、同時数を増やしたthroughputだけで「高速化した」と判断しません。

変更する順番と戻し方

順番変更期待する改善主なrisk
1正しいRelease backendPP・TG全体build条件の違い
2GPU認識・auto offloadPP・TG全体VRAM不足
3小さいmodel/量子化TG、memory品質低下
4threads主にTGoversubscription
5batch/ubatch主にPPmemory増加、逆効果
6Flash AttentionPP・memory中心非対応構成
7KV cache量子化長contextのmemory品質・互換性・速度差

1回に1項目だけ変え、結果file名へ条件を入れます。たとえばbench-11924d4-q4-ub512.jsonのようにすると、後から比較できます。llama.cppコマンド例10選の完成例を使う場合も、baselineとの差分を残してください。

FAQ

GPU使用率が100%なら最速?

断定できません。memory不足による転送、CPU側のoversubscription、長いqueue、thermal throttlingが同時に起きる可能性があります。PP/TGのt/s、offloaded layer、memory使用量、温度・電源状態を一緒に見ます。

contextを最大値にすると遅くなる?

大きなcontextはKV cacheのmemory圧力を増やします。また実際に長いpromptを処理すればPP時間も増えます。モデルが対応する最大値と、毎回確保すべき実用値は同じではありません。必要な長さから始めます。

Q4ならQ8より必ず速い?

保証できません。fileとweight memoryは小さくなりやすい一方、backendのkernel、hardware、model構造で速度順位が変わります。品質も含め、同じGGUF系統と条件で測ります。

Macで確認する点は違う?

Apple SiliconはCPUとGPUがunified memoryを共有するため、専用VRAMだけを見るPCとはmemory圧力の現れ方が異なります。Macのメモリ別・動かせるローカルLLM一覧でOSと他applicationの余裕を含めて選んでください。

まとめ

llama.cppの高速化は、option集ではなく測定順が重要です。遅い区間をload・PP・TGへ分け、versionとdeviceを記録し、Release backend、offload、memory、threads、batch、Flash Attention、KV cacheの順に1項目ずつ比較します。自動設定が増えた現行版では、まずautoの結果をlogで確かめ、その後に必要な箇所だけ固定するのが再現しやすい進め方です。

参考資料