背景

Llama-4-ScoutはMetaのMoEモデルで、16エキスパート・17B活性パラメータ。Maverickの128エキスパートと比べてエキスパート数が少ないため、CPUでのキャッシュ効率が構造的に有利になる。

同じモデルをCPU推論(Q6_K / llama.cpp)とGPU推論(nvfp4 / vLLM)の両方で動かし、速度・品質・メモリ挙動を比較した。「CPU LLMは遅い」という印象が初回挙動に引きずられている可能性を、キャッシュ温後の定常性能で示す。

目的

  1. CPU Q6_K推論の定常速度を実測(キャッシュ温後)
  2. GPU nvfp4推論のPrefill/Decode速度とVRAM配分を記録
  3. mmapページキャッシュとprompt cacheの効果を定量化
  4. 100kコンテキスト境界の実態を把握

実験環境

項目仕様
CPUAMD EPYC 9175F(Zen 5, 16C, L3 512MB)
メモリDDR5-6400 768GB(12ch)
GPUNVIDIA RTX PRO 6000 Blackwell Max-Q(96GB VRAM)
OSUbuntu 24.04 LTS

2構成

構成Runtime量子化配置ctx
A: CPUllama.cppQ6_K(3分割GGUF)全CPU8,192
B: GPUvLLM 0.14.0rc1nvfp4(NVIDIA ModelOpt)全GPU~110K

結果

構成A: CPU Q6_K(th=16, ctx=8K)

指標測定値備考
PP(Prefill)約40 tok/s2.5k-5kトークンでも安定
TG(Decode)16.3-17.5 tok/s16コア均一負荷、温度64℃固定

初回実行はmmapページフォールト+フルPrefillで極端に遅い。2回目以降、OSページキャッシュ+prompt cacheが効いて定常速度に到達。prompt cacheのLCP(Longest Common Prefix)一致時はf_keep > 0.7を確認。

構成B: GPU nvfp4(vLLM, Blackwell 96GB)

指標測定値レンジピーク備考
PP(Prefill)700-1,200 tok/s1,370 tok/s長文プロンプトで顕在化
TG(Decode)30-60 tok/s112 tok/sウォームアップ後安定

Prefix Cache Hit Rate: 10-48%。48%到達時はTTFTが大幅短縮。

VRAM内訳

項目占有量
モデル常駐約63.5 GiB
KVキャッシュ利用可能分約20.2 GiB
最大コンテキスト長約110,256 tokens

BF16相当のKV管理で約100kトークンが1GPU上限。256k以上にはFP8 KVまたはTP=2が必要。

比較サマリ

構成TG(tok/s)VRAM用途
A: CPU Q6_K16-170バッチ要約、F&Fパイプライン
B: GPU nvfp430-60~64GBaider、対話型コード生成

考察

CPUキャッシュ戦略の効果

「CPU LLMは遅い」は初回挙動だけを見た限定的な評価。mmapとprompt cacheを正しく設計すれば、定常状態で17 tok/sが安定する。重要なのは:

  • --mlockで全重みを物理メモリにロック
  • System Promptを固定してLCP一致率を最大化
  • プロセスを再起動しない(OSページキャッシュを維持)

16エキスパートの構造的優位性

128エキスパートのMaverickと比較して、Scoutは16エキスパートで「疎の密度」が低い。EPYC 9175Fの1CCD=1Core配置では、選択されるエキスパートが少ないことがL3キャッシュ内のワーキングセット保持率を高め、メモリ帯域依存を下げる。

nvfp4の品質

Django/Python設計タスクでの品質はFP4でも実用レベル。指示追従性、日本語品質ともに安定。数学的厳密推論はやや弱いが、ボイラープレート生成やロジックレビューでは許容範囲。

感想

CPU 17 tok/sとGPU 30-60 tok/sの間には体感で明確な差がある。だがCPUの17 tok/sは非対話型パイプラインでは十分実用的で、GPUを他のモデルに割り当てられる。

GPU nvfp4の1,370 tok/s Prefillは圧倒的。aiderでの反復リファクタリングではTTFTの短さが開発速度に直結する。Prefix Cacheが48%に達するとほぼ即応。

16エキスパート構成は128エキスパートのMaverickより「キャッシュに優しい」。CPU推論でのtok/s差(Scout 17 vs Maverick 21-24)はエキスパート数の違いよりモデルサイズの違いが支配的だが、安定性ではScoutの方が読みやすい挙動をする。

再現方法

CPU Q6_K

  numactl --cpunodebind=0 --membind=0 \
  podman run --rm -it \
  -p 8081:8080 --shm-size 16g --cap-add=SYS_NICE \
  -v "$MO":/models:ro,Z $IMG \
  --host 0.0.0.0 --port 8080 \
  -m /models/Scout-17B-Q6_K.gguf \
  --threads 16 --threads-batch 16 \
  --batch-size 2048 --ubatch-size 512 \
  --mlock --ctx-size 8192 --flash-attn on \
  --parallel 1 --jinja
  

GPU nvfp4(vLLM)

  vllm serve nvidia/Llama-4-Scout-17B-16E-Instruct-NVFP4 \
  --dtype auto --gpu-memory-utilization 0.88 \
  --max-num-seqs 1 --max-model-len 110000 \
  --enable-prefix-caching --trust-remote-code
  

補足ノウハウ

キャッシュが効かなくなる条件

  • プロンプト先頭のテンプレートやツール定義を1文字でも変えるとprompt cacheが無効化、フルPrefillに戻る
  • プロセス再起動でOSページキャッシュがパージされ、再びコールドスタートの重いI/O待ちが発生
  • cache上限に達すると古いpromptが破棄される

100kコンテキスト境界

1GPU 96GBでnvfp4モデル(63.5 GiB)を載せると、KVキャッシュは約20 GiB。BF16精度のKVで約110kトークンが物理上限。256k/512kを扱うにはFP8 KV+TP=2構成への拡張が必要。