From 8fe339afa9a7dd805badcf29f645b6a187e297fb Mon Sep 17 00:00:00 2001 From: Sirra Date: Tue, 11 Aug 2026 13:02:16 +0530 Subject: [PATCH 1/4] [AMD] GLM 5.2 MXFP4 SGLANG COOKBOOK Signed-off-by: Sirra --- docs/cookbook/autoregressive/GLM/GLM-5.2.mdx | 10 ++- docs/src/snippets/configs/zai-org/glm-5.2.jsx | 70 +++++++++++++++++++ 2 files changed, 78 insertions(+), 2 deletions(-) diff --git a/docs/cookbook/autoregressive/GLM/GLM-5.2.mdx b/docs/cookbook/autoregressive/GLM/GLM-5.2.mdx index e515d73c6f17..8099a18f1024 100644 --- a/docs/cookbook/autoregressive/GLM/GLM-5.2.mdx +++ b/docs/cookbook/autoregressive/GLM/GLM-5.2.mdx @@ -70,7 +70,7 @@ import { Playground } from "/src/snippets/_playground.jsx"; ## 1. Model Introduction -**GLM-5.2** is Z.ai's flagship Mixture-of-Experts model built on **DeepSeek Sparse Attention (DSA)**: a lightning indexer selects a sparse set of key tokens per query (top-2048), so attention cost stays near-constant as context grows. It ships in two precisions — **FP8** (`zai-org/GLM-5.2-FP8`) and full **BF16** (`zai-org/GLM-5.2`) — both with **78 transformer layers**, **256 routed experts** (8 active per token), a **1M-token context window**, and a single **MTP (Multi-Token Prediction)** layer for built-in EAGLE-style speculative decoding. FP8 is the recommended deployment; BF16 (~1.5 TB) needs an 8×B300 node or a multi-node setup. For Blackwell, NVIDIA also publishes an **NVFP4** build (`nvidia/GLM-5.2-NVFP4`) that quantizes only the MoE experts' linear weights and activations to 4-bit (the shared expert stays unquantized), holding accuracy within ~1 point of the FP8 baseline on GPQA Diamond, SciCode, and IFBench. +**GLM-5.2** is Z.ai's flagship Mixture-of-Experts model built on **DeepSeek Sparse Attention (DSA)**: a lightning indexer selects a sparse set of key tokens per query (top-2048), so attention cost stays near-constant as context grows. It ships in two precisions — **FP8** (`zai-org/GLM-5.2-FP8`) and full **BF16** (`zai-org/GLM-5.2`) — both with **78 transformer layers**, **256 routed experts** (8 active per token), a **1M-token context window**, and a single **MTP (Multi-Token Prediction)** layer for built-in EAGLE-style speculative decoding. FP8 is the recommended deployment; BF16 (~1.5 TB) needs an 8×B300 node or a multi-node setup. For Blackwell, NVIDIA also publishes an **NVFP4** build (`nvidia/GLM-5.2-NVFP4`) that quantizes only the MoE experts' linear weights and activations to 4-bit (the shared expert stays unquantized), holding accuracy within ~1 point of the FP8 baseline on GPQA Diamond, SciCode, and IFBench. For AMD MI355X (gfx950), AMD publishes an **MXFP4** build (`amd/GLM-5.2-MXFP4`, Quark-quantized) — see the AMD GPUs configuration tip below; this recipe is inferred from the validated `amd/GLM-5.1-MXFP4` MI355X recipe and not yet benchmarked on GLM-5.2 (`verified: false`). @@ -96,12 +96,17 @@ import { Playground } from "/src/snippets/_playground.jsx"; + + + + +
MoE · DSA · 256 experts (top-8) · MTP · NVFP4 1,048,576
GLM-5.2-MXFP4MoE · DSA · 256 experts (top-8) · MTP · MXFP41,048,576
**Recommended generation:** `temperature=1.0`, `top_p=0.95` (the checkpoint's `generation_config.json` defaults; informational — do not hardcode in client code). -**Resources:** [GLM-5.2-FP8](https://huggingface.co/zai-org/GLM-5.2-FP8) · [GLM-5.2 (BF16)](https://huggingface.co/zai-org/GLM-5.2) · [GLM-5.2-NVFP4](https://huggingface.co/nvidia/GLM-5.2-NVFP4). +**Resources:** [GLM-5.2-FP8](https://huggingface.co/zai-org/GLM-5.2-FP8) · [GLM-5.2 (BF16)](https://huggingface.co/zai-org/GLM-5.2) · [GLM-5.2-NVFP4](https://huggingface.co/nvidia/GLM-5.2-NVFP4) · [GLM-5.2-MXFP4](https://huggingface.co/amd/GLM-5.2-MXFP4). ## 2. Configuration Tips @@ -114,6 +119,7 @@ import { Playground } from "/src/snippets/_playground.jsx"; - **Chunked-prefill size is regime-dependent.** At long input (8K+) the default `--chunked-prefill-size 2048` is too small and leaves the balanced point prefill-bound (queueing dominates TTFT). Raising it to `--chunked-prefill-size 32768` on the balanced recipe gave roughly **+34–78% output throughput and −39–59% TTFT** on 8×H200 and 8×B200 (8K-in / 1K-out) in our testing. It is **neutral for high-throughput** (decode-bound there) — keep the default. `--max-running-requests` tracks KV capacity, not a tuning free-for-all: ~60–90 concurrent 8K+1K FP8 requests fit on a single 8-GPU node, so pin balanced near `--max-running-requests 80` and let high-throughput run wider. - **AMD GPUs (MI300X / MI325X / MI355X).** FP8 (`zai-org/GLM-5.2-FP8`) runs single-node at `tp=8` on all three. BF16 (`zai-org/GLM-5.2`, ~1.51 TB) only fits single-node on **MI325X** (2 TB HBM) and **MI355X** (2.3 TB); **MI300X** (1.5 TB) cannot hold the BF16 weights plus KV cache on one node, so use FP8 there (or a multi-node BF16 layout once validated). Use the DSA tilelang backend (`--dsa-prefill-backend tilelang --dsa-decode-backend tilelang`) and add `--chunked-prefill-size 131072` plus `--watchdog-timeout 1200` (20 min for weight loading). FP8 uses about half the memory of BF16 (~89 GB/GPU vs ~175 GB/GPU). GLM-5.2 and DeepSeek-V3.2 share the same model structure; for other DSA / HiSparse tips see the [DeepSeek-V3.2 cookbook](../DeepSeek/DeepSeek-V3_2). +- **MI355X MXFP4 (gfx950-only).** AMD publishes a Quark-quantized **`amd/GLM-5.2-MXFP4`** build for MI355X; MXFP4 is **not** supported on MI300X/MI325X (gfx942). It needs `--trust-remote-code` (Quark's custom quant config) and runs at `tp=4` (the 4-bit MoE weights fit a 4-GPU slice) with `--kv-cache-dtype fp8_e4m3`, the same DSA tilelang backends, `--chunked-prefill-size`, and `--watchdog-timeout` as the FP8/BF16 recipes above. This recipe is carried over from the validated `amd/GLM-5.1-MXFP4` MI355X deployment (same DSA architecture family) and has not yet been benchmarked on GLM-5.2, so the Deploy panel marks it unverified. **gfx950 block-FP8 accuracy: fixed as of the pinned MI355X image (`v0.5.13.post1-rocm720-mi35x-20260618`).** Earlier SGLang ROCm images miscompiled AMD aiter's `gemm_a8w8_blockscale_bpreshuffle` GEMM on gfx950 (ROCm 7.2): the error was small per layer but compounded across all 78 layers and silently corrupted output — in-context reasoning broke (GSM8K ≈ 0) while short factual prompts still looked fine. The root cause was a gfx950/ROCm-7.2 miscompile of the CK kernel (a packed illegal-type FMA that relied on an LLVM coercion pass removed in ROCm 7.2; non-deterministic wrong rows near tile boundaries). This is resolved in the pinned image and newer: GLM-5.2-FP8 on MI350X/MI355X (gfx950) was re-validated at TP4 and TP8 — **GSM8K ≈ 0.96 (0% invalid)** and **15/15 needle-in-haystack retrieval to ~118K tokens**. **MI300X / MI325X (gfx942) were never affected.** If you must run an older image, treat gfx950 FP8 output as unverified. Background: [sgl-project/sglang#28685](https://github.com/sgl-project/sglang/issues/28685) (analysis) and the upstream CK fix [ROCm/rocm-libraries#8639](https://github.com/ROCm/rocm-libraries/pull/8639) (scalar FMA + accumulator anchor; restores correctness and determinism at -O3). diff --git a/docs/src/snippets/configs/zai-org/glm-5.2.jsx b/docs/src/snippets/configs/zai-org/glm-5.2.jsx index 945fa2a03067..c18d1b2d3f37 100644 --- a/docs/src/snippets/configs/zai-org/glm-5.2.jsx +++ b/docs/src/snippets/configs/zai-org/glm-5.2.jsx @@ -17,6 +17,7 @@ export const config = { { id: "fp8", label: "FP8" }, { id: "bf16", label: "BF16" }, { id: "nvfp4", label: "NVFP4" }, + { id: "mxfp4", label: "MXFP4" }, ], strategies: [ { id: "low-latency", label: "Low-Latency" }, @@ -32,6 +33,7 @@ export const config = { "default|fp8": "zai-org/GLM-5.2-FP8", "default|bf16": "zai-org/GLM-5.2", "default|nvfp4": "nvidia/GLM-5.2-NVFP4", + "default|mxfp4": "amd/GLM-5.2-MXFP4", }, placeholders: { @@ -95,6 +97,7 @@ sgl-eval run aime25 \\ gb300: "lmsysorg/sglang:latest", b300: "lmsysorg/sglang:latest", mi355x: "lmsysorg/sglang-rocm:v0.5.13.post1-rocm720-mi35x-20260618", + "mi355x|mxfp4": "lmsysorg/sglang-rocm:v0.5.16-rocm720-mi35x-20260728", mi325x: "lmsysorg/sglang-rocm:v0.5.13.post1-rocm700-mi30x-20260616", mi300x: "lmsysorg/sglang-rocm:v0.5.13.post1-rocm700-mi30x-20260616", }, @@ -994,6 +997,73 @@ sgl-eval run aime25 \\ "--port {{PORT}}", ], }, + // ==================================================================== + // AMD MI355X + MXFP4 — amd/GLM-5.2-MXFP4 (Quark, gfx950-only; MXFP4 is not + // supported on MI300X/MI325X/gfx942). TP4: the 4-bit MoE weights fit a + // 4-GPU slice, mirroring the amd/GLM-5.1-MXFP4 MI355X recipe (same DSA + // architecture family) — --trust-remote-code (Quark custom quant config) + // and --kv-cache-dtype fp8_e4m3 both come from that precedent. Pinned to a + // newer image (v0.5.16, see dockerImages["mi355x|mxfp4"]) than the FP8/BF16 + // mi355x cells. No MTP: same AMD spec-decode restriction as the FP8/BF16 + // cells above. Not yet benchmarked for GLM-5.2 → verified:false. + // ==================================================================== + { + match: { hw: "mi355x", variant: "default", quant: "mxfp4", strategy: "low-latency", nodes: "single" }, + verified: false, + env: [], + flags: [ + "--trust-remote-code", + "--model-path {{MODEL_NAME}}", + "--tp 4", + "--kv-cache-dtype fp8_e4m3", + "--dsa-prefill-backend tilelang", + "--dsa-decode-backend tilelang", + "--chunked-prefill-size 131072", + "--mem-fraction-static 0.80", + "--watchdog-timeout 1200", + "--host {{HOST_IP}}", + "--port {{PORT}}", + ], + }, + { + match: { hw: "mi355x", variant: "default", quant: "mxfp4", strategy: "balanced", nodes: "single" }, + verified: false, + env: [], + flags: [ + "--trust-remote-code", + "--model-path {{MODEL_NAME}}", + "--tp 4", + "--kv-cache-dtype fp8_e4m3", + "--dsa-prefill-backend tilelang", + "--dsa-decode-backend tilelang", + "--chunked-prefill-size 32768", + "--mem-fraction-static 0.85", + "--cuda-graph-max-bs 128", + "--max-running-requests 80", + "--watchdog-timeout 1200", + "--host {{HOST_IP}}", + "--port {{PORT}}", + ], + }, + { + match: { hw: "mi355x", variant: "default", quant: "mxfp4", strategy: "high-throughput", nodes: "single" }, + verified: false, + env: [], + flags: [ + "--trust-remote-code", + "--model-path {{MODEL_NAME}}", + "--tp 4", + "--kv-cache-dtype fp8_e4m3", + "--dsa-prefill-backend tilelang", + "--dsa-decode-backend tilelang", + "--mem-fraction-static 0.85", + "--cuda-graph-max-bs 256", + "--max-running-requests 256", + "--watchdog-timeout 1200", + "--host {{HOST_IP}}", + "--port {{PORT}}", + ], + }, { match: { hw: "mi325x", variant: "default", quant: "fp8", strategy: "low-latency", nodes: "single" }, verified: false, From 839589e837fbef70125eb597c58327c336749e42 Mon Sep 17 00:00:00 2001 From: Sirra Date: Tue, 11 Aug 2026 15:04:44 +0530 Subject: [PATCH 2/4] [AMD] GLM 5.2 MXFP4 SGLANG COOKBOOK Signed-off-by: Sirra --- docs/src/snippets/configs/zai-org/glm-5.2.jsx | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/docs/src/snippets/configs/zai-org/glm-5.2.jsx b/docs/src/snippets/configs/zai-org/glm-5.2.jsx index c18d1b2d3f37..43db8693ac64 100644 --- a/docs/src/snippets/configs/zai-org/glm-5.2.jsx +++ b/docs/src/snippets/configs/zai-org/glm-5.2.jsx @@ -998,9 +998,8 @@ sgl-eval run aime25 \\ ], }, // ==================================================================== - // AMD MI355X + MXFP4 — amd/GLM-5.2-MXFP4 (Quark, gfx950-only; MXFP4 is not - // supported on MI300X/MI325X/gfx942). TP4: the 4-bit MoE weights fit a - // 4-GPU slice, mirroring the amd/GLM-5.1-MXFP4 MI355X recipe (same DSA + // AMD MI355X + MXFP4 — amd/GLM-5.2-MXFP4 (Quark). TP4: the 4-bit MoE + // weights fit a 4-GPU slice, mirroring the amd/GLM-5.1-MXFP4 MI355X recipe (same DSA // architecture family) — --trust-remote-code (Quark custom quant config) // and --kv-cache-dtype fp8_e4m3 both come from that precedent. Pinned to a // newer image (v0.5.16, see dockerImages["mi355x|mxfp4"]) than the FP8/BF16 From 76af9cef0d90f65260556abc4c6748ea7f2488b2 Mon Sep 17 00:00:00 2001 From: Sirra Date: Tue, 11 Aug 2026 15:10:40 +0530 Subject: [PATCH 3/4] [AMD] GLM 5.2 MXFP4 SGLANG COOKBOOK Signed-off-by: Sirra --- docs/cookbook/autoregressive/GLM/GLM-5.2.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/cookbook/autoregressive/GLM/GLM-5.2.mdx b/docs/cookbook/autoregressive/GLM/GLM-5.2.mdx index 8099a18f1024..3b2444cfc801 100644 --- a/docs/cookbook/autoregressive/GLM/GLM-5.2.mdx +++ b/docs/cookbook/autoregressive/GLM/GLM-5.2.mdx @@ -119,7 +119,7 @@ import { Playground } from "/src/snippets/_playground.jsx"; - **Chunked-prefill size is regime-dependent.** At long input (8K+) the default `--chunked-prefill-size 2048` is too small and leaves the balanced point prefill-bound (queueing dominates TTFT). Raising it to `--chunked-prefill-size 32768` on the balanced recipe gave roughly **+34–78% output throughput and −39–59% TTFT** on 8×H200 and 8×B200 (8K-in / 1K-out) in our testing. It is **neutral for high-throughput** (decode-bound there) — keep the default. `--max-running-requests` tracks KV capacity, not a tuning free-for-all: ~60–90 concurrent 8K+1K FP8 requests fit on a single 8-GPU node, so pin balanced near `--max-running-requests 80` and let high-throughput run wider. - **AMD GPUs (MI300X / MI325X / MI355X).** FP8 (`zai-org/GLM-5.2-FP8`) runs single-node at `tp=8` on all three. BF16 (`zai-org/GLM-5.2`, ~1.51 TB) only fits single-node on **MI325X** (2 TB HBM) and **MI355X** (2.3 TB); **MI300X** (1.5 TB) cannot hold the BF16 weights plus KV cache on one node, so use FP8 there (or a multi-node BF16 layout once validated). Use the DSA tilelang backend (`--dsa-prefill-backend tilelang --dsa-decode-backend tilelang`) and add `--chunked-prefill-size 131072` plus `--watchdog-timeout 1200` (20 min for weight loading). FP8 uses about half the memory of BF16 (~89 GB/GPU vs ~175 GB/GPU). GLM-5.2 and DeepSeek-V3.2 share the same model structure; for other DSA / HiSparse tips see the [DeepSeek-V3.2 cookbook](../DeepSeek/DeepSeek-V3_2). -- **MI355X MXFP4 (gfx950-only).** AMD publishes a Quark-quantized **`amd/GLM-5.2-MXFP4`** build for MI355X; MXFP4 is **not** supported on MI300X/MI325X (gfx942). It needs `--trust-remote-code` (Quark's custom quant config) and runs at `tp=4` (the 4-bit MoE weights fit a 4-GPU slice) with `--kv-cache-dtype fp8_e4m3`, the same DSA tilelang backends, `--chunked-prefill-size`, and `--watchdog-timeout` as the FP8/BF16 recipes above. This recipe is carried over from the validated `amd/GLM-5.1-MXFP4` MI355X deployment (same DSA architecture family) and has not yet been benchmarked on GLM-5.2, so the Deploy panel marks it unverified. +- **MI355X MXFP4 (gfx950-only).** AMD publishes a Quark-quantized **`amd/GLM-5.2-MXFP4`** build for MI355X. It needs `--trust-remote-code` (Quark's custom quant config) and runs at `tp=4` (the 4-bit MoE weights fit a 4-GPU slice) with `--kv-cache-dtype fp8_e4m3`, the same DSA tilelang backends, `--chunked-prefill-size`, and `--watchdog-timeout` as the FP8/BF16 recipes above. This recipe is carried over from the validated `amd/GLM-5.1-MXFP4` MI355X deployment (same DSA architecture family) and has not yet been benchmarked on GLM-5.2, so the Deploy panel marks it unverified. **gfx950 block-FP8 accuracy: fixed as of the pinned MI355X image (`v0.5.13.post1-rocm720-mi35x-20260618`).** Earlier SGLang ROCm images miscompiled AMD aiter's `gemm_a8w8_blockscale_bpreshuffle` GEMM on gfx950 (ROCm 7.2): the error was small per layer but compounded across all 78 layers and silently corrupted output — in-context reasoning broke (GSM8K ≈ 0) while short factual prompts still looked fine. The root cause was a gfx950/ROCm-7.2 miscompile of the CK kernel (a packed illegal-type FMA that relied on an LLVM coercion pass removed in ROCm 7.2; non-deterministic wrong rows near tile boundaries). This is resolved in the pinned image and newer: GLM-5.2-FP8 on MI350X/MI355X (gfx950) was re-validated at TP4 and TP8 — **GSM8K ≈ 0.96 (0% invalid)** and **15/15 needle-in-haystack retrieval to ~118K tokens**. **MI300X / MI325X (gfx942) were never affected.** If you must run an older image, treat gfx950 FP8 output as unverified. Background: [sgl-project/sglang#28685](https://github.com/sgl-project/sglang/issues/28685) (analysis) and the upstream CK fix [ROCm/rocm-libraries#8639](https://github.com/ROCm/rocm-libraries/pull/8639) (scalar FMA + accumulator anchor; restores correctness and determinism at -O3). From fe5a7be36cc73d5533940f1ef002b42275428cea Mon Sep 17 00:00:00 2001 From: giovanniguastiamd Date: Tue, 11 Aug 2026 12:37:12 +0200 Subject: [PATCH 4/4] [AMD] GLM 5.2 MXFP4: add MTP 3-1-4 (mtp-314) speculative-decoding cell for MI355X --- docs/src/snippets/configs/zai-org/glm-5.2.jsx | 2478 +++++++++-------- 1 file changed, 1258 insertions(+), 1220 deletions(-) diff --git a/docs/src/snippets/configs/zai-org/glm-5.2.jsx b/docs/src/snippets/configs/zai-org/glm-5.2.jsx index 43db8693ac64..d5ee97d6bb53 100644 --- a/docs/src/snippets/configs/zai-org/glm-5.2.jsx +++ b/docs/src/snippets/configs/zai-org/glm-5.2.jsx @@ -1,1220 +1,1258 @@ -// Single `export const config` literal — no spreads/calls/IIFE (Mintlify re-evals at hydration). -// Cells are denormalized: no `--nnodes`/`--node-rank`/`--dist-init-addr`/`--host`/`--port` literals — engine injects them. - -export const config = { - modelName: "GLM-5.2", - - supportedHardware: [ - "h200", "b200", "gb300", "b300", - "mi355x", "mi325x", "mi300x", - ], - - // Single released checkpoint — no size/mode split. - variants: [ - { id: "default", label: "GLM-5.2", subtitle: "MoE · DSA" }, - ], - quantizations: [ - { id: "fp8", label: "FP8" }, - { id: "bf16", label: "BF16" }, - { id: "nvfp4", label: "NVFP4" }, - { id: "mxfp4", label: "MXFP4" }, - ], - strategies: [ - { id: "low-latency", label: "Low-Latency" }, - { id: "balanced", label: "Balanced" }, - { id: "high-throughput", label: "High-Throughput" }, - ], - nodesOptions: [ - { id: "single", label: "Single Node" }, - { id: "multi-2", label: "Multi-Nodes" }, - ], - - modelNames: { - "default|fp8": "zai-org/GLM-5.2-FP8", - "default|bf16": "zai-org/GLM-5.2", - "default|nvfp4": "nvidia/GLM-5.2-NVFP4", - "default|mxfp4": "amd/GLM-5.2-MXFP4", - }, - - placeholders: { - HOST_IP: { target: "command", label: "Bind host", default: "0.0.0.0" }, - PORT: { target: "command", label: "Bind port", default: "30000" }, - NODE0_IP: { target: "command", label: "Head node IP", default: "" }, - NODE_RANK: { target: "command", label: "This node rank", default: "" }, - CURL_HOST: { target: "curl", label: "Server host", default: "localhost" }, - CURL_PORT: { target: "curl", label: "Server port", default: "30000" }, - }, - - curl: `curl http://{{CURL_HOST}}:{{CURL_PORT}}/v1/chat/completions \\ --H 'Content-Type: application/json' \\ --d '{ "model": "{{MODEL_NAME}}", "messages": [{"role":"user","content":"Hello"}] }'`, - - // Reproduce commands for the Benchmark card's "⚡ Reproduce" modal. - benchmarkCommands: { - speed: -`python3 -m sglang.bench_serving \\ - --backend sglang \\ - --host {{CURL_HOST}} --port {{CURL_PORT}} \\ - --model {{MODEL_NAME}} \\ - --dataset-name {{DATASET}} \\ - --random-input-len {{ISL}} --random-output-len {{OSL}} \\ - --random-range-ratio 1.0 \\ - --num-prompts {{NUM_PROMPTS}} --max-concurrency {{MAX_CONCURRENCY}} \\ - --warmup-requests 64 --flush-cache`, - accuracy: { - gsm8k_pct: -`# To install sgl-eval: pip install git+https://github.com/sgl-project/sgl-eval -sgl-eval run gsm8k \\ - --base-url http://{{CURL_HOST}}:{{CURL_PORT}}/v1 \\ - --num-threads 32`, - aime25_pct: -`# To install sgl-eval: pip install git+https://github.com/sgl-project/sgl-eval -sgl-eval run aime25 \\ - --model {{MODEL_NAME}} --api-key \\ - --n-repeats 16 --max-tokens 64000 \\ - --temperature 1.0 --top-p 0.95 --thinking \\ - --out-dir /sgl-workspace/logs \\ - --base-url http://{{CURL_HOST}}:{{CURL_PORT}}/v1`, - }, - numPromptsByConc: { 1: 8, 16: 64, 64: 128, 256: 512, 1024: 2048, 4096: 8192 }, - }, - - // Per-variant accuracy applied to every cell; per-cell `accuracy` overrides. - // Both measured via sgl-eval (thinking mode) on H200. aime25 = pass@1 avg-of-16 - // (n-repeats 16, max-tokens 64000, temp 1.0, top-p 0.95); pass@16 100%, majority@16 93.3%. - defaultAccuracy: { - default: { gsm8k_pct: 98.2, aime25_pct: 87.7 }, - }, - - accuracyLabels: [ - ["aime25_pct", "AIME25", "%"], - ["gsm8k_pct", "GSM8K (1-shot)", "%"], - ], - - dockerImages: { - h200: "lmsysorg/sglang:latest", - b200: "lmsysorg/sglang:latest", - gb300: "lmsysorg/sglang:latest", - b300: "lmsysorg/sglang:latest", - mi355x: "lmsysorg/sglang-rocm:v0.5.13.post1-rocm720-mi35x-20260618", - "mi355x|mxfp4": "lmsysorg/sglang-rocm:v0.5.16-rocm720-mi35x-20260728", - mi325x: "lmsysorg/sglang-rocm:v0.5.13.post1-rocm700-mi30x-20260616", - mi300x: "lmsysorg/sglang-rocm:v0.5.13.post1-rocm700-mi30x-20260616", - }, - - github: { - cookbookModel: "zai-org/glm-5.2", - }, - - playgroundFeatures: { - - // ----- Card 1: "Attention Parallelism" ----- - // DSA prefill Context Parallelism (CP) splits the long-prefill attention across - // `cp` ranks — runs on Hopper (H200) and Blackwell (B200/GB300/B300). - // CP sizes auto-gate in the engine to the runtime derivation - // attn_cp_size = tp/dp (a user-passed --attn-cp-size is overridden). - // CP is single-machine only (tp_size <= 8). Interleave CP + DP-Attention - // currently fails the runtime's dp_size == 1 assert but is allowed here - // with a warning (combined support is planned upstream). - // Strategy knob: interleave (ex round-robin-split) is the layout verified - // here and the default; zigzag (ex in-seq-split) is exposed as an - // experiment — the runtime auto-configures deepep + ep=tp for it and - // restricts it to batch_size=1 (long-context single-request runs). - attention: { - knobs: [ - { id: "tp", label: "TP", values: [null, 4, 8] }, - { id: "cp", label: "CP (DSA prefill)", - values: [null, { value: 1, label: "Off" }, 4, 8], - disable: [ - { when: { hw: ["mi355x", "mi325x", "mi300x"] }, - reason: "The ROCm DSA-CP path is not yet validated on AMD (MI300X/MI325X/MI355X) — keep CP off there for now." }, - { when: { nodes: ["multi-2"] }, - reason: "Prefill Context Parallel is single-machine only (SGLang asserts tp_size <= 8; cross-machine CP has precision issues)." }, - ] }, - { id: "cpStrategy", label: "CP Strategy", - values: [ - null, - "interleave", - { value: "zigzag", label: "zigzag (experimental)" }, - ], - disable: [ - { when: { hw: ["mi355x", "mi325x", "mi300x"] }, - reason: "The ROCm DSA-CP path is not yet validated on AMD (MI300X/MI325X/MI355X) — keep CP off there for now." }, - { when: { nodes: ["multi-2"] }, - reason: "Prefill Context Parallel is single-machine only (SGLang asserts tp_size <= 8; cross-machine CP has precision issues)." }, - ] }, - { id: "dpAttn", label: "DP-Attention", - values: [null, false, 4, 8], - labels: { "auto": "Auto", "false": "Off" } }, - ], - }, - - // ----- Card 2: "MoE Parallelism" ----- - moe: { - backend: { - options: [ - { id: null, label: "Inherited" }, - { id: "deepep", label: "DeepEP", flags: ["--moe-a2a-backend deepep"] }, - ], - }, - ep: { label: "EP", values: [null, 4, 8] }, - }, - - // ----- Card 3: "Parsers" ----- - parsers: { - items: [ - { id: "reasoning", label: "Reasoning Parser", flag: "--reasoning-parser glm45" }, - { id: "toolCall", label: "Tool Call Parser", flag: "--tool-call-parser glm47" }, - ], - }, - - // ----- Card 4: "Speculative Decoding" ----- - // GLM-5.2 ships a single MTP (nextn) layer; index_share_for_mtp_iteration reuses the - // DSA indexer topk across draft steps (topk==1 only). - speculative: { - options: [ - { id: "current", label: "Inherited from base" }, - { id: "off", label: "Off (greedy)" }, - { id: "mtp-516", label: "EAGLE / MTP 5-1-6 (low-latency)", - flags: ["--speculative-algorithm EAGLE", "--speculative-num-steps 5", - "--speculative-eagle-topk 1", "--speculative-num-draft-tokens 6"], - disable: { hw: ["mi355x", "mi325x", "mi300x"] }, - disableReason: "MTP/EAGLE speculative decoding is not yet validated on AMD ROCm (MI300X/MI325X/MI355X): the gfx950 spec-decode draft kernel is not yet validated and at --speculative-num-steps > 3 hits a separate build issue; the DSA nextn draft path is CUDA-only." }, - { id: "mtp-112", label: "EAGLE / MTP 1-1-2 (balanced)", - flags: ["--speculative-algorithm EAGLE", "--speculative-num-steps 1", - "--speculative-eagle-topk 1", "--speculative-num-draft-tokens 2"], - disable: { hw: ["mi355x", "mi325x", "mi300x"] }, - disableReason: "MTP/EAGLE speculative decoding is not yet validated on AMD ROCm (MI300X/MI325X/MI355X): the gfx950 spec-decode draft kernel is not yet validated and at --speculative-num-steps > 3 hits a separate build issue; the DSA nextn draft path is CUDA-only." }, - ], - }, - - // ----- Card 5: "PD Disaggregation" ----- - // GLM-5.2 is a DSA model (same family as DeepSeek-V3.2/V4) and supports - // prefill/decode disaggregation. Owns the `--disaggregation-*` flags; the - // engine also pins role-specific serving ports (spaced apart) so prefill + - // decode don't collide on one host. - pdDisagg: { - modes: [ - { id: "off", label: "Off" }, - { id: "prefill", label: "Prefill role" }, - { id: "decode", label: "Decode role" }, - ], - transferBackends: [ - // Mooncake (recommended). The NCCL/MNNVL env is only needed on the - // NVLink-multinode Grace-Blackwell platform (GB300 here). - { id: "mooncake", label: "Mooncake", - env: [ - "NCCL_MNNVL_ENABLE=1", - "NCCL_CUMEM_ENABLE=1", - "SGLANG_MOONCAKE_CUSTOM_MEM_POOL=True", - "MC_FORCE_MNNVL=1", - ], - envWhen: { hw: ["gb300"] } }, - { id: "nixl", label: "NiXL" }, - ], - // No IB-device knob: mooncake auto-detects the HCA. Pass - // --disaggregation-ib-device only if discovery picks the wrong NIC - // (see Configuration Tips). - // Router fronting the prefill + decode roles; substitute /. - router: { - port: 8000, - command: -`python3 -m sglang_router.launch_router \\ - --pd-disaggregation \\ - --prefill http://:{{PREFILL_PORT}} \\ - --decode http://:{{DECODE_PORT}} \\ - --host 0.0.0.0 --port {{ROUTER_PORT}} \\ - --disable-circuit-breaker \\ - --health-check-interval-secs 999999`, - }, - }, - - // ----- Card 6: "Hierarchical KV Cache" ----- - hicache: { - backends: [ - { id: null, label: "Auto" }, - { id: "file", label: "File" }, - { id: "mooncake", label: "Mooncake" }, - ], - writePolicies: [ - { id: "auto", label: "Auto" }, - { id: "write_through", label: "Write-through" }, - { id: "write_back", label: "Write-back" }, - ], - }, - }, - - cells: [ - // ==================================================================== - // H200 + FP8 (Hopper) — TP8. CP (DSA prefill) verified here. - // ==================================================================== - { - match: { hw: "h200", variant: "default", quant: "fp8", strategy: "low-latency", nodes: "single" }, - verified: true, - env: [], - flags: [ - "--model-path {{MODEL_NAME}}", - "--tp 8", - "--speculative-algorithm EAGLE", - "--speculative-num-steps 5", - "--speculative-eagle-topk 1", - "--speculative-num-draft-tokens 6", - "--mem-fraction-static 0.8", - "--host {{HOST_IP}}", - "--port {{PORT}}", - ], - }, - { - match: { hw: "h200", variant: "default", quant: "fp8", strategy: "balanced", nodes: "single" }, - verified: true, - env: [], - flags: [ - "--model-path {{MODEL_NAME}}", - "--tp 8", - "--dp 8", - "--enable-dp-attention", - "--moe-a2a-backend deepep", - "--speculative-algorithm EAGLE", - "--speculative-num-steps 1", - "--speculative-eagle-topk 1", - "--speculative-num-draft-tokens 2", - "--mem-fraction-static 0.85", - // Large chunked-prefill is the dominant balanced lever (prefill-bound at this - // concurrency); max-running tracks KV capacity (~60-80 for 8K+1K reqs on 8xH200). - "--chunked-prefill-size 32768", - "--max-running-requests 256", - "--host {{HOST_IP}}", - "--port {{PORT}}", - ], - }, - { - match: { hw: "h200", variant: "default", quant: "fp8", strategy: "high-throughput", nodes: "single" }, - verified: true, - env: [], - flags: [ - "--model-path {{MODEL_NAME}}", - "--tp 8", - "--dp 8", - "--enable-dp-attention", - "--moe-a2a-backend deepep", - "--mem-fraction-static 0.85", - "--max-running-requests 256", - "--host {{HOST_IP}}", - "--port {{PORT}}", - ], - }, - - // ==================================================================== - // B200 + FP8 (Blackwell) — TP8. low-latency verified on b200-verda-k8s - // ==================================================================== - { - match: { hw: "b200", variant: "default", quant: "fp8", strategy: "low-latency", nodes: "single" }, - verified: true, - env: [], - flags: [ - "--model-path {{MODEL_NAME}}", - "--tp 8", - "--speculative-algorithm EAGLE", - "--speculative-num-steps 5", - "--speculative-eagle-topk 1", - "--speculative-num-draft-tokens 6", - "--mem-fraction-static 0.8", - "--host {{HOST_IP}}", - "--port {{PORT}}", - ], - }, - { - match: { hw: "b200", variant: "default", quant: "fp8", strategy: "balanced", nodes: "single" }, - verified: true, - env: [], - flags: [ - "--model-path {{MODEL_NAME}}", - "--tp 8", - "--dp 8", - "--enable-dp-attention", - "--moe-a2a-backend deepep", - "--speculative-algorithm EAGLE", - "--speculative-num-steps 1", - "--speculative-eagle-topk 1", - "--speculative-num-draft-tokens 2", - "--mem-fraction-static 0.85", - // Large chunked-prefill is the dominant balanced lever (prefill-bound at this - // concurrency); max-running tracks KV capacity (~89 for 8K+1K reqs on 8xB200). - "--chunked-prefill-size 32768", - "--max-running-requests 256", - "--host {{HOST_IP}}", - "--port {{PORT}}", - ], - }, - { - match: { hw: "b200", variant: "default", quant: "fp8", strategy: "high-throughput", nodes: "single" }, - verified: true, - env: [], - flags: [ - "--model-path {{MODEL_NAME}}", - "--tp 8", - "--dp 8", - "--enable-dp-attention", - "--moe-a2a-backend deepep", - "--mem-fraction-static 0.85", - "--max-running-requests 256", - "--host {{HOST_IP}}", - "--port {{PORT}}", - ], - }, - - // ==================================================================== - // GB300 + FP8 (Grace-Blackwell, 4-GPU single node) — TP4. - // Flags mirror the B200 (sm100) configs; all three strategies verified end-to-end on - // a single 4xGB300 node (v0.5.13.post1). GB300 leads B200 per-GPU in every regime. - // Stage the weights on node-local NVMe first — shared cluster-storage reads are slow. - // ==================================================================== - { - match: { hw: "gb300", variant: "default", quant: "fp8", strategy: "low-latency", nodes: "single" }, - verified: true, - env: [], - flags: [ - "--model-path {{MODEL_NAME}}", - "--tp 4", - "--speculative-algorithm EAGLE", - "--speculative-num-steps 5", - "--speculative-eagle-topk 1", - "--speculative-num-draft-tokens 6", - "--mem-fraction-static 0.85", - "--host {{HOST_IP}}", - "--port {{PORT}}", - ], - }, - { - match: { hw: "gb300", variant: "default", quant: "fp8", strategy: "balanced", nodes: "single" }, - verified: true, - env: [], - flags: [ - "--model-path {{MODEL_NAME}}", - "--tp 4", - "--dp 4", - "--enable-dp-attention", - "--moe-a2a-backend deepep", - "--speculative-algorithm EAGLE", - "--speculative-num-steps 1", - "--speculative-eagle-topk 1", - "--speculative-num-draft-tokens 2", - "--mem-fraction-static 0.85", - // Same prefill lever as H200/B200 balanced; max-running tracks the TP4 KV capacity. - "--chunked-prefill-size 32768", - "--max-running-requests 256", - "--host {{HOST_IP}}", - "--port {{PORT}}", - ], - }, - { - match: { hw: "gb300", variant: "default", quant: "fp8", strategy: "high-throughput", nodes: "single" }, - verified: true, - env: [ - "SGLANG_DEEPEP_NUM_MAX_DISPATCH_TOKENS_PER_RANK=512", - ], - flags: [ - "--model-path {{MODEL_NAME}}", - "--tp 4", - "--dp 4", - "--enable-dp-attention", - "--moe-a2a-backend deepep", - "--mem-fraction-static 0.85", - "--host {{HOST_IP}}", - "--port {{PORT}}", - ], - }, - - // ==================================================================== - // B300 + FP8 (Blackwell Ultra, 8-GPU single node) — TP8. Verified on 8xB300 (v0.5.13.post1). - // Recipe mirrors the verified B200 (sm100) FP8 path. B300 (sm103) currently trails B200 per-GPU - // because deep_gemm/DSA are tuned for sm100; expected to improve as sm103 gets first-class kernels. - // ==================================================================== - { - match: { hw: "b300", variant: "default", quant: "fp8", strategy: "low-latency", nodes: "single" }, - verified: true, - env: [], - flags: [ - "--model-path {{MODEL_NAME}}", - "--tp 8", - "--speculative-algorithm EAGLE", - "--speculative-num-steps 5", - "--speculative-eagle-topk 1", - "--speculative-num-draft-tokens 6", - "--mem-fraction-static 0.8", - "--host {{HOST_IP}}", - "--port {{PORT}}", - ], - }, - { - match: { hw: "b300", variant: "default", quant: "fp8", strategy: "balanced", nodes: "single" }, - verified: true, - env: [], - flags: [ - "--model-path {{MODEL_NAME}}", - "--tp 8", - "--dp 8", - "--enable-dp-attention", - "--moe-a2a-backend deepep", - "--speculative-algorithm EAGLE", - "--speculative-num-steps 1", - "--speculative-eagle-topk 1", - "--speculative-num-draft-tokens 2", - "--mem-fraction-static 0.85", - "--chunked-prefill-size 32768", - "--max-running-requests 256", - "--host {{HOST_IP}}", - "--port {{PORT}}", - ], - }, - { - match: { hw: "b300", variant: "default", quant: "fp8", strategy: "high-throughput", nodes: "single" }, - verified: true, - env: [], - flags: [ - "--model-path {{MODEL_NAME}}", - "--tp 8", - "--dp 8", - "--enable-dp-attention", - "--moe-a2a-backend deepep", - "--mem-fraction-static 0.85", - "--max-running-requests 256", - "--host {{HOST_IP}}", - "--port {{PORT}}", - ], - }, - - // ==================================================================== - // B300 + BF16 (Blackwell Ultra, 8-GPU single node) — TP8. Verified on 8xB300 (v0.5.13.post1). - // The unquantized GLM-5.2 (~700B, ~1.51 TB) only fits single-node on 8xB300 - // (~2.1 TB HBM); smaller GPUs need multi-node (e.g. 2x 8xH200). balanced/HT run plain TP8 - // (no DP-Attention/DeepEP), so they trail the FP8 recipe at high concurrency. - // ==================================================================== - { - match: { hw: "b300", variant: "default", quant: "bf16", strategy: "low-latency", nodes: "single" }, - verified: true, - env: [], - flags: [ - "--model-path {{MODEL_NAME}}", - "--tp 8", - "--speculative-algorithm EAGLE", - "--speculative-num-steps 5", - "--speculative-eagle-topk 1", - "--speculative-num-draft-tokens 6", - "--mem-fraction-static 0.9", - "--host {{HOST_IP}}", - "--port {{PORT}}", - ], - }, - { - match: { hw: "b300", variant: "default", quant: "bf16", strategy: "balanced", nodes: "single" }, - verified: true, - env: [], - flags: [ - "--model-path {{MODEL_NAME}}", - "--tp 8", - "--speculative-algorithm EAGLE", - "--speculative-num-steps 1", - "--speculative-eagle-topk 1", - "--speculative-num-draft-tokens 2", - "--mem-fraction-static 0.9", - "--chunked-prefill-size 32768", - "--max-running-requests 80", - "--host {{HOST_IP}}", - "--port {{PORT}}", - ], - }, - { - match: { hw: "b300", variant: "default", quant: "bf16", strategy: "high-throughput", nodes: "single" }, - verified: true, - env: [], - flags: [ - "--model-path {{MODEL_NAME}}", - "--tp 8", - "--mem-fraction-static 0.9", - "--max-running-requests 256", - "--host {{HOST_IP}}", - "--port {{PORT}}", - ], - }, - - // ==================================================================== - // BF16 multi-node (inferred) — the 1.51 TB checkpoint spread over 2 nodes. - // 2x 8xH200 / 2x 8xB200 at TP16, 2x 4xGB300 at TP8. The engine injects - // --nnodes / --node-rank / --dist-init-addr from the Multi-Nodes selector. - // Recipes inferred from the single-node B300 path; not benchmarked → verified:false. - // ==================================================================== - { - match: { hw: "h200", variant: "default", quant: "bf16", strategy: "low-latency", nodes: "multi-2" }, - verified: false, - env: [], - flags: [ - "--model-path {{MODEL_NAME}}", - "--tp 16", - "--speculative-algorithm EAGLE", - "--speculative-num-steps 5", - "--speculative-eagle-topk 1", - "--speculative-num-draft-tokens 6", - "--mem-fraction-static 0.85", - "--host {{HOST_IP}}", - "--port {{PORT}}", - ], - }, - { - match: { hw: "h200", variant: "default", quant: "bf16", strategy: "balanced", nodes: "multi-2" }, - verified: false, - env: [], - flags: [ - "--model-path {{MODEL_NAME}}", - "--tp 16", - "--speculative-algorithm EAGLE", - "--speculative-num-steps 1", - "--speculative-eagle-topk 1", - "--speculative-num-draft-tokens 2", - "--mem-fraction-static 0.85", - "--chunked-prefill-size 32768", - "--max-running-requests 80", - "--host {{HOST_IP}}", - "--port {{PORT}}", - ], - }, - { - match: { hw: "h200", variant: "default", quant: "bf16", strategy: "high-throughput", nodes: "multi-2" }, - verified: false, - env: [], - flags: [ - "--model-path {{MODEL_NAME}}", - "--tp 16", - "--mem-fraction-static 0.85", - "--max-running-requests 256", - "--host {{HOST_IP}}", - "--port {{PORT}}", - ], - }, - { - match: { hw: "b200", variant: "default", quant: "bf16", strategy: "low-latency", nodes: "multi-2" }, - verified: false, - env: [], - flags: [ - "--model-path {{MODEL_NAME}}", - "--tp 16", - "--speculative-algorithm EAGLE", - "--speculative-num-steps 5", - "--speculative-eagle-topk 1", - "--speculative-num-draft-tokens 6", - "--mem-fraction-static 0.85", - "--host {{HOST_IP}}", - "--port {{PORT}}", - ], - }, - { - match: { hw: "b200", variant: "default", quant: "bf16", strategy: "balanced", nodes: "multi-2" }, - verified: false, - env: [], - flags: [ - "--model-path {{MODEL_NAME}}", - "--tp 16", - "--speculative-algorithm EAGLE", - "--speculative-num-steps 1", - "--speculative-eagle-topk 1", - "--speculative-num-draft-tokens 2", - "--mem-fraction-static 0.85", - "--chunked-prefill-size 32768", - "--max-running-requests 80", - "--host {{HOST_IP}}", - "--port {{PORT}}", - ], - }, - { - match: { hw: "b200", variant: "default", quant: "bf16", strategy: "high-throughput", nodes: "multi-2" }, - verified: false, - env: [], - flags: [ - "--model-path {{MODEL_NAME}}", - "--tp 16", - "--mem-fraction-static 0.85", - "--max-running-requests 256", - "--host {{HOST_IP}}", - "--port {{PORT}}", - ], - }, - { - match: { hw: "gb300", variant: "default", quant: "bf16", strategy: "low-latency", nodes: "multi-2" }, - verified: false, - env: [], - flags: [ - "--model-path {{MODEL_NAME}}", - "--tp 8", - "--speculative-algorithm EAGLE", - "--speculative-num-steps 5", - "--speculative-eagle-topk 1", - "--speculative-num-draft-tokens 6", - "--mem-fraction-static 0.85", - "--host {{HOST_IP}}", - "--port {{PORT}}", - ], - }, - { - match: { hw: "gb300", variant: "default", quant: "bf16", strategy: "balanced", nodes: "multi-2" }, - verified: false, - env: [], - flags: [ - "--model-path {{MODEL_NAME}}", - "--tp 8", - "--speculative-algorithm EAGLE", - "--speculative-num-steps 1", - "--speculative-eagle-topk 1", - "--speculative-num-draft-tokens 2", - "--mem-fraction-static 0.85", - "--chunked-prefill-size 32768", - "--max-running-requests 80", - "--host {{HOST_IP}}", - "--port {{PORT}}", - ], - }, - { - match: { hw: "gb300", variant: "default", quant: "bf16", strategy: "high-throughput", nodes: "multi-2" }, - verified: false, - env: [], - flags: [ - "--model-path {{MODEL_NAME}}", - "--tp 8", - "--mem-fraction-static 0.85", - "--max-running-requests 256", - "--host {{HOST_IP}}", - "--port {{PORT}}", - ], - }, - - // ==================================================================== - // NVFP4 — nvidia/GLM-5.2-NVFP4 (Model Optimizer). TP8 on B200/B300, TP4 on GB300. - // B200/B300: 8-GPU single node, TP8 (low-latency / balanced / high-throughput); balanced & - // high-throughput add DP-Attention (dp8). low-latency uses MTP 5-1-6, balanced MTP 2-1-3. - // GB300: 4-GPU single node, TP4 (the node fits the ~381 GB build); GB300 adds dp4 on - // balanced & high-throughput; low-latency uses MTP 5-1-6. - // ==================================================================== - { - match: { hw: "b200", variant: "default", quant: "nvfp4", strategy: "low-latency", nodes: "single" }, - verified: true, - env: [], - flags: [ - "--model-path {{MODEL_NAME}}", - "--tp 8", - "--quantization modelopt_fp4", - "--speculative-algorithm EAGLE", - "--speculative-num-steps 5", - "--speculative-eagle-topk 1", - "--speculative-num-draft-tokens 6", - "--chunked-prefill-size 8192", - "--mem-fraction-static 0.85", - "--host {{HOST_IP}}", - "--port {{PORT}}", - ], - }, - { - match: { hw: "b200", variant: "default", quant: "nvfp4", strategy: "balanced", nodes: "single" }, - verified: true, - env: [], - flags: [ - "--model-path {{MODEL_NAME}}", - "--tp 8", - "--quantization modelopt_fp4", - "--dp 8", - "--enable-dp-attention", - // Shorter draft (MTP 2-1-3) than low-latency's 5-1-6: at this concurrency the - // verify overhead of a long draft outweighs the accept-length gain. - "--speculative-algorithm EAGLE", - "--speculative-num-steps 2", - "--speculative-eagle-topk 1", - "--speculative-num-draft-tokens 3", - // Larger chunked-prefill (32768 → ~4096/rank under dp8) is the dominant balanced lever. - "--chunked-prefill-size 32768", - "--mem-fraction-static 0.92", - "--max-running-requests 256", - "--host {{HOST_IP}}", - "--port {{PORT}}", - ], - }, - { - match: { hw: "b200", variant: "default", quant: "nvfp4", strategy: "high-throughput", nodes: "single" }, - verified: true, - env: [], - flags: [ - "--model-path {{MODEL_NAME}}", - "--tp 8", - "--quantization modelopt_fp4", - "--dp 8", - "--enable-dp-attention", - "--chunked-prefill-size 32768", - "--mem-fraction-static 0.92", - "--max-running-requests 512", - "--host {{HOST_IP}}", - "--port {{PORT}}", - ], - }, - { - match: { hw: "b300", variant: "default", quant: "nvfp4", strategy: "low-latency", nodes: "single" }, - verified: true, - env: [], - flags: [ - "--model-path {{MODEL_NAME}}", - "--tp 8", - "--quantization modelopt_fp4", - "--speculative-algorithm EAGLE", - "--speculative-num-steps 5", - "--speculative-eagle-topk 1", - "--speculative-num-draft-tokens 6", - "--chunked-prefill-size 8192", - "--mem-fraction-static 0.85", - "--max-running-requests 16", - "--cuda-graph-max-bs 16", - "--max-prefill-tokens 8192", - "--host {{HOST_IP}}", - "--port {{PORT}}", - ], - }, - { - match: { hw: "b300", variant: "default", quant: "nvfp4", strategy: "balanced", nodes: "single" }, - verified: true, - env: [], - flags: [ - "--model-path {{MODEL_NAME}}", - "--tp 8", - "--dp 8", - "--enable-dp-attention", - "--quantization modelopt_fp4", - // Shorter draft (MTP 2-1-3) than low-latency's 5-1-6: at this concurrency the - // verify overhead of a long draft outweighs the accept-length gain. - "--speculative-algorithm EAGLE", - "--speculative-num-steps 2", - "--speculative-eagle-topk 1", - "--speculative-num-draft-tokens 3", - // Two required flags for DP-Attention + MTP here: `decode`-mode spec attention - // avoids a CUDA-graph capture deadlock, and max-running 256 lifts the default - // ~48-request throttle so DP-Attention can fill all 8 ranks. - "--speculative-attention-mode decode", - "--max-running-requests 256", - "--chunked-prefill-size 8192", - "--mem-fraction-static 0.85", - "--host {{HOST_IP}}", - "--port {{PORT}}", - ], - }, - { - match: { hw: "b300", variant: "default", quant: "nvfp4", strategy: "high-throughput", nodes: "single" }, - verified: true, - env: [], - flags: [ - "--model-path {{MODEL_NAME}}", - "--tp 8", - "--dp 8", - "--enable-dp-attention", - "--quantization modelopt_fp4", - "--max-running-requests 1024", - "--chunked-prefill-size 8192", - "--mem-fraction-static 0.85", - "--host {{HOST_IP}}", - "--port {{PORT}}", - ], - }, - { - match: { hw: "gb300", variant: "default", quant: "nvfp4", strategy: "low-latency", nodes: "single" }, - verified: true, - env: [], - flags: [ - "--model-path {{MODEL_NAME}}", - "--tp 4", - "--quantization modelopt_fp4", - "--speculative-algorithm EAGLE", - "--speculative-num-steps 5", - "--speculative-eagle-topk 1", - "--speculative-num-draft-tokens 6", - "--chunked-prefill-size 8192", - "--mem-fraction-static 0.85", - "--max-running-requests 16", - "--cuda-graph-max-bs 16", - "--max-prefill-tokens 8192", - "--host {{HOST_IP}}", - "--port {{PORT}}", - ], - }, - { - match: { hw: "gb300", variant: "default", quant: "nvfp4", strategy: "balanced", nodes: "single" }, - verified: true, - env: [], - flags: [ - "--model-path {{MODEL_NAME}}", - "--tp 4", - "--quantization modelopt_fp4", - "--dp 4", - "--enable-dp-attention", - // Shorter draft (MTP 2-1-3) than low-latency's 5-1-6: at this concurrency the - // verify overhead of a long draft outweighs the accept-length gain. - "--speculative-algorithm EAGLE", - "--speculative-num-steps 2", - "--speculative-eagle-topk 1", - "--speculative-num-draft-tokens 3", - "--chunked-prefill-size 8192", - "--mem-fraction-static 0.92", - "--max-running-requests 256", - "--host {{HOST_IP}}", - "--port {{PORT}}", - ], - }, - { - match: { hw: "gb300", variant: "default", quant: "nvfp4", strategy: "high-throughput", nodes: "single" }, - verified: true, - env: [], - flags: [ - "--model-path {{MODEL_NAME}}", - "--tp 4", - "--quantization modelopt_fp4", - "--dp 4", - "--enable-dp-attention", - "--chunked-prefill-size 8192", - "--mem-fraction-static 0.92", - "--max-running-requests 512", - "--host {{HOST_IP}}", - "--port {{PORT}}", - ], - }, - // ==================================================================== - // AMD MI300X / MI325X / MI355X (ROCm) — TP8, DSA tilelang backend. - // No MTP: disabled in the Speculative card for AMD (the gfx950 spec-decode - // draft kernel is not yet validated, and num-steps>3 hits a separate build - // issue). Strategies differ only by batch-shaping levers - // (cuda-graph-max-bs / max-running-requests / chunked-prefill): - // low-latency — large chunked-prefill, default bs. - // balanced — chunked-prefill 32768 + bs128, max-running 80. - // high-throughput — bs256, max-running 256. - // ACCURACY: the earlier gfx950 block-FP8 bpreshuffle miscompile (GSM8K ~0) is - // fixed as of the pinned mi355x image (...-20260618); MI355X FP8 was re-validated - // (GSM8K ~0.96, NIAH 15/15 to ~118K) and all three FP8 strategies are benchmarked - // + marked verified:true (see glm-5.2-benchmarks.jsx). All BF16 and all gfx942 - // (MI325X/MI300X) cells stay verified:false (not yet benchmarked, but correct). - // BF16 (~1.51 TB) only fits single-node on MI325X (2 TB) / MI355X (2.3 TB); - // MI300X (1.5 TB) needs multi-node, so its BF16 cells are omitted. - // ==================================================================== - { - match: { hw: "mi355x", variant: "default", quant: "fp8", strategy: "low-latency", nodes: "single" }, - verified: true, - env: [], - flags: [ - "--model-path {{MODEL_NAME}}", - "--tp 8", - "--dsa-prefill-backend tilelang", - "--dsa-decode-backend tilelang", - "--chunked-prefill-size 131072", - "--mem-fraction-static 0.80", - "--watchdog-timeout 1200", - "--host {{HOST_IP}}", - "--port {{PORT}}", - ], - }, - { - match: { hw: "mi355x", variant: "default", quant: "fp8", strategy: "balanced", nodes: "single" }, - verified: true, - env: [], - flags: [ - "--model-path {{MODEL_NAME}}", - "--tp 8", - "--dsa-prefill-backend tilelang", - "--dsa-decode-backend tilelang", - "--chunked-prefill-size 32768", - "--mem-fraction-static 0.85", - "--cuda-graph-max-bs 128", - "--max-running-requests 80", - "--watchdog-timeout 1200", - "--host {{HOST_IP}}", - "--port {{PORT}}", - ], - }, - { - match: { hw: "mi355x", variant: "default", quant: "fp8", strategy: "high-throughput", nodes: "single" }, - verified: true, - env: [], - flags: [ - "--model-path {{MODEL_NAME}}", - "--tp 8", - "--dsa-prefill-backend tilelang", - "--dsa-decode-backend tilelang", - "--mem-fraction-static 0.85", - "--cuda-graph-max-bs 256", - "--max-running-requests 256", - "--watchdog-timeout 1200", - "--host {{HOST_IP}}", - "--port {{PORT}}", - ], - }, - { - match: { hw: "mi355x", variant: "default", quant: "bf16", strategy: "low-latency", nodes: "single" }, - verified: false, - env: [], - flags: [ - "--model-path {{MODEL_NAME}}", - "--tp 8", - "--dsa-prefill-backend tilelang", - "--dsa-decode-backend tilelang", - "--chunked-prefill-size 131072", - "--mem-fraction-static 0.80", - "--watchdog-timeout 1200", - "--host {{HOST_IP}}", - "--port {{PORT}}", - ], - }, - { - match: { hw: "mi355x", variant: "default", quant: "bf16", strategy: "balanced", nodes: "single" }, - verified: false, - env: [], - flags: [ - "--model-path {{MODEL_NAME}}", - "--tp 8", - "--dsa-prefill-backend tilelang", - "--dsa-decode-backend tilelang", - "--chunked-prefill-size 32768", - "--mem-fraction-static 0.85", - "--cuda-graph-max-bs 128", - "--max-running-requests 80", - "--watchdog-timeout 1200", - "--host {{HOST_IP}}", - "--port {{PORT}}", - ], - }, - { - match: { hw: "mi355x", variant: "default", quant: "bf16", strategy: "high-throughput", nodes: "single" }, - verified: false, - env: [], - flags: [ - "--model-path {{MODEL_NAME}}", - "--tp 8", - "--dsa-prefill-backend tilelang", - "--dsa-decode-backend tilelang", - "--mem-fraction-static 0.85", - "--cuda-graph-max-bs 256", - "--max-running-requests 256", - "--watchdog-timeout 1200", - "--host {{HOST_IP}}", - "--port {{PORT}}", - ], - }, - // ==================================================================== - // AMD MI355X + MXFP4 — amd/GLM-5.2-MXFP4 (Quark). TP4: the 4-bit MoE - // weights fit a 4-GPU slice, mirroring the amd/GLM-5.1-MXFP4 MI355X recipe (same DSA - // architecture family) — --trust-remote-code (Quark custom quant config) - // and --kv-cache-dtype fp8_e4m3 both come from that precedent. Pinned to a - // newer image (v0.5.16, see dockerImages["mi355x|mxfp4"]) than the FP8/BF16 - // mi355x cells. No MTP: same AMD spec-decode restriction as the FP8/BF16 - // cells above. Not yet benchmarked for GLM-5.2 → verified:false. - // ==================================================================== - { - match: { hw: "mi355x", variant: "default", quant: "mxfp4", strategy: "low-latency", nodes: "single" }, - verified: false, - env: [], - flags: [ - "--trust-remote-code", - "--model-path {{MODEL_NAME}}", - "--tp 4", - "--kv-cache-dtype fp8_e4m3", - "--dsa-prefill-backend tilelang", - "--dsa-decode-backend tilelang", - "--chunked-prefill-size 131072", - "--mem-fraction-static 0.80", - "--watchdog-timeout 1200", - "--host {{HOST_IP}}", - "--port {{PORT}}", - ], - }, - { - match: { hw: "mi355x", variant: "default", quant: "mxfp4", strategy: "balanced", nodes: "single" }, - verified: false, - env: [], - flags: [ - "--trust-remote-code", - "--model-path {{MODEL_NAME}}", - "--tp 4", - "--kv-cache-dtype fp8_e4m3", - "--dsa-prefill-backend tilelang", - "--dsa-decode-backend tilelang", - "--chunked-prefill-size 32768", - "--mem-fraction-static 0.85", - "--cuda-graph-max-bs 128", - "--max-running-requests 80", - "--watchdog-timeout 1200", - "--host {{HOST_IP}}", - "--port {{PORT}}", - ], - }, - { - match: { hw: "mi355x", variant: "default", quant: "mxfp4", strategy: "high-throughput", nodes: "single" }, - verified: false, - env: [], - flags: [ - "--trust-remote-code", - "--model-path {{MODEL_NAME}}", - "--tp 4", - "--kv-cache-dtype fp8_e4m3", - "--dsa-prefill-backend tilelang", - "--dsa-decode-backend tilelang", - "--mem-fraction-static 0.85", - "--cuda-graph-max-bs 256", - "--max-running-requests 256", - "--watchdog-timeout 1200", - "--host {{HOST_IP}}", - "--port {{PORT}}", - ], - }, - { - match: { hw: "mi325x", variant: "default", quant: "fp8", strategy: "low-latency", nodes: "single" }, - verified: false, - env: [], - flags: [ - "--model-path {{MODEL_NAME}}", - "--tp 8", - "--dsa-prefill-backend tilelang", - "--dsa-decode-backend tilelang", - "--chunked-prefill-size 131072", - "--mem-fraction-static 0.80", - "--watchdog-timeout 1200", - "--host {{HOST_IP}}", - "--port {{PORT}}", - ], - }, - { - match: { hw: "mi325x", variant: "default", quant: "fp8", strategy: "balanced", nodes: "single" }, - verified: false, - env: [], - flags: [ - "--model-path {{MODEL_NAME}}", - "--tp 8", - "--dsa-prefill-backend tilelang", - "--dsa-decode-backend tilelang", - "--chunked-prefill-size 32768", - "--mem-fraction-static 0.85", - "--cuda-graph-max-bs 128", - "--max-running-requests 80", - "--watchdog-timeout 1200", - "--host {{HOST_IP}}", - "--port {{PORT}}", - ], - }, - { - match: { hw: "mi325x", variant: "default", quant: "fp8", strategy: "high-throughput", nodes: "single" }, - verified: false, - env: [], - flags: [ - "--model-path {{MODEL_NAME}}", - "--tp 8", - "--dsa-prefill-backend tilelang", - "--dsa-decode-backend tilelang", - "--mem-fraction-static 0.85", - "--cuda-graph-max-bs 256", - "--max-running-requests 256", - "--watchdog-timeout 1200", - "--host {{HOST_IP}}", - "--port {{PORT}}", - ], - }, - { - match: { hw: "mi325x", variant: "default", quant: "bf16", strategy: "low-latency", nodes: "single" }, - verified: false, - env: [], - flags: [ - "--model-path {{MODEL_NAME}}", - "--tp 8", - "--dsa-prefill-backend tilelang", - "--dsa-decode-backend tilelang", - "--chunked-prefill-size 131072", - "--mem-fraction-static 0.80", - "--watchdog-timeout 1200", - "--host {{HOST_IP}}", - "--port {{PORT}}", - ], - }, - { - match: { hw: "mi325x", variant: "default", quant: "bf16", strategy: "balanced", nodes: "single" }, - verified: false, - env: [], - flags: [ - "--model-path {{MODEL_NAME}}", - "--tp 8", - "--dsa-prefill-backend tilelang", - "--dsa-decode-backend tilelang", - "--chunked-prefill-size 32768", - "--mem-fraction-static 0.85", - "--cuda-graph-max-bs 128", - "--max-running-requests 80", - "--watchdog-timeout 1200", - "--host {{HOST_IP}}", - "--port {{PORT}}", - ], - }, - { - match: { hw: "mi325x", variant: "default", quant: "bf16", strategy: "high-throughput", nodes: "single" }, - verified: false, - env: [], - flags: [ - "--model-path {{MODEL_NAME}}", - "--tp 8", - "--dsa-prefill-backend tilelang", - "--dsa-decode-backend tilelang", - "--mem-fraction-static 0.85", - "--cuda-graph-max-bs 256", - "--max-running-requests 256", - "--watchdog-timeout 1200", - "--host {{HOST_IP}}", - "--port {{PORT}}", - ], - }, - { - match: { hw: "mi300x", variant: "default", quant: "fp8", strategy: "low-latency", nodes: "single" }, - verified: false, - env: [], - flags: [ - "--model-path {{MODEL_NAME}}", - "--tp 8", - "--dsa-prefill-backend tilelang", - "--dsa-decode-backend tilelang", - "--chunked-prefill-size 131072", - "--mem-fraction-static 0.80", - "--watchdog-timeout 1200", - "--host {{HOST_IP}}", - "--port {{PORT}}", - ], - }, - { - match: { hw: "mi300x", variant: "default", quant: "fp8", strategy: "balanced", nodes: "single" }, - verified: false, - env: [], - flags: [ - "--model-path {{MODEL_NAME}}", - "--tp 8", - "--dsa-prefill-backend tilelang", - "--dsa-decode-backend tilelang", - "--chunked-prefill-size 32768", - "--mem-fraction-static 0.85", - "--cuda-graph-max-bs 128", - "--max-running-requests 80", - "--watchdog-timeout 1200", - "--host {{HOST_IP}}", - "--port {{PORT}}", - ], - }, - { - match: { hw: "mi300x", variant: "default", quant: "fp8", strategy: "high-throughput", nodes: "single" }, - verified: false, - env: [], - flags: [ - "--model-path {{MODEL_NAME}}", - "--tp 8", - "--dsa-prefill-backend tilelang", - "--dsa-decode-backend tilelang", - "--mem-fraction-static 0.85", - "--cuda-graph-max-bs 256", - "--max-running-requests 256", - "--watchdog-timeout 1200", - "--host {{HOST_IP}}", - "--port {{PORT}}", - ], - }, - ], -}; +// Single `export const config` literal — no spreads/calls/IIFE (Mintlify re-evals at hydration). +// Cells are denormalized: no `--nnodes`/`--node-rank`/`--dist-init-addr`/`--host`/`--port` literals — engine injects them. + +export const config = { + modelName: "GLM-5.2", + + supportedHardware: [ + "h200", "b200", "gb300", "b300", + "mi355x", "mi325x", "mi300x", + ], + + // Single released checkpoint — no size/mode split. + variants: [ + { id: "default", label: "GLM-5.2", subtitle: "MoE · DSA" }, + ], + quantizations: [ + { id: "fp8", label: "FP8" }, + { id: "bf16", label: "BF16" }, + { id: "nvfp4", label: "NVFP4" }, + { id: "mxfp4", label: "MXFP4" }, + ], + strategies: [ + { id: "low-latency", label: "Low-Latency" }, + { id: "balanced", label: "Balanced" }, + { id: "high-throughput", label: "High-Throughput" }, + ], + nodesOptions: [ + { id: "single", label: "Single Node" }, + { id: "multi-2", label: "Multi-Nodes" }, + ], + + modelNames: { + "default|fp8": "zai-org/GLM-5.2-FP8", + "default|bf16": "zai-org/GLM-5.2", + "default|nvfp4": "nvidia/GLM-5.2-NVFP4", + "default|mxfp4": "amd/GLM-5.2-MXFP4", + }, + + placeholders: { + HOST_IP: { target: "command", label: "Bind host", default: "0.0.0.0" }, + PORT: { target: "command", label: "Bind port", default: "30000" }, + NODE0_IP: { target: "command", label: "Head node IP", default: "" }, + NODE_RANK: { target: "command", label: "This node rank", default: "" }, + CURL_HOST: { target: "curl", label: "Server host", default: "localhost" }, + CURL_PORT: { target: "curl", label: "Server port", default: "30000" }, + }, + + curl: `curl http://{{CURL_HOST}}:{{CURL_PORT}}/v1/chat/completions \\ +-H 'Content-Type: application/json' \\ +-d '{ "model": "{{MODEL_NAME}}", "messages": [{"role":"user","content":"Hello"}] }'`, + + // Reproduce commands for the Benchmark card's "⚡ Reproduce" modal. + benchmarkCommands: { + speed: +`python3 -m sglang.bench_serving \\ + --backend sglang \\ + --host {{CURL_HOST}} --port {{CURL_PORT}} \\ + --model {{MODEL_NAME}} \\ + --dataset-name {{DATASET}} \\ + --random-input-len {{ISL}} --random-output-len {{OSL}} \\ + --random-range-ratio 1.0 \\ + --num-prompts {{NUM_PROMPTS}} --max-concurrency {{MAX_CONCURRENCY}} \\ + --warmup-requests 64 --flush-cache`, + accuracy: { + gsm8k_pct: +`# To install sgl-eval: pip install git+https://github.com/sgl-project/sgl-eval +sgl-eval run gsm8k \\ + --base-url http://{{CURL_HOST}}:{{CURL_PORT}}/v1 \\ + --num-threads 32`, + aime25_pct: +`# To install sgl-eval: pip install git+https://github.com/sgl-project/sgl-eval +sgl-eval run aime25 \\ + --model {{MODEL_NAME}} --api-key \\ + --n-repeats 16 --max-tokens 64000 \\ + --temperature 1.0 --top-p 0.95 --thinking \\ + --out-dir /sgl-workspace/logs \\ + --base-url http://{{CURL_HOST}}:{{CURL_PORT}}/v1`, + }, + numPromptsByConc: { 1: 8, 16: 64, 64: 128, 256: 512, 1024: 2048, 4096: 8192 }, + }, + + // Per-variant accuracy applied to every cell; per-cell `accuracy` overrides. + // Both measured via sgl-eval (thinking mode) on H200. aime25 = pass@1 avg-of-16 + // (n-repeats 16, max-tokens 64000, temp 1.0, top-p 0.95); pass@16 100%, majority@16 93.3%. + defaultAccuracy: { + default: { gsm8k_pct: 98.2, aime25_pct: 87.7 }, + }, + + accuracyLabels: [ + ["aime25_pct", "AIME25", "%"], + ["gsm8k_pct", "GSM8K (1-shot)", "%"], + ], + + dockerImages: { + h200: "lmsysorg/sglang:latest", + b200: "lmsysorg/sglang:latest", + gb300: "lmsysorg/sglang:latest", + b300: "lmsysorg/sglang:latest", + mi355x: "lmsysorg/sglang-rocm:v0.5.13.post1-rocm720-mi35x-20260618", + "mi355x|mxfp4": "lmsysorg/sglang-rocm:v0.5.16-rocm720-mi35x-20260728", + mi325x: "lmsysorg/sglang-rocm:v0.5.13.post1-rocm700-mi30x-20260616", + mi300x: "lmsysorg/sglang-rocm:v0.5.13.post1-rocm700-mi30x-20260616", + }, + + github: { + cookbookModel: "zai-org/glm-5.2", + }, + + playgroundFeatures: { + + // ----- Card 1: "Attention Parallelism" ----- + // DSA prefill Context Parallelism (CP) splits the long-prefill attention across + // `cp` ranks — runs on Hopper (H200) and Blackwell (B200/GB300/B300). + // CP sizes auto-gate in the engine to the runtime derivation + // attn_cp_size = tp/dp (a user-passed --attn-cp-size is overridden). + // CP is single-machine only (tp_size <= 8). Interleave CP + DP-Attention + // currently fails the runtime's dp_size == 1 assert but is allowed here + // with a warning (combined support is planned upstream). + // Strategy knob: interleave (ex round-robin-split) is the layout verified + // here and the default; zigzag (ex in-seq-split) is exposed as an + // experiment — the runtime auto-configures deepep + ep=tp for it and + // restricts it to batch_size=1 (long-context single-request runs). + attention: { + knobs: [ + { id: "tp", label: "TP", values: [null, 4, 8] }, + { id: "cp", label: "CP (DSA prefill)", + values: [null, { value: 1, label: "Off" }, 4, 8], + disable: [ + { when: { hw: ["mi355x", "mi325x", "mi300x"] }, + reason: "The ROCm DSA-CP path is not yet validated on AMD (MI300X/MI325X/MI355X) — keep CP off there for now." }, + { when: { nodes: ["multi-2"] }, + reason: "Prefill Context Parallel is single-machine only (SGLang asserts tp_size <= 8; cross-machine CP has precision issues)." }, + ] }, + { id: "cpStrategy", label: "CP Strategy", + values: [ + null, + "interleave", + { value: "zigzag", label: "zigzag (experimental)" }, + ], + disable: [ + { when: { hw: ["mi355x", "mi325x", "mi300x"] }, + reason: "The ROCm DSA-CP path is not yet validated on AMD (MI300X/MI325X/MI355X) — keep CP off there for now." }, + { when: { nodes: ["multi-2"] }, + reason: "Prefill Context Parallel is single-machine only (SGLang asserts tp_size <= 8; cross-machine CP has precision issues)." }, + ] }, + { id: "dpAttn", label: "DP-Attention", + values: [null, false, 4, 8], + labels: { "auto": "Auto", "false": "Off" } }, + ], + }, + + // ----- Card 2: "MoE Parallelism" ----- + moe: { + backend: { + options: [ + { id: null, label: "Inherited" }, + { id: "deepep", label: "DeepEP", flags: ["--moe-a2a-backend deepep"] }, + ], + }, + ep: { label: "EP", values: [null, 4, 8] }, + }, + + // ----- Card 3: "Parsers" ----- + parsers: { + items: [ + { id: "reasoning", label: "Reasoning Parser", flag: "--reasoning-parser glm45" }, + { id: "toolCall", label: "Tool Call Parser", flag: "--tool-call-parser glm47" }, + ], + }, + + // ----- Card 4: "Speculative Decoding" ----- + // GLM-5.2 ships a single MTP (nextn) layer; index_share_for_mtp_iteration reuses the + // DSA indexer topk across draft steps (topk==1 only). + speculative: { + options: [ + { id: "current", label: "Inherited from base" }, + { id: "off", label: "Off (greedy)" }, + { id: "mtp-516", label: "EAGLE / MTP 5-1-6 (low-latency)", + flags: ["--speculative-algorithm EAGLE", "--speculative-num-steps 5", + "--speculative-eagle-topk 1", "--speculative-num-draft-tokens 6"], + disable: { hw: ["mi355x", "mi325x", "mi300x"] }, + disableReason: "MTP/EAGLE speculative decoding is not yet validated on AMD ROCm (MI300X/MI325X/MI355X): the gfx950 spec-decode draft kernel is not yet validated and at --speculative-num-steps > 3 hits a separate build issue; the DSA nextn draft path is CUDA-only." }, + { id: "mtp-112", label: "EAGLE / MTP 1-1-2 (balanced)", + flags: ["--speculative-algorithm EAGLE", "--speculative-num-steps 1", + "--speculative-eagle-topk 1", "--speculative-num-draft-tokens 2"], + disable: { hw: ["mi355x", "mi325x", "mi300x"] }, + disableReason: "MTP/EAGLE speculative decoding is not yet validated on AMD ROCm (MI300X/MI325X/MI355X): the gfx950 spec-decode draft kernel is not yet validated and at --speculative-num-steps > 3 hits a separate build issue; the DSA nextn draft path is CUDA-only." }, + { id: "mtp-314", label: "EAGLE / MTP 3-1-4 (agentic · MI355X MXFP4)", + flags: ["--speculative-algorithm EAGLE", "--speculative-num-steps 3", + "--speculative-eagle-topk 1", "--speculative-num-draft-tokens 4"], + enable: { hw: ["mi355x"], quant: ["mxfp4"] }, + enableReason: "Validated on MI355X gfx950 with amd/GLM-5.2-MXFP4 (InferenceX AgentX sweep, GSM8K em_strict 0.971). num-steps=3 stays within the validated gfx950 spec-decode build envelope (≤3). Pair with SGLANG_SIMULATE_ACC_LEN=2.99 for benchmarking (golden AL from golden_al_distribution/glm5.2_mtp.yaml, thinking_on, num_speculative_tokens=3)." }, + ], + }, + + // ----- Card 5: "PD Disaggregation" ----- + // GLM-5.2 is a DSA model (same family as DeepSeek-V3.2/V4) and supports + // prefill/decode disaggregation. Owns the `--disaggregation-*` flags; the + // engine also pins role-specific serving ports (spaced apart) so prefill + + // decode don't collide on one host. + pdDisagg: { + modes: [ + { id: "off", label: "Off" }, + { id: "prefill", label: "Prefill role" }, + { id: "decode", label: "Decode role" }, + ], + transferBackends: [ + // Mooncake (recommended). The NCCL/MNNVL env is only needed on the + // NVLink-multinode Grace-Blackwell platform (GB300 here). + { id: "mooncake", label: "Mooncake", + env: [ + "NCCL_MNNVL_ENABLE=1", + "NCCL_CUMEM_ENABLE=1", + "SGLANG_MOONCAKE_CUSTOM_MEM_POOL=True", + "MC_FORCE_MNNVL=1", + ], + envWhen: { hw: ["gb300"] } }, + { id: "nixl", label: "NiXL" }, + ], + // No IB-device knob: mooncake auto-detects the HCA. Pass + // --disaggregation-ib-device only if discovery picks the wrong NIC + // (see Configuration Tips). + // Router fronting the prefill + decode roles; substitute /. + router: { + port: 8000, + command: +`python3 -m sglang_router.launch_router \\ + --pd-disaggregation \\ + --prefill http://:{{PREFILL_PORT}} \\ + --decode http://:{{DECODE_PORT}} \\ + --host 0.0.0.0 --port {{ROUTER_PORT}} \\ + --disable-circuit-breaker \\ + --health-check-interval-secs 999999`, + }, + }, + + // ----- Card 6: "Hierarchical KV Cache" ----- + hicache: { + backends: [ + { id: null, label: "Auto" }, + { id: "file", label: "File" }, + { id: "mooncake", label: "Mooncake" }, + ], + writePolicies: [ + { id: "auto", label: "Auto" }, + { id: "write_through", label: "Write-through" }, + { id: "write_back", label: "Write-back" }, + ], + }, + }, + + cells: [ + // ==================================================================== + // H200 + FP8 (Hopper) — TP8. CP (DSA prefill) verified here. + // ==================================================================== + { + match: { hw: "h200", variant: "default", quant: "fp8", strategy: "low-latency", nodes: "single" }, + verified: true, + env: [], + flags: [ + "--model-path {{MODEL_NAME}}", + "--tp 8", + "--speculative-algorithm EAGLE", + "--speculative-num-steps 5", + "--speculative-eagle-topk 1", + "--speculative-num-draft-tokens 6", + "--mem-fraction-static 0.8", + "--host {{HOST_IP}}", + "--port {{PORT}}", + ], + }, + { + match: { hw: "h200", variant: "default", quant: "fp8", strategy: "balanced", nodes: "single" }, + verified: true, + env: [], + flags: [ + "--model-path {{MODEL_NAME}}", + "--tp 8", + "--dp 8", + "--enable-dp-attention", + "--moe-a2a-backend deepep", + "--speculative-algorithm EAGLE", + "--speculative-num-steps 1", + "--speculative-eagle-topk 1", + "--speculative-num-draft-tokens 2", + "--mem-fraction-static 0.85", + // Large chunked-prefill is the dominant balanced lever (prefill-bound at this + // concurrency); max-running tracks KV capacity (~60-80 for 8K+1K reqs on 8xH200). + "--chunked-prefill-size 32768", + "--max-running-requests 256", + "--host {{HOST_IP}}", + "--port {{PORT}}", + ], + }, + { + match: { hw: "h200", variant: "default", quant: "fp8", strategy: "high-throughput", nodes: "single" }, + verified: true, + env: [], + flags: [ + "--model-path {{MODEL_NAME}}", + "--tp 8", + "--dp 8", + "--enable-dp-attention", + "--moe-a2a-backend deepep", + "--mem-fraction-static 0.85", + "--max-running-requests 256", + "--host {{HOST_IP}}", + "--port {{PORT}}", + ], + }, + + // ==================================================================== + // B200 + FP8 (Blackwell) — TP8. low-latency verified on b200-verda-k8s + // ==================================================================== + { + match: { hw: "b200", variant: "default", quant: "fp8", strategy: "low-latency", nodes: "single" }, + verified: true, + env: [], + flags: [ + "--model-path {{MODEL_NAME}}", + "--tp 8", + "--speculative-algorithm EAGLE", + "--speculative-num-steps 5", + "--speculative-eagle-topk 1", + "--speculative-num-draft-tokens 6", + "--mem-fraction-static 0.8", + "--host {{HOST_IP}}", + "--port {{PORT}}", + ], + }, + { + match: { hw: "b200", variant: "default", quant: "fp8", strategy: "balanced", nodes: "single" }, + verified: true, + env: [], + flags: [ + "--model-path {{MODEL_NAME}}", + "--tp 8", + "--dp 8", + "--enable-dp-attention", + "--moe-a2a-backend deepep", + "--speculative-algorithm EAGLE", + "--speculative-num-steps 1", + "--speculative-eagle-topk 1", + "--speculative-num-draft-tokens 2", + "--mem-fraction-static 0.85", + // Large chunked-prefill is the dominant balanced lever (prefill-bound at this + // concurrency); max-running tracks KV capacity (~89 for 8K+1K reqs on 8xB200). + "--chunked-prefill-size 32768", + "--max-running-requests 256", + "--host {{HOST_IP}}", + "--port {{PORT}}", + ], + }, + { + match: { hw: "b200", variant: "default", quant: "fp8", strategy: "high-throughput", nodes: "single" }, + verified: true, + env: [], + flags: [ + "--model-path {{MODEL_NAME}}", + "--tp 8", + "--dp 8", + "--enable-dp-attention", + "--moe-a2a-backend deepep", + "--mem-fraction-static 0.85", + "--max-running-requests 256", + "--host {{HOST_IP}}", + "--port {{PORT}}", + ], + }, + + // ==================================================================== + // GB300 + FP8 (Grace-Blackwell, 4-GPU single node) — TP4. + // Flags mirror the B200 (sm100) configs; all three strategies verified end-to-end on + // a single 4xGB300 node (v0.5.13.post1). GB300 leads B200 per-GPU in every regime. + // Stage the weights on node-local NVMe first — shared cluster-storage reads are slow. + // ==================================================================== + { + match: { hw: "gb300", variant: "default", quant: "fp8", strategy: "low-latency", nodes: "single" }, + verified: true, + env: [], + flags: [ + "--model-path {{MODEL_NAME}}", + "--tp 4", + "--speculative-algorithm EAGLE", + "--speculative-num-steps 5", + "--speculative-eagle-topk 1", + "--speculative-num-draft-tokens 6", + "--mem-fraction-static 0.85", + "--host {{HOST_IP}}", + "--port {{PORT}}", + ], + }, + { + match: { hw: "gb300", variant: "default", quant: "fp8", strategy: "balanced", nodes: "single" }, + verified: true, + env: [], + flags: [ + "--model-path {{MODEL_NAME}}", + "--tp 4", + "--dp 4", + "--enable-dp-attention", + "--moe-a2a-backend deepep", + "--speculative-algorithm EAGLE", + "--speculative-num-steps 1", + "--speculative-eagle-topk 1", + "--speculative-num-draft-tokens 2", + "--mem-fraction-static 0.85", + // Same prefill lever as H200/B200 balanced; max-running tracks the TP4 KV capacity. + "--chunked-prefill-size 32768", + "--max-running-requests 256", + "--host {{HOST_IP}}", + "--port {{PORT}}", + ], + }, + { + match: { hw: "gb300", variant: "default", quant: "fp8", strategy: "high-throughput", nodes: "single" }, + verified: true, + env: [ + "SGLANG_DEEPEP_NUM_MAX_DISPATCH_TOKENS_PER_RANK=512", + ], + flags: [ + "--model-path {{MODEL_NAME}}", + "--tp 4", + "--dp 4", + "--enable-dp-attention", + "--moe-a2a-backend deepep", + "--mem-fraction-static 0.85", + "--host {{HOST_IP}}", + "--port {{PORT}}", + ], + }, + + // ==================================================================== + // B300 + FP8 (Blackwell Ultra, 8-GPU single node) — TP8. Verified on 8xB300 (v0.5.13.post1). + // Recipe mirrors the verified B200 (sm100) FP8 path. B300 (sm103) currently trails B200 per-GPU + // because deep_gemm/DSA are tuned for sm100; expected to improve as sm103 gets first-class kernels. + // ==================================================================== + { + match: { hw: "b300", variant: "default", quant: "fp8", strategy: "low-latency", nodes: "single" }, + verified: true, + env: [], + flags: [ + "--model-path {{MODEL_NAME}}", + "--tp 8", + "--speculative-algorithm EAGLE", + "--speculative-num-steps 5", + "--speculative-eagle-topk 1", + "--speculative-num-draft-tokens 6", + "--mem-fraction-static 0.8", + "--host {{HOST_IP}}", + "--port {{PORT}}", + ], + }, + { + match: { hw: "b300", variant: "default", quant: "fp8", strategy: "balanced", nodes: "single" }, + verified: true, + env: [], + flags: [ + "--model-path {{MODEL_NAME}}", + "--tp 8", + "--dp 8", + "--enable-dp-attention", + "--moe-a2a-backend deepep", + "--speculative-algorithm EAGLE", + "--speculative-num-steps 1", + "--speculative-eagle-topk 1", + "--speculative-num-draft-tokens 2", + "--mem-fraction-static 0.85", + "--chunked-prefill-size 32768", + "--max-running-requests 256", + "--host {{HOST_IP}}", + "--port {{PORT}}", + ], + }, + { + match: { hw: "b300", variant: "default", quant: "fp8", strategy: "high-throughput", nodes: "single" }, + verified: true, + env: [], + flags: [ + "--model-path {{MODEL_NAME}}", + "--tp 8", + "--dp 8", + "--enable-dp-attention", + "--moe-a2a-backend deepep", + "--mem-fraction-static 0.85", + "--max-running-requests 256", + "--host {{HOST_IP}}", + "--port {{PORT}}", + ], + }, + + // ==================================================================== + // B300 + BF16 (Blackwell Ultra, 8-GPU single node) — TP8. Verified on 8xB300 (v0.5.13.post1). + // The unquantized GLM-5.2 (~700B, ~1.51 TB) only fits single-node on 8xB300 + // (~2.1 TB HBM); smaller GPUs need multi-node (e.g. 2x 8xH200). balanced/HT run plain TP8 + // (no DP-Attention/DeepEP), so they trail the FP8 recipe at high concurrency. + // ==================================================================== + { + match: { hw: "b300", variant: "default", quant: "bf16", strategy: "low-latency", nodes: "single" }, + verified: true, + env: [], + flags: [ + "--model-path {{MODEL_NAME}}", + "--tp 8", + "--speculative-algorithm EAGLE", + "--speculative-num-steps 5", + "--speculative-eagle-topk 1", + "--speculative-num-draft-tokens 6", + "--mem-fraction-static 0.9", + "--host {{HOST_IP}}", + "--port {{PORT}}", + ], + }, + { + match: { hw: "b300", variant: "default", quant: "bf16", strategy: "balanced", nodes: "single" }, + verified: true, + env: [], + flags: [ + "--model-path {{MODEL_NAME}}", + "--tp 8", + "--speculative-algorithm EAGLE", + "--speculative-num-steps 1", + "--speculative-eagle-topk 1", + "--speculative-num-draft-tokens 2", + "--mem-fraction-static 0.9", + "--chunked-prefill-size 32768", + "--max-running-requests 80", + "--host {{HOST_IP}}", + "--port {{PORT}}", + ], + }, + { + match: { hw: "b300", variant: "default", quant: "bf16", strategy: "high-throughput", nodes: "single" }, + verified: true, + env: [], + flags: [ + "--model-path {{MODEL_NAME}}", + "--tp 8", + "--mem-fraction-static 0.9", + "--max-running-requests 256", + "--host {{HOST_IP}}", + "--port {{PORT}}", + ], + }, + + // ==================================================================== + // BF16 multi-node (inferred) — the 1.51 TB checkpoint spread over 2 nodes. + // 2x 8xH200 / 2x 8xB200 at TP16, 2x 4xGB300 at TP8. The engine injects + // --nnodes / --node-rank / --dist-init-addr from the Multi-Nodes selector. + // Recipes inferred from the single-node B300 path; not benchmarked → verified:false. + // ==================================================================== + { + match: { hw: "h200", variant: "default", quant: "bf16", strategy: "low-latency", nodes: "multi-2" }, + verified: false, + env: [], + flags: [ + "--model-path {{MODEL_NAME}}", + "--tp 16", + "--speculative-algorithm EAGLE", + "--speculative-num-steps 5", + "--speculative-eagle-topk 1", + "--speculative-num-draft-tokens 6", + "--mem-fraction-static 0.85", + "--host {{HOST_IP}}", + "--port {{PORT}}", + ], + }, + { + match: { hw: "h200", variant: "default", quant: "bf16", strategy: "balanced", nodes: "multi-2" }, + verified: false, + env: [], + flags: [ + "--model-path {{MODEL_NAME}}", + "--tp 16", + "--speculative-algorithm EAGLE", + "--speculative-num-steps 1", + "--speculative-eagle-topk 1", + "--speculative-num-draft-tokens 2", + "--mem-fraction-static 0.85", + "--chunked-prefill-size 32768", + "--max-running-requests 80", + "--host {{HOST_IP}}", + "--port {{PORT}}", + ], + }, + { + match: { hw: "h200", variant: "default", quant: "bf16", strategy: "high-throughput", nodes: "multi-2" }, + verified: false, + env: [], + flags: [ + "--model-path {{MODEL_NAME}}", + "--tp 16", + "--mem-fraction-static 0.85", + "--max-running-requests 256", + "--host {{HOST_IP}}", + "--port {{PORT}}", + ], + }, + { + match: { hw: "b200", variant: "default", quant: "bf16", strategy: "low-latency", nodes: "multi-2" }, + verified: false, + env: [], + flags: [ + "--model-path {{MODEL_NAME}}", + "--tp 16", + "--speculative-algorithm EAGLE", + "--speculative-num-steps 5", + "--speculative-eagle-topk 1", + "--speculative-num-draft-tokens 6", + "--mem-fraction-static 0.85", + "--host {{HOST_IP}}", + "--port {{PORT}}", + ], + }, + { + match: { hw: "b200", variant: "default", quant: "bf16", strategy: "balanced", nodes: "multi-2" }, + verified: false, + env: [], + flags: [ + "--model-path {{MODEL_NAME}}", + "--tp 16", + "--speculative-algorithm EAGLE", + "--speculative-num-steps 1", + "--speculative-eagle-topk 1", + "--speculative-num-draft-tokens 2", + "--mem-fraction-static 0.85", + "--chunked-prefill-size 32768", + "--max-running-requests 80", + "--host {{HOST_IP}}", + "--port {{PORT}}", + ], + }, + { + match: { hw: "b200", variant: "default", quant: "bf16", strategy: "high-throughput", nodes: "multi-2" }, + verified: false, + env: [], + flags: [ + "--model-path {{MODEL_NAME}}", + "--tp 16", + "--mem-fraction-static 0.85", + "--max-running-requests 256", + "--host {{HOST_IP}}", + "--port {{PORT}}", + ], + }, + { + match: { hw: "gb300", variant: "default", quant: "bf16", strategy: "low-latency", nodes: "multi-2" }, + verified: false, + env: [], + flags: [ + "--model-path {{MODEL_NAME}}", + "--tp 8", + "--speculative-algorithm EAGLE", + "--speculative-num-steps 5", + "--speculative-eagle-topk 1", + "--speculative-num-draft-tokens 6", + "--mem-fraction-static 0.85", + "--host {{HOST_IP}}", + "--port {{PORT}}", + ], + }, + { + match: { hw: "gb300", variant: "default", quant: "bf16", strategy: "balanced", nodes: "multi-2" }, + verified: false, + env: [], + flags: [ + "--model-path {{MODEL_NAME}}", + "--tp 8", + "--speculative-algorithm EAGLE", + "--speculative-num-steps 1", + "--speculative-eagle-topk 1", + "--speculative-num-draft-tokens 2", + "--mem-fraction-static 0.85", + "--chunked-prefill-size 32768", + "--max-running-requests 80", + "--host {{HOST_IP}}", + "--port {{PORT}}", + ], + }, + { + match: { hw: "gb300", variant: "default", quant: "bf16", strategy: "high-throughput", nodes: "multi-2" }, + verified: false, + env: [], + flags: [ + "--model-path {{MODEL_NAME}}", + "--tp 8", + "--mem-fraction-static 0.85", + "--max-running-requests 256", + "--host {{HOST_IP}}", + "--port {{PORT}}", + ], + }, + + // ==================================================================== + // NVFP4 — nvidia/GLM-5.2-NVFP4 (Model Optimizer). TP8 on B200/B300, TP4 on GB300. + // B200/B300: 8-GPU single node, TP8 (low-latency / balanced / high-throughput); balanced & + // high-throughput add DP-Attention (dp8). low-latency uses MTP 5-1-6, balanced MTP 2-1-3. + // GB300: 4-GPU single node, TP4 (the node fits the ~381 GB build); GB300 adds dp4 on + // balanced & high-throughput; low-latency uses MTP 5-1-6. + // ==================================================================== + { + match: { hw: "b200", variant: "default", quant: "nvfp4", strategy: "low-latency", nodes: "single" }, + verified: true, + env: [], + flags: [ + "--model-path {{MODEL_NAME}}", + "--tp 8", + "--quantization modelopt_fp4", + "--speculative-algorithm EAGLE", + "--speculative-num-steps 5", + "--speculative-eagle-topk 1", + "--speculative-num-draft-tokens 6", + "--chunked-prefill-size 8192", + "--mem-fraction-static 0.85", + "--host {{HOST_IP}}", + "--port {{PORT}}", + ], + }, + { + match: { hw: "b200", variant: "default", quant: "nvfp4", strategy: "balanced", nodes: "single" }, + verified: true, + env: [], + flags: [ + "--model-path {{MODEL_NAME}}", + "--tp 8", + "--quantization modelopt_fp4", + "--dp 8", + "--enable-dp-attention", + // Shorter draft (MTP 2-1-3) than low-latency's 5-1-6: at this concurrency the + // verify overhead of a long draft outweighs the accept-length gain. + "--speculative-algorithm EAGLE", + "--speculative-num-steps 2", + "--speculative-eagle-topk 1", + "--speculative-num-draft-tokens 3", + // Larger chunked-prefill (32768 → ~4096/rank under dp8) is the dominant balanced lever. + "--chunked-prefill-size 32768", + "--mem-fraction-static 0.92", + "--max-running-requests 256", + "--host {{HOST_IP}}", + "--port {{PORT}}", + ], + }, + { + match: { hw: "b200", variant: "default", quant: "nvfp4", strategy: "high-throughput", nodes: "single" }, + verified: true, + env: [], + flags: [ + "--model-path {{MODEL_NAME}}", + "--tp 8", + "--quantization modelopt_fp4", + "--dp 8", + "--enable-dp-attention", + "--chunked-prefill-size 32768", + "--mem-fraction-static 0.92", + "--max-running-requests 512", + "--host {{HOST_IP}}", + "--port {{PORT}}", + ], + }, + { + match: { hw: "b300", variant: "default", quant: "nvfp4", strategy: "low-latency", nodes: "single" }, + verified: true, + env: [], + flags: [ + "--model-path {{MODEL_NAME}}", + "--tp 8", + "--quantization modelopt_fp4", + "--speculative-algorithm EAGLE", + "--speculative-num-steps 5", + "--speculative-eagle-topk 1", + "--speculative-num-draft-tokens 6", + "--chunked-prefill-size 8192", + "--mem-fraction-static 0.85", + "--max-running-requests 16", + "--cuda-graph-max-bs 16", + "--max-prefill-tokens 8192", + "--host {{HOST_IP}}", + "--port {{PORT}}", + ], + }, + { + match: { hw: "b300", variant: "default", quant: "nvfp4", strategy: "balanced", nodes: "single" }, + verified: true, + env: [], + flags: [ + "--model-path {{MODEL_NAME}}", + "--tp 8", + "--dp 8", + "--enable-dp-attention", + "--quantization modelopt_fp4", + // Shorter draft (MTP 2-1-3) than low-latency's 5-1-6: at this concurrency the + // verify overhead of a long draft outweighs the accept-length gain. + "--speculative-algorithm EAGLE", + "--speculative-num-steps 2", + "--speculative-eagle-topk 1", + "--speculative-num-draft-tokens 3", + // Two required flags for DP-Attention + MTP here: `decode`-mode spec attention + // avoids a CUDA-graph capture deadlock, and max-running 256 lifts the default + // ~48-request throttle so DP-Attention can fill all 8 ranks. + "--speculative-attention-mode decode", + "--max-running-requests 256", + "--chunked-prefill-size 8192", + "--mem-fraction-static 0.85", + "--host {{HOST_IP}}", + "--port {{PORT}}", + ], + }, + { + match: { hw: "b300", variant: "default", quant: "nvfp4", strategy: "high-throughput", nodes: "single" }, + verified: true, + env: [], + flags: [ + "--model-path {{MODEL_NAME}}", + "--tp 8", + "--dp 8", + "--enable-dp-attention", + "--quantization modelopt_fp4", + "--max-running-requests 1024", + "--chunked-prefill-size 8192", + "--mem-fraction-static 0.85", + "--host {{HOST_IP}}", + "--port {{PORT}}", + ], + }, + { + match: { hw: "gb300", variant: "default", quant: "nvfp4", strategy: "low-latency", nodes: "single" }, + verified: true, + env: [], + flags: [ + "--model-path {{MODEL_NAME}}", + "--tp 4", + "--quantization modelopt_fp4", + "--speculative-algorithm EAGLE", + "--speculative-num-steps 5", + "--speculative-eagle-topk 1", + "--speculative-num-draft-tokens 6", + "--chunked-prefill-size 8192", + "--mem-fraction-static 0.85", + "--max-running-requests 16", + "--cuda-graph-max-bs 16", + "--max-prefill-tokens 8192", + "--host {{HOST_IP}}", + "--port {{PORT}}", + ], + }, + { + match: { hw: "gb300", variant: "default", quant: "nvfp4", strategy: "balanced", nodes: "single" }, + verified: true, + env: [], + flags: [ + "--model-path {{MODEL_NAME}}", + "--tp 4", + "--quantization modelopt_fp4", + "--dp 4", + "--enable-dp-attention", + // Shorter draft (MTP 2-1-3) than low-latency's 5-1-6: at this concurrency the + // verify overhead of a long draft outweighs the accept-length gain. + "--speculative-algorithm EAGLE", + "--speculative-num-steps 2", + "--speculative-eagle-topk 1", + "--speculative-num-draft-tokens 3", + "--chunked-prefill-size 8192", + "--mem-fraction-static 0.92", + "--max-running-requests 256", + "--host {{HOST_IP}}", + "--port {{PORT}}", + ], + }, + { + match: { hw: "gb300", variant: "default", quant: "nvfp4", strategy: "high-throughput", nodes: "single" }, + verified: true, + env: [], + flags: [ + "--model-path {{MODEL_NAME}}", + "--tp 4", + "--quantization modelopt_fp4", + "--dp 4", + "--enable-dp-attention", + "--chunked-prefill-size 8192", + "--mem-fraction-static 0.92", + "--max-running-requests 512", + "--host {{HOST_IP}}", + "--port {{PORT}}", + ], + }, + // ==================================================================== + // AMD MI300X / MI325X / MI355X (ROCm) — TP8, DSA tilelang backend. + // No MTP: disabled in the Speculative card for AMD (the gfx950 spec-decode + // draft kernel is not yet validated, and num-steps>3 hits a separate build + // issue). Strategies differ only by batch-shaping levers + // (cuda-graph-max-bs / max-running-requests / chunked-prefill): + // low-latency — large chunked-prefill, default bs. + // balanced — chunked-prefill 32768 + bs128, max-running 80. + // high-throughput — bs256, max-running 256. + // ACCURACY: the earlier gfx950 block-FP8 bpreshuffle miscompile (GSM8K ~0) is + // fixed as of the pinned mi355x image (...-20260618); MI355X FP8 was re-validated + // (GSM8K ~0.96, NIAH 15/15 to ~118K) and all three FP8 strategies are benchmarked + // + marked verified:true (see glm-5.2-benchmarks.jsx). All BF16 and all gfx942 + // (MI325X/MI300X) cells stay verified:false (not yet benchmarked, but correct). + // BF16 (~1.51 TB) only fits single-node on MI325X (2 TB) / MI355X (2.3 TB); + // MI300X (1.5 TB) needs multi-node, so its BF16 cells are omitted. + // ==================================================================== + { + match: { hw: "mi355x", variant: "default", quant: "fp8", strategy: "low-latency", nodes: "single" }, + verified: true, + env: [], + flags: [ + "--model-path {{MODEL_NAME}}", + "--tp 8", + "--dsa-prefill-backend tilelang", + "--dsa-decode-backend tilelang", + "--chunked-prefill-size 131072", + "--mem-fraction-static 0.80", + "--watchdog-timeout 1200", + "--host {{HOST_IP}}", + "--port {{PORT}}", + ], + }, + { + match: { hw: "mi355x", variant: "default", quant: "fp8", strategy: "balanced", nodes: "single" }, + verified: true, + env: [], + flags: [ + "--model-path {{MODEL_NAME}}", + "--tp 8", + "--dsa-prefill-backend tilelang", + "--dsa-decode-backend tilelang", + "--chunked-prefill-size 32768", + "--mem-fraction-static 0.85", + "--cuda-graph-max-bs 128", + "--max-running-requests 80", + "--watchdog-timeout 1200", + "--host {{HOST_IP}}", + "--port {{PORT}}", + ], + }, + { + match: { hw: "mi355x", variant: "default", quant: "fp8", strategy: "high-throughput", nodes: "single" }, + verified: true, + env: [], + flags: [ + "--model-path {{MODEL_NAME}}", + "--tp 8", + "--dsa-prefill-backend tilelang", + "--dsa-decode-backend tilelang", + "--mem-fraction-static 0.85", + "--cuda-graph-max-bs 256", + "--max-running-requests 256", + "--watchdog-timeout 1200", + "--host {{HOST_IP}}", + "--port {{PORT}}", + ], + }, + { + match: { hw: "mi355x", variant: "default", quant: "bf16", strategy: "low-latency", nodes: "single" }, + verified: false, + env: [], + flags: [ + "--model-path {{MODEL_NAME}}", + "--tp 8", + "--dsa-prefill-backend tilelang", + "--dsa-decode-backend tilelang", + "--chunked-prefill-size 131072", + "--mem-fraction-static 0.80", + "--watchdog-timeout 1200", + "--host {{HOST_IP}}", + "--port {{PORT}}", + ], + }, + { + match: { hw: "mi355x", variant: "default", quant: "bf16", strategy: "balanced", nodes: "single" }, + verified: false, + env: [], + flags: [ + "--model-path {{MODEL_NAME}}", + "--tp 8", + "--dsa-prefill-backend tilelang", + "--dsa-decode-backend tilelang", + "--chunked-prefill-size 32768", + "--mem-fraction-static 0.85", + "--cuda-graph-max-bs 128", + "--max-running-requests 80", + "--watchdog-timeout 1200", + "--host {{HOST_IP}}", + "--port {{PORT}}", + ], + }, + { + match: { hw: "mi355x", variant: "default", quant: "bf16", strategy: "high-throughput", nodes: "single" }, + verified: false, + env: [], + flags: [ + "--model-path {{MODEL_NAME}}", + "--tp 8", + "--dsa-prefill-backend tilelang", + "--dsa-decode-backend tilelang", + "--mem-fraction-static 0.85", + "--cuda-graph-max-bs 256", + "--max-running-requests 256", + "--watchdog-timeout 1200", + "--host {{HOST_IP}}", + "--port {{PORT}}", + ], + }, + // ==================================================================== + // AMD MI355X + MXFP4 — amd/GLM-5.2-MXFP4 (Quark). TP4: the 4-bit MoE + // weights fit a 4-GPU slice, mirroring the amd/GLM-5.1-MXFP4 MI355X recipe (same DSA + // architecture family) — --trust-remote-code (Quark custom quant config) + // and --kv-cache-dtype fp8_e4m3 both come from that precedent. Pinned to a + // newer image (v0.5.16, see dockerImages["mi355x|mxfp4"]) than the FP8/BF16 + // mi355x cells. MTP (mtp-314, steps=3) is validated on MI355X gfx950 with + // this precision — see the mtp-314 cell below. Not yet benchmarked for + // GLM-5.2 on the base strategies → verified:false. + // ==================================================================== + { + match: { hw: "mi355x", variant: "default", quant: "mxfp4", strategy: "low-latency", nodes: "single" }, + verified: false, + env: [], + flags: [ + "--trust-remote-code", + "--model-path {{MODEL_NAME}}", + "--tp 4", + "--kv-cache-dtype fp8_e4m3", + "--dsa-prefill-backend tilelang", + "--dsa-decode-backend tilelang", + "--chunked-prefill-size 131072", + "--mem-fraction-static 0.80", + "--watchdog-timeout 1200", + "--host {{HOST_IP}}", + "--port {{PORT}}", + ], + }, + { + match: { hw: "mi355x", variant: "default", quant: "mxfp4", strategy: "balanced", nodes: "single" }, + verified: false, + env: [], + flags: [ + "--trust-remote-code", + "--model-path {{MODEL_NAME}}", + "--tp 4", + "--kv-cache-dtype fp8_e4m3", + "--dsa-prefill-backend tilelang", + "--dsa-decode-backend tilelang", + "--chunked-prefill-size 32768", + "--mem-fraction-static 0.85", + "--cuda-graph-max-bs 128", + "--max-running-requests 80", + "--watchdog-timeout 1200", + "--host {{HOST_IP}}", + "--port {{PORT}}", + ], + }, + { + match: { hw: "mi355x", variant: "default", quant: "mxfp4", strategy: "high-throughput", nodes: "single" }, + verified: false, + env: [], + flags: [ + "--trust-remote-code", + "--model-path {{MODEL_NAME}}", + "--tp 4", + "--kv-cache-dtype fp8_e4m3", + "--dsa-prefill-backend tilelang", + "--dsa-decode-backend tilelang", + "--mem-fraction-static 0.85", + "--cuda-graph-max-bs 256", + "--max-running-requests 256", + "--watchdog-timeout 1200", + "--host {{HOST_IP}}", + "--port {{PORT}}", + ], + }, + // MI355X + MXFP4 + MTP (mtp-314): validated AgentX recipe. + // steps=3 stays within the gfx950 spec-decode build envelope (≤3). + // mem-fraction-static 0.80: headroom for MTP draft buffer on top of + // 4-bit MoE weights + KV cache (matches InferenceX AgentX harness conc≤16). + // For benchmarking: set SGLANG_SIMULATE_ACC_LEN=2.99, + // SGLANG_SIMULATE_ACC_METHOD=match-expected, + // SGLANG_SIMULATE_ACC_TOKEN_MODE=real-draft-token + // (golden AL: golden_al_distribution/glm5.2_mtp.yaml, thinking_on, num_speculative_tokens=3). + { + match: { hw: "mi355x", variant: "default", quant: "mxfp4", strategy: "mtp-314", nodes: "single" }, + verified: false, + env: [], + flags: [ + "--trust-remote-code", + "--model-path {{MODEL_NAME}}", + "--tp 4", + "--kv-cache-dtype fp8_e4m3", + "--dsa-prefill-backend tilelang", + "--dsa-decode-backend tilelang", + "--speculative-algorithm EAGLE", + "--speculative-num-steps 3", + "--speculative-eagle-topk 1", + "--speculative-num-draft-tokens 4", + "--chunked-prefill-size 131072", + "--mem-fraction-static 0.80", + "--cuda-graph-max-bs 160", + "--max-running-requests 160", + "--watchdog-timeout 1800", + "--host {{HOST_IP}}", + "--port {{PORT}}", + ], + }, + { + match: { hw: "mi325x", variant: "default", quant: "fp8", strategy: "low-latency", nodes: "single" }, + verified: false, + env: [], + flags: [ + "--model-path {{MODEL_NAME}}", + "--tp 8", + "--dsa-prefill-backend tilelang", + "--dsa-decode-backend tilelang", + "--chunked-prefill-size 131072", + "--mem-fraction-static 0.80", + "--watchdog-timeout 1200", + "--host {{HOST_IP}}", + "--port {{PORT}}", + ], + }, + { + match: { hw: "mi325x", variant: "default", quant: "fp8", strategy: "balanced", nodes: "single" }, + verified: false, + env: [], + flags: [ + "--model-path {{MODEL_NAME}}", + "--tp 8", + "--dsa-prefill-backend tilelang", + "--dsa-decode-backend tilelang", + "--chunked-prefill-size 32768", + "--mem-fraction-static 0.85", + "--cuda-graph-max-bs 128", + "--max-running-requests 80", + "--watchdog-timeout 1200", + "--host {{HOST_IP}}", + "--port {{PORT}}", + ], + }, + { + match: { hw: "mi325x", variant: "default", quant: "fp8", strategy: "high-throughput", nodes: "single" }, + verified: false, + env: [], + flags: [ + "--model-path {{MODEL_NAME}}", + "--tp 8", + "--dsa-prefill-backend tilelang", + "--dsa-decode-backend tilelang", + "--mem-fraction-static 0.85", + "--cuda-graph-max-bs 256", + "--max-running-requests 256", + "--watchdog-timeout 1200", + "--host {{HOST_IP}}", + "--port {{PORT}}", + ], + }, + { + match: { hw: "mi325x", variant: "default", quant: "bf16", strategy: "low-latency", nodes: "single" }, + verified: false, + env: [], + flags: [ + "--model-path {{MODEL_NAME}}", + "--tp 8", + "--dsa-prefill-backend tilelang", + "--dsa-decode-backend tilelang", + "--chunked-prefill-size 131072", + "--mem-fraction-static 0.80", + "--watchdog-timeout 1200", + "--host {{HOST_IP}}", + "--port {{PORT}}", + ], + }, + { + match: { hw: "mi325x", variant: "default", quant: "bf16", strategy: "balanced", nodes: "single" }, + verified: false, + env: [], + flags: [ + "--model-path {{MODEL_NAME}}", + "--tp 8", + "--dsa-prefill-backend tilelang", + "--dsa-decode-backend tilelang", + "--chunked-prefill-size 32768", + "--mem-fraction-static 0.85", + "--cuda-graph-max-bs 128", + "--max-running-requests 80", + "--watchdog-timeout 1200", + "--host {{HOST_IP}}", + "--port {{PORT}}", + ], + }, + { + match: { hw: "mi325x", variant: "default", quant: "bf16", strategy: "high-throughput", nodes: "single" }, + verified: false, + env: [], + flags: [ + "--model-path {{MODEL_NAME}}", + "--tp 8", + "--dsa-prefill-backend tilelang", + "--dsa-decode-backend tilelang", + "--mem-fraction-static 0.85", + "--cuda-graph-max-bs 256", + "--max-running-requests 256", + "--watchdog-timeout 1200", + "--host {{HOST_IP}}", + "--port {{PORT}}", + ], + }, + { + match: { hw: "mi300x", variant: "default", quant: "fp8", strategy: "low-latency", nodes: "single" }, + verified: false, + env: [], + flags: [ + "--model-path {{MODEL_NAME}}", + "--tp 8", + "--dsa-prefill-backend tilelang", + "--dsa-decode-backend tilelang", + "--chunked-prefill-size 131072", + "--mem-fraction-static 0.80", + "--watchdog-timeout 1200", + "--host {{HOST_IP}}", + "--port {{PORT}}", + ], + }, + { + match: { hw: "mi300x", variant: "default", quant: "fp8", strategy: "balanced", nodes: "single" }, + verified: false, + env: [], + flags: [ + "--model-path {{MODEL_NAME}}", + "--tp 8", + "--dsa-prefill-backend tilelang", + "--dsa-decode-backend tilelang", + "--chunked-prefill-size 32768", + "--mem-fraction-static 0.85", + "--cuda-graph-max-bs 128", + "--max-running-requests 80", + "--watchdog-timeout 1200", + "--host {{HOST_IP}}", + "--port {{PORT}}", + ], + }, + { + match: { hw: "mi300x", variant: "default", quant: "fp8", strategy: "high-throughput", nodes: "single" }, + verified: false, + env: [], + flags: [ + "--model-path {{MODEL_NAME}}", + "--tp 8", + "--dsa-prefill-backend tilelang", + "--dsa-decode-backend tilelang", + "--mem-fraction-static 0.85", + "--cuda-graph-max-bs 256", + "--max-running-requests 256", + "--watchdog-timeout 1200", + "--host {{HOST_IP}}", + "--port {{PORT}}", + ], + }, + ], +};