[docs] Kimi-K3: widen the H200 High-Throughput recipe to 4x8 TP32/EP32 (#32834)

Co-authored-by: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
zijiexia
2026-07-29 17:18:56 -07:00
committed by GitHub
co-authored by Claude Opus 5
parent 6e48c13497
commit 3c9efaf3e1
2 changed files with 24 additions and 12 deletions
@@ -34,7 +34,7 @@ If you do not want to use a Docker image, reproduce the dependency installation
</Accordion>
Pick your hardware, then the deployment shape and operating point. Node count follows the hardware recipe (B200 2×8, GB200 4×4, H100 4×8, B300 1×8, H200 2×8, GB300 2×4, MI350X/MI355X 1×8), so it is not a separate choice.
Pick your hardware, then the deployment shape and operating point. Node count follows the hardware recipe (B200 2×8, GB200 4×4, H100 4×8, B300 1×8, H200 2×8 — 4×8 on Unified High-Throughput, GB300 2×4, MI350X/MI355X 1×8), so it is not a separate choice.
**PD Mode** — `Unified` serves prefill and decode together. `Prefill` / `Decode` split them into dedicated pools (see [PD disaggregation](#3-4-pd-disaggregation)); `Prefill` ships two strategies on the TP8 platforms, both chunked at 16k: `Default` (TP8) and `Long-Context` (`--pp-size 8 --tp-size 1`, see [Deep PP](#deep-pp-for-long-context-prefill)).
@@ -42,7 +42,7 @@ Pick your hardware, then the deployment shape and operating point. Node count fo
- **Low-Latency** — plain TP, no DCP. For chat.
- **Balanced** — the accuracy-preserving default: TP16/DCP16 on B200/GB200, TP8/DCP8 on B300/GB300, TP8 ROCm/AITER on MI35x.
- **High-Throughput** — the large-scale lane: pick a **Cluster Size** and **Large-Scale Preset** in the Playground ([details](#large-scale-presets)). On H100/H200: Balanced plus `extra_buffer_lazy`.
- **High-Throughput** — the large-scale lane: pick a **Cluster Size** and **Large-Scale Preset** in the Playground ([details](#large-scale-presets)). On H100: Balanced plus `extra_buffer_lazy`; on H200 the cell itself widens to 4×8 TP32/EP32 at `--mem-fraction-static 0.90`.
- **Long-Context** — B200 only: TP8/PP2 splits KV and KDA state across two pipeline stages.
**Spec Decode** — independent of the strategy: DSPARK layers onto any `pp_size == 1` recipe, proposing 7 draft tokens per step (tune in the Playground); DFLASH has no published draft checkpoint. Its win is largest on short interactive traffic and fades as the prompt grows.
@@ -151,7 +151,7 @@ Remaining kernel sources JIT once from the public `flashinfer` wheel (a few minu
| GB300 2×4 | TP8/DCP8 | MNNVL transport and cuMem auto-detected |
| B200 2×8 | TP16 (+DCP16); Long-Context TP8/PP2, 128K ctx, 8192 chunked prefill | DSPARK off on Long-Context (`pp_size == 1` required) |
| GB200 4×4 | TP16/DCP16 | MNNVL auto-detected |
| H200 2×8 | TP16/EP16 + symm-mem | same block on both ranks; export the cross-node NIC (`GLOO_SOCKET_IFNAME` / `NCCL_SOCKET_IFNAME`, `SGLANG_HOST_IP`); keep `NCCL_MNNVL_ENABLE=1 NCCL_CUMEM_ENABLE=1` |
| H200 2×8 (4×8 on Unified High-Throughput) | TP16/EP16 + symm-mem, Marlin + FlashMLA; High-Throughput widens to TP32/EP32 over 4 nodes at mem-frac 0.90 with `extra_buffer_lazy` | same block on every node; export the cross-node NIC (`GLOO_SOCKET_IFNAME` / `NCCL_SOCKET_IFNAME`, `SGLANG_HOST_IP`); keep `NCCL_MNNVL_ENABLE=1 NCCL_CUMEM_ENABLE=1` |
| H100 4×8 | TP32/EP32, Marlin + FlashMLA | SM90a build of the K3 image; pin NCCL/Gloo to the same NIC on all nodes; least post-weight headroom (80 GB) |
| MI350X/MI355X 1×8 | TP8 ROCm/AITER | AITER A8W4 FlyDSL MoE, Triton attention, graph bs up to 256; DSPARK supported |
@@ -11,14 +11,16 @@ export const config = {
modelName: "Kimi-K3",
// B300 (1×8 TP8), GB300 (2×4 TP8 MNNVL), B200 (2×8 TP16, or TP8/PP2 for
// Long-Context), GB200 (4×4 TP16 MNNVL), H200 (2×8 TP16/EP16), H100
// (4×8 TP32/EP32), and MI350X/MI355X (1×8 TP8) have serving recipes.
// Long-Context), GB200 (4×4 TP16 MNNVL), H200 (2×8 TP16/EP16, or 4×8 TP32/EP32
// for High-Throughput), H100 (4×8 TP32/EP32), and MI350X/MI355X (1×8 TP8) have
// serving recipes.
supportedHardware: ["b300", "gb300", "b200", "gb200", "h200", "h100", "mi350x", "mi355x"],
// Single checkpoint and a single shipped quantization (MXFP4), so neither is a
// reader-facing axis. Node count is fixed by the hardware recipe (B200 2x8,
// H100 4x8, B300 1x8, H200 2x8, GB200 4x4, GB300 2x4,
// MI350X/MI355X 1x8), so it rides on the cell rather than on a selector.
// H100 4x8, B300 1x8, H200 2x8 — 4x8 on Unified High-Throughput, GB200 4x4,
// GB300 2x4, MI350X/MI355X 1x8), so it rides on the cell rather than on a
// selector.
matchDims: [
{
id: "pdMode",
@@ -1004,26 +1006,35 @@ export const config = {
],
},
{
// Throughput-tuned (perf-command: mem-frac 0.90, graph-bs 256, extra_buffer_lazy → max_running 98).
// The one H200 cell that widens past a single pair of nodes. As run — with
// DSPARK and HiCache L1+L2 layered on, at ratio 0.058 — the static
// allocation leaves 12.54 GB free per GPU and 1940352 KV tokens.
match: { hw: "h200", pdMode: "unified", strategy: "high-throughput" },
nnodes: 2,
nnodes: 4,
verified: false,
verificationStatus: "in-progress",
env: [
"NCCL_MNNVL_ENABLE=1",
"NCCL_CUMEM_ENABLE=1",
"PYTORCH_CUDA_ALLOC_CONF=expandable_segments:True",
"SGLANG_ENABLE_TP_MEMORY_INBALANCE_CHECK=0",
"SGLANG_K3_ATTN_RES_MODE=jit",
"SGLANG_MOE_FUSED_GATE_RADIX=1",
"SGLANG_HOST_IP={{LOCAL_IP}}",
"NCCL_SOCKET_IFNAME={{NETWORK_IFACE}}",
"GLOO_SOCKET_IFNAME={{NETWORK_IFACE}}",
],
flags: [
"--trust-remote-code",
"--model-path {{MODEL_NAME}}",
"--tp-size 16",
"--ep-size 16",
"--tp-size 32",
"--ep-size 32",
"--moe-runner-backend marlin",
"--decode-attention-backend flashmla",
"--enable-symm-mem",
"--mem-fraction-static 0.90",
"--mamba-radix-cache-strategy extra_buffer_lazy",
"--dist-timeout 3600",
"--reasoning-parser kimi_k3",
"--tool-call-parser kimi_k3",
"--host {{HOST_IP}}",
@@ -1912,7 +1923,8 @@ export const config = {
"Set This node IP separately on each node; use the same cross-node NIC name on all four nodes.",
],
h200: [
"Multi-node K3 needs the cross-node NIC pinned on BOTH ranks:",
"Low-Latency and Balanced run TP16/EP16 across 2 nodes; Unified High-Throughput widens to TP32/EP32 across 4.",
"Multi-node K3 needs the cross-node NIC pinned on EVERY node:",
" GLOO_SOCKET_IFNAME=<your-nic> # e.g. bond0",
" NCCL_SOCKET_IFNAME=<your-nic> # force NCCL off kube-ipvs0",
" SGLANG_HOST_IP=<this-node-ip>",