Skip to content
Merged
Show file tree
Hide file tree
Changes from 3 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
25 changes: 14 additions & 11 deletions docs/fern/pages/recipes/_catalog/recipes/glm-5-2.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -11,11 +11,10 @@ model:
precision: NVFP4 + FP8 KV (B200) / FP8 + FP8 KV (H200)
status: validated
artifacts:
recipe_specific_images:
- nvcr.io/nvidia/ai-dynamo/sglang-runtime:1.3.0-glm-5.2-dev.1
recipe_specific_image_periods:
- image: nvcr.io/nvidia/ai-dynamo/sglang-runtime:1.3.0-glm-5.2-dev.1
source_revision: 9ab57d7ecefdd2a2af2e2a2c889724a157457cd6
effective_to: "2026-10-04"
source_kind: github-release
release_tag: v1.3.0-glm-5.2-dev.1
release_state: prerelease
Expand All @@ -24,9 +23,10 @@ targets:
recommended: false
hardware:
gpu: B200
count: 4
count: 16
runtime:
framework: sglang
image: nvcr.io/nvidia/ai-dynamo/sglang-runtime:1.5.1
topology: aggregated
techniques:
- nvfp4
Expand All @@ -44,14 +44,15 @@ targets:
asset: recipes/glm-5.2/perf/perf.yaml
expected_performance:
available: true
summary: 176.42 output tok/s/GPU, 57.49 user tok/s P50, TTFT P50 355.6 ms at concurrency 64 (15% agentic trace subset)
summary: 190.05 output tok/s/GPU, 61.92 user tok/s P50, TTFT P50 228.7 ms at concurrency 64 (4 workers, 15% agentic trace subset)
- id: sglang-disagg-b200
recommended: false
hardware:
gpu: B200
count: 12
count: 20
runtime:
framework: sglang
image: nvcr.io/nvidia/ai-dynamo/sglang-runtime:1.5.1
topology: disaggregated
techniques:
- disaggregated-prefill-decode
Expand All @@ -60,7 +61,7 @@ targets:
- eagle-mtp-spec-dec
- kv-aware-routing
- hicache-cpu-offload
- nixl-ucx
- mooncake
workload:
type: agentic-trace-replay
traffic: Mooncake agentic trace, 64K median ISL / 400 median OSL, 90% KV cache hit, concurrency 128
Expand All @@ -71,14 +72,15 @@ targets:
asset: recipes/glm-5.2/perf/perf.yaml
expected_performance:
available: true
summary: 320.91 output tok/s/GPU, 65.11 user tok/s P50, TTFT P50 1938.1 ms at concurrency 128 (3P1D, 15% agentic trace subset)
summary: 323.82 output tok/s/GPU, 63.13 user tok/s P50, TTFT P50 1280.1 ms at concurrency 128 (3P1D, 15% agentic trace subset)
- id: sglang-agg-h200
recommended: false
hardware:
gpu: H200
count: 8
count: 24
runtime:
framework: sglang
image: nvcr.io/nvidia/ai-dynamo/sglang-runtime:1.5.1
topology: aggregated
techniques:
- fp8
Expand All @@ -95,22 +97,23 @@ targets:
asset: recipes/glm-5.2/perf/perf.yaml
expected_performance:
available: true
summary: 54.55 output tok/s/GPU, 52.37 user tok/s P50, TTFT P50 1790 ms at concurrency 32 (3 workers, 15% agentic trace subset)
summary: 60.87 output tok/s/GPU, 57.33 user tok/s P50, TTFT P50 1158.2 ms at concurrency 32 (3 workers, 15% agentic trace subset)
- id: sglang-disagg-h200
recommended: false
hardware:
gpu: H200
count: 16
runtime:
framework: sglang
image: nvcr.io/nvidia/ai-dynamo/sglang-runtime:1.5.1
topology: disaggregated
techniques:
- disaggregated-prefill-decode
- fp8
- fp8-kv-cache
- eagle-mtp-spec-dec
- kv-aware-routing
- nixl-ucx
- mooncake
workload:
type: agentic-trace-replay
traffic: Mooncake agentic trace, 64K median ISL / 400 median OSL, 90% KV cache hit, concurrency 24
Expand All @@ -121,7 +124,7 @@ targets:
asset: recipes/glm-5.2/perf/perf.yaml
expected_performance:
available: true
summary: 68.86 output tok/s/GPU, 53.88 user tok/s P50, TTFT P50 1874 ms at concurrency 24 (1P1D, 15% agentic trace subset)
summary: 84.33 output tok/s/GPU, 61.46 user tok/s P50, TTFT P50 1309.6 ms at concurrency 24 (1P1D, 15% agentic trace subset)
related_benchmarks: []
maintainer: milesial
gaps:
Expand Down
36 changes: 22 additions & 14 deletions docs/fern/pages/recipes/model-recipes/glm-5-2.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -30,23 +30,23 @@ Each target below is a Dynamo + SGLang deployment of Z.AI's GLM-5.3/5.2 tuned fo
<div className="dynamo-target-picker-summary" data-sku="b200" data-variant="agg">
<span><b>Checkpoint</b> RadixArk/GLM-5.3-NVFP4 / nvidia/GLM-5.2-NVFP4</span>
<span><b>Precision</b> NVFP4 + FP8 KV cache</span>
<span><b>GPUs</b> 4x B200, one worker</span>
<span><b>GPUs</b> 16x B200 (4 workers x 4)</span>
<span><b>Parallelism</b> DTP4</span>
<span><b>Routing</b> KV-aware</span>
<span><b>Context</b> Up to 500K, HiCache CPU offload</span>
</div>
<div className="dynamo-target-picker-summary" data-sku="b200" data-variant="disagg">
<span><b>Checkpoint</b> RadixArk/GLM-5.3-NVFP4 / nvidia/GLM-5.2-NVFP4</span>
<span><b>Precision</b> NVFP4 + FP8 KV cache</span>
<span><b>GPUs</b> 4x B200 prefill + 8x B200 decode</span>
<span><b>GPUs</b> 20x B200 (3 prefill x 4 + 1 decode x 8)</span>
<span><b>Parallelism</b> DEP4 prefill / DTP8 decode</span>
<span><b>Routing</b> KV-aware, NIXL/UCX over IB</span>
<span><b>Routing</b> KV-aware, Mooncake over IB</span>
<span><b>Context</b> Up to 500K, HiCache CPU offload</span>
</div>
<div className="dynamo-target-picker-summary" data-sku="h200" data-variant="agg">
<span><b>Checkpoint</b> zai-org/GLM-5.3 / zai-org/GLM-5.2-FP8</span>
<span><b>Precision</b> FP8 + FP8 KV cache</span>
<span><b>GPUs</b> 8x H200, one worker</span>
<span><b>GPUs</b> 24x H200 (3 workers x 8)</span>
<span><b>Parallelism</b> TP8/EP8</span>
<span><b>Routing</b> KV-aware</span>
<span><b>Context</b> Up to 250K</span>
Expand All @@ -56,7 +56,7 @@ Each target below is a Dynamo + SGLang deployment of Z.AI's GLM-5.3/5.2 tuned fo
<span><b>Precision</b> FP8 + FP8 KV cache</span>
<span><b>GPUs</b> 8x H200 prefill + 8x H200 decode</span>
<span><b>Parallelism</b> TP8/EP8 prefill / TP8/DP8/EP1 decode</span>
<span><b>Routing</b> KV-aware, NIXL/UCX over IB</span>
<span><b>Routing</b> KV-aware, Mooncake over IB</span>
<span><b>Context</b> Up to 250K</span>
</div>
</div>
Expand All @@ -65,14 +65,14 @@ Each target below is a Dynamo + SGLang deployment of Z.AI's GLM-5.3/5.2 tuned fo

<div data-sku="b200">

- A Kubernetes cluster with the Dynamo platform installed and B200 GPUs available — 4x for aggregated, 12x for disaggregated. See the [Kubernetes Deployment Guide](../../kubernetes/getting-started/quickstart.mdx).
- A Kubernetes cluster with the Dynamo platform installed and B200 GPUs available — 16x for aggregated, 20x for disaggregated. See the [Kubernetes Deployment Guide](../../kubernetes/getting-started/quickstart.mdx).
- A Hugging Face token with access to `RadixArk/GLM-5.3-NVFP4` / `nvidia/GLM-5.2-NVFP4`.

</div>

<div data-sku="h200">

- A Kubernetes cluster with the Dynamo platform installed and H200 GPUs available — 8x for aggregated, 16x for disaggregated. See the [Kubernetes Deployment Guide](../../kubernetes/getting-started/quickstart.mdx).
- A Kubernetes cluster with the Dynamo platform installed and H200 GPUs available — 24x for aggregated, 16x for disaggregated. See the [Kubernetes Deployment Guide](../../kubernetes/getting-started/quickstart.mdx).
- A Hugging Face token with access to `zai-org/GLM-5.3` / `zai-org/GLM-5.2-FP8`.

</div>
Expand Down Expand Up @@ -102,7 +102,7 @@ kubectl apply -f recipes/glm-5.2/model-cache/model-download.yaml -n ${NAMESPACE}
kubectl wait --for=condition=Complete job/model-download -n ${NAMESPACE} --timeout=7200s
```

When serving GLM-5.3, update every `model-path` in the target DGD to `RadixArk/GLM-5.3-NVFP4` for B200 or `zai-org/GLM-5.3` for H200, and update every `served-model-name` to `zai-org/GLM-5.3`.
When serving GLM-5.2, update every `model-path` in the target DGD to `nvidia/GLM-5.2-NVFP4` for B200 or `zai-org/GLM-5.2-FP8` for H200, and update every `served-model-name` to `zai-org/GLM-5.2`.

Then deploy the target DGD:

Expand Down Expand Up @@ -195,7 +195,7 @@ curl http://localhost:8000/v1/chat/completions \

A single AIPerf trace-replay Job — `perf/perf.yaml` — covers all four DGDs. It replays a Mooncake-format agentic trace (64K ISL / 400 OSL, 90% KV cache hit rate) at one concurrency value and writes artifacts to the shared `model-cache` PVC. The benchmark pod is co-located with a DGD frontend through `podAffinity`.

Edit the `env` block in `perf/perf.yaml` to target your deployed DGD — set `ENDPOINT` to the matching frontend service, `SYNTHESIS_MAX_ISL` to its context limit, and `CONCURRENCY` to the value for that target. The `CONCURRENCY` values below reproduce the [Expected Performance (run on GLM-5.2)](#expected-performance-run-on-glm-52) numbers:
Edit the `env` block in `perf/perf.yaml` to target your deployed DGD — set `ENDPOINT` to the matching frontend service, `SYNTHESIS_MAX_ISL` to its context limit, and `CONCURRENCY` to the value for that target. The `CONCURRENCY` values below reproduce the [Expected Performance (run on GLM-5.3)](#expected-performance-run-on-glm-53) numbers. The rows also require `SGLANG_SIMULATE_ACC_LEN=2.69`, `SGLANG_SIMULATE_ACC_METHOD=match-expected`, and `SGLANG_SIMULATE_ACC_TOKEN_MODE=real-draft-token` uncommented on the aggregated workers or the disaggregated decode workers (see [perf/README.md](https://github.com/ai-dynamo/dynamo/blob/main/recipes/glm-5.2/perf/README.md)); keep them commented for accuracy evaluation and production:

| Target | `ENDPOINT` | `SYNTHESIS_MAX_ISL` | `CONCURRENCY` |
| --- | --- | --- | --- |
Expand All @@ -213,13 +213,19 @@ kubectl wait --for=condition=Complete job/glm52-bench -n ${NAMESPACE} --timeout=

For trace staging, concurrency sweeps, and fetching artifacts, see the [benchmark README](https://github.com/ai-dynamo/dynamo/blob/main/recipes/glm-5.2/perf/README.md).

## Expected Performance (run on GLM-5.2)
## Expected Performance (run on GLM-5.3)

Measured on the 15% agentic trace subset. System throughput is per-GPU output tokens per second; user throughput is the P50 per-request output rate.

| | Concurrency | System output tok/s/GPU | User output tok/s (P50) | TTFT P50 (ms) |
|---|---|---|---|---|
| <span data-sku="b200" data-variant="agg">**B200 aggregated** (4 workers)</span><span data-sku="b200" data-variant="disagg">**B200 disaggregated** (3P1D)</span><span data-sku="h200" data-variant="agg">**H200 aggregated** (3 workers)</span><span data-sku="h200" data-variant="disagg">**H200 disaggregated** (1P1D)</span> | <span data-sku="b200" data-variant="agg">64</span><span data-sku="b200" data-variant="disagg">128</span><span data-sku="h200" data-variant="agg">32</span><span data-sku="h200" data-variant="disagg">24</span> | <span data-sku="b200" data-variant="agg">176.420</span><span data-sku="b200" data-variant="disagg">320.907</span><span data-sku="h200" data-variant="agg">54.550</span><span data-sku="h200" data-variant="disagg">68.860</span> | <span data-sku="b200" data-variant="agg">57.493</span><span data-sku="b200" data-variant="disagg">65.105</span><span data-sku="h200" data-variant="agg">52.370</span><span data-sku="h200" data-variant="disagg">53.880</span> | <span data-sku="b200" data-variant="agg">355.555</span><span data-sku="b200" data-variant="disagg">1938.059</span><span data-sku="h200" data-variant="agg">1790.000</span><span data-sku="h200" data-variant="disagg">1874.000</span> |
| <span data-sku="b200" data-variant="agg">**B200 aggregated** (4 workers)</span><span data-sku="b200" data-variant="disagg">**B200 disaggregated** (3P1D)</span><span data-sku="h200" data-variant="agg">**H200 aggregated** (3 workers)</span><span data-sku="h200" data-variant="disagg">**H200 disaggregated** (1P1D)</span> | <span data-sku="b200" data-variant="agg">64</span><span data-sku="b200" data-variant="disagg">128</span><span data-sku="h200" data-variant="agg">32</span><span data-sku="h200" data-variant="disagg">24</span> | <span data-sku="b200" data-variant="agg">190.048</span><span data-sku="b200" data-variant="disagg">323.821</span><span data-sku="h200" data-variant="agg">60.866</span><span data-sku="h200" data-variant="disagg">84.335</span> | <span data-sku="b200" data-variant="agg">61.923</span><span data-sku="b200" data-variant="disagg">63.133</span><span data-sku="h200" data-variant="agg">57.330</span><span data-sku="h200" data-variant="disagg">61.460</span> | <span data-sku="b200" data-variant="agg">228.700</span><span data-sku="b200" data-variant="disagg">1280.100</span><span data-sku="h200" data-variant="agg">1158.200</span><span data-sku="h200" data-variant="disagg">1309.600</span> |
Comment thread
shugandhi marked this conversation as resolved.
Resolved

<div data-sku="h200">

3,535 of 3,541 trace requests completed; 6 requests exceed the 250K context limit.

</div>

## Compare All Targets

Expand All @@ -229,21 +235,23 @@ All four targets serve GLM-5.3/5.2 on SGLang with KV-aware routing and EAGLE-sty
|---|---|---|---|---|
| **Checkpoint** | RadixArk/GLM-5.3-NVFP4 / nvidia/GLM-5.2-NVFP4 | RadixArk/GLM-5.3-NVFP4 / nvidia/GLM-5.2-NVFP4 | zai-org/GLM-5.3 / zai-org/GLM-5.2-FP8 | zai-org/GLM-5.3 / zai-org/GLM-5.2-FP8 |
| **Precision** | NVFP4 + FP8 KV | NVFP4 + FP8 KV | FP8 + FP8 KV | FP8 + FP8 KV |
| **GPUs** | 4x B200 | 4x B200 prefill + 8x B200 decode | 8x H200 | 8x H200 prefill + 8x H200 decode |
| **GPUs** | 16x B200 (4 workers x 4) | 20x B200 (3 prefill x 4 + 1 decode x 8) | 24x H200 (3 workers x 8) | 16x H200 (8 prefill + 8 decode) |
| **Parallelism** | DTP4 | DEP4 / DTP8 | TP8/EP8 | TP8/EP8 prefill / TP8/DP8/EP1 decode |
| **KV offload** | HiCache CPU | HiCache CPU | None | None |
| **Max context** | 500K | 500K | 250K | 250K |
| **Image** | `sglang-runtime:1.5.1` | `sglang-runtime:1.5.1` | `sglang-runtime:1.5.1` | `sglang-runtime:1.5.1` |

## Notes

- Speculative decoding uses EAGLE-style MTP with draft length 3, measured at a SpeedBench acceptance length of 2.69.
- All four targets use KV-aware routing at the frontend. The B200 targets add HiCache CPU offload; the agentic traces are shaped to show the value of KV-aware routing and offloading.
- The disaggregated targets transfer KV over NIXL/UCX on InfiniBand.
- The disaggregated targets transfer KV over Mooncake on InfiniBand.
- The H200 disaggregated decode worker uses `mem-fraction-static: 0.95`; at 0.88 the per-rank KV pool is smaller than one 250K-token request.

## Limitations

- B200 targets support up to 500K context; the full 1M context length is not supported out of the box. H200 targets support up to 250K context.
- Structured decoding requires reasoning to be disabled (`"chat_template_kwargs": {"enable_thinking": false}`) so the output lands in the `content` field instead of `reasoning_content`.
- Structured decoding works with reasoning enabled: the generated JSON is populated in the `content` field and the chain-of-thought in `reasoning_content`. This requires both `--dyn-reasoning-parser glm45` (frontend) and `--reasoning-parser glm45` (engine), which the recipes set.
- `n>1` requests are not supported with the disaggregated targets.

## Source
Expand Down
8 changes: 6 additions & 2 deletions docs/tests/test_recipe_catalog_artifacts.py
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@
),
(
"glm-5-2",
("nvcr.io/nvidia/ai-dynamo/sglang-runtime:1.3.0-glm-5.2-dev.1",),
(),
),
(
"inkling",
Expand Down Expand Up @@ -70,7 +70,10 @@ def test_recipe_specific_images_are_catalog_owned(
expected_images: tuple[str, ...],
) -> None:
document = yaml.safe_load((CATALOG / "recipes" / f"{recipe_id}.yaml").read_text())
assert tuple(document["artifacts"]["recipe_specific_images"]) == expected_images
assert (
tuple(document["artifacts"].get("recipe_specific_images", ()))
== expected_images
)


@pytest.mark.parametrize(
Expand All @@ -94,6 +97,7 @@ def test_recipe_specific_images_are_catalog_owned(
{
"image": "nvcr.io/nvidia/ai-dynamo/sglang-runtime:1.3.0-glm-5.2-dev.1",
"source_revision": "9ab57d7ecefdd2a2af2e2a2c889724a157457cd6",
"effective_to": "2026-10-04",
"source_kind": "github-release",
"release_tag": "v1.3.0-glm-5.2-dev.1",
"release_state": "prerelease",
Expand Down
26 changes: 15 additions & 11 deletions recipes/glm-5.2/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,9 @@ Dynamo + SGLang deployment profiles for the B200 and H200 agentic workload:
| **Speculative decoding** | EAGLE-style MTP (DL=3, SpeedBench AL=2.69) | EAGLE-style MTP (DL=3, SpeedBench AL=2.69) | EAGLE-style MTP (DL=3, SpeedBench AL=2.69) | EAGLE-style MTP (DL=3, SpeedBench AL=2.69) |
| **Context length** | 500,000 | 500,000 | 250,000 | 250,000 |
| **KV cache offloading** | HiCache CPU | HiCache CPU | None | None |
| **KV transfer** | N/A | NIXL/UCX over IB | N/A | NIXL/UCX over IB |
| **KV transfer** | N/A | Mooncake over IB | N/A | Mooncake over IB |

All four variants run on `nvcr.io/nvidia/ai-dynamo/sglang-runtime:1.5.1` (Dynamo 1.5.1, SGLang 0.5.18).


## Supported features
Expand Down Expand Up @@ -72,9 +74,9 @@ kubectl wait --for=condition=Complete job/model-download -n ${NAMESPACE} --timeo

### 4. Deploy the DGD

When serving GLM-5.3, update every `model-path` in the target DGD to
`RadixArk/GLM-5.3-NVFP4` for B200 or `zai-org/GLM-5.3` for H200, and update every
`served-model-name` to `zai-org/GLM-5.3`.
When serving GLM-5.2, update every `model-path` in the target DGD to
`nvidia/GLM-5.2-NVFP4` for B200 or `zai-org/GLM-5.2-FP8` for H200, and update every
`served-model-name` to `zai-org/GLM-5.2`.

Deploy the target DGD:

Expand All @@ -100,15 +102,17 @@ See [perf/README.md](perf/README.md) for the full benchmark workflow — trace s

Modified Mooncake traces are provided to showcase the value of KV-aware routing and CPU offloading, see [perf/README.md](perf/README.md) for details.

## Performance results (run on GLM-5.2)
## Performance results (run on GLM-5.3)


| Workload | Framework | Recipe | SKU | GPUs | Concurrency | System output tok/s/GPU | User output tok/s (P50) | TTFT P50 (ms) |
| -------------------- | --------- | ---------------------- | ---- | ---- | ----------- | ----------------------- | ----------------------- | ------------- |
| Agentic (15% subset) | SGLang | Aggregated (4 workers) | B200 | 16 | 64 | 190.048 | 61.923 | 228.700 |
| Agentic (15% subset) | SGLang | Disaggregated (3P1D) | B200 | 20 | 128 | 323.821 | 63.133 | 1280.100 |
| Agentic (15% subset) | SGLang | Aggregated (3 workers) | H200 | 24 | 32 | 60.866 | 57.330 | 1158.200 |
| Agentic (15% subset) | SGLang | Disaggregated (1P1D) | H200 | 16 | 24 | 84.335 | 61.460 | 1309.600 |

| Workload | Recipe | SKU | Concurrency | System output tok/s/gpu | User output tok/s (P50) | TTFT P50 (ms) |
| -------------------- | ---------------------- | ---- | ----------- | ----------------------- | ----------------------- | ------------- |
| Agentic (15% subset) | Aggregated (4 workers) | B200 | 64 | 176.420 | 57.493 | 355.555 |
| Agentic (15% subset) | Disaggregated (3P1D) | B200 | 128 | 320.907 | 65.105 | 1938.059 |
| Agentic (15% subset) | Aggregated (3 workers) | H200 | 32 | 54.550 | 52.370 | 1790.000 |
| Agentic (15% subset) | Disaggregated (1P1D) | H200 | 24 | 68.860 | 53.880 | 1874.000 |
The rows require `SGLANG_SIMULATE_ACC_LEN=2.69`, `SGLANG_SIMULATE_ACC_METHOD=match-expected`, and `SGLANG_SIMULATE_ACC_TOKEN_MODE=real-draft-token` uncommented on the aggregated workers or the disaggregated decode workers (see [perf/README.md](perf/README.md)); keep them commented for accuracy evaluation and production. H200 rows: 3,535 of 3,541 trace requests completed; 6 requests exceed the 250K context limit.



Expand Down
Loading
Loading