From 8bd17af62b35dbad2e742cdfe53738ebe63d0687 Mon Sep 17 00:00:00 2001 From: weireweire <20922698+weireweire@users.noreply.github.com> Date: Sat, 3 Oct 2026 14:58:25 +0800 Subject: [PATCH 1/8] perf(agentx): GB200 DSV4 SGLang disagg KV offload via Mooncake unified-cache external linker --- ...0-1p1d-dep16-dep32-c256-mtp-kvoffload.yaml | 79 ++++++++++++++++-- ...00-1p1d-dep8-dep16-c128-mtp-kvoffload.yaml | 81 +++++++++++++++++-- ...200-1p1d-dep8-dep16-c64-mtp-kvoffload.yaml | 81 +++++++++++++++++-- ...-2p1d-dep16-dep32-c1024-mtp-kvoffload.yaml | 79 ++++++++++++++++-- ...-2p1d-dep16-dep32-c1280-mtp-kvoffload.yaml | 79 ++++++++++++++++-- ...0-2p1d-dep16-dep32-c768-mtp-kvoffload.yaml | 79 ++++++++++++++++-- 6 files changed, 446 insertions(+), 32 deletions(-) diff --git a/inferencex-e2e/benchmarks/multi_node/srt-slurm-recipes/dsv4/sglang/gb200-fp4/agentx/disagg-gb200-1p1d-dep16-dep32-c256-mtp-kvoffload.yaml b/inferencex-e2e/benchmarks/multi_node/srt-slurm-recipes/dsv4/sglang/gb200-fp4/agentx/disagg-gb200-1p1d-dep16-dep32-c256-mtp-kvoffload.yaml index 9a2b0265a1..541934f0af 100644 --- a/inferencex-e2e/benchmarks/multi_node/srt-slurm-recipes/dsv4/sglang/gb200-fp4/agentx/disagg-gb200-1p1d-dep16-dep32-c256-mtp-kvoffload.yaml +++ b/inferencex-e2e/benchmarks/multi_node/srt-slurm-recipes/dsv4/sglang/gb200-fp4/agentx/disagg-gb200-1p1d-dep16-dep32-c256-mtp-kvoffload.yaml @@ -18,6 +18,11 @@ slurm: health_check: max_attempts: 1440 interval_seconds: 10 +# Tachometer's per-node exporters slow decode steps by a few percent and add +# host memory on the head node; this ladder is a throughput measurement. +observability: + tachometer: + enabled: false resources: gpu_type: gb200 gpus_per_node: 4 @@ -32,6 +37,54 @@ services: node: dedicated options: max_payload_mb: 32 +- name: mooncake-master + type: mooncake-master + args: + - --eviction_high_watermark_ratio=0.90 +# Decode ranks use a chunk cache, so their host DRAM only joins the store +# through standalone stores: four per decode node, so segments stay uniform +# with prefill's per-rank ones instead of one oversized segment per node. +- &decode-store + name: store-decode-0 + type: mooncake-store + placement: + node: decode + args: ["--port", "8800"] + env: + MOONCAKE_PROTOCOL: rdma + MOONCAKE_DEVICE: "mlx5_0,mlx5_1,mlx5_2,mlx5_3" + MOONCAKE_GLOBAL_SEGMENT_SIZE: 180gb + MC_STORE_CLIENT_METRIC_INTERVAL: '5' + MC_ENABLE_DEST_DEVICE_AFFINITY: '1' + # Advertise the store transfer engine on the node address instead of the first active + # interface, which can be a BMC Redfish host interface (the same 10.0.1.2 on every node). + MC_TCP_BIND_ADDRESS: "{node_ip}" + preamble: | + ulimit -n 1048576 + ulimit -l unlimited + # Cold container starts on a decode node can exceed srtctl's 120 s default; + # the <<: merge is shallow, so every store repeats the timeout. + readiness: + port: 8800 + timeout_seconds: 600 +- <<: *decode-store + name: store-decode-1 + args: ["--port", "8801"] + readiness: + port: 8801 + timeout_seconds: 600 +- <<: *decode-store + name: store-decode-2 + args: ["--port", "8802"] + readiness: + port: 8802 + timeout_seconds: 600 +- <<: *decode-store + name: store-decode-3 + args: ["--port", "8803"] + readiness: + port: 8803 + timeout_seconds: 600 frontend: type: dynamo nginx_session_affinity: true @@ -84,6 +137,18 @@ roles: SGLANG_REQUEST_STATE_WAIT_TIMEOUT: '60' SGLANG_NCCL_ALL_GATHER_IN_OVERLAP_SCHEDULER_SYNC_BATCH: '1' SGLANG_DSV4_MHC_PREWARM: '1' + MOONCAKE_PROTOCOL: rdma + # The store only registers host buffers on RDMA; without an explicit list it + # falls back to NVLink for same-domain peers and aborts at the warmup put. + MOONCAKE_DEVICE: "mlx5_0,mlx5_1,mlx5_2,mlx5_3" + MOONCAKE_GLOBAL_SEGMENT_SIZE: 140gb + MOONCAKE_STANDALONE_STORAGE: '0' + MC_STORE_CLIENT_METRIC_INTERVAL: '5' + MC_ENABLE_DEST_DEVICE_AFFINITY: '1' + # Advertise the store transfer engine on the node address instead of the first active + # interface, which can be a BMC Redfish host interface (the same 10.0.1.2 on every node). + MC_TCP_BIND_ADDRESS: "{node}" + WITH_NVIDIA_PEERMEM: '0' args: host: 0.0.0.0 served-model-name: deepseek-ai/DeepSeek-V4-Pro-0813 @@ -117,11 +182,9 @@ roles: speculative-num-steps: 1 speculative-eagle-topk: 1 speculative-num-draft-tokens: 7 - enable-hierarchical-cache: true - hicache-write-policy: write_back - hicache-ratio: 2 - hicache-io-backend: direct - hicache-mem-layout: page_first_direct + enable-unified-cache-external-linker: true + unified-cache-external-linker-backend: mooncake + hicache-storage-backend-extra-config: '{"enable_group_semantics":true}' cuda-graph-max-bs-decode: 256 decode: nodes: 8 @@ -157,6 +220,8 @@ roles: SGLANG_LOG_MS: '1' SGLANG_REQUEST_STATE_WAIT_TIMEOUT: '60' SGLANG_DSV4_MHC_PREWARM: '1' + MC_ENABLE_DEST_DEVICE_AFFINITY: '1' + WITH_NVIDIA_PEERMEM: '0' args: host: 0.0.0.0 served-model-name: deepseek-ai/DeepSeek-V4-Pro-0813 @@ -199,6 +264,10 @@ srun_options: benchmark: type: custom command: bash /infmax-workspace/benchmarks/srt_agentic.sh + # The replay client holds ~300 GB of host memory; on the default head node it + # shares prefill_0's node and OOMs it. Put it on the etcd/nats node instead. + placement: + node: dedicated env: INFMAX_CONTAINER_WORKSPACE: /infmax-workspace RESULT_DIR: /logs/agentic diff --git a/inferencex-e2e/benchmarks/multi_node/srt-slurm-recipes/dsv4/sglang/gb200-fp4/agentx/disagg-gb200-1p1d-dep8-dep16-c128-mtp-kvoffload.yaml b/inferencex-e2e/benchmarks/multi_node/srt-slurm-recipes/dsv4/sglang/gb200-fp4/agentx/disagg-gb200-1p1d-dep8-dep16-c128-mtp-kvoffload.yaml index 9461990907..a44d935fda 100644 --- a/inferencex-e2e/benchmarks/multi_node/srt-slurm-recipes/dsv4/sglang/gb200-fp4/agentx/disagg-gb200-1p1d-dep8-dep16-c128-mtp-kvoffload.yaml +++ b/inferencex-e2e/benchmarks/multi_node/srt-slurm-recipes/dsv4/sglang/gb200-fp4/agentx/disagg-gb200-1p1d-dep8-dep16-c128-mtp-kvoffload.yaml @@ -2,7 +2,7 @@ schema: 2 name: "disagg-gb200-1p1d-dep8-dep16-c128-mtp-kvoffload" # GB200 AgentX SGLang disaggregated recipe for DeepSeek-V4-Pro-0813 -# (1P x DEP8 / 1D x DEP16, bundled DSpark K=6 + HiCache KV offload), tuned for +# (1P x DEP8 / 1D x DEP16, bundled DSpark K=6 + Mooncake unified-cache KV offload), tuned for # concurrency 128. # The DEP8 prefill worker spans two nodes; the DEP16 decode worker spans four. @@ -28,6 +28,11 @@ health_check: max_attempts: 1440 interval_seconds: 10 +# Tachometer's per-node exporters slow decode steps by a few percent and add +# host memory on the head node; this ladder is a throughput measurement. +observability: + tachometer: + enabled: false resources: gpu_type: gb200 gpus_per_node: 4 @@ -42,6 +47,54 @@ services: node: dedicated options: max_payload_mb: 32 + - name: mooncake-master + type: mooncake-master + args: + - --eviction_high_watermark_ratio=0.90 + # Decode ranks use a chunk cache, so their host DRAM only joins the store + # through standalone stores: four per decode node, so segments stay uniform + # with prefill's per-rank ones instead of one oversized segment per node. + - &decode-store + name: store-decode-0 + type: mooncake-store + placement: + node: decode + args: ["--port", "8800"] + env: + MOONCAKE_PROTOCOL: rdma + MOONCAKE_DEVICE: "mlx5_0,mlx5_1,mlx5_2,mlx5_3" + MOONCAKE_GLOBAL_SEGMENT_SIZE: 180gb + MC_STORE_CLIENT_METRIC_INTERVAL: '5' + MC_ENABLE_DEST_DEVICE_AFFINITY: '1' + # Advertise the store transfer engine on the node address instead of the first active + # interface, which can be a BMC Redfish host interface (the same 10.0.1.2 on every node). + MC_TCP_BIND_ADDRESS: "{node_ip}" + preamble: | + ulimit -n 1048576 + ulimit -l unlimited + # Cold container starts on a decode node can exceed srtctl's 120 s default; + # the <<: merge is shallow, so every store repeats the timeout. + readiness: + port: 8800 + timeout_seconds: 600 + - <<: *decode-store + name: store-decode-1 + args: ["--port", "8801"] + readiness: + port: 8801 + timeout_seconds: 600 + - <<: *decode-store + name: store-decode-2 + args: ["--port", "8802"] + readiness: + port: 8802 + timeout_seconds: 600 + - <<: *decode-store + name: store-decode-3 + args: ["--port", "8803"] + readiness: + port: 8803 + timeout_seconds: 600 frontend: type: dynamo nginx_session_affinity: true @@ -95,6 +148,18 @@ roles: SGLANG_LOG_MS: '1' SGLANG_REQUEST_STATE_WAIT_TIMEOUT: '60' SGLANG_NCCL_ALL_GATHER_IN_OVERLAP_SCHEDULER_SYNC_BATCH: '1' + MOONCAKE_PROTOCOL: rdma + # The store only registers host buffers on RDMA; without an explicit list it + # falls back to NVLink for same-domain peers and aborts at the warmup put. + MOONCAKE_DEVICE: "mlx5_0,mlx5_1,mlx5_2,mlx5_3" + MOONCAKE_GLOBAL_SEGMENT_SIZE: 140gb + MOONCAKE_STANDALONE_STORAGE: '0' + MC_STORE_CLIENT_METRIC_INTERVAL: '5' + MC_ENABLE_DEST_DEVICE_AFFINITY: '1' + # Advertise the store transfer engine on the node address instead of the first active + # interface, which can be a BMC Redfish host interface (the same 10.0.1.2 on every node). + MC_TCP_BIND_ADDRESS: "{node}" + WITH_NVIDIA_PEERMEM: '0' args: host: 0.0.0.0 @@ -130,11 +195,9 @@ roles: speculative-num-steps: 1 speculative-eagle-topk: 1 speculative-num-draft-tokens: 7 - enable-hierarchical-cache: true - hicache-write-policy: write_back - hicache-ratio: 8 - hicache-io-backend: direct - hicache-mem-layout: page_first_direct + enable-unified-cache-external-linker: true + unified-cache-external-linker-backend: mooncake + hicache-storage-backend-extra-config: '{"enable_group_semantics":true}' decode: nodes: 4 @@ -169,6 +232,8 @@ roles: SGLANG_LOG_FORWARD_ITERS: '1' SGLANG_LOG_MS: '1' SGLANG_REQUEST_STATE_WAIT_TIMEOUT: '60' + MC_ENABLE_DEST_DEVICE_AFFINITY: '1' + WITH_NVIDIA_PEERMEM: '0' args: host: 0.0.0.0 @@ -215,6 +280,10 @@ srun_options: benchmark: type: custom command: bash /infmax-workspace/benchmarks/srt_agentic.sh + # The replay client holds ~300 GB of host memory; on the default head node it + # shares prefill_0's node and OOMs it. Put it on the etcd/nats node instead. + placement: + node: dedicated env: INFMAX_CONTAINER_WORKSPACE: /infmax-workspace RESULT_DIR: /logs/agentic diff --git a/inferencex-e2e/benchmarks/multi_node/srt-slurm-recipes/dsv4/sglang/gb200-fp4/agentx/disagg-gb200-1p1d-dep8-dep16-c64-mtp-kvoffload.yaml b/inferencex-e2e/benchmarks/multi_node/srt-slurm-recipes/dsv4/sglang/gb200-fp4/agentx/disagg-gb200-1p1d-dep8-dep16-c64-mtp-kvoffload.yaml index d3bcb51688..f0181c16ad 100644 --- a/inferencex-e2e/benchmarks/multi_node/srt-slurm-recipes/dsv4/sglang/gb200-fp4/agentx/disagg-gb200-1p1d-dep8-dep16-c64-mtp-kvoffload.yaml +++ b/inferencex-e2e/benchmarks/multi_node/srt-slurm-recipes/dsv4/sglang/gb200-fp4/agentx/disagg-gb200-1p1d-dep8-dep16-c64-mtp-kvoffload.yaml @@ -2,7 +2,7 @@ schema: 2 name: "disagg-gb200-1p1d-dep8-dep16-c64-mtp-kvoffload" # GB200 AgentX SGLang disaggregated recipe for DeepSeek-V4-Pro-0813 -# (1P x DEP8 / 1D x DEP16, bundled DSpark K=6 + HiCache KV offload), tuned for +# (1P x DEP8 / 1D x DEP16, bundled DSpark K=6 + Mooncake unified-cache KV offload), tuned for # concurrency 64. # The DEP8 prefill worker spans two nodes; the DEP16 decode worker spans four. @@ -28,6 +28,11 @@ health_check: max_attempts: 1440 interval_seconds: 10 +# Tachometer's per-node exporters slow decode steps by a few percent and add +# host memory on the head node; this ladder is a throughput measurement. +observability: + tachometer: + enabled: false resources: gpu_type: gb200 gpus_per_node: 4 @@ -42,6 +47,54 @@ services: node: dedicated options: max_payload_mb: 32 + - name: mooncake-master + type: mooncake-master + args: + - --eviction_high_watermark_ratio=0.90 + # Decode ranks use a chunk cache, so their host DRAM only joins the store + # through standalone stores: four per decode node, so segments stay uniform + # with prefill's per-rank ones instead of one oversized segment per node. + - &decode-store + name: store-decode-0 + type: mooncake-store + placement: + node: decode + args: ["--port", "8800"] + env: + MOONCAKE_PROTOCOL: rdma + MOONCAKE_DEVICE: "mlx5_0,mlx5_1,mlx5_2,mlx5_3" + MOONCAKE_GLOBAL_SEGMENT_SIZE: 180gb + MC_STORE_CLIENT_METRIC_INTERVAL: '5' + MC_ENABLE_DEST_DEVICE_AFFINITY: '1' + # Advertise the store transfer engine on the node address instead of the first active + # interface, which can be a BMC Redfish host interface (the same 10.0.1.2 on every node). + MC_TCP_BIND_ADDRESS: "{node_ip}" + preamble: | + ulimit -n 1048576 + ulimit -l unlimited + # Cold container starts on a decode node can exceed srtctl's 120 s default; + # the <<: merge is shallow, so every store repeats the timeout. + readiness: + port: 8800 + timeout_seconds: 600 + - <<: *decode-store + name: store-decode-1 + args: ["--port", "8801"] + readiness: + port: 8801 + timeout_seconds: 600 + - <<: *decode-store + name: store-decode-2 + args: ["--port", "8802"] + readiness: + port: 8802 + timeout_seconds: 600 + - <<: *decode-store + name: store-decode-3 + args: ["--port", "8803"] + readiness: + port: 8803 + timeout_seconds: 600 frontend: type: dynamo nginx_session_affinity: true @@ -95,6 +148,18 @@ roles: SGLANG_LOG_MS: '1' SGLANG_REQUEST_STATE_WAIT_TIMEOUT: '60' SGLANG_NCCL_ALL_GATHER_IN_OVERLAP_SCHEDULER_SYNC_BATCH: '1' + MOONCAKE_PROTOCOL: rdma + # The store only registers host buffers on RDMA; without an explicit list it + # falls back to NVLink for same-domain peers and aborts at the warmup put. + MOONCAKE_DEVICE: "mlx5_0,mlx5_1,mlx5_2,mlx5_3" + MOONCAKE_GLOBAL_SEGMENT_SIZE: 140gb + MOONCAKE_STANDALONE_STORAGE: '0' + MC_STORE_CLIENT_METRIC_INTERVAL: '5' + MC_ENABLE_DEST_DEVICE_AFFINITY: '1' + # Advertise the store transfer engine on the node address instead of the first active + # interface, which can be a BMC Redfish host interface (the same 10.0.1.2 on every node). + MC_TCP_BIND_ADDRESS: "{node}" + WITH_NVIDIA_PEERMEM: '0' args: host: 0.0.0.0 @@ -130,11 +195,9 @@ roles: speculative-num-steps: 1 speculative-eagle-topk: 1 speculative-num-draft-tokens: 7 - enable-hierarchical-cache: true - hicache-write-policy: write_back - hicache-ratio: 8 - hicache-io-backend: direct - hicache-mem-layout: page_first_direct + enable-unified-cache-external-linker: true + unified-cache-external-linker-backend: mooncake + hicache-storage-backend-extra-config: '{"enable_group_semantics":true}' decode: nodes: 4 @@ -169,6 +232,8 @@ roles: SGLANG_LOG_FORWARD_ITERS: '1' SGLANG_LOG_MS: '1' SGLANG_REQUEST_STATE_WAIT_TIMEOUT: '60' + MC_ENABLE_DEST_DEVICE_AFFINITY: '1' + WITH_NVIDIA_PEERMEM: '0' args: host: 0.0.0.0 @@ -215,6 +280,10 @@ srun_options: benchmark: type: custom command: bash /infmax-workspace/benchmarks/srt_agentic.sh + # The replay client holds ~300 GB of host memory; on the default head node it + # shares prefill_0's node and OOMs it. Put it on the etcd/nats node instead. + placement: + node: dedicated env: INFMAX_CONTAINER_WORKSPACE: /infmax-workspace RESULT_DIR: /logs/agentic diff --git a/inferencex-e2e/benchmarks/multi_node/srt-slurm-recipes/dsv4/sglang/gb200-fp4/agentx/disagg-gb200-2p1d-dep16-dep32-c1024-mtp-kvoffload.yaml b/inferencex-e2e/benchmarks/multi_node/srt-slurm-recipes/dsv4/sglang/gb200-fp4/agentx/disagg-gb200-2p1d-dep16-dep32-c1024-mtp-kvoffload.yaml index 5a21654eb0..f1672f9e54 100644 --- a/inferencex-e2e/benchmarks/multi_node/srt-slurm-recipes/dsv4/sglang/gb200-fp4/agentx/disagg-gb200-2p1d-dep16-dep32-c1024-mtp-kvoffload.yaml +++ b/inferencex-e2e/benchmarks/multi_node/srt-slurm-recipes/dsv4/sglang/gb200-fp4/agentx/disagg-gb200-2p1d-dep16-dep32-c1024-mtp-kvoffload.yaml @@ -18,6 +18,11 @@ slurm: health_check: max_attempts: 1440 interval_seconds: 10 +# Tachometer's per-node exporters slow decode steps by a few percent and add +# host memory on the head node; this ladder is a throughput measurement. +observability: + tachometer: + enabled: false resources: gpu_type: gb200 gpus_per_node: 4 @@ -32,6 +37,54 @@ services: node: dedicated options: max_payload_mb: 32 +- name: mooncake-master + type: mooncake-master + args: + - --eviction_high_watermark_ratio=0.90 +# Decode ranks use a chunk cache, so their host DRAM only joins the store +# through standalone stores: four per decode node, so segments stay uniform +# with prefill's per-rank ones instead of one oversized segment per node. +- &decode-store + name: store-decode-0 + type: mooncake-store + placement: + node: decode + args: ["--port", "8800"] + env: + MOONCAKE_PROTOCOL: rdma + MOONCAKE_DEVICE: "mlx5_0,mlx5_1,mlx5_2,mlx5_3" + MOONCAKE_GLOBAL_SEGMENT_SIZE: 180gb + MC_STORE_CLIENT_METRIC_INTERVAL: '5' + MC_ENABLE_DEST_DEVICE_AFFINITY: '1' + # Advertise the store transfer engine on the node address instead of the first active + # interface, which can be a BMC Redfish host interface (the same 10.0.1.2 on every node). + MC_TCP_BIND_ADDRESS: "{node_ip}" + preamble: | + ulimit -n 1048576 + ulimit -l unlimited + # Cold container starts on a decode node can exceed srtctl's 120 s default; + # the <<: merge is shallow, so every store repeats the timeout. + readiness: + port: 8800 + timeout_seconds: 600 +- <<: *decode-store + name: store-decode-1 + args: ["--port", "8801"] + readiness: + port: 8801 + timeout_seconds: 600 +- <<: *decode-store + name: store-decode-2 + args: ["--port", "8802"] + readiness: + port: 8802 + timeout_seconds: 600 +- <<: *decode-store + name: store-decode-3 + args: ["--port", "8803"] + readiness: + port: 8803 + timeout_seconds: 600 frontend: type: dynamo nginx_session_affinity: true @@ -84,6 +137,18 @@ roles: SGLANG_REQUEST_STATE_WAIT_TIMEOUT: '60' SGLANG_NCCL_ALL_GATHER_IN_OVERLAP_SCHEDULER_SYNC_BATCH: '1' SGLANG_DSV4_MHC_PREWARM: '1' + MOONCAKE_PROTOCOL: rdma + # The store only registers host buffers on RDMA; without an explicit list it + # falls back to NVLink for same-domain peers and aborts at the warmup put. + MOONCAKE_DEVICE: "mlx5_0,mlx5_1,mlx5_2,mlx5_3" + MOONCAKE_GLOBAL_SEGMENT_SIZE: 140gb + MOONCAKE_STANDALONE_STORAGE: '0' + MC_STORE_CLIENT_METRIC_INTERVAL: '5' + MC_ENABLE_DEST_DEVICE_AFFINITY: '1' + # Advertise the store transfer engine on the node address instead of the first active + # interface, which can be a BMC Redfish host interface (the same 10.0.1.2 on every node). + MC_TCP_BIND_ADDRESS: "{node}" + WITH_NVIDIA_PEERMEM: '0' args: host: 0.0.0.0 served-model-name: deepseek-ai/DeepSeek-V4-Pro-0813 @@ -117,11 +182,9 @@ roles: speculative-num-steps: 1 speculative-eagle-topk: 1 speculative-num-draft-tokens: 7 - enable-hierarchical-cache: true - hicache-write-policy: write_back - hicache-ratio: 2 - hicache-io-backend: direct - hicache-mem-layout: page_first_direct + enable-unified-cache-external-linker: true + unified-cache-external-linker-backend: mooncake + hicache-storage-backend-extra-config: '{"enable_group_semantics":true}' cuda-graph-max-bs-decode: 256 decode: nodes: 8 @@ -157,6 +220,8 @@ roles: SGLANG_LOG_MS: '1' SGLANG_REQUEST_STATE_WAIT_TIMEOUT: '60' SGLANG_DSV4_MHC_PREWARM: '1' + MC_ENABLE_DEST_DEVICE_AFFINITY: '1' + WITH_NVIDIA_PEERMEM: '0' args: host: 0.0.0.0 served-model-name: deepseek-ai/DeepSeek-V4-Pro-0813 @@ -199,6 +264,10 @@ srun_options: benchmark: type: custom command: bash /infmax-workspace/benchmarks/srt_agentic.sh + # The replay client holds ~300 GB of host memory; on the default head node it + # shares prefill_0's node and OOMs it. Put it on the etcd/nats node instead. + placement: + node: dedicated env: INFMAX_CONTAINER_WORKSPACE: /infmax-workspace RESULT_DIR: /logs/agentic diff --git a/inferencex-e2e/benchmarks/multi_node/srt-slurm-recipes/dsv4/sglang/gb200-fp4/agentx/disagg-gb200-2p1d-dep16-dep32-c1280-mtp-kvoffload.yaml b/inferencex-e2e/benchmarks/multi_node/srt-slurm-recipes/dsv4/sglang/gb200-fp4/agentx/disagg-gb200-2p1d-dep16-dep32-c1280-mtp-kvoffload.yaml index c597addbe6..ac2ed56b08 100644 --- a/inferencex-e2e/benchmarks/multi_node/srt-slurm-recipes/dsv4/sglang/gb200-fp4/agentx/disagg-gb200-2p1d-dep16-dep32-c1280-mtp-kvoffload.yaml +++ b/inferencex-e2e/benchmarks/multi_node/srt-slurm-recipes/dsv4/sglang/gb200-fp4/agentx/disagg-gb200-2p1d-dep16-dep32-c1280-mtp-kvoffload.yaml @@ -18,6 +18,11 @@ slurm: health_check: max_attempts: 1440 interval_seconds: 10 +# Tachometer's per-node exporters slow decode steps by a few percent and add +# host memory on the head node; this ladder is a throughput measurement. +observability: + tachometer: + enabled: false resources: gpu_type: gb200 gpus_per_node: 4 @@ -32,6 +37,54 @@ services: node: dedicated options: max_payload_mb: 32 +- name: mooncake-master + type: mooncake-master + args: + - --eviction_high_watermark_ratio=0.90 +# Decode ranks use a chunk cache, so their host DRAM only joins the store +# through standalone stores: four per decode node, so segments stay uniform +# with prefill's per-rank ones instead of one oversized segment per node. +- &decode-store + name: store-decode-0 + type: mooncake-store + placement: + node: decode + args: ["--port", "8800"] + env: + MOONCAKE_PROTOCOL: rdma + MOONCAKE_DEVICE: "mlx5_0,mlx5_1,mlx5_2,mlx5_3" + MOONCAKE_GLOBAL_SEGMENT_SIZE: 180gb + MC_STORE_CLIENT_METRIC_INTERVAL: '5' + MC_ENABLE_DEST_DEVICE_AFFINITY: '1' + # Advertise the store transfer engine on the node address instead of the first active + # interface, which can be a BMC Redfish host interface (the same 10.0.1.2 on every node). + MC_TCP_BIND_ADDRESS: "{node_ip}" + preamble: | + ulimit -n 1048576 + ulimit -l unlimited + # Cold container starts on a decode node can exceed srtctl's 120 s default; + # the <<: merge is shallow, so every store repeats the timeout. + readiness: + port: 8800 + timeout_seconds: 600 +- <<: *decode-store + name: store-decode-1 + args: ["--port", "8801"] + readiness: + port: 8801 + timeout_seconds: 600 +- <<: *decode-store + name: store-decode-2 + args: ["--port", "8802"] + readiness: + port: 8802 + timeout_seconds: 600 +- <<: *decode-store + name: store-decode-3 + args: ["--port", "8803"] + readiness: + port: 8803 + timeout_seconds: 600 frontend: type: dynamo nginx_session_affinity: true @@ -84,6 +137,18 @@ roles: SGLANG_REQUEST_STATE_WAIT_TIMEOUT: '60' SGLANG_NCCL_ALL_GATHER_IN_OVERLAP_SCHEDULER_SYNC_BATCH: '1' SGLANG_DSV4_MHC_PREWARM: '1' + MOONCAKE_PROTOCOL: rdma + # The store only registers host buffers on RDMA; without an explicit list it + # falls back to NVLink for same-domain peers and aborts at the warmup put. + MOONCAKE_DEVICE: "mlx5_0,mlx5_1,mlx5_2,mlx5_3" + MOONCAKE_GLOBAL_SEGMENT_SIZE: 140gb + MOONCAKE_STANDALONE_STORAGE: '0' + MC_STORE_CLIENT_METRIC_INTERVAL: '5' + MC_ENABLE_DEST_DEVICE_AFFINITY: '1' + # Advertise the store transfer engine on the node address instead of the first active + # interface, which can be a BMC Redfish host interface (the same 10.0.1.2 on every node). + MC_TCP_BIND_ADDRESS: "{node}" + WITH_NVIDIA_PEERMEM: '0' args: host: 0.0.0.0 served-model-name: deepseek-ai/DeepSeek-V4-Pro-0813 @@ -117,11 +182,9 @@ roles: speculative-num-steps: 1 speculative-eagle-topk: 1 speculative-num-draft-tokens: 7 - enable-hierarchical-cache: true - hicache-write-policy: write_back - hicache-ratio: 2 - hicache-io-backend: direct - hicache-mem-layout: page_first_direct + enable-unified-cache-external-linker: true + unified-cache-external-linker-backend: mooncake + hicache-storage-backend-extra-config: '{"enable_group_semantics":true}' cuda-graph-max-bs-decode: 256 decode: nodes: 8 @@ -157,6 +220,8 @@ roles: SGLANG_LOG_MS: '1' SGLANG_REQUEST_STATE_WAIT_TIMEOUT: '60' SGLANG_DSV4_MHC_PREWARM: '1' + MC_ENABLE_DEST_DEVICE_AFFINITY: '1' + WITH_NVIDIA_PEERMEM: '0' args: host: 0.0.0.0 served-model-name: deepseek-ai/DeepSeek-V4-Pro-0813 @@ -199,6 +264,10 @@ srun_options: benchmark: type: custom command: bash /infmax-workspace/benchmarks/srt_agentic.sh + # The replay client holds ~300 GB of host memory; on the default head node it + # shares prefill_0's node and OOMs it. Put it on the etcd/nats node instead. + placement: + node: dedicated env: INFMAX_CONTAINER_WORKSPACE: /infmax-workspace RESULT_DIR: /logs/agentic diff --git a/inferencex-e2e/benchmarks/multi_node/srt-slurm-recipes/dsv4/sglang/gb200-fp4/agentx/disagg-gb200-2p1d-dep16-dep32-c768-mtp-kvoffload.yaml b/inferencex-e2e/benchmarks/multi_node/srt-slurm-recipes/dsv4/sglang/gb200-fp4/agentx/disagg-gb200-2p1d-dep16-dep32-c768-mtp-kvoffload.yaml index 4b7b7ff7b0..ff4cd0a15f 100644 --- a/inferencex-e2e/benchmarks/multi_node/srt-slurm-recipes/dsv4/sglang/gb200-fp4/agentx/disagg-gb200-2p1d-dep16-dep32-c768-mtp-kvoffload.yaml +++ b/inferencex-e2e/benchmarks/multi_node/srt-slurm-recipes/dsv4/sglang/gb200-fp4/agentx/disagg-gb200-2p1d-dep16-dep32-c768-mtp-kvoffload.yaml @@ -18,6 +18,11 @@ slurm: health_check: max_attempts: 1440 interval_seconds: 10 +# Tachometer's per-node exporters slow decode steps by a few percent and add +# host memory on the head node; this ladder is a throughput measurement. +observability: + tachometer: + enabled: false resources: gpu_type: gb200 gpus_per_node: 4 @@ -32,6 +37,54 @@ services: node: dedicated options: max_payload_mb: 32 +- name: mooncake-master + type: mooncake-master + args: + - --eviction_high_watermark_ratio=0.90 +# Decode ranks use a chunk cache, so their host DRAM only joins the store +# through standalone stores: four per decode node, so segments stay uniform +# with prefill's per-rank ones instead of one oversized segment per node. +- &decode-store + name: store-decode-0 + type: mooncake-store + placement: + node: decode + args: ["--port", "8800"] + env: + MOONCAKE_PROTOCOL: rdma + MOONCAKE_DEVICE: "mlx5_0,mlx5_1,mlx5_2,mlx5_3" + MOONCAKE_GLOBAL_SEGMENT_SIZE: 180gb + MC_STORE_CLIENT_METRIC_INTERVAL: '5' + MC_ENABLE_DEST_DEVICE_AFFINITY: '1' + # Advertise the store transfer engine on the node address instead of the first active + # interface, which can be a BMC Redfish host interface (the same 10.0.1.2 on every node). + MC_TCP_BIND_ADDRESS: "{node_ip}" + preamble: | + ulimit -n 1048576 + ulimit -l unlimited + # Cold container starts on a decode node can exceed srtctl's 120 s default; + # the <<: merge is shallow, so every store repeats the timeout. + readiness: + port: 8800 + timeout_seconds: 600 +- <<: *decode-store + name: store-decode-1 + args: ["--port", "8801"] + readiness: + port: 8801 + timeout_seconds: 600 +- <<: *decode-store + name: store-decode-2 + args: ["--port", "8802"] + readiness: + port: 8802 + timeout_seconds: 600 +- <<: *decode-store + name: store-decode-3 + args: ["--port", "8803"] + readiness: + port: 8803 + timeout_seconds: 600 frontend: type: dynamo nginx_session_affinity: true @@ -84,6 +137,18 @@ roles: SGLANG_REQUEST_STATE_WAIT_TIMEOUT: '60' SGLANG_NCCL_ALL_GATHER_IN_OVERLAP_SCHEDULER_SYNC_BATCH: '1' SGLANG_DSV4_MHC_PREWARM: '1' + MOONCAKE_PROTOCOL: rdma + # The store only registers host buffers on RDMA; without an explicit list it + # falls back to NVLink for same-domain peers and aborts at the warmup put. + MOONCAKE_DEVICE: "mlx5_0,mlx5_1,mlx5_2,mlx5_3" + MOONCAKE_GLOBAL_SEGMENT_SIZE: 140gb + MOONCAKE_STANDALONE_STORAGE: '0' + MC_STORE_CLIENT_METRIC_INTERVAL: '5' + MC_ENABLE_DEST_DEVICE_AFFINITY: '1' + # Advertise the store transfer engine on the node address instead of the first active + # interface, which can be a BMC Redfish host interface (the same 10.0.1.2 on every node). + MC_TCP_BIND_ADDRESS: "{node}" + WITH_NVIDIA_PEERMEM: '0' args: host: 0.0.0.0 served-model-name: deepseek-ai/DeepSeek-V4-Pro-0813 @@ -117,11 +182,9 @@ roles: speculative-num-steps: 1 speculative-eagle-topk: 1 speculative-num-draft-tokens: 7 - enable-hierarchical-cache: true - hicache-write-policy: write_back - hicache-ratio: 2 - hicache-io-backend: direct - hicache-mem-layout: page_first_direct + enable-unified-cache-external-linker: true + unified-cache-external-linker-backend: mooncake + hicache-storage-backend-extra-config: '{"enable_group_semantics":true}' cuda-graph-max-bs-decode: 256 decode: nodes: 8 @@ -157,6 +220,8 @@ roles: SGLANG_LOG_MS: '1' SGLANG_REQUEST_STATE_WAIT_TIMEOUT: '60' SGLANG_DSV4_MHC_PREWARM: '1' + MC_ENABLE_DEST_DEVICE_AFFINITY: '1' + WITH_NVIDIA_PEERMEM: '0' args: host: 0.0.0.0 served-model-name: deepseek-ai/DeepSeek-V4-Pro-0813 @@ -199,6 +264,10 @@ srun_options: benchmark: type: custom command: bash /infmax-workspace/benchmarks/srt_agentic.sh + # The replay client holds ~300 GB of host memory; on the default head node it + # shares prefill_0's node and OOMs it. Put it on the etcd/nats node instead. + placement: + node: dedicated env: INFMAX_CONTAINER_WORKSPACE: /infmax-workspace RESULT_DIR: /logs/agentic From a1806991be8cdff4e496ccc5f63b62a894b3b202 Mon Sep 17 00:00:00 2001 From: weireweire <20922698+weireweire@users.noreply.github.com> Date: Sat, 3 Oct 2026 17:10:45 +0800 Subject: [PATCH 2/8] config(agentx): record Mooncake as the GB200 DSV4 SGLang disagg KV offload backend --- inferencex-e2e/configs/nvidia-master.yaml | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/inferencex-e2e/configs/nvidia-master.yaml b/inferencex-e2e/configs/nvidia-master.yaml index b89ea8e9f7..f3eaf4835d 100644 --- a/inferencex-e2e/configs/nvidia-master.yaml +++ b/inferencex-e2e/configs/nvidia-master.yaml @@ -6694,7 +6694,7 @@ dsv4-fp4-gb200-dynamo-sglang-agentic-disagg: - spec-decoding: draft_model conc-list: [64] kv-offloading: dram - kv-offload-backend: { name: hicache } + kv-offload-backend: { name: mooncake, version: "0.3.13" } prefill: num-worker: 1 tp: 8 @@ -6710,7 +6710,7 @@ dsv4-fp4-gb200-dynamo-sglang-agentic-disagg: - spec-decoding: draft_model conc-list: [128] kv-offloading: dram - kv-offload-backend: { name: hicache } + kv-offload-backend: { name: mooncake, version: "0.3.13" } prefill: num-worker: 1 tp: 8 @@ -6726,7 +6726,7 @@ dsv4-fp4-gb200-dynamo-sglang-agentic-disagg: - spec-decoding: draft_model conc-list: [256] kv-offloading: dram - kv-offload-backend: { name: hicache } + kv-offload-backend: { name: mooncake, version: "0.3.13" } prefill: num-worker: 1 tp: 16 @@ -6742,7 +6742,7 @@ dsv4-fp4-gb200-dynamo-sglang-agentic-disagg: - spec-decoding: draft_model conc-list: [768] kv-offloading: dram - kv-offload-backend: { name: hicache } + kv-offload-backend: { name: mooncake, version: "0.3.13" } prefill: num-worker: 2 tp: 16 @@ -6758,7 +6758,7 @@ dsv4-fp4-gb200-dynamo-sglang-agentic-disagg: - spec-decoding: draft_model conc-list: [1024] kv-offloading: dram - kv-offload-backend: { name: hicache } + kv-offload-backend: { name: mooncake, version: "0.3.13" } prefill: num-worker: 2 tp: 16 @@ -6774,7 +6774,7 @@ dsv4-fp4-gb200-dynamo-sglang-agentic-disagg: - spec-decoding: draft_model conc-list: [1280] kv-offloading: dram - kv-offload-backend: { name: hicache } + kv-offload-backend: { name: mooncake, version: "0.3.13" } prefill: num-worker: 2 tp: 16 From f87550bf5825a93922896fbfb9d458207b52009b Mon Sep 17 00:00:00 2001 From: weireweire <20922698+weireweire@users.noreply.github.com> Date: Sat, 3 Oct 2026 20:19:43 +0800 Subject: [PATCH 3/8] docs(changelog): GB200 DSV4 SGLang AgentX Mooncake KV offload --- inferencex-e2e/perf-changelog.yaml | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/inferencex-e2e/perf-changelog.yaml b/inferencex-e2e/perf-changelog.yaml index db5662f5b8..5faa51c862 100644 --- a/inferencex-e2e/perf-changelog.yaml +++ b/inferencex-e2e/perf-changelog.yaml @@ -9292,3 +9292,20 @@ - "Update the B200 DeepSeek-V4.1-Flash vLLM AgentX image from nightly ddd6fbca to nightly-dev-x86_64-cu130-ac9126e58aa7 and enable FlashInfer autotuning." - "Run TP4 at concurrency 1-128 and replace TP2 with DEP2 (TP1 x DP2 + EP2, DeepGEMM MegaMoE) at concurrency 8-32 and DEP4 (TP1 x DP4 + EP4, MegaMoE) at concurrency 64-128, both behind a consistent-hash vLLM Router. All points set gpu-memory-utilization 0.97." pr-link: https://github.com/SemiAnalysisAI/InferenceX/pull/3686 + +- config-keys: + - dsv4-fp4-gb200-dynamo-sglang-agentic-disagg + scenario-type: + - agentic-coding + description: + - "Move the GB200 DeepSeek-V4-Pro AgentX disaggregated recipes from hierarchical cache to the Mooncake unified-cache external linker with group semantics, as #3187 did for GB300. MoE settings are unchanged: the recipes keep MegaMoE without W4A4 MXFP4." + - "Decode nodes lend host DRAM to the store through srt-slurm mooncake-store services: four 180GB standalone stores per decode node, gated on their readiness ports with a 600-second timeout. Prefill keeps a 140GB segment per rank. GB200 nodes have the same host memory as GB300 nodes, so the sizes carry over." + - "The prefill role and the decode stores name their RDMA devices (MOONCAKE_DEVICE=mlx5_0..3, as the GB200 vLLM Mooncake recipes do) and set MC_TCP_BIND_ADDRESS to their node, so each store transfer engine advertises the node address instead of the first active interface." + - "The benchmark client runs on the dedicated etcd/nats node, because prefill nodes now also hold Mooncake segments, and Tachometer's per-node exporters are off for this throughput ladder." + - "Measured at concurrency 128 (1P DEP8 / 1D DEP16) against the current recipe with the same image, srt-slurm and golden acceptance length: 26,566 vs 23,763 total tok/s/GPU (+11.8%) at the same P90 TPOT (7.31 vs 7.22 ms), with TTFT p50 3.27 vs 4.95 s." + - "将 GB200 DeepSeek-V4-Pro AgentX 分离式配方从 hierarchical cache 切换到启用 group semantics 的 Mooncake unified-cache external linker,与 #3187 对 GB300 的改动一致。MoE 设置不变:配方继续使用不启用 W4A4 MXFP4 的 MegaMoE。" + - "decode 节点通过 srt-slurm 的 mooncake-store 服务向 store 借出主机 DRAM:每个 decode 节点 4 个 180GB 的独立 store,以就绪端口作为启动检查,超时 600 秒。prefill 每个 rank 保留 140GB segment。GB200 与 GB300 节点的主机内存相同,因此沿用相同大小。" + - "prefill 角色与 decode 的 store 显式指定 RDMA 设备(MOONCAKE_DEVICE=mlx5_0..3,与 GB200 vLLM Mooncake 配方一致),并将 MC_TCP_BIND_ADDRESS 设为所在节点,使每个 store 传输引擎公布节点自身地址,而不是第一个活动网卡。" + - "压测客户端运行在独立的 etcd/nats 节点上,因为 prefill 节点现在也承载 Mooncake segment;该吞吐阶梯关闭 Tachometer 的逐节点 exporter。" + - "在并发 128(1P DEP8 / 1D DEP16)下,与当前配方在相同镜像、srt-slurm 与 golden acceptance length 下对比:单卡总吞吐 26,566 对 23,763 tok/s/GPU(+11.8%),P90 TPOT 相当(7.31 对 7.22 ms),TTFT p50 为 3.27 对 4.95 秒。" + pr-link: https://github.com/SemiAnalysisAI/InferenceX/pull/TBD From 60d03e8b591bda99234b0e2c80a8cfa9de408e7d Mon Sep 17 00:00:00 2001 From: weireweire <20922698+weireweire@users.noreply.github.com> Date: Sat, 3 Oct 2026 20:20:25 +0800 Subject: [PATCH 4/8] docs(changelog): link #3701 --- inferencex-e2e/perf-changelog.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/inferencex-e2e/perf-changelog.yaml b/inferencex-e2e/perf-changelog.yaml index 5faa51c862..c441ce4b60 100644 --- a/inferencex-e2e/perf-changelog.yaml +++ b/inferencex-e2e/perf-changelog.yaml @@ -9308,4 +9308,4 @@ - "prefill 角色与 decode 的 store 显式指定 RDMA 设备(MOONCAKE_DEVICE=mlx5_0..3,与 GB200 vLLM Mooncake 配方一致),并将 MC_TCP_BIND_ADDRESS 设为所在节点,使每个 store 传输引擎公布节点自身地址,而不是第一个活动网卡。" - "压测客户端运行在独立的 etcd/nats 节点上,因为 prefill 节点现在也承载 Mooncake segment;该吞吐阶梯关闭 Tachometer 的逐节点 exporter。" - "在并发 128(1P DEP8 / 1D DEP16)下,与当前配方在相同镜像、srt-slurm 与 golden acceptance length 下对比:单卡总吞吐 26,566 对 23,763 tok/s/GPU(+11.8%),P90 TPOT 相当(7.31 对 7.22 ms),TTFT p50 为 3.27 对 4.95 秒。" - pr-link: https://github.com/SemiAnalysisAI/InferenceX/pull/TBD + pr-link: https://github.com/SemiAnalysisAI/InferenceX/pull/3701 From 28b5f47ee758e4b316690dafe7c8b449289d8a7c Mon Sep 17 00:00:00 2001 From: weireweire <20922698+weireweire@users.noreply.github.com> Date: Tue, 6 Oct 2026 18:42:29 +0800 Subject: [PATCH 5/8] perf(agentx): 8k-token prefill chunks per rank on the GB200 DSV4 DEP16 prefill recipes Raise chunked-prefill-size from 65536 to 131072 on the c256/c768/c1024/c1280 DEP16 prefill workers (4k to 8k tokens per DP rank) and lower prefill mem-fraction-static from 0.85 to 0.80; 8k chunks run out of GPU memory at 0.85. --- .../disagg-gb200-1p1d-dep16-dep32-c256-mtp-kvoffload.yaml | 6 ++++-- .../disagg-gb200-2p1d-dep16-dep32-c1024-mtp-kvoffload.yaml | 6 ++++-- .../disagg-gb200-2p1d-dep16-dep32-c1280-mtp-kvoffload.yaml | 6 ++++-- .../disagg-gb200-2p1d-dep16-dep32-c768-mtp-kvoffload.yaml | 6 ++++-- 4 files changed, 16 insertions(+), 8 deletions(-) diff --git a/inferencex-e2e/benchmarks/multi_node/srt-slurm-recipes/dsv4/sglang/gb200-fp4/agentx/disagg-gb200-1p1d-dep16-dep32-c256-mtp-kvoffload.yaml b/inferencex-e2e/benchmarks/multi_node/srt-slurm-recipes/dsv4/sglang/gb200-fp4/agentx/disagg-gb200-1p1d-dep16-dep32-c256-mtp-kvoffload.yaml index 541934f0af..760f4994fd 100644 --- a/inferencex-e2e/benchmarks/multi_node/srt-slurm-recipes/dsv4/sglang/gb200-fp4/agentx/disagg-gb200-1p1d-dep16-dep32-c256-mtp-kvoffload.yaml +++ b/inferencex-e2e/benchmarks/multi_node/srt-slurm-recipes/dsv4/sglang/gb200-fp4/agentx/disagg-gb200-1p1d-dep16-dep32-c256-mtp-kvoffload.yaml @@ -169,11 +169,13 @@ roles: disaggregation-transfer-backend: mooncake disaggregation-mode: prefill load-balance-method: total_tokens - mem-fraction-static: 0.85 + # Prefill runs 8k-token chunks per DP rank (chunked-prefill-size 131072 / DEP16), + # which run out of GPU memory at 0.85 on GB200. + mem-fraction-static: 0.80 page-size: 256 swa-full-tokens-ratio: 0.02 max-running-requests: 256 - chunked-prefill-size: 65536 + chunked-prefill-size: 131072 disable-flashinfer-autotune: true model-loader-extra-config: '{"enable_multithread_load":true,"num_threads":8}' kv-events-config: '{"publisher":"zmq","topic":"kv-events","endpoint":"tcp://*:5557"}' diff --git a/inferencex-e2e/benchmarks/multi_node/srt-slurm-recipes/dsv4/sglang/gb200-fp4/agentx/disagg-gb200-2p1d-dep16-dep32-c1024-mtp-kvoffload.yaml b/inferencex-e2e/benchmarks/multi_node/srt-slurm-recipes/dsv4/sglang/gb200-fp4/agentx/disagg-gb200-2p1d-dep16-dep32-c1024-mtp-kvoffload.yaml index f1672f9e54..39d118f51e 100644 --- a/inferencex-e2e/benchmarks/multi_node/srt-slurm-recipes/dsv4/sglang/gb200-fp4/agentx/disagg-gb200-2p1d-dep16-dep32-c1024-mtp-kvoffload.yaml +++ b/inferencex-e2e/benchmarks/multi_node/srt-slurm-recipes/dsv4/sglang/gb200-fp4/agentx/disagg-gb200-2p1d-dep16-dep32-c1024-mtp-kvoffload.yaml @@ -169,11 +169,13 @@ roles: disaggregation-transfer-backend: mooncake disaggregation-mode: prefill load-balance-method: total_tokens - mem-fraction-static: 0.85 + # Prefill runs 8k-token chunks per DP rank (chunked-prefill-size 131072 / DEP16), + # which run out of GPU memory at 0.85 on GB200. + mem-fraction-static: 0.80 page-size: 256 swa-full-tokens-ratio: 0.02 max-running-requests: 256 - chunked-prefill-size: 65536 + chunked-prefill-size: 131072 disable-flashinfer-autotune: true model-loader-extra-config: '{"enable_multithread_load":true,"num_threads":8}' kv-events-config: '{"publisher":"zmq","topic":"kv-events","endpoint":"tcp://*:5557"}' diff --git a/inferencex-e2e/benchmarks/multi_node/srt-slurm-recipes/dsv4/sglang/gb200-fp4/agentx/disagg-gb200-2p1d-dep16-dep32-c1280-mtp-kvoffload.yaml b/inferencex-e2e/benchmarks/multi_node/srt-slurm-recipes/dsv4/sglang/gb200-fp4/agentx/disagg-gb200-2p1d-dep16-dep32-c1280-mtp-kvoffload.yaml index ac2ed56b08..fcc9007b18 100644 --- a/inferencex-e2e/benchmarks/multi_node/srt-slurm-recipes/dsv4/sglang/gb200-fp4/agentx/disagg-gb200-2p1d-dep16-dep32-c1280-mtp-kvoffload.yaml +++ b/inferencex-e2e/benchmarks/multi_node/srt-slurm-recipes/dsv4/sglang/gb200-fp4/agentx/disagg-gb200-2p1d-dep16-dep32-c1280-mtp-kvoffload.yaml @@ -169,11 +169,13 @@ roles: disaggregation-transfer-backend: mooncake disaggregation-mode: prefill load-balance-method: total_tokens - mem-fraction-static: 0.85 + # Prefill runs 8k-token chunks per DP rank (chunked-prefill-size 131072 / DEP16), + # which run out of GPU memory at 0.85 on GB200. + mem-fraction-static: 0.80 page-size: 256 swa-full-tokens-ratio: 0.02 max-running-requests: 256 - chunked-prefill-size: 65536 + chunked-prefill-size: 131072 disable-flashinfer-autotune: true model-loader-extra-config: '{"enable_multithread_load":true,"num_threads":8}' kv-events-config: '{"publisher":"zmq","topic":"kv-events","endpoint":"tcp://*:5557"}' diff --git a/inferencex-e2e/benchmarks/multi_node/srt-slurm-recipes/dsv4/sglang/gb200-fp4/agentx/disagg-gb200-2p1d-dep16-dep32-c768-mtp-kvoffload.yaml b/inferencex-e2e/benchmarks/multi_node/srt-slurm-recipes/dsv4/sglang/gb200-fp4/agentx/disagg-gb200-2p1d-dep16-dep32-c768-mtp-kvoffload.yaml index ff4cd0a15f..caa63de7d6 100644 --- a/inferencex-e2e/benchmarks/multi_node/srt-slurm-recipes/dsv4/sglang/gb200-fp4/agentx/disagg-gb200-2p1d-dep16-dep32-c768-mtp-kvoffload.yaml +++ b/inferencex-e2e/benchmarks/multi_node/srt-slurm-recipes/dsv4/sglang/gb200-fp4/agentx/disagg-gb200-2p1d-dep16-dep32-c768-mtp-kvoffload.yaml @@ -169,11 +169,13 @@ roles: disaggregation-transfer-backend: mooncake disaggregation-mode: prefill load-balance-method: total_tokens - mem-fraction-static: 0.85 + # Prefill runs 8k-token chunks per DP rank (chunked-prefill-size 131072 / DEP16), + # which run out of GPU memory at 0.85 on GB200. + mem-fraction-static: 0.80 page-size: 256 swa-full-tokens-ratio: 0.02 max-running-requests: 256 - chunked-prefill-size: 65536 + chunked-prefill-size: 131072 disable-flashinfer-autotune: true model-loader-extra-config: '{"enable_multithread_load":true,"num_threads":8}' kv-events-config: '{"publisher":"zmq","topic":"kv-events","endpoint":"tcp://*:5557"}' From 47f237ca9f5b3c0510c2cad0477550b4265784fe Mon Sep 17 00:00:00 2001 From: weireweire <20922698+weireweire@users.noreply.github.com> Date: Tue, 6 Oct 2026 18:43:05 +0800 Subject: [PATCH 6/8] docs(changelog): GB200 DSV4 agg key, DEP16 prefill chunks; English-only entry List dsv4-fp4-gb200-dynamo-sglang-agentic-agg so the sweep reruns the low-latency TP8 c1/c4 points, describe the 8k-token DEP16 prefill chunks, and drop the Chinese bullets now that new changelog entries must be English-only. --- inferencex-e2e/perf-changelog.yaml | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/inferencex-e2e/perf-changelog.yaml b/inferencex-e2e/perf-changelog.yaml index 0aa77612cc..e3c4e02a3e 100644 --- a/inferencex-e2e/perf-changelog.yaml +++ b/inferencex-e2e/perf-changelog.yaml @@ -9311,6 +9311,7 @@ pr-link: https://github.com/SemiAnalysisAI/InferenceX/pull/3664 - config-keys: + - dsv4-fp4-gb200-dynamo-sglang-agentic-agg - dsv4-fp4-gb200-dynamo-sglang-agentic-disagg scenario-type: - agentic-coding @@ -9319,10 +9320,7 @@ - "Decode nodes lend host DRAM to the store through srt-slurm mooncake-store services: four 180GB standalone stores per decode node, gated on their readiness ports with a 600-second timeout. Prefill keeps a 140GB segment per rank. GB200 nodes have the same host memory as GB300 nodes, so the sizes carry over." - "The prefill role and the decode stores name their RDMA devices (MOONCAKE_DEVICE=mlx5_0..3, as the GB200 vLLM Mooncake recipes do) and set MC_TCP_BIND_ADDRESS to their node, so each store transfer engine advertises the node address instead of the first active interface." - "The benchmark client runs on the dedicated etcd/nats node, because prefill nodes now also hold Mooncake segments, and Tachometer's per-node exporters are off for this throughput ladder." + - "The DEP16 prefill workers (c256, c768, c1024, c1280) run 8k-token chunks per DP rank instead of 4k (chunked-prefill-size 65536 to 131072) with prefill mem-fraction-static lowered from 0.85 to 0.80; at 0.85 the 8k chunks run out of GPU memory." + - "The aggregate TP8 c1/c4 recipes are unchanged and stay on hierarchical cache; their config key is listed so this sweep covers the whole GB200 Pareto ladder, including the low-latency points." - "Measured at concurrency 128 (1P DEP8 / 1D DEP16) against the current recipe with the same image, srt-slurm and golden acceptance length: 26,566 vs 23,763 total tok/s/GPU (+11.8%) at the same P90 TPOT (7.31 vs 7.22 ms), with TTFT p50 3.27 vs 4.95 s." - - "将 GB200 DeepSeek-V4-Pro AgentX 分离式配方从 hierarchical cache 切换到启用 group semantics 的 Mooncake unified-cache external linker,与 #3187 对 GB300 的改动一致。MoE 设置不变:配方继续使用不启用 W4A4 MXFP4 的 MegaMoE。" - - "decode 节点通过 srt-slurm 的 mooncake-store 服务向 store 借出主机 DRAM:每个 decode 节点 4 个 180GB 的独立 store,以就绪端口作为启动检查,超时 600 秒。prefill 每个 rank 保留 140GB segment。GB200 与 GB300 节点的主机内存相同,因此沿用相同大小。" - - "prefill 角色与 decode 的 store 显式指定 RDMA 设备(MOONCAKE_DEVICE=mlx5_0..3,与 GB200 vLLM Mooncake 配方一致),并将 MC_TCP_BIND_ADDRESS 设为所在节点,使每个 store 传输引擎公布节点自身地址,而不是第一个活动网卡。" - - "压测客户端运行在独立的 etcd/nats 节点上,因为 prefill 节点现在也承载 Mooncake segment;该吞吐阶梯关闭 Tachometer 的逐节点 exporter。" - - "在并发 128(1P DEP8 / 1D DEP16)下,与当前配方在相同镜像、srt-slurm 与 golden acceptance length 下对比:单卡总吞吐 26,566 对 23,763 tok/s/GPU(+11.8%),P90 TPOT 相当(7.31 对 7.22 ms),TTFT p50 为 3.27 对 4.95 秒。" pr-link: https://github.com/SemiAnalysisAI/InferenceX/pull/3701 From e12d06406f46e727d96fbc617189aee448796526 Mon Sep 17 00:00:00 2001 From: weireweire <20922698+weireweire@users.noreply.github.com> Date: Thu, 8 Oct 2026 01:05:31 +0800 Subject: [PATCH 7/8] Revert "perf(agentx): 8k-token prefill chunks per rank on the GB200 DSV4 DEP16 prefill recipes" This reverts commit 28b5f47ee758e4b316690dafe7c8b449289d8a7c. --- .../disagg-gb200-1p1d-dep16-dep32-c256-mtp-kvoffload.yaml | 6 ++---- .../disagg-gb200-2p1d-dep16-dep32-c1024-mtp-kvoffload.yaml | 6 ++---- .../disagg-gb200-2p1d-dep16-dep32-c1280-mtp-kvoffload.yaml | 6 ++---- .../disagg-gb200-2p1d-dep16-dep32-c768-mtp-kvoffload.yaml | 6 ++---- 4 files changed, 8 insertions(+), 16 deletions(-) diff --git a/inferencex-e2e/benchmarks/multi_node/srt-slurm-recipes/dsv4/sglang/gb200-fp4/agentx/disagg-gb200-1p1d-dep16-dep32-c256-mtp-kvoffload.yaml b/inferencex-e2e/benchmarks/multi_node/srt-slurm-recipes/dsv4/sglang/gb200-fp4/agentx/disagg-gb200-1p1d-dep16-dep32-c256-mtp-kvoffload.yaml index 760f4994fd..541934f0af 100644 --- a/inferencex-e2e/benchmarks/multi_node/srt-slurm-recipes/dsv4/sglang/gb200-fp4/agentx/disagg-gb200-1p1d-dep16-dep32-c256-mtp-kvoffload.yaml +++ b/inferencex-e2e/benchmarks/multi_node/srt-slurm-recipes/dsv4/sglang/gb200-fp4/agentx/disagg-gb200-1p1d-dep16-dep32-c256-mtp-kvoffload.yaml @@ -169,13 +169,11 @@ roles: disaggregation-transfer-backend: mooncake disaggregation-mode: prefill load-balance-method: total_tokens - # Prefill runs 8k-token chunks per DP rank (chunked-prefill-size 131072 / DEP16), - # which run out of GPU memory at 0.85 on GB200. - mem-fraction-static: 0.80 + mem-fraction-static: 0.85 page-size: 256 swa-full-tokens-ratio: 0.02 max-running-requests: 256 - chunked-prefill-size: 131072 + chunked-prefill-size: 65536 disable-flashinfer-autotune: true model-loader-extra-config: '{"enable_multithread_load":true,"num_threads":8}' kv-events-config: '{"publisher":"zmq","topic":"kv-events","endpoint":"tcp://*:5557"}' diff --git a/inferencex-e2e/benchmarks/multi_node/srt-slurm-recipes/dsv4/sglang/gb200-fp4/agentx/disagg-gb200-2p1d-dep16-dep32-c1024-mtp-kvoffload.yaml b/inferencex-e2e/benchmarks/multi_node/srt-slurm-recipes/dsv4/sglang/gb200-fp4/agentx/disagg-gb200-2p1d-dep16-dep32-c1024-mtp-kvoffload.yaml index 39d118f51e..f1672f9e54 100644 --- a/inferencex-e2e/benchmarks/multi_node/srt-slurm-recipes/dsv4/sglang/gb200-fp4/agentx/disagg-gb200-2p1d-dep16-dep32-c1024-mtp-kvoffload.yaml +++ b/inferencex-e2e/benchmarks/multi_node/srt-slurm-recipes/dsv4/sglang/gb200-fp4/agentx/disagg-gb200-2p1d-dep16-dep32-c1024-mtp-kvoffload.yaml @@ -169,13 +169,11 @@ roles: disaggregation-transfer-backend: mooncake disaggregation-mode: prefill load-balance-method: total_tokens - # Prefill runs 8k-token chunks per DP rank (chunked-prefill-size 131072 / DEP16), - # which run out of GPU memory at 0.85 on GB200. - mem-fraction-static: 0.80 + mem-fraction-static: 0.85 page-size: 256 swa-full-tokens-ratio: 0.02 max-running-requests: 256 - chunked-prefill-size: 131072 + chunked-prefill-size: 65536 disable-flashinfer-autotune: true model-loader-extra-config: '{"enable_multithread_load":true,"num_threads":8}' kv-events-config: '{"publisher":"zmq","topic":"kv-events","endpoint":"tcp://*:5557"}' diff --git a/inferencex-e2e/benchmarks/multi_node/srt-slurm-recipes/dsv4/sglang/gb200-fp4/agentx/disagg-gb200-2p1d-dep16-dep32-c1280-mtp-kvoffload.yaml b/inferencex-e2e/benchmarks/multi_node/srt-slurm-recipes/dsv4/sglang/gb200-fp4/agentx/disagg-gb200-2p1d-dep16-dep32-c1280-mtp-kvoffload.yaml index fcc9007b18..ac2ed56b08 100644 --- a/inferencex-e2e/benchmarks/multi_node/srt-slurm-recipes/dsv4/sglang/gb200-fp4/agentx/disagg-gb200-2p1d-dep16-dep32-c1280-mtp-kvoffload.yaml +++ b/inferencex-e2e/benchmarks/multi_node/srt-slurm-recipes/dsv4/sglang/gb200-fp4/agentx/disagg-gb200-2p1d-dep16-dep32-c1280-mtp-kvoffload.yaml @@ -169,13 +169,11 @@ roles: disaggregation-transfer-backend: mooncake disaggregation-mode: prefill load-balance-method: total_tokens - # Prefill runs 8k-token chunks per DP rank (chunked-prefill-size 131072 / DEP16), - # which run out of GPU memory at 0.85 on GB200. - mem-fraction-static: 0.80 + mem-fraction-static: 0.85 page-size: 256 swa-full-tokens-ratio: 0.02 max-running-requests: 256 - chunked-prefill-size: 131072 + chunked-prefill-size: 65536 disable-flashinfer-autotune: true model-loader-extra-config: '{"enable_multithread_load":true,"num_threads":8}' kv-events-config: '{"publisher":"zmq","topic":"kv-events","endpoint":"tcp://*:5557"}' diff --git a/inferencex-e2e/benchmarks/multi_node/srt-slurm-recipes/dsv4/sglang/gb200-fp4/agentx/disagg-gb200-2p1d-dep16-dep32-c768-mtp-kvoffload.yaml b/inferencex-e2e/benchmarks/multi_node/srt-slurm-recipes/dsv4/sglang/gb200-fp4/agentx/disagg-gb200-2p1d-dep16-dep32-c768-mtp-kvoffload.yaml index caa63de7d6..ff4cd0a15f 100644 --- a/inferencex-e2e/benchmarks/multi_node/srt-slurm-recipes/dsv4/sglang/gb200-fp4/agentx/disagg-gb200-2p1d-dep16-dep32-c768-mtp-kvoffload.yaml +++ b/inferencex-e2e/benchmarks/multi_node/srt-slurm-recipes/dsv4/sglang/gb200-fp4/agentx/disagg-gb200-2p1d-dep16-dep32-c768-mtp-kvoffload.yaml @@ -169,13 +169,11 @@ roles: disaggregation-transfer-backend: mooncake disaggregation-mode: prefill load-balance-method: total_tokens - # Prefill runs 8k-token chunks per DP rank (chunked-prefill-size 131072 / DEP16), - # which run out of GPU memory at 0.85 on GB200. - mem-fraction-static: 0.80 + mem-fraction-static: 0.85 page-size: 256 swa-full-tokens-ratio: 0.02 max-running-requests: 256 - chunked-prefill-size: 131072 + chunked-prefill-size: 65536 disable-flashinfer-autotune: true model-loader-extra-config: '{"enable_multithread_load":true,"num_threads":8}' kv-events-config: '{"publisher":"zmq","topic":"kv-events","endpoint":"tcp://*:5557"}' From b7e858958472d3c5d52454068ebc3addbdd94224 Mon Sep 17 00:00:00 2001 From: weireweire <20922698+weireweire@users.noreply.github.com> Date: Thu, 8 Oct 2026 01:05:40 +0800 Subject: [PATCH 8/8] docs(changelog): drop the reverted DEP16 prefill chunk change from the GB200 DSV4 entry --- inferencex-e2e/perf-changelog.yaml | 1 - 1 file changed, 1 deletion(-) diff --git a/inferencex-e2e/perf-changelog.yaml b/inferencex-e2e/perf-changelog.yaml index b5d8df3833..b9b9fde46b 100644 --- a/inferencex-e2e/perf-changelog.yaml +++ b/inferencex-e2e/perf-changelog.yaml @@ -9338,7 +9338,6 @@ - "Decode nodes lend host DRAM to the store through srt-slurm mooncake-store services: four 180GB standalone stores per decode node, gated on their readiness ports with a 600-second timeout. Prefill keeps a 140GB segment per rank. GB200 nodes have the same host memory as GB300 nodes, so the sizes carry over." - "The prefill role and the decode stores name their RDMA devices (MOONCAKE_DEVICE=mlx5_0..3, as the GB200 vLLM Mooncake recipes do) and set MC_TCP_BIND_ADDRESS to their node, so each store transfer engine advertises the node address instead of the first active interface." - "The benchmark client runs on the dedicated etcd/nats node, because prefill nodes now also hold Mooncake segments, and Tachometer's per-node exporters are off for this throughput ladder." - - "The DEP16 prefill workers (c256, c768, c1024, c1280) run 8k-token chunks per DP rank instead of 4k (chunked-prefill-size 65536 to 131072) with prefill mem-fraction-static lowered from 0.85 to 0.80; at 0.85 the 8k chunks run out of GPU memory." - "The aggregate TP8 c1/c4 recipes are unchanged and stay on hierarchical cache; their config key is listed so this sweep covers the whole GB200 Pareto ladder, including the low-latency points." - "Measured at concurrency 128 (1P DEP8 / 1D DEP16) against the current recipe with the same image, srt-slurm and golden acceptance length: 26,566 vs 23,763 total tok/s/GPU (+11.8%) at the same P90 TPOT (7.31 vs 7.22 ms), with TTFT p50 3.27 vs 4.95 s." pr-link: https://github.com/SemiAnalysisAI/InferenceX/pull/3701