From 3a2e7a4a59b5ae924722a8c385be27c752d56c4f Mon Sep 17 00:00:00 2001 From: Cam Quilici Date: Fri, 7 Aug 2026 15:40:35 -0500 Subject: [PATCH 1/7] feat: refresh GLM-5.2 H200 AgentX with MTP --- ...g-h200-2p2d-pcp8-tp8-dp8-hisparse-mtp.yaml | 152 ++++++++++++++++++ configs/nvidia-master.yaml | 70 ++++++++ runners/launch_h200-dgxc-slurm.sh | 70 ++++++-- 3 files changed, 280 insertions(+), 12 deletions(-) create mode 100644 benchmarks/multi_node/srt-slurm-recipes/sglang/glm5.2/agentic/disagg-h200-2p2d-pcp8-tp8-dp8-hisparse-mtp.yaml diff --git a/benchmarks/multi_node/srt-slurm-recipes/sglang/glm5.2/agentic/disagg-h200-2p2d-pcp8-tp8-dp8-hisparse-mtp.yaml b/benchmarks/multi_node/srt-slurm-recipes/sglang/glm5.2/agentic/disagg-h200-2p2d-pcp8-tp8-dp8-hisparse-mtp.yaml new file mode 100644 index 0000000000..781d19db41 --- /dev/null +++ b/benchmarks/multi_node/srt-slurm-recipes/sglang/glm5.2/agentic/disagg-h200-2p2d-pcp8-tp8-dp8-hisparse-mtp.yaml @@ -0,0 +1,152 @@ +name: "disagg-h200-2p2d-pcp8-tp8-dp8-hisparse-mtp" + +# Refresh of Actions run 30133535261. The serving topology and HiSparse +# settings are preserved; EAGLE MTP uses the committed GLM-5.2 golden +# thinking-on acceptance length for three speculative steps. + +model: + path: "glm5.2-fp8" + container: "lmsysorg/sglang:v0.5.16-cu130" + precision: "fp8" + +dynamo: + install: true + wheel: "1.3.0.dev1" + +slurm: + time_limit: "8:00:00" + +resources: + gpu_type: h200 + gpus_per_node: 8 + prefill_nodes: 2 + decode_nodes: 2 + prefill_workers: 2 + decode_workers: 2 + gpus_per_prefill: 8 + gpus_per_decode: 8 + +infra: + etcd_nats_dedicated_node: true + nats_max_payload_mb: 32 + +frontend: + type: dynamo + nginx_session_affinity: true + nginx_session_affinity_header: X-Correlation-ID + env: + DYN_ROUTER_TEMPERATURE: "10000000" + PIP_BREAK_SYSTEM_PACKAGES: "1" + args: + router-mode: "kv" + router-reset-states: true + active-decode-blocks-threshold: "None" + active-prefill-tokens-threshold: "None" + active-prefill-tokens-threshold-frac: "None" + +backend: + type: sglang + prefill_environment: + HF_HOME: "/hf_hub_cache" + HF_HUB_CACHE: "/hf_hub_cache" + PIP_BREAK_SYSTEM_PACKAGES: "1" + PYTHONUNBUFFERED: "1" + SGLANG_DISAGGREGATION_WAITING_TIMEOUT: "900" + SGLANG_MOONCAKE_CUSTOM_MEM_POOL: "True" + SGLANG_OPT_USE_TOPK_V2: "1" + SGLANG_TIMEOUT_KEEP_ALIVE: "900" + decode_environment: + HF_HOME: "/hf_hub_cache" + HF_HUB_CACHE: "/hf_hub_cache" + PIP_BREAK_SYSTEM_PACKAGES: "1" + PYTHONUNBUFFERED: "1" + SGLANG_DISAGGREGATION_WAITING_TIMEOUT: "900" + SGLANG_MOONCAKE_CUSTOM_MEM_POOL: "True" + SGLANG_OPT_USE_TOPK_V2: "1" + SGLANG_TIMEOUT_KEEP_ALIVE: "900" + SGLANG_SIMULATE_ACC_LEN: "2.99" + SGLANG_SIMULATE_ACC_METHOD: "match-expected" + SGLANG_SIMULATE_ACC_TOKEN_MODE: "real-draft-token" + + sglang_config: + prefill: + host: 0.0.0.0 + model-path: /model/ + served-model-name: zai-org/GLM-5.2-FP8 + trust-remote-code: true + tool-call-parser: glm47 + reasoning-parser: glm45 + tp-size: 8 + ep-size: 1 + attn-cp-size: 8 + enable-prefill-cp: true + cp-strategy: interleave + enable-dsa-cache-layer-split: true + disaggregation-transfer-backend: mooncake + disaggregation-mode: prefill + kv-cache-dtype: fp8_e4m3 + context-length: 1048576 + max-total-tokens: 1048576 + chunked-prefill-size: 32768 + mem-fraction-static: 0.85 + max-running-requests: 32 + speculative-algorithm: EAGLE + speculative-num-steps: 3 + speculative-eagle-topk: 1 + speculative-num-draft-tokens: 4 + watchdog-timeout: 86400 + stream-interval: 60 + enable-metrics: true + + decode: + host: 0.0.0.0 + model-path: /model/ + served-model-name: zai-org/GLM-5.2-FP8 + trust-remote-code: true + tool-call-parser: glm47 + reasoning-parser: glm45 + tp-size: 8 + dp-size: 8 + ep-size: 1 + enable-dp-attention: true + disaggregation-transfer-backend: mooncake + disaggregation-mode: decode + kv-cache-dtype: fp8_e4m3 + dsa-decode-backend: flashmla_kv + context-length: 1048576 + max-total-tokens: 1048576 + mem-fraction-static: 0.85 + max-running-requests: 200 + page-size: 64 + disable-radix-cache: true + enable-hisparse: true + hisparse-config: '{"top_k":2048,"device_buffer_size":4096,"host_to_device_ratio":5}' + speculative-algorithm: EAGLE + speculative-num-steps: 3 + speculative-eagle-topk: 1 + speculative-num-draft-tokens: 4 + watchdog-timeout: 86400 + stream-interval: 60 + enable-metrics: true + +sbatch_directives: + mem: "0" + +srun_options: + mem: "0" + container-remap-root: "" + +benchmark: + type: custom + command: bash /infmax-workspace/benchmarks/multi_node/agentic_srt.sh + env: + INFMAX_CONTAINER_WORKSPACE: /infmax-workspace + RESULT_DIR: /logs/agentic + PORT: "8000" + IS_MULTINODE: "true" + AIPERF_USE_DYNAMO_CONV_AWARE_ROUTING: "0" + AIPERF_HTTP_X_DYNAMO_SESSION_ID_FROM_CORRELATION_ID: "true" + AIPERF_REQUIRED_SERVER_METRIC_PREFIX: "sglang:" + AIPERF_DATASET_MMAP_CACHE_DIR: "/aiperf_mmap_cache" + HF_HUB_CACHE: "/hf_hub_cache" + WEKA_LOADER_OVERRIDE: "semianalysis_cc_traces_weka_062126" diff --git a/configs/nvidia-master.yaml b/configs/nvidia-master.yaml index afd34f6ed4..181db5b6ca 100644 --- a/configs/nvidia-master.yaml +++ b/configs/nvidia-master.yaml @@ -7626,6 +7626,76 @@ qwen3.5-fp8-gb300-dynamo-sglang: ep: 16 dp-attn: true +# GLM-5.2 FP8 full-context AgentX refresh on H200. This preserves the +# successful 2P2D PCP8/TP8-DP8 HiSparse topology and c8/c12/c16 curve from +# Actions run 30133535261 while enabling native EAGLE MTP with golden AL. +glm5.2-fp8-h200-dynamo-sglang-agentic-mtp-hisparse-2p2d: + image: lmsysorg/sglang:v0.5.16-cu130 + model: zai-org/GLM-5.2-FP8 + model-prefix: glm5.2 + runner: cluster:h200-dgxc + precision: fp8 + framework: dynamo-sglang + router: { name: dynamo-router, version: "1.3.0.dev1" } + kv-p2p-transfer: mooncake + multinode: true + disagg: true + scenarios: + agentic-coding: + - dram-utilization: 0.80 + search-space: + - spec-decoding: mtp + conc-list: [8] + kv-offloading: dram + kv-offload-backend: { name: hisparse } + prefill: + num-worker: 2 + tp: 1 + pcp-size: 8 + ep: 1 + dp-attn: false + additional-settings: + - "CONFIG_FILE=recipes/sglang/glm5.2/agentic/disagg-h200-2p2d-pcp8-tp8-dp8-hisparse-mtp.yaml" + decode: + num-worker: 2 + tp: 8 + ep: 1 + dp-attn: true + - spec-decoding: mtp + conc-list: [12] + kv-offloading: dram + kv-offload-backend: { name: hisparse } + prefill: + num-worker: 2 + tp: 1 + pcp-size: 8 + ep: 1 + dp-attn: false + additional-settings: + - "CONFIG_FILE=recipes/sglang/glm5.2/agentic/disagg-h200-2p2d-pcp8-tp8-dp8-hisparse-mtp.yaml" + decode: + num-worker: 2 + tp: 8 + ep: 1 + dp-attn: true + - spec-decoding: mtp + conc-list: [16] + kv-offloading: dram + kv-offload-backend: { name: hisparse } + prefill: + num-worker: 2 + tp: 1 + pcp-size: 8 + ep: 1 + dp-attn: false + additional-settings: + - "CONFIG_FILE=recipes/sglang/glm5.2/agentic/disagg-h200-2p2d-pcp8-tp8-dp8-hisparse-mtp.yaml" + decode: + num-worker: 2 + tp: 8 + ep: 1 + dp-attn: true + # GLM-5.2 B300 NVFP4 AgentX frontier from the SGLang cookbook B300 NVFP4 # single-node recipes (https://docs.sglang.io/cookbook/autoregressive/GLM/GLM-5.2), # STP only (the cookbook's EAGLE MTP variants are deferred). The TP8 arm is the diff --git a/runners/launch_h200-dgxc-slurm.sh b/runners/launch_h200-dgxc-slurm.sh index 29c77b13cd..387528fd43 100755 --- a/runners/launch_h200-dgxc-slurm.sh +++ b/runners/launch_h200-dgxc-slurm.sh @@ -11,6 +11,13 @@ source "$(dirname "${BASH_SOURCE[0]}")/slurm_utils.sh" if [[ "$IS_MULTINODE" == "true" ]]; then + if [[ -z "${CONFIG_FILE:-}" ]]; then + echo "Error: CONFIG_FILE is not set. The srt-slurm path requires a CONFIG_FILE in additional-settings." >&2 + exit 1 + fi + CONFIG_PATH="${CONFIG_FILE%%:*}" + LOCAL_CONFIG_FILE="$GITHUB_WORKSPACE/benchmarks/multi_node/srt-slurm-recipes/${CONFIG_PATH#recipes/}" + # MODEL_PATH: Override with pre-downloaded paths on H200 runner # The yaml files specify HuggingFace model IDs for portability, but we use # local paths to avoid repeated downloading on the shared H200 cluster. @@ -18,6 +25,12 @@ if [[ "$IS_MULTINODE" == "true" ]]; then if [[ $MODEL_PREFIX == "dsr1" && $PRECISION == "fp8" ]]; then export MODEL_PATH="/models/DeepSeek-R1-0528" export SRT_SLURM_MODEL_PREFIX="dsr1-fp8" + elif [[ $MODEL_PREFIX == "glm5.2" && $PRECISION == "fp8" ]]; then + export MODEL_PATH="${GLM52_FP8_MODEL_PATH:-/models/GLM-5.2-FP8}" + if [[ ! -d "$MODEL_PATH" ]]; then + export MODEL_PATH="hf:zai-org/GLM-5.2-FP8" + fi + export SRT_SLURM_MODEL_PREFIX="glm5.2-fp8" else echo "Unsupported model prefix/precision for dynamo-sglang: $MODEL_PREFIX/$PRECISION" exit 1 @@ -51,7 +64,13 @@ if [[ "$IS_MULTINODE" == "true" ]]; then rm -rf "$SRT_REPO_DIR" fi - if [[ $IS_AGENTIC == "1" && $FRAMEWORK == "vllm" && $MODEL_PREFIX == "kimik3" ]]; then + if [[ $IS_AGENTIC == "1" && $FRAMEWORK == "dynamo-sglang" && $MODEL_PREFIX == "glm5.2" ]]; then + # c180328 includes the AgentX custom benchmark integration and passes + # every logical SGLang worker's Prometheus URL to AIPerf. + git clone https://github.com/NVIDIA/srt-slurm.git "$SRT_REPO_DIR" + cd "$SRT_REPO_DIR" + git checkout c180328b98c3793ca84a1e24a030f90545eb7d5d + elif [[ $IS_AGENTIC == "1" && $FRAMEWORK == "vllm" && $MODEL_PREFIX == "kimik3" ]]; then git clone https://github.com/functionstackx/srt-slurm-nv.git "$SRT_REPO_DIR" cd "$SRT_REPO_DIR" git checkout df5baa93f4caf5169dea2a4236ad2cc742fe40e7 @@ -87,7 +106,11 @@ if [[ "$IS_MULTINODE" == "true" ]]; then if [[ $FRAMEWORK == "dynamo-sglang" ]]; then # SGLang container mapping - SQUASH_FILE="/data/containers/$(echo "$IMAGE" | sed 's/[\/:@#]/+/g').sqsh" + if [[ $MODEL_PREFIX == "glm5.2" ]]; then + SQUASH_FILE="/data/gharunners/containers/$(echo "$IMAGE" | sed 's/[\/:@#]/_/g').sqsh" + else + SQUASH_FILE="/data/containers/$(echo "$IMAGE" | sed 's/[\/:@#]/+/g').sqsh" + fi CONTAINER_KEY="$IMAGE" elif [[ $FRAMEWORK == "dynamo-trt" ]]; then # TRT-LLM container mapping - convert IMAGE to srt-slurm format (nvcr.io/ -> nvcr.io#) @@ -98,6 +121,26 @@ if [[ "$IS_MULTINODE" == "true" ]]; then SQUASH_FILE="/data/gharunners/containers/$(echo "$IMAGE" | sed 's/[\/:@#]/_/g').sqsh" fi + if [[ $MODEL_PREFIX == "glm5.2" ]] && ! unsquashfs -l "$SQUASH_FILE" >/dev/null 2>&1; then + DOCKER_IMAGE=$(echo "$IMAGE" | sed 's/#/\//g') + LOCK_FILE="${SQUASH_FILE}.lock" + mkdir -p "$(dirname "$SQUASH_FILE")" + srun --partition="$SLURM_PARTITION" --account="$SLURM_ACCOUNT" \ + --nodes=1 --ntasks=1 --time=30 --job-name="$RUNNER_NAME" \ + bash -c " + set -euo pipefail + exec 9>\"$LOCK_FILE\" + flock -w 1800 9 + if unsquashfs -l \"$SQUASH_FILE\" >/dev/null 2>&1; then + exit 0 + fi + rm -f \"$SQUASH_FILE\" + export ENROOT_CACHE_PATH=\${HOME}/.cache/enroot + mkdir -p \"\$ENROOT_CACHE_PATH\" + enroot import -o \"$SQUASH_FILE\" docker://$DOCKER_IMAGE + " + fi + export ISL="$ISL" export OSL="$OSL" export EVAL_ONLY="${EVAL_ONLY:-false}" @@ -150,22 +193,25 @@ EOF echo "Running make setup..." make setup ARCH=x86_64 + if [[ -f "$LOCAL_CONFIG_FILE" ]]; then + mkdir -p "$(dirname "$CONFIG_PATH")" + cp "$LOCAL_CONFIG_FILE" "$CONFIG_PATH" + fi + # Export eval-related env vars for srt-slurm post-benchmark eval export INFMAX_WORKSPACE="$GITHUB_WORKSPACE" echo "Submitting job with srtctl..." - if [[ -z "$CONFIG_FILE" ]]; then - echo "Error: CONFIG_FILE is not set. The srt-slurm path requires a CONFIG_FILE in additional-settings." >&2 - echo "Config: MODEL_PREFIX=${MODEL_PREFIX} PRECISION=${PRECISION} FRAMEWORK=${FRAMEWORK}" >&2 - exit 1 - fi - # Override the job name in the config file with the runner name - sed -i "s/^name:.*/name: \"${RUNNER_NAME}\"/" "$CONFIG_FILE" - sed -i '/^health_check:/,/^[^ ]/{ /^health_check:/d; /^ /d; }' "${CONFIG_FILE%%:*}" - printf '\nhealth_check:\n max_attempts: 720\n interval_seconds: 10\n' >> "${CONFIG_FILE%%:*}" - SRTCTL_OUTPUT=$(srtctl apply -f "$CONFIG_FILE" --tags "h200,${MODEL_PREFIX},${PRECISION},${ISL}x${OSL},infmax-$(date +%Y%m%d)" 2>&1) + sed -i "s/^name:.*/name: \"${RUNNER_NAME}\"/" "$CONFIG_PATH" + sed -i '/^health_check:/,/^[^ ]/{ /^health_check:/d; /^ /d; }' "$CONFIG_PATH" + printf '\nhealth_check:\n max_attempts: 720\n interval_seconds: 10\n' >> "$CONFIG_PATH" + WORKLOAD_TAG="${ISL}x${OSL}" + if [[ "$IS_AGENTIC" == "1" ]]; then + WORKLOAD_TAG="agentic" + fi + SRTCTL_OUTPUT=$(srtctl apply -f "$CONFIG_FILE" --tags "h200,${MODEL_PREFIX},${PRECISION},${WORKLOAD_TAG},infmax-$(date +%Y%m%d)" 2>&1) echo "$SRTCTL_OUTPUT" # Extract JOB_ID from srtctl output From 9dd79185a3e2fc33e1e834873fafc8b5f9acb816 Mon Sep 17 00:00:00 2001 From: Cam Quilici Date: Fri, 7 Aug 2026 15:41:48 -0500 Subject: [PATCH 2/7] chore: add H200 GLM-5.2 MTP changelog --- perf-changelog.yaml | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/perf-changelog.yaml b/perf-changelog.yaml index 7f25314145..bb304a928c 100644 --- a/perf-changelog.yaml +++ b/perf-changelog.yaml @@ -5592,3 +5592,13 @@ description: - "Kimi K2.5 NVFP4 B300 vLLM: nightly image, TP/DEP/TEP sweep, TP8 conc-1 only, DEP gmu 0.85" pr-link: https://github.com/SemiAnalysisAI/InferenceX/pull/2513 + +- config-keys: + - glm5.2-fp8-h200-dynamo-sglang-agentic-mtp-hisparse-2p2d + scenario-type: + - agentic-coding + description: + - "Refresh Actions run 30133535261 as an MTP sibling while preserving the 2P2D PCP8 prefill, TP8/DP8 HiSparse decode, Mooncake, 1M-context topology, and c8/c12/c16 search space" + - "Use EAGLE with three speculative steps, top-k 1, four draft tokens, and the committed GLM-5.2 thinking-on golden synthetic acceptance length of 2.99; evals retain real verification" + - "Use lmsysorg/sglang:v0.5.16-cu130 and pin NVIDIA/srt-slurm c180328b98c3793ca84a1e24a030f90545eb7d5d so AIPerf receives Prometheus URLs for all logical prefill and decode workers" + pr-link: https://github.com/SemiAnalysisAI/InferenceX/pull/2529 From 335529f97e2fd561ff8a63ffe1fa967c6ffb4d4f Mon Sep 17 00:00:00 2001 From: Cam Quilici Date: Fri, 7 Aug 2026 16:09:47 -0500 Subject: [PATCH 3/7] chore: use latest srt-slurm release --- perf-changelog.yaml | 2 +- runners/launch_h200-dgxc-slurm.sh | 5 ++--- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/perf-changelog.yaml b/perf-changelog.yaml index bb304a928c..676157339d 100644 --- a/perf-changelog.yaml +++ b/perf-changelog.yaml @@ -5600,5 +5600,5 @@ description: - "Refresh Actions run 30133535261 as an MTP sibling while preserving the 2P2D PCP8 prefill, TP8/DP8 HiSparse decode, Mooncake, 1M-context topology, and c8/c12/c16 search space" - "Use EAGLE with three speculative steps, top-k 1, four draft tokens, and the committed GLM-5.2 thinking-on golden synthetic acceptance length of 2.99; evals retain real verification" - - "Use lmsysorg/sglang:v0.5.16-cu130 and pin NVIDIA/srt-slurm c180328b98c3793ca84a1e24a030f90545eb7d5d so AIPerf receives Prometheus URLs for all logical prefill and decode workers" + - "Use lmsysorg/sglang:v0.5.16-cu130 and the latest NVIDIA/srt-slurm release, v1.0.44, which includes logical-worker Prometheus URL injection for AIPerf" pr-link: https://github.com/SemiAnalysisAI/InferenceX/pull/2529 diff --git a/runners/launch_h200-dgxc-slurm.sh b/runners/launch_h200-dgxc-slurm.sh index 387528fd43..8991e04182 100755 --- a/runners/launch_h200-dgxc-slurm.sh +++ b/runners/launch_h200-dgxc-slurm.sh @@ -65,11 +65,10 @@ if [[ "$IS_MULTINODE" == "true" ]]; then fi if [[ $IS_AGENTIC == "1" && $FRAMEWORK == "dynamo-sglang" && $MODEL_PREFIX == "glm5.2" ]]; then - # c180328 includes the AgentX custom benchmark integration and passes + # v1.0.44 includes the AgentX custom benchmark integration and passes # every logical SGLang worker's Prometheus URL to AIPerf. - git clone https://github.com/NVIDIA/srt-slurm.git "$SRT_REPO_DIR" + git clone --branch v1.0.44 --single-branch https://github.com/NVIDIA/srt-slurm.git "$SRT_REPO_DIR" cd "$SRT_REPO_DIR" - git checkout c180328b98c3793ca84a1e24a030f90545eb7d5d elif [[ $IS_AGENTIC == "1" && $FRAMEWORK == "vllm" && $MODEL_PREFIX == "kimik3" ]]; then git clone https://github.com/functionstackx/srt-slurm-nv.git "$SRT_REPO_DIR" cd "$SRT_REPO_DIR" From d5474f9fb9548ad3a5ad3a22279aaa887cab38f0 Mon Sep 17 00:00:00 2001 From: Cam Quilici Date: Fri, 7 Aug 2026 16:30:11 -0500 Subject: [PATCH 4/7] fix: resolve cached GLM-5.2 model snapshot --- runners/launch_h200-dgxc-slurm.sh | 47 +++++++++++++++++++++++++++++-- 1 file changed, 44 insertions(+), 3 deletions(-) diff --git a/runners/launch_h200-dgxc-slurm.sh b/runners/launch_h200-dgxc-slurm.sh index 8991e04182..8f3144824b 100755 --- a/runners/launch_h200-dgxc-slurm.sh +++ b/runners/launch_h200-dgxc-slurm.sh @@ -9,6 +9,40 @@ set -x source "$(dirname "${BASH_SOURCE[0]}")/slurm_utils.sh" +resolve_complete_model_snapshot() { + python3 - "$1" <<'PY' +import json +import sys +from pathlib import Path + +model_cache_dir = Path(sys.argv[1]) +try: + revision = model_cache_dir.joinpath("refs/main").read_text().strip() +except OSError: + raise SystemExit + +if not revision or Path(revision).name != revision: + raise SystemExit + +snapshot = model_cache_dir / "snapshots" / revision +index_path = snapshot / "model.safetensors.index.json" +required_files = ( + snapshot / "config.json", + snapshot / "tokenizer_config.json", + index_path, +) +if not all(path.is_file() for path in required_files): + raise SystemExit +try: + weight_map = json.loads(index_path.read_text())["weight_map"] +except (KeyError, json.JSONDecodeError, OSError): + raise SystemExit +shards = {snapshot / filename for filename in weight_map.values()} +if shards and all(path.is_file() for path in shards): + print(snapshot) +PY +} + if [[ "$IS_MULTINODE" == "true" ]]; then if [[ -z "${CONFIG_FILE:-}" ]]; then @@ -26,10 +60,17 @@ if [[ "$IS_MULTINODE" == "true" ]]; then export MODEL_PATH="/models/DeepSeek-R1-0528" export SRT_SLURM_MODEL_PREFIX="dsr1-fp8" elif [[ $MODEL_PREFIX == "glm5.2" && $PRECISION == "fp8" ]]; then - export MODEL_PATH="${GLM52_FP8_MODEL_PATH:-/models/GLM-5.2-FP8}" - if [[ ! -d "$MODEL_PATH" ]]; then - export MODEL_PATH="hf:zai-org/GLM-5.2-FP8" + if [[ -n "${GLM52_FP8_MODEL_PATH:-}" ]]; then + MODEL_PATH="$GLM52_FP8_MODEL_PATH" + else + GLM52_FP8_MODEL_CACHE_DIR="/models/gharunners/hf-hub-cache/models--zai-org--GLM-5.2-FP8" + MODEL_PATH=$(resolve_complete_model_snapshot "$GLM52_FP8_MODEL_CACHE_DIR") + fi + if [[ ! -f "$MODEL_PATH/config.json" || ! -f "$MODEL_PATH/model.safetensors.index.json" ]]; then + echo "Complete GLM-5.2-FP8 model snapshot is unavailable at: $MODEL_PATH" >&2 + exit 1 fi + export MODEL_PATH export SRT_SLURM_MODEL_PREFIX="glm5.2-fp8" else echo "Unsupported model prefix/precision for dynamo-sglang: $MODEL_PREFIX/$PRECISION" From f3cfdbb6e464b4cfd86ad242d20900fdfadbc9b6 Mon Sep 17 00:00:00 2001 From: Cam Quilici Date: Fri, 7 Aug 2026 16:39:02 -0500 Subject: [PATCH 5/7] fix: use supported Hugging Face model path --- ...g-h200-2p2d-pcp8-tp8-dp8-hisparse-mtp.yaml | 2 +- runners/launch_h200-dgxc-slurm.sh | 47 ++----------------- 2 files changed, 4 insertions(+), 45 deletions(-) diff --git a/benchmarks/multi_node/srt-slurm-recipes/sglang/glm5.2/agentic/disagg-h200-2p2d-pcp8-tp8-dp8-hisparse-mtp.yaml b/benchmarks/multi_node/srt-slurm-recipes/sglang/glm5.2/agentic/disagg-h200-2p2d-pcp8-tp8-dp8-hisparse-mtp.yaml index 781d19db41..d621d90312 100644 --- a/benchmarks/multi_node/srt-slurm-recipes/sglang/glm5.2/agentic/disagg-h200-2p2d-pcp8-tp8-dp8-hisparse-mtp.yaml +++ b/benchmarks/multi_node/srt-slurm-recipes/sglang/glm5.2/agentic/disagg-h200-2p2d-pcp8-tp8-dp8-hisparse-mtp.yaml @@ -5,7 +5,7 @@ name: "disagg-h200-2p2d-pcp8-tp8-dp8-hisparse-mtp" # thinking-on acceptance length for three speculative steps. model: - path: "glm5.2-fp8" + path: "hf:zai-org/GLM-5.2-FP8" container: "lmsysorg/sglang:v0.5.16-cu130" precision: "fp8" diff --git a/runners/launch_h200-dgxc-slurm.sh b/runners/launch_h200-dgxc-slurm.sh index 8f3144824b..8991e04182 100755 --- a/runners/launch_h200-dgxc-slurm.sh +++ b/runners/launch_h200-dgxc-slurm.sh @@ -9,40 +9,6 @@ set -x source "$(dirname "${BASH_SOURCE[0]}")/slurm_utils.sh" -resolve_complete_model_snapshot() { - python3 - "$1" <<'PY' -import json -import sys -from pathlib import Path - -model_cache_dir = Path(sys.argv[1]) -try: - revision = model_cache_dir.joinpath("refs/main").read_text().strip() -except OSError: - raise SystemExit - -if not revision or Path(revision).name != revision: - raise SystemExit - -snapshot = model_cache_dir / "snapshots" / revision -index_path = snapshot / "model.safetensors.index.json" -required_files = ( - snapshot / "config.json", - snapshot / "tokenizer_config.json", - index_path, -) -if not all(path.is_file() for path in required_files): - raise SystemExit -try: - weight_map = json.loads(index_path.read_text())["weight_map"] -except (KeyError, json.JSONDecodeError, OSError): - raise SystemExit -shards = {snapshot / filename for filename in weight_map.values()} -if shards and all(path.is_file() for path in shards): - print(snapshot) -PY -} - if [[ "$IS_MULTINODE" == "true" ]]; then if [[ -z "${CONFIG_FILE:-}" ]]; then @@ -60,17 +26,10 @@ if [[ "$IS_MULTINODE" == "true" ]]; then export MODEL_PATH="/models/DeepSeek-R1-0528" export SRT_SLURM_MODEL_PREFIX="dsr1-fp8" elif [[ $MODEL_PREFIX == "glm5.2" && $PRECISION == "fp8" ]]; then - if [[ -n "${GLM52_FP8_MODEL_PATH:-}" ]]; then - MODEL_PATH="$GLM52_FP8_MODEL_PATH" - else - GLM52_FP8_MODEL_CACHE_DIR="/models/gharunners/hf-hub-cache/models--zai-org--GLM-5.2-FP8" - MODEL_PATH=$(resolve_complete_model_snapshot "$GLM52_FP8_MODEL_CACHE_DIR") - fi - if [[ ! -f "$MODEL_PATH/config.json" || ! -f "$MODEL_PATH/model.safetensors.index.json" ]]; then - echo "Complete GLM-5.2-FP8 model snapshot is unavailable at: $MODEL_PATH" >&2 - exit 1 + export MODEL_PATH="${GLM52_FP8_MODEL_PATH:-/models/GLM-5.2-FP8}" + if [[ ! -d "$MODEL_PATH" ]]; then + export MODEL_PATH="hf:zai-org/GLM-5.2-FP8" fi - export MODEL_PATH export SRT_SLURM_MODEL_PREFIX="glm5.2-fp8" else echo "Unsupported model prefix/precision for dynamo-sglang: $MODEL_PREFIX/$PRECISION" From fabf5e8374e19b63f9102d2e108c20721eaf7746 Mon Sep 17 00:00:00 2001 From: Cam Quilici Date: Fri, 7 Aug 2026 17:00:40 -0500 Subject: [PATCH 6/7] fix: use supported GLM-5.2 MTP decode path Keep the 2P2D MTP topology and c8/c12/c16 sweep while removing the unsupported HiSparse and MTP combination. Rename the recipe and config key so the submission accurately describes GPU-resident decode KV cache. --- ...=> disagg-h200-2p2d-pcp8-tp8-dp8-mtp.yaml} | 11 ++++----- configs/nvidia-master.yaml | 23 ++++++++----------- perf-changelog.yaml | 5 ++-- 3 files changed, 18 insertions(+), 21 deletions(-) rename benchmarks/multi_node/srt-slurm-recipes/sglang/glm5.2/agentic/{disagg-h200-2p2d-pcp8-tp8-dp8-hisparse-mtp.yaml => disagg-h200-2p2d-pcp8-tp8-dp8-mtp.yaml} (91%) diff --git a/benchmarks/multi_node/srt-slurm-recipes/sglang/glm5.2/agentic/disagg-h200-2p2d-pcp8-tp8-dp8-hisparse-mtp.yaml b/benchmarks/multi_node/srt-slurm-recipes/sglang/glm5.2/agentic/disagg-h200-2p2d-pcp8-tp8-dp8-mtp.yaml similarity index 91% rename from benchmarks/multi_node/srt-slurm-recipes/sglang/glm5.2/agentic/disagg-h200-2p2d-pcp8-tp8-dp8-hisparse-mtp.yaml rename to benchmarks/multi_node/srt-slurm-recipes/sglang/glm5.2/agentic/disagg-h200-2p2d-pcp8-tp8-dp8-mtp.yaml index d621d90312..8eaef069cb 100644 --- a/benchmarks/multi_node/srt-slurm-recipes/sglang/glm5.2/agentic/disagg-h200-2p2d-pcp8-tp8-dp8-hisparse-mtp.yaml +++ b/benchmarks/multi_node/srt-slurm-recipes/sglang/glm5.2/agentic/disagg-h200-2p2d-pcp8-tp8-dp8-mtp.yaml @@ -1,8 +1,9 @@ -name: "disagg-h200-2p2d-pcp8-tp8-dp8-hisparse-mtp" +name: "disagg-h200-2p2d-pcp8-tp8-dp8-mtp" -# Refresh of Actions run 30133535261. The serving topology and HiSparse -# settings are preserved; EAGLE MTP uses the committed GLM-5.2 golden -# thinking-on acceptance length for three speculative steps. +# Refresh of the 2P2D topology from Actions run 30133535261 with EAGLE MTP. +# The released SGLang image does not combine MTP with HiSparse, so decode KV +# cache remains GPU-resident. MTP uses the committed GLM-5.2 golden thinking-on +# acceptance length for three speculative steps. model: path: "hf:zai-org/GLM-5.2-FP8" @@ -119,8 +120,6 @@ backend: max-running-requests: 200 page-size: 64 disable-radix-cache: true - enable-hisparse: true - hisparse-config: '{"top_k":2048,"device_buffer_size":4096,"host_to_device_ratio":5}' speculative-algorithm: EAGLE speculative-num-steps: 3 speculative-eagle-topk: 1 diff --git a/configs/nvidia-master.yaml b/configs/nvidia-master.yaml index 339afae5b0..54a1563333 100644 --- a/configs/nvidia-master.yaml +++ b/configs/nvidia-master.yaml @@ -7536,10 +7536,10 @@ qwen3.5-fp8-gb300-dynamo-sglang: ep: 16 dp-attn: true -# GLM-5.2 FP8 full-context AgentX refresh on H200. This preserves the -# successful 2P2D PCP8/TP8-DP8 HiSparse topology and c8/c12/c16 curve from -# Actions run 30133535261 while enabling native EAGLE MTP with golden AL. -glm5.2-fp8-h200-dynamo-sglang-agentic-mtp-hisparse-2p2d: +# GLM-5.2 FP8 full-context AgentX refresh on H200. This preserves the 2P2D +# PCP8/TP8-DP8 topology and c8/c12/c16 curve from Actions run 30133535261 while +# enabling native EAGLE MTP with golden AL and GPU-resident decode KV cache. +glm5.2-fp8-h200-dynamo-sglang-agentic-mtp-2p2d: image: lmsysorg/sglang:v0.5.16-cu130 model: zai-org/GLM-5.2-FP8 model-prefix: glm5.2 @@ -7556,8 +7556,7 @@ glm5.2-fp8-h200-dynamo-sglang-agentic-mtp-hisparse-2p2d: search-space: - spec-decoding: mtp conc-list: [8] - kv-offloading: dram - kv-offload-backend: { name: hisparse } + kv-offloading: none prefill: num-worker: 2 tp: 1 @@ -7565,7 +7564,7 @@ glm5.2-fp8-h200-dynamo-sglang-agentic-mtp-hisparse-2p2d: ep: 1 dp-attn: false additional-settings: - - "CONFIG_FILE=recipes/sglang/glm5.2/agentic/disagg-h200-2p2d-pcp8-tp8-dp8-hisparse-mtp.yaml" + - "CONFIG_FILE=recipes/sglang/glm5.2/agentic/disagg-h200-2p2d-pcp8-tp8-dp8-mtp.yaml" decode: num-worker: 2 tp: 8 @@ -7573,8 +7572,7 @@ glm5.2-fp8-h200-dynamo-sglang-agentic-mtp-hisparse-2p2d: dp-attn: true - spec-decoding: mtp conc-list: [12] - kv-offloading: dram - kv-offload-backend: { name: hisparse } + kv-offloading: none prefill: num-worker: 2 tp: 1 @@ -7582,7 +7580,7 @@ glm5.2-fp8-h200-dynamo-sglang-agentic-mtp-hisparse-2p2d: ep: 1 dp-attn: false additional-settings: - - "CONFIG_FILE=recipes/sglang/glm5.2/agentic/disagg-h200-2p2d-pcp8-tp8-dp8-hisparse-mtp.yaml" + - "CONFIG_FILE=recipes/sglang/glm5.2/agentic/disagg-h200-2p2d-pcp8-tp8-dp8-mtp.yaml" decode: num-worker: 2 tp: 8 @@ -7590,8 +7588,7 @@ glm5.2-fp8-h200-dynamo-sglang-agentic-mtp-hisparse-2p2d: dp-attn: true - spec-decoding: mtp conc-list: [16] - kv-offloading: dram - kv-offload-backend: { name: hisparse } + kv-offloading: none prefill: num-worker: 2 tp: 1 @@ -7599,7 +7596,7 @@ glm5.2-fp8-h200-dynamo-sglang-agentic-mtp-hisparse-2p2d: ep: 1 dp-attn: false additional-settings: - - "CONFIG_FILE=recipes/sglang/glm5.2/agentic/disagg-h200-2p2d-pcp8-tp8-dp8-hisparse-mtp.yaml" + - "CONFIG_FILE=recipes/sglang/glm5.2/agentic/disagg-h200-2p2d-pcp8-tp8-dp8-mtp.yaml" decode: num-worker: 2 tp: 8 diff --git a/perf-changelog.yaml b/perf-changelog.yaml index e8aa012d93..b5751b7f4b 100644 --- a/perf-changelog.yaml +++ b/perf-changelog.yaml @@ -5603,11 +5603,12 @@ pr-link: https://github.com/SemiAnalysisAI/InferenceX/pull/2513 - config-keys: - - glm5.2-fp8-h200-dynamo-sglang-agentic-mtp-hisparse-2p2d + - glm5.2-fp8-h200-dynamo-sglang-agentic-mtp-2p2d scenario-type: - agentic-coding description: - - "Refresh Actions run 30133535261 as an MTP sibling while preserving the 2P2D PCP8 prefill, TP8/DP8 HiSparse decode, Mooncake, 1M-context topology, and c8/c12/c16 search space" + - "Refresh submission with up to date AgentX harness." + - "Retain the 2P2D PCP8 prefill, TP8/DP8 decode, Mooncake, 1M-context topology, and c8/c12/c16 search space; use GPU-resident decode KV cache because released SGLang does not support combining HiSparse with MTP" - "Use EAGLE with three speculative steps, top-k 1, four draft tokens, and the committed GLM-5.2 thinking-on golden synthetic acceptance length of 2.99; evals retain real verification" - "Use lmsysorg/sglang:v0.5.16-cu130 and the latest NVIDIA/srt-slurm release, v1.0.44, which includes logical-worker Prometheus URL injection for AIPerf" pr-link: https://github.com/SemiAnalysisAI/InferenceX/pull/2529 From 519189332bedf2b720ae0d2e9f70eef20f3e75c8 Mon Sep 17 00:00:00 2001 From: Cam Quilici Date: Fri, 7 Aug 2026 17:39:07 -0500 Subject: [PATCH 7/7] fix: report AgentX prompt cache metrics Enable SGLang cache reporting on both prefill and decode workers so AIPerf captures prompt-cache read-token usage alongside all four logical-worker Prometheus endpoints. --- .../glm5.2/agentic/disagg-h200-2p2d-pcp8-tp8-dp8-mtp.yaml | 2 ++ perf-changelog.yaml | 1 + 2 files changed, 3 insertions(+) diff --git a/benchmarks/multi_node/srt-slurm-recipes/sglang/glm5.2/agentic/disagg-h200-2p2d-pcp8-tp8-dp8-mtp.yaml b/benchmarks/multi_node/srt-slurm-recipes/sglang/glm5.2/agentic/disagg-h200-2p2d-pcp8-tp8-dp8-mtp.yaml index 8eaef069cb..8b02f5e857 100644 --- a/benchmarks/multi_node/srt-slurm-recipes/sglang/glm5.2/agentic/disagg-h200-2p2d-pcp8-tp8-dp8-mtp.yaml +++ b/benchmarks/multi_node/srt-slurm-recipes/sglang/glm5.2/agentic/disagg-h200-2p2d-pcp8-tp8-dp8-mtp.yaml @@ -98,6 +98,7 @@ backend: watchdog-timeout: 86400 stream-interval: 60 enable-metrics: true + enable-cache-report: true decode: host: 0.0.0.0 @@ -127,6 +128,7 @@ backend: watchdog-timeout: 86400 stream-interval: 60 enable-metrics: true + enable-cache-report: true sbatch_directives: mem: "0" diff --git a/perf-changelog.yaml b/perf-changelog.yaml index b5751b7f4b..1e0913c68f 100644 --- a/perf-changelog.yaml +++ b/perf-changelog.yaml @@ -5611,4 +5611,5 @@ - "Retain the 2P2D PCP8 prefill, TP8/DP8 decode, Mooncake, 1M-context topology, and c8/c12/c16 search space; use GPU-resident decode KV cache because released SGLang does not support combining HiSparse with MTP" - "Use EAGLE with three speculative steps, top-k 1, four draft tokens, and the committed GLM-5.2 thinking-on golden synthetic acceptance length of 2.99; evals retain real verification" - "Use lmsysorg/sglang:v0.5.16-cu130 and the latest NVIDIA/srt-slurm release, v1.0.44, which includes logical-worker Prometheus URL injection for AIPerf" + - "Enable SGLang cache reporting on both prefill and decode workers so AIPerf records prompt-cache read-token usage alongside all logical-worker Prometheus metrics" pr-link: https://github.com/SemiAnalysisAI/InferenceX/pull/2529