11月4日、llm-d.aiが「Serving Moonshot AI's Kimi K3.1 Pro with llm-d across TPUs and GPUs」と題した記事を公開した。2.8兆パラメータのMoEモデルをTPU・GPU混在のKubernetes環境で本番稼働させるとき、ボトルネックはモデルの精度でもハードウェアの絶対性能でもない。KVキャッシュをどこに置き、どのレプリカへ誰がルーティングするか——この記事はその問いに対する体系的な回答として読める。
2.8兆パラメータという壁
Moonshot AIのKimi K3.1 Pro(moonshotai/Kimi-K3.1-Pro)は、総パラメータ数約2.8兆(1トークンあたりのアクティブパラメータは約1040億)、コンテキスト長100万トークン、896のルーティング済みエキスパートを持つMixture-of-Experts(MoE)モデルだ。MoEとは、入力に応じて一部のサブネットワーク(エキスパート)のみを選択的に使うアーキテクチャで、全パラメータを常時使用しないため推論効率が高い。
問題はモデルの重みだけで単一マシンのHBM(High-Bandwidth Memory)容量を超える点にある。さらに100万トークンのKVキャッシュは加速度的にメモリを食い、マルチターンの会話セッションでは同一プレフィックスの再計算が各レプリカで繰り返され、プリフィル処理のスパイクがデコードのレイテンシを悪化させる。
これらの課題に対し、llm-dチームはInferact(vLLMをベースにした推論サーバー実装。llm-dのGPUトラックにおけるモデルサーバーとして機能する)およびRadixArk(SGLangベースの推論サーバー実装。llm-dのTPUトラックにおけるモデルサーバーとして機能する)と連携し、GKE上でのDay-0デプロイレシピを整備した。
llm-dが解決する4つのボトルネック
llm-d v0.10.0+ のエージェンティックサービングでは、以下の4機能を組み合わせる。
1. 状態を考慮したKVルーティング
llm-d-router(Endpoint Picker: EPP)は、各ワーカーレプリカからZMQでKVキャッシュイベントをリアルタイムに受信する。prefix-cache-affinity-filterとtoken-load-scorerの重み付き複合スコアを使い、マルチターンのセッションを、そのKVブロックをウォームで保持しているレプリカに固定ルーティングする("sticky until saturated"ポリシー)。これにより、プレフィックスの再計算が大幅に削減される。
2. 階層的KVキャッシュティアリング(HBM→ホストDRAM)
モデル重みとアクティブなアテンション状態のためにHBMを温存するため、追い出されたKVブロックをホストのCPUメモリへスピルオーバーさせる。GPUトラックではCPUOffloadingSpec(Grace LPDDR5X DRAM)、TPUトラックではSGLangのHiCache(--hicache-ratio=2でHBM容量の2倍)を利用する。
3. プリフィル/デコード分離(P/D Disaggregation)
長文コンテキストのプリフィルバーストがデコードのインタラクティビティを劣化させる問題に対し、プリフィルプールとデコードプールを専用トポロジに分離(例: 3P1D = 3プリフィルグループ + 1デコードグループ)する。TP=16、EP=8のテンソル・エキスパート並列と組み合わせることで、GPU・TPU両環境で長文コンテキスト下でも応答性を維持する。
4. 投機的デコード
Multi-Token Prediction(MTP)やドラフターチェックポイント(NEXTN / DFlash2)によるネイティブ設定サポートにより、複数トークンの一括デコードを高速化する。
具体的なデプロイ手順(GKE上)
デプロイレシピはすべてguides/models/kimi-k3-1に集約されており、HelmとKustomizeで構成される。
ステップ1: チェックポイントのステージング(1.56 TB)
MXFP4量子化済みの重みでも1.56 TBあり、通常のノードブートディスクには収まらない。GCSバケットに一度コピーし、GKE Volume PopulatorでReadOnlyManyのHyperdisk ML PVC(/modelsにマウント)として配布する設計だ。
ステップ2: llm-dルーターのデプロイ
HelmでルーターをインストールしてEPPを設定する。TPUトラックではmodelServers.type: sglang(blockSizeTokens: 128)、GPUトラックではP/D用のalways-disagg-pd-deciderとactive-request-scorerを組み合わせる。
ステップ3: モデルサーバーのデプロイ
加速器の種類に応じてKustomizeオーバーレイを選択する:
kubectl apply -n ${NAMESPACE} \
-k guides/models/kimi-k3-1/modelserver/${ACCELERATOR_TYPE}/${MODEL_SERVER}/
- GPUトラック(
gpu/vllm):3P1DDisaggregatedSetを構成。3つのマルチノードプリフィルLeaderWorkerSetグループ + 1デコードグループ。Multi-Node NVLinkとGKE DRANet RDMA上で動作。KV転送にNixlConnector、オフロードにOffloadingConnectorを使うMultiConnector構成。 - TPUトラック(
tpu/sglang): 2つのLeaderWorkerSetレプリカ(各4ポッド)でIronwood TPU v7x計32チップ / 64 TensorCoresを使用。TP=32 × EP=8、スパースMLA(pallas_tpu_mla_sparse)、FP8 KVキャッシュ(480Kコンテキスト)で動作。
ステップ4: 動作確認とロードテスト
kimi-k3-1-eppサービスへのスモークテスト後、同梱のinference-perf.yamlでマルチターン長文セッションの再現ベンチマークを実行できる。元記事ではこのYAMLを使ったロードテストによりKVルーティングの効果を検証することが推奨されている。ベンチマーク時の具体的なスループット数値は元記事内に記載はないが、構成の妥当性はこのステップで確認できる設計になっている。
設計上のポイント
llm-dのルーティング・スケジューリング・分離レイヤーはアクセラレーター・クラウド非依存として設計されている。今回はGKE上での構成だが、デバイス割り当てとKV転送コネクターを差し替えれば他環境にも適用できる。
2.8兆規模のMoEモデルを本番で動かす場合、モデル自体の精度よりもKVキャッシュをどこに置き、どのレプリカへルーティングするかがスループットとレイテンシの鍵になる。llm-dが提供するEPPベースのKVルーティングは、その判断をKubernetes上でリアルタイムに行うための実用的な仕組みだ。今回のレシピはその問題を体系化した構成例として、大規模MoEモデルの運用を検討するエンジニアにとって直接参照できる出発点になる。
詳細はServing Moonshot AI's Kimi K3.1 Pro with llm-d across TPUs and GPUsを参照していただきたい。




