Skip to content
Merged
Show file tree
Hide file tree
Changes from all 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
Original file line number Diff line number Diff line change
@@ -0,0 +1,121 @@
name: "agg-h200-tp8-mtp-kvoffload"

# DeepSeek-V4-Pro AgentX aggregated TP8 serving on one 8xH200 node. The recipe is
# topology-invariant; configs/nvidia-master.yaml varies only concurrency to
# produce the latency/throughput Pareto curve.

model:
path: "deepseek-v4-pro"
container: "dynamo-sglang"
precision: "fp8"

dynamo:
install: true
wheel: "1.3.0.dev20260718"

slurm:
time_limit: "8:00:00"

health_check:
max_attempts: 1440
interval_seconds: 10

resources:
gpu_type: "h200"
gpus_per_node: 8
agg_nodes: 1
agg_workers: 1
gpus_per_agg: 8

infra:
etcd_nats_dedicated_node: true
# AgentX prompts can exceed NATS's 1 MiB default after JSON serialization.
nats_max_payload_mb: 32

frontend:
type: dynamo
nginx_session_affinity: true
nginx_session_affinity_header: X-Dynamo-Session-ID
enable_multiple_frontends: true
num_additional_frontends: 4
env:
PIP_BREAK_SYSTEM_PACKAGES: "1"
args:
router-mode: "kv"
router-session-affinity-ttl-secs: "3600"
active-decode-blocks-threshold: "None"
active-prefill-tokens-threshold: "None"
active-prefill-tokens-threshold-frac: "None"

backend:
type: sglang

aggregated_environment:
SGLANG_DEFAULT_THINKING: "1"
SGLANG_DSV4_REASONING_EFFORT: high
SGLANG_SIMULATE_ACC_LEN: "2.49"
SGLANG_SIMULATE_ACC_METHOD: match-expected
SGLANG_SIMULATE_ACC_TOKEN_MODE: real-draft-token
PIP_BREAK_SYSTEM_PACKAGES: "1"
HF_HUB_CACHE: /hf_hub_cache
SGLANG_OPT_SWA_SPLIT_LEAF_ON_INSERT: "1"
SGLANG_OPT_UNIFIED_CACHE_FREE_OUT_OF_WINDOW_SLOTS: "1"
SGLANG_OPT_USE_CUSTOM_ALL_REDUCE_V2: "1"
SGLANG_OPT_USE_ONLINE_COMPRESS: "0"
SGLANG_OPT_USE_JIT_INDEXER_METADATA: "1"
SGLANG_OPT_USE_JIT_NORM: "1"
SGLANG_OPT_USE_TOPK_V2: "True"
SGLANG_ENABLE_UNIFIED_RADIX_TREE: "1"

sglang_config:
aggregated:
served-model-name: "deepseek-ai/DeepSeek-V4-Pro"
enable-metrics: true
trust-remote-code: true
stream-interval: 50
watchdog-timeout: 1000000
mem-fraction-static: 0.88
chunked-prefill-size: 4096
moe-runner-backend: marlin
disable-flashinfer-autotune: true
swa-full-tokens-ratio: 0.1
max-running-requests: 32
cuda-graph-max-bs: 32

scheduler-recv-interval: 30
tp-size: 8
dp-size: 1
ep-size: 1

enable-hierarchical-cache: true
hicache-ratio: 6
hicache-write-policy: write_through
hicache-io-backend: kernel

speculative-algorithm: EAGLE
speculative-num-steps: 3
speculative-eagle-topk: 1
speculative-num-draft-tokens: 4

srun_options:
# The custom benchmark installs its isolated AIPerf environment at runtime.
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"
# Aggregated serving uses one TP8 worker for both prefill and decode.
IS_MULTINODE: "false"
TP: "8"
AIPERF_HTTP_X_DYNAMO_SESSION_ID_FROM_CORRELATION_ID: "true"
AIPERF_USE_DYNAMO_CONV_AWARE_ROUTING: "0"
# Fail the run loudly if the aggregate engine's sglang: metrics never reach
# the AIPerf export, instead of publishing a trace artifact with no backend
# series behind it.
AIPERF_REQUIRED_SERVER_METRIC_PREFIX: "sglang:"
AIPERF_DATASET_MMAP_CACHE_DIR: /aiperf_mmap_cache
HF_HUB_CACHE: /hf_hub_cache
35 changes: 35 additions & 0 deletions configs/nvidia-master.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -1662,6 +1662,41 @@ dsv4-fp8-h200-vllm-agentic:
- search-space:
- { tp: 8, ep: 8, dp-attn: true, kv-offloading: none, conc-list: [1, 2, 4, 8, 16] }

# DeepSeek-V4-Pro AgentX on one aggregated TP8 H200 worker. Keep the serving
# topology fixed and sweep only concurrency to produce the Pareto curve.
dsv4-fp8-h200-dynamo-sglang-agentic-agg:
image: lmsysorg/sglang:nightly-dev-cu13-20260720-b3570a45
model: deepseek-ai/DeepSeek-V4-Pro
model-prefix: dsv4
runner: cluster:h200-dgxc
precision: fp8
framework: dynamo-sglang
router: { name: dynamo-router, version: "1.3.0.dev20260718" }
multinode: true
disagg: false
scenarios:
agentic-coding:
- dram-utilization: 0.80
search-space:
- spec-decoding: mtp
conc-list: [1, 2, 4, 8, 16]
kv-offloading: dram
kv-offload-backend: { name: hicache }
prefill:
num-worker: 1
tp: 8
ep: 1
dp-attn: false
additional-settings:
- "CONFIG_FILE=recipes/sglang/deepseek-v4/agentic/agg-h200-tp8-mtp-kvoffload.yaml"
# The aggregated worker serves prefill and decode on the same GPUs.
# Keep decode at zero to avoid double-counting the TP8 allocation.
decode:
num-worker: 0
tp: 8
ep: 1
dp-attn: false

# MTP variant of dsv4-fp8-h200-sglang. Mirrors the non-MTP recipe (same image,
# runner pool, search space) and adds EAGLE speculative decoding via
# --speculative-algorithm EAGLE with the (3,1,4) chain matching dsv4-fp4-b300-sglang-mtp.
Expand Down
10 changes: 10 additions & 0 deletions perf-changelog.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -5794,3 +5794,13 @@
- "Keep DSpark K=2 probabilistic throughput on synthetic golden AL 2.51 while the generated EVAL_ONLY row uses real block verification"
- "Cap the GPU-resident search at concurrency 8 after concurrency 16 failed to complete deterministic warmup; retain concurrency 16 for the DRAM-offload capacity tier"
pr-link: https://github.com/SemiAnalysisAI/InferenceX/pull/2476

- config-keys:
- dsv4-fp8-h200-dynamo-sglang-agentic-agg
description:
- "Add one H200 TP8 aggregated DeepSeek-V4-Pro AgentX recipe with MTP and HiCache."
- "Generate Pareto points by sweeping concurrency [1, 2, 4, 8, 16] while keeping the serving topology fixed."
- "Use Dynamo header-based session affinity and AIPerf agentx-v1.0.1 (b7b16cf851885567988a643282266bce74e34437)."
- "Enable SGLang engine metrics and require the sglang: server-metric prefix so the published trace artifacts carry backend data."
pr-link: https://github.com/SemiAnalysisAI/InferenceX/pull/2364

32 changes: 28 additions & 4 deletions runners/launch_h200-dgxc-slurm.sh
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,8 @@ set -eo pipefail
# System-specific configuration for H200 DGXC Slurm cluster
SLURM_PARTITION="main"
SLURM_ACCOUNT="sa-shared"
HF_HUB_CACHE_MOUNT="${HF_HUB_CACHE_MOUNT:-/models/gharunners/hf-hub-cache}"
AIPERF_MMAP_CACHE_HOST_PATH="${AIPERF_MMAP_CACHE_HOST_PATH:-/home/sa-shared/gharunners/ai-perf-cache}"

set -x

Expand All @@ -22,7 +24,15 @@ if [[ "$IS_MULTINODE" == "true" ]]; then
# The yaml files specify HuggingFace model IDs for portability, but we use
# local paths to avoid repeated downloading on the shared H200 cluster.
if [[ $FRAMEWORK == "dynamo-sglang" ]]; then
if [[ $MODEL_PREFIX == "dsr1" && $PRECISION == "fp8" ]]; then
if [[ $MODEL_PREFIX == "dsv4" && $PRECISION == "fp8" ]]; then
# The shared HF cache already contains the H200 FP8 checkpoint;
# default to that local path (overridable via DSV4_MODEL_PATH) so
# srtctl preflight finds the directory instead of trying to pull the
# hf: model ID, which fails on the compute node ("path is
# unavailable. Pull or register the model yourself").
export MODEL_PATH="${DSV4_MODEL_PATH:-${HF_HUB_CACHE_MOUNT}/DeepSeek-V4-Pro}"
export SRT_SLURM_MODEL_PREFIX="deepseek-v4-pro"
elif [[ $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
Expand Down Expand Up @@ -76,6 +86,18 @@ if [[ "$IS_MULTINODE" == "true" ]]; then
mkdir -p recipes/vllm/kimi-k3/agentic
cp -rT "$GITHUB_WORKSPACE/benchmarks/multi_node/srt-slurm-recipes/vllm/kimi-k3/agentic" \
recipes/vllm/kimi-k3/agentic
elif [[ $IS_AGENTIC == "1" && $FRAMEWORK == "dynamo-sglang" && $MODEL_PREFIX == "dsv4" ]]; then
# Overlay the single H200 aggregated recipe on the upstream release
# that provides custom benchmarks, Dynamo wheels, and affinity config.
# v1.0.38 also injects every logical SGLang worker leader's /metrics URL
# into AIPERF_SERVER_METRICS_URLS for custom benchmarks; v1.0.10 wired
# that only for built-in AIPerf runners, so the AgentX trace artifacts
# came back with no backend engine series behind them.
git clone --branch v1.0.38 --single-branch https://github.com/NVIDIA/srt-slurm.git "$SRT_REPO_DIR"
cd "$SRT_REPO_DIR"
mkdir -p recipes/sglang/deepseek-v4/agentic
cp "$GITHUB_WORKSPACE/benchmarks/multi_node/srt-slurm-recipes/sglang/deepseek-v4/agentic/agg-h200-tp8-mtp-kvoffload.yaml" \
recipes/sglang/deepseek-v4/agentic/
elif [[ "$IS_AGENTIC" == "1" ]]; then
git clone --branch cam/sa-submission-q2-2026 --single-branch https://github.com/cquil11/srt-slurm-nv.git "$SRT_REPO_DIR"
cd "$SRT_REPO_DIR"
Expand Down Expand Up @@ -168,6 +190,11 @@ gpus_per_node: 8
network_interface: ""
# Path to srtctl repo root (where the configs live)
srtctl_root: "${SRTCTL_ROOT}"
# Persistent AgentX dataset and Hugging Face caches mounted into every
# server and benchmark container.
default_mounts:
"${AIPERF_MMAP_CACHE_HOST_PATH}": "/aiperf_mmap_cache"
"${HF_HUB_CACHE_MOUNT}": "/hf_hub_cache"
# Model path aliases
model_paths:
"${SRT_SLURM_MODEL_PREFIX}": "${MODEL_PATH}"
Expand Down Expand Up @@ -323,9 +350,6 @@ EOF
find . -name '.nfs*' -delete 2>/dev/null || true

else

HF_HUB_CACHE_MOUNT="/models/gharunners/hf-hub-cache"
AIPERF_MMAP_CACHE_HOST_PATH="/home/sa-shared/gharunners/ai-perf-cache"
SQUASH_FILE="/data/gharunners/containers/$(echo "$IMAGE" | sed 's/[\/:@#]/_/g').sqsh"

# Convert pyxis image format (nvcr.io#path) to docker format (nvcr.io/path) for enroot import
Expand Down
Loading