From 245dcda3cc0ad6e2831659477c2eaf4b22b6e63c Mon Sep 17 00:00:00 2001 From: Cam Quilici Date: Mon, 27 Jul 2026 13:09:07 -0500 Subject: [PATCH 01/45] feat(agentx): add Kimi K3 GB200 day-0 support MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Add srt-slurm TP, TEP, and DEP AgentX profiles plus GB200 runner routing and recipe overlay plumbing. 中文:新增 Kimi K3 GB200 首日 AgentX 支持,包括 srt-slurm TP、TEP、DEP 配置,以及 GB200 运行器路由和配方覆盖逻辑。 --- .../agg-gb200-dep16-throughput-agentic.yaml | 122 ++++++++++++++++++ .../agg-gb200-tep8-balanced-agentic.yaml | 121 +++++++++++++++++ .../agg-gb200-tp8-latency-agentic.yaml | 119 +++++++++++++++++ configs/nvidia-master.yaml | 73 +++++++++++ perf-changelog.yaml | 9 ++ runners/launch_gb200-nv.sh | 22 +++- 6 files changed, 461 insertions(+), 5 deletions(-) create mode 100644 benchmarks/multi_node/srt-slurm-recipes/vllm/kimi-k3/agentic/agg-gb200-dep16-throughput-agentic.yaml create mode 100644 benchmarks/multi_node/srt-slurm-recipes/vllm/kimi-k3/agentic/agg-gb200-tep8-balanced-agentic.yaml create mode 100644 benchmarks/multi_node/srt-slurm-recipes/vllm/kimi-k3/agentic/agg-gb200-tp8-latency-agentic.yaml diff --git a/benchmarks/multi_node/srt-slurm-recipes/vllm/kimi-k3/agentic/agg-gb200-dep16-throughput-agentic.yaml b/benchmarks/multi_node/srt-slurm-recipes/vllm/kimi-k3/agentic/agg-gb200-dep16-throughput-agentic.yaml new file mode 100644 index 0000000000..5a1721fdd8 --- /dev/null +++ b/benchmarks/multi_node/srt-slurm-recipes/vllm/kimi-k3/agentic/agg-gb200-dep16-throughput-agentic.yaml @@ -0,0 +1,122 @@ +name: "kimi-k3-vllm-agg-gb200-dep16-throughput-agentic" + +# Day-0 GB200 translation of the official throughput-oriented multi_node_dep +# profile. The 16-way data/expert-parallel worker spans four four-GPU GB200 +# nodes, with four local DP ranks on each node. +# https://recipes.vllm.ai/moonshotai/Kimi-K3?hardware=gb200&nodes=4&strategy=multi_node_dep + +model: + path: "kimi-k3" + container: "vllm/vllm-openai:kimi-k3" + precision: "fp4" + +identity: + model: + repo: "moonshotai/Kimi-K3" + container: + image: "vllm/vllm-openai:kimi-k3" + frameworks: + dynamo: "1.3.0.dev20260618" + +dynamo: + install: true + wheel: "1.3.0.dev20260618" + +environment: + DYNAMO_WHEEL_DIRS: "/srtctl-wheels" + ETCD_LEASE_TTL: "7200" + +setup_script: vllm-container-deps.sh + +slurm: + time_limit: "8:00:00" + +health_check: + max_attempts: 2160 + interval_seconds: 10 + +resources: + gpu_type: "gb200" + gpus_per_node: 4 + agg_nodes: 4 + agg_workers: 1 + gpus_per_agg: 16 + +infra: + etcd_nats_dedicated_node: false + nats_max_payload_mb: 32 + +frontend: + type: dynamo + enable_multiple_frontends: false + args: + router-mode: "kv" + router-reset-states: true + +backend: + type: vllm + connector: null + aggregated_environment: + HF_HUB_CACHE: "/hf_hub_cache" + HUGGINGFACE_HUB_CACHE: "/hf_hub_cache" + TRANSFORMERS_CACHE: "/hf_hub_cache" + GLOO_SOCKET_IFNAME: "$IFACE_NAME" + NCCL_SOCKET_IFNAME: "$IFACE_NAME" + VLLM_ENGINE_READY_TIMEOUT_S: "7200" + VLLM_RPC_TIMEOUT: "600000" + VLLM_LOG_STATS_INTERVAL: "1" + VLLM_USE_V2_MODEL_RUNNER: "1" + VLLM_USE_RUST_FRONTEND: "1" + VLLM_ENABLE_K3_LATENT_MOE_TAIL_FUSION: "1" + NCCL_CUMEM_ENABLE: "1" + NCCL_MNNVL_ENABLE: "1" + NCCL_NVLS_ENABLE: "1" + UCX_MEMTYPE_CACHE: "n" + UCX_NET_DEVICES: "mlx5_0:1,mlx5_1:1,mlx5_2:1,mlx5_3:1" + UCX_TLS: "rc,cuda_copy" + NCCL_IB_HCA: "mlx5_0,mlx5_1,mlx5_2,mlx5_3" + NCCL_P2P_LEVEL: "NVL" + DG_JIT_CACHE_DIR: "/tmp/dg-cache-kimi-k3-gb200-dep16-{job_id}" + vllm_config: + aggregated: + served-model-name: "moonshotai/Kimi-K3" + tensor-parallel-size: 1 + pipeline-parallel-size: 1 + data-parallel-size: 16 + data-parallel-rpc-port: 13345 + enable-expert-parallel: true + trust-remote-code: true + load-format: "fastsafetensors" + moe-backend: "deep_gemm_mega_moe" + all2all-backend: "flashinfer_nvlink_one_sided" + gpu-memory-utilization: 0.95 + max-model-len: 1048576 + max-num-seqs: 128 + max-num-batched-tokens: 16384 + language-model-only: true + enable-auto-tool-choice: true + tool-call-parser: "kimi_k3" + reasoning-parser: "kimi_k3" + no-enable-flashinfer-autotune: true + +sbatch_directives: + cpus-per-task: "144" + mem: "0" + +srun_options: + container-remap-root: "" + +benchmark: + type: custom + aiperf_server_metrics: true + 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_DYNAMO_SESSION_TIMEOUT_SECONDS: "14400" + 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/benchmarks/multi_node/srt-slurm-recipes/vllm/kimi-k3/agentic/agg-gb200-tep8-balanced-agentic.yaml b/benchmarks/multi_node/srt-slurm-recipes/vllm/kimi-k3/agentic/agg-gb200-tep8-balanced-agentic.yaml new file mode 100644 index 0000000000..3993e3f6ac --- /dev/null +++ b/benchmarks/multi_node/srt-slurm-recipes/vllm/kimi-k3/agentic/agg-gb200-tep8-balanced-agentic.yaml @@ -0,0 +1,121 @@ +name: "kimi-k3-vllm-agg-gb200-tep8-balanced-agentic" + +# Day-0 GB200 translation of the official balanced multi_node_tep profile. +# Dense layers use TP8 while the MoE experts are sharded across the same eight +# GPUs on two four-GPU GB200 nodes. +# https://recipes.vllm.ai/moonshotai/Kimi-K3?hardware=gb200&nodes=2&strategy=multi_node_tep + +model: + path: "kimi-k3" + container: "vllm/vllm-openai:kimi-k3" + precision: "fp4" + +identity: + model: + repo: "moonshotai/Kimi-K3" + container: + image: "vllm/vllm-openai:kimi-k3" + frameworks: + dynamo: "1.3.0.dev20260618" + +dynamo: + install: true + wheel: "1.3.0.dev20260618" + +environment: + DYNAMO_WHEEL_DIRS: "/srtctl-wheels" + ETCD_LEASE_TTL: "7200" + +setup_script: vllm-container-deps.sh + +slurm: + time_limit: "8:00:00" + +health_check: + max_attempts: 2160 + interval_seconds: 10 + +resources: + gpu_type: "gb200" + gpus_per_node: 4 + agg_nodes: 2 + agg_workers: 1 + gpus_per_agg: 8 + +infra: + etcd_nats_dedicated_node: false + nats_max_payload_mb: 32 + +frontend: + type: dynamo + enable_multiple_frontends: false + args: + router-mode: "kv" + router-reset-states: true + +backend: + type: vllm + connector: null + aggregated_environment: + HF_HUB_CACHE: "/hf_hub_cache" + HUGGINGFACE_HUB_CACHE: "/hf_hub_cache" + TRANSFORMERS_CACHE: "/hf_hub_cache" + GLOO_SOCKET_IFNAME: "$IFACE_NAME" + NCCL_SOCKET_IFNAME: "$IFACE_NAME" + VLLM_ENGINE_READY_TIMEOUT_S: "7200" + VLLM_RPC_TIMEOUT: "600000" + VLLM_LOG_STATS_INTERVAL: "1" + VLLM_USE_V2_MODEL_RUNNER: "1" + VLLM_USE_RUST_FRONTEND: "1" + VLLM_ENABLE_K3_LATENT_MOE_TAIL_FUSION: "1" + NCCL_CUMEM_ENABLE: "1" + NCCL_MNNVL_ENABLE: "1" + NCCL_NVLS_ENABLE: "1" + UCX_MEMTYPE_CACHE: "n" + UCX_NET_DEVICES: "mlx5_0:1,mlx5_1:1,mlx5_2:1,mlx5_3:1" + UCX_TLS: "rc,cuda_copy" + NCCL_IB_HCA: "mlx5_0,mlx5_1,mlx5_2,mlx5_3" + NCCL_P2P_LEVEL: "NVL" + DG_JIT_CACHE_DIR: "/tmp/dg-cache-kimi-k3-gb200-tep8-{job_id}" + vllm_config: + aggregated: + served-model-name: "moonshotai/Kimi-K3" + tensor-parallel-size: 8 + pipeline-parallel-size: 1 + enable-expert-parallel: true + trust-remote-code: true + load-format: "fastsafetensors" + moe-backend: "flashinfer_trtllm" + all2all-backend: "flashinfer_nvlink_one_sided" + gpu-memory-utilization: 0.95 + max-model-len: 1048576 + max-num-seqs: 32 + max-num-batched-tokens: 8192 + language-model-only: true + enable-auto-tool-choice: true + tool-call-parser: "kimi_k3" + reasoning-parser: "kimi_k3" + no-enable-flashinfer-autotune: true + compilation-config: '{"pass_config":{"fuse_allreduce_rms":false}}' + +sbatch_directives: + cpus-per-task: "144" + mem: "0" + +srun_options: + container-remap-root: "" + +benchmark: + type: custom + aiperf_server_metrics: true + 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_DYNAMO_SESSION_TIMEOUT_SECONDS: "14400" + 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/benchmarks/multi_node/srt-slurm-recipes/vllm/kimi-k3/agentic/agg-gb200-tp8-latency-agentic.yaml b/benchmarks/multi_node/srt-slurm-recipes/vllm/kimi-k3/agentic/agg-gb200-tp8-latency-agentic.yaml new file mode 100644 index 0000000000..464c8fa529 --- /dev/null +++ b/benchmarks/multi_node/srt-slurm-recipes/vllm/kimi-k3/agentic/agg-gb200-tp8-latency-agentic.yaml @@ -0,0 +1,119 @@ +name: "kimi-k3-vllm-agg-gb200-tp8-latency-agentic" + +# Day-0 GB200 translation of the official latency-oriented multi_node_tp +# profile. Kimi K3 requires at least eight GPUs for TP, so this aggregate +# worker spans two four-GPU GB200 nodes. +# https://recipes.vllm.ai/moonshotai/Kimi-K3?hardware=gb200&nodes=2&strategy=multi_node_tp + +model: + path: "kimi-k3" + container: "vllm/vllm-openai:kimi-k3" + precision: "fp4" + +identity: + model: + repo: "moonshotai/Kimi-K3" + container: + image: "vllm/vllm-openai:kimi-k3" + frameworks: + dynamo: "1.3.0.dev20260618" + +dynamo: + install: true + wheel: "1.3.0.dev20260618" + +environment: + DYNAMO_WHEEL_DIRS: "/srtctl-wheels" + ETCD_LEASE_TTL: "7200" + +setup_script: vllm-container-deps.sh + +slurm: + time_limit: "8:00:00" + +health_check: + max_attempts: 2160 + interval_seconds: 10 + +resources: + gpu_type: "gb200" + gpus_per_node: 4 + agg_nodes: 2 + agg_workers: 1 + gpus_per_agg: 8 + +infra: + etcd_nats_dedicated_node: false + nats_max_payload_mb: 32 + +frontend: + type: dynamo + enable_multiple_frontends: false + args: + router-mode: "kv" + router-reset-states: true + +backend: + type: vllm + connector: null + aggregated_environment: + HF_HUB_CACHE: "/hf_hub_cache" + HUGGINGFACE_HUB_CACHE: "/hf_hub_cache" + TRANSFORMERS_CACHE: "/hf_hub_cache" + GLOO_SOCKET_IFNAME: "$IFACE_NAME" + NCCL_SOCKET_IFNAME: "$IFACE_NAME" + VLLM_ENGINE_READY_TIMEOUT_S: "7200" + VLLM_RPC_TIMEOUT: "600000" + VLLM_LOG_STATS_INTERVAL: "1" + VLLM_USE_V2_MODEL_RUNNER: "1" + VLLM_USE_RUST_FRONTEND: "1" + VLLM_ENABLE_K3_LATENT_MOE_TAIL_FUSION: "1" + NCCL_CUMEM_ENABLE: "1" + NCCL_MNNVL_ENABLE: "1" + NCCL_NVLS_ENABLE: "1" + UCX_MEMTYPE_CACHE: "n" + UCX_NET_DEVICES: "mlx5_0:1,mlx5_1:1,mlx5_2:1,mlx5_3:1" + UCX_TLS: "rc,cuda_copy" + NCCL_IB_HCA: "mlx5_0,mlx5_1,mlx5_2,mlx5_3" + NCCL_P2P_LEVEL: "NVL" + DG_JIT_CACHE_DIR: "/tmp/dg-cache-kimi-k3-gb200-tp8-{job_id}" + vllm_config: + aggregated: + served-model-name: "moonshotai/Kimi-K3" + tensor-parallel-size: 8 + pipeline-parallel-size: 1 + trust-remote-code: true + load-format: "fastsafetensors" + moe-backend: "flashinfer_trtllm" + gpu-memory-utilization: 0.95 + max-model-len: 1048576 + max-num-seqs: 8 + max-num-batched-tokens: 8192 + language-model-only: true + enable-auto-tool-choice: true + tool-call-parser: "kimi_k3" + reasoning-parser: "kimi_k3" + no-enable-flashinfer-autotune: true + compilation-config: '{"pass_config":{"fuse_allreduce_rms":false}}' + +sbatch_directives: + cpus-per-task: "144" + mem: "0" + +srun_options: + container-remap-root: "" + +benchmark: + type: custom + aiperf_server_metrics: true + 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_DYNAMO_SESSION_TIMEOUT_SECONDS: "14400" + 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 36ae816809..fde8856a5b 100644 --- a/configs/nvidia-master.yaml +++ b/configs/nvidia-master.yaml @@ -7986,6 +7986,79 @@ dsv4-fp4-gb300-dynamo-vllm-agentic-mtp-disagg: tp: 8 ep: 8 dp-attn: true + +# Day-0 Kimi K3 AgentX coverage on GB200. The three aggregate srt-slurm +# profiles mirror the serving strategies synthesized by the official recipe: +# latency: multi-node TP8 (2 GB200 nodes / 8 GPUs) +# balanced: multi-node TEP8 (2 GB200 nodes / 8 GPUs) +# throughput: multi-node DEP16 (4 GB200 nodes / 16 GPUs) +# https://recipes.vllm.ai/moonshotai/Kimi-K3?hardware=gb200 +kimik3-fp4-gb200-dynamo-vllm-agentic: + image: vllm/vllm-openai:kimi-k3 + model: moonshotai/Kimi-K3 + model-prefix: kimik3 + runner: cluster:gb200-nv + precision: fp4 + framework: dynamo-vllm + router: { name: dynamo-router, version: "1.3.0.dev20260618" } + multinode: true + disagg: false + scenarios: + agentic-coding: + - search-space: + # Latency oriented: official multi_node_tp strategy, TP8 across two + # four-GPU GB200 nodes. + # https://recipes.vllm.ai/moonshotai/Kimi-K3?hardware=gb200&nodes=2&strategy=multi_node_tp + - spec-decoding: none + conc-list: [1, 2, 4, 8] + prefill: + num-worker: 1 + tp: 8 + ep: 1 + dp-attn: false + additional-settings: + - "CONFIG_FILE=recipes/vllm/kimi-k3/agentic/agg-gb200-tp8-latency-agentic.yaml" + decode: + num-worker: 0 + tp: 8 + ep: 1 + dp-attn: false + # Balanced: official multi_node_tep strategy, TEP8 across two GB200 + # nodes. Expert parallelism reduces MoE weight/compute pressure while + # retaining TP8 for dense layers. + # https://recipes.vllm.ai/moonshotai/Kimi-K3?hardware=gb200&nodes=2&strategy=multi_node_tep + - spec-decoding: none + conc-list: [8, 16, 24, 32] + prefill: + num-worker: 1 + tp: 8 + ep: 8 + dp-attn: false + additional-settings: + - "CONFIG_FILE=recipes/vllm/kimi-k3/agentic/agg-gb200-tep8-balanced-agentic.yaml" + decode: + num-worker: 0 + tp: 8 + ep: 8 + dp-attn: false + # Throughput oriented: official multi_node_dep strategy, DEP16 across + # four GB200 nodes (DP16/EP16, four local DP ranks per node). + # https://recipes.vllm.ai/moonshotai/Kimi-K3?hardware=gb200&nodes=4&strategy=multi_node_dep + - spec-decoding: none + conc-list: [32, 64, 96, 128] + prefill: + num-worker: 1 + tp: 16 + ep: 16 + dp-attn: true + additional-settings: + - "CONFIG_FILE=recipes/vllm/kimi-k3/agentic/agg-gb200-dep16-throughput-agentic.yaml" + decode: + num-worker: 0 + tp: 16 + ep: 16 + dp-attn: true + dsv4-fp4-gb300-dynamo-sglang-agentic-agg: image: lmsysorg/sglang:nightly-dev-cu13-20260711-7de33ce8 model: deepseek-ai/DeepSeek-V4-Pro diff --git a/perf-changelog.yaml b/perf-changelog.yaml index 0524d0c0c9..8b59d9a335 100644 --- a/perf-changelog.yaml +++ b/perf-changelog.yaml @@ -5116,3 +5116,12 @@ description: - "Bump image from lmsysorg/sglang:v0.5.14-rocm720-mi35x to lmsysorg/sglang-rocm:v0.5.16-rocm720-mi35x-20260726" pr-link: https://github.com/SemiAnalysisAI/InferenceX/pull/2349 + +- config-keys: + - kimik3-fp4-gb200-dynamo-vllm-agentic + description: + - "Add Day-0 Kimi K3 MXFP4 GB200 AgentX support through checked-in srt-slurm aggregate recipes and the official vllm/vllm-openai:kimi-k3 image." + - "Reference the official GB200 command-builder profiles at https://recipes.vllm.ai/moonshotai/Kimi-K3?hardware=gb200: latency-oriented multi-node TP8 on 2 nodes, balanced multi-node TEP8 on 2 nodes, and throughput-oriented multi-node DEP16 on 4 nodes. The upstream recipe is pre-release and does not yet mark GB200 as verified." + - "Run the text-only AgentX trace with Kimi K3's full 1M context, kimi_k3 tool-call and reasoning parsers, fastsafetensors loading, K3 latent-MoE tail fusion, FlashInfer TRT-LLM MoE for TP/TEP, and DeepGEMM mega-MoE plus one-sided FlashInfer all-to-all for DEP." + - "Teach launch_gb200-nv.sh to map kimik3/fp4 to the pre-staged /mnt/lustre01/models/kimi-k3 checkpoint, register the matching srt-slurm model alias, and overlay the checked-in Kimi K3 AgentX recipes into the pinned agentic srt-slurm checkout." + pr-link: TBD diff --git a/runners/launch_gb200-nv.sh b/runners/launch_gb200-nv.sh index 426cd2dd87..4cbc852f5c 100755 --- a/runners/launch_gb200-nv.sh +++ b/runners/launch_gb200-nv.sh @@ -155,6 +155,12 @@ elif [[ $FRAMEWORK == "dynamo-vllm" ]]; then if [[ $MODEL_PREFIX == "kimik2.5" && $PRECISION == "fp4" ]]; then export MODEL_PATH="/mnt/lustre01/models/kimi-k2.5-nvfp4" export SRT_SLURM_MODEL_PREFIX="kimi-k2.5-nvfp4" + elif [[ $MODEL_PREFIX == "kimik3" && $PRECISION == "fp4" ]]; then + # Kimi K3's ~1.68 TB MXFP4 checkpoint must be pre-staged on the + # compute-visible shared Lustre filesystem. This alias matches + # model.path in the checked-in srt-slurm AgentX recipes. + export MODEL_PATH="/mnt/lustre01/models/kimi-k3" + export SRT_SLURM_MODEL_PREFIX="kimi-k3" elif [[ $MODEL_PREFIX == "dsv4" && $PRECISION == "fp4" ]]; then # The FP4 checkpoint is staged on compute-visible Lustre. The former # /mnt/numa1 path is no longer present on watchtower compute nodes; @@ -172,7 +178,7 @@ elif [[ $FRAMEWORK == "dynamo-vllm" ]]; then export MODEL_PATH="/mnt/lustre01/models/MiniMax-M3-MXFP8" export SRT_SLURM_MODEL_PREFIX="minimax-m3-mxfp8" else - echo "Unsupported model prefix/precision combination: $MODEL_PREFIX/$PRECISION. Supported combinations for dynamo-vllm: kimik2.5/fp4, dsv4/fp4, minimaxm2.5/fp4, minimaxm2.5/fp8, minimaxm3/fp8" + echo "Unsupported model prefix/precision combination: $MODEL_PREFIX/$PRECISION. Supported combinations for dynamo-vllm: kimik2.5/fp4, kimik3/fp4, dsv4/fp4, minimaxm2.5/fp4, minimaxm2.5/fp8, minimaxm3/fp8" exit 1 fi else @@ -183,7 +189,7 @@ NGINX_IMAGE="nginx:1.27.4" uses_watchtower_shared_fs() { case "$MODEL_PREFIX" in - minimaxm2.5|minimaxm3|kimik2.5|qwen3.5) return 0 ;; + minimaxm2.5|minimaxm3|kimik2.5|kimik3|qwen3.5) return 0 ;; *) return 1 ;; esac } @@ -364,9 +370,15 @@ if [[ "$IS_AGENTIC" == "1" ]]; then git clone https://github.com/cquil11/srt-slurm-nv.git "$SRT_REPO_DIR" cd "$SRT_REPO_DIR" git checkout de59739b172e507e15ebf145bfe305f606e82fbf - mkdir -p recipes/vllm/deepseek-v4/agentic - cp -rT "$GITHUB_WORKSPACE/benchmarks/multi_node/srt-slurm-recipes/vllm/deepseek-v4/agentic" \ - recipes/vllm/deepseek-v4/agentic + if [[ "$MODEL_PREFIX" == "kimik3" ]]; 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 + else + mkdir -p recipes/vllm/deepseek-v4/agentic + cp -rT "$GITHUB_WORKSPACE/benchmarks/multi_node/srt-slurm-recipes/vllm/deepseek-v4/agentic" \ + recipes/vllm/deepseek-v4/agentic + fi elif [[ $FRAMEWORK == "dynamo-vllm" && $MODEL_PREFIX == "dsv4" ]]; then git clone https://github.com/NVIDIA/srt-slurm.git "$SRT_REPO_DIR" cd "$SRT_REPO_DIR" From 3e2b96070b7049239f7e56aa9325a2b8d5106414 Mon Sep 17 00:00:00 2001 From: Cam Quilici Date: Mon, 27 Jul 2026 13:09:48 -0500 Subject: [PATCH 02/45] chore: link GB200 Kimi K3 changelog MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Record the draft pull request URL in the append-only benchmark changelog entry. 中文:在仅追加的基准测试变更日志条目中记录草稿 PR 链接。 --- perf-changelog.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/perf-changelog.yaml b/perf-changelog.yaml index 8b59d9a335..55d223058d 100644 --- a/perf-changelog.yaml +++ b/perf-changelog.yaml @@ -5124,4 +5124,4 @@ - "Reference the official GB200 command-builder profiles at https://recipes.vllm.ai/moonshotai/Kimi-K3?hardware=gb200: latency-oriented multi-node TP8 on 2 nodes, balanced multi-node TEP8 on 2 nodes, and throughput-oriented multi-node DEP16 on 4 nodes. The upstream recipe is pre-release and does not yet mark GB200 as verified." - "Run the text-only AgentX trace with Kimi K3's full 1M context, kimi_k3 tool-call and reasoning parsers, fastsafetensors loading, K3 latent-MoE tail fusion, FlashInfer TRT-LLM MoE for TP/TEP, and DeepGEMM mega-MoE plus one-sided FlashInfer all-to-all for DEP." - "Teach launch_gb200-nv.sh to map kimik3/fp4 to the pre-staged /mnt/lustre01/models/kimi-k3 checkpoint, register the matching srt-slurm model alias, and overlay the checked-in Kimi K3 AgentX recipes into the pinned agentic srt-slurm checkout." - pr-link: TBD + pr-link: https://github.com/SemiAnalysisAI/InferenceX/pull/2354 From 18b1af1deddf666683f7fe0e85d6b6bc7125bd2d Mon Sep 17 00:00:00 2001 From: Cam Quilici Date: Mon, 27 Jul 2026 18:36:21 -0500 Subject: [PATCH 03/45] fix(agentx): align Kimi K3 DEP metadata MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Represent the throughput arm as TP1 x DP16 = EP16 in the master configuration, matching the vLLM recipe. 中文:将吞吐量配置修正为 TP1 × DP16 = EP16,与 vLLM 配方保持一致。 --- configs/nvidia-master.yaml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/configs/nvidia-master.yaml b/configs/nvidia-master.yaml index fde8856a5b..082bc6e69e 100644 --- a/configs/nvidia-master.yaml +++ b/configs/nvidia-master.yaml @@ -8042,20 +8042,20 @@ kimik3-fp4-gb200-dynamo-vllm-agentic: ep: 8 dp-attn: false # Throughput oriented: official multi_node_dep strategy, DEP16 across - # four GB200 nodes (DP16/EP16, four local DP ranks per node). + # four GB200 nodes (TP1 x DP16 = EP16, four local DP ranks per node). # https://recipes.vllm.ai/moonshotai/Kimi-K3?hardware=gb200&nodes=4&strategy=multi_node_dep - spec-decoding: none conc-list: [32, 64, 96, 128] prefill: num-worker: 1 - tp: 16 + tp: 1 ep: 16 dp-attn: true additional-settings: - "CONFIG_FILE=recipes/vllm/kimi-k3/agentic/agg-gb200-dep16-throughput-agentic.yaml" decode: num-worker: 0 - tp: 16 + tp: 1 ep: 16 dp-attn: true From acfd9f3ba33591a3e3bdc6e198abaa5060441e5b Mon Sep 17 00:00:00 2001 From: Cam Quilici Date: Mon, 27 Jul 2026 18:42:49 -0500 Subject: [PATCH 04/45] perf(gb200): load Kimi K3 from local NVMe MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Use the pre-staged /mnt/numa1/models/Kimi-K3 checkpoint on every GB200 compute node while retaining shared-filesystem orchestration and caches. 中文:在每个 GB200 计算节点上使用预置的 /mnt/numa1/models/Kimi-K3 检查点,同时保留共享文件系统上的编排与缓存。 --- perf-changelog.yaml | 2 +- runners/launch_gb200-nv.sh | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/perf-changelog.yaml b/perf-changelog.yaml index 55d223058d..99844d9f66 100644 --- a/perf-changelog.yaml +++ b/perf-changelog.yaml @@ -5123,5 +5123,5 @@ - "Add Day-0 Kimi K3 MXFP4 GB200 AgentX support through checked-in srt-slurm aggregate recipes and the official vllm/vllm-openai:kimi-k3 image." - "Reference the official GB200 command-builder profiles at https://recipes.vllm.ai/moonshotai/Kimi-K3?hardware=gb200: latency-oriented multi-node TP8 on 2 nodes, balanced multi-node TEP8 on 2 nodes, and throughput-oriented multi-node DEP16 on 4 nodes. The upstream recipe is pre-release and does not yet mark GB200 as verified." - "Run the text-only AgentX trace with Kimi K3's full 1M context, kimi_k3 tool-call and reasoning parsers, fastsafetensors loading, K3 latent-MoE tail fusion, FlashInfer TRT-LLM MoE for TP/TEP, and DeepGEMM mega-MoE plus one-sided FlashInfer all-to-all for DEP." - - "Teach launch_gb200-nv.sh to map kimik3/fp4 to the pre-staged /mnt/lustre01/models/kimi-k3 checkpoint, register the matching srt-slurm model alias, and overlay the checked-in Kimi K3 AgentX recipes into the pinned agentic srt-slurm checkout." + - "Teach launch_gb200-nv.sh to map kimik3/fp4 to the pre-staged node-local NVMe checkpoint at /mnt/numa1/models/Kimi-K3 on every GB200 node, register the matching srt-slurm model alias, and overlay the checked-in Kimi K3 AgentX recipes into the pinned agentic srt-slurm checkout." pr-link: https://github.com/SemiAnalysisAI/InferenceX/pull/2354 diff --git a/runners/launch_gb200-nv.sh b/runners/launch_gb200-nv.sh index 4cbc852f5c..a8c50c7d9a 100755 --- a/runners/launch_gb200-nv.sh +++ b/runners/launch_gb200-nv.sh @@ -156,10 +156,10 @@ elif [[ $FRAMEWORK == "dynamo-vllm" ]]; then export MODEL_PATH="/mnt/lustre01/models/kimi-k2.5-nvfp4" export SRT_SLURM_MODEL_PREFIX="kimi-k2.5-nvfp4" elif [[ $MODEL_PREFIX == "kimik3" && $PRECISION == "fp4" ]]; then - # Kimi K3's ~1.68 TB MXFP4 checkpoint must be pre-staged on the - # compute-visible shared Lustre filesystem. This alias matches - # model.path in the checked-in srt-slurm AgentX recipes. - export MODEL_PATH="/mnt/lustre01/models/kimi-k3" + # Load Kimi K3 from node-local NVMe for faster startup. The checkpoint + # must be pre-staged at this exact path on every allocated GB200 node. + # This alias matches model.path in the checked-in AgentX recipes. + export MODEL_PATH="/mnt/numa1/models/Kimi-K3" export SRT_SLURM_MODEL_PREFIX="kimi-k3" elif [[ $MODEL_PREFIX == "dsv4" && $PRECISION == "fp4" ]]; then # The FP4 checkpoint is staged on compute-visible Lustre. The former From fd088cdeea0436c995c37a7eeb4584bb8a6d4128 Mon Sep 17 00:00:00 2001 From: Cam Quilici Date: Mon, 27 Jul 2026 18:45:52 -0500 Subject: [PATCH 05/45] chore: simplify Kimi K3 performance config MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Keep the Day-0 changelog focused on the vLLM recipe performance points and use the model default context length. 中文:精简 Kimi K3 首日性能配置,仅保留与 vLLM 配方一致的性能测试点,并使用模型默认上下文长度。 --- .../kimi-k3/agentic/agg-gb200-dep16-throughput-agentic.yaml | 1 - .../kimi-k3/agentic/agg-gb200-tep8-balanced-agentic.yaml | 1 - .../vllm/kimi-k3/agentic/agg-gb200-tp8-latency-agentic.yaml | 1 - perf-changelog.yaml | 5 +---- 4 files changed, 1 insertion(+), 7 deletions(-) diff --git a/benchmarks/multi_node/srt-slurm-recipes/vllm/kimi-k3/agentic/agg-gb200-dep16-throughput-agentic.yaml b/benchmarks/multi_node/srt-slurm-recipes/vllm/kimi-k3/agentic/agg-gb200-dep16-throughput-agentic.yaml index 5a1721fdd8..2607ea1572 100644 --- a/benchmarks/multi_node/srt-slurm-recipes/vllm/kimi-k3/agentic/agg-gb200-dep16-throughput-agentic.yaml +++ b/benchmarks/multi_node/srt-slurm-recipes/vllm/kimi-k3/agentic/agg-gb200-dep16-throughput-agentic.yaml @@ -90,7 +90,6 @@ backend: moe-backend: "deep_gemm_mega_moe" all2all-backend: "flashinfer_nvlink_one_sided" gpu-memory-utilization: 0.95 - max-model-len: 1048576 max-num-seqs: 128 max-num-batched-tokens: 16384 language-model-only: true diff --git a/benchmarks/multi_node/srt-slurm-recipes/vllm/kimi-k3/agentic/agg-gb200-tep8-balanced-agentic.yaml b/benchmarks/multi_node/srt-slurm-recipes/vllm/kimi-k3/agentic/agg-gb200-tep8-balanced-agentic.yaml index 3993e3f6ac..11053ad3e0 100644 --- a/benchmarks/multi_node/srt-slurm-recipes/vllm/kimi-k3/agentic/agg-gb200-tep8-balanced-agentic.yaml +++ b/benchmarks/multi_node/srt-slurm-recipes/vllm/kimi-k3/agentic/agg-gb200-tep8-balanced-agentic.yaml @@ -88,7 +88,6 @@ backend: moe-backend: "flashinfer_trtllm" all2all-backend: "flashinfer_nvlink_one_sided" gpu-memory-utilization: 0.95 - max-model-len: 1048576 max-num-seqs: 32 max-num-batched-tokens: 8192 language-model-only: true diff --git a/benchmarks/multi_node/srt-slurm-recipes/vllm/kimi-k3/agentic/agg-gb200-tp8-latency-agentic.yaml b/benchmarks/multi_node/srt-slurm-recipes/vllm/kimi-k3/agentic/agg-gb200-tp8-latency-agentic.yaml index 464c8fa529..3685e14653 100644 --- a/benchmarks/multi_node/srt-slurm-recipes/vllm/kimi-k3/agentic/agg-gb200-tp8-latency-agentic.yaml +++ b/benchmarks/multi_node/srt-slurm-recipes/vllm/kimi-k3/agentic/agg-gb200-tp8-latency-agentic.yaml @@ -86,7 +86,6 @@ backend: load-format: "fastsafetensors" moe-backend: "flashinfer_trtllm" gpu-memory-utilization: 0.95 - max-model-len: 1048576 max-num-seqs: 8 max-num-batched-tokens: 8192 language-model-only: true diff --git a/perf-changelog.yaml b/perf-changelog.yaml index 99844d9f66..c94fee0cf9 100644 --- a/perf-changelog.yaml +++ b/perf-changelog.yaml @@ -5120,8 +5120,5 @@ - config-keys: - kimik3-fp4-gb200-dynamo-vllm-agentic description: - - "Add Day-0 Kimi K3 MXFP4 GB200 AgentX support through checked-in srt-slurm aggregate recipes and the official vllm/vllm-openai:kimi-k3 image." - - "Reference the official GB200 command-builder profiles at https://recipes.vllm.ai/moonshotai/Kimi-K3?hardware=gb200: latency-oriented multi-node TP8 on 2 nodes, balanced multi-node TEP8 on 2 nodes, and throughput-oriented multi-node DEP16 on 4 nodes. The upstream recipe is pre-release and does not yet mark GB200 as verified." - - "Run the text-only AgentX trace with Kimi K3's full 1M context, kimi_k3 tool-call and reasoning parsers, fastsafetensors loading, K3 latent-MoE tail fusion, FlashInfer TRT-LLM MoE for TP/TEP, and DeepGEMM mega-MoE plus one-sided FlashInfer all-to-all for DEP." - - "Teach launch_gb200-nv.sh to map kimik3/fp4 to the pre-staged node-local NVMe checkpoint at /mnt/numa1/models/Kimi-K3 on every GB200 node, register the matching srt-slurm model alias, and overlay the checked-in Kimi K3 AgentX recipes into the pinned agentic srt-slurm checkout." + - "Add Day-0 Kimi K3 MXFP4 GB200 AgentX performance points following the official vLLM recipe: TP8 on 2 nodes (conc 1-8), TEP8 on 2 nodes (conc 8-32), and DEP16 on 4 nodes (conc 32-128). https://recipes.vllm.ai/moonshotai/Kimi-K3?hardware=gb200" pr-link: https://github.com/SemiAnalysisAI/InferenceX/pull/2354 From 6c335b500197f239905b7fecbe546a4fd0df6854 Mon Sep 17 00:00:00 2001 From: Cam Quilici Date: Mon, 27 Jul 2026 19:11:49 -0500 Subject: [PATCH 06/45] perf(gb200): size Kimi K3 AgentX sweep from HBM MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Move latency and balanced profiles to 16-GPU TP/TEP, use TP2 x DP8 for EP16 throughput, and extend the throughput concurrency sweep through 256. 中文:根据 GB200 HBM 容量调整 Kimi K3 AgentX 扫描。将延迟与均衡配置扩展为 16 GPU TP/TEP,吞吐配置改为 TP2 × DP8(EP16),并将吞吐并发扫描扩展至 256。 --- .../agg-gb200-dep16-throughput-agentic.yaml | 8 ++-- ... => agg-gb200-tep16-balanced-agentic.yaml} | 16 +++---- ...ml => agg-gb200-tp16-latency-agentic.yaml} | 16 +++---- configs/nvidia-master.yaml | 42 +++++++++---------- perf-changelog.yaml | 2 +- 5 files changed, 41 insertions(+), 43 deletions(-) rename benchmarks/multi_node/srt-slurm-recipes/vllm/kimi-k3/agentic/{agg-gb200-tep8-balanced-agentic.yaml => agg-gb200-tep16-balanced-agentic.yaml} (89%) rename benchmarks/multi_node/srt-slurm-recipes/vllm/kimi-k3/agentic/{agg-gb200-tp8-latency-agentic.yaml => agg-gb200-tp16-latency-agentic.yaml} (89%) diff --git a/benchmarks/multi_node/srt-slurm-recipes/vllm/kimi-k3/agentic/agg-gb200-dep16-throughput-agentic.yaml b/benchmarks/multi_node/srt-slurm-recipes/vllm/kimi-k3/agentic/agg-gb200-dep16-throughput-agentic.yaml index 2607ea1572..d89336be4e 100644 --- a/benchmarks/multi_node/srt-slurm-recipes/vllm/kimi-k3/agentic/agg-gb200-dep16-throughput-agentic.yaml +++ b/benchmarks/multi_node/srt-slurm-recipes/vllm/kimi-k3/agentic/agg-gb200-dep16-throughput-agentic.yaml @@ -1,8 +1,8 @@ name: "kimi-k3-vllm-agg-gb200-dep16-throughput-agentic" # Day-0 GB200 translation of the official throughput-oriented multi_node_dep -# profile. The 16-way data/expert-parallel worker spans four four-GPU GB200 -# nodes, with four local DP ranks on each node. +# profile. TP2 x DP8 gives EP16 across four four-GPU GB200 nodes. TP2 shards +# the dense weights so each DP rank has room for K3's default BF16 KV cache. # https://recipes.vllm.ai/moonshotai/Kimi-K3?hardware=gb200&nodes=4&strategy=multi_node_dep model: @@ -80,9 +80,9 @@ backend: vllm_config: aggregated: served-model-name: "moonshotai/Kimi-K3" - tensor-parallel-size: 1 + tensor-parallel-size: 2 pipeline-parallel-size: 1 - data-parallel-size: 16 + data-parallel-size: 8 data-parallel-rpc-port: 13345 enable-expert-parallel: true trust-remote-code: true diff --git a/benchmarks/multi_node/srt-slurm-recipes/vllm/kimi-k3/agentic/agg-gb200-tep8-balanced-agentic.yaml b/benchmarks/multi_node/srt-slurm-recipes/vllm/kimi-k3/agentic/agg-gb200-tep16-balanced-agentic.yaml similarity index 89% rename from benchmarks/multi_node/srt-slurm-recipes/vllm/kimi-k3/agentic/agg-gb200-tep8-balanced-agentic.yaml rename to benchmarks/multi_node/srt-slurm-recipes/vllm/kimi-k3/agentic/agg-gb200-tep16-balanced-agentic.yaml index 11053ad3e0..880806478d 100644 --- a/benchmarks/multi_node/srt-slurm-recipes/vllm/kimi-k3/agentic/agg-gb200-tep8-balanced-agentic.yaml +++ b/benchmarks/multi_node/srt-slurm-recipes/vllm/kimi-k3/agentic/agg-gb200-tep16-balanced-agentic.yaml @@ -1,9 +1,9 @@ -name: "kimi-k3-vllm-agg-gb200-tep8-balanced-agentic" +name: "kimi-k3-vllm-agg-gb200-tep16-balanced-agentic" # Day-0 GB200 translation of the official balanced multi_node_tep profile. -# Dense layers use TP8 while the MoE experts are sharded across the same eight -# GPUs on two four-GPU GB200 nodes. -# https://recipes.vllm.ai/moonshotai/Kimi-K3?hardware=gb200&nodes=2&strategy=multi_node_tep +# Dense layers and MoE experts are sharded across 16 GPUs on four GB200 nodes, +# leaving enough HBM for the default BF16 KV cache. +# https://recipes.vllm.ai/moonshotai/Kimi-K3?hardware=gb200&nodes=4&strategy=multi_node_tep model: path: "kimi-k3" @@ -38,9 +38,9 @@ health_check: resources: gpu_type: "gb200" gpus_per_node: 4 - agg_nodes: 2 + agg_nodes: 4 agg_workers: 1 - gpus_per_agg: 8 + gpus_per_agg: 16 infra: etcd_nats_dedicated_node: false @@ -76,11 +76,11 @@ backend: UCX_TLS: "rc,cuda_copy" NCCL_IB_HCA: "mlx5_0,mlx5_1,mlx5_2,mlx5_3" NCCL_P2P_LEVEL: "NVL" - DG_JIT_CACHE_DIR: "/tmp/dg-cache-kimi-k3-gb200-tep8-{job_id}" + DG_JIT_CACHE_DIR: "/tmp/dg-cache-kimi-k3-gb200-tep16-{job_id}" vllm_config: aggregated: served-model-name: "moonshotai/Kimi-K3" - tensor-parallel-size: 8 + tensor-parallel-size: 16 pipeline-parallel-size: 1 enable-expert-parallel: true trust-remote-code: true diff --git a/benchmarks/multi_node/srt-slurm-recipes/vllm/kimi-k3/agentic/agg-gb200-tp8-latency-agentic.yaml b/benchmarks/multi_node/srt-slurm-recipes/vllm/kimi-k3/agentic/agg-gb200-tp16-latency-agentic.yaml similarity index 89% rename from benchmarks/multi_node/srt-slurm-recipes/vllm/kimi-k3/agentic/agg-gb200-tp8-latency-agentic.yaml rename to benchmarks/multi_node/srt-slurm-recipes/vllm/kimi-k3/agentic/agg-gb200-tp16-latency-agentic.yaml index 3685e14653..f2e0345e56 100644 --- a/benchmarks/multi_node/srt-slurm-recipes/vllm/kimi-k3/agentic/agg-gb200-tp8-latency-agentic.yaml +++ b/benchmarks/multi_node/srt-slurm-recipes/vllm/kimi-k3/agentic/agg-gb200-tp16-latency-agentic.yaml @@ -1,9 +1,9 @@ -name: "kimi-k3-vllm-agg-gb200-tp8-latency-agentic" +name: "kimi-k3-vllm-agg-gb200-tp16-latency-agentic" # Day-0 GB200 translation of the official latency-oriented multi_node_tp -# profile. Kimi K3 requires at least eight GPUs for TP, so this aggregate -# worker spans two four-GPU GB200 nodes. -# https://recipes.vllm.ai/moonshotai/Kimi-K3?hardware=gb200&nodes=2&strategy=multi_node_tp +# profile. TP16 across four GB200 nodes leaves enough HBM for the default +# BF16 KV cache with the 2.8T MXFP4 checkpoint. +# https://recipes.vllm.ai/moonshotai/Kimi-K3?hardware=gb200&nodes=4&strategy=multi_node_tp model: path: "kimi-k3" @@ -38,9 +38,9 @@ health_check: resources: gpu_type: "gb200" gpus_per_node: 4 - agg_nodes: 2 + agg_nodes: 4 agg_workers: 1 - gpus_per_agg: 8 + gpus_per_agg: 16 infra: etcd_nats_dedicated_node: false @@ -76,11 +76,11 @@ backend: UCX_TLS: "rc,cuda_copy" NCCL_IB_HCA: "mlx5_0,mlx5_1,mlx5_2,mlx5_3" NCCL_P2P_LEVEL: "NVL" - DG_JIT_CACHE_DIR: "/tmp/dg-cache-kimi-k3-gb200-tp8-{job_id}" + DG_JIT_CACHE_DIR: "/tmp/dg-cache-kimi-k3-gb200-tp16-{job_id}" vllm_config: aggregated: served-model-name: "moonshotai/Kimi-K3" - tensor-parallel-size: 8 + tensor-parallel-size: 16 pipeline-parallel-size: 1 trust-remote-code: true load-format: "fastsafetensors" diff --git a/configs/nvidia-master.yaml b/configs/nvidia-master.yaml index 082bc6e69e..718cef0591 100644 --- a/configs/nvidia-master.yaml +++ b/configs/nvidia-master.yaml @@ -7989,9 +7989,9 @@ dsv4-fp4-gb300-dynamo-vllm-agentic-mtp-disagg: # Day-0 Kimi K3 AgentX coverage on GB200. The three aggregate srt-slurm # profiles mirror the serving strategies synthesized by the official recipe: -# latency: multi-node TP8 (2 GB200 nodes / 8 GPUs) -# balanced: multi-node TEP8 (2 GB200 nodes / 8 GPUs) -# throughput: multi-node DEP16 (4 GB200 nodes / 16 GPUs) +# latency: multi-node TP16 (4 GB200 nodes / 16 GPUs) +# balanced: multi-node TEP16 (4 GB200 nodes / 16 GPUs) +# throughput: multi-node TP2 x DP8 (4 GB200 nodes / EP16) # https://recipes.vllm.ai/moonshotai/Kimi-K3?hardware=gb200 kimik3-fp4-gb200-dynamo-vllm-agentic: image: vllm/vllm-openai:kimi-k3 @@ -8006,56 +8006,54 @@ kimik3-fp4-gb200-dynamo-vllm-agentic: scenarios: agentic-coding: - search-space: - # Latency oriented: official multi_node_tp strategy, TP8 across two - # four-GPU GB200 nodes. - # https://recipes.vllm.ai/moonshotai/Kimi-K3?hardware=gb200&nodes=2&strategy=multi_node_tp + # Latency oriented: multi_node_tp strategy, TP16 across four GB200 + # nodes. TP8 does not leave enough HBM for K3's default BF16 KV cache. + # https://recipes.vllm.ai/moonshotai/Kimi-K3?hardware=gb200&nodes=4&strategy=multi_node_tp - spec-decoding: none conc-list: [1, 2, 4, 8] prefill: num-worker: 1 - tp: 8 + tp: 16 ep: 1 dp-attn: false additional-settings: - - "CONFIG_FILE=recipes/vllm/kimi-k3/agentic/agg-gb200-tp8-latency-agentic.yaml" + - "CONFIG_FILE=recipes/vllm/kimi-k3/agentic/agg-gb200-tp16-latency-agentic.yaml" decode: num-worker: 0 - tp: 8 + tp: 16 ep: 1 dp-attn: false - # Balanced: official multi_node_tep strategy, TEP8 across two GB200 - # nodes. Expert parallelism reduces MoE weight/compute pressure while - # retaining TP8 for dense layers. - # https://recipes.vllm.ai/moonshotai/Kimi-K3?hardware=gb200&nodes=2&strategy=multi_node_tep + # Balanced: multi_node_tep strategy, TEP16 across four GB200 nodes. + # https://recipes.vllm.ai/moonshotai/Kimi-K3?hardware=gb200&nodes=4&strategy=multi_node_tep - spec-decoding: none conc-list: [8, 16, 24, 32] prefill: num-worker: 1 - tp: 8 - ep: 8 + tp: 16 + ep: 16 dp-attn: false additional-settings: - - "CONFIG_FILE=recipes/vllm/kimi-k3/agentic/agg-gb200-tep8-balanced-agentic.yaml" + - "CONFIG_FILE=recipes/vllm/kimi-k3/agentic/agg-gb200-tep16-balanced-agentic.yaml" decode: num-worker: 0 - tp: 8 - ep: 8 + tp: 16 + ep: 16 dp-attn: false # Throughput oriented: official multi_node_dep strategy, DEP16 across - # four GB200 nodes (TP1 x DP16 = EP16, four local DP ranks per node). + # four GB200 nodes (TP2 x DP8 = EP16, two local DP ranks per node). # https://recipes.vllm.ai/moonshotai/Kimi-K3?hardware=gb200&nodes=4&strategy=multi_node_dep - spec-decoding: none - conc-list: [32, 64, 96, 128] + conc-list: [32, 64, 96, 128, 192, 256] prefill: num-worker: 1 - tp: 1 + tp: 2 ep: 16 dp-attn: true additional-settings: - "CONFIG_FILE=recipes/vllm/kimi-k3/agentic/agg-gb200-dep16-throughput-agentic.yaml" decode: num-worker: 0 - tp: 1 + tp: 2 ep: 16 dp-attn: true diff --git a/perf-changelog.yaml b/perf-changelog.yaml index c94fee0cf9..f9eaf3d718 100644 --- a/perf-changelog.yaml +++ b/perf-changelog.yaml @@ -5120,5 +5120,5 @@ - config-keys: - kimik3-fp4-gb200-dynamo-vllm-agentic description: - - "Add Day-0 Kimi K3 MXFP4 GB200 AgentX performance points following the official vLLM recipe: TP8 on 2 nodes (conc 1-8), TEP8 on 2 nodes (conc 8-32), and DEP16 on 4 nodes (conc 32-128). https://recipes.vllm.ai/moonshotai/Kimi-K3?hardware=gb200" + - "Add Day-0 Kimi K3 MXFP4 GB200 AgentX performance points following the official vLLM recipe: TP16 (conc 1-8), TEP16 (conc 8-32), and TP2 x DP8 = EP16 (conc 32-256). https://recipes.vllm.ai/moonshotai/Kimi-K3?hardware=gb200" pr-link: https://github.com/SemiAnalysisAI/InferenceX/pull/2354 From dc90e33db5f0152884ea223eea7a6f6ce0482f96 Mon Sep 17 00:00:00 2001 From: Cam Quilici Date: Mon, 27 Jul 2026 19:29:33 -0500 Subject: [PATCH 07/45] fix(gb200): drop unsupported Kimi K3 worker parsers MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The Dynamo vLLM worker entrypoint does not accept vllm serve tool-call or reasoning parser flags; agentic request parsing belongs to the Dynamo frontend. 中文:移除 Dynamo vLLM worker 不支持的 Kimi K3 工具调用与推理解析参数;AgentX 请求解析由 Dynamo frontend 负责。 --- .../kimi-k3/agentic/agg-gb200-dep16-throughput-agentic.yaml | 3 --- .../vllm/kimi-k3/agentic/agg-gb200-tep16-balanced-agentic.yaml | 3 --- .../vllm/kimi-k3/agentic/agg-gb200-tp16-latency-agentic.yaml | 3 --- 3 files changed, 9 deletions(-) diff --git a/benchmarks/multi_node/srt-slurm-recipes/vllm/kimi-k3/agentic/agg-gb200-dep16-throughput-agentic.yaml b/benchmarks/multi_node/srt-slurm-recipes/vllm/kimi-k3/agentic/agg-gb200-dep16-throughput-agentic.yaml index d89336be4e..4b43f34cc7 100644 --- a/benchmarks/multi_node/srt-slurm-recipes/vllm/kimi-k3/agentic/agg-gb200-dep16-throughput-agentic.yaml +++ b/benchmarks/multi_node/srt-slurm-recipes/vllm/kimi-k3/agentic/agg-gb200-dep16-throughput-agentic.yaml @@ -93,9 +93,6 @@ backend: max-num-seqs: 128 max-num-batched-tokens: 16384 language-model-only: true - enable-auto-tool-choice: true - tool-call-parser: "kimi_k3" - reasoning-parser: "kimi_k3" no-enable-flashinfer-autotune: true sbatch_directives: diff --git a/benchmarks/multi_node/srt-slurm-recipes/vllm/kimi-k3/agentic/agg-gb200-tep16-balanced-agentic.yaml b/benchmarks/multi_node/srt-slurm-recipes/vllm/kimi-k3/agentic/agg-gb200-tep16-balanced-agentic.yaml index 880806478d..946ed26b4c 100644 --- a/benchmarks/multi_node/srt-slurm-recipes/vllm/kimi-k3/agentic/agg-gb200-tep16-balanced-agentic.yaml +++ b/benchmarks/multi_node/srt-slurm-recipes/vllm/kimi-k3/agentic/agg-gb200-tep16-balanced-agentic.yaml @@ -91,9 +91,6 @@ backend: max-num-seqs: 32 max-num-batched-tokens: 8192 language-model-only: true - enable-auto-tool-choice: true - tool-call-parser: "kimi_k3" - reasoning-parser: "kimi_k3" no-enable-flashinfer-autotune: true compilation-config: '{"pass_config":{"fuse_allreduce_rms":false}}' diff --git a/benchmarks/multi_node/srt-slurm-recipes/vllm/kimi-k3/agentic/agg-gb200-tp16-latency-agentic.yaml b/benchmarks/multi_node/srt-slurm-recipes/vllm/kimi-k3/agentic/agg-gb200-tp16-latency-agentic.yaml index f2e0345e56..a970a3fe52 100644 --- a/benchmarks/multi_node/srt-slurm-recipes/vllm/kimi-k3/agentic/agg-gb200-tp16-latency-agentic.yaml +++ b/benchmarks/multi_node/srt-slurm-recipes/vllm/kimi-k3/agentic/agg-gb200-tp16-latency-agentic.yaml @@ -89,9 +89,6 @@ backend: max-num-seqs: 8 max-num-batched-tokens: 8192 language-model-only: true - enable-auto-tool-choice: true - tool-call-parser: "kimi_k3" - reasoning-parser: "kimi_k3" no-enable-flashinfer-autotune: true compilation-config: '{"pass_config":{"fuse_allreduce_rms":false}}' From d3b3f053a2a126ce4d71c64a971959f7bc97a18f Mon Sep 17 00:00:00 2001 From: Cam Quilici Date: Mon, 27 Jul 2026 19:36:31 -0500 Subject: [PATCH 08/45] fix(gb200): let srt-slurm select collective interfaces MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Remove literal shell placeholders from the vLLM worker environment so Gloo and NCCL use the interfaces selected by the srt-slurm launcher. 中文:移除 vLLM worker 环境中的字面量 shell 占位符,由 srt-slurm launcher 为 Gloo 与 NCCL 选择网络接口。 --- .../kimi-k3/agentic/agg-gb200-dep16-throughput-agentic.yaml | 2 -- .../vllm/kimi-k3/agentic/agg-gb200-tep16-balanced-agentic.yaml | 2 -- .../vllm/kimi-k3/agentic/agg-gb200-tp16-latency-agentic.yaml | 2 -- 3 files changed, 6 deletions(-) diff --git a/benchmarks/multi_node/srt-slurm-recipes/vllm/kimi-k3/agentic/agg-gb200-dep16-throughput-agentic.yaml b/benchmarks/multi_node/srt-slurm-recipes/vllm/kimi-k3/agentic/agg-gb200-dep16-throughput-agentic.yaml index 4b43f34cc7..c21d950963 100644 --- a/benchmarks/multi_node/srt-slurm-recipes/vllm/kimi-k3/agentic/agg-gb200-dep16-throughput-agentic.yaml +++ b/benchmarks/multi_node/srt-slurm-recipes/vllm/kimi-k3/agentic/agg-gb200-dep16-throughput-agentic.yaml @@ -60,8 +60,6 @@ backend: HF_HUB_CACHE: "/hf_hub_cache" HUGGINGFACE_HUB_CACHE: "/hf_hub_cache" TRANSFORMERS_CACHE: "/hf_hub_cache" - GLOO_SOCKET_IFNAME: "$IFACE_NAME" - NCCL_SOCKET_IFNAME: "$IFACE_NAME" VLLM_ENGINE_READY_TIMEOUT_S: "7200" VLLM_RPC_TIMEOUT: "600000" VLLM_LOG_STATS_INTERVAL: "1" diff --git a/benchmarks/multi_node/srt-slurm-recipes/vllm/kimi-k3/agentic/agg-gb200-tep16-balanced-agentic.yaml b/benchmarks/multi_node/srt-slurm-recipes/vllm/kimi-k3/agentic/agg-gb200-tep16-balanced-agentic.yaml index 946ed26b4c..c09a8e82cc 100644 --- a/benchmarks/multi_node/srt-slurm-recipes/vllm/kimi-k3/agentic/agg-gb200-tep16-balanced-agentic.yaml +++ b/benchmarks/multi_node/srt-slurm-recipes/vllm/kimi-k3/agentic/agg-gb200-tep16-balanced-agentic.yaml @@ -60,8 +60,6 @@ backend: HF_HUB_CACHE: "/hf_hub_cache" HUGGINGFACE_HUB_CACHE: "/hf_hub_cache" TRANSFORMERS_CACHE: "/hf_hub_cache" - GLOO_SOCKET_IFNAME: "$IFACE_NAME" - NCCL_SOCKET_IFNAME: "$IFACE_NAME" VLLM_ENGINE_READY_TIMEOUT_S: "7200" VLLM_RPC_TIMEOUT: "600000" VLLM_LOG_STATS_INTERVAL: "1" diff --git a/benchmarks/multi_node/srt-slurm-recipes/vllm/kimi-k3/agentic/agg-gb200-tp16-latency-agentic.yaml b/benchmarks/multi_node/srt-slurm-recipes/vllm/kimi-k3/agentic/agg-gb200-tp16-latency-agentic.yaml index a970a3fe52..926f9a95ef 100644 --- a/benchmarks/multi_node/srt-slurm-recipes/vllm/kimi-k3/agentic/agg-gb200-tp16-latency-agentic.yaml +++ b/benchmarks/multi_node/srt-slurm-recipes/vllm/kimi-k3/agentic/agg-gb200-tp16-latency-agentic.yaml @@ -60,8 +60,6 @@ backend: HF_HUB_CACHE: "/hf_hub_cache" HUGGINGFACE_HUB_CACHE: "/hf_hub_cache" TRANSFORMERS_CACHE: "/hf_hub_cache" - GLOO_SOCKET_IFNAME: "$IFACE_NAME" - NCCL_SOCKET_IFNAME: "$IFACE_NAME" VLLM_ENGINE_READY_TIMEOUT_S: "7200" VLLM_RPC_TIMEOUT: "600000" VLLM_LOG_STATS_INTERVAL: "1" From f513599de50e9a09c57f76aece1b02bbf34760b3 Mon Sep 17 00:00:00 2001 From: Cam Quilici Date: Mon, 27 Jul 2026 19:48:50 -0500 Subject: [PATCH 09/45] fix(gb200): launch Kimi K3 TP2 DP8 per node MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Patch the pinned agentic srt-slurm checkout to launch one vLLM process per GB200 node, with two local DP ranks and TP2 per rank. Export every per-node metrics endpoint to AIPerf. 中文:修补 AgentX 固定版本的 srt-slurm,使每个 GB200 节点启动一个 vLLM 进程,每个进程承载两个本地 DP rank,并为每个 rank 使用 TP2;同时将所有节点的 metrics endpoint 传给 AIPerf。 --- .../configs/kimi-k3-vllm-tp-dp-per-node.patch | 101 ++++++++++++++++++ .../agg-gb200-dep16-throughput-agentic.yaml | 1 + runners/launch_gb200-nv.sh | 2 + 3 files changed, 104 insertions(+) create mode 100644 benchmarks/multi_node/srt-slurm-recipes/configs/kimi-k3-vllm-tp-dp-per-node.patch diff --git a/benchmarks/multi_node/srt-slurm-recipes/configs/kimi-k3-vllm-tp-dp-per-node.patch b/benchmarks/multi_node/srt-slurm-recipes/configs/kimi-k3-vllm-tp-dp-per-node.patch new file mode 100644 index 0000000000..086d944559 --- /dev/null +++ b/benchmarks/multi_node/srt-slurm-recipes/configs/kimi-k3-vllm-tp-dp-per-node.patch @@ -0,0 +1,101 @@ +diff --git a/src/srtctl/backends/vllm.py b/src/srtctl/backends/vllm.py +index 828c109..5844d2a 100644 +--- a/src/srtctl/backends/vllm.py ++++ b/src/srtctl/backends/vllm.py +@@ -33,6 +33,7 @@ if TYPE_CHECKING: + + # Type alias for worker modes + WorkerMode = Literal["prefill", "decode", "agg"] ++DPLaunchMode = Literal["per_gpu", "per_node"] + + + @dataclass(frozen=True) +@@ -93,6 +94,10 @@ class VLLMProtocol: + # dynamo 1.0.0+: translated to --kv-transfer-config (--connector was removed). + connector: str | None = "nixl" + ++ # DP process layout. Per-node mode lets vLLM create multiple local DP ++ # ranks while retaining tensor parallelism within each rank. ++ dp_launch_mode: DPLaunchMode = "per_gpu" ++ + Schema: ClassVar[builtins.type[Schema]] = Schema + + # ========================================================================= +@@ -211,6 +216,9 @@ class VLLMProtocol: + # Standard TP mode: one process per node + return endpoints_to_processes(endpoints, base_sys_port=base_sys_port, port_allocator=port_allocator) + ++ if self.dp_launch_mode == "per_node": ++ return endpoints_to_processes(endpoints, base_sys_port=base_sys_port, port_allocator=port_allocator) ++ + # DP+EP mode: one process per GPU + processes: list[Process] = [] + current_sys_port = base_sys_port +@@ -352,7 +360,51 @@ class VLLMProtocol: + # Check if this is DP+EP mode (data-parallel-size set) + is_dp_mode = self._is_dp_mode(mode) + +- if is_dp_mode: ++ if is_dp_mode and self.dp_launch_mode == "per_node": ++ dp_size = self._get_dp_size(mode) ++ tp_size = config.get("tensor-parallel-size") or config.get("tensor_parallel_size") or 1 ++ if dp_size is None: ++ raise ValueError(f"{mode} is missing data-parallel-size") ++ ++ total_gpus = sum(len(item.gpu_indices) for item in endpoint_processes) ++ if dp_size * tp_size != total_gpus: ++ raise ValueError( ++ f"{mode} data-parallel-size={dp_size} x tensor-parallel-size={tp_size} " ++ f"does not match the endpoint's {total_gpus} allocated GPUs" ++ ) ++ if len(process.gpu_indices) % tp_size != 0: ++ raise ValueError( ++ f"{mode} has {len(process.gpu_indices)} local GPUs, which is not divisible " ++ f"by tensor-parallel-size={tp_size}" ++ ) ++ ++ local_dp_size = len(process.gpu_indices) // tp_size ++ dp_start_rank = endpoint_nodes.index(process.node) * local_dp_size ++ dp_rpc_port = config.pop("data-parallel-rpc-port", None) or config.pop( ++ "data_parallel_rpc_port", ++ VLLM_DATA_PARALLEL_RPC_PORT, ++ ) ++ config.pop("data-parallel-size-local", None) ++ config.pop("data_parallel_size_local", None) ++ config.pop("data-parallel-start-rank", None) ++ config.pop("data_parallel_start_rank", None) ++ config.pop("data-parallel-hybrid-lb", None) ++ config.pop("data_parallel_hybrid_lb", None) ++ ++ cmd.extend( ++ [ ++ "--data-parallel-size-local", ++ str(local_dp_size), ++ "--data-parallel-start-rank", ++ str(dp_start_rank), ++ "--data-parallel-address", ++ leader_ip, ++ "--data-parallel-rpc-port", ++ str(dp_rpc_port), ++ "--data-parallel-hybrid-lb", ++ ] ++ ) ++ elif is_dp_mode: + # DP+EP mode: each GPU runs its own process + # process.node_rank is the dp_rank (set in endpoints_to_processes) + dp_rank = process.node_rank +diff --git a/src/srtctl/cli/mixins/benchmark_stage.py b/src/srtctl/cli/mixins/benchmark_stage.py +index 9a0f24a..bc7bc23 100644 +--- a/src/srtctl/cli/mixins/benchmark_stage.py ++++ b/src/srtctl/cli/mixins/benchmark_stage.py +@@ -346,8 +346,9 @@ class BenchmarkStageMixin: + engine and therefore must not appear as AIPerf workers. + """ + urls: list[str] = [] ++ include_dp_nodes = getattr(self.config.backend, "dp_launch_mode", None) == "per_node" + for process in self.backend_processes: +- if process.is_leader and process.sys_port > 0: ++ if (process.is_leader or include_dp_nodes) and process.sys_port > 0: + host = get_hostname_ip(process.node, self.runtime.network_interface) + urls.append(f"http://{host}:{process.sys_port}/metrics") + diff --git a/benchmarks/multi_node/srt-slurm-recipes/vllm/kimi-k3/agentic/agg-gb200-dep16-throughput-agentic.yaml b/benchmarks/multi_node/srt-slurm-recipes/vllm/kimi-k3/agentic/agg-gb200-dep16-throughput-agentic.yaml index c21d950963..35bd33f02a 100644 --- a/benchmarks/multi_node/srt-slurm-recipes/vllm/kimi-k3/agentic/agg-gb200-dep16-throughput-agentic.yaml +++ b/benchmarks/multi_node/srt-slurm-recipes/vllm/kimi-k3/agentic/agg-gb200-dep16-throughput-agentic.yaml @@ -56,6 +56,7 @@ frontend: backend: type: vllm connector: null + dp_launch_mode: per_node aggregated_environment: HF_HUB_CACHE: "/hf_hub_cache" HUGGINGFACE_HUB_CACHE: "/hf_hub_cache" diff --git a/runners/launch_gb200-nv.sh b/runners/launch_gb200-nv.sh index a8c50c7d9a..b0f59de5f8 100755 --- a/runners/launch_gb200-nv.sh +++ b/runners/launch_gb200-nv.sh @@ -374,6 +374,8 @@ if [[ "$IS_AGENTIC" == "1" ]]; 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 + git apply \ + "$GITHUB_WORKSPACE/benchmarks/multi_node/srt-slurm-recipes/configs/kimi-k3-vllm-tp-dp-per-node.patch" else mkdir -p recipes/vllm/deepseek-v4/agentic cp -rT "$GITHUB_WORKSPACE/benchmarks/multi_node/srt-slurm-recipes/vllm/deepseek-v4/agentic" \ From bc21aac81aed861d89b4740a594331c149d26846 Mon Sep 17 00:00:00 2001 From: Cam Quilici Date: Mon, 27 Jul 2026 19:58:16 -0500 Subject: [PATCH 10/45] fix(gb200): rebalance Kimi K3 EP16 for HBM MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Use TP4 x DP4 for the throughput-oriented EP16 profile after TP2 x DP8 exceeded GB200 HBM during MXFP4 weight loading. 中文:TP2 × DP8 在 MXFP4 权重加载阶段超过 GB200 HBM 容量,因此将吞吐优先的 EP16 配置调整为 TP4 × DP4。 --- .../agentic/agg-gb200-dep16-throughput-agentic.yaml | 4 ++-- configs/nvidia-master.yaml | 8 ++++---- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/benchmarks/multi_node/srt-slurm-recipes/vllm/kimi-k3/agentic/agg-gb200-dep16-throughput-agentic.yaml b/benchmarks/multi_node/srt-slurm-recipes/vllm/kimi-k3/agentic/agg-gb200-dep16-throughput-agentic.yaml index 35bd33f02a..6c391c3362 100644 --- a/benchmarks/multi_node/srt-slurm-recipes/vllm/kimi-k3/agentic/agg-gb200-dep16-throughput-agentic.yaml +++ b/benchmarks/multi_node/srt-slurm-recipes/vllm/kimi-k3/agentic/agg-gb200-dep16-throughput-agentic.yaml @@ -79,9 +79,9 @@ backend: vllm_config: aggregated: served-model-name: "moonshotai/Kimi-K3" - tensor-parallel-size: 2 + tensor-parallel-size: 4 pipeline-parallel-size: 1 - data-parallel-size: 8 + data-parallel-size: 4 data-parallel-rpc-port: 13345 enable-expert-parallel: true trust-remote-code: true diff --git a/configs/nvidia-master.yaml b/configs/nvidia-master.yaml index 718cef0591..f616b60deb 100644 --- a/configs/nvidia-master.yaml +++ b/configs/nvidia-master.yaml @@ -7991,7 +7991,7 @@ dsv4-fp4-gb300-dynamo-vllm-agentic-mtp-disagg: # profiles mirror the serving strategies synthesized by the official recipe: # latency: multi-node TP16 (4 GB200 nodes / 16 GPUs) # balanced: multi-node TEP16 (4 GB200 nodes / 16 GPUs) -# throughput: multi-node TP2 x DP8 (4 GB200 nodes / EP16) +# throughput: multi-node TP4 x DP4 (4 GB200 nodes / EP16) # https://recipes.vllm.ai/moonshotai/Kimi-K3?hardware=gb200 kimik3-fp4-gb200-dynamo-vllm-agentic: image: vllm/vllm-openai:kimi-k3 @@ -8040,20 +8040,20 @@ kimik3-fp4-gb200-dynamo-vllm-agentic: ep: 16 dp-attn: false # Throughput oriented: official multi_node_dep strategy, DEP16 across - # four GB200 nodes (TP2 x DP8 = EP16, two local DP ranks per node). + # four GB200 nodes (TP4 x DP4 = EP16, one local DP rank per node). # https://recipes.vllm.ai/moonshotai/Kimi-K3?hardware=gb200&nodes=4&strategy=multi_node_dep - spec-decoding: none conc-list: [32, 64, 96, 128, 192, 256] prefill: num-worker: 1 - tp: 2 + tp: 4 ep: 16 dp-attn: true additional-settings: - "CONFIG_FILE=recipes/vllm/kimi-k3/agentic/agg-gb200-dep16-throughput-agentic.yaml" decode: num-worker: 0 - tp: 2 + tp: 4 ep: 16 dp-attn: true From 819af419c455ac66f8931a7170c4098ff60f39d6 Mon Sep 17 00:00:00 2001 From: Cam Quilici Date: Mon, 27 Jul 2026 20:08:08 -0500 Subject: [PATCH 11/45] fix(gb200): use native srt-slurm TPDP support MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Pin a tested srt-slurm revision that natively groups TP GPUs within each DP rank and exports every DP metrics endpoint. Remove the vendored patch and reserve enough HBM for one native 1M-context request. 中文:固定经过测试的 srt-slurm 版本,原生支持每个 DP rank 内的 TP GPU 分组,并导出全部 DP metrics endpoint。删除仓库内补丁,同时为原生 1M 上下文请求预留足够 HBM。 --- .../configs/kimi-k3-vllm-tp-dp-per-node.patch | 101 ------------------ .../agg-gb200-dep16-throughput-agentic.yaml | 3 +- runners/launch_gb200-nv.sh | 10 +- 3 files changed, 6 insertions(+), 108 deletions(-) delete mode 100644 benchmarks/multi_node/srt-slurm-recipes/configs/kimi-k3-vllm-tp-dp-per-node.patch diff --git a/benchmarks/multi_node/srt-slurm-recipes/configs/kimi-k3-vllm-tp-dp-per-node.patch b/benchmarks/multi_node/srt-slurm-recipes/configs/kimi-k3-vllm-tp-dp-per-node.patch deleted file mode 100644 index 086d944559..0000000000 --- a/benchmarks/multi_node/srt-slurm-recipes/configs/kimi-k3-vllm-tp-dp-per-node.patch +++ /dev/null @@ -1,101 +0,0 @@ -diff --git a/src/srtctl/backends/vllm.py b/src/srtctl/backends/vllm.py -index 828c109..5844d2a 100644 ---- a/src/srtctl/backends/vllm.py -+++ b/src/srtctl/backends/vllm.py -@@ -33,6 +33,7 @@ if TYPE_CHECKING: - - # Type alias for worker modes - WorkerMode = Literal["prefill", "decode", "agg"] -+DPLaunchMode = Literal["per_gpu", "per_node"] - - - @dataclass(frozen=True) -@@ -93,6 +94,10 @@ class VLLMProtocol: - # dynamo 1.0.0+: translated to --kv-transfer-config (--connector was removed). - connector: str | None = "nixl" - -+ # DP process layout. Per-node mode lets vLLM create multiple local DP -+ # ranks while retaining tensor parallelism within each rank. -+ dp_launch_mode: DPLaunchMode = "per_gpu" -+ - Schema: ClassVar[builtins.type[Schema]] = Schema - - # ========================================================================= -@@ -211,6 +216,9 @@ class VLLMProtocol: - # Standard TP mode: one process per node - return endpoints_to_processes(endpoints, base_sys_port=base_sys_port, port_allocator=port_allocator) - -+ if self.dp_launch_mode == "per_node": -+ return endpoints_to_processes(endpoints, base_sys_port=base_sys_port, port_allocator=port_allocator) -+ - # DP+EP mode: one process per GPU - processes: list[Process] = [] - current_sys_port = base_sys_port -@@ -352,7 +360,51 @@ class VLLMProtocol: - # Check if this is DP+EP mode (data-parallel-size set) - is_dp_mode = self._is_dp_mode(mode) - -- if is_dp_mode: -+ if is_dp_mode and self.dp_launch_mode == "per_node": -+ dp_size = self._get_dp_size(mode) -+ tp_size = config.get("tensor-parallel-size") or config.get("tensor_parallel_size") or 1 -+ if dp_size is None: -+ raise ValueError(f"{mode} is missing data-parallel-size") -+ -+ total_gpus = sum(len(item.gpu_indices) for item in endpoint_processes) -+ if dp_size * tp_size != total_gpus: -+ raise ValueError( -+ f"{mode} data-parallel-size={dp_size} x tensor-parallel-size={tp_size} " -+ f"does not match the endpoint's {total_gpus} allocated GPUs" -+ ) -+ if len(process.gpu_indices) % tp_size != 0: -+ raise ValueError( -+ f"{mode} has {len(process.gpu_indices)} local GPUs, which is not divisible " -+ f"by tensor-parallel-size={tp_size}" -+ ) -+ -+ local_dp_size = len(process.gpu_indices) // tp_size -+ dp_start_rank = endpoint_nodes.index(process.node) * local_dp_size -+ dp_rpc_port = config.pop("data-parallel-rpc-port", None) or config.pop( -+ "data_parallel_rpc_port", -+ VLLM_DATA_PARALLEL_RPC_PORT, -+ ) -+ config.pop("data-parallel-size-local", None) -+ config.pop("data_parallel_size_local", None) -+ config.pop("data-parallel-start-rank", None) -+ config.pop("data_parallel_start_rank", None) -+ config.pop("data-parallel-hybrid-lb", None) -+ config.pop("data_parallel_hybrid_lb", None) -+ -+ cmd.extend( -+ [ -+ "--data-parallel-size-local", -+ str(local_dp_size), -+ "--data-parallel-start-rank", -+ str(dp_start_rank), -+ "--data-parallel-address", -+ leader_ip, -+ "--data-parallel-rpc-port", -+ str(dp_rpc_port), -+ "--data-parallel-hybrid-lb", -+ ] -+ ) -+ elif is_dp_mode: - # DP+EP mode: each GPU runs its own process - # process.node_rank is the dp_rank (set in endpoints_to_processes) - dp_rank = process.node_rank -diff --git a/src/srtctl/cli/mixins/benchmark_stage.py b/src/srtctl/cli/mixins/benchmark_stage.py -index 9a0f24a..bc7bc23 100644 ---- a/src/srtctl/cli/mixins/benchmark_stage.py -+++ b/src/srtctl/cli/mixins/benchmark_stage.py -@@ -346,8 +346,9 @@ class BenchmarkStageMixin: - engine and therefore must not appear as AIPerf workers. - """ - urls: list[str] = [] -+ include_dp_nodes = getattr(self.config.backend, "dp_launch_mode", None) == "per_node" - for process in self.backend_processes: -- if process.is_leader and process.sys_port > 0: -+ if (process.is_leader or include_dp_nodes) and process.sys_port > 0: - host = get_hostname_ip(process.node, self.runtime.network_interface) - urls.append(f"http://{host}:{process.sys_port}/metrics") - diff --git a/benchmarks/multi_node/srt-slurm-recipes/vllm/kimi-k3/agentic/agg-gb200-dep16-throughput-agentic.yaml b/benchmarks/multi_node/srt-slurm-recipes/vllm/kimi-k3/agentic/agg-gb200-dep16-throughput-agentic.yaml index 6c391c3362..f4f5c99fed 100644 --- a/benchmarks/multi_node/srt-slurm-recipes/vllm/kimi-k3/agentic/agg-gb200-dep16-throughput-agentic.yaml +++ b/benchmarks/multi_node/srt-slurm-recipes/vllm/kimi-k3/agentic/agg-gb200-dep16-throughput-agentic.yaml @@ -56,7 +56,6 @@ frontend: backend: type: vllm connector: null - dp_launch_mode: per_node aggregated_environment: HF_HUB_CACHE: "/hf_hub_cache" HUGGINGFACE_HUB_CACHE: "/hf_hub_cache" @@ -88,7 +87,7 @@ backend: load-format: "fastsafetensors" moe-backend: "deep_gemm_mega_moe" all2all-backend: "flashinfer_nvlink_one_sided" - gpu-memory-utilization: 0.95 + gpu-memory-utilization: 0.98 max-num-seqs: 128 max-num-batched-tokens: 16384 language-model-only: true diff --git a/runners/launch_gb200-nv.sh b/runners/launch_gb200-nv.sh index b0f59de5f8..4309d087b1 100755 --- a/runners/launch_gb200-nv.sh +++ b/runners/launch_gb200-nv.sh @@ -358,8 +358,7 @@ fi # TODO(CJQ): make first class upon srt-slurm upstream refactor if [[ "$IS_AGENTIC" == "1" ]]; then - # Agentic multi-node uses the same pinned cquil11/srt-slurm-nv commit as - # launch_gb300-nv.sh — everything the agentic recipes need is there: + # Agentic multi-node pins cquil11/srt-slurm-nv revisions that provide: # - BenchmarkType.CUSTOM + benchmark.command + benchmark.env # (the hook that hands off to benchmarks/multi_node/agentic_srt.sh) # - DynamoConfig.wheel (recipes pin the ai-dynamo wheel) @@ -369,14 +368,15 @@ if [[ "$IS_AGENTIC" == "1" ]]; then # must reach the agentic_srt.sh srun) git clone https://github.com/cquil11/srt-slurm-nv.git "$SRT_REPO_DIR" cd "$SRT_REPO_DIR" - git checkout de59739b172e507e15ebf145bfe305f606e82fbf if [[ "$MODEL_PREFIX" == "kimik3" ]]; then + # Kimi K3 additionally needs vLLM TP groups within data parallel and + # every DP engine metrics endpoint exposed to AIPerf. + git checkout b1fb626fbdbfe3306dcb51cb181ab35861ec3b1c 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 - git apply \ - "$GITHUB_WORKSPACE/benchmarks/multi_node/srt-slurm-recipes/configs/kimi-k3-vllm-tp-dp-per-node.patch" else + git checkout de59739b172e507e15ebf145bfe305f606e82fbf mkdir -p recipes/vllm/deepseek-v4/agentic cp -rT "$GITHUB_WORKSPACE/benchmarks/multi_node/srt-slurm-recipes/vllm/deepseek-v4/agentic" \ recipes/vllm/deepseek-v4/agentic From 458d6f669c87187750adab6fe0150cb7645c0fd7 Mon Sep 17 00:00:00 2001 From: Cam Quilici Date: Mon, 27 Jul 2026 20:10:58 -0500 Subject: [PATCH 12/45] docs(perf): correct Kimi K3 throughput topology MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Record the tested TP4 x DP4 = EP16 throughput profile. 中文:记录经过测试的 TP4 x DP4 = EP16 吞吐配置。 --- perf-changelog.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/perf-changelog.yaml b/perf-changelog.yaml index f9eaf3d718..1549d55202 100644 --- a/perf-changelog.yaml +++ b/perf-changelog.yaml @@ -5120,5 +5120,5 @@ - config-keys: - kimik3-fp4-gb200-dynamo-vllm-agentic description: - - "Add Day-0 Kimi K3 MXFP4 GB200 AgentX performance points following the official vLLM recipe: TP16 (conc 1-8), TEP16 (conc 8-32), and TP2 x DP8 = EP16 (conc 32-256). https://recipes.vllm.ai/moonshotai/Kimi-K3?hardware=gb200" + - "Add Day-0 Kimi K3 MXFP4 GB200 AgentX performance points following the official vLLM recipe: TP16 (conc 1-8), TEP16 (conc 8-32), and TP4 x DP4 = EP16 (conc 32-256). https://recipes.vllm.ai/moonshotai/Kimi-K3?hardware=gb200" pr-link: https://github.com/SemiAnalysisAI/InferenceX/pull/2354 From 6d10fbc53353946b3c8a5b382a448093049717e8 Mon Sep 17 00:00:00 2001 From: Cam Quilici Date: Mon, 27 Jul 2026 20:30:36 -0500 Subject: [PATCH 13/45] fix(gb200): use official Kimi K3 Dynamo runtime MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Use NVIDIA’s Kimi K3 runtime with native tokenizer, parser, FP8 KV-cache, and FlashInfer support. Keep the model-default 1M context and remove the vLLM-mutating setup script.\n\n中文:改用 NVIDIA 官方 Kimi K3 Dynamo 运行时,启用原生 tokenizer、解析器、FP8 KV 缓存和 FlashInfer 支持。保留模型默认的 1M 上下文,并移除会修改 vLLM 文件的环境配置脚本。 --- .../agg-gb200-dep16-throughput-agentic.yaml | 43 +++++++++++++------ .../agg-gb200-tep16-balanced-agentic.yaml | 42 ++++++++++++------ .../agg-gb200-tp16-latency-agentic.yaml | 41 ++++++++++++------ configs/nvidia-master.yaml | 6 +-- 4 files changed, 89 insertions(+), 43 deletions(-) diff --git a/benchmarks/multi_node/srt-slurm-recipes/vllm/kimi-k3/agentic/agg-gb200-dep16-throughput-agentic.yaml b/benchmarks/multi_node/srt-slurm-recipes/vllm/kimi-k3/agentic/agg-gb200-dep16-throughput-agentic.yaml index f4f5c99fed..7404aee47e 100644 --- a/benchmarks/multi_node/srt-slurm-recipes/vllm/kimi-k3/agentic/agg-gb200-dep16-throughput-agentic.yaml +++ b/benchmarks/multi_node/srt-slurm-recipes/vllm/kimi-k3/agentic/agg-gb200-dep16-throughput-agentic.yaml @@ -1,33 +1,28 @@ name: "kimi-k3-vllm-agg-gb200-dep16-throughput-agentic" # Day-0 GB200 translation of the official throughput-oriented multi_node_dep -# profile. TP2 x DP8 gives EP16 across four four-GPU GB200 nodes. TP2 shards -# the dense weights so each DP rank has room for K3's default BF16 KV cache. +# profile. TP4 x DP4 gives EP16 across four four-GPU GB200 nodes. # https://recipes.vllm.ai/moonshotai/Kimi-K3?hardware=gb200&nodes=4&strategy=multi_node_dep model: path: "kimi-k3" - container: "vllm/vllm-openai:kimi-k3" + container: "nvcr.io/nvidia/ai-dynamo/vllm-runtime:1.4.0-kimi-k3-dev.1" precision: "fp4" identity: model: repo: "moonshotai/Kimi-K3" container: - image: "vllm/vllm-openai:kimi-k3" + image: "nvcr.io/nvidia/ai-dynamo/vllm-runtime:1.4.0-kimi-k3-dev.1" frameworks: - dynamo: "1.3.0.dev20260618" + dynamo: "1.4.0-kimi-k3-dev.1" dynamo: - install: true - wheel: "1.3.0.dev20260618" + install: false environment: - DYNAMO_WHEEL_DIRS: "/srtctl-wheels" ETCD_LEASE_TTL: "7200" -setup_script: vllm-container-deps.sh - slurm: time_limit: "8:00:00" @@ -50,8 +45,12 @@ frontend: type: dynamo enable_multiple_frontends: false args: + dyn-chat-processor: "dynamo" router-mode: "kv" - router-reset-states: true + router-kv-events: true + router-temperature: "0" + router-min-initial-workers: 1 + kv-cache-block-size: 64 backend: type: vllm @@ -63,9 +62,10 @@ backend: VLLM_ENGINE_READY_TIMEOUT_S: "7200" VLLM_RPC_TIMEOUT: "600000" VLLM_LOG_STATS_INTERVAL: "1" - VLLM_USE_V2_MODEL_RUNNER: "1" - VLLM_USE_RUST_FRONTEND: "1" + VLLM_USE_V2_MODEL_RUNNER: "0" VLLM_ENABLE_K3_LATENT_MOE_TAIL_FUSION: "1" + VLLM_ALLREDUCE_USE_FLASHINFER: "1" + VLLM_FLASHINFER_ALLREDUCE_BACKEND: "mnnvl" NCCL_CUMEM_ENABLE: "1" NCCL_MNNVL_ENABLE: "1" NCCL_NVLS_ENABLE: "1" @@ -74,6 +74,8 @@ backend: UCX_TLS: "rc,cuda_copy" NCCL_IB_HCA: "mlx5_0,mlx5_1,mlx5_2,mlx5_3" NCCL_P2P_LEVEL: "NVL" + NVIDIA_GDRCOPY: "1" + PYTORCH_ALLOC_CONF: "expandable_segments:True" DG_JIT_CACHE_DIR: "/tmp/dg-cache-kimi-k3-gb200-dep16-{job_id}" vllm_config: aggregated: @@ -85,12 +87,25 @@ backend: enable-expert-parallel: true trust-remote-code: true load-format: "fastsafetensors" + safetensors-load-strategy: "lazy" + kv-cache-dtype: "fp8" + attention-backend: "FLASHINFER_MLA" + attention-config: '{"mla_prefill_backend":"TRTLLM_RAGGED","use_prefill_query_quantization":true}' moe-backend: "deep_gemm_mega_moe" + kda-prefill-backend: "flashkda" + kernel-config: '{"enable_cutedsl_warmup":true}' all2all-backend: "flashinfer_nvlink_one_sided" - gpu-memory-utilization: 0.98 + gpu-memory-utilization: 0.95 max-num-seqs: 128 max-num-batched-tokens: 16384 + block-size: 64 language-model-only: true + disable-custom-all-reduce: true + enable-prefix-caching: true + scheduler-cls: "vllm.v1.core.sched.async_scheduler.AsyncScheduler" + dyn-tool-call-parser: "kimi_k3" + reasoning-parser: "kimi_k3" + dyn-reasoning-parser: "kimi_k3" no-enable-flashinfer-autotune: true sbatch_directives: diff --git a/benchmarks/multi_node/srt-slurm-recipes/vllm/kimi-k3/agentic/agg-gb200-tep16-balanced-agentic.yaml b/benchmarks/multi_node/srt-slurm-recipes/vllm/kimi-k3/agentic/agg-gb200-tep16-balanced-agentic.yaml index c09a8e82cc..3cced99c6b 100644 --- a/benchmarks/multi_node/srt-slurm-recipes/vllm/kimi-k3/agentic/agg-gb200-tep16-balanced-agentic.yaml +++ b/benchmarks/multi_node/srt-slurm-recipes/vllm/kimi-k3/agentic/agg-gb200-tep16-balanced-agentic.yaml @@ -1,33 +1,29 @@ name: "kimi-k3-vllm-agg-gb200-tep16-balanced-agentic" # Day-0 GB200 translation of the official balanced multi_node_tep profile. -# Dense layers and MoE experts are sharded across 16 GPUs on four GB200 nodes, -# leaving enough HBM for the default BF16 KV cache. +# Dense layers and MoE experts are sharded across 16 GPUs on four GB200 nodes +# with the official FP8 KV cache. # https://recipes.vllm.ai/moonshotai/Kimi-K3?hardware=gb200&nodes=4&strategy=multi_node_tep model: path: "kimi-k3" - container: "vllm/vllm-openai:kimi-k3" + container: "nvcr.io/nvidia/ai-dynamo/vllm-runtime:1.4.0-kimi-k3-dev.1" precision: "fp4" identity: model: repo: "moonshotai/Kimi-K3" container: - image: "vllm/vllm-openai:kimi-k3" + image: "nvcr.io/nvidia/ai-dynamo/vllm-runtime:1.4.0-kimi-k3-dev.1" frameworks: - dynamo: "1.3.0.dev20260618" + dynamo: "1.4.0-kimi-k3-dev.1" dynamo: - install: true - wheel: "1.3.0.dev20260618" + install: false environment: - DYNAMO_WHEEL_DIRS: "/srtctl-wheels" ETCD_LEASE_TTL: "7200" -setup_script: vllm-container-deps.sh - slurm: time_limit: "8:00:00" @@ -50,8 +46,12 @@ frontend: type: dynamo enable_multiple_frontends: false args: + dyn-chat-processor: "dynamo" router-mode: "kv" - router-reset-states: true + router-kv-events: true + router-temperature: "0" + router-min-initial-workers: 1 + kv-cache-block-size: 64 backend: type: vllm @@ -63,9 +63,10 @@ backend: VLLM_ENGINE_READY_TIMEOUT_S: "7200" VLLM_RPC_TIMEOUT: "600000" VLLM_LOG_STATS_INTERVAL: "1" - VLLM_USE_V2_MODEL_RUNNER: "1" - VLLM_USE_RUST_FRONTEND: "1" + VLLM_USE_V2_MODEL_RUNNER: "0" VLLM_ENABLE_K3_LATENT_MOE_TAIL_FUSION: "1" + VLLM_ALLREDUCE_USE_FLASHINFER: "1" + VLLM_FLASHINFER_ALLREDUCE_BACKEND: "mnnvl" NCCL_CUMEM_ENABLE: "1" NCCL_MNNVL_ENABLE: "1" NCCL_NVLS_ENABLE: "1" @@ -74,6 +75,8 @@ backend: UCX_TLS: "rc,cuda_copy" NCCL_IB_HCA: "mlx5_0,mlx5_1,mlx5_2,mlx5_3" NCCL_P2P_LEVEL: "NVL" + NVIDIA_GDRCOPY: "1" + PYTORCH_ALLOC_CONF: "expandable_segments:True" DG_JIT_CACHE_DIR: "/tmp/dg-cache-kimi-k3-gb200-tep16-{job_id}" vllm_config: aggregated: @@ -83,12 +86,25 @@ backend: enable-expert-parallel: true trust-remote-code: true load-format: "fastsafetensors" + safetensors-load-strategy: "lazy" + kv-cache-dtype: "fp8" + attention-backend: "FLASHINFER_MLA" + attention-config: '{"mla_prefill_backend":"TRTLLM_RAGGED","use_prefill_query_quantization":true}' moe-backend: "flashinfer_trtllm" + kda-prefill-backend: "flashkda" + kernel-config: '{"enable_cutedsl_warmup":true}' all2all-backend: "flashinfer_nvlink_one_sided" gpu-memory-utilization: 0.95 max-num-seqs: 32 max-num-batched-tokens: 8192 + block-size: 64 language-model-only: true + disable-custom-all-reduce: true + enable-prefix-caching: true + scheduler-cls: "vllm.v1.core.sched.async_scheduler.AsyncScheduler" + dyn-tool-call-parser: "kimi_k3" + reasoning-parser: "kimi_k3" + dyn-reasoning-parser: "kimi_k3" no-enable-flashinfer-autotune: true compilation-config: '{"pass_config":{"fuse_allreduce_rms":false}}' diff --git a/benchmarks/multi_node/srt-slurm-recipes/vllm/kimi-k3/agentic/agg-gb200-tp16-latency-agentic.yaml b/benchmarks/multi_node/srt-slurm-recipes/vllm/kimi-k3/agentic/agg-gb200-tp16-latency-agentic.yaml index 926f9a95ef..b381ecd1a7 100644 --- a/benchmarks/multi_node/srt-slurm-recipes/vllm/kimi-k3/agentic/agg-gb200-tp16-latency-agentic.yaml +++ b/benchmarks/multi_node/srt-slurm-recipes/vllm/kimi-k3/agentic/agg-gb200-tp16-latency-agentic.yaml @@ -1,33 +1,28 @@ name: "kimi-k3-vllm-agg-gb200-tp16-latency-agentic" # Day-0 GB200 translation of the official latency-oriented multi_node_tp -# profile. TP16 across four GB200 nodes leaves enough HBM for the default -# BF16 KV cache with the 2.8T MXFP4 checkpoint. +# profile. TP16 spans four GB200 nodes and uses the official FP8 KV cache. # https://recipes.vllm.ai/moonshotai/Kimi-K3?hardware=gb200&nodes=4&strategy=multi_node_tp model: path: "kimi-k3" - container: "vllm/vllm-openai:kimi-k3" + container: "nvcr.io/nvidia/ai-dynamo/vllm-runtime:1.4.0-kimi-k3-dev.1" precision: "fp4" identity: model: repo: "moonshotai/Kimi-K3" container: - image: "vllm/vllm-openai:kimi-k3" + image: "nvcr.io/nvidia/ai-dynamo/vllm-runtime:1.4.0-kimi-k3-dev.1" frameworks: - dynamo: "1.3.0.dev20260618" + dynamo: "1.4.0-kimi-k3-dev.1" dynamo: - install: true - wheel: "1.3.0.dev20260618" + install: false environment: - DYNAMO_WHEEL_DIRS: "/srtctl-wheels" ETCD_LEASE_TTL: "7200" -setup_script: vllm-container-deps.sh - slurm: time_limit: "8:00:00" @@ -50,8 +45,12 @@ frontend: type: dynamo enable_multiple_frontends: false args: + dyn-chat-processor: "dynamo" router-mode: "kv" - router-reset-states: true + router-kv-events: true + router-temperature: "0" + router-min-initial-workers: 1 + kv-cache-block-size: 64 backend: type: vllm @@ -63,9 +62,10 @@ backend: VLLM_ENGINE_READY_TIMEOUT_S: "7200" VLLM_RPC_TIMEOUT: "600000" VLLM_LOG_STATS_INTERVAL: "1" - VLLM_USE_V2_MODEL_RUNNER: "1" - VLLM_USE_RUST_FRONTEND: "1" + VLLM_USE_V2_MODEL_RUNNER: "0" VLLM_ENABLE_K3_LATENT_MOE_TAIL_FUSION: "1" + VLLM_ALLREDUCE_USE_FLASHINFER: "1" + VLLM_FLASHINFER_ALLREDUCE_BACKEND: "mnnvl" NCCL_CUMEM_ENABLE: "1" NCCL_MNNVL_ENABLE: "1" NCCL_NVLS_ENABLE: "1" @@ -74,6 +74,8 @@ backend: UCX_TLS: "rc,cuda_copy" NCCL_IB_HCA: "mlx5_0,mlx5_1,mlx5_2,mlx5_3" NCCL_P2P_LEVEL: "NVL" + NVIDIA_GDRCOPY: "1" + PYTORCH_ALLOC_CONF: "expandable_segments:True" DG_JIT_CACHE_DIR: "/tmp/dg-cache-kimi-k3-gb200-tp16-{job_id}" vllm_config: aggregated: @@ -82,11 +84,24 @@ backend: pipeline-parallel-size: 1 trust-remote-code: true load-format: "fastsafetensors" + safetensors-load-strategy: "lazy" + kv-cache-dtype: "fp8" + attention-backend: "FLASHINFER_MLA" + attention-config: '{"mla_prefill_backend":"TRTLLM_RAGGED","use_prefill_query_quantization":true}' moe-backend: "flashinfer_trtllm" + kda-prefill-backend: "flashkda" + kernel-config: '{"enable_cutedsl_warmup":true}' gpu-memory-utilization: 0.95 max-num-seqs: 8 max-num-batched-tokens: 8192 + block-size: 64 language-model-only: true + disable-custom-all-reduce: true + enable-prefix-caching: true + scheduler-cls: "vllm.v1.core.sched.async_scheduler.AsyncScheduler" + dyn-tool-call-parser: "kimi_k3" + reasoning-parser: "kimi_k3" + dyn-reasoning-parser: "kimi_k3" no-enable-flashinfer-autotune: true compilation-config: '{"pass_config":{"fuse_allreduce_rms":false}}' diff --git a/configs/nvidia-master.yaml b/configs/nvidia-master.yaml index f616b60deb..240ade1b55 100644 --- a/configs/nvidia-master.yaml +++ b/configs/nvidia-master.yaml @@ -7994,20 +7994,20 @@ dsv4-fp4-gb300-dynamo-vllm-agentic-mtp-disagg: # throughput: multi-node TP4 x DP4 (4 GB200 nodes / EP16) # https://recipes.vllm.ai/moonshotai/Kimi-K3?hardware=gb200 kimik3-fp4-gb200-dynamo-vllm-agentic: - image: vllm/vllm-openai:kimi-k3 + image: nvcr.io/nvidia/ai-dynamo/vllm-runtime:1.4.0-kimi-k3-dev.1 model: moonshotai/Kimi-K3 model-prefix: kimik3 runner: cluster:gb200-nv precision: fp4 framework: dynamo-vllm - router: { name: dynamo-router, version: "1.3.0.dev20260618" } + router: { name: dynamo-router, version: "1.4.0-kimi-k3-dev.1" } multinode: true disagg: false scenarios: agentic-coding: - search-space: # Latency oriented: multi_node_tp strategy, TP16 across four GB200 - # nodes. TP8 does not leave enough HBM for K3's default BF16 KV cache. + # nodes. # https://recipes.vllm.ai/moonshotai/Kimi-K3?hardware=gb200&nodes=4&strategy=multi_node_tp - spec-decoding: none conc-list: [1, 2, 4, 8] From 41580415773dd1ea79fc106d13c03d57684a5cc4 Mon Sep 17 00:00:00 2001 From: Cam Quilici Date: Mon, 27 Jul 2026 20:53:02 -0500 Subject: [PATCH 14/45] fix(gb200): align Kimi K3 runtime metadata MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Match identity verification and result metadata to the Dynamo 1.3.0 package reported by the official Kimi K3 runtime image.\n\n中文:将身份校验与结果元数据对齐到官方 Kimi K3 运行时镜像实际报告的 Dynamo 1.3.0 包版本。 --- .../kimi-k3/agentic/agg-gb200-dep16-throughput-agentic.yaml | 2 +- .../vllm/kimi-k3/agentic/agg-gb200-tep16-balanced-agentic.yaml | 2 +- .../vllm/kimi-k3/agentic/agg-gb200-tp16-latency-agentic.yaml | 2 +- configs/nvidia-master.yaml | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/benchmarks/multi_node/srt-slurm-recipes/vllm/kimi-k3/agentic/agg-gb200-dep16-throughput-agentic.yaml b/benchmarks/multi_node/srt-slurm-recipes/vllm/kimi-k3/agentic/agg-gb200-dep16-throughput-agentic.yaml index 7404aee47e..36984f889e 100644 --- a/benchmarks/multi_node/srt-slurm-recipes/vllm/kimi-k3/agentic/agg-gb200-dep16-throughput-agentic.yaml +++ b/benchmarks/multi_node/srt-slurm-recipes/vllm/kimi-k3/agentic/agg-gb200-dep16-throughput-agentic.yaml @@ -15,7 +15,7 @@ identity: container: image: "nvcr.io/nvidia/ai-dynamo/vllm-runtime:1.4.0-kimi-k3-dev.1" frameworks: - dynamo: "1.4.0-kimi-k3-dev.1" + dynamo: "1.3.0" dynamo: install: false diff --git a/benchmarks/multi_node/srt-slurm-recipes/vllm/kimi-k3/agentic/agg-gb200-tep16-balanced-agentic.yaml b/benchmarks/multi_node/srt-slurm-recipes/vllm/kimi-k3/agentic/agg-gb200-tep16-balanced-agentic.yaml index 3cced99c6b..fa99537d07 100644 --- a/benchmarks/multi_node/srt-slurm-recipes/vllm/kimi-k3/agentic/agg-gb200-tep16-balanced-agentic.yaml +++ b/benchmarks/multi_node/srt-slurm-recipes/vllm/kimi-k3/agentic/agg-gb200-tep16-balanced-agentic.yaml @@ -16,7 +16,7 @@ identity: container: image: "nvcr.io/nvidia/ai-dynamo/vllm-runtime:1.4.0-kimi-k3-dev.1" frameworks: - dynamo: "1.4.0-kimi-k3-dev.1" + dynamo: "1.3.0" dynamo: install: false diff --git a/benchmarks/multi_node/srt-slurm-recipes/vllm/kimi-k3/agentic/agg-gb200-tp16-latency-agentic.yaml b/benchmarks/multi_node/srt-slurm-recipes/vllm/kimi-k3/agentic/agg-gb200-tp16-latency-agentic.yaml index b381ecd1a7..61cae58cd6 100644 --- a/benchmarks/multi_node/srt-slurm-recipes/vllm/kimi-k3/agentic/agg-gb200-tp16-latency-agentic.yaml +++ b/benchmarks/multi_node/srt-slurm-recipes/vllm/kimi-k3/agentic/agg-gb200-tp16-latency-agentic.yaml @@ -15,7 +15,7 @@ identity: container: image: "nvcr.io/nvidia/ai-dynamo/vllm-runtime:1.4.0-kimi-k3-dev.1" frameworks: - dynamo: "1.4.0-kimi-k3-dev.1" + dynamo: "1.3.0" dynamo: install: false diff --git a/configs/nvidia-master.yaml b/configs/nvidia-master.yaml index 240ade1b55..2625eb0eef 100644 --- a/configs/nvidia-master.yaml +++ b/configs/nvidia-master.yaml @@ -8000,7 +8000,7 @@ kimik3-fp4-gb200-dynamo-vllm-agentic: runner: cluster:gb200-nv precision: fp4 framework: dynamo-vllm - router: { name: dynamo-router, version: "1.4.0-kimi-k3-dev.1" } + router: { name: dynamo-router, version: "1.3.0" } multinode: true disagg: false scenarios: From a32ee0b18e6cb136af60ba93b36b59aee043fbc2 Mon Sep 17 00:00:00 2001 From: Cam Quilici Date: Mon, 27 Jul 2026 20:58:55 -0500 Subject: [PATCH 15/45] fix(gb200): reserve Kimi K3 prefill workspace MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Use the official Kimi K3 Dynamo 0.92 GPU memory utilization so native 1M-context MLA prefills retain transient workspace without changing max model length.\n\n中文:采用官方 Kimi K3 Dynamo 配方的 0.92 GPU 显存利用率,为原生 1M 上下文 MLA 预填充保留临时工作区,且不修改最大模型长度。 --- .../kimi-k3/agentic/agg-gb200-dep16-throughput-agentic.yaml | 2 +- .../vllm/kimi-k3/agentic/agg-gb200-tep16-balanced-agentic.yaml | 2 +- .../vllm/kimi-k3/agentic/agg-gb200-tp16-latency-agentic.yaml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/benchmarks/multi_node/srt-slurm-recipes/vllm/kimi-k3/agentic/agg-gb200-dep16-throughput-agentic.yaml b/benchmarks/multi_node/srt-slurm-recipes/vllm/kimi-k3/agentic/agg-gb200-dep16-throughput-agentic.yaml index 36984f889e..d281f9cd5e 100644 --- a/benchmarks/multi_node/srt-slurm-recipes/vllm/kimi-k3/agentic/agg-gb200-dep16-throughput-agentic.yaml +++ b/benchmarks/multi_node/srt-slurm-recipes/vllm/kimi-k3/agentic/agg-gb200-dep16-throughput-agentic.yaml @@ -95,7 +95,7 @@ backend: kda-prefill-backend: "flashkda" kernel-config: '{"enable_cutedsl_warmup":true}' all2all-backend: "flashinfer_nvlink_one_sided" - gpu-memory-utilization: 0.95 + gpu-memory-utilization: 0.92 max-num-seqs: 128 max-num-batched-tokens: 16384 block-size: 64 diff --git a/benchmarks/multi_node/srt-slurm-recipes/vllm/kimi-k3/agentic/agg-gb200-tep16-balanced-agentic.yaml b/benchmarks/multi_node/srt-slurm-recipes/vllm/kimi-k3/agentic/agg-gb200-tep16-balanced-agentic.yaml index fa99537d07..6db5821a1a 100644 --- a/benchmarks/multi_node/srt-slurm-recipes/vllm/kimi-k3/agentic/agg-gb200-tep16-balanced-agentic.yaml +++ b/benchmarks/multi_node/srt-slurm-recipes/vllm/kimi-k3/agentic/agg-gb200-tep16-balanced-agentic.yaml @@ -94,7 +94,7 @@ backend: kda-prefill-backend: "flashkda" kernel-config: '{"enable_cutedsl_warmup":true}' all2all-backend: "flashinfer_nvlink_one_sided" - gpu-memory-utilization: 0.95 + gpu-memory-utilization: 0.92 max-num-seqs: 32 max-num-batched-tokens: 8192 block-size: 64 diff --git a/benchmarks/multi_node/srt-slurm-recipes/vllm/kimi-k3/agentic/agg-gb200-tp16-latency-agentic.yaml b/benchmarks/multi_node/srt-slurm-recipes/vllm/kimi-k3/agentic/agg-gb200-tp16-latency-agentic.yaml index 61cae58cd6..8c5389505b 100644 --- a/benchmarks/multi_node/srt-slurm-recipes/vllm/kimi-k3/agentic/agg-gb200-tp16-latency-agentic.yaml +++ b/benchmarks/multi_node/srt-slurm-recipes/vllm/kimi-k3/agentic/agg-gb200-tp16-latency-agentic.yaml @@ -91,7 +91,7 @@ backend: moe-backend: "flashinfer_trtllm" kda-prefill-backend: "flashkda" kernel-config: '{"enable_cutedsl_warmup":true}' - gpu-memory-utilization: 0.95 + gpu-memory-utilization: 0.92 max-num-seqs: 8 max-num-batched-tokens: 8192 block-size: 64 From 86f4e7009c4a5b406c45b2f47a3e2bc2d783c3b8 Mon Sep 17 00:00:00 2001 From: Cam Quilici Date: Mon, 27 Jul 2026 21:14:24 -0500 Subject: [PATCH 16/45] fix(config): report Kimi K3 TP16 as EP16 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Apply vLLM EP_SIZE = TP_SIZE × DP_SIZE in the master metadata for the DP1 latency profile.\n\n中文:在 DP1 延迟配置的主配置元数据中应用 vLLM 的 EP_SIZE = TP_SIZE × DP_SIZE 规则。 --- configs/nvidia-master.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/configs/nvidia-master.yaml b/configs/nvidia-master.yaml index 2625eb0eef..01f09a5387 100644 --- a/configs/nvidia-master.yaml +++ b/configs/nvidia-master.yaml @@ -8014,14 +8014,14 @@ kimik3-fp4-gb200-dynamo-vllm-agentic: prefill: num-worker: 1 tp: 16 - ep: 1 + ep: 16 dp-attn: false additional-settings: - "CONFIG_FILE=recipes/vllm/kimi-k3/agentic/agg-gb200-tp16-latency-agentic.yaml" decode: num-worker: 0 tp: 16 - ep: 1 + ep: 16 dp-attn: false # Balanced: multi_node_tep strategy, TEP16 across four GB200 nodes. # https://recipes.vllm.ai/moonshotai/Kimi-K3?hardware=gb200&nodes=4&strategy=multi_node_tep From 1f052d2387fb12e439973449a992f4c6b705be21 Mon Sep 17 00:00:00 2001 From: Cam Quilici Date: Mon, 27 Jul 2026 21:34:42 -0500 Subject: [PATCH 17/45] fix(gb200): stage srt AgentX aggregates MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Copy per-concurrency AgentX aggregate JSON files from the compute-visible shared workspace back into the GitHub workspace, and cover success and missing-result behavior with regression tests. 中文:将各并发度的 AgentX 聚合 JSON 从计算节点可见的共享工作区复制回 GitHub 工作区,并通过回归测试覆盖成功复制和结果缺失场景。 --- runners/launch_gb200-nv.sh | 79 +++++++++++++++++++++---------------- runners/slurm_utils.sh | 30 ++++++++++++++ runners/test_slurm_utils.py | 57 ++++++++++++++++++++++++++ 3 files changed, 132 insertions(+), 34 deletions(-) create mode 100644 runners/test_slurm_utils.py diff --git a/runners/launch_gb200-nv.sh b/runners/launch_gb200-nv.sh index 4309d087b1..2f913e692c 100755 --- a/runners/launch_gb200-nv.sh +++ b/runners/launch_gb200-nv.sh @@ -644,43 +644,54 @@ if [[ "${EVAL_ONLY:-false}" != "true" ]]; then exit 1 fi - # Find all result subdirectories - RESULT_SUBDIRS=$(find "$LOGS_DIR" -maxdepth 1 -type d -name "*isl*osl*" 2>/dev/null) - - if [ -z "$RESULT_SUBDIRS" ]; then - echo "Warning: No result subdirectories found in $LOGS_DIR" + if [[ "$IS_AGENTIC" == "1" ]]; then + # The custom benchmark runs inside the compute-visible + # INFMAX_WORKSPACE mount. Its aggregation step writes one + # ${RESULT_FILENAME}_conc.json there per point; stage those files + # back to GITHUB_WORKSPACE for the workflow guard and artifact upload. + copy_agentic_results \ + "$INFMAX_WORKSPACE" \ + "$GITHUB_WORKSPACE" \ + "$RESULT_FILENAME" || exit 1 else - # Process results from all configurations - for result_subdir in $RESULT_SUBDIRS; do - echo "Processing result subdirectory: $result_subdir" - - # Extract configuration info from directory name - CONFIG_NAME=$(basename "$result_subdir") - - # Find all result JSON files - RESULT_FILES=$(find "$result_subdir" -name "results_concurrency_*.json" 2>/dev/null) - - for result_file in $RESULT_FILES; do - if [ -f "$result_file" ]; then - # Extract metadata from filename - # Files may be "results_concurrency_N_gpus_G_ctx_C_gen_D.json" (disagg) or "results_concurrency_N_gpus_G.json" (non-disagg) - filename=$(basename "$result_file") - concurrency=$(echo "$filename" | sed -n 's/results_concurrency_\([0-9]*\)_gpus_.*/\1/p') - gpus=$(echo "$filename" | sed -n 's/results_concurrency_[0-9]*_gpus_\([0-9][0-9]*\).*/\1/p') - ctx=$(echo "$filename" | sed -n 's/.*_ctx_\([0-9]*\)_gen_.*/\1/p') - gen=$(echo "$filename" | sed -n 's/.*_gen_\([0-9]*\)\.json/\1/p') - - echo "Processing concurrency $concurrency with $gpus GPUs (ctx: $ctx, gen: $gen): $result_file" - - if [ -n "$ctx" ] && [ -n "$gen" ]; then - WORKSPACE_RESULT_FILE="$GITHUB_WORKSPACE/${RESULT_FILENAME}_${CONFIG_NAME}_conc${concurrency}_gpus_${gpus}_ctx_${ctx}_gen_${gen}.json" - else - WORKSPACE_RESULT_FILE="$GITHUB_WORKSPACE/${RESULT_FILENAME}_${CONFIG_NAME}_conc${concurrency}_gpus_${gpus}.json" + # Find all fixed-sequence result subdirectories. + RESULT_SUBDIRS=$(find "$LOGS_DIR" -maxdepth 1 -type d -name "*isl*osl*" 2>/dev/null) + + if [ -z "$RESULT_SUBDIRS" ]; then + echo "Warning: No result subdirectories found in $LOGS_DIR" + else + # Process results from all configurations + for result_subdir in $RESULT_SUBDIRS; do + echo "Processing result subdirectory: $result_subdir" + + # Extract configuration info from directory name + CONFIG_NAME=$(basename "$result_subdir") + + # Find all result JSON files + RESULT_FILES=$(find "$result_subdir" -name "results_concurrency_*.json" 2>/dev/null) + + for result_file in $RESULT_FILES; do + if [ -f "$result_file" ]; then + # Extract metadata from filename + # Files may be "results_concurrency_N_gpus_G_ctx_C_gen_D.json" (disagg) or "results_concurrency_N_gpus_G.json" (non-disagg) + filename=$(basename "$result_file") + concurrency=$(echo "$filename" | sed -n 's/results_concurrency_\([0-9]*\)_gpus_.*/\1/p') + gpus=$(echo "$filename" | sed -n 's/results_concurrency_[0-9]*_gpus_\([0-9][0-9]*\).*/\1/p') + ctx=$(echo "$filename" | sed -n 's/.*_ctx_\([0-9]*\)_gen_.*/\1/p') + gen=$(echo "$filename" | sed -n 's/.*_gen_\([0-9]*\)\.json/\1/p') + + echo "Processing concurrency $concurrency with $gpus GPUs (ctx: $ctx, gen: $gen): $result_file" + + if [ -n "$ctx" ] && [ -n "$gen" ]; then + WORKSPACE_RESULT_FILE="$GITHUB_WORKSPACE/${RESULT_FILENAME}_${CONFIG_NAME}_conc${concurrency}_gpus_${gpus}_ctx_${ctx}_gen_${gen}.json" + else + WORKSPACE_RESULT_FILE="$GITHUB_WORKSPACE/${RESULT_FILENAME}_${CONFIG_NAME}_conc${concurrency}_gpus_${gpus}.json" + fi + copy_to_workspace "$result_file" "$WORKSPACE_RESULT_FILE" || exit 1 fi - copy_to_workspace "$result_file" "$WORKSPACE_RESULT_FILE" || exit 1 - fi + done done - done + fi fi echo "All result files processed" diff --git a/runners/slurm_utils.sh b/runners/slurm_utils.sh index c26b4f1690..55c8652b84 100644 --- a/runners/slurm_utils.sh +++ b/runners/slurm_utils.sh @@ -41,6 +41,36 @@ copy_to_workspace() { echo "Copied $(basename "$source_file") to $destination_file" } +copy_agentic_results() { + local source_dir="$1" + local workspace="$2" + local result_filename="$3" + local result_file + local copied=0 + + if [[ ! -d "$source_dir" ]]; then + echo "ERROR: agentic result directory not found at $source_dir" >&2 + return 1 + fi + + while IFS= read -r -d '' result_file; do + copy_to_workspace \ + "$result_file" \ + "$workspace/$(basename "$result_file")" || return 1 + copied=$((copied + 1)) + done < <( + find "$source_dir" -maxdepth 1 -type f \ + -name "${result_filename}_conc*.json" -print0 + ) + + if [[ "$copied" -eq 0 ]]; then + echo "ERROR: no ${result_filename}_conc*.json results found in $source_dir" >&2 + return 1 + fi + + echo "Copied $copied agentic result file(s)" +} + copy_eval_artifacts() { local eval_dir="$1" local workspace="$2" diff --git a/runners/test_slurm_utils.py b/runners/test_slurm_utils.py new file mode 100644 index 0000000000..c027cc9b2f --- /dev/null +++ b/runners/test_slurm_utils.py @@ -0,0 +1,57 @@ +import subprocess +from pathlib import Path + + +REPO_ROOT = Path(__file__).resolve().parents[1] +SLURM_UTILS = REPO_ROOT / "runners" / "slurm_utils.sh" + + +def run_bash(command: str, *args: Path | str) -> subprocess.CompletedProcess[str]: + return subprocess.run( + ["bash", "-c", command, "bash", *(str(arg) for arg in args)], + check=False, + capture_output=True, + text=True, + ) + + +def test_copy_agentic_results_stages_only_matching_points(tmp_path: Path) -> None: + source = tmp_path / "source" + workspace = tmp_path / "workspace" + source.mkdir() + workspace.mkdir() + (source / "run_conc1.json").write_text('{"conc": 1}\n') + (source / "run_conc16.json").write_text('{"conc": 16}\n') + (source / "other_conc1.json").write_text('{"conc": 1}\n') + + result = run_bash( + 'source "$1"; copy_agentic_results "$2" "$3" run', + SLURM_UTILS, + source, + workspace, + ) + + assert result.returncode == 0, result.stderr + assert sorted(path.name for path in workspace.iterdir()) == [ + "run_conc1.json", + "run_conc16.json", + ] + + +def test_copy_agentic_results_fails_when_aggregate_is_missing( + tmp_path: Path, +) -> None: + source = tmp_path / "source" + workspace = tmp_path / "workspace" + source.mkdir() + workspace.mkdir() + + result = run_bash( + 'source "$1"; copy_agentic_results "$2" "$3" run', + SLURM_UTILS, + source, + workspace, + ) + + assert result.returncode != 0 + assert "no run_conc*.json results found" in result.stderr From 64de5595dfa9d3ed204f428916fb718b31f01414 Mon Sep 17 00:00:00 2001 From: Cam Quilici Date: Mon, 27 Jul 2026 22:31:09 -0500 Subject: [PATCH 18/45] fix(agentx): burst Kimi K3 saturation starts MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Enable AIPerf burst phase starts only for the Kimi K3 GB200 saturation recipes so warmup and profiling reach the requested concurrency within the benchmark window. Inter-turn replay timing remains unchanged. 中文:仅在 Kimi K3 GB200 饱和度测试配置中启用 AIPerf 阶段起始突发,使预热和正式测试能在基准测试窗口内达到目标并发度,同时保持轮次间回放时序不变。 --- benchmarks/benchmark_lib.sh | 7 +++++++ .../agentic/agg-gb200-dep16-throughput-agentic.yaml | 1 + .../kimi-k3/agentic/agg-gb200-tep16-balanced-agentic.yaml | 1 + .../kimi-k3/agentic/agg-gb200-tp16-latency-agentic.yaml | 1 + 4 files changed, 10 insertions(+) diff --git a/benchmarks/benchmark_lib.sh b/benchmarks/benchmark_lib.sh index aa9cc6304f..33349852ad 100644 --- a/benchmarks/benchmark_lib.sh +++ b/benchmarks/benchmark_lib.sh @@ -1775,6 +1775,13 @@ build_replay_cmd() { # least one profile turn after warmup. REPLAY_CMD+=" --trajectory-start-min-ratio 0.25" REPLAY_CMD+=" --trajectory-start-max-ratio 0.75" + # Saturation sweeps need the requested lanes to become active inside the + # benchmark window. Agentic replay otherwise preserves the traces' original + # phase-start offsets; long-lived traces can spread the initial warmup over + # many hours before cache-pressure warmup or profiling begins. + if [ "${AIPERF_BURST_PHASE_STARTS:-0}" = "1" ]; then + REPLAY_CMD+=" --burst-phase-starts" + fi # After the normal t* snapshot warmup, continue those exact trajectories # with one-token outputs and no idle delays for 10 minutes. Profiling begins # only after those requests drain and resumes from the resulting live state. diff --git a/benchmarks/multi_node/srt-slurm-recipes/vllm/kimi-k3/agentic/agg-gb200-dep16-throughput-agentic.yaml b/benchmarks/multi_node/srt-slurm-recipes/vllm/kimi-k3/agentic/agg-gb200-dep16-throughput-agentic.yaml index d281f9cd5e..36170adaa3 100644 --- a/benchmarks/multi_node/srt-slurm-recipes/vllm/kimi-k3/agentic/agg-gb200-dep16-throughput-agentic.yaml +++ b/benchmarks/multi_node/srt-slurm-recipes/vllm/kimi-k3/agentic/agg-gb200-dep16-throughput-agentic.yaml @@ -125,6 +125,7 @@ benchmark: PORT: "8000" IS_MULTINODE: "true" AIPERF_USE_DYNAMO_CONV_AWARE_ROUTING: "0" + AIPERF_BURST_PHASE_STARTS: "1" AIPERF_DYNAMO_SESSION_TIMEOUT_SECONDS: "14400" AIPERF_DATASET_MMAP_CACHE_DIR: "/aiperf_mmap_cache" HF_HUB_CACHE: "/hf_hub_cache" diff --git a/benchmarks/multi_node/srt-slurm-recipes/vllm/kimi-k3/agentic/agg-gb200-tep16-balanced-agentic.yaml b/benchmarks/multi_node/srt-slurm-recipes/vllm/kimi-k3/agentic/agg-gb200-tep16-balanced-agentic.yaml index 6db5821a1a..bfc1530dac 100644 --- a/benchmarks/multi_node/srt-slurm-recipes/vllm/kimi-k3/agentic/agg-gb200-tep16-balanced-agentic.yaml +++ b/benchmarks/multi_node/srt-slurm-recipes/vllm/kimi-k3/agentic/agg-gb200-tep16-balanced-agentic.yaml @@ -125,6 +125,7 @@ benchmark: PORT: "8000" IS_MULTINODE: "true" AIPERF_USE_DYNAMO_CONV_AWARE_ROUTING: "0" + AIPERF_BURST_PHASE_STARTS: "1" AIPERF_DYNAMO_SESSION_TIMEOUT_SECONDS: "14400" AIPERF_DATASET_MMAP_CACHE_DIR: "/aiperf_mmap_cache" HF_HUB_CACHE: "/hf_hub_cache" diff --git a/benchmarks/multi_node/srt-slurm-recipes/vllm/kimi-k3/agentic/agg-gb200-tp16-latency-agentic.yaml b/benchmarks/multi_node/srt-slurm-recipes/vllm/kimi-k3/agentic/agg-gb200-tp16-latency-agentic.yaml index 8c5389505b..cffcc2cb6b 100644 --- a/benchmarks/multi_node/srt-slurm-recipes/vllm/kimi-k3/agentic/agg-gb200-tp16-latency-agentic.yaml +++ b/benchmarks/multi_node/srt-slurm-recipes/vllm/kimi-k3/agentic/agg-gb200-tp16-latency-agentic.yaml @@ -122,6 +122,7 @@ benchmark: PORT: "8000" IS_MULTINODE: "true" AIPERF_USE_DYNAMO_CONV_AWARE_ROUTING: "0" + AIPERF_BURST_PHASE_STARTS: "1" AIPERF_DYNAMO_SESSION_TIMEOUT_SECONDS: "14400" AIPERF_DATASET_MMAP_CACHE_DIR: "/aiperf_mmap_cache" HF_HUB_CACHE: "/hf_hub_cache" From ff5fb061ba2195a765fa22fb7f752a6fdfcd6ec4 Mon Sep 17 00:00:00 2001 From: Cam Quilici Date: Mon, 27 Jul 2026 22:58:04 -0500 Subject: [PATCH 19/45] refactor(kimik3): depend on shared phase starts MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Remove the duplicated AIPerf command-builder hook and Kimi-specific opt-ins. The shared default is tracked in InferenceX PR #2375. 中文:移除重复的 AIPerf 命令构建逻辑和 Kimi 专用开关,统一依赖 InferenceX PR #2375 提供的共享默认行为。 --- benchmarks/benchmark_lib.sh | 7 ------- .../agentic/agg-gb200-dep16-throughput-agentic.yaml | 1 - .../kimi-k3/agentic/agg-gb200-tep16-balanced-agentic.yaml | 1 - .../kimi-k3/agentic/agg-gb200-tp16-latency-agentic.yaml | 1 - 4 files changed, 10 deletions(-) diff --git a/benchmarks/benchmark_lib.sh b/benchmarks/benchmark_lib.sh index 33349852ad..aa9cc6304f 100644 --- a/benchmarks/benchmark_lib.sh +++ b/benchmarks/benchmark_lib.sh @@ -1775,13 +1775,6 @@ build_replay_cmd() { # least one profile turn after warmup. REPLAY_CMD+=" --trajectory-start-min-ratio 0.25" REPLAY_CMD+=" --trajectory-start-max-ratio 0.75" - # Saturation sweeps need the requested lanes to become active inside the - # benchmark window. Agentic replay otherwise preserves the traces' original - # phase-start offsets; long-lived traces can spread the initial warmup over - # many hours before cache-pressure warmup or profiling begins. - if [ "${AIPERF_BURST_PHASE_STARTS:-0}" = "1" ]; then - REPLAY_CMD+=" --burst-phase-starts" - fi # After the normal t* snapshot warmup, continue those exact trajectories # with one-token outputs and no idle delays for 10 minutes. Profiling begins # only after those requests drain and resumes from the resulting live state. diff --git a/benchmarks/multi_node/srt-slurm-recipes/vllm/kimi-k3/agentic/agg-gb200-dep16-throughput-agentic.yaml b/benchmarks/multi_node/srt-slurm-recipes/vllm/kimi-k3/agentic/agg-gb200-dep16-throughput-agentic.yaml index 36170adaa3..d281f9cd5e 100644 --- a/benchmarks/multi_node/srt-slurm-recipes/vllm/kimi-k3/agentic/agg-gb200-dep16-throughput-agentic.yaml +++ b/benchmarks/multi_node/srt-slurm-recipes/vllm/kimi-k3/agentic/agg-gb200-dep16-throughput-agentic.yaml @@ -125,7 +125,6 @@ benchmark: PORT: "8000" IS_MULTINODE: "true" AIPERF_USE_DYNAMO_CONV_AWARE_ROUTING: "0" - AIPERF_BURST_PHASE_STARTS: "1" AIPERF_DYNAMO_SESSION_TIMEOUT_SECONDS: "14400" AIPERF_DATASET_MMAP_CACHE_DIR: "/aiperf_mmap_cache" HF_HUB_CACHE: "/hf_hub_cache" diff --git a/benchmarks/multi_node/srt-slurm-recipes/vllm/kimi-k3/agentic/agg-gb200-tep16-balanced-agentic.yaml b/benchmarks/multi_node/srt-slurm-recipes/vllm/kimi-k3/agentic/agg-gb200-tep16-balanced-agentic.yaml index bfc1530dac..6db5821a1a 100644 --- a/benchmarks/multi_node/srt-slurm-recipes/vllm/kimi-k3/agentic/agg-gb200-tep16-balanced-agentic.yaml +++ b/benchmarks/multi_node/srt-slurm-recipes/vllm/kimi-k3/agentic/agg-gb200-tep16-balanced-agentic.yaml @@ -125,7 +125,6 @@ benchmark: PORT: "8000" IS_MULTINODE: "true" AIPERF_USE_DYNAMO_CONV_AWARE_ROUTING: "0" - AIPERF_BURST_PHASE_STARTS: "1" AIPERF_DYNAMO_SESSION_TIMEOUT_SECONDS: "14400" AIPERF_DATASET_MMAP_CACHE_DIR: "/aiperf_mmap_cache" HF_HUB_CACHE: "/hf_hub_cache" diff --git a/benchmarks/multi_node/srt-slurm-recipes/vllm/kimi-k3/agentic/agg-gb200-tp16-latency-agentic.yaml b/benchmarks/multi_node/srt-slurm-recipes/vllm/kimi-k3/agentic/agg-gb200-tp16-latency-agentic.yaml index cffcc2cb6b..8c5389505b 100644 --- a/benchmarks/multi_node/srt-slurm-recipes/vllm/kimi-k3/agentic/agg-gb200-tp16-latency-agentic.yaml +++ b/benchmarks/multi_node/srt-slurm-recipes/vllm/kimi-k3/agentic/agg-gb200-tp16-latency-agentic.yaml @@ -122,7 +122,6 @@ benchmark: PORT: "8000" IS_MULTINODE: "true" AIPERF_USE_DYNAMO_CONV_AWARE_ROUTING: "0" - AIPERF_BURST_PHASE_STARTS: "1" AIPERF_DYNAMO_SESSION_TIMEOUT_SECONDS: "14400" AIPERF_DATASET_MMAP_CACHE_DIR: "/aiperf_mmap_cache" HF_HUB_CACHE: "/hf_hub_cache" From 235aa5eb4615598e3e69081a216daae786134062 Mon Sep 17 00:00:00 2001 From: Cam Quilici Date: Tue, 28 Jul 2026 02:05:41 -0500 Subject: [PATCH 20/45] fix(agentx): extend Kimi K3 DEP warmup drain MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Allow the full-context DEP saturation sweep up to 3600 seconds to drain accelerated warmup requests. The grace period exits early when the servers become idle. 中文:将 Kimi K3 DEP 全上下文饱和度测试的加速预热排空上限延长至 3600 秒;服务空闲后会提前结束等待。 --- .../vllm/kimi-k3/agentic/agg-gb200-dep16-throughput-agentic.yaml | 1 + configs/nvidia-master.yaml | 1 + 2 files changed, 2 insertions(+) diff --git a/benchmarks/multi_node/srt-slurm-recipes/vllm/kimi-k3/agentic/agg-gb200-dep16-throughput-agentic.yaml b/benchmarks/multi_node/srt-slurm-recipes/vllm/kimi-k3/agentic/agg-gb200-dep16-throughput-agentic.yaml index d281f9cd5e..04b082bcf9 100644 --- a/benchmarks/multi_node/srt-slurm-recipes/vllm/kimi-k3/agentic/agg-gb200-dep16-throughput-agentic.yaml +++ b/benchmarks/multi_node/srt-slurm-recipes/vllm/kimi-k3/agentic/agg-gb200-dep16-throughput-agentic.yaml @@ -126,6 +126,7 @@ benchmark: IS_MULTINODE: "true" AIPERF_USE_DYNAMO_CONV_AWARE_ROUTING: "0" AIPERF_DYNAMO_SESSION_TIMEOUT_SECONDS: "14400" + AGENTIC_WARMUP_GRACE_PERIOD: "3600" 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 bd5e3185f6..6b17a8d61d 100644 --- a/configs/nvidia-master.yaml +++ b/configs/nvidia-master.yaml @@ -8073,6 +8073,7 @@ kimik3-fp4-gb200-dynamo-vllm-agentic: dp-attn: false # Throughput oriented: official multi_node_dep strategy, DEP16 across # four GB200 nodes (TP4 x DP4 = EP16, one local DP rank per node). + # The recipe allows up to 3600s for full-context saturation warmup to drain. # https://recipes.vllm.ai/moonshotai/Kimi-K3?hardware=gb200&nodes=4&strategy=multi_node_dep - spec-decoding: none conc-list: [32, 64, 96, 128, 192, 256] From 1187a301fa47df1c6a82e542b6dd58da088fea21 Mon Sep 17 00:00:00 2001 From: Cam Quilici Date: Tue, 28 Jul 2026 17:52:29 -0500 Subject: [PATCH 21/45] chore(runners): register fourth GB200 worker MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Add gb200-nv_3 to the GB200 cluster runner pool so the Kimi K3 sweep can use the capacity provisioned for this bring-up. 中文:将 gb200-nv_3 注册到 GB200 集群运行器池,使 Kimi K3 扫描能够使用本次适配新增的容量。 --- configs/runners.yaml | 1 + 1 file changed, 1 insertion(+) diff --git a/configs/runners.yaml b/configs/runners.yaml index 851b821ba2..bb0156ab9a 100644 --- a/configs/runners.yaml +++ b/configs/runners.yaml @@ -247,6 +247,7 @@ labels: - gb200-nv_0 - gb200-nv_1 - gb200-nv_2 + - gb200-nv_3 cluster:gb300-nv: - gb300-nv_0 - gb300-nv_1 From d29685c7b8d377557759f6ff86e4ce8789bd92fc Mon Sep 17 00:00:00 2001 From: Cam Quilici Date: Wed, 29 Jul 2026 00:23:33 -0500 Subject: [PATCH 22/45] feat(agentx): add GB200 Kimi K3 CPU KV offload MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Add a high-concurrency DEP16 SimpleCPUOffloadConnector arm at c128/c192/c256/c384 and size the pinned CPU KV tier to 128 GiB per TP rank. Correct the pure TP16 result identity to EP1 so its c8 result does not collide with TEP16. 中文:为 GB200 Kimi K3 AgentX 新增 DEP16 SimpleCPUOffloadConnector 高并发测试,覆盖 c128/c192/c256/c384,并为每个 TP rank 配置 128 GiB 主机 DRAM KV 缓存。同时将纯 TP16 的结果标识修正为 EP1,避免其 c8 结果与 TEP16 冲突。 --- ...hroughput-vllm-simple-offload-agentic.yaml | 135 ++++++++++++++++++ configs/nvidia-master.yaml | 26 +++- perf-changelog.yaml | 7 + 3 files changed, 165 insertions(+), 3 deletions(-) create mode 100644 benchmarks/multi_node/srt-slurm-recipes/vllm/kimi-k3/agentic/agg-gb200-dep16-throughput-vllm-simple-offload-agentic.yaml diff --git a/benchmarks/multi_node/srt-slurm-recipes/vllm/kimi-k3/agentic/agg-gb200-dep16-throughput-vllm-simple-offload-agentic.yaml b/benchmarks/multi_node/srt-slurm-recipes/vllm/kimi-k3/agentic/agg-gb200-dep16-throughput-vllm-simple-offload-agentic.yaml new file mode 100644 index 0000000000..8c811153cc --- /dev/null +++ b/benchmarks/multi_node/srt-slurm-recipes/vllm/kimi-k3/agentic/agg-gb200-dep16-throughput-vllm-simple-offload-agentic.yaml @@ -0,0 +1,135 @@ +name: "kimi-k3-vllm-agg-gb200-dep16-throughput-vllm-simple-offload-agentic" + +# High-concurrency host-DRAM KV-offload variant of the official throughput- +# oriented multi_node_dep profile. TP4 x DP4 gives EP16 across four four-GPU +# GB200 nodes. Each TP rank receives a 128 GiB CPU KV pool (512 GiB per node). +# https://recipes.vllm.ai/moonshotai/Kimi-K3?hardware=gb200&nodes=4&strategy=multi_node_dep + +model: + path: "kimi-k3" + container: "nvcr.io/nvidia/ai-dynamo/vllm-runtime:1.4.0-kimi-k3-dev.1" + precision: "fp4" + +identity: + model: + repo: "moonshotai/Kimi-K3" + container: + image: "nvcr.io/nvidia/ai-dynamo/vllm-runtime:1.4.0-kimi-k3-dev.1" + frameworks: + dynamo: "1.3.0" + +dynamo: + install: false + +environment: + ETCD_LEASE_TTL: "7200" + +slurm: + time_limit: "8:00:00" + +health_check: + max_attempts: 2160 + interval_seconds: 10 + +resources: + gpu_type: "gb200" + gpus_per_node: 4 + agg_nodes: 4 + agg_workers: 1 + gpus_per_agg: 16 + +infra: + etcd_nats_dedicated_node: false + nats_max_payload_mb: 32 + +frontend: + type: dynamo + enable_multiple_frontends: false + args: + dyn-chat-processor: "dynamo" + router-mode: "kv" + router-kv-events: true + router-temperature: "0" + router-min-initial-workers: 1 + kv-cache-block-size: 64 + +backend: + type: vllm + connector: null + aggregated_environment: + HF_HUB_CACHE: "/hf_hub_cache" + HUGGINGFACE_HUB_CACHE: "/hf_hub_cache" + TRANSFORMERS_CACHE: "/hf_hub_cache" + VLLM_ENGINE_READY_TIMEOUT_S: "7200" + VLLM_RPC_TIMEOUT: "600000" + VLLM_LOG_STATS_INTERVAL: "1" + VLLM_USE_V2_MODEL_RUNNER: "0" + VLLM_ENABLE_K3_LATENT_MOE_TAIL_FUSION: "1" + VLLM_ALLREDUCE_USE_FLASHINFER: "1" + VLLM_FLASHINFER_ALLREDUCE_BACKEND: "mnnvl" + NCCL_CUMEM_ENABLE: "1" + NCCL_MNNVL_ENABLE: "1" + NCCL_NVLS_ENABLE: "1" + UCX_MEMTYPE_CACHE: "n" + UCX_NET_DEVICES: "mlx5_0:1,mlx5_1:1,mlx5_2:1,mlx5_3:1" + UCX_TLS: "rc,cuda_copy" + NCCL_IB_HCA: "mlx5_0,mlx5_1,mlx5_2,mlx5_3" + NCCL_P2P_LEVEL: "NVL" + NVIDIA_GDRCOPY: "1" + PYTHONHASHSEED: "42" + PYTORCH_ALLOC_CONF: "expandable_segments:True" + DG_JIT_CACHE_DIR: "/tmp/dg-cache-kimi-k3-gb200-dep16-offload-{job_id}" + vllm_config: + aggregated: + served-model-name: "moonshotai/Kimi-K3" + tensor-parallel-size: 4 + pipeline-parallel-size: 1 + data-parallel-size: 4 + data-parallel-rpc-port: 13345 + enable-expert-parallel: true + trust-remote-code: true + load-format: "fastsafetensors" + safetensors-load-strategy: "lazy" + kv-cache-dtype: "fp8" + attention-backend: "FLASHINFER_MLA" + attention-config: '{"mla_prefill_backend":"TRTLLM_RAGGED","use_prefill_query_quantization":true}' + moe-backend: "deep_gemm_mega_moe" + kda-prefill-backend: "flashkda" + kernel-config: '{"enable_cutedsl_warmup":true}' + all2all-backend: "flashinfer_nvlink_one_sided" + gpu-memory-utilization: 0.92 + max-num-seqs: 128 + max-num-batched-tokens: 16384 + block-size: 64 + language-model-only: true + disable-custom-all-reduce: true + enable-prefix-caching: true + kv-transfer-config: '{"kv_connector":"SimpleCPUOffloadConnector","kv_role":"kv_both","kv_connector_extra_config":{"cpu_bytes_to_use":549755813888,"cpu_bytes_to_use_per_rank":137438953472,"lazy_offload":false}}' + scheduler-cls: "vllm.v1.core.sched.async_scheduler.AsyncScheduler" + dyn-tool-call-parser: "kimi_k3" + reasoning-parser: "kimi_k3" + dyn-reasoning-parser: "kimi_k3" + no-enable-flashinfer-autotune: true + +sbatch_directives: + cpus-per-task: "144" + mem: "0" + +srun_options: + container-remap-root: "" + +benchmark: + type: custom + aiperf_server_metrics: true + 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_DYNAMO_SESSION_TIMEOUT_SECONDS: "14400" + AGENTIC_WARMUP_GRACE_PERIOD: "3600" + 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 9ad4926354..ef12735b46 100644 --- a/configs/nvidia-master.yaml +++ b/configs/nvidia-master.yaml @@ -8068,7 +8068,8 @@ kimik3-fp4-gb200-dynamo-vllm-agentic: disagg: false scenarios: agentic-coding: - - search-space: + - dram-utilization: 0.61 + search-space: # Latency oriented: multi_node_tp strategy, TP16 across four GB200 # nodes. # https://recipes.vllm.ai/moonshotai/Kimi-K3?hardware=gb200&nodes=4&strategy=multi_node_tp @@ -8077,14 +8078,14 @@ kimik3-fp4-gb200-dynamo-vllm-agentic: prefill: num-worker: 1 tp: 16 - ep: 16 + ep: 1 dp-attn: false additional-settings: - "CONFIG_FILE=recipes/vllm/kimi-k3/agentic/agg-gb200-tp16-latency-agentic.yaml" decode: num-worker: 0 tp: 16 - ep: 16 + ep: 1 dp-attn: false # Balanced: multi_node_tep strategy, TEP16 across four GB200 nodes. # https://recipes.vllm.ai/moonshotai/Kimi-K3?hardware=gb200&nodes=4&strategy=multi_node_tep @@ -8120,6 +8121,25 @@ kimik3-fp4-gb200-dynamo-vllm-agentic: tp: 4 ep: 16 dp-attn: true + # High-concurrency DEP16 with vLLM Simple CPU KV offloading. c384 + # exercises 384 of the 393 AgentX trajectories and remains below the + # aggregate max-num-seqs capacity of 512 (128 per DP rank). + - spec-decoding: none + kv-offloading: dram + kv-offload-backend: { name: vllm-simple, version: "13c59a3" } + conc-list: [128, 192, 256, 384] + prefill: + num-worker: 1 + tp: 4 + ep: 16 + dp-attn: true + additional-settings: + - "CONFIG_FILE=recipes/vllm/kimi-k3/agentic/agg-gb200-dep16-throughput-vllm-simple-offload-agentic.yaml" + decode: + num-worker: 0 + tp: 4 + ep: 16 + dp-attn: true dsv4-fp4-gb300-dynamo-sglang-agentic-agg: image: lmsysorg/sglang:nightly-dev-cu13-20260711-7de33ce8 diff --git a/perf-changelog.yaml b/perf-changelog.yaml index 77fedfb6df..26a1973d3e 100644 --- a/perf-changelog.yaml +++ b/perf-changelog.yaml @@ -5173,3 +5173,10 @@ description: - "Add Day-0 Kimi K3 MXFP4 GB200 AgentX performance points following the official vLLM recipe: TP16 (conc 1-8), TEP16 (conc 8-32), and TP4 x DP4 = EP16 (conc 32-256). https://recipes.vllm.ai/moonshotai/Kimi-K3?hardware=gb200" pr-link: https://github.com/SemiAnalysisAI/InferenceX/pull/2354 + +- config-keys: + - kimik3-fp4-gb200-dynamo-vllm-agentic + description: + - "Test vLLM Simple CPU KV offloading on the Kimi K3 GB200 DEP16 throughput profile at AgentX concurrency 128, 192, 256, and 384." + - "Correct the pure TP16 result identity to EP1 so it remains distinct from the TEP16 point at concurrency 8." + pr-link: https://github.com/SemiAnalysisAI/InferenceX/pull/2404 From a1e7500769eb432ef13393d53f43c25d7bbf7911 Mon Sep 17 00:00:00 2001 From: Cam Quilici Date: Wed, 29 Jul 2026 14:20:29 -0500 Subject: [PATCH 23/45] feat(kimik3): use upstream vLLM with DSpark on GB200 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Switch all GB200 AgentX recipes to vllm/vllm-openai:kimi-k3, install Dynamo 1.3.0 in-container, and enable DSpark level 2 at the prescribed golden acceptance length. Consolidate the stacked changelog records into one PR #2404 entry.\n\n中文:将所有 GB200 AgentX 配置切换到 vllm/vllm-openai:kimi-k3,在容器内安装 Dynamo 1.3.0,并按规定的黄金接受长度启用 DSpark level 2;同时将堆叠分支中的性能变更日志合并为一条 PR #2404 记录。 --- .../agentic/agg-gb200-dep16-throughput-agentic.yaml | 9 ++++++--- ...ep16-throughput-vllm-simple-offload-agentic.yaml | 9 ++++++--- .../agentic/agg-gb200-tep16-balanced-agentic.yaml | 9 ++++++--- .../agentic/agg-gb200-tp16-latency-agentic.yaml | 9 ++++++--- configs/nvidia-master.yaml | 13 ++++++++----- perf-changelog.yaml | 8 ++------ 6 files changed, 34 insertions(+), 23 deletions(-) diff --git a/benchmarks/multi_node/srt-slurm-recipes/vllm/kimi-k3/agentic/agg-gb200-dep16-throughput-agentic.yaml b/benchmarks/multi_node/srt-slurm-recipes/vllm/kimi-k3/agentic/agg-gb200-dep16-throughput-agentic.yaml index 04b082bcf9..5370a2364b 100644 --- a/benchmarks/multi_node/srt-slurm-recipes/vllm/kimi-k3/agentic/agg-gb200-dep16-throughput-agentic.yaml +++ b/benchmarks/multi_node/srt-slurm-recipes/vllm/kimi-k3/agentic/agg-gb200-dep16-throughput-agentic.yaml @@ -6,19 +6,20 @@ name: "kimi-k3-vllm-agg-gb200-dep16-throughput-agentic" model: path: "kimi-k3" - container: "nvcr.io/nvidia/ai-dynamo/vllm-runtime:1.4.0-kimi-k3-dev.1" + container: "vllm/vllm-openai:kimi-k3" precision: "fp4" identity: model: repo: "moonshotai/Kimi-K3" container: - image: "nvcr.io/nvidia/ai-dynamo/vllm-runtime:1.4.0-kimi-k3-dev.1" + image: "vllm/vllm-openai:kimi-k3" frameworks: dynamo: "1.3.0" dynamo: - install: false + version: "1.3.0" + install: true environment: ETCD_LEASE_TTL: "7200" @@ -98,6 +99,8 @@ backend: gpu-memory-utilization: 0.92 max-num-seqs: 128 max-num-batched-tokens: 16384 + speculative-config: '{"method":"dspark","model":"Inferact/Kimi-K3-DSpark","num_speculative_tokens":2,"attention_backend":"FLASHINFER_MLA","draft_sample_method":"probabilistic","rejection_sample_method":"synthetic","synthetic_acceptance_length":2.51}' + compilation-config: '{"cudagraph_capture_sizes":[3,6,9,12,15,18,21,24,27,30,33,36,39,42,45,48,51,54,57,60,63,66,69,72,75,78,81,84,87,90,93,96,99,102,105,108,111,114,117,120,123,126,129,132,135,138,141,144,147,150,153,156,159,162,165,168,171,174,177,180,183,186,189,192,195,198,201,204,207,210,213,216,219,222,225,228,231,234,237,240,243,246,249,252,255,258,261,264,267,270,273,276,279,282,285,288,291,294,297,300,303,306,309,312,315,318,321,324,327,330,333,336,339,342,345,348,351,354,357,360,363,366,369,372,375,378,381,384]}' block-size: 64 language-model-only: true disable-custom-all-reduce: true diff --git a/benchmarks/multi_node/srt-slurm-recipes/vllm/kimi-k3/agentic/agg-gb200-dep16-throughput-vllm-simple-offload-agentic.yaml b/benchmarks/multi_node/srt-slurm-recipes/vllm/kimi-k3/agentic/agg-gb200-dep16-throughput-vllm-simple-offload-agentic.yaml index 8c811153cc..154b59e141 100644 --- a/benchmarks/multi_node/srt-slurm-recipes/vllm/kimi-k3/agentic/agg-gb200-dep16-throughput-vllm-simple-offload-agentic.yaml +++ b/benchmarks/multi_node/srt-slurm-recipes/vllm/kimi-k3/agentic/agg-gb200-dep16-throughput-vllm-simple-offload-agentic.yaml @@ -7,19 +7,20 @@ name: "kimi-k3-vllm-agg-gb200-dep16-throughput-vllm-simple-offload-agentic" model: path: "kimi-k3" - container: "nvcr.io/nvidia/ai-dynamo/vllm-runtime:1.4.0-kimi-k3-dev.1" + container: "vllm/vllm-openai:kimi-k3" precision: "fp4" identity: model: repo: "moonshotai/Kimi-K3" container: - image: "nvcr.io/nvidia/ai-dynamo/vllm-runtime:1.4.0-kimi-k3-dev.1" + image: "vllm/vllm-openai:kimi-k3" frameworks: dynamo: "1.3.0" dynamo: - install: false + version: "1.3.0" + install: true environment: ETCD_LEASE_TTL: "7200" @@ -100,6 +101,8 @@ backend: gpu-memory-utilization: 0.92 max-num-seqs: 128 max-num-batched-tokens: 16384 + speculative-config: '{"method":"dspark","model":"Inferact/Kimi-K3-DSpark","num_speculative_tokens":2,"attention_backend":"FLASHINFER_MLA","draft_sample_method":"probabilistic","rejection_sample_method":"synthetic","synthetic_acceptance_length":2.51}' + compilation-config: '{"cudagraph_capture_sizes":[3,6,9,12,15,18,21,24,27,30,33,36,39,42,45,48,51,54,57,60,63,66,69,72,75,78,81,84,87,90,93,96,99,102,105,108,111,114,117,120,123,126,129,132,135,138,141,144,147,150,153,156,159,162,165,168,171,174,177,180,183,186,189,192,195,198,201,204,207,210,213,216,219,222,225,228,231,234,237,240,243,246,249,252,255,258,261,264,267,270,273,276,279,282,285,288,291,294,297,300,303,306,309,312,315,318,321,324,327,330,333,336,339,342,345,348,351,354,357,360,363,366,369,372,375,378,381,384]}' block-size: 64 language-model-only: true disable-custom-all-reduce: true diff --git a/benchmarks/multi_node/srt-slurm-recipes/vllm/kimi-k3/agentic/agg-gb200-tep16-balanced-agentic.yaml b/benchmarks/multi_node/srt-slurm-recipes/vllm/kimi-k3/agentic/agg-gb200-tep16-balanced-agentic.yaml index 6db5821a1a..37df4cd663 100644 --- a/benchmarks/multi_node/srt-slurm-recipes/vllm/kimi-k3/agentic/agg-gb200-tep16-balanced-agentic.yaml +++ b/benchmarks/multi_node/srt-slurm-recipes/vllm/kimi-k3/agentic/agg-gb200-tep16-balanced-agentic.yaml @@ -7,19 +7,20 @@ name: "kimi-k3-vllm-agg-gb200-tep16-balanced-agentic" model: path: "kimi-k3" - container: "nvcr.io/nvidia/ai-dynamo/vllm-runtime:1.4.0-kimi-k3-dev.1" + container: "vllm/vllm-openai:kimi-k3" precision: "fp4" identity: model: repo: "moonshotai/Kimi-K3" container: - image: "nvcr.io/nvidia/ai-dynamo/vllm-runtime:1.4.0-kimi-k3-dev.1" + image: "vllm/vllm-openai:kimi-k3" frameworks: dynamo: "1.3.0" dynamo: - install: false + version: "1.3.0" + install: true environment: ETCD_LEASE_TTL: "7200" @@ -97,6 +98,8 @@ backend: gpu-memory-utilization: 0.92 max-num-seqs: 32 max-num-batched-tokens: 8192 + speculative-config: '{"method":"dspark","model":"Inferact/Kimi-K3-DSpark","num_speculative_tokens":2,"attention_backend":"FLASHINFER_MLA","draft_sample_method":"probabilistic","rejection_sample_method":"synthetic","synthetic_acceptance_length":2.51}' + compilation-config: '{"cudagraph_capture_sizes":[3,6,9,12,15,18,21,24,27,30,33,36,39,42,45,48,51,54,57,60,63,66,69,72,75,78,81,84,87,90,93,96]}' block-size: 64 language-model-only: true disable-custom-all-reduce: true diff --git a/benchmarks/multi_node/srt-slurm-recipes/vllm/kimi-k3/agentic/agg-gb200-tp16-latency-agentic.yaml b/benchmarks/multi_node/srt-slurm-recipes/vllm/kimi-k3/agentic/agg-gb200-tp16-latency-agentic.yaml index 8c5389505b..16299a3824 100644 --- a/benchmarks/multi_node/srt-slurm-recipes/vllm/kimi-k3/agentic/agg-gb200-tp16-latency-agentic.yaml +++ b/benchmarks/multi_node/srt-slurm-recipes/vllm/kimi-k3/agentic/agg-gb200-tp16-latency-agentic.yaml @@ -6,19 +6,20 @@ name: "kimi-k3-vllm-agg-gb200-tp16-latency-agentic" model: path: "kimi-k3" - container: "nvcr.io/nvidia/ai-dynamo/vllm-runtime:1.4.0-kimi-k3-dev.1" + container: "vllm/vllm-openai:kimi-k3" precision: "fp4" identity: model: repo: "moonshotai/Kimi-K3" container: - image: "nvcr.io/nvidia/ai-dynamo/vllm-runtime:1.4.0-kimi-k3-dev.1" + image: "vllm/vllm-openai:kimi-k3" frameworks: dynamo: "1.3.0" dynamo: - install: false + version: "1.3.0" + install: true environment: ETCD_LEASE_TTL: "7200" @@ -94,6 +95,8 @@ backend: gpu-memory-utilization: 0.92 max-num-seqs: 8 max-num-batched-tokens: 8192 + speculative-config: '{"method":"dspark","model":"Inferact/Kimi-K3-DSpark","num_speculative_tokens":2,"attention_backend":"FLASHINFER_MLA","draft_sample_method":"probabilistic","rejection_sample_method":"synthetic","synthetic_acceptance_length":2.51}' + compilation-config: '{"cudagraph_capture_sizes":[3,6,9,12,15,18,21,24]}' block-size: 64 language-model-only: true disable-custom-all-reduce: true diff --git a/configs/nvidia-master.yaml b/configs/nvidia-master.yaml index 3937673912..fddd092d18 100644 --- a/configs/nvidia-master.yaml +++ b/configs/nvidia-master.yaml @@ -8055,9 +8055,12 @@ dsv4-fp4-gb300-dynamo-vllm-agentic-mtp-disagg: # latency: multi-node TP16 (4 GB200 nodes / 16 GPUs) # balanced: multi-node TEP16 (4 GB200 nodes / 16 GPUs) # throughput: multi-node TP4 x DP4 (4 GB200 nodes / EP16) +# All profiles enable Kimi K3 DSpark level 2 at the committed golden AL 2.51. +# `spec-decoding: mtp` is the existing matrix label used for speculative +# decoding methods; the checked-in recipes select DSpark explicitly. # https://recipes.vllm.ai/moonshotai/Kimi-K3?hardware=gb200 kimik3-fp4-gb200-dynamo-vllm-agentic: - image: nvcr.io/nvidia/ai-dynamo/vllm-runtime:1.4.0-kimi-k3-dev.1 + image: vllm/vllm-openai:kimi-k3 model: moonshotai/Kimi-K3 model-prefix: kimik3 runner: cluster:gb200-nv @@ -8073,7 +8076,7 @@ kimik3-fp4-gb200-dynamo-vllm-agentic: # Latency oriented: multi_node_tp strategy, TP16 across four GB200 # nodes. # https://recipes.vllm.ai/moonshotai/Kimi-K3?hardware=gb200&nodes=4&strategy=multi_node_tp - - spec-decoding: none + - spec-decoding: mtp conc-list: [1, 2, 4, 8] prefill: num-worker: 1 @@ -8089,7 +8092,7 @@ kimik3-fp4-gb200-dynamo-vllm-agentic: dp-attn: false # Balanced: multi_node_tep strategy, TEP16 across four GB200 nodes. # https://recipes.vllm.ai/moonshotai/Kimi-K3?hardware=gb200&nodes=4&strategy=multi_node_tep - - spec-decoding: none + - spec-decoding: mtp conc-list: [8, 16, 24, 32] prefill: num-worker: 1 @@ -8107,7 +8110,7 @@ kimik3-fp4-gb200-dynamo-vllm-agentic: # four GB200 nodes (TP4 x DP4 = EP16, one local DP rank per node). # The recipe allows up to 3600s for full-context saturation warmup to drain. # https://recipes.vllm.ai/moonshotai/Kimi-K3?hardware=gb200&nodes=4&strategy=multi_node_dep - - spec-decoding: none + - spec-decoding: mtp conc-list: [32, 64, 96, 128, 192, 256] prefill: num-worker: 1 @@ -8124,7 +8127,7 @@ kimik3-fp4-gb200-dynamo-vllm-agentic: # High-concurrency DEP16 with vLLM Simple CPU KV offloading. c384 # exercises 384 of the 393 AgentX trajectories and remains below the # aggregate max-num-seqs capacity of 512 (128 per DP rank). - - spec-decoding: none + - spec-decoding: mtp kv-offloading: dram kv-offload-backend: { name: vllm-simple, version: "13c59a3" } conc-list: [128, 192, 256, 384] diff --git a/perf-changelog.yaml b/perf-changelog.yaml index 784fd76271..5ab234a27c 100644 --- a/perf-changelog.yaml +++ b/perf-changelog.yaml @@ -5195,12 +5195,8 @@ - config-keys: - kimik3-fp4-gb200-dynamo-vllm-agentic description: - - "Add Day-0 Kimi K3 MXFP4 GB200 AgentX performance points following the official vLLM recipe: TP16 (conc 1-8), TEP16 (conc 8-32), and TP4 x DP4 = EP16 (conc 32-256). https://recipes.vllm.ai/moonshotai/Kimi-K3?hardware=gb200" - pr-link: https://github.com/SemiAnalysisAI/InferenceX/pull/2354 - -- config-keys: - - kimik3-fp4-gb200-dynamo-vllm-agentic - description: + - "Add Kimi K3 MXFP4 GB200 AgentX performance points following the official vLLM recipe: TP16 (conc 1-8), TEP16 (conc 8-32), and TP4 x DP4 = EP16 (conc 32-256). https://recipes.vllm.ai/moonshotai/Kimi-K3?hardware=gb200" - "Test vLLM Simple CPU KV offloading on the Kimi K3 GB200 DEP16 throughput profile at AgentX concurrency 128, 192, 256, and 384." - "Correct the pure TP16 result identity to EP1 so it remains distinct from the TEP16 point at concurrency 8." + - "Use the upstream vllm/vllm-openai:kimi-k3 image with Dynamo 1.3.0 installed in-container, and enable Kimi K3 DSpark level 2 with the prescribed 2.51 golden acceptance length." pr-link: https://github.com/SemiAnalysisAI/InferenceX/pull/2404 From 8400af0082c65fb537bda00034b22b86ed1810dc Mon Sep 17 00:00:00 2001 From: Cam Quilici Date: Wed, 29 Jul 2026 14:30:56 -0500 Subject: [PATCH 24/45] fix(kimik3): pin K3-compatible Dynamo preview MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Install the official v1.4.0-kimi-k3-dev.1 preview from its immutable release commit so the upstream vLLM image has Kimi K3 reasoning and tool-call support. 中文:固定使用支持 Kimi K3 的 Dynamo 预览版。通过不可变发布提交安装官方 v1.4.0-kimi-k3-dev.1,使上游 vLLM 镜像具备 Kimi K3 推理与工具调用支持。 --- .../kimi-k3/agentic/agg-gb200-dep16-throughput-agentic.yaml | 4 ++-- ...gg-gb200-dep16-throughput-vllm-simple-offload-agentic.yaml | 4 ++-- .../kimi-k3/agentic/agg-gb200-tep16-balanced-agentic.yaml | 4 ++-- .../vllm/kimi-k3/agentic/agg-gb200-tp16-latency-agentic.yaml | 4 ++-- configs/nvidia-master.yaml | 2 +- perf-changelog.yaml | 2 +- 6 files changed, 10 insertions(+), 10 deletions(-) diff --git a/benchmarks/multi_node/srt-slurm-recipes/vllm/kimi-k3/agentic/agg-gb200-dep16-throughput-agentic.yaml b/benchmarks/multi_node/srt-slurm-recipes/vllm/kimi-k3/agentic/agg-gb200-dep16-throughput-agentic.yaml index 5370a2364b..c539e367e7 100644 --- a/benchmarks/multi_node/srt-slurm-recipes/vllm/kimi-k3/agentic/agg-gb200-dep16-throughput-agentic.yaml +++ b/benchmarks/multi_node/srt-slurm-recipes/vllm/kimi-k3/agentic/agg-gb200-dep16-throughput-agentic.yaml @@ -15,10 +15,10 @@ identity: container: image: "vllm/vllm-openai:kimi-k3" frameworks: - dynamo: "1.3.0" + dynamo: "1.4.0-kimi-k3-dev.1" dynamo: - version: "1.3.0" + hash: "ba83080ecd31c1ce918559e576d3c5bc9e092ff1" install: true environment: diff --git a/benchmarks/multi_node/srt-slurm-recipes/vllm/kimi-k3/agentic/agg-gb200-dep16-throughput-vllm-simple-offload-agentic.yaml b/benchmarks/multi_node/srt-slurm-recipes/vllm/kimi-k3/agentic/agg-gb200-dep16-throughput-vllm-simple-offload-agentic.yaml index 154b59e141..45b4d62018 100644 --- a/benchmarks/multi_node/srt-slurm-recipes/vllm/kimi-k3/agentic/agg-gb200-dep16-throughput-vllm-simple-offload-agentic.yaml +++ b/benchmarks/multi_node/srt-slurm-recipes/vllm/kimi-k3/agentic/agg-gb200-dep16-throughput-vllm-simple-offload-agentic.yaml @@ -16,10 +16,10 @@ identity: container: image: "vllm/vllm-openai:kimi-k3" frameworks: - dynamo: "1.3.0" + dynamo: "1.4.0-kimi-k3-dev.1" dynamo: - version: "1.3.0" + hash: "ba83080ecd31c1ce918559e576d3c5bc9e092ff1" install: true environment: diff --git a/benchmarks/multi_node/srt-slurm-recipes/vllm/kimi-k3/agentic/agg-gb200-tep16-balanced-agentic.yaml b/benchmarks/multi_node/srt-slurm-recipes/vllm/kimi-k3/agentic/agg-gb200-tep16-balanced-agentic.yaml index 37df4cd663..2297ce8baa 100644 --- a/benchmarks/multi_node/srt-slurm-recipes/vllm/kimi-k3/agentic/agg-gb200-tep16-balanced-agentic.yaml +++ b/benchmarks/multi_node/srt-slurm-recipes/vllm/kimi-k3/agentic/agg-gb200-tep16-balanced-agentic.yaml @@ -16,10 +16,10 @@ identity: container: image: "vllm/vllm-openai:kimi-k3" frameworks: - dynamo: "1.3.0" + dynamo: "1.4.0-kimi-k3-dev.1" dynamo: - version: "1.3.0" + hash: "ba83080ecd31c1ce918559e576d3c5bc9e092ff1" install: true environment: diff --git a/benchmarks/multi_node/srt-slurm-recipes/vllm/kimi-k3/agentic/agg-gb200-tp16-latency-agentic.yaml b/benchmarks/multi_node/srt-slurm-recipes/vllm/kimi-k3/agentic/agg-gb200-tp16-latency-agentic.yaml index 16299a3824..d4bd77707c 100644 --- a/benchmarks/multi_node/srt-slurm-recipes/vllm/kimi-k3/agentic/agg-gb200-tp16-latency-agentic.yaml +++ b/benchmarks/multi_node/srt-slurm-recipes/vllm/kimi-k3/agentic/agg-gb200-tp16-latency-agentic.yaml @@ -15,10 +15,10 @@ identity: container: image: "vllm/vllm-openai:kimi-k3" frameworks: - dynamo: "1.3.0" + dynamo: "1.4.0-kimi-k3-dev.1" dynamo: - version: "1.3.0" + hash: "ba83080ecd31c1ce918559e576d3c5bc9e092ff1" install: true environment: diff --git a/configs/nvidia-master.yaml b/configs/nvidia-master.yaml index fddd092d18..5019453d14 100644 --- a/configs/nvidia-master.yaml +++ b/configs/nvidia-master.yaml @@ -8066,7 +8066,7 @@ kimik3-fp4-gb200-dynamo-vllm-agentic: runner: cluster:gb200-nv precision: fp4 framework: dynamo-vllm - router: { name: dynamo-router, version: "1.3.0" } + router: { name: dynamo-router, version: "1.4.0-kimi-k3-dev.1" } multinode: true disagg: false scenarios: diff --git a/perf-changelog.yaml b/perf-changelog.yaml index 5ab234a27c..446576b5a9 100644 --- a/perf-changelog.yaml +++ b/perf-changelog.yaml @@ -5198,5 +5198,5 @@ - "Add Kimi K3 MXFP4 GB200 AgentX performance points following the official vLLM recipe: TP16 (conc 1-8), TEP16 (conc 8-32), and TP4 x DP4 = EP16 (conc 32-256). https://recipes.vllm.ai/moonshotai/Kimi-K3?hardware=gb200" - "Test vLLM Simple CPU KV offloading on the Kimi K3 GB200 DEP16 throughput profile at AgentX concurrency 128, 192, 256, and 384." - "Correct the pure TP16 result identity to EP1 so it remains distinct from the TEP16 point at concurrency 8." - - "Use the upstream vllm/vllm-openai:kimi-k3 image with Dynamo 1.3.0 installed in-container, and enable Kimi K3 DSpark level 2 with the prescribed 2.51 golden acceptance length." + - "Use the upstream vllm/vllm-openai:kimi-k3 image with the official Dynamo v1.4.0-kimi-k3-dev.1 preview installed in-container, and enable Kimi K3 DSpark level 2 with the prescribed 2.51 golden acceptance length." pr-link: https://github.com/SemiAnalysisAI/InferenceX/pull/2404 From 9eaa37226b81f5dd06575440106e4ae9643b6aa8 Mon Sep 17 00:00:00 2001 From: Cam Quilici Date: Wed, 29 Jul 2026 16:15:51 -0500 Subject: [PATCH 25/45] fix(kimik3): bridge DSpark mask metadata for Dynamo MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Create an ephemeral view of the official Kimi K3 DSpark checkpoint that maps its mask_token_id to the pard_token field expected after Dynamo serialization. Keep the upstream vLLM image and checkpoint weights unchanged.\n\n中文:为官方 Kimi K3 DSpark 检查点创建临时兼容视图,将 mask_token_id 映射到 Dynamo 序列化后所需的 pard_token 字段;保持上游 vLLM 镜像与检查点权重不变。 --- .../configs/kimik3-dspark-config-compat.sh | 49 +++++++++++++++++++ .../agg-gb200-dep16-throughput-agentic.yaml | 4 +- ...hroughput-vllm-simple-offload-agentic.yaml | 4 +- .../agg-gb200-tep16-balanced-agentic.yaml | 4 +- .../agg-gb200-tp16-latency-agentic.yaml | 4 +- runners/launch_gb200-nv.sh | 2 + 6 files changed, 63 insertions(+), 4 deletions(-) create mode 100644 benchmarks/multi_node/srt-slurm-recipes/configs/kimik3-dspark-config-compat.sh diff --git a/benchmarks/multi_node/srt-slurm-recipes/configs/kimik3-dspark-config-compat.sh b/benchmarks/multi_node/srt-slurm-recipes/configs/kimik3-dspark-config-compat.sh new file mode 100644 index 0000000000..a42c6aba77 --- /dev/null +++ b/benchmarks/multi_node/srt-slurm-recipes/configs/kimik3-dspark-config-compat.sh @@ -0,0 +1,49 @@ +#!/usr/bin/env bash +set -euo pipefail + +# The Kimi K3 DSpark checkpoint publishes its parallel-drafting token as +# `mask_token_id`. Dynamo's serialized draft config reaches vLLM without the +# K3 config-class alias, while vLLM's parallel drafter accepts `pard_token`. +# Build a thin local view of the upstream checkpoint and add that equivalent +# metadata alias without changing vLLM or the checkpoint weights. +python3 - <<'PY' +import json +import os +from pathlib import Path + +from huggingface_hub import snapshot_download + +repo_id = "Inferact/Kimi-K3-DSpark" +target = Path("/tmp/Kimi-K3-DSpark") +snapshot = Path(snapshot_download(repo_id=repo_id)) +target.mkdir(parents=True, exist_ok=True) + +for source in snapshot.iterdir(): + if source.name == "config.json": + continue + destination = target / source.name + if destination.is_symlink(): + if destination.resolve() == source.resolve(): + continue + destination.unlink() + elif destination.exists(): + raise RuntimeError(f"Refusing to replace non-symlink path: {destination}") + destination.symlink_to(source) + +config = json.loads((snapshot / "config.json").read_text()) +mask_token_id = config.get("mask_token_id") +if not isinstance(mask_token_id, int): + raise RuntimeError(f"{repo_id} config is missing integer mask_token_id") + +pard_token = config.get("pard_token") +if pard_token not in (None, mask_token_id): + raise RuntimeError( + f"{repo_id} pard_token={pard_token} disagrees with mask_token_id={mask_token_id}" + ) +config["pard_token"] = mask_token_id + +temporary = target / "config.json.tmp" +temporary.write_text(json.dumps(config, indent=2) + "\n") +os.replace(temporary, target / "config.json") +print(f"Prepared {repo_id} compatibility view at {target}") +PY diff --git a/benchmarks/multi_node/srt-slurm-recipes/vllm/kimi-k3/agentic/agg-gb200-dep16-throughput-agentic.yaml b/benchmarks/multi_node/srt-slurm-recipes/vllm/kimi-k3/agentic/agg-gb200-dep16-throughput-agentic.yaml index c539e367e7..0605960ff3 100644 --- a/benchmarks/multi_node/srt-slurm-recipes/vllm/kimi-k3/agentic/agg-gb200-dep16-throughput-agentic.yaml +++ b/benchmarks/multi_node/srt-slurm-recipes/vllm/kimi-k3/agentic/agg-gb200-dep16-throughput-agentic.yaml @@ -21,6 +21,8 @@ dynamo: hash: "ba83080ecd31c1ce918559e576d3c5bc9e092ff1" install: true +setup_script: kimik3-dspark-config-compat.sh + environment: ETCD_LEASE_TTL: "7200" @@ -99,7 +101,7 @@ backend: gpu-memory-utilization: 0.92 max-num-seqs: 128 max-num-batched-tokens: 16384 - speculative-config: '{"method":"dspark","model":"Inferact/Kimi-K3-DSpark","num_speculative_tokens":2,"attention_backend":"FLASHINFER_MLA","draft_sample_method":"probabilistic","rejection_sample_method":"synthetic","synthetic_acceptance_length":2.51}' + speculative-config: '{"method":"dspark","model":"/tmp/Kimi-K3-DSpark","num_speculative_tokens":2,"attention_backend":"FLASHINFER_MLA","draft_sample_method":"probabilistic","rejection_sample_method":"synthetic","synthetic_acceptance_length":2.51}' compilation-config: '{"cudagraph_capture_sizes":[3,6,9,12,15,18,21,24,27,30,33,36,39,42,45,48,51,54,57,60,63,66,69,72,75,78,81,84,87,90,93,96,99,102,105,108,111,114,117,120,123,126,129,132,135,138,141,144,147,150,153,156,159,162,165,168,171,174,177,180,183,186,189,192,195,198,201,204,207,210,213,216,219,222,225,228,231,234,237,240,243,246,249,252,255,258,261,264,267,270,273,276,279,282,285,288,291,294,297,300,303,306,309,312,315,318,321,324,327,330,333,336,339,342,345,348,351,354,357,360,363,366,369,372,375,378,381,384]}' block-size: 64 language-model-only: true diff --git a/benchmarks/multi_node/srt-slurm-recipes/vllm/kimi-k3/agentic/agg-gb200-dep16-throughput-vllm-simple-offload-agentic.yaml b/benchmarks/multi_node/srt-slurm-recipes/vllm/kimi-k3/agentic/agg-gb200-dep16-throughput-vllm-simple-offload-agentic.yaml index 45b4d62018..b493824a77 100644 --- a/benchmarks/multi_node/srt-slurm-recipes/vllm/kimi-k3/agentic/agg-gb200-dep16-throughput-vllm-simple-offload-agentic.yaml +++ b/benchmarks/multi_node/srt-slurm-recipes/vllm/kimi-k3/agentic/agg-gb200-dep16-throughput-vllm-simple-offload-agentic.yaml @@ -22,6 +22,8 @@ dynamo: hash: "ba83080ecd31c1ce918559e576d3c5bc9e092ff1" install: true +setup_script: kimik3-dspark-config-compat.sh + environment: ETCD_LEASE_TTL: "7200" @@ -101,7 +103,7 @@ backend: gpu-memory-utilization: 0.92 max-num-seqs: 128 max-num-batched-tokens: 16384 - speculative-config: '{"method":"dspark","model":"Inferact/Kimi-K3-DSpark","num_speculative_tokens":2,"attention_backend":"FLASHINFER_MLA","draft_sample_method":"probabilistic","rejection_sample_method":"synthetic","synthetic_acceptance_length":2.51}' + speculative-config: '{"method":"dspark","model":"/tmp/Kimi-K3-DSpark","num_speculative_tokens":2,"attention_backend":"FLASHINFER_MLA","draft_sample_method":"probabilistic","rejection_sample_method":"synthetic","synthetic_acceptance_length":2.51}' compilation-config: '{"cudagraph_capture_sizes":[3,6,9,12,15,18,21,24,27,30,33,36,39,42,45,48,51,54,57,60,63,66,69,72,75,78,81,84,87,90,93,96,99,102,105,108,111,114,117,120,123,126,129,132,135,138,141,144,147,150,153,156,159,162,165,168,171,174,177,180,183,186,189,192,195,198,201,204,207,210,213,216,219,222,225,228,231,234,237,240,243,246,249,252,255,258,261,264,267,270,273,276,279,282,285,288,291,294,297,300,303,306,309,312,315,318,321,324,327,330,333,336,339,342,345,348,351,354,357,360,363,366,369,372,375,378,381,384]}' block-size: 64 language-model-only: true diff --git a/benchmarks/multi_node/srt-slurm-recipes/vllm/kimi-k3/agentic/agg-gb200-tep16-balanced-agentic.yaml b/benchmarks/multi_node/srt-slurm-recipes/vllm/kimi-k3/agentic/agg-gb200-tep16-balanced-agentic.yaml index 2297ce8baa..d8bb5768c8 100644 --- a/benchmarks/multi_node/srt-slurm-recipes/vllm/kimi-k3/agentic/agg-gb200-tep16-balanced-agentic.yaml +++ b/benchmarks/multi_node/srt-slurm-recipes/vllm/kimi-k3/agentic/agg-gb200-tep16-balanced-agentic.yaml @@ -22,6 +22,8 @@ dynamo: hash: "ba83080ecd31c1ce918559e576d3c5bc9e092ff1" install: true +setup_script: kimik3-dspark-config-compat.sh + environment: ETCD_LEASE_TTL: "7200" @@ -98,7 +100,7 @@ backend: gpu-memory-utilization: 0.92 max-num-seqs: 32 max-num-batched-tokens: 8192 - speculative-config: '{"method":"dspark","model":"Inferact/Kimi-K3-DSpark","num_speculative_tokens":2,"attention_backend":"FLASHINFER_MLA","draft_sample_method":"probabilistic","rejection_sample_method":"synthetic","synthetic_acceptance_length":2.51}' + speculative-config: '{"method":"dspark","model":"/tmp/Kimi-K3-DSpark","num_speculative_tokens":2,"attention_backend":"FLASHINFER_MLA","draft_sample_method":"probabilistic","rejection_sample_method":"synthetic","synthetic_acceptance_length":2.51}' compilation-config: '{"cudagraph_capture_sizes":[3,6,9,12,15,18,21,24,27,30,33,36,39,42,45,48,51,54,57,60,63,66,69,72,75,78,81,84,87,90,93,96]}' block-size: 64 language-model-only: true diff --git a/benchmarks/multi_node/srt-slurm-recipes/vllm/kimi-k3/agentic/agg-gb200-tp16-latency-agentic.yaml b/benchmarks/multi_node/srt-slurm-recipes/vllm/kimi-k3/agentic/agg-gb200-tp16-latency-agentic.yaml index d4bd77707c..04b3d48e42 100644 --- a/benchmarks/multi_node/srt-slurm-recipes/vllm/kimi-k3/agentic/agg-gb200-tp16-latency-agentic.yaml +++ b/benchmarks/multi_node/srt-slurm-recipes/vllm/kimi-k3/agentic/agg-gb200-tp16-latency-agentic.yaml @@ -21,6 +21,8 @@ dynamo: hash: "ba83080ecd31c1ce918559e576d3c5bc9e092ff1" install: true +setup_script: kimik3-dspark-config-compat.sh + environment: ETCD_LEASE_TTL: "7200" @@ -95,7 +97,7 @@ backend: gpu-memory-utilization: 0.92 max-num-seqs: 8 max-num-batched-tokens: 8192 - speculative-config: '{"method":"dspark","model":"Inferact/Kimi-K3-DSpark","num_speculative_tokens":2,"attention_backend":"FLASHINFER_MLA","draft_sample_method":"probabilistic","rejection_sample_method":"synthetic","synthetic_acceptance_length":2.51}' + speculative-config: '{"method":"dspark","model":"/tmp/Kimi-K3-DSpark","num_speculative_tokens":2,"attention_backend":"FLASHINFER_MLA","draft_sample_method":"probabilistic","rejection_sample_method":"synthetic","synthetic_acceptance_length":2.51}' compilation-config: '{"cudagraph_capture_sizes":[3,6,9,12,15,18,21,24]}' block-size: 64 language-model-only: true diff --git a/runners/launch_gb200-nv.sh b/runners/launch_gb200-nv.sh index 60dc2ddf02..08d287bcbf 100755 --- a/runners/launch_gb200-nv.sh +++ b/runners/launch_gb200-nv.sh @@ -383,6 +383,8 @@ if [[ "$IS_AGENTIC" == "1" ]]; 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 + cp "$GITHUB_WORKSPACE/benchmarks/multi_node/srt-slurm-recipes/configs/kimik3-dspark-config-compat.sh" \ + configs/kimik3-dspark-config-compat.sh else git checkout de59739b172e507e15ebf145bfe305f606e82fbf mkdir -p recipes/vllm/deepseek-v4/agentic From 389141c9d16f83db3ae6e8b0d37f277291c26e71 Mon Sep 17 00:00:00 2001 From: Cam Quilici Date: Wed, 29 Jul 2026 16:53:58 -0500 Subject: [PATCH 26/45] fix(kimik3): use model runner v2 for DSpark MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Enable MRV2 in all GB200 Kimi K3 AgentX recipes so DSpark uses its supported loader instead of the legacy embedding-sharing path.\n\n中文:在所有 GB200 Kimi K3 AgentX 配置中启用 MRV2,使 DSpark 使用受支持的加载路径,避免旧版 embedding sharing 路径。 --- .../kimi-k3/agentic/agg-gb200-dep16-throughput-agentic.yaml | 2 +- .../agg-gb200-dep16-throughput-vllm-simple-offload-agentic.yaml | 2 +- .../vllm/kimi-k3/agentic/agg-gb200-tep16-balanced-agentic.yaml | 2 +- .../vllm/kimi-k3/agentic/agg-gb200-tp16-latency-agentic.yaml | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/benchmarks/multi_node/srt-slurm-recipes/vllm/kimi-k3/agentic/agg-gb200-dep16-throughput-agentic.yaml b/benchmarks/multi_node/srt-slurm-recipes/vllm/kimi-k3/agentic/agg-gb200-dep16-throughput-agentic.yaml index 0605960ff3..0c53a0bb54 100644 --- a/benchmarks/multi_node/srt-slurm-recipes/vllm/kimi-k3/agentic/agg-gb200-dep16-throughput-agentic.yaml +++ b/benchmarks/multi_node/srt-slurm-recipes/vllm/kimi-k3/agentic/agg-gb200-dep16-throughput-agentic.yaml @@ -65,7 +65,7 @@ backend: VLLM_ENGINE_READY_TIMEOUT_S: "7200" VLLM_RPC_TIMEOUT: "600000" VLLM_LOG_STATS_INTERVAL: "1" - VLLM_USE_V2_MODEL_RUNNER: "0" + VLLM_USE_V2_MODEL_RUNNER: "1" VLLM_ENABLE_K3_LATENT_MOE_TAIL_FUSION: "1" VLLM_ALLREDUCE_USE_FLASHINFER: "1" VLLM_FLASHINFER_ALLREDUCE_BACKEND: "mnnvl" diff --git a/benchmarks/multi_node/srt-slurm-recipes/vllm/kimi-k3/agentic/agg-gb200-dep16-throughput-vllm-simple-offload-agentic.yaml b/benchmarks/multi_node/srt-slurm-recipes/vllm/kimi-k3/agentic/agg-gb200-dep16-throughput-vllm-simple-offload-agentic.yaml index b493824a77..3ec511ac7c 100644 --- a/benchmarks/multi_node/srt-slurm-recipes/vllm/kimi-k3/agentic/agg-gb200-dep16-throughput-vllm-simple-offload-agentic.yaml +++ b/benchmarks/multi_node/srt-slurm-recipes/vllm/kimi-k3/agentic/agg-gb200-dep16-throughput-vllm-simple-offload-agentic.yaml @@ -66,7 +66,7 @@ backend: VLLM_ENGINE_READY_TIMEOUT_S: "7200" VLLM_RPC_TIMEOUT: "600000" VLLM_LOG_STATS_INTERVAL: "1" - VLLM_USE_V2_MODEL_RUNNER: "0" + VLLM_USE_V2_MODEL_RUNNER: "1" VLLM_ENABLE_K3_LATENT_MOE_TAIL_FUSION: "1" VLLM_ALLREDUCE_USE_FLASHINFER: "1" VLLM_FLASHINFER_ALLREDUCE_BACKEND: "mnnvl" diff --git a/benchmarks/multi_node/srt-slurm-recipes/vllm/kimi-k3/agentic/agg-gb200-tep16-balanced-agentic.yaml b/benchmarks/multi_node/srt-slurm-recipes/vllm/kimi-k3/agentic/agg-gb200-tep16-balanced-agentic.yaml index d8bb5768c8..fb136c6ec7 100644 --- a/benchmarks/multi_node/srt-slurm-recipes/vllm/kimi-k3/agentic/agg-gb200-tep16-balanced-agentic.yaml +++ b/benchmarks/multi_node/srt-slurm-recipes/vllm/kimi-k3/agentic/agg-gb200-tep16-balanced-agentic.yaml @@ -66,7 +66,7 @@ backend: VLLM_ENGINE_READY_TIMEOUT_S: "7200" VLLM_RPC_TIMEOUT: "600000" VLLM_LOG_STATS_INTERVAL: "1" - VLLM_USE_V2_MODEL_RUNNER: "0" + VLLM_USE_V2_MODEL_RUNNER: "1" VLLM_ENABLE_K3_LATENT_MOE_TAIL_FUSION: "1" VLLM_ALLREDUCE_USE_FLASHINFER: "1" VLLM_FLASHINFER_ALLREDUCE_BACKEND: "mnnvl" diff --git a/benchmarks/multi_node/srt-slurm-recipes/vllm/kimi-k3/agentic/agg-gb200-tp16-latency-agentic.yaml b/benchmarks/multi_node/srt-slurm-recipes/vllm/kimi-k3/agentic/agg-gb200-tp16-latency-agentic.yaml index 04b3d48e42..38d116142f 100644 --- a/benchmarks/multi_node/srt-slurm-recipes/vllm/kimi-k3/agentic/agg-gb200-tp16-latency-agentic.yaml +++ b/benchmarks/multi_node/srt-slurm-recipes/vllm/kimi-k3/agentic/agg-gb200-tp16-latency-agentic.yaml @@ -65,7 +65,7 @@ backend: VLLM_ENGINE_READY_TIMEOUT_S: "7200" VLLM_RPC_TIMEOUT: "600000" VLLM_LOG_STATS_INTERVAL: "1" - VLLM_USE_V2_MODEL_RUNNER: "0" + VLLM_USE_V2_MODEL_RUNNER: "1" VLLM_ENABLE_K3_LATENT_MOE_TAIL_FUSION: "1" VLLM_ALLREDUCE_USE_FLASHINFER: "1" VLLM_FLASHINFER_ALLREDUCE_BACKEND: "mnnvl" From 35c272d6db09b07eab4fb25f3f2aa5ba4a8e2b3e Mon Sep 17 00:00:00 2001 From: Cam Quilici Date: Wed, 29 Jul 2026 22:00:17 -0500 Subject: [PATCH 27/45] fix(kimik3): preserve full context on DEP MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Raise the GB200 DEP and SimpleCPU-offload recipes to the official 0.95 GPU memory utilization so MRV2 can allocate the 16.9 GiB required for one full 1M-token request. 中文:将 GB200 DEP 与 SimpleCPU 卸载配置的 GPU 显存利用率提高到官方建议的 0.95,使 MRV2 能为单个完整 100 万 token 请求分配所需的 16.9 GiB KV 缓存。 --- .../kimi-k3/agentic/agg-gb200-dep16-throughput-agentic.yaml | 2 +- .../agg-gb200-dep16-throughput-vllm-simple-offload-agentic.yaml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/benchmarks/multi_node/srt-slurm-recipes/vllm/kimi-k3/agentic/agg-gb200-dep16-throughput-agentic.yaml b/benchmarks/multi_node/srt-slurm-recipes/vllm/kimi-k3/agentic/agg-gb200-dep16-throughput-agentic.yaml index 0c53a0bb54..bb215076d7 100644 --- a/benchmarks/multi_node/srt-slurm-recipes/vllm/kimi-k3/agentic/agg-gb200-dep16-throughput-agentic.yaml +++ b/benchmarks/multi_node/srt-slurm-recipes/vllm/kimi-k3/agentic/agg-gb200-dep16-throughput-agentic.yaml @@ -98,7 +98,7 @@ backend: kda-prefill-backend: "flashkda" kernel-config: '{"enable_cutedsl_warmup":true}' all2all-backend: "flashinfer_nvlink_one_sided" - gpu-memory-utilization: 0.92 + gpu-memory-utilization: 0.95 max-num-seqs: 128 max-num-batched-tokens: 16384 speculative-config: '{"method":"dspark","model":"/tmp/Kimi-K3-DSpark","num_speculative_tokens":2,"attention_backend":"FLASHINFER_MLA","draft_sample_method":"probabilistic","rejection_sample_method":"synthetic","synthetic_acceptance_length":2.51}' diff --git a/benchmarks/multi_node/srt-slurm-recipes/vllm/kimi-k3/agentic/agg-gb200-dep16-throughput-vllm-simple-offload-agentic.yaml b/benchmarks/multi_node/srt-slurm-recipes/vllm/kimi-k3/agentic/agg-gb200-dep16-throughput-vllm-simple-offload-agentic.yaml index 3ec511ac7c..fe44983ace 100644 --- a/benchmarks/multi_node/srt-slurm-recipes/vllm/kimi-k3/agentic/agg-gb200-dep16-throughput-vllm-simple-offload-agentic.yaml +++ b/benchmarks/multi_node/srt-slurm-recipes/vllm/kimi-k3/agentic/agg-gb200-dep16-throughput-vllm-simple-offload-agentic.yaml @@ -100,7 +100,7 @@ backend: kda-prefill-backend: "flashkda" kernel-config: '{"enable_cutedsl_warmup":true}' all2all-backend: "flashinfer_nvlink_one_sided" - gpu-memory-utilization: 0.92 + gpu-memory-utilization: 0.95 max-num-seqs: 128 max-num-batched-tokens: 16384 speculative-config: '{"method":"dspark","model":"/tmp/Kimi-K3-DSpark","num_speculative_tokens":2,"attention_backend":"FLASHINFER_MLA","draft_sample_method":"probabilistic","rejection_sample_method":"synthetic","synthetic_acceptance_length":2.51}' From e141992d5d75d6413465ea5a9a79ea602ec34714 Mon Sep 17 00:00:00 2001 From: Cam Quilici Date: Wed, 29 Jul 2026 22:23:06 -0500 Subject: [PATCH 28/45] fix(kimik3): reserve DEP graph memory MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Tune GB200 DEP GPU memory utilization to 0.94: the measured 0.95 setting cleared the full-context KV admission gate but exhausted CUDA memory during MRV2 graph capture. 中文:将 GB200 DEP 的 GPU 显存利用率调至 0.94;实测 0.95 虽能通过完整上下文的 KV 缓存准入检查,但会在 MRV2 CUDA Graph 捕获阶段耗尽显存。 --- .../kimi-k3/agentic/agg-gb200-dep16-throughput-agentic.yaml | 2 +- .../agg-gb200-dep16-throughput-vllm-simple-offload-agentic.yaml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/benchmarks/multi_node/srt-slurm-recipes/vllm/kimi-k3/agentic/agg-gb200-dep16-throughput-agentic.yaml b/benchmarks/multi_node/srt-slurm-recipes/vllm/kimi-k3/agentic/agg-gb200-dep16-throughput-agentic.yaml index bb215076d7..d98c42779a 100644 --- a/benchmarks/multi_node/srt-slurm-recipes/vllm/kimi-k3/agentic/agg-gb200-dep16-throughput-agentic.yaml +++ b/benchmarks/multi_node/srt-slurm-recipes/vllm/kimi-k3/agentic/agg-gb200-dep16-throughput-agentic.yaml @@ -98,7 +98,7 @@ backend: kda-prefill-backend: "flashkda" kernel-config: '{"enable_cutedsl_warmup":true}' all2all-backend: "flashinfer_nvlink_one_sided" - gpu-memory-utilization: 0.95 + gpu-memory-utilization: 0.94 max-num-seqs: 128 max-num-batched-tokens: 16384 speculative-config: '{"method":"dspark","model":"/tmp/Kimi-K3-DSpark","num_speculative_tokens":2,"attention_backend":"FLASHINFER_MLA","draft_sample_method":"probabilistic","rejection_sample_method":"synthetic","synthetic_acceptance_length":2.51}' diff --git a/benchmarks/multi_node/srt-slurm-recipes/vllm/kimi-k3/agentic/agg-gb200-dep16-throughput-vllm-simple-offload-agentic.yaml b/benchmarks/multi_node/srt-slurm-recipes/vllm/kimi-k3/agentic/agg-gb200-dep16-throughput-vllm-simple-offload-agentic.yaml index fe44983ace..17571ad60a 100644 --- a/benchmarks/multi_node/srt-slurm-recipes/vllm/kimi-k3/agentic/agg-gb200-dep16-throughput-vllm-simple-offload-agentic.yaml +++ b/benchmarks/multi_node/srt-slurm-recipes/vllm/kimi-k3/agentic/agg-gb200-dep16-throughput-vllm-simple-offload-agentic.yaml @@ -100,7 +100,7 @@ backend: kda-prefill-backend: "flashkda" kernel-config: '{"enable_cutedsl_warmup":true}' all2all-backend: "flashinfer_nvlink_one_sided" - gpu-memory-utilization: 0.95 + gpu-memory-utilization: 0.94 max-num-seqs: 128 max-num-batched-tokens: 16384 speculative-config: '{"method":"dspark","model":"/tmp/Kimi-K3-DSpark","num_speculative_tokens":2,"attention_backend":"FLASHINFER_MLA","draft_sample_method":"probabilistic","rejection_sample_method":"synthetic","synthetic_acceptance_length":2.51}' From c6841ed6dbb7465cac899928d70c07bb69d7cc5a Mon Sep 17 00:00:00 2001 From: Cam Quilici Date: Wed, 29 Jul 2026 22:48:00 -0500 Subject: [PATCH 29/45] fix(kimik3): use piecewise DEP graphs MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Keep MRV2 PIECEWISE CUDA graphs for GB200 DEP while disabling the FULL capture phase that OOMs after full-context KV allocation. This follows existing GB200 AgentX recipe practice and avoids eager execution. 中文:GB200 DEP 保留 MRV2 PIECEWISE CUDA Graph,同时禁用在完整上下文 KV 缓存分配后触发显存溢出的 FULL 捕获阶段。该设置沿用仓库现有 GB200 AgentX 配置,并避免退回纯 eager 执行。 --- .../kimi-k3/agentic/agg-gb200-dep16-throughput-agentic.yaml | 2 +- .../agg-gb200-dep16-throughput-vllm-simple-offload-agentic.yaml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/benchmarks/multi_node/srt-slurm-recipes/vllm/kimi-k3/agentic/agg-gb200-dep16-throughput-agentic.yaml b/benchmarks/multi_node/srt-slurm-recipes/vllm/kimi-k3/agentic/agg-gb200-dep16-throughput-agentic.yaml index d98c42779a..5c8e51c456 100644 --- a/benchmarks/multi_node/srt-slurm-recipes/vllm/kimi-k3/agentic/agg-gb200-dep16-throughput-agentic.yaml +++ b/benchmarks/multi_node/srt-slurm-recipes/vllm/kimi-k3/agentic/agg-gb200-dep16-throughput-agentic.yaml @@ -102,7 +102,7 @@ backend: max-num-seqs: 128 max-num-batched-tokens: 16384 speculative-config: '{"method":"dspark","model":"/tmp/Kimi-K3-DSpark","num_speculative_tokens":2,"attention_backend":"FLASHINFER_MLA","draft_sample_method":"probabilistic","rejection_sample_method":"synthetic","synthetic_acceptance_length":2.51}' - compilation-config: '{"cudagraph_capture_sizes":[3,6,9,12,15,18,21,24,27,30,33,36,39,42,45,48,51,54,57,60,63,66,69,72,75,78,81,84,87,90,93,96,99,102,105,108,111,114,117,120,123,126,129,132,135,138,141,144,147,150,153,156,159,162,165,168,171,174,177,180,183,186,189,192,195,198,201,204,207,210,213,216,219,222,225,228,231,234,237,240,243,246,249,252,255,258,261,264,267,270,273,276,279,282,285,288,291,294,297,300,303,306,309,312,315,318,321,324,327,330,333,336,339,342,345,348,351,354,357,360,363,366,369,372,375,378,381,384]}' + compilation-config: '{"cudagraph_mode":"PIECEWISE","cudagraph_capture_sizes":[3,6,9,12,15,18,21,24,27,30,33,36,39,42,45,48,51,54,57,60,63,66,69,72,75,78,81,84,87,90,93,96,99,102,105,108,111,114,117,120,123,126,129,132,135,138,141,144,147,150,153,156,159,162,165,168,171,174,177,180,183,186,189,192,195,198,201,204,207,210,213,216,219,222,225,228,231,234,237,240,243,246,249,252,255,258,261,264,267,270,273,276,279,282,285,288,291,294,297,300,303,306,309,312,315,318,321,324,327,330,333,336,339,342,345,348,351,354,357,360,363,366,369,372,375,378,381,384]}' block-size: 64 language-model-only: true disable-custom-all-reduce: true diff --git a/benchmarks/multi_node/srt-slurm-recipes/vllm/kimi-k3/agentic/agg-gb200-dep16-throughput-vllm-simple-offload-agentic.yaml b/benchmarks/multi_node/srt-slurm-recipes/vllm/kimi-k3/agentic/agg-gb200-dep16-throughput-vllm-simple-offload-agentic.yaml index 17571ad60a..450a8b069a 100644 --- a/benchmarks/multi_node/srt-slurm-recipes/vllm/kimi-k3/agentic/agg-gb200-dep16-throughput-vllm-simple-offload-agentic.yaml +++ b/benchmarks/multi_node/srt-slurm-recipes/vllm/kimi-k3/agentic/agg-gb200-dep16-throughput-vllm-simple-offload-agentic.yaml @@ -104,7 +104,7 @@ backend: max-num-seqs: 128 max-num-batched-tokens: 16384 speculative-config: '{"method":"dspark","model":"/tmp/Kimi-K3-DSpark","num_speculative_tokens":2,"attention_backend":"FLASHINFER_MLA","draft_sample_method":"probabilistic","rejection_sample_method":"synthetic","synthetic_acceptance_length":2.51}' - compilation-config: '{"cudagraph_capture_sizes":[3,6,9,12,15,18,21,24,27,30,33,36,39,42,45,48,51,54,57,60,63,66,69,72,75,78,81,84,87,90,93,96,99,102,105,108,111,114,117,120,123,126,129,132,135,138,141,144,147,150,153,156,159,162,165,168,171,174,177,180,183,186,189,192,195,198,201,204,207,210,213,216,219,222,225,228,231,234,237,240,243,246,249,252,255,258,261,264,267,270,273,276,279,282,285,288,291,294,297,300,303,306,309,312,315,318,321,324,327,330,333,336,339,342,345,348,351,354,357,360,363,366,369,372,375,378,381,384]}' + compilation-config: '{"cudagraph_mode":"PIECEWISE","cudagraph_capture_sizes":[3,6,9,12,15,18,21,24,27,30,33,36,39,42,45,48,51,54,57,60,63,66,69,72,75,78,81,84,87,90,93,96,99,102,105,108,111,114,117,120,123,126,129,132,135,138,141,144,147,150,153,156,159,162,165,168,171,174,177,180,183,186,189,192,195,198,201,204,207,210,213,216,219,222,225,228,231,234,237,240,243,246,249,252,255,258,261,264,267,270,273,276,279,282,285,288,291,294,297,300,303,306,309,312,315,318,321,324,327,330,333,336,339,342,345,348,351,354,357,360,363,366,369,372,375,378,381,384]}' block-size: 64 language-model-only: true disable-custom-all-reduce: true From 608e9c04ef0363f8edecc89b2b9c58f193658bc5 Mon Sep 17 00:00:00 2001 From: Cam Quilici Date: Wed, 29 Jul 2026 23:34:07 -0500 Subject: [PATCH 30/45] fix(kimik3): stabilize DSpark DEP MoE MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Use the supported FlashInfer TRT-LLM MoE backend for Kimi K3 DSpark DEP after DeepGEMM grid barriers timed out under MRV2 with one-sided all-to-all. Preserve the default 1M context, DEP16 topology, DSpark, and the one-sided FlashInfer all-to-all path. 中文:Kimi K3 DSpark DEP 在 MRV2 与单边 FlashInfer all-to-all 组合下触发 DeepGEMM 网格屏障超时,因此改用受支持的 FlashInfer TRT-LLM MoE 后端;保持默认 1M 上下文、DEP16 拓扑、DSpark 和单边 all-to-all 不变。 --- .../kimi-k3/agentic/agg-gb200-dep16-throughput-agentic.yaml | 4 +++- ...gg-gb200-dep16-throughput-vllm-simple-offload-agentic.yaml | 4 +++- perf-changelog.yaml | 1 + 3 files changed, 7 insertions(+), 2 deletions(-) diff --git a/benchmarks/multi_node/srt-slurm-recipes/vllm/kimi-k3/agentic/agg-gb200-dep16-throughput-agentic.yaml b/benchmarks/multi_node/srt-slurm-recipes/vllm/kimi-k3/agentic/agg-gb200-dep16-throughput-agentic.yaml index 5c8e51c456..39a489dfc3 100644 --- a/benchmarks/multi_node/srt-slurm-recipes/vllm/kimi-k3/agentic/agg-gb200-dep16-throughput-agentic.yaml +++ b/benchmarks/multi_node/srt-slurm-recipes/vllm/kimi-k3/agentic/agg-gb200-dep16-throughput-agentic.yaml @@ -94,7 +94,9 @@ backend: kv-cache-dtype: "fp8" attention-backend: "FLASHINFER_MLA" attention-config: '{"mla_prefill_backend":"TRTLLM_RAGGED","use_prefill_query_quantization":true}' - moe-backend: "deep_gemm_mega_moe" + # DeepGEMM mega-MoE grid barriers time out under DSpark MRV2 with the + # one-sided all-to-all worker; use the supported Kimi K3 FlashInfer path. + moe-backend: "flashinfer_trtllm" kda-prefill-backend: "flashkda" kernel-config: '{"enable_cutedsl_warmup":true}' all2all-backend: "flashinfer_nvlink_one_sided" diff --git a/benchmarks/multi_node/srt-slurm-recipes/vllm/kimi-k3/agentic/agg-gb200-dep16-throughput-vllm-simple-offload-agentic.yaml b/benchmarks/multi_node/srt-slurm-recipes/vllm/kimi-k3/agentic/agg-gb200-dep16-throughput-vllm-simple-offload-agentic.yaml index 450a8b069a..d5e081d4cc 100644 --- a/benchmarks/multi_node/srt-slurm-recipes/vllm/kimi-k3/agentic/agg-gb200-dep16-throughput-vllm-simple-offload-agentic.yaml +++ b/benchmarks/multi_node/srt-slurm-recipes/vllm/kimi-k3/agentic/agg-gb200-dep16-throughput-vllm-simple-offload-agentic.yaml @@ -96,7 +96,9 @@ backend: kv-cache-dtype: "fp8" attention-backend: "FLASHINFER_MLA" attention-config: '{"mla_prefill_backend":"TRTLLM_RAGGED","use_prefill_query_quantization":true}' - moe-backend: "deep_gemm_mega_moe" + # DeepGEMM mega-MoE grid barriers time out under DSpark MRV2 with the + # one-sided all-to-all worker; use the supported Kimi K3 FlashInfer path. + moe-backend: "flashinfer_trtllm" kda-prefill-backend: "flashkda" kernel-config: '{"enable_cutedsl_warmup":true}' all2all-backend: "flashinfer_nvlink_one_sided" diff --git a/perf-changelog.yaml b/perf-changelog.yaml index 8b1059bd91..c4bb74cbfc 100644 --- a/perf-changelog.yaml +++ b/perf-changelog.yaml @@ -5319,4 +5319,5 @@ - "Test vLLM Simple CPU KV offloading on the Kimi K3 GB200 DEP16 throughput profile at AgentX concurrency 128, 192, 256, and 384." - "Correct the pure TP16 result identity to EP1 so it remains distinct from the TEP16 point at concurrency 8." - "Use the upstream vllm/vllm-openai:kimi-k3 image with the official Dynamo v1.4.0-kimi-k3-dev.1 preview installed in-container, and enable Kimi K3 DSpark level 2 with the prescribed 2.51 golden acceptance length." + - "Use FlashInfer TRT-LLM MoE for DSpark DEP to avoid DeepGEMM grid-barrier failures under MRV2." pr-link: https://github.com/SemiAnalysisAI/InferenceX/pull/2404 From d59888609615f789097c54ace8488d18fdebc0c3 Mon Sep 17 00:00:00 2001 From: Cam Quilici Date: Wed, 29 Jul 2026 23:58:44 -0500 Subject: [PATCH 31/45] fix(agentx): reduce Kimi K3 DEP load memory MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Use the standard safetensors loader for GB200 DEP recipes so FlashInfer MoE and DSpark do not exhaust transient HBM in the fastsafetensors GPU-staging path. 中文:GB200 DEP 配置改用标准 safetensors 加载器,避免 FlashInfer MoE 与 DSpark 在 fastsafetensors GPU 暂存阶段耗尽瞬时 HBM。 --- .../kimi-k3/agentic/agg-gb200-dep16-throughput-agentic.yaml | 4 +++- ...gg-gb200-dep16-throughput-vllm-simple-offload-agentic.yaml | 4 +++- perf-changelog.yaml | 1 + 3 files changed, 7 insertions(+), 2 deletions(-) diff --git a/benchmarks/multi_node/srt-slurm-recipes/vllm/kimi-k3/agentic/agg-gb200-dep16-throughput-agentic.yaml b/benchmarks/multi_node/srt-slurm-recipes/vllm/kimi-k3/agentic/agg-gb200-dep16-throughput-agentic.yaml index 39a489dfc3..db85974807 100644 --- a/benchmarks/multi_node/srt-slurm-recipes/vllm/kimi-k3/agentic/agg-gb200-dep16-throughput-agentic.yaml +++ b/benchmarks/multi_node/srt-slurm-recipes/vllm/kimi-k3/agentic/agg-gb200-dep16-throughput-agentic.yaml @@ -89,7 +89,9 @@ backend: data-parallel-rpc-port: 13345 enable-expert-parallel: true trust-remote-code: true - load-format: "fastsafetensors" + # FlashInfer's larger TP4 MoE representation leaves too little transient + # HBM for fastsafetensors' GPU-staging path when DSpark is loaded. + load-format: "safetensors" safetensors-load-strategy: "lazy" kv-cache-dtype: "fp8" attention-backend: "FLASHINFER_MLA" diff --git a/benchmarks/multi_node/srt-slurm-recipes/vllm/kimi-k3/agentic/agg-gb200-dep16-throughput-vllm-simple-offload-agentic.yaml b/benchmarks/multi_node/srt-slurm-recipes/vllm/kimi-k3/agentic/agg-gb200-dep16-throughput-vllm-simple-offload-agentic.yaml index d5e081d4cc..6f488d0ee9 100644 --- a/benchmarks/multi_node/srt-slurm-recipes/vllm/kimi-k3/agentic/agg-gb200-dep16-throughput-vllm-simple-offload-agentic.yaml +++ b/benchmarks/multi_node/srt-slurm-recipes/vllm/kimi-k3/agentic/agg-gb200-dep16-throughput-vllm-simple-offload-agentic.yaml @@ -91,7 +91,9 @@ backend: data-parallel-rpc-port: 13345 enable-expert-parallel: true trust-remote-code: true - load-format: "fastsafetensors" + # FlashInfer's larger TP4 MoE representation leaves too little transient + # HBM for fastsafetensors' GPU-staging path when DSpark is loaded. + load-format: "safetensors" safetensors-load-strategy: "lazy" kv-cache-dtype: "fp8" attention-backend: "FLASHINFER_MLA" diff --git a/perf-changelog.yaml b/perf-changelog.yaml index c4bb74cbfc..754c6ab9e1 100644 --- a/perf-changelog.yaml +++ b/perf-changelog.yaml @@ -5320,4 +5320,5 @@ - "Correct the pure TP16 result identity to EP1 so it remains distinct from the TEP16 point at concurrency 8." - "Use the upstream vllm/vllm-openai:kimi-k3 image with the official Dynamo v1.4.0-kimi-k3-dev.1 preview installed in-container, and enable Kimi K3 DSpark level 2 with the prescribed 2.51 golden acceptance length." - "Use FlashInfer TRT-LLM MoE for DSpark DEP to avoid DeepGEMM grid-barrier failures under MRV2." + - "Load DEP weights with standard safetensors to avoid fastsafetensors transient HBM exhaustion with FlashInfer MoE." pr-link: https://github.com/SemiAnalysisAI/InferenceX/pull/2404 From 459549326c6c8dd220f2307c7c67acdd37081c6f Mon Sep 17 00:00:00 2001 From: Cam Quilici Date: Thu, 30 Jul 2026 00:29:39 -0500 Subject: [PATCH 32/45] fix(agentx): right-size Kimi K3 DEP graphs MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Limit regular DEP captures to 64 sequences per engine and offload captures to 96, matching the highest configured global concurrencies under DP4 while retaining the default 1M context. 中文:按 DP4 下配置的最高全局并发量,将常规 DEP 的每引擎 CUDA Graph 捕获上限设为 64,将卸载配置设为 96;保留默认 1M 上下文,并为 FlashInfer MoE 运行时工作区释放显存。 --- .../agentic/agg-gb200-dep16-throughput-agentic.yaml | 7 +++++-- ...gb200-dep16-throughput-vllm-simple-offload-agentic.yaml | 6 ++++-- perf-changelog.yaml | 1 + 3 files changed, 10 insertions(+), 4 deletions(-) diff --git a/benchmarks/multi_node/srt-slurm-recipes/vllm/kimi-k3/agentic/agg-gb200-dep16-throughput-agentic.yaml b/benchmarks/multi_node/srt-slurm-recipes/vllm/kimi-k3/agentic/agg-gb200-dep16-throughput-agentic.yaml index db85974807..4e44fe5af5 100644 --- a/benchmarks/multi_node/srt-slurm-recipes/vllm/kimi-k3/agentic/agg-gb200-dep16-throughput-agentic.yaml +++ b/benchmarks/multi_node/srt-slurm-recipes/vllm/kimi-k3/agentic/agg-gb200-dep16-throughput-agentic.yaml @@ -103,10 +103,13 @@ backend: kernel-config: '{"enable_cutedsl_warmup":true}' all2all-backend: "flashinfer_nvlink_one_sided" gpu-memory-utilization: 0.94 - max-num-seqs: 128 + # The largest regular DEP point is c256 / DP4 = 64 sequences per engine. + # Capturing 128 sequence slots consumes 10.9 GiB and leaves too little + # runtime workspace for FlashInfer's MXFP4 MoE kernel. + max-num-seqs: 64 max-num-batched-tokens: 16384 speculative-config: '{"method":"dspark","model":"/tmp/Kimi-K3-DSpark","num_speculative_tokens":2,"attention_backend":"FLASHINFER_MLA","draft_sample_method":"probabilistic","rejection_sample_method":"synthetic","synthetic_acceptance_length":2.51}' - compilation-config: '{"cudagraph_mode":"PIECEWISE","cudagraph_capture_sizes":[3,6,9,12,15,18,21,24,27,30,33,36,39,42,45,48,51,54,57,60,63,66,69,72,75,78,81,84,87,90,93,96,99,102,105,108,111,114,117,120,123,126,129,132,135,138,141,144,147,150,153,156,159,162,165,168,171,174,177,180,183,186,189,192,195,198,201,204,207,210,213,216,219,222,225,228,231,234,237,240,243,246,249,252,255,258,261,264,267,270,273,276,279,282,285,288,291,294,297,300,303,306,309,312,315,318,321,324,327,330,333,336,339,342,345,348,351,354,357,360,363,366,369,372,375,378,381,384]}' + compilation-config: '{"cudagraph_mode":"PIECEWISE","cudagraph_capture_sizes":[3,6,9,12,15,18,21,24,27,30,33,36,39,42,45,48,51,54,57,60,63,66,69,72,75,78,81,84,87,90,93,96,99,102,105,108,111,114,117,120,123,126,129,132,135,138,141,144,147,150,153,156,159,162,165,168,171,174,177,180,183,186,189,192]}' block-size: 64 language-model-only: true disable-custom-all-reduce: true diff --git a/benchmarks/multi_node/srt-slurm-recipes/vllm/kimi-k3/agentic/agg-gb200-dep16-throughput-vllm-simple-offload-agentic.yaml b/benchmarks/multi_node/srt-slurm-recipes/vllm/kimi-k3/agentic/agg-gb200-dep16-throughput-vllm-simple-offload-agentic.yaml index 6f488d0ee9..dac926a98e 100644 --- a/benchmarks/multi_node/srt-slurm-recipes/vllm/kimi-k3/agentic/agg-gb200-dep16-throughput-vllm-simple-offload-agentic.yaml +++ b/benchmarks/multi_node/srt-slurm-recipes/vllm/kimi-k3/agentic/agg-gb200-dep16-throughput-vllm-simple-offload-agentic.yaml @@ -105,10 +105,12 @@ backend: kernel-config: '{"enable_cutedsl_warmup":true}' all2all-backend: "flashinfer_nvlink_one_sided" gpu-memory-utilization: 0.94 - max-num-seqs: 128 + # The largest offload point is c384 / DP4 = 96 sequences per engine. + # Do not reserve graph memory for the unused 97-128 sequence range. + max-num-seqs: 96 max-num-batched-tokens: 16384 speculative-config: '{"method":"dspark","model":"/tmp/Kimi-K3-DSpark","num_speculative_tokens":2,"attention_backend":"FLASHINFER_MLA","draft_sample_method":"probabilistic","rejection_sample_method":"synthetic","synthetic_acceptance_length":2.51}' - compilation-config: '{"cudagraph_mode":"PIECEWISE","cudagraph_capture_sizes":[3,6,9,12,15,18,21,24,27,30,33,36,39,42,45,48,51,54,57,60,63,66,69,72,75,78,81,84,87,90,93,96,99,102,105,108,111,114,117,120,123,126,129,132,135,138,141,144,147,150,153,156,159,162,165,168,171,174,177,180,183,186,189,192,195,198,201,204,207,210,213,216,219,222,225,228,231,234,237,240,243,246,249,252,255,258,261,264,267,270,273,276,279,282,285,288,291,294,297,300,303,306,309,312,315,318,321,324,327,330,333,336,339,342,345,348,351,354,357,360,363,366,369,372,375,378,381,384]}' + compilation-config: '{"cudagraph_mode":"PIECEWISE","cudagraph_capture_sizes":[3,6,9,12,15,18,21,24,27,30,33,36,39,42,45,48,51,54,57,60,63,66,69,72,75,78,81,84,87,90,93,96,99,102,105,108,111,114,117,120,123,126,129,132,135,138,141,144,147,150,153,156,159,162,165,168,171,174,177,180,183,186,189,192,195,198,201,204,207,210,213,216,219,222,225,228,231,234,237,240,243,246,249,252,255,258,261,264,267,270,273,276,279,282,285,288]}' block-size: 64 language-model-only: true disable-custom-all-reduce: true diff --git a/perf-changelog.yaml b/perf-changelog.yaml index 754c6ab9e1..ab37f7c1db 100644 --- a/perf-changelog.yaml +++ b/perf-changelog.yaml @@ -5321,4 +5321,5 @@ - "Use the upstream vllm/vllm-openai:kimi-k3 image with the official Dynamo v1.4.0-kimi-k3-dev.1 preview installed in-container, and enable Kimi K3 DSpark level 2 with the prescribed 2.51 golden acceptance length." - "Use FlashInfer TRT-LLM MoE for DSpark DEP to avoid DeepGEMM grid-barrier failures under MRV2." - "Load DEP weights with standard safetensors to avoid fastsafetensors transient HBM exhaustion with FlashInfer MoE." + - "Size DEP CUDA-graph captures to the actual per-engine frontier concurrency (64 regular, 96 offload), preserving the full 1M context while leaving FlashInfer runtime workspace." pr-link: https://github.com/SemiAnalysisAI/InferenceX/pull/2404 From dce65671466bd037f6fe29b999d3ef4b47eeec49 Mon Sep 17 00:00:00 2001 From: Cam Quilici Date: Thu, 30 Jul 2026 00:57:28 -0500 Subject: [PATCH 33/45] fix(agentx): report pinned Dynamo version MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Align all Kimi K3 GB200 recipe identities and the master-config router label with the 1.3.0 version reported by the pinned K3-enabled source checkout. 中文:将所有 Kimi K3 GB200 配方身份信息及主配置中的路由版本统一为固定 K3 源码构建实际报告的 1.3.0。 --- .../kimi-k3/agentic/agg-gb200-dep16-throughput-agentic.yaml | 2 +- .../agg-gb200-dep16-throughput-vllm-simple-offload-agentic.yaml | 2 +- .../vllm/kimi-k3/agentic/agg-gb200-tep16-balanced-agentic.yaml | 2 +- .../vllm/kimi-k3/agentic/agg-gb200-tp16-latency-agentic.yaml | 2 +- configs/nvidia-master.yaml | 2 +- perf-changelog.yaml | 2 +- 6 files changed, 6 insertions(+), 6 deletions(-) diff --git a/benchmarks/multi_node/srt-slurm-recipes/vllm/kimi-k3/agentic/agg-gb200-dep16-throughput-agentic.yaml b/benchmarks/multi_node/srt-slurm-recipes/vllm/kimi-k3/agentic/agg-gb200-dep16-throughput-agentic.yaml index 4e44fe5af5..5725d086da 100644 --- a/benchmarks/multi_node/srt-slurm-recipes/vllm/kimi-k3/agentic/agg-gb200-dep16-throughput-agentic.yaml +++ b/benchmarks/multi_node/srt-slurm-recipes/vllm/kimi-k3/agentic/agg-gb200-dep16-throughput-agentic.yaml @@ -15,7 +15,7 @@ identity: container: image: "vllm/vllm-openai:kimi-k3" frameworks: - dynamo: "1.4.0-kimi-k3-dev.1" + dynamo: "1.3.0" dynamo: hash: "ba83080ecd31c1ce918559e576d3c5bc9e092ff1" diff --git a/benchmarks/multi_node/srt-slurm-recipes/vllm/kimi-k3/agentic/agg-gb200-dep16-throughput-vllm-simple-offload-agentic.yaml b/benchmarks/multi_node/srt-slurm-recipes/vllm/kimi-k3/agentic/agg-gb200-dep16-throughput-vllm-simple-offload-agentic.yaml index dac926a98e..028afe2cd3 100644 --- a/benchmarks/multi_node/srt-slurm-recipes/vllm/kimi-k3/agentic/agg-gb200-dep16-throughput-vllm-simple-offload-agentic.yaml +++ b/benchmarks/multi_node/srt-slurm-recipes/vllm/kimi-k3/agentic/agg-gb200-dep16-throughput-vllm-simple-offload-agentic.yaml @@ -16,7 +16,7 @@ identity: container: image: "vllm/vllm-openai:kimi-k3" frameworks: - dynamo: "1.4.0-kimi-k3-dev.1" + dynamo: "1.3.0" dynamo: hash: "ba83080ecd31c1ce918559e576d3c5bc9e092ff1" diff --git a/benchmarks/multi_node/srt-slurm-recipes/vllm/kimi-k3/agentic/agg-gb200-tep16-balanced-agentic.yaml b/benchmarks/multi_node/srt-slurm-recipes/vllm/kimi-k3/agentic/agg-gb200-tep16-balanced-agentic.yaml index fb136c6ec7..4fd567efa1 100644 --- a/benchmarks/multi_node/srt-slurm-recipes/vllm/kimi-k3/agentic/agg-gb200-tep16-balanced-agentic.yaml +++ b/benchmarks/multi_node/srt-slurm-recipes/vllm/kimi-k3/agentic/agg-gb200-tep16-balanced-agentic.yaml @@ -16,7 +16,7 @@ identity: container: image: "vllm/vllm-openai:kimi-k3" frameworks: - dynamo: "1.4.0-kimi-k3-dev.1" + dynamo: "1.3.0" dynamo: hash: "ba83080ecd31c1ce918559e576d3c5bc9e092ff1" diff --git a/benchmarks/multi_node/srt-slurm-recipes/vllm/kimi-k3/agentic/agg-gb200-tp16-latency-agentic.yaml b/benchmarks/multi_node/srt-slurm-recipes/vllm/kimi-k3/agentic/agg-gb200-tp16-latency-agentic.yaml index 38d116142f..16b40bbae5 100644 --- a/benchmarks/multi_node/srt-slurm-recipes/vllm/kimi-k3/agentic/agg-gb200-tp16-latency-agentic.yaml +++ b/benchmarks/multi_node/srt-slurm-recipes/vllm/kimi-k3/agentic/agg-gb200-tp16-latency-agentic.yaml @@ -15,7 +15,7 @@ identity: container: image: "vllm/vllm-openai:kimi-k3" frameworks: - dynamo: "1.4.0-kimi-k3-dev.1" + dynamo: "1.3.0" dynamo: hash: "ba83080ecd31c1ce918559e576d3c5bc9e092ff1" diff --git a/configs/nvidia-master.yaml b/configs/nvidia-master.yaml index 1bb1ff37aa..f06478ac87 100644 --- a/configs/nvidia-master.yaml +++ b/configs/nvidia-master.yaml @@ -8708,7 +8708,7 @@ kimik3-fp4-gb200-dynamo-vllm-agentic: runner: cluster:gb200-nv precision: fp4 framework: dynamo-vllm - router: { name: dynamo-router, version: "1.4.0-kimi-k3-dev.1" } + router: { name: dynamo-router, version: "1.3.0" } multinode: true disagg: false scenarios: diff --git a/perf-changelog.yaml b/perf-changelog.yaml index ab37f7c1db..873747d2f3 100644 --- a/perf-changelog.yaml +++ b/perf-changelog.yaml @@ -5318,7 +5318,7 @@ - "Add Kimi K3 MXFP4 GB200 AgentX performance points following the official vLLM recipe: TP16 (conc 1-8), TEP16 (conc 8-32), and TP4 x DP4 = EP16 (conc 32-256). https://recipes.vllm.ai/moonshotai/Kimi-K3?hardware=gb200" - "Test vLLM Simple CPU KV offloading on the Kimi K3 GB200 DEP16 throughput profile at AgentX concurrency 128, 192, 256, and 384." - "Correct the pure TP16 result identity to EP1 so it remains distinct from the TEP16 point at concurrency 8." - - "Use the upstream vllm/vllm-openai:kimi-k3 image with the official Dynamo v1.4.0-kimi-k3-dev.1 preview installed in-container, and enable Kimi K3 DSpark level 2 with the prescribed 2.51 golden acceptance length." + - "Use the upstream vllm/vllm-openai:kimi-k3 image with the pinned Kimi K3-enabled Dynamo 1.3.0 source build installed in-container, and enable Kimi K3 DSpark level 2 with the prescribed 2.51 golden acceptance length." - "Use FlashInfer TRT-LLM MoE for DSpark DEP to avoid DeepGEMM grid-barrier failures under MRV2." - "Load DEP weights with standard safetensors to avoid fastsafetensors transient HBM exhaustion with FlashInfer MoE." - "Size DEP CUDA-graph captures to the actual per-engine frontier concurrency (64 regular, 96 offload), preserving the full 1M context while leaving FlashInfer runtime workspace." From 419272238b61ad854c1024dab9320f2627a6c044 Mon Sep 17 00:00:00 2001 From: Cam Quilici Date: Thu, 30 Jul 2026 01:24:50 -0500 Subject: [PATCH 34/45] fix(agentx): reduce offload graph residency MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Capture even DSpark sequence counts through the c384 DP4 steady state. This preserves every configured steady-state batch while releasing the HBM needed by the FlashInfer MXFP4 MoE workspace. 中文:按偶数序列数捕获 DSpark CUDA Graph,覆盖 c384/DP4 稳态批次;保留所有已配置稳态点,同时释放 FlashInfer MXFP4 MoE 工作区所需显存。 --- ...g-gb200-dep16-throughput-vllm-simple-offload-agentic.yaml | 5 +++-- perf-changelog.yaml | 2 +- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/benchmarks/multi_node/srt-slurm-recipes/vllm/kimi-k3/agentic/agg-gb200-dep16-throughput-vllm-simple-offload-agentic.yaml b/benchmarks/multi_node/srt-slurm-recipes/vllm/kimi-k3/agentic/agg-gb200-dep16-throughput-vllm-simple-offload-agentic.yaml index 028afe2cd3..b6a6d19367 100644 --- a/benchmarks/multi_node/srt-slurm-recipes/vllm/kimi-k3/agentic/agg-gb200-dep16-throughput-vllm-simple-offload-agentic.yaml +++ b/benchmarks/multi_node/srt-slurm-recipes/vllm/kimi-k3/agentic/agg-gb200-dep16-throughput-vllm-simple-offload-agentic.yaml @@ -106,11 +106,12 @@ backend: all2all-backend: "flashinfer_nvlink_one_sided" gpu-memory-utilization: 0.94 # The largest offload point is c384 / DP4 = 96 sequences per engine. - # Do not reserve graph memory for the unused 97-128 sequence range. + # Capture even sequence counts: all configured DP4 steady-state batch + # sizes are exact hits, while odd loads pad by at most one sequence. max-num-seqs: 96 max-num-batched-tokens: 16384 speculative-config: '{"method":"dspark","model":"/tmp/Kimi-K3-DSpark","num_speculative_tokens":2,"attention_backend":"FLASHINFER_MLA","draft_sample_method":"probabilistic","rejection_sample_method":"synthetic","synthetic_acceptance_length":2.51}' - compilation-config: '{"cudagraph_mode":"PIECEWISE","cudagraph_capture_sizes":[3,6,9,12,15,18,21,24,27,30,33,36,39,42,45,48,51,54,57,60,63,66,69,72,75,78,81,84,87,90,93,96,99,102,105,108,111,114,117,120,123,126,129,132,135,138,141,144,147,150,153,156,159,162,165,168,171,174,177,180,183,186,189,192,195,198,201,204,207,210,213,216,219,222,225,228,231,234,237,240,243,246,249,252,255,258,261,264,267,270,273,276,279,282,285,288]}' + compilation-config: '{"cudagraph_mode":"PIECEWISE","cudagraph_capture_sizes":[6,12,18,24,30,36,42,48,54,60,66,72,78,84,90,96,102,108,114,120,126,132,138,144,150,156,162,168,174,180,186,192,198,204,210,216,222,228,234,240,246,252,258,264,270,276,282,288]}' block-size: 64 language-model-only: true disable-custom-all-reduce: true diff --git a/perf-changelog.yaml b/perf-changelog.yaml index 873747d2f3..20af0270cb 100644 --- a/perf-changelog.yaml +++ b/perf-changelog.yaml @@ -5321,5 +5321,5 @@ - "Use the upstream vllm/vllm-openai:kimi-k3 image with the pinned Kimi K3-enabled Dynamo 1.3.0 source build installed in-container, and enable Kimi K3 DSpark level 2 with the prescribed 2.51 golden acceptance length." - "Use FlashInfer TRT-LLM MoE for DSpark DEP to avoid DeepGEMM grid-barrier failures under MRV2." - "Load DEP weights with standard safetensors to avoid fastsafetensors transient HBM exhaustion with FlashInfer MoE." - - "Size DEP CUDA-graph captures to the actual per-engine frontier concurrency (64 regular, 96 offload), preserving the full 1M context while leaving FlashInfer runtime workspace." + - "Size DEP CUDA-graph captures to the actual per-engine frontier concurrency (64 regular, 96 offload), using even-sequence captures for the high-concurrency offload arm to preserve the full 1M context while leaving FlashInfer runtime workspace." pr-link: https://github.com/SemiAnalysisAI/InferenceX/pull/2404 From f002be9e0d4b1cd0569eec6ecc4fa66256730baa Mon Sep 17 00:00:00 2001 From: Cam Quilici Date: Thu, 30 Jul 2026 09:28:34 -0500 Subject: [PATCH 35/45] fix(kimik3): extend offload sweep allocation MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Allow the full-context high-concurrency AgentX warmup and one-hour profile to complete by using the GB200 batch partition maximum. 中文:将 Kimi K3 GB200 Simple CPU KV 卸载配方的 Slurm 时限延长至 12 小时,使全上下文高并发 AgentX 预热和一小时性能采集能够完整结束。 --- .../agg-gb200-dep16-throughput-vllm-simple-offload-agentic.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/benchmarks/multi_node/srt-slurm-recipes/vllm/kimi-k3/agentic/agg-gb200-dep16-throughput-vllm-simple-offload-agentic.yaml b/benchmarks/multi_node/srt-slurm-recipes/vllm/kimi-k3/agentic/agg-gb200-dep16-throughput-vllm-simple-offload-agentic.yaml index b6a6d19367..f04d4e12ae 100644 --- a/benchmarks/multi_node/srt-slurm-recipes/vllm/kimi-k3/agentic/agg-gb200-dep16-throughput-vllm-simple-offload-agentic.yaml +++ b/benchmarks/multi_node/srt-slurm-recipes/vllm/kimi-k3/agentic/agg-gb200-dep16-throughput-vllm-simple-offload-agentic.yaml @@ -28,7 +28,7 @@ environment: ETCD_LEASE_TTL: "7200" slurm: - time_limit: "8:00:00" + time_limit: "12:00:00" health_check: max_attempts: 2160 From 447fcaee260919b7f95fd8336a1d61ef3781b12e Mon Sep 17 00:00:00 2001 From: Cam Quilici Date: Thu, 30 Jul 2026 15:40:08 -0500 Subject: [PATCH 36/45] perf(kimik3): report prompt cache reads MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Enable vLLM prompt-token details on every GB200 Kimi K3 AgentX profile so AIPerf can record per-request cached prompt tokens and aggregate cache-read rates. 中文:为所有 GB200 Kimi K3 AgentX 性能配置启用 vLLM prompt-token details,使 AIPerf 能记录每个请求的缓存提示词 token 数及汇总缓存读取率。 --- .../vllm/kimi-k3/agentic/agg-gb200-dep16-throughput-agentic.yaml | 1 + .../agg-gb200-dep16-throughput-vllm-simple-offload-agentic.yaml | 1 + .../vllm/kimi-k3/agentic/agg-gb200-tep16-balanced-agentic.yaml | 1 + .../vllm/kimi-k3/agentic/agg-gb200-tp16-latency-agentic.yaml | 1 + 4 files changed, 4 insertions(+) diff --git a/benchmarks/multi_node/srt-slurm-recipes/vllm/kimi-k3/agentic/agg-gb200-dep16-throughput-agentic.yaml b/benchmarks/multi_node/srt-slurm-recipes/vllm/kimi-k3/agentic/agg-gb200-dep16-throughput-agentic.yaml index 5725d086da..466ffa4c7c 100644 --- a/benchmarks/multi_node/srt-slurm-recipes/vllm/kimi-k3/agentic/agg-gb200-dep16-throughput-agentic.yaml +++ b/benchmarks/multi_node/srt-slurm-recipes/vllm/kimi-k3/agentic/agg-gb200-dep16-throughput-agentic.yaml @@ -114,6 +114,7 @@ backend: language-model-only: true disable-custom-all-reduce: true enable-prefix-caching: true + enable-prompt-tokens-details: true scheduler-cls: "vllm.v1.core.sched.async_scheduler.AsyncScheduler" dyn-tool-call-parser: "kimi_k3" reasoning-parser: "kimi_k3" diff --git a/benchmarks/multi_node/srt-slurm-recipes/vllm/kimi-k3/agentic/agg-gb200-dep16-throughput-vllm-simple-offload-agentic.yaml b/benchmarks/multi_node/srt-slurm-recipes/vllm/kimi-k3/agentic/agg-gb200-dep16-throughput-vllm-simple-offload-agentic.yaml index f04d4e12ae..2af4706911 100644 --- a/benchmarks/multi_node/srt-slurm-recipes/vllm/kimi-k3/agentic/agg-gb200-dep16-throughput-vllm-simple-offload-agentic.yaml +++ b/benchmarks/multi_node/srt-slurm-recipes/vllm/kimi-k3/agentic/agg-gb200-dep16-throughput-vllm-simple-offload-agentic.yaml @@ -116,6 +116,7 @@ backend: language-model-only: true disable-custom-all-reduce: true enable-prefix-caching: true + enable-prompt-tokens-details: true kv-transfer-config: '{"kv_connector":"SimpleCPUOffloadConnector","kv_role":"kv_both","kv_connector_extra_config":{"cpu_bytes_to_use":549755813888,"cpu_bytes_to_use_per_rank":137438953472,"lazy_offload":false}}' scheduler-cls: "vllm.v1.core.sched.async_scheduler.AsyncScheduler" dyn-tool-call-parser: "kimi_k3" diff --git a/benchmarks/multi_node/srt-slurm-recipes/vllm/kimi-k3/agentic/agg-gb200-tep16-balanced-agentic.yaml b/benchmarks/multi_node/srt-slurm-recipes/vllm/kimi-k3/agentic/agg-gb200-tep16-balanced-agentic.yaml index 4fd567efa1..d719c95d80 100644 --- a/benchmarks/multi_node/srt-slurm-recipes/vllm/kimi-k3/agentic/agg-gb200-tep16-balanced-agentic.yaml +++ b/benchmarks/multi_node/srt-slurm-recipes/vllm/kimi-k3/agentic/agg-gb200-tep16-balanced-agentic.yaml @@ -106,6 +106,7 @@ backend: language-model-only: true disable-custom-all-reduce: true enable-prefix-caching: true + enable-prompt-tokens-details: true scheduler-cls: "vllm.v1.core.sched.async_scheduler.AsyncScheduler" dyn-tool-call-parser: "kimi_k3" reasoning-parser: "kimi_k3" diff --git a/benchmarks/multi_node/srt-slurm-recipes/vllm/kimi-k3/agentic/agg-gb200-tp16-latency-agentic.yaml b/benchmarks/multi_node/srt-slurm-recipes/vllm/kimi-k3/agentic/agg-gb200-tp16-latency-agentic.yaml index 16b40bbae5..7ff4620106 100644 --- a/benchmarks/multi_node/srt-slurm-recipes/vllm/kimi-k3/agentic/agg-gb200-tp16-latency-agentic.yaml +++ b/benchmarks/multi_node/srt-slurm-recipes/vllm/kimi-k3/agentic/agg-gb200-tp16-latency-agentic.yaml @@ -103,6 +103,7 @@ backend: language-model-only: true disable-custom-all-reduce: true enable-prefix-caching: true + enable-prompt-tokens-details: true scheduler-cls: "vllm.v1.core.sched.async_scheduler.AsyncScheduler" dyn-tool-call-parser: "kimi_k3" reasoning-parser: "kimi_k3" From d238ef72e5c42beb09a77c934fcde262e46e6c5b Mon Sep 17 00:00:00 2001 From: Cam Quilici Date: Thu, 30 Jul 2026 16:54:10 -0500 Subject: [PATCH 37/45] fix(agentx): align GB200 replay timing MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Pin the same AIPerf warmup-handoff revision used by the Qwen B200 and B300 AgentX PRs. Add a recipe-scoped 300-second per-trace idle-gap cap for all Kimi K3 GB200 profiles while retaining full model context and cached-token reporting. 中文:将 AIPerf 固定到 Qwen B200/B300 AgentX PR 使用的同一预热交接版本。为所有 Kimi K3 GB200 性能配置添加仅配方生效的 300 秒单轨迹空闲间隔上限,同时保留完整模型上下文与缓存 token 上报。 --- benchmarks/benchmark_lib.sh | 13 +++++++++++++ .../agentic/agg-gb200-dep16-throughput-agentic.yaml | 1 + ...ep16-throughput-vllm-simple-offload-agentic.yaml | 1 + .../agentic/agg-gb200-tep16-balanced-agentic.yaml | 1 + .../agentic/agg-gb200-tp16-latency-agentic.yaml | 1 + perf-changelog.yaml | 1 + utils/aiperf | 2 +- 7 files changed, 19 insertions(+), 1 deletion(-) diff --git a/benchmarks/benchmark_lib.sh b/benchmarks/benchmark_lib.sh index 92d0c2eac4..d97373cd69 100644 --- a/benchmarks/benchmark_lib.sh +++ b/benchmarks/benchmark_lib.sh @@ -1743,6 +1743,7 @@ build_replay_cmd() { local result_dir="$1" local duration="$DURATION" local warmup_requests_per_lane="${AIPERF_WARMUP_REQUESTS_PER_LANE:-10}" + local trace_idle_gap_cap_seconds="${AIPERF_TRACE_IDLE_GAP_CAP_SECONDS:-}" # Fast mode minimizes setup by advancing each trajectory lane only once # and shortens profiling to 20 minutes. @@ -1775,6 +1776,18 @@ build_replay_cmd() { REPLAY_CMD+=" --benchmark-duration $duration" REPLAY_CMD+=" --stats-interval 30" REPLAY_CMD+=" --random-seed 42" + # Some long AgentX traces contain recorded request-start gaps that would + # otherwise hold a trajectory lane idle for much longer than the useful + # cache-TTL window. When a recipe opts in, cap those gaps independently + # within each root trace during dataset reconstruction. This changes only + # replay timing; it is not a runtime request timeout. + if [ -n "$trace_idle_gap_cap_seconds" ]; then + if ! [[ "$trace_idle_gap_cap_seconds" =~ ^[0-9]+([.][0-9]+)?$ ]]; then + echo "ERROR: AIPERF_TRACE_IDLE_GAP_CAP_SECONDS must be a non-negative number" >&2 + return 1 + fi + REPLAY_CMD+=" --trace-idle-gap-cap-seconds $trace_idle_gap_cap_seconds" + fi # Fail runs once more than 10% of requests error. This keeps known # transient low-rate failures from killing long sweeps while still # catching malformed payloads or server crashes before they get aggregated diff --git a/benchmarks/multi_node/srt-slurm-recipes/vllm/kimi-k3/agentic/agg-gb200-dep16-throughput-agentic.yaml b/benchmarks/multi_node/srt-slurm-recipes/vllm/kimi-k3/agentic/agg-gb200-dep16-throughput-agentic.yaml index 466ffa4c7c..8b97e3f345 100644 --- a/benchmarks/multi_node/srt-slurm-recipes/vllm/kimi-k3/agentic/agg-gb200-dep16-throughput-agentic.yaml +++ b/benchmarks/multi_node/srt-slurm-recipes/vllm/kimi-k3/agentic/agg-gb200-dep16-throughput-agentic.yaml @@ -134,6 +134,7 @@ benchmark: command: bash /infmax-workspace/benchmarks/multi_node/agentic_srt.sh env: INFMAX_CONTAINER_WORKSPACE: "/infmax-workspace" + AIPERF_TRACE_IDLE_GAP_CAP_SECONDS: "300" RESULT_DIR: "/logs/agentic" PORT: "8000" IS_MULTINODE: "true" diff --git a/benchmarks/multi_node/srt-slurm-recipes/vllm/kimi-k3/agentic/agg-gb200-dep16-throughput-vllm-simple-offload-agentic.yaml b/benchmarks/multi_node/srt-slurm-recipes/vllm/kimi-k3/agentic/agg-gb200-dep16-throughput-vllm-simple-offload-agentic.yaml index 2af4706911..8ce4b1ff0c 100644 --- a/benchmarks/multi_node/srt-slurm-recipes/vllm/kimi-k3/agentic/agg-gb200-dep16-throughput-vllm-simple-offload-agentic.yaml +++ b/benchmarks/multi_node/srt-slurm-recipes/vllm/kimi-k3/agentic/agg-gb200-dep16-throughput-vllm-simple-offload-agentic.yaml @@ -137,6 +137,7 @@ benchmark: command: bash /infmax-workspace/benchmarks/multi_node/agentic_srt.sh env: INFMAX_CONTAINER_WORKSPACE: "/infmax-workspace" + AIPERF_TRACE_IDLE_GAP_CAP_SECONDS: "300" RESULT_DIR: "/logs/agentic" PORT: "8000" IS_MULTINODE: "true" diff --git a/benchmarks/multi_node/srt-slurm-recipes/vllm/kimi-k3/agentic/agg-gb200-tep16-balanced-agentic.yaml b/benchmarks/multi_node/srt-slurm-recipes/vllm/kimi-k3/agentic/agg-gb200-tep16-balanced-agentic.yaml index d719c95d80..461fdf7f7a 100644 --- a/benchmarks/multi_node/srt-slurm-recipes/vllm/kimi-k3/agentic/agg-gb200-tep16-balanced-agentic.yaml +++ b/benchmarks/multi_node/srt-slurm-recipes/vllm/kimi-k3/agentic/agg-gb200-tep16-balanced-agentic.yaml @@ -127,6 +127,7 @@ benchmark: command: bash /infmax-workspace/benchmarks/multi_node/agentic_srt.sh env: INFMAX_CONTAINER_WORKSPACE: "/infmax-workspace" + AIPERF_TRACE_IDLE_GAP_CAP_SECONDS: "300" RESULT_DIR: "/logs/agentic" PORT: "8000" IS_MULTINODE: "true" diff --git a/benchmarks/multi_node/srt-slurm-recipes/vllm/kimi-k3/agentic/agg-gb200-tp16-latency-agentic.yaml b/benchmarks/multi_node/srt-slurm-recipes/vllm/kimi-k3/agentic/agg-gb200-tp16-latency-agentic.yaml index 7ff4620106..a72262a20d 100644 --- a/benchmarks/multi_node/srt-slurm-recipes/vllm/kimi-k3/agentic/agg-gb200-tp16-latency-agentic.yaml +++ b/benchmarks/multi_node/srt-slurm-recipes/vllm/kimi-k3/agentic/agg-gb200-tp16-latency-agentic.yaml @@ -124,6 +124,7 @@ benchmark: command: bash /infmax-workspace/benchmarks/multi_node/agentic_srt.sh env: INFMAX_CONTAINER_WORKSPACE: "/infmax-workspace" + AIPERF_TRACE_IDLE_GAP_CAP_SECONDS: "300" RESULT_DIR: "/logs/agentic" PORT: "8000" IS_MULTINODE: "true" diff --git a/perf-changelog.yaml b/perf-changelog.yaml index d1a6fd63c2..9dd47e466b 100644 --- a/perf-changelog.yaml +++ b/perf-changelog.yaml @@ -5358,4 +5358,5 @@ - "Use FlashInfer TRT-LLM MoE for DSpark DEP to avoid DeepGEMM grid-barrier failures under MRV2." - "Load DEP weights with standard safetensors to avoid fastsafetensors transient HBM exhaustion with FlashInfer MoE." - "Size DEP CUDA-graph captures to the actual per-engine frontier concurrency (64 regular, 96 offload), using even-sequence captures for the high-concurrency offload arm to preserve the full 1M context while leaving FlashInfer runtime workspace." + - "Pin the Qwen B200/B300 AgentX AIPerf warmup-handoff revision, cap recorded per-trace idle gaps at 300 seconds, and report vLLM cached prompt tokens." pr-link: https://github.com/SemiAnalysisAI/InferenceX/pull/2404 diff --git a/utils/aiperf b/utils/aiperf index be758d6218..b6e4ecf4ba 160000 --- a/utils/aiperf +++ b/utils/aiperf @@ -1 +1 @@ -Subproject commit be758d6218268171e2957fbec9d4f557275bca2d +Subproject commit b6e4ecf4ba87ed1ab085380828c464ea601343d2 From 4491f28911e9ddef32c92979c8eae6cdd1f56884 Mon Sep 17 00:00:00 2001 From: Cam Quilici Date: Thu, 30 Jul 2026 17:18:42 -0500 Subject: [PATCH 38/45] fix(agentx): let Dynamo report cached prompt tokens MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Remove the native vLLM OpenAI frontend flag that Dynamo rejects. Dynamo already emits prompt_tokens_details.cached_tokens from RequestOutput for each response. 中文:移除 Dynamo 不支持的原生 vLLM OpenAI 前端参数。Dynamo 已会从每个 RequestOutput 生成 prompt_tokens_details.cached_tokens。 --- .../vllm/kimi-k3/agentic/agg-gb200-dep16-throughput-agentic.yaml | 1 - .../agg-gb200-dep16-throughput-vllm-simple-offload-agentic.yaml | 1 - .../vllm/kimi-k3/agentic/agg-gb200-tep16-balanced-agentic.yaml | 1 - .../vllm/kimi-k3/agentic/agg-gb200-tp16-latency-agentic.yaml | 1 - 4 files changed, 4 deletions(-) diff --git a/benchmarks/multi_node/srt-slurm-recipes/vllm/kimi-k3/agentic/agg-gb200-dep16-throughput-agentic.yaml b/benchmarks/multi_node/srt-slurm-recipes/vllm/kimi-k3/agentic/agg-gb200-dep16-throughput-agentic.yaml index 8b97e3f345..109a0b3d31 100644 --- a/benchmarks/multi_node/srt-slurm-recipes/vllm/kimi-k3/agentic/agg-gb200-dep16-throughput-agentic.yaml +++ b/benchmarks/multi_node/srt-slurm-recipes/vllm/kimi-k3/agentic/agg-gb200-dep16-throughput-agentic.yaml @@ -114,7 +114,6 @@ backend: language-model-only: true disable-custom-all-reduce: true enable-prefix-caching: true - enable-prompt-tokens-details: true scheduler-cls: "vllm.v1.core.sched.async_scheduler.AsyncScheduler" dyn-tool-call-parser: "kimi_k3" reasoning-parser: "kimi_k3" diff --git a/benchmarks/multi_node/srt-slurm-recipes/vllm/kimi-k3/agentic/agg-gb200-dep16-throughput-vllm-simple-offload-agentic.yaml b/benchmarks/multi_node/srt-slurm-recipes/vllm/kimi-k3/agentic/agg-gb200-dep16-throughput-vllm-simple-offload-agentic.yaml index 8ce4b1ff0c..703262fc3b 100644 --- a/benchmarks/multi_node/srt-slurm-recipes/vllm/kimi-k3/agentic/agg-gb200-dep16-throughput-vllm-simple-offload-agentic.yaml +++ b/benchmarks/multi_node/srt-slurm-recipes/vllm/kimi-k3/agentic/agg-gb200-dep16-throughput-vllm-simple-offload-agentic.yaml @@ -116,7 +116,6 @@ backend: language-model-only: true disable-custom-all-reduce: true enable-prefix-caching: true - enable-prompt-tokens-details: true kv-transfer-config: '{"kv_connector":"SimpleCPUOffloadConnector","kv_role":"kv_both","kv_connector_extra_config":{"cpu_bytes_to_use":549755813888,"cpu_bytes_to_use_per_rank":137438953472,"lazy_offload":false}}' scheduler-cls: "vllm.v1.core.sched.async_scheduler.AsyncScheduler" dyn-tool-call-parser: "kimi_k3" diff --git a/benchmarks/multi_node/srt-slurm-recipes/vllm/kimi-k3/agentic/agg-gb200-tep16-balanced-agentic.yaml b/benchmarks/multi_node/srt-slurm-recipes/vllm/kimi-k3/agentic/agg-gb200-tep16-balanced-agentic.yaml index 461fdf7f7a..bf135c0e33 100644 --- a/benchmarks/multi_node/srt-slurm-recipes/vllm/kimi-k3/agentic/agg-gb200-tep16-balanced-agentic.yaml +++ b/benchmarks/multi_node/srt-slurm-recipes/vllm/kimi-k3/agentic/agg-gb200-tep16-balanced-agentic.yaml @@ -106,7 +106,6 @@ backend: language-model-only: true disable-custom-all-reduce: true enable-prefix-caching: true - enable-prompt-tokens-details: true scheduler-cls: "vllm.v1.core.sched.async_scheduler.AsyncScheduler" dyn-tool-call-parser: "kimi_k3" reasoning-parser: "kimi_k3" diff --git a/benchmarks/multi_node/srt-slurm-recipes/vllm/kimi-k3/agentic/agg-gb200-tp16-latency-agentic.yaml b/benchmarks/multi_node/srt-slurm-recipes/vllm/kimi-k3/agentic/agg-gb200-tp16-latency-agentic.yaml index a72262a20d..3aa8b71ec0 100644 --- a/benchmarks/multi_node/srt-slurm-recipes/vllm/kimi-k3/agentic/agg-gb200-tp16-latency-agentic.yaml +++ b/benchmarks/multi_node/srt-slurm-recipes/vllm/kimi-k3/agentic/agg-gb200-tp16-latency-agentic.yaml @@ -103,7 +103,6 @@ backend: language-model-only: true disable-custom-all-reduce: true enable-prefix-caching: true - enable-prompt-tokens-details: true scheduler-cls: "vllm.v1.core.sched.async_scheduler.AsyncScheduler" dyn-tool-call-parser: "kimi_k3" reasoning-parser: "kimi_k3" From 636897b21955a3f0a4a582b3ff37a15c828a5328 Mon Sep 17 00:00:00 2001 From: Cam Quilici Date: Thu, 30 Jul 2026 19:53:16 -0500 Subject: [PATCH 39/45] fix(agentx): align AIPerf with Qwen frontiers MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Pin the same AIPerf warmup-handoff revision used by the B200 and B300 Qwen AgentX PRs so baseline parents survive into profiling. 中文:将 AIPerf 固定到 B200/B300 Qwen AgentX PR 使用的同一预热交接版本,确保基线父请求能够正确延续到性能分析阶段。 --- utils/aiperf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/utils/aiperf b/utils/aiperf index b6e4ecf4ba..c12846297f 160000 --- a/utils/aiperf +++ b/utils/aiperf @@ -1 +1 @@ -Subproject commit b6e4ecf4ba87ed1ab085380828c464ea601343d2 +Subproject commit c12846297fb5b9057cbbd6c8cf55637d8353385d From 2ba037b2ccc8484e7b0253848321404ff0b789ef Mon Sep 17 00:00:00 2001 From: Cam Quilici Date: Thu, 30 Jul 2026 20:49:01 -0500 Subject: [PATCH 40/45] fix(agentx): separate live and final error gates MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Allow the Kimi K3 TP recipe to collect a larger live sample before aborting while preserving the existing 10% post-run validity threshold. 中文:为 Kimi K3 TP 配置分离实时中止阈值与最终校验阈值,允许低并发轨迹先积累更充分的实时样本,同时保持现有 10% 运行后有效性门槛。 --- benchmarks/benchmark_lib.sh | 11 ++++++----- .../agentic/agg-gb200-tp16-latency-agentic.yaml | 1 + perf-changelog.yaml | 2 +- 3 files changed, 8 insertions(+), 6 deletions(-) diff --git a/benchmarks/benchmark_lib.sh b/benchmarks/benchmark_lib.sh index d97373cd69..8e611c856a 100644 --- a/benchmarks/benchmark_lib.sh +++ b/benchmarks/benchmark_lib.sh @@ -1577,6 +1577,7 @@ AIPERF_CLI="${AIPERF_VENV}/bin/aiperf" AIPERF_HF_CLI="${AIPERF_VENV}/bin/hf" AIPERF_DEPS_READY=0 AIPERF_FAILED_REQUEST_THRESHOLD="${AIPERF_FAILED_REQUEST_THRESHOLD:-0.10}" +AIPERF_LIVE_FAILED_REQUEST_THRESHOLD="${AIPERF_LIVE_FAILED_REQUEST_THRESHOLD:-$AIPERF_FAILED_REQUEST_THRESHOLD}" agentic_pip_install() { local pip_install=(python3 -m pip install) @@ -1788,11 +1789,11 @@ build_replay_cmd() { fi REPLAY_CMD+=" --trace-idle-gap-cap-seconds $trace_idle_gap_cap_seconds" fi - # Fail runs once more than 10% of requests error. This keeps known - # transient low-rate failures from killing long sweeps while still - # catching malformed payloads or server crashes before they get aggregated - # as benchmarkable data. - REPLAY_CMD+=" --failed-request-threshold $AIPERF_FAILED_REQUEST_THRESHOLD" + # Fail runs early once the live error ratio crosses the configured limit. + # Recipes with correlated low-concurrency trajectories may allow a larger + # live sample while retaining AIPERF_FAILED_REQUEST_THRESHOLD as the strict + # post-run validity gate below. + REPLAY_CMD+=" --failed-request-threshold $AIPERF_LIVE_FAILED_REQUEST_THRESHOLD" # Sample each trajectory's warmup start position uniformly from # [25%, 75%] of the trace's turn count, clamped by AIPerf to leave at # least one profile turn after warmup. diff --git a/benchmarks/multi_node/srt-slurm-recipes/vllm/kimi-k3/agentic/agg-gb200-tp16-latency-agentic.yaml b/benchmarks/multi_node/srt-slurm-recipes/vllm/kimi-k3/agentic/agg-gb200-tp16-latency-agentic.yaml index 3aa8b71ec0..baed3f19e7 100644 --- a/benchmarks/multi_node/srt-slurm-recipes/vllm/kimi-k3/agentic/agg-gb200-tp16-latency-agentic.yaml +++ b/benchmarks/multi_node/srt-slurm-recipes/vllm/kimi-k3/agentic/agg-gb200-tp16-latency-agentic.yaml @@ -124,6 +124,7 @@ benchmark: env: INFMAX_CONTAINER_WORKSPACE: "/infmax-workspace" AIPERF_TRACE_IDLE_GAP_CAP_SECONDS: "300" + AIPERF_LIVE_FAILED_REQUEST_THRESHOLD: "0.25" RESULT_DIR: "/logs/agentic" PORT: "8000" IS_MULTINODE: "true" diff --git a/perf-changelog.yaml b/perf-changelog.yaml index 9bf89659d7..b2a162506c 100644 --- a/perf-changelog.yaml +++ b/perf-changelog.yaml @@ -5366,5 +5366,5 @@ - "Use FlashInfer TRT-LLM MoE for DSpark DEP to avoid DeepGEMM grid-barrier failures under MRV2." - "Load DEP weights with standard safetensors to avoid fastsafetensors transient HBM exhaustion with FlashInfer MoE." - "Size DEP CUDA-graph captures to the actual per-engine frontier concurrency (64 regular, 96 offload), using even-sequence captures for the high-concurrency offload arm to preserve the full 1M context while leaving FlashInfer runtime workspace." - - "Pin the Qwen B200/B300 AgentX AIPerf warmup-handoff revision, cap recorded per-trace idle gaps at 300 seconds, and report vLLM cached prompt tokens." + - "Pin the Qwen B200/B300 AgentX AIPerf warmup-handoff revision, cap recorded per-trace idle gaps at 300 seconds, report vLLM cached prompt tokens, and let low-concurrency TP collect a larger live error sample before applying the unchanged 10% final validity gate." pr-link: https://github.com/SemiAnalysisAI/InferenceX/pull/2404 From c37ef59b8268be8c3f838a6ac23fe99d134d6dcc Mon Sep 17 00:00:00 2001 From: Cam Quilici Date: Fri, 31 Jul 2026 12:01:24 -0500 Subject: [PATCH 41/45] fix(agentx): allow full-context sweeps to finish MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Give multi-node AgentX jobs a 13-hour workflow envelope and the Kimi K3 regular DEP recipe a matching 12-hour Slurm allocation so the canonical ten-request-per-lane warmup and one-hour profile can complete without reducing the 1M context. 中文:将多节点 AgentX 工作流时限扩展到 13 小时,并将 Kimi K3 常规 DEP 的 Slurm 时限同步为 12 小时,使标准的每通道十请求预热和一小时性能采集能够在不缩短 1M 上下文的前提下完成。 --- .github/workflows/benchmark-multinode-tmpl.yml | 5 ++++- .../kimi-k3/agentic/agg-gb200-dep16-throughput-agentic.yaml | 2 +- perf-changelog.yaml | 1 + 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/.github/workflows/benchmark-multinode-tmpl.yml b/.github/workflows/benchmark-multinode-tmpl.yml index 10411ad069..ccec347f2c 100644 --- a/.github/workflows/benchmark-multinode-tmpl.yml +++ b/.github/workflows/benchmark-multinode-tmpl.yml @@ -271,7 +271,10 @@ jobs: ) || format('[{0}]', toJSON(inputs.runner)) ) }} - timeout-minutes: 480 + # Full-context AgentX warmup can legitimately exceed the fixed-sequence + # eight-hour envelope at high concurrency. Keep one hour beyond the + # recipe's 12-hour Slurm limit for checkout, staging, and artifact upload. + timeout-minutes: ${{ inputs.scenario-type == 'agentic-coding' && 780 || 480 }} name: >- p${{ inputs.priority }} | ${{ inputs.model-prefix }} ${{ inputs.precision }} ${{ inputs.runner }} ${{ inputs.framework == 'sglang' && 'sgl' || inputs.framework == 'dynamo-sglang' && 'dyn-sgl' || inputs.framework == 'sglang-disagg' && 'sgl-disagg' || inputs.framework }} ${{ inputs.disagg == 'true' && format('{0}P ', inputs.prefill-num-worker) || '' }}(TP${{ inputs.prefill-tp }}${{ inputs.prefill-pp != '' && inputs.prefill-pp != '1' && format('/PP{0}', inputs.prefill-pp) || '' }}${{ inputs.prefill-dcp-size != '' && inputs.prefill-dcp-size != '1' && format('/DCP{0}', inputs.prefill-dcp-size) || '' }}${{ inputs.prefill-pcp-size != '' && inputs.prefill-pcp-size != '1' && format('/PCP{0}', inputs.prefill-pcp-size) || '' }}${{ inputs.prefill-ep != '' && inputs.prefill-ep != '1' && format('/EP{0}', inputs.prefill-ep) || '' }}${{ inputs.prefill-dp-attn == 'true' && '/DPA' || '' }}) diff --git a/benchmarks/multi_node/srt-slurm-recipes/vllm/kimi-k3/agentic/agg-gb200-dep16-throughput-agentic.yaml b/benchmarks/multi_node/srt-slurm-recipes/vllm/kimi-k3/agentic/agg-gb200-dep16-throughput-agentic.yaml index 109a0b3d31..e7de6389a1 100644 --- a/benchmarks/multi_node/srt-slurm-recipes/vllm/kimi-k3/agentic/agg-gb200-dep16-throughput-agentic.yaml +++ b/benchmarks/multi_node/srt-slurm-recipes/vllm/kimi-k3/agentic/agg-gb200-dep16-throughput-agentic.yaml @@ -27,7 +27,7 @@ environment: ETCD_LEASE_TTL: "7200" slurm: - time_limit: "8:00:00" + time_limit: "12:00:00" health_check: max_attempts: 2160 diff --git a/perf-changelog.yaml b/perf-changelog.yaml index b2a162506c..3b1d7ebda4 100644 --- a/perf-changelog.yaml +++ b/perf-changelog.yaml @@ -5367,4 +5367,5 @@ - "Load DEP weights with standard safetensors to avoid fastsafetensors transient HBM exhaustion with FlashInfer MoE." - "Size DEP CUDA-graph captures to the actual per-engine frontier concurrency (64 regular, 96 offload), using even-sequence captures for the high-concurrency offload arm to preserve the full 1M context while leaving FlashInfer runtime workspace." - "Pin the Qwen B200/B300 AgentX AIPerf warmup-handoff revision, cap recorded per-trace idle gaps at 300 seconds, report vLLM cached prompt tokens, and let low-concurrency TP collect a larger live error sample before applying the unchanged 10% final validity gate." + - "Allow high-concurrency full-context AgentX jobs to complete the canonical warmup and one-hour profile with a 12-hour Slurm limit and 13-hour workflow envelope." pr-link: https://github.com/SemiAnalysisAI/InferenceX/pull/2404 From a972ff5a37fbd5723eaa429f0ee150b8244ae03e Mon Sep 17 00:00:00 2001 From: Cam Quilici Date: Fri, 31 Jul 2026 16:28:34 -0500 Subject: [PATCH 42/45] chore(agentx): bump AIPerf harness MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Pin the GB200 Kimi K3 sweep to the same updated AgentX harness commit used by the B200 and B300 Qwen sweeps. 中文:将 GB200 Kimi K3 扫描固定到 B200 和 B300 Qwen 扫描使用的同一版 AgentX 测试框架提交。 --- utils/aiperf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/utils/aiperf b/utils/aiperf index c12846297f..ed057829b7 160000 --- a/utils/aiperf +++ b/utils/aiperf @@ -1 +1 @@ -Subproject commit c12846297fb5b9057cbbd6c8cf55637d8353385d +Subproject commit ed057829b78d25d79ce6f3b87763d48fe50363f5 From 015e89d2f6c055b933fa9979ae9ede7fbcf73300 Mon Sep 17 00:00:00 2001 From: Cam Quilici Date: Fri, 31 Jul 2026 17:09:12 -0500 Subject: [PATCH 43/45] perf(gb200): reuse Lustre-backed runner workspace MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Skip the redundant Lustre-to-Lustre AgentX workspace copy when the GitHub runner checkout already resides on Lustre. Preserve staging as a fallback for node-local runner workspaces.\n\n中文:当 GitHub runner 检出目录已位于 Lustre 时,跳过冗余的 AgentX Lustre 到 Lustre 工作区复制;对于节点本地 runner 工作区,保留共享存储暂存回退路径。 --- runners/launch_gb200-nv.sh | 37 ++++++++++++++++++++----------------- 1 file changed, 20 insertions(+), 17 deletions(-) diff --git a/runners/launch_gb200-nv.sh b/runners/launch_gb200-nv.sh index 970fe21a29..36ba7a4220 100755 --- a/runners/launch_gb200-nv.sh +++ b/runners/launch_gb200-nv.sh @@ -550,25 +550,28 @@ cat srtslurm.yaml echo "Running make setup..." make setup ARCH=aarch64 || exit 1 -# Export eval-related env vars for srt-slurm post-benchmark eval +# Export eval-related env vars for srt-slurm post-benchmark eval. Current +# Watchtower runners keep GITHUB_WORKSPACE on Lustre, so compute nodes can +# mount it directly; avoid copying the checkout from Lustre back to Lustre. +# Retain staging as a fallback for runners whose workspace is node-local. export INFMAX_WORKSPACE="$GITHUB_WORKSPACE" -# Watchtower: pyxis mounts INFMAX_WORKSPACE into the container, but -# GITHUB_WORKSPACE is under /home/slurm-shared/ which compute nodes -# can't see. Stage the relevant subset to shared FS and repoint -# INFMAX_WORKSPACE there. rsync excludes the srt-slurm clone (already -# on shared FS) and .git (not needed in container) for speed. if uses_watchtower_shared_fs; then - SHARED_INFMAX_WORKSPACE="${SHARED_BASE}/infmax-workspace-${RUN_KEY}" - mkdir -p "$SHARED_INFMAX_WORKSPACE" || exit 1 - rsync -a --delete \ - --exclude='.git/' \ - --exclude='srt-slurm*/' \ - --exclude='outputs/' \ - --exclude='LOGS/' \ - --exclude='*.sqsh' \ - "${GITHUB_WORKSPACE}/" "${SHARED_INFMAX_WORKSPACE}/" || exit 1 - export INFMAX_WORKSPACE="$SHARED_INFMAX_WORKSPACE" - echo "Using shared-FS INFMAX_WORKSPACE=$INFMAX_WORKSPACE (compute-visible)" + WORKSPACE_FS_TYPE=$(findmnt -n -o FSTYPE -T "$GITHUB_WORKSPACE" 2>/dev/null || true) + if [[ "$WORKSPACE_FS_TYPE" == "lustre" ]]; then + echo "Using existing Lustre-backed INFMAX_WORKSPACE=$INFMAX_WORKSPACE" + else + SHARED_INFMAX_WORKSPACE="${SHARED_BASE}/infmax-workspace-${RUN_KEY}" + mkdir -p "$SHARED_INFMAX_WORKSPACE" || exit 1 + rsync -a --delete \ + --exclude='.git/' \ + --exclude='srt-slurm*/' \ + --exclude='outputs/' \ + --exclude='LOGS/' \ + --exclude='*.sqsh' \ + "${GITHUB_WORKSPACE}/" "${SHARED_INFMAX_WORKSPACE}/" || exit 1 + export INFMAX_WORKSPACE="$SHARED_INFMAX_WORKSPACE" + echo "Staged node-local workspace to INFMAX_WORKSPACE=$INFMAX_WORKSPACE" + fi fi echo "Submitting job with srtctl..." From ab9f53e6d3cd82d655b2cb566b4c30f03bc32ccf Mon Sep 17 00:00:00 2001 From: Cam Quilici Date: Fri, 31 Jul 2026 19:12:31 -0500 Subject: [PATCH 44/45] fix(gb200): isolate InferenceX Slurm jobs MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Namespace GB200 allocations to prevent cross-repository runner cleanup from cancelling active InferenceX jobs. Limit generic Slurm cleanup to the current user, clean up the exact submitted job on exit, and accept results already present in a directly mounted runner workspace.\n\n中文:为 GB200 Slurm 作业添加 InferenceX 命名空间,避免其他仓库的 runner 清理误取消正在运行的 InferenceX 作业;通用 Slurm 清理仅作用于当前用户,退出时按精确作业 ID 清理,并支持结果已位于直接挂载 runner 工作区的场景。 --- .../workflows/benchmark-multinode-tmpl.yml | 2 +- runners/launch_gb200-nv.sh | 25 +++++++++++++++++-- runners/slurm_utils.sh | 9 +++++++ 3 files changed, 33 insertions(+), 3 deletions(-) diff --git a/.github/workflows/benchmark-multinode-tmpl.yml b/.github/workflows/benchmark-multinode-tmpl.yml index ccec347f2c..8090747d46 100644 --- a/.github/workflows/benchmark-multinode-tmpl.yml +++ b/.github/workflows/benchmark-multinode-tmpl.yml @@ -289,7 +289,7 @@ jobs: run: &slurm-cleanup | if command -v squeue >/dev/null 2>&1; then echo "[Slurm] Cleaning up jobs named: ${{ runner.name }} ..." - scancel --name="${{ runner.name }}" || true + scancel --user="$USER" --name="${{ runner.name }}" || true while [ -n "$(squeue --user="$USER" --name='${{ runner.name }}' --noheader --format='%i')" ]; do squeue --user="$USER" --name="${{ runner.name }}" sleep 5 diff --git a/runners/launch_gb200-nv.sh b/runners/launch_gb200-nv.sh index 36ba7a4220..2adf9ce143 100755 --- a/runners/launch_gb200-nv.sh +++ b/runners/launch_gb200-nv.sh @@ -584,8 +584,17 @@ if [[ ! -f "$CONFIG_PATH" ]]; then exit 1 fi -# Keep the Slurm job name aligned with the GitHub runner name. -sed -i "s/^name:.*/name: \"${RUNNER_NAME}\"/" "$CONFIG_PATH" +# Namespace InferenceX allocations so other repositories using the same +# physical runner names cannot cancel them with `scancel --name=gb200-nv_*`. +# Clean up any stale allocation from this InferenceX runner before submitting. +SRT_SLURM_JOB_NAME="inferencex-${RUNNER_NAME}" +if command -v squeue >/dev/null 2>&1; then + scancel --user="$USER" --name="$SRT_SLURM_JOB_NAME" 2>/dev/null || true + while [[ -n "$(squeue --user="$USER" --name="$SRT_SLURM_JOB_NAME" --noheader --format='%i')" ]]; do + sleep 5 + done +fi +sed -i "s/^name:.*/name: \"${SRT_SLURM_JOB_NAME}\"/" "$CONFIG_PATH" # Optionally inject synthetic acceptance into the recipe's speculative-config # when SYNTHETIC_ACCEPTANCE=true (no-op otherwise). Must run after the name @@ -636,6 +645,18 @@ fi echo "Extracted JOB_ID: $JOB_ID" +# The workflow-level cleanup keys off the physical runner name, while this +# launcher uses a repository-specific Slurm name to avoid cross-repo +# collisions. Always clean up the exact submitted allocation on exit. +cleanup_srt_job() { + local rc=$? + scancel "$JOB_ID" 2>/dev/null || true + return "$rc" +} +trap cleanup_srt_job EXIT +trap 'exit 130' INT +trap 'exit 143' TERM HUP + # Use the JOB_ID to find the logs directory # srtctl creates logs in outputs/JOB_ID/logs/ LOGS_DIR="outputs/$JOB_ID/logs" diff --git a/runners/slurm_utils.sh b/runners/slurm_utils.sh index 55c8652b84..770694e9bd 100644 --- a/runners/slurm_utils.sh +++ b/runners/slurm_utils.sh @@ -34,6 +34,15 @@ copy_to_workspace() { local source_file="$1" local destination_file="$2" + # A compute-visible runner workspace may be mounted directly into the + # benchmark container. In that case the staged result already is the + # workflow artifact, so copying it onto itself would fail with cp's + # "same file" error even though the benchmark succeeded. + if [[ -e "$destination_file" && "$source_file" -ef "$destination_file" ]]; then + echo "Result already present at $destination_file" + return 0 + fi + if ! cp "$source_file" "$destination_file"; then echo "ERROR: failed to copy $source_file to $destination_file" >&2 return 1 From 48cf6ea2cdde9c7ec043a0a1001d79aa3c3ddb34 Mon Sep 17 00:00:00 2001 From: Cam Quilici Date: Fri, 31 Jul 2026 19:19:33 -0500 Subject: [PATCH 45/45] fix(gb200): preserve namespaced Slurm job name MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Override RUNNER_NAME only for srtctl submission because srtctl gives the GitHub runner environment precedence over the recipe name. This keeps rendered GB200 allocations isolated from other repositories.\n\n中文:仅在提交 srtctl 作业时覆盖 RUNNER_NAME,因为 srtctl 会优先使用 GitHub runner 环境变量而忽略 recipe 名称;由此确保渲染后的 GB200 Slurm 作业继续使用 InferenceX 命名空间,与其他仓库隔离。 --- runners/launch_gb200-nv.sh | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/runners/launch_gb200-nv.sh b/runners/launch_gb200-nv.sh index 2adf9ce143..376217f2b2 100755 --- a/runners/launch_gb200-nv.sh +++ b/runners/launch_gb200-nv.sh @@ -631,7 +631,10 @@ if [[ "$FRAMEWORK" == "dynamo-sglang" ]]; then elif [[ -n "$SRTCTL_SETUP_SCRIPT" ]]; then SRTCTL_APPLY_ARGS+=(--setup-script "$SRTCTL_SETUP_SCRIPT") fi -SRTCTL_OUTPUT=$(srtctl apply "${SRTCTL_APPLY_ARGS[@]}" 2>&1) +# srtctl gives the GitHub-provided RUNNER_NAME precedence over config.name. +# Override it only for submission so the rendered #SBATCH job name retains +# the InferenceX namespace used above. +SRTCTL_OUTPUT=$(RUNNER_NAME="$SRT_SLURM_JOB_NAME" srtctl apply "${SRTCTL_APPLY_ARGS[@]}" 2>&1) echo "$SRTCTL_OUTPUT" JOB_ID=$(echo "$SRTCTL_OUTPUT" | grep -oP '✅ Job \K[0-9]+' || echo "$SRTCTL_OUTPUT" | grep -oP 'Job \K[0-9]+')