40B Denseモデルの現実:IQuest-Coder-V1-40BをCPU/GPU/Aiderで回して分かったこと
IQuest-Coder-V1-40B-Instruct(Dense 40B)をCPU Q5_K_M、GPU nvfp4、Aider whole-editの3構成で検証。CPU推論は構造的に破綻、nvfp4で25-28 tok/sが実用域、Aiderのwhole-editは40Bと相性が悪い。40B Denseの実運用限界を実測データから整理した。
背景
IQuest-Coder-V1-40B-Instructは40B級のDense(非MoE)コーディング特化モデル。MoEモデルと違い推論時に全パラメータを使うため、計算量がそのままモデルサイズに比例する。
96GB VRAMのRTX PRO 6000 Blackwellがある環境で、CPU推論(Q5_K_M)とGPU推論(nvfp4)の両方を試し、さらにAider(AIコーディングエージェント)のwhole-edit形式での実用性を検証した。結論から言うと、Denseモデルの運用にはGPU + 適切な量子化が必須で、CPU推論とwhole-editは構造的に厳しいことがわかった。
目的
- CPU推論(Q5_K_M / llama.cpp)で40B Denseが実用になるか検証
- GPU推論(nvfp4 / vLLM)でのスループットとVRAM使用量を計測
- Aider whole-edit形式でのコード編集速度を実測
- MoEとDenseの実運用上の差を明確にする
実験環境
| 項目 | 仕様 |
|---|---|
| CPU | AMD EPYC 9175F(Zen 5, 16C, L3 512MB) |
| GPU | NVIDIA RTX PRO 6000 Blackwell Max-Q(96GB VRAM) |
| メモリ | DDR5-6400 768GB(12ch) |
| OS | Ubuntu 24.04 LTS |
検証構成
| 構成 | Runtime | 量子化 | 配置 |
|---|---|---|---|
| A: CPU推論 | llama.cpp server(Podman) | Q5_K_M(GGUF) | CPU RAM |
| B: GPU推論 | vLLM | nvfp4 | GPU VRAM |
| C: Aider利用 | vLLM(Loop-Instruct variant) | nvfp4 | GPU VRAM |
結果
構成A: CPU推論(Q5_K_M, ctx=8k)
| 項目 | 実測値 |
|---|---|
| TTFT(4k-5kプロンプト時) | 数十秒(体感破綻) |
| CPU使用率 | 全コア100%張り付き |
| 問題の本質 | 40B全層を毎トークン計算、省略不可 |
CPU推論は構造的に実用は厳しい。prompt evalが支配的になり、パイプライン処理(低TTFT前提)は成立しない。SSD配置はロード時間には効くが推論速度には無関係。
構成B: GPU nvfp4(vLLM, ctx=8k-32k)
| 指標 | 実測値 |
|---|---|
| PP速度 | 1,100-2,300 tok/s |
| TG速度 | 25-28 tok/s(安定) |
| KVキャッシュ使用率 | 2-12% |
| Prefixキャッシュヒット率 | 20-45% |
vLLMログからの連続計測(抜粋):
Engine 000: Avg generation throughput: 28.3 tokens/s, KV cache usage: 2.0%, Prefix cache hit rate: 22.8%
Engine 000: Avg generation throughput: 28.0 tokens/s, KV cache usage: 2.3%, Prefix cache hit rate: 22.8%
Engine 000: Avg generation throughput: 27.8 tokens/s, KV cache usage: 2.8%, Prefix cache hit rate: 22.8%
Engine 000: Avg generation throughput: 27.4 tokens/s, KV cache usage: 3.5%, Prefix cache hit rate: 22.8%
TG速度は25-28 tok/sで安定。出力長別の体感:
- 200トークン: 約7-8秒
- 400トークン: 約14-16秒
- 800トークン: 約30秒
構成C: Aider whole-edit利用
| 指標 | 実測値 |
|---|---|
| TG速度 | 0.6-8 tok/s(不安定) |
| KVキャッシュ使用率 | 7-13%(急激に増加) |
| Prefixキャッシュヒット率 | 6%(ほぼ無効) |
whole-edit形式はファイル全体を再生成するため出力トークン数が爆発。repo-map + 複数ファイル添付でコンテキストが肥大し、KVキャッシュが急速に膨張する。
比較サマリ
| 構成 | TG速度(tok/s) | 実用判定 | 用途 |
|---|---|---|---|
| A: CPU Q5_K_M | 測定不能(TTFT破綻) | 不可 | - |
| B: GPU nvfp4 | 25-28 | 実用 | agent/テスト生成/CI |
| C: Aider whole-edit | 0.6-8 | 非実用 | - |
考察
なぜDenseはCPUで厳しいのか
MoEモデル(例: Kimi-K2.5の活性32B)はトークンごとに一部のエキスパートだけ計算する。Denseは40B全層を毎回計算するため、計算量の削減が効かない。同じ「40B級」でもCPU推論の負荷は根本的に異なる。
EPYC 9175Fの12チャネルメモリ帯域でも、Denseの全層アクセスパターンではメモリ帯域が飽和する。MoEのようにL3キャッシュにエキスパートを載せる戦略も使えない。
nvfp4の効率性
nvfp4(4bit量子化)でVRAM使用量を抑えつつ、25-28 tok/sを安定して出せている。Performance Factor(tok/s ÷ モデルB数)で比較すると:
| モデル | パラメータ | TG速度 | tok/s per B |
|---|---|---|---|
| command-a-reasoning | 111B | ~11 tok/s | 0.10 |
| IQuest-Coder-40B nvfp4 | 40B | 26-28 tok/s | 0.65-0.70 |
Bあたりの生成効率は111B系の約6-7倍。nvfp4が正しく効いていることが数字で確認できる。
Aider whole-editの構造的問題
whole-edit形式が遅い原因:
- ファイル全体を出力するためトークン数が膨大
- repo-map + 添付ファイルでpromptも肥大
- Prefixキャッシュヒット率が6%(変動するコンテキストのため)
- KVキャッシュが急速に膨張(7→13%)
対策はwhole-editを避けてdiff/patch形式に変更すること。出力トークン数を大幅に削減でき、生成速度の問題を構造的に回避できる。
感想
40B Denseモデルの位置づけが明確になった。GPU nvfp4なら日常のagent/aider/CI/テスト生成の有力な選択肢になる。25-28 tok/sは「考えすぎないInstruct型」としてちょうどいい速度帯で、111Bのreasoning系を日常使いする理由が薄くなった。
ただしCPU推論は実用的とは言い難い。Denseの全層計算はMoEの構造的優位性(エキスパート選択による計算量削減)が使えないため、CPUで回すならMoEモデルを選んだ方がよさそうだ。
使い分けの結論:
- 日常(agent/aider/CI): IQuest-Coder-40B nvfp4(本命)
- 深い推論・設計レビュー: command-a-reasoning(サブ)
- バッチ処理(CPU常駐): MoEモデル(Kimi-K2.5等)
再現方法
GPU nvfp4(推奨構成)
vllm serve IQuestLab/IQuest-Coder-V1-40B-Instruct-nvfp4 \
--max-num-seqs 1 \
--max-model-len 32768
CPU Q5_K_M(参考: 非推奨)
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 "$MODEL" \
--jinja -c 8192 \
--threads 14 --threads-batch 14 \
-b 2048 -ub 512 \
--parallel 1 --flash-attn on
補足ノウハウ
Dense vs MoEのCPU推論比較
| 項目 | Dense 40B | MoE 229B(活性10B) |
|---|---|---|
| 毎トークンの計算量 | 40B全層 | 10B相当 |
| L3キャッシュ活用 | 効かない(全層アクセス) | 効く(エキスパート局所性) |
| CPU推論のTG | 測定困難 | 10-37 tok/s |
| CPU推論の実用性 | 非実用 | バッチ用途で実用 |
Aider設定の最適化
--edit-format diff: whole-editを避けて出力を削減temperature=0: greedy固定で生成を高速化- repo-mapと/add対象を最小限に
max_model_lenを必要最小に設定

