Moonshot AI の Kimi-K2.6 は 1T 級の MoE モデルで、384 expert のうち 8 つだけを活性化する DeepSeek2 系アーキテクチャ。総パラメータは重いが、活性パラメータは絞られているので、CPU メモリと GPU VRAM の役割分担をうまく作れれば、ソロ開発者のローカル worker として現実的な速度まで持っていける。

今回は ubergarm/Kimi-K2.6-GGUFIQ3_KQ4_X を、EPYC 9175F + RTX PRO 6000 Blackwell Max-Q 96GB x 2 で検証した。見たかったのは、ik_llama.cpp で MLA と expert placement を使ったときに、実際の coding task でどこまで崩れずに回るかだった。Vision未対応なのでtext-generationのみサポート。mainlineは対応しているので–no-cacheでビルドして試したがtool_call_parserが壊れていたので後日。

動画リンク: https://www.youtube.com/watch?v=skTE19_JRYg

動画の内容を先に要約すると、今回の検証は RTX PRO 6000 Blackwell Max-Q 96GB + EPYC 9175F + 768GB DDR5-6400 上で、Kimi-K2.6 (1T MoE, 384 experts × 8 active) を ik_llama.cpp でいくつかのパターンを試して、実用的な歩留まりのIQ3_Kに決めて、最後動画を撮った。ubergarmさん の IQ3_K (3.85 bpw, 460 GiB) を中心に、expert layer を 4 〜 10 層だけ GPU に戻し、それ以外を CPU pinned memory に置く head/tail split を試した。

  • TG は 17.921 t/s、PP cold は 223377 t/s-ub サイズと -ot 配置で大きく変わる
  • 14,707 tokens の連続生成でも 19.57 t/s を維持し、long generation でも崩れにくかった。自作のMCPツールのみで、あまりコールされないことが多いが、これはローカルネットワークにあるgiteaにISSUE/MS/PRまで自力で作れるから本当にすごい。opus4.6みたいなツールの使い方でTGがもう少しでればといったところ。256k qtv ctv f16でも確かvram 150GBいかないくらいだった
  • IQ3_K は TG 17.920.9 t/sQ4_X16.619.0 t/s で、最終的には IQ3_K を優先した。ぱっと見だけどあまり差は感じなかった。同一のAGENTS.mdを与えてほぼ同じ動きだった
  • 実タスクでは real_estate_sales モジュールを生成し、15 models / 772 lines のv6対応したちゃんとした Django コードを生成できた
  • ライセンスは Modified MIT だが、月商30億 または 100M MAU 以下なら商用で使えるし、その規模まで行ったら出口はあるのでほぼMIT

検証環境

項目構成
CPUAMD EPYC 9175F (16C/32T L3 512MB, Zen 5)
RAM768 GB DDR5-6400 ECC RDIMM
GPUNVIDIA RTX PRO 6000 Blackwell Max-Q 96GB x 2
OSUbuntu 24.04-LTS (minimal)
Runtimeik_llama.cpp

モデル側の前提は次のとおり。

項目
モデルKimi-K2.6
アーキテクチャDeepSeek2 系 MoE + MLA
総パラメータ1T class
Experts / Active384 / 8
主な量子化IQ3_K (3.85 bpw), Q4_X (4.55 bpw)

なぜ mainline llama.cpp ではなく ik_llama.cpp なのか

Kimi-K2.6 は DeepSeek2 アーキテクチャの MLA(Multi-head Latent Attention)を採用しており、推論エンジン側に専用の対応が要る。mainline llama.cpp でもモデルの読み込みと起動はできるが、 MLA 吸収モード(-mla 3)に相当するフラグがないため standard KV path で処理され、TG が本来の性能を出せない。さらに深刻なのが chat template parser の問題で、Kimi-K2.6 の <|tool_call_begin|> 系 special token を peg-native parser が処理できず、tool_call を含むレスポンスで Failed to parse input at pos 433: <|im_end|> を出してクラッシュする。–no-cache でビルドし直しても解消しなかった。(2026/04/22) template周りだと思うので、しばらくしたら再度落として試してみるとよいかと。

  Failed to parse input at pos 433: <|im_end|>
  
mainline llama.cpp で Kimi-K2.6 の tool_call 生成が parse error で落ちている画面
mainline llama.cpp で Kimi-K2.6 を動かしたときの tool_call parse error

Expert Tensor Placement が TG を決める

Kimi-K2.6 のような巨大 MoE を CPU/GPU hybrid で回すと、どの expert layer を GPU に戻すかで TG が変わる。全 expert を CPU pinned memory に置いたベースラインでは、生成は成立しても decode が伸びにくい。そこで head 側と tail 側の expert を -ot で GPU に戻し、CPU 側には中間層だけを残す配置を試した。

ベンチ結果

ConfigExpert on GPUTG avg (t/s)PP cold (t/s)VRAM/GPU
Baseline (--cpu-moe)0 層18.9185~11 GiB
6-layer head/tail split6 層 (3+3)20.9223~52/60 GiB
10-layer head-heavy10 層 (8+2)20.3377~43/44 GiB

6-layer の balanced split が TG では最良だった。10-layer の head-heavy は -ub 4096 と組み合わせたときの PP がかなり伸びる一方で、decode は head に寄せすぎたぶん少し鈍った。

最終的に残した -ot 配置

  -ot "blk\.(1|2)\.ffn.*=CUDA0" \
-ot "blk\.(59|60)\.ffn.*=CUDA1" \
-ot "exps=CPU"
  

CUDA0 に head 2 層(blk.1-blk.2)、CUDA1 に tail 2 層(blk.59-blk.60)を置く。残り 56 層の expert は CPU pinned memory に残す。 この構成だと、Blackwell 96GB × 2 のうち片側 39 GiB 台後半、もう片側 35 GiB 弱を使いながら、decode を 17-19 t/s 台に乗せやすい。1T 級モデルをローカルで常駐させるときに、GPU を完全に埋めきらず decode を優先する配置として、かなり扱いやすかった。

IQ3_K と Q4_X では向いている局面が違う

同じ Kimi-K2.6 でも、IQ3_KQ4_X は体感がかなり違った。

QuantBPWModel SizeTG avg (t/s)PP cold (t/s)CUDA_Host
IQ3_K3.85460 GiB20.9223368 GiB
Q4_X4.55544 GiB18.6567455 GiB

同じ Kimi-K2.6 でも、IQ3_K と Q4_X は体感がかなり違った。Q4_X は PP が圧倒的に速いが、TG は IQ3_K より遅い。expert tensor が重くなるほど毎 token の CPU→GPU 転送コストが増えるため、quant が大きいほうが decode では不利になる。実タスクを回していると、最初の system prompt や大きめの context を飲み込む速さより、数千 token を吐き続ける decode の安定性のほうが効いてくる。RAM 消費も 87 GiB 少ない IQ3_K が sweet spot だった。

-mla の選び方

Kimi-K2.6 のような DeepSeek2 系モデルでは、-mla の違いもそのまま速度差になる。

FlagKV cache 方式VRAM 使用量速度
-mla 0Standard KV最大最遅
-mla 1Compressed latent KV最小遅い
-mla 3Absorbed MLA最大最速

132k context でも KV cache は約 8.9 GiB で済む。VRAM を詰める必要があるなら -mla 1 に逃がせるが、今回の 96GB × 2 構成では -mla 3 で TG を優先。

実タスクで見えた品質

ベンチ数字だけでは分からないので、Zed から Kimi-K2.6 に Django tenant module を作らせて、tool-call 前提の coding task を実際に流した。IQ3_K、non-thinking mode、4~10-layer -ot で回した。

massage_salon モジュール

約 15 分で、Gitea issue 作成、独自のセマンティック差分ctxツール.ctree.toml の調整、Django v6でmodels/admin/apps まで一気に生成した。モデル数は 15、最終的なコード量は 839 行だった。

restaurant モジュール

10-layer head-heavy の構成で、調達、収益、労務、売上、マスタを domain ごとに分けてモデル化した。RestaurantSettings proxy パターンや TextChoicesUniqueConstraintMinValueValidator を自力で使い分けていて、構造化能力はかなり高かった。

real_estate_sales モジュール

3+3 split の配置で、1 リクエスト 14,707 tokens を約 12.5 分かけて生成し、TG 19.57 t/sだった 。15 model classes、772 行の出力で、物件、査定、媒介契約、内覧、購入申込、ローン審査、売買契約、決済までを一気に繋いでいる。

特に印象に残ったのは、学習データにない自作MCPの ctree MCP 設定を system prompt だけから推測して、実際に scope を切り替えながらコード生成を進めた点だった。ここはベンチ表には出ないが、いろんなモデルを試しているが、500B超えてくるとやっぱり地頭が良いみたいな印象を受ける。

Kimi-K2.6 が Django real_estate_sales モジュールの models と resources を生成している Zed 画面
real_estate_sales モジュール生成中の Zed。models のアウトラインと resources 実装が一度に立ち上がっている
Kimi-K2.6 が Django settings とテスト観点を詰めている Zed 画面
settings.py と pytest 観点を組み立てている場面。admin, tests, settings をまとめて考えているのが見える
Zed の MCP create_file 操作と llm ログ、Grafana を同時に見ている画面
tool-call で create_file を連打している最中の観測画面。右上で token timing、右下で Grafana を追っている
Zed、htop、Grafana を並べて Kimi-K2.6 の生成を観測している画面
実タスク中の CPU 負荷と Grafana の control plane を並べた画面。EPYC 側の余力を確認しながら回せる

Kimi-K2.6 は単に token を速く吐くだけではなく、複数ファイルの生成、テスト観点の列挙、MCP tool の往復を含む長めの作業単位でも崩れにくかった。

ik_llama.cpp と mainline llama.cpp の比較

同じハードウェア上で測ると差はかなりはっきり出る。

EngineQuantTG (t/s)PP cold (t/s)Tool call
ik_llama.cppIQ3_K20.9223OK
ik_llama.cppQ4_X18.6567OK
llama.cpp (mainline)Q4_X15.4188Crash

単に数値が低いだけではなく、私の環境ではtool-call で落ちたので、Visionも確認したいし、もう少し経ってから再度ビルドして試してみる。逆に ik_llama.cpp-mla 3、複数 -ot--jinjatool_call と揃っているので画像不要でコーディング用途なので、私はこちらを使うつもりだ。

参考: HFのcommunityで見た single-GPU ベンチ

Hugging Face の ubergarm/Kimi-K2.6-GGUF discussion #3 ではQ4_X を単一 RTX PRO 6000 + EPYC 9355 + DDR5-6400 で aiperf ベンチした結果が公開されていた。16-turn conversation simulation での平均は次のとおり。

EngineTG avg (t/s)TTFT avg (ms)Request latency avg (ms)
ik_llama.cpp18.858,56322,480
llama.cpp (mainline)16.0312,52628,872

こちらでも ik_llama.cpp が全指標で優位だった。-muge が Kimi-K2.6 で逆効果になるケースがあるという話も出ていて、mainline に追従するより fork 側の知見をそのまま使ったほうが早いと感じる。

実際に残した起動コマンド

  podman run --rm \
  --device nvidia.com/gpu=all \
  -p 8000:8000 \
  --cap-add=SYS_NICE \
  -v /mnt/data/models/models--ubergarm--Kimi-K2.6-GGUF:/models:ro,Z \
  registry.home.arpa/ik_llama.cpp:latest \
  -m /models/snapshots/${REF}/IQ3_K/Kimi-K2.6-IQ3_K-00001-of-00012.gguf \
  --ctx-size 131768 \
  --parallel 1 \
  --threads 15 \
  --threads-batch 32 \
  -b 8192 \
  -ub 4096 \
  -ngl 999 \
  -mla 3 \
  -ger \
  --special \
  -amb 512 \
  --jinja \
  --host 0.0.0.0 \
  --port 8000 \
  --warmup-batch \
  --alias kimi-k2.6-IQ3_K \
  -ot "blk\.(1|2)\.ffn.*=CUDA0" \
  -ot "blk\.(59|60)\.ffn.*=CUDA1" \
  -ot "exps=CPU" \
  --temp 0.6 \
  --chat-template-kwargs '{"thinking":false}'
  

この形で、Kimi-K2.6 を OpenAI 互換 API として exposed しつつ、Zed や自作エージェントからそのまま叩ける。

まとめ

項目
ModelKimi-K2.6 (1T MoE, 384×8 active)
QuantIQ3_K が実運用の本命
Engineik_llama.cpp
TG20.9 t/s (6-layer head/tail split)
PP cold223-377 t/s (-ub と配置依存)
実タスクDjango tenant module を長尺生成可能
用途orchestrator model
LicenseModified MIT ($20M / 100M MAU 制限)

結論として、Kimi-K2.6 は「1T 級だから現実離れしている」ではなく、「CPU pinned memory と vram 72GB、RAM 512GBでぎりぎりいける。ik_llama.cpp の MLA 最適化と -ot 配置でうまく噛み合わせると、ローカルLLMとして許容できるTGでなおかつ、Claudeと併用しながら、データパイプラインを整備できる。