From 245dcda3cc0ad6e2831659477c2eaf4b22b6e63c Mon Sep 17 00:00:00 2001 From: Cam Quilici Date: Mon, 27 Jul 2026 13:09:07 -0500 Subject: [PATCH 01/21] 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/21] 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/21] 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/21] 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/21] 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/21] 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/21] 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/21] 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/21] 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/21] 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/21] 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/21] 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/21] 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/21] 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/21] 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/21] 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/21] 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/21] 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/21] 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/21] 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/21] 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