From 9726490ad4c092465c3046c907df7250a8632b32 Mon Sep 17 00:00:00 2001 From: Cam Quilici Date: Wed, 29 Jul 2026 23:48:20 -0500 Subject: [PATCH 01/30] feat: add Qwen3.5 FP4 B300 AgentX MTP MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Add the initial SGLang NEXTN AgentX recipe with golden synthetic acceptance and 256k traces.\n\n中文:新增 Qwen3.5 FP4 B300 AgentX MTP 初始配置,使用 SGLang NEXTN、黄金合成接受长度和 256k 轨迹数据集。 --- .../agentic/qwen3.5_fp4_b300_sglang_mtp.sh | 118 ++++++++++++++++++ configs/nvidia-master.yaml | 15 +++ 2 files changed, 133 insertions(+) create mode 100755 benchmarks/single_node/agentic/qwen3.5_fp4_b300_sglang_mtp.sh diff --git a/benchmarks/single_node/agentic/qwen3.5_fp4_b300_sglang_mtp.sh b/benchmarks/single_node/agentic/qwen3.5_fp4_b300_sglang_mtp.sh new file mode 100755 index 0000000000..a622a42500 --- /dev/null +++ b/benchmarks/single_node/agentic/qwen3.5_fp4_b300_sglang_mtp.sh @@ -0,0 +1,118 @@ +#!/usr/bin/env bash +set -euo pipefail +set -x + +# AgentX trace replay for Qwen3.5-397B-A17B NVFP4 on B300 with SGLang +# native NEXTN MTP. Throughput uses the committed golden synthetic AL; evals +# retain real target-model verification. + +source "$(dirname "$0")/../../benchmark_lib.sh" + +check_env_vars \ + MODEL TP CONC EP_SIZE KV_OFFLOADING TOTAL_CPU_DRAM_GB RESULT_DIR DURATION + +SCHEDULER_RECV_INTERVAL=${SCHEDULER_RECV_INTERVAL:-10} + +if [[ -n "${SLURM_JOB_ID:-}" ]]; then + echo "JOB $SLURM_JOB_ID running on ${SLURMD_NODENAME:-unknown}" +fi + +if [[ -n "${MODEL_PATH:-}" ]]; then + if [[ ! -d "$MODEL_PATH" || -z "$(ls -A "$MODEL_PATH" 2>/dev/null)" ]]; then + hf download "$MODEL" --local-dir "$MODEL_PATH" + fi +else + hf download "$MODEL" + export MODEL_PATH="$MODEL" +fi +nvidia-smi + +export WEKA_LOADER_OVERRIDE=semianalysis_cc_traces_weka_062126_256k +resolve_trace_source +install_agentic_deps + +SERVER_LOG="$RESULT_DIR/server.log" +mkdir -p "$RESULT_DIR" + +CACHE_ARGS=() +if require_agentic_kv_offload_backend hicache; then + HICACHE_HOST_POOL_COUNT="${HICACHE_HOST_POOL_COUNT:-2}" + MAX_HICACHE_SIZE_GB=$((TOTAL_CPU_DRAM_GB / TP / HICACHE_HOST_POOL_COUNT)) + HICACHE_SIZE_GB="${HICACHE_SIZE_GB:-$MAX_HICACHE_SIZE_GB}" + if [ "$HICACHE_SIZE_GB" -lt 1 ] || [ "$HICACHE_SIZE_GB" -gt "$MAX_HICACHE_SIZE_GB" ]; then + echo "Error: HICACHE_SIZE_GB=$HICACHE_SIZE_GB outside 1..$MAX_HICACHE_SIZE_GB" >&2 + exit 1 + fi + CACHE_ARGS=( + --page-size 64 + --enable-hierarchical-cache + --hicache-size "$HICACHE_SIZE_GB" + --hicache-io-backend kernel + --hicache-mem-layout page_first + --hicache-write-policy write_through_selective + ) +fi + +export TORCH_CUDA_ARCH_LIST="10.0" +export PYTHONNOUSERSITE=1 +export NCCL_NVLS_ENABLE=1 +export SGL_ENABLE_JIT_DEEPGEMM=false +export SGLANG_ENABLE_FLASHINFER_GEMM=true +export SGLANG_ENABLE_SPEC_V2=1 + +if [ "${EVAL_ONLY:-false}" != "true" ]; then + export SGLANG_SIMULATE_ACC_LEN=3.39 + export SGLANG_SIMULATE_ACC_METHOD=match-expected + export SGLANG_SIMULATE_ACC_TOKEN_MODE=real-draft-token +fi + +SGLANG_CMD=( + python3 -m sglang.launch_server + --model-path "$MODEL_PATH" + --served-model-name "$MODEL" + --host 0.0.0.0 + --port "$PORT" + --trust-remote-code + --tensor-parallel-size "$TP" + --data-parallel-size 1 + --expert-parallel-size "$EP_SIZE" + --enable-symm-mem + --quantization modelopt_fp4 + --fp4-gemm-backend flashinfer_cutlass + --kv-cache-dtype fp8_e4m3 + --mamba-ssm-dtype bfloat16 + --attention-backend trtllm_mha + --moe-runner-backend flashinfer_trtllm + --cuda-graph-max-bs "$CONC" + --max-running-requests "$CONC" + --max-prefill-tokens 16384 + --chunked-prefill-size 16384 + --mem-fraction-static 0.80 + --stream-interval 50 + --scheduler-recv-interval "$SCHEDULER_RECV_INTERVAL" + --tokenizer-worker-num 6 + --tokenizer-path "$MODEL" + --reasoning-parser qwen3 + --tool-call-parser qwen3_coder + --enable-auto-tool-choice + --speculative-algorithm NEXTN + --speculative-num-steps 3 + --speculative-eagle-topk 1 + --speculative-num-draft-tokens 4 + --enable-metrics + "${CACHE_ARGS[@]}" +) + +printf '%q ' "${SGLANG_CMD[@]}" | tee "$RESULT_DIR/sglang_command.txt" +printf '\n' | tee -a "$RESULT_DIR/sglang_command.txt" +"${SGLANG_CMD[@]}" > "$SERVER_LOG" 2>&1 & +SERVER_PID=$! + +wait_for_server_ready --port "$PORT" --server-log "$SERVER_LOG" --server-pid "$SERVER_PID" + +if [ "${EVAL_ONLY:-false}" = "true" ]; then + run_eval --port "$PORT" +else + build_replay_cmd "$RESULT_DIR" + run_agentic_replay_and_write_outputs "$RESULT_DIR" +fi diff --git a/configs/nvidia-master.yaml b/configs/nvidia-master.yaml index 8ee037c8c2..eca7b7bbf4 100644 --- a/configs/nvidia-master.yaml +++ b/configs/nvidia-master.yaml @@ -7140,6 +7140,21 @@ qwen3.5-fp8-b300-sglang-agentic-hicache: - { tp: 4, ep: 1, kv-offloading: none, conc-list: [1, 2, 4, 8, 16, 32] } - { tp: 4, ep: 1, kv-offloading: dram, kv-offload-backend: { name: hicache }, conc-list: [16, 32, 48, 64] } +qwen3.5-fp4-b300-sglang-agentic-mtp: + image: lmsysorg/sglang:nightly-dev-cu13-20260724-433429b1 + model: nvidia/Qwen3.5-397B-A17B-NVFP4 + model-prefix: qwen3.5 + runner: cluster:b300-nv + precision: fp4 + framework: sglang + multinode: false + scenarios: + agentic-coding: + - dram-utilization: 0.80 + search-space: + - { tp: 4, ep: 1, spec-decoding: mtp, kv-offloading: none, conc-list: [1, 2, 4, 8, 16] } + - { tp: 2, ep: 2, spec-decoding: mtp, kv-offloading: none, conc-list: [1, 4, 8, 16, 32] } + kimik2.5-fp4-b200-vllm-agentic-lmcache: image: vllm/vllm-openai:v0.22.0 model: nvidia/Kimi-K2.5-NVFP4 From c8dd6602ee8ea6001a9df4bbac740b46c795b528 Mon Sep 17 00:00:00 2001 From: Cam Quilici Date: Wed, 29 Jul 2026 23:48:49 -0500 Subject: [PATCH 02/30] chore: trigger B300 AgentX sweep MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Append the Qwen3.5 FP4 B300 AgentX MTP benchmark entry.\n\n中文:追加 Qwen3.5 FP4 B300 AgentX MTP 基准测试触发记录。 --- perf-changelog.yaml | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/perf-changelog.yaml b/perf-changelog.yaml index c1736ae420..55520b4d95 100644 --- a/perf-changelog.yaml +++ b/perf-changelog.yaml @@ -5311,3 +5311,10 @@ - "Search space mirrors the non-MTP entry's KV arms -- TP8 GPU-resident and TP8 host-DRAM offload -- so the spec-decoding delta is readable at equal concurrency, but stops at conc 16 rather than 24. The non-MTP bring-up sweep (run 30326393603) showed the GPU-resident arm already thrashing at conc >= 16 (prefix cache hit rate 2.7%, TTFT p50 86-191s) because GPU KV holds only ~3.1 max-length requests, so conc 24 would spend a full job per arm re-measuring that regime; conc 16 still exercises the DRAM tier meaningfully (62% external prefix cache hit rate). TP8-only for the same memory reason: a ~1.5 TB MXFP4 checkpoint needs ~188 GB/GPU across 8 B300s and does not fit below 8 GPUs." - "Sets VLLM_ENABLE_K3_LATENT_MOE_TAIL_FUSION=1, which the upstream recipe requires on both its blackwell and nvidia paths and which this repo had never set. It defaults to 0 and is threaded into LatentMoERunner as runner_args={\"enable_k3_latent_moe_tail_fusion\": ...} at vllm/models/kimi_k3/nvidia/model.py:549 -- the same runner whose shared-experts output buffer asserted (fused_moe/runner/shared_experts.py:165, all 8 TP ranks at once) when the wider flag alignment was attempted, so every K3 run here so far has been exercising a MoE tail path upstream does not use. Enabled on its own, ahead of re-attempting gpu-memory-utilization 0.95, max-num-seqs 32, --no-enable-flashinfer-autotune or VLLM_USE_V2_MODEL_RUNNER=1, to isolate its effect." pr-link: https://github.com/SemiAnalysisAI/InferenceX/pull/2418 + +- config-keys: + - qwen3.5-fp4-b300-sglang-agentic-mtp + description: + - "Add Qwen3.5-397B-A17B NVFP4 AgentX benchmark on B300 with SGLang native NEXTN MTP" + - "Use the 256k trace dataset and golden synthetic acceptance length 3.39" + pr-link: https://github.com/SemiAnalysisAI/InferenceX/pull/2421 From 85521aad83b874d10475da69077e3146bbe2a589 Mon Sep 17 00:00:00 2001 From: Cam Quilici Date: Wed, 29 Jul 2026 23:50:42 -0500 Subject: [PATCH 03/30] perf: expand B300 AgentX preflight range --- 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 eca7b7bbf4..679bf95b82 100644 --- a/configs/nvidia-master.yaml +++ b/configs/nvidia-master.yaml @@ -7152,8 +7152,8 @@ qwen3.5-fp4-b300-sglang-agentic-mtp: agentic-coding: - dram-utilization: 0.80 search-space: - - { tp: 4, ep: 1, spec-decoding: mtp, kv-offloading: none, conc-list: [1, 2, 4, 8, 16] } - - { tp: 2, ep: 2, spec-decoding: mtp, kv-offloading: none, conc-list: [1, 4, 8, 16, 32] } + - { tp: 4, ep: 1, spec-decoding: mtp, kv-offloading: none, conc-list: [1, 4, 16, 32, 64, 96, 128] } + - { tp: 2, ep: 2, spec-decoding: mtp, kv-offloading: none, conc-list: [1, 8, 16, 32, 64, 96, 128, 192, 256] } kimik2.5-fp4-b200-vllm-agentic-lmcache: image: vllm/vllm-openai:v0.22.0 From ad6e2d3424996fbc87063fa27d3be9fbe97346d4 Mon Sep 17 00:00:00 2001 From: Cam Quilici Date: Wed, 29 Jul 2026 23:54:43 -0500 Subject: [PATCH 04/30] chore: use SGLang v0.5.16 for Qwen B300 --- configs/nvidia-master.yaml | 2 +- perf-changelog.yaml | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/configs/nvidia-master.yaml b/configs/nvidia-master.yaml index 679bf95b82..d3011ccd6e 100644 --- a/configs/nvidia-master.yaml +++ b/configs/nvidia-master.yaml @@ -7141,7 +7141,7 @@ qwen3.5-fp8-b300-sglang-agentic-hicache: - { tp: 4, ep: 1, kv-offloading: dram, kv-offload-backend: { name: hicache }, conc-list: [16, 32, 48, 64] } qwen3.5-fp4-b300-sglang-agentic-mtp: - image: lmsysorg/sglang:nightly-dev-cu13-20260724-433429b1 + image: lmsysorg/sglang:v0.5.16-cu130 model: nvidia/Qwen3.5-397B-A17B-NVFP4 model-prefix: qwen3.5 runner: cluster:b300-nv diff --git a/perf-changelog.yaml b/perf-changelog.yaml index 55520b4d95..4b2e033d4d 100644 --- a/perf-changelog.yaml +++ b/perf-changelog.yaml @@ -5317,4 +5317,5 @@ description: - "Add Qwen3.5-397B-A17B NVFP4 AgentX benchmark on B300 with SGLang native NEXTN MTP" - "Use the 256k trace dataset and golden synthetic acceptance length 3.39" + - "Image: lmsysorg/sglang:v0.5.16-cu130" pr-link: https://github.com/SemiAnalysisAI/InferenceX/pull/2421 From a58dcef9a990fe60c8fa46947159116ec14bf10d Mon Sep 17 00:00:00 2001 From: Cam Quilici Date: Wed, 29 Jul 2026 23:55:38 -0500 Subject: [PATCH 05/30] chore: collect SGLang cache metrics on B300 --- benchmarks/single_node/agentic/qwen3.5_fp4_b300_sglang_mtp.sh | 1 + 1 file changed, 1 insertion(+) diff --git a/benchmarks/single_node/agentic/qwen3.5_fp4_b300_sglang_mtp.sh b/benchmarks/single_node/agentic/qwen3.5_fp4_b300_sglang_mtp.sh index a622a42500..703546064d 100755 --- a/benchmarks/single_node/agentic/qwen3.5_fp4_b300_sglang_mtp.sh +++ b/benchmarks/single_node/agentic/qwen3.5_fp4_b300_sglang_mtp.sh @@ -114,5 +114,6 @@ if [ "${EVAL_ONLY:-false}" = "true" ]; then run_eval --port "$PORT" else build_replay_cmd "$RESULT_DIR" + REPLAY_CMD+=" --server-metrics http://localhost:$PORT/metrics" run_agentic_replay_and_write_outputs "$RESULT_DIR" fi From 8ffac86310384bade5a43c3d14acde1904992049 Mon Sep 17 00:00:00 2001 From: Cam Quilici Date: Wed, 29 Jul 2026 23:59:58 -0500 Subject: [PATCH 06/30] fix: remove unsupported SGLang tool-choice flag on B300 --- benchmarks/single_node/agentic/qwen3.5_fp4_b300_sglang_mtp.sh | 1 - 1 file changed, 1 deletion(-) diff --git a/benchmarks/single_node/agentic/qwen3.5_fp4_b300_sglang_mtp.sh b/benchmarks/single_node/agentic/qwen3.5_fp4_b300_sglang_mtp.sh index 703546064d..93692c6fb2 100755 --- a/benchmarks/single_node/agentic/qwen3.5_fp4_b300_sglang_mtp.sh +++ b/benchmarks/single_node/agentic/qwen3.5_fp4_b300_sglang_mtp.sh @@ -94,7 +94,6 @@ SGLANG_CMD=( --tokenizer-path "$MODEL" --reasoning-parser qwen3 --tool-call-parser qwen3_coder - --enable-auto-tool-choice --speculative-algorithm NEXTN --speculative-num-steps 3 --speculative-eagle-topk 1 From 87bf252239418965960489b534329982877bfe61 Mon Sep 17 00:00:00 2001 From: Cam Quilici Date: Thu, 30 Jul 2026 00:59:57 -0500 Subject: [PATCH 07/30] perf: prepare Qwen B300 cache and DEP tuning MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Add strict two-pool HiCache accounting, cache reporting, session-sticky DEP8 routing, AgentX request/graph limits, and measured-cache guidance for the B300 frontier.\n\n中文:为 B300 前沿调优加入严格的双池 HiCache 容量核算、缓存统计、会话粘性的 DEP8 路由、AgentX 请求与 CUDA Graph 上限,并记录实测缓存容量依据。 --- .../agentic/qwen3.5_fp4_b300_sglang_mtp.sh | 101 +++++++++++++++--- configs/nvidia-master.yaml | 7 ++ 2 files changed, 96 insertions(+), 12 deletions(-) diff --git a/benchmarks/single_node/agentic/qwen3.5_fp4_b300_sglang_mtp.sh b/benchmarks/single_node/agentic/qwen3.5_fp4_b300_sglang_mtp.sh index 93692c6fb2..3ce3af6a12 100755 --- a/benchmarks/single_node/agentic/qwen3.5_fp4_b300_sglang_mtp.sh +++ b/benchmarks/single_node/agentic/qwen3.5_fp4_b300_sglang_mtp.sh @@ -9,7 +9,8 @@ set -x source "$(dirname "$0")/../../benchmark_lib.sh" check_env_vars \ - MODEL TP CONC EP_SIZE KV_OFFLOADING TOTAL_CPU_DRAM_GB RESULT_DIR DURATION + MODEL TP CONC EP_SIZE DP_ATTENTION KV_OFFLOADING \ + TOTAL_CPU_DRAM_GB RESULT_DIR DURATION SCHEDULER_RECV_INTERVAL=${SCHEDULER_RECV_INTERVAL:-10} @@ -36,6 +37,12 @@ mkdir -p "$RESULT_DIR" CACHE_ARGS=() if require_agentic_kv_offload_backend hicache; then + REQUESTED_HICACHE_TOTAL_GB="${HICACHE_TOTAL_CPU_DRAM_GB:-$TOTAL_CPU_DRAM_GB}" + if [ "$REQUESTED_HICACHE_TOTAL_GB" -gt "$TOTAL_CPU_DRAM_GB" ]; then + echo "Error: requested HiCache pool ${REQUESTED_HICACHE_TOTAL_GB} GB exceeds configured capacity ${TOTAL_CPU_DRAM_GB} GB" >&2 + exit 1 + fi + TOTAL_CPU_DRAM_GB="$REQUESTED_HICACHE_TOTAL_GB" HICACHE_HOST_POOL_COUNT="${HICACHE_HOST_POOL_COUNT:-2}" MAX_HICACHE_SIZE_GB=$((TOTAL_CPU_DRAM_GB / TP / HICACHE_HOST_POOL_COUNT)) HICACHE_SIZE_GB="${HICACHE_SIZE_GB:-$MAX_HICACHE_SIZE_GB}" @@ -43,6 +50,7 @@ if require_agentic_kv_offload_backend hicache; then echo "Error: HICACHE_SIZE_GB=$HICACHE_SIZE_GB outside 1..$MAX_HICACHE_SIZE_GB" >&2 exit 1 fi + echo "HiCache CPU pools: ${HICACHE_SIZE_GB} GB per rank per pool across TP=${TP}, pools=${HICACHE_HOST_POOL_COUNT}; node total <= ${TOTAL_CPU_DRAM_GB} GB" CACHE_ARGS=( --page-size 64 --enable-hierarchical-cache @@ -53,12 +61,51 @@ if require_agentic_kv_offload_backend hicache; then ) fi +USE_SGLANG_ROUTER=false +SGLANG_BACKEND_PORT="$PORT" +ROUTER_LOG="$RESULT_DIR/router.log" +if [ "$DP_ATTENTION" = "true" ]; then + USE_SGLANG_ROUTER=true + export AIPERF_HTTP_X_SMG_ROUTING_KEY_FROM_CORRELATION_ID=true + SGLANG_BACKEND_PORT=$((PORT + 1)) + SGLANG_ROUTER_METRICS_PORT=$((PORT + 10000)) + SGLANG_ROUTER_CMD=(python3 -m sglang_router.launch_router) +fi + +PARALLEL_ARGS=( + --tp "$TP" + --dp 1 + --ep-size "$EP_SIZE" +) +TOKENIZER_WORKERS=6 +STREAM_INTERVAL=50 +if [ "$DP_ATTENTION" = "true" ]; then + PARALLEL_ARGS=( + --tp "$TP" + --dp "$TP" + --ep-size "$EP_SIZE" + --enable-dp-attention + --enable-dp-attention-local-control-broadcast + --enable-dp-lm-head + --dist-init-addr "127.0.0.1:$((PORT + 2000))" + --incremental-streaming-output + ) + TOKENIZER_WORKERS="$TP" + STREAM_INTERVAL=20 +fi + +# AgentX concurrency counts live session trees rather than individual HTTP +# requests. Leave room for subagent fan-out and avoid spending HBM on graphs +# above the batch sizes that remain useful for this long-context workload. +MAX_RUNNING_REQUESTS=$((2 * CONC)) +CUDA_GRAPH_MAX_BS="$CONC" +[ "$CUDA_GRAPH_MAX_BS" -gt 64 ] && CUDA_GRAPH_MAX_BS=64 + export TORCH_CUDA_ARCH_LIST="10.0" export PYTHONNOUSERSITE=1 export NCCL_NVLS_ENABLE=1 export SGL_ENABLE_JIT_DEEPGEMM=false export SGLANG_ENABLE_FLASHINFER_GEMM=true -export SGLANG_ENABLE_SPEC_V2=1 if [ "${EVAL_ONLY:-false}" != "true" ]; then export SGLANG_SIMULATE_ACC_LEN=3.39 @@ -71,11 +118,9 @@ SGLANG_CMD=( --model-path "$MODEL_PATH" --served-model-name "$MODEL" --host 0.0.0.0 - --port "$PORT" + --port "$SGLANG_BACKEND_PORT" --trust-remote-code - --tensor-parallel-size "$TP" - --data-parallel-size 1 - --expert-parallel-size "$EP_SIZE" + "${PARALLEL_ARGS[@]}" --enable-symm-mem --quantization modelopt_fp4 --fp4-gemm-backend flashinfer_cutlass @@ -83,14 +128,14 @@ SGLANG_CMD=( --mamba-ssm-dtype bfloat16 --attention-backend trtllm_mha --moe-runner-backend flashinfer_trtllm - --cuda-graph-max-bs "$CONC" - --max-running-requests "$CONC" + --cuda-graph-max-bs "$CUDA_GRAPH_MAX_BS" + --max-running-requests "$MAX_RUNNING_REQUESTS" --max-prefill-tokens 16384 --chunked-prefill-size 16384 --mem-fraction-static 0.80 - --stream-interval 50 + --stream-interval "$STREAM_INTERVAL" --scheduler-recv-interval "$SCHEDULER_RECV_INTERVAL" - --tokenizer-worker-num 6 + --tokenizer-worker-num "$TOKENIZER_WORKERS" --tokenizer-path "$MODEL" --reasoning-parser qwen3 --tool-call-parser qwen3_coder @@ -99,6 +144,7 @@ SGLANG_CMD=( --speculative-eagle-topk 1 --speculative-num-draft-tokens 4 --enable-metrics + --enable-cache-report "${CACHE_ARGS[@]}" ) @@ -107,12 +153,43 @@ printf '\n' | tee -a "$RESULT_DIR/sglang_command.txt" "${SGLANG_CMD[@]}" > "$SERVER_LOG" 2>&1 & SERVER_PID=$! -wait_for_server_ready --port "$PORT" --server-log "$SERVER_LOG" --server-pid "$SERVER_PID" +capture_cache_metrics() { + { + echo "=== SGLang cache metrics snapshot $(date --iso-8601=seconds) ===" + curl -fsS "http://localhost:$SGLANG_BACKEND_PORT/metrics" 2>/dev/null \ + | grep -E '^(sglang:(cache_hit_rate|cached_tokens_total|prompt_tokens_total|hicache_host_used_tokens|hicache_host_total_tokens|token_usage|num_requests_running|num_requests_waiting))' \ + || true + echo "============================================================" + } >> "$SERVER_LOG" +} + +wait_for_server_ready --port "$SGLANG_BACKEND_PORT" --server-log "$SERVER_LOG" --server-pid "$SERVER_PID" + +if [ "$USE_SGLANG_ROUTER" = "true" ]; then + "${SGLANG_ROUTER_CMD[@]}" \ + --worker-urls "http://localhost:$SGLANG_BACKEND_PORT" \ + --policy consistent_hashing \ + --request-id-headers x-correlation-id \ + --dp-aware \ + --host 0.0.0.0 \ + --port "$PORT" \ + --prometheus-host 127.0.0.1 \ + --prometheus-port "$SGLANG_ROUTER_METRICS_PORT" \ + --connect-timeout-secs 900 \ + --request-timeout-secs 14400 \ + --disable-health-check \ + --disable-retries > "$ROUTER_LOG" 2>&1 & + ROUTER_PID=$! + wait_for_server_ready --port "$PORT" --server-log "$ROUTER_LOG" --server-pid "$ROUTER_PID" +fi + +capture_cache_metrics +trap capture_cache_metrics EXIT if [ "${EVAL_ONLY:-false}" = "true" ]; then run_eval --port "$PORT" else build_replay_cmd "$RESULT_DIR" - REPLAY_CMD+=" --server-metrics http://localhost:$PORT/metrics" + REPLAY_CMD+=" --server-metrics http://localhost:$SGLANG_BACKEND_PORT/metrics" run_agentic_replay_and_write_outputs "$RESULT_DIR" fi diff --git a/configs/nvidia-master.yaml b/configs/nvidia-master.yaml index d3011ccd6e..dd348211df 100644 --- a/configs/nvidia-master.yaml +++ b/configs/nvidia-master.yaml @@ -7140,6 +7140,12 @@ qwen3.5-fp8-b300-sglang-agentic-hicache: - { tp: 4, ep: 1, kv-offloading: none, conc-list: [1, 2, 4, 8, 16, 32] } - { tp: 4, ep: 1, kv-offloading: dram, kv-offload-backend: { name: hicache }, conc-list: [16, 32, 48, 64] } +# Qwen3.5 target FP8 KV is 15,360 bytes/token before the native MTP layer. +# TP4 replicates the model's two KV heads and measured 30.5 KB/token node-wide; +# TP2 measured 15.3 KB/token. Against the 256k trace's 88.8k median and 148.8k +# p75 ISL, the measured 9.56M-token TP2 pool should bend around conc 56-80, +# while the 14.88M-token TP4 pool should bend around conc 88-128. DEP8 covers +# the throughput end with session-sticky routing across attention-DP ranks. qwen3.5-fp4-b300-sglang-agentic-mtp: image: lmsysorg/sglang:v0.5.16-cu130 model: nvidia/Qwen3.5-397B-A17B-NVFP4 @@ -7154,6 +7160,7 @@ qwen3.5-fp4-b300-sglang-agentic-mtp: search-space: - { tp: 4, ep: 1, spec-decoding: mtp, kv-offloading: none, conc-list: [1, 4, 16, 32, 64, 96, 128] } - { tp: 2, ep: 2, spec-decoding: mtp, kv-offloading: none, conc-list: [1, 8, 16, 32, 64, 96, 128, 192, 256] } + - { tp: 8, ep: 8, dp-attn: true, spec-decoding: mtp, kv-offloading: none, conc-list: [64, 128, 256], router: { name: sglang-router, version: "0.3.2" } } kimik2.5-fp4-b200-vllm-agentic-lmcache: image: vllm/vllm-openai:v0.22.0 From 064b790099880be3e6a0721ce6cab68805316fd5 Mon Sep 17 00:00:00 2001 From: Cam Quilici Date: Thu, 30 Jul 2026 01:36:40 -0500 Subject: [PATCH 08/30] perf: add B300 HiCache cliff probes MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Add isolated TP2 c72 and TP4 c80 DRAM HiCache points so each cache-cliff recovery topology can be measured independently. 中文:添加独立的 TP2 c72 与 TP4 c80 DRAM HiCache 测试点,以便分别测量各拓扑在缓存工作集拐点后的恢复效果。 --- configs/nvidia-master.yaml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/configs/nvidia-master.yaml b/configs/nvidia-master.yaml index dd348211df..da5ac30a78 100644 --- a/configs/nvidia-master.yaml +++ b/configs/nvidia-master.yaml @@ -7159,7 +7159,9 @@ qwen3.5-fp4-b300-sglang-agentic-mtp: - dram-utilization: 0.80 search-space: - { tp: 4, ep: 1, spec-decoding: mtp, kv-offloading: none, conc-list: [1, 4, 16, 32, 64, 96, 128] } + - { tp: 4, ep: 1, spec-decoding: mtp, kv-offloading: dram, kv-offload-backend: { name: hicache }, conc-list: [80] } - { tp: 2, ep: 2, spec-decoding: mtp, kv-offloading: none, conc-list: [1, 8, 16, 32, 64, 96, 128, 192, 256] } + - { tp: 2, ep: 2, spec-decoding: mtp, kv-offloading: dram, kv-offload-backend: { name: hicache }, conc-list: [72] } - { tp: 8, ep: 8, dp-attn: true, spec-decoding: mtp, kv-offloading: none, conc-list: [64, 128, 256], router: { name: sglang-router, version: "0.3.2" } } kimik2.5-fp4-b200-vllm-agentic-lmcache: From 8570002a05d5874f3002f71dc79f9845a8a473bd Mon Sep 17 00:00:00 2001 From: Cam Quilici Date: Thu, 30 Jul 2026 01:45:59 -0500 Subject: [PATCH 09/30] fix: enforce Qwen HiCache DRAM total MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Account for SGLang target KV, Mamba, and native NEXTN draft host pools as H * 31/15 per rank, with page-alignment reserve, so projected use stays within runner-generated DRAM. 中文:按每个 rank 的 H * 31/15 计入 SGLang 目标 KV、Mamba 与原生 NEXTN 草稿主机缓存,并预留页对齐空间,确保预计用量不超过 runner 生成的 DRAM 上限。 --- .../agentic/qwen3.5_fp4_b300_sglang_mtp.sh | 20 ++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-) diff --git a/benchmarks/single_node/agentic/qwen3.5_fp4_b300_sglang_mtp.sh b/benchmarks/single_node/agentic/qwen3.5_fp4_b300_sglang_mtp.sh index 3ce3af6a12..6552e75cd8 100755 --- a/benchmarks/single_node/agentic/qwen3.5_fp4_b300_sglang_mtp.sh +++ b/benchmarks/single_node/agentic/qwen3.5_fp4_b300_sglang_mtp.sh @@ -43,14 +43,28 @@ if require_agentic_kv_offload_backend hicache; then exit 1 fi TOTAL_CPU_DRAM_GB="$REQUESTED_HICACHE_TOTAL_GB" - HICACHE_HOST_POOL_COUNT="${HICACHE_HOST_POOL_COUNT:-2}" - MAX_HICACHE_SIZE_GB=$((TOTAL_CPU_DRAM_GB / TP / HICACHE_HOST_POOL_COUNT)) + # SGLang applies --hicache-size independently to Qwen's target KV and + # Mamba pools. Native NEXTN also creates a draft KV pool with the same + # slot count; its one attention layer adds 1/15 of the target KV bytes. + # Reserve 1 GB/rank for page alignment and enforce H * 31/15 per rank. + HICACHE_ALIGNMENT_RESERVE_GB=$TP + HICACHE_USABLE_TOTAL_GB=$((TOTAL_CPU_DRAM_GB - HICACHE_ALIGNMENT_RESERVE_GB)) + if [ "$HICACHE_USABLE_TOTAL_GB" -lt 1 ]; then + echo "Error: insufficient DRAM after HiCache alignment reserve" >&2 + exit 1 + fi + MAX_HICACHE_SIZE_GB=$((HICACHE_USABLE_TOTAL_GB * 15 / TP / 31)) HICACHE_SIZE_GB="${HICACHE_SIZE_GB:-$MAX_HICACHE_SIZE_GB}" if [ "$HICACHE_SIZE_GB" -lt 1 ] || [ "$HICACHE_SIZE_GB" -gt "$MAX_HICACHE_SIZE_GB" ]; then echo "Error: HICACHE_SIZE_GB=$HICACHE_SIZE_GB outside 1..$MAX_HICACHE_SIZE_GB" >&2 exit 1 fi - echo "HiCache CPU pools: ${HICACHE_SIZE_GB} GB per rank per pool across TP=${TP}, pools=${HICACHE_HOST_POOL_COUNT}; node total <= ${TOTAL_CPU_DRAM_GB} GB" + PROJECTED_HICACHE_TOTAL_GB=$(((HICACHE_SIZE_GB * TP * 31 + 14) / 15 + HICACHE_ALIGNMENT_RESERVE_GB)) + if [ "$PROJECTED_HICACHE_TOTAL_GB" -gt "$TOTAL_CPU_DRAM_GB" ]; then + echo "Error: projected HiCache use ${PROJECTED_HICACHE_TOTAL_GB} GB exceeds configured capacity ${TOTAL_CPU_DRAM_GB} GB" >&2 + exit 1 + fi + echo "HiCache CPU pools: ${HICACHE_SIZE_GB} GB target + Mamba + 1/15 draft per rank across TP=${TP}; projected node total ${PROJECTED_HICACHE_TOTAL_GB} GB <= ${TOTAL_CPU_DRAM_GB} GB" CACHE_ARGS=( --page-size 64 --enable-hierarchical-cache From 40649797a4654e432bff0ea79787e9cadee2a008 Mon Sep 17 00:00:00 2001 From: Cam Quilici Date: Thu, 30 Jul 2026 02:16:05 -0500 Subject: [PATCH 10/30] perf: densify B300 Qwen cache crossover MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Add TP4 concurrency points around the measured HiCache crossover and extend the DRAM-offload curve beyond it.\n\n中文:在实测 HiCache 切换区间细化 B300 Qwen TP4 并发点,并将 DRAM 卸载曲线扩展到拐点之后。 --- configs/nvidia-master.yaml | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/configs/nvidia-master.yaml b/configs/nvidia-master.yaml index 298df88657..04dabea8f5 100644 --- a/configs/nvidia-master.yaml +++ b/configs/nvidia-master.yaml @@ -7179,9 +7179,10 @@ qwen3.5-fp8-b300-sglang-agentic-hicache: # Qwen3.5 target FP8 KV is 15,360 bytes/token before the native MTP layer. # TP4 replicates the model's two KV heads and measured 30.5 KB/token node-wide; # TP2 measured 15.3 KB/token. Against the 256k trace's 88.8k median and 148.8k -# p75 ISL, the measured 9.56M-token TP2 pool should bend around conc 56-80, -# while the 14.88M-token TP4 pool should bend around conc 88-128. DEP8 covers -# the throughput end with session-sticky routing across attention-DP ranks. +# p75 ISL, the measured 9.56M-token TP2 pool should bend around conc 56-80. +# TP4 remains healthy at c64; HiCache sustains 87% prefix hits and 234k input +# tok/s at c80, so resolve the crossover densely and carry offload past it. +# DEP8 probes the throughput end with session-sticky attention-DP routing. qwen3.5-fp4-b300-sglang-agentic-mtp: image: lmsysorg/sglang:v0.5.16-cu130 model: nvidia/Qwen3.5-397B-A17B-NVFP4 @@ -7194,8 +7195,8 @@ qwen3.5-fp4-b300-sglang-agentic-mtp: agentic-coding: - dram-utilization: 0.80 search-space: - - { tp: 4, ep: 1, spec-decoding: mtp, kv-offloading: none, conc-list: [1, 4, 16, 32, 64, 96, 128] } - - { tp: 4, ep: 1, spec-decoding: mtp, kv-offloading: dram, kv-offload-backend: { name: hicache }, conc-list: [80] } + - { tp: 4, ep: 1, spec-decoding: mtp, kv-offloading: none, conc-list: [1, 4, 8, 12, 16, 20, 24, 28, 32, 40, 48, 56, 64, 72, 80, 88, 96] } + - { tp: 4, ep: 1, spec-decoding: mtp, kv-offloading: dram, kv-offload-backend: { name: hicache }, conc-list: [64, 72, 80, 88, 96, 104, 112] } - { tp: 2, ep: 2, spec-decoding: mtp, kv-offloading: none, conc-list: [1, 8, 16, 32, 64, 96, 128, 192, 256] } - { tp: 2, ep: 2, spec-decoding: mtp, kv-offloading: dram, kv-offload-backend: { name: hicache }, conc-list: [72] } - { tp: 8, ep: 8, dp-attn: true, spec-decoding: mtp, kv-offloading: none, conc-list: [64, 128, 256], router: { name: sglang-router, version: "0.3.2" } } From 05d97cfb07b4988a49bb4b11afead847011a5d9a Mon Sep 17 00:00:00 2001 From: Cam Quilici Date: Thu, 30 Jul 2026 02:17:16 -0500 Subject: [PATCH 11/30] perf: bracket B300 TP2 offload frontier MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Remove the measured no-offload thrashing tail and add dense TP2 points across the expected HiCache crossover.\n\n中文:移除实测发生抖动的无卸载尾部配置,并在预期 HiCache 切换区间细化 B300 TP2 并发点。 --- configs/nvidia-master.yaml | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/configs/nvidia-master.yaml b/configs/nvidia-master.yaml index 04dabea8f5..38704e96e7 100644 --- a/configs/nvidia-master.yaml +++ b/configs/nvidia-master.yaml @@ -7179,7 +7179,8 @@ qwen3.5-fp8-b300-sglang-agentic-hicache: # Qwen3.5 target FP8 KV is 15,360 bytes/token before the native MTP layer. # TP4 replicates the model's two KV heads and measured 30.5 KB/token node-wide; # TP2 measured 15.3 KB/token. Against the 256k trace's 88.8k median and 148.8k -# p75 ISL, the measured 9.56M-token TP2 pool should bend around conc 56-80. +# p75 ISL, TP2 is healthy through c32 but reaches 97% GPU KV with zero prefix +# hits by c96, placing its useful no-offload/offload crossover below c64. # TP4 remains healthy at c64; HiCache sustains 87% prefix hits and 234k input # tok/s at c80, so resolve the crossover densely and carry offload past it. # DEP8 probes the throughput end with session-sticky attention-DP routing. @@ -7197,8 +7198,8 @@ qwen3.5-fp4-b300-sglang-agentic-mtp: search-space: - { tp: 4, ep: 1, spec-decoding: mtp, kv-offloading: none, conc-list: [1, 4, 8, 12, 16, 20, 24, 28, 32, 40, 48, 56, 64, 72, 80, 88, 96] } - { tp: 4, ep: 1, spec-decoding: mtp, kv-offloading: dram, kv-offload-backend: { name: hicache }, conc-list: [64, 72, 80, 88, 96, 104, 112] } - - { tp: 2, ep: 2, spec-decoding: mtp, kv-offloading: none, conc-list: [1, 8, 16, 32, 64, 96, 128, 192, 256] } - - { tp: 2, ep: 2, spec-decoding: mtp, kv-offloading: dram, kv-offload-backend: { name: hicache }, conc-list: [72] } + - { tp: 2, ep: 2, spec-decoding: mtp, kv-offloading: none, conc-list: [1, 4, 8, 12, 16, 20, 24, 28, 32, 40, 48, 56, 64] } + - { tp: 2, ep: 2, spec-decoding: mtp, kv-offloading: dram, kv-offload-backend: { name: hicache }, conc-list: [40, 48, 56, 60, 64, 68, 72] } - { tp: 8, ep: 8, dp-attn: true, spec-decoding: mtp, kv-offloading: none, conc-list: [64, 128, 256], router: { name: sglang-router, version: "0.3.2" } } kimik2.5-fp4-b200-vllm-agentic-lmcache: From 0b5465ce47a74fea022c1c0bef121606f4d282bc Mon Sep 17 00:00:00 2001 From: Cam Quilici Date: Thu, 30 Jul 2026 02:18:55 -0500 Subject: [PATCH 12/30] perf: remove dominated B300 Qwen DEP topology MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Drop the attention-DP arm after live AgentX profiling showed fragmented prefix caches and throughput below the TP frontier. Remove the now-unused router path.\n\n中文:AgentX 实测表明注意力 DP 会导致前缀缓存碎片化且吞吐低于 TP 前沿,因此移除该配置及不再使用的路由路径。 --- .../agentic/qwen3.5_fp4_b300_sglang_mtp.sh | 53 ++----------------- configs/nvidia-master.yaml | 3 +- 2 files changed, 6 insertions(+), 50 deletions(-) diff --git a/benchmarks/single_node/agentic/qwen3.5_fp4_b300_sglang_mtp.sh b/benchmarks/single_node/agentic/qwen3.5_fp4_b300_sglang_mtp.sh index 6552e75cd8..b0aa51657e 100755 --- a/benchmarks/single_node/agentic/qwen3.5_fp4_b300_sglang_mtp.sh +++ b/benchmarks/single_node/agentic/qwen3.5_fp4_b300_sglang_mtp.sh @@ -9,7 +9,7 @@ set -x source "$(dirname "$0")/../../benchmark_lib.sh" check_env_vars \ - MODEL TP CONC EP_SIZE DP_ATTENTION KV_OFFLOADING \ + MODEL TP CONC EP_SIZE KV_OFFLOADING \ TOTAL_CPU_DRAM_GB RESULT_DIR DURATION SCHEDULER_RECV_INTERVAL=${SCHEDULER_RECV_INTERVAL:-10} @@ -75,17 +75,6 @@ if require_agentic_kv_offload_backend hicache; then ) fi -USE_SGLANG_ROUTER=false -SGLANG_BACKEND_PORT="$PORT" -ROUTER_LOG="$RESULT_DIR/router.log" -if [ "$DP_ATTENTION" = "true" ]; then - USE_SGLANG_ROUTER=true - export AIPERF_HTTP_X_SMG_ROUTING_KEY_FROM_CORRELATION_ID=true - SGLANG_BACKEND_PORT=$((PORT + 1)) - SGLANG_ROUTER_METRICS_PORT=$((PORT + 10000)) - SGLANG_ROUTER_CMD=(python3 -m sglang_router.launch_router) -fi - PARALLEL_ARGS=( --tp "$TP" --dp 1 @@ -93,20 +82,6 @@ PARALLEL_ARGS=( ) TOKENIZER_WORKERS=6 STREAM_INTERVAL=50 -if [ "$DP_ATTENTION" = "true" ]; then - PARALLEL_ARGS=( - --tp "$TP" - --dp "$TP" - --ep-size "$EP_SIZE" - --enable-dp-attention - --enable-dp-attention-local-control-broadcast - --enable-dp-lm-head - --dist-init-addr "127.0.0.1:$((PORT + 2000))" - --incremental-streaming-output - ) - TOKENIZER_WORKERS="$TP" - STREAM_INTERVAL=20 -fi # AgentX concurrency counts live session trees rather than individual HTTP # requests. Leave room for subagent fan-out and avoid spending HBM on graphs @@ -132,7 +107,7 @@ SGLANG_CMD=( --model-path "$MODEL_PATH" --served-model-name "$MODEL" --host 0.0.0.0 - --port "$SGLANG_BACKEND_PORT" + --port "$PORT" --trust-remote-code "${PARALLEL_ARGS[@]}" --enable-symm-mem @@ -170,32 +145,14 @@ SERVER_PID=$! capture_cache_metrics() { { echo "=== SGLang cache metrics snapshot $(date --iso-8601=seconds) ===" - curl -fsS "http://localhost:$SGLANG_BACKEND_PORT/metrics" 2>/dev/null \ + curl -fsS "http://localhost:$PORT/metrics" 2>/dev/null \ | grep -E '^(sglang:(cache_hit_rate|cached_tokens_total|prompt_tokens_total|hicache_host_used_tokens|hicache_host_total_tokens|token_usage|num_requests_running|num_requests_waiting))' \ || true echo "============================================================" } >> "$SERVER_LOG" } -wait_for_server_ready --port "$SGLANG_BACKEND_PORT" --server-log "$SERVER_LOG" --server-pid "$SERVER_PID" - -if [ "$USE_SGLANG_ROUTER" = "true" ]; then - "${SGLANG_ROUTER_CMD[@]}" \ - --worker-urls "http://localhost:$SGLANG_BACKEND_PORT" \ - --policy consistent_hashing \ - --request-id-headers x-correlation-id \ - --dp-aware \ - --host 0.0.0.0 \ - --port "$PORT" \ - --prometheus-host 127.0.0.1 \ - --prometheus-port "$SGLANG_ROUTER_METRICS_PORT" \ - --connect-timeout-secs 900 \ - --request-timeout-secs 14400 \ - --disable-health-check \ - --disable-retries > "$ROUTER_LOG" 2>&1 & - ROUTER_PID=$! - wait_for_server_ready --port "$PORT" --server-log "$ROUTER_LOG" --server-pid "$ROUTER_PID" -fi +wait_for_server_ready --port "$PORT" --server-log "$SERVER_LOG" --server-pid "$SERVER_PID" capture_cache_metrics trap capture_cache_metrics EXIT @@ -204,6 +161,6 @@ if [ "${EVAL_ONLY:-false}" = "true" ]; then run_eval --port "$PORT" else build_replay_cmd "$RESULT_DIR" - REPLAY_CMD+=" --server-metrics http://localhost:$SGLANG_BACKEND_PORT/metrics" + REPLAY_CMD+=" --server-metrics http://localhost:$PORT/metrics" run_agentic_replay_and_write_outputs "$RESULT_DIR" fi diff --git a/configs/nvidia-master.yaml b/configs/nvidia-master.yaml index 38704e96e7..6e9fb846fd 100644 --- a/configs/nvidia-master.yaml +++ b/configs/nvidia-master.yaml @@ -7183,7 +7183,7 @@ qwen3.5-fp8-b300-sglang-agentic-hicache: # hits by c96, placing its useful no-offload/offload crossover below c64. # TP4 remains healthy at c64; HiCache sustains 87% prefix hits and 234k input # tok/s at c80, so resolve the crossover densely and carry offload past it. -# DEP8 probes the throughput end with session-sticky attention-DP routing. +# DEP8 was rejected after fragmenting the trace across eight radix caches. qwen3.5-fp4-b300-sglang-agentic-mtp: image: lmsysorg/sglang:v0.5.16-cu130 model: nvidia/Qwen3.5-397B-A17B-NVFP4 @@ -7200,7 +7200,6 @@ qwen3.5-fp4-b300-sglang-agentic-mtp: - { tp: 4, ep: 1, spec-decoding: mtp, kv-offloading: dram, kv-offload-backend: { name: hicache }, conc-list: [64, 72, 80, 88, 96, 104, 112] } - { tp: 2, ep: 2, spec-decoding: mtp, kv-offloading: none, conc-list: [1, 4, 8, 12, 16, 20, 24, 28, 32, 40, 48, 56, 64] } - { tp: 2, ep: 2, spec-decoding: mtp, kv-offloading: dram, kv-offload-backend: { name: hicache }, conc-list: [40, 48, 56, 60, 64, 68, 72] } - - { tp: 8, ep: 8, dp-attn: true, spec-decoding: mtp, kv-offloading: none, conc-list: [64, 128, 256], router: { name: sglang-router, version: "0.3.2" } } kimik2.5-fp4-b200-vllm-agentic-lmcache: image: vllm/vllm-openai:v0.22.0 From e15c32d701f87a605988084f9c00e2a22d56b8d6 Mon Sep 17 00:00:00 2001 From: Cam Quilici Date: Thu, 30 Jul 2026 02:19:50 -0500 Subject: [PATCH 13/30] perf: extend B300 TP2 HiCache tail MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Probe three post-c72 offload points to locate saturation of the measured TP2 efficiency frontier.\n\n中文:在 c72 之后增加三个卸载并发点,用于定位实测 B300 TP2 效率前沿的饱和位置。 --- configs/nvidia-master.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/configs/nvidia-master.yaml b/configs/nvidia-master.yaml index 6e9fb846fd..2e1cb7c20a 100644 --- a/configs/nvidia-master.yaml +++ b/configs/nvidia-master.yaml @@ -7199,7 +7199,7 @@ qwen3.5-fp4-b300-sglang-agentic-mtp: - { tp: 4, ep: 1, spec-decoding: mtp, kv-offloading: none, conc-list: [1, 4, 8, 12, 16, 20, 24, 28, 32, 40, 48, 56, 64, 72, 80, 88, 96] } - { tp: 4, ep: 1, spec-decoding: mtp, kv-offloading: dram, kv-offload-backend: { name: hicache }, conc-list: [64, 72, 80, 88, 96, 104, 112] } - { tp: 2, ep: 2, spec-decoding: mtp, kv-offloading: none, conc-list: [1, 4, 8, 12, 16, 20, 24, 28, 32, 40, 48, 56, 64] } - - { tp: 2, ep: 2, spec-decoding: mtp, kv-offloading: dram, kv-offload-backend: { name: hicache }, conc-list: [40, 48, 56, 60, 64, 68, 72] } + - { tp: 2, ep: 2, spec-decoding: mtp, kv-offloading: dram, kv-offload-backend: { name: hicache }, conc-list: [40, 48, 56, 60, 64, 68, 72, 76, 80, 88] } kimik2.5-fp4-b200-vllm-agentic-lmcache: image: vllm/vllm-openai:v0.22.0 From 3bb4e4d33275a38f3cfeb3e8ccfd502d0abf43ef Mon Sep 17 00:00:00 2001 From: Cam Quilici Date: Thu, 30 Jul 2026 02:22:07 -0500 Subject: [PATCH 14/30] perf: prune dominated B300 TP4 tail MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Remove the no-offload c96 point after it was dominated by HiCache c80 in both throughput and latency, and refresh the measured crossover note.\n\n中文:无卸载 c96 在吞吐与延迟上均被 HiCache c80 支配,因此移除该点并更新实测切换区间说明。 --- 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 2e1cb7c20a..89e5bbe6bc 100644 --- a/configs/nvidia-master.yaml +++ b/configs/nvidia-master.yaml @@ -7181,7 +7181,7 @@ qwen3.5-fp8-b300-sglang-agentic-hicache: # TP2 measured 15.3 KB/token. Against the 256k trace's 88.8k median and 148.8k # p75 ISL, TP2 is healthy through c32 but reaches 97% GPU KV with zero prefix # hits by c96, placing its useful no-offload/offload crossover below c64. -# TP4 remains healthy at c64; HiCache sustains 87% prefix hits and 234k input +# TP4 remains healthy at c64; HiCache sustains 90% prefix hits and >260k input # tok/s at c80, so resolve the crossover densely and carry offload past it. # DEP8 was rejected after fragmenting the trace across eight radix caches. qwen3.5-fp4-b300-sglang-agentic-mtp: @@ -7196,7 +7196,7 @@ qwen3.5-fp4-b300-sglang-agentic-mtp: agentic-coding: - dram-utilization: 0.80 search-space: - - { tp: 4, ep: 1, spec-decoding: mtp, kv-offloading: none, conc-list: [1, 4, 8, 12, 16, 20, 24, 28, 32, 40, 48, 56, 64, 72, 80, 88, 96] } + - { tp: 4, ep: 1, spec-decoding: mtp, kv-offloading: none, conc-list: [1, 4, 8, 12, 16, 20, 24, 28, 32, 40, 48, 56, 64, 72, 80, 88] } - { tp: 4, ep: 1, spec-decoding: mtp, kv-offloading: dram, kv-offload-backend: { name: hicache }, conc-list: [64, 72, 80, 88, 96, 104, 112] } - { tp: 2, ep: 2, spec-decoding: mtp, kv-offloading: none, conc-list: [1, 4, 8, 12, 16, 20, 24, 28, 32, 40, 48, 56, 64] } - { tp: 2, ep: 2, spec-decoding: mtp, kv-offloading: dram, kv-offload-backend: { name: hicache }, conc-list: [40, 48, 56, 60, 64, 68, 72, 76, 80, 88] } From c5b8203b6d6b5445e491b53097d765e77a13a926 Mon Sep 17 00:00:00 2001 From: Cam Quilici Date: Thu, 30 Jul 2026 02:24:00 -0500 Subject: [PATCH 15/30] perf: cap B300 HiCache at valid working sets MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Remove offload points that exceed the measured host-cache validity boundary and densify the final safe interval below c80.\n\n中文:移除超过实测主机缓存有效边界的卸载配置,并在 c80 以下的安全区间细化最终并发点。 --- configs/nvidia-master.yaml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/configs/nvidia-master.yaml b/configs/nvidia-master.yaml index 89e5bbe6bc..72c64d8ff9 100644 --- a/configs/nvidia-master.yaml +++ b/configs/nvidia-master.yaml @@ -7181,8 +7181,8 @@ qwen3.5-fp8-b300-sglang-agentic-hicache: # TP2 measured 15.3 KB/token. Against the 256k trace's 88.8k median and 148.8k # p75 ISL, TP2 is healthy through c32 but reaches 97% GPU KV with zero prefix # hits by c96, placing its useful no-offload/offload crossover below c64. -# TP4 remains healthy at c64; HiCache sustains 90% prefix hits and >260k input -# tok/s at c80, so resolve the crossover densely and carry offload past it. +# TP4 remains healthy at c64, but HiCache c80 becomes invalid once its host +# pool is full, so resolve c64-76 without carrying that offload tail forward. # DEP8 was rejected after fragmenting the trace across eight radix caches. qwen3.5-fp4-b300-sglang-agentic-mtp: image: lmsysorg/sglang:v0.5.16-cu130 @@ -7197,9 +7197,9 @@ qwen3.5-fp4-b300-sglang-agentic-mtp: - dram-utilization: 0.80 search-space: - { tp: 4, ep: 1, spec-decoding: mtp, kv-offloading: none, conc-list: [1, 4, 8, 12, 16, 20, 24, 28, 32, 40, 48, 56, 64, 72, 80, 88] } - - { tp: 4, ep: 1, spec-decoding: mtp, kv-offloading: dram, kv-offload-backend: { name: hicache }, conc-list: [64, 72, 80, 88, 96, 104, 112] } + - { tp: 4, ep: 1, spec-decoding: mtp, kv-offloading: dram, kv-offload-backend: { name: hicache }, conc-list: [64, 68, 72, 76] } - { tp: 2, ep: 2, spec-decoding: mtp, kv-offloading: none, conc-list: [1, 4, 8, 12, 16, 20, 24, 28, 32, 40, 48, 56, 64] } - - { tp: 2, ep: 2, spec-decoding: mtp, kv-offloading: dram, kv-offload-backend: { name: hicache }, conc-list: [40, 48, 56, 60, 64, 68, 72, 76, 80, 88] } + - { tp: 2, ep: 2, spec-decoding: mtp, kv-offloading: dram, kv-offload-backend: { name: hicache }, conc-list: [40, 48, 56, 60, 64, 68, 72, 76, 80] } kimik2.5-fp4-b200-vllm-agentic-lmcache: image: vllm/vllm-openai:v0.22.0 From a3dac8d0b4a1ca2701e053f5cb5d4f2ec622e56b Mon Sep 17 00:00:00 2001 From: Cam Quilici Date: Thu, 30 Jul 2026 02:25:06 -0500 Subject: [PATCH 16/30] perf: cap B300 TP2 before the cache cliff MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Remove no-offload c64 after it stalled under the long-context working set; retain the matched HiCache points beyond c56.\n\n中文:无卸载 c64 在长上下文工作集下停滞,因此移除该点,并保留 c56 之后对应的 HiCache 配置。 --- configs/nvidia-master.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/configs/nvidia-master.yaml b/configs/nvidia-master.yaml index 72c64d8ff9..f17968164a 100644 --- a/configs/nvidia-master.yaml +++ b/configs/nvidia-master.yaml @@ -7198,7 +7198,7 @@ qwen3.5-fp4-b300-sglang-agentic-mtp: search-space: - { tp: 4, ep: 1, spec-decoding: mtp, kv-offloading: none, conc-list: [1, 4, 8, 12, 16, 20, 24, 28, 32, 40, 48, 56, 64, 72, 80, 88] } - { tp: 4, ep: 1, spec-decoding: mtp, kv-offloading: dram, kv-offload-backend: { name: hicache }, conc-list: [64, 68, 72, 76] } - - { tp: 2, ep: 2, spec-decoding: mtp, kv-offloading: none, conc-list: [1, 4, 8, 12, 16, 20, 24, 28, 32, 40, 48, 56, 64] } + - { tp: 2, ep: 2, spec-decoding: mtp, kv-offloading: none, conc-list: [1, 4, 8, 12, 16, 20, 24, 28, 32, 40, 48, 56] } - { tp: 2, ep: 2, spec-decoding: mtp, kv-offloading: dram, kv-offload-backend: { name: hicache }, conc-list: [40, 48, 56, 60, 64, 68, 72, 76, 80] } kimik2.5-fp4-b200-vllm-agentic-lmcache: From 79dd0c71bef7765314211d64100be35ec003fed7 Mon Sep 17 00:00:00 2001 From: Cam Quilici Date: Thu, 30 Jul 2026 02:36:15 -0500 Subject: [PATCH 17/30] perf: probe B300 TP4 HiCache at the cliff MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 中文:在缓存工作集拐点测试 B300 TP4 HiCache。 --- configs/nvidia-master.yaml | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/configs/nvidia-master.yaml b/configs/nvidia-master.yaml index f17968164a..93e862662a 100644 --- a/configs/nvidia-master.yaml +++ b/configs/nvidia-master.yaml @@ -7181,8 +7181,9 @@ qwen3.5-fp8-b300-sglang-agentic-hicache: # TP2 measured 15.3 KB/token. Against the 256k trace's 88.8k median and 148.8k # p75 ISL, TP2 is healthy through c32 but reaches 97% GPU KV with zero prefix # hits by c96, placing its useful no-offload/offload crossover below c64. -# TP4 remains healthy at c64, but HiCache c80 becomes invalid once its host -# pool is full, so resolve c64-76 without carrying that offload tail forward. +# TP4 remains healthy through c88, while c96 loses roughly half its throughput +# and raises p50 ITL from 15 ms to 44 ms as prefix hits fall. Resolve the +# c88-96 cliff and compare HiCache directly across that boundary. # DEP8 was rejected after fragmenting the trace across eight radix caches. qwen3.5-fp4-b300-sglang-agentic-mtp: image: lmsysorg/sglang:v0.5.16-cu130 @@ -7197,7 +7198,7 @@ qwen3.5-fp4-b300-sglang-agentic-mtp: - dram-utilization: 0.80 search-space: - { tp: 4, ep: 1, spec-decoding: mtp, kv-offloading: none, conc-list: [1, 4, 8, 12, 16, 20, 24, 28, 32, 40, 48, 56, 64, 72, 80, 88] } - - { tp: 4, ep: 1, spec-decoding: mtp, kv-offloading: dram, kv-offload-backend: { name: hicache }, conc-list: [64, 68, 72, 76] } + - { tp: 4, ep: 1, spec-decoding: mtp, kv-offloading: dram, kv-offload-backend: { name: hicache }, conc-list: [64, 68, 72, 76, 80, 88, 96] } - { tp: 2, ep: 2, spec-decoding: mtp, kv-offloading: none, conc-list: [1, 4, 8, 12, 16, 20, 24, 28, 32, 40, 48, 56] } - { tp: 2, ep: 2, spec-decoding: mtp, kv-offloading: dram, kv-offload-backend: { name: hicache }, conc-list: [40, 48, 56, 60, 64, 68, 72, 76, 80] } From 020a1aa8a698a2f8eb5698db272c5bb083dd9136 Mon Sep 17 00:00:00 2001 From: Cam Quilici Date: Thu, 30 Jul 2026 02:40:09 -0500 Subject: [PATCH 18/30] perf: prune the B300 TP2 no-offload cliff MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 中文:裁剪 B300 TP2 无卸载配置的缓存拐点尾部。 --- 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 93e862662a..725993c033 100644 --- a/configs/nvidia-master.yaml +++ b/configs/nvidia-master.yaml @@ -7179,8 +7179,8 @@ qwen3.5-fp8-b300-sglang-agentic-hicache: # Qwen3.5 target FP8 KV is 15,360 bytes/token before the native MTP layer. # TP4 replicates the model's two KV heads and measured 30.5 KB/token node-wide; # TP2 measured 15.3 KB/token. Against the 256k trace's 88.8k median and 148.8k -# p75 ISL, TP2 is healthy through c32 but reaches 97% GPU KV with zero prefix -# hits by c96, placing its useful no-offload/offload crossover below c64. +# p75 ISL, TP2 is healthy through c32 but falls to zero prefix hits by c56, +# placing its useful no-offload/offload crossover below that point. # TP4 remains healthy through c88, while c96 loses roughly half its throughput # and raises p50 ITL from 15 ms to 44 ms as prefix hits fall. Resolve the # c88-96 cliff and compare HiCache directly across that boundary. @@ -7199,7 +7199,7 @@ qwen3.5-fp4-b300-sglang-agentic-mtp: search-space: - { tp: 4, ep: 1, spec-decoding: mtp, kv-offloading: none, conc-list: [1, 4, 8, 12, 16, 20, 24, 28, 32, 40, 48, 56, 64, 72, 80, 88] } - { tp: 4, ep: 1, spec-decoding: mtp, kv-offloading: dram, kv-offload-backend: { name: hicache }, conc-list: [64, 68, 72, 76, 80, 88, 96] } - - { tp: 2, ep: 2, spec-decoding: mtp, kv-offloading: none, conc-list: [1, 4, 8, 12, 16, 20, 24, 28, 32, 40, 48, 56] } + - { tp: 2, ep: 2, spec-decoding: mtp, kv-offloading: none, conc-list: [1, 4, 8, 12, 16, 20, 24, 28, 32, 40, 48] } - { tp: 2, ep: 2, spec-decoding: mtp, kv-offloading: dram, kv-offload-backend: { name: hicache }, conc-list: [40, 48, 56, 60, 64, 68, 72, 76, 80] } kimik2.5-fp4-b200-vllm-agentic-lmcache: From d2224b2e2e31632d2bbaf25a794bf8bb4aad31a2 Mon Sep 17 00:00:00 2001 From: Cam Quilici Date: Thu, 30 Jul 2026 02:52:51 -0500 Subject: [PATCH 19/30] fix(agentx): refine B300 cache frontier MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 中文:优化 B300 缓存悬崖附近的并发点,并使用 SGLang 默认单 tokenizer 启动路径以避免 HiCache 初始化期间的多 tokenizer 共享内存竞态。 --- .../agentic/qwen3.5_fp4_b300_sglang_mtp.sh | 2 -- configs/nvidia-master.yaml | 17 +++++++++-------- 2 files changed, 9 insertions(+), 10 deletions(-) diff --git a/benchmarks/single_node/agentic/qwen3.5_fp4_b300_sglang_mtp.sh b/benchmarks/single_node/agentic/qwen3.5_fp4_b300_sglang_mtp.sh index b0aa51657e..23bf3c6d27 100755 --- a/benchmarks/single_node/agentic/qwen3.5_fp4_b300_sglang_mtp.sh +++ b/benchmarks/single_node/agentic/qwen3.5_fp4_b300_sglang_mtp.sh @@ -80,7 +80,6 @@ PARALLEL_ARGS=( --dp 1 --ep-size "$EP_SIZE" ) -TOKENIZER_WORKERS=6 STREAM_INTERVAL=50 # AgentX concurrency counts live session trees rather than individual HTTP @@ -124,7 +123,6 @@ SGLANG_CMD=( --mem-fraction-static 0.80 --stream-interval "$STREAM_INTERVAL" --scheduler-recv-interval "$SCHEDULER_RECV_INTERVAL" - --tokenizer-worker-num "$TOKENIZER_WORKERS" --tokenizer-path "$MODEL" --reasoning-parser qwen3 --tool-call-parser qwen3_coder diff --git a/configs/nvidia-master.yaml b/configs/nvidia-master.yaml index 725993c033..234014734a 100644 --- a/configs/nvidia-master.yaml +++ b/configs/nvidia-master.yaml @@ -7179,11 +7179,12 @@ qwen3.5-fp8-b300-sglang-agentic-hicache: # Qwen3.5 target FP8 KV is 15,360 bytes/token before the native MTP layer. # TP4 replicates the model's two KV heads and measured 30.5 KB/token node-wide; # TP2 measured 15.3 KB/token. Against the 256k trace's 88.8k median and 148.8k -# p75 ISL, TP2 is healthy through c32 but falls to zero prefix hits by c56, -# placing its useful no-offload/offload crossover below that point. -# TP4 remains healthy through c88, while c96 loses roughly half its throughput -# and raises p50 ITL from 15 ms to 44 ms as prefix hits fall. Resolve the -# c88-96 cliff and compare HiCache directly across that boundary. +# p75 ISL, TP2 no-offload peaks at c32; c40/c48 plateau at the same input +# throughput with worse latency, and c56 loses all prefix hits. HiCache takes +# over at c40. TP4 no-offload is healthy through c72, while c96 loses roughly +# half its throughput as prefix hits fall. HiCache c88 is clean and dominates +# no-offload c88. Both c80 trials produced shortened outputs, so that invalid +# point is excluded while the clean c72-96 cache-cliff neighborhood stays dense. # DEP8 was rejected after fragmenting the trace across eight radix caches. qwen3.5-fp4-b300-sglang-agentic-mtp: image: lmsysorg/sglang:v0.5.16-cu130 @@ -7197,9 +7198,9 @@ qwen3.5-fp4-b300-sglang-agentic-mtp: agentic-coding: - dram-utilization: 0.80 search-space: - - { tp: 4, ep: 1, spec-decoding: mtp, kv-offloading: none, conc-list: [1, 4, 8, 12, 16, 20, 24, 28, 32, 40, 48, 56, 64, 72, 80, 88] } - - { tp: 4, ep: 1, spec-decoding: mtp, kv-offloading: dram, kv-offload-backend: { name: hicache }, conc-list: [64, 68, 72, 76, 80, 88, 96] } - - { tp: 2, ep: 2, spec-decoding: mtp, kv-offloading: none, conc-list: [1, 4, 8, 12, 16, 20, 24, 28, 32, 40, 48] } + - { tp: 4, ep: 1, spec-decoding: mtp, kv-offloading: none, conc-list: [1, 4, 8, 12, 16, 20, 24, 28, 32, 40, 48, 56, 64, 72] } + - { tp: 4, ep: 1, spec-decoding: mtp, kv-offloading: dram, kv-offload-backend: { name: hicache }, conc-list: [64, 68, 72, 76, 88, 96] } + - { tp: 2, ep: 2, spec-decoding: mtp, kv-offloading: none, conc-list: [1, 4, 8, 12, 16, 20, 24, 28, 32] } - { tp: 2, ep: 2, spec-decoding: mtp, kv-offloading: dram, kv-offload-backend: { name: hicache }, conc-list: [40, 48, 56, 60, 64, 68, 72, 76, 80] } kimik2.5-fp4-b200-vllm-agentic-lmcache: From 89cd5926cfc4b3eee36640baacf4536d456e412b Mon Sep 17 00:00:00 2001 From: Cam Quilici Date: Thu, 30 Jul 2026 02:55:39 -0500 Subject: [PATCH 20/30] perf(agentx): densify B300 HiCache cliff MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 中文:在 B300 HiCache 缓存悬崖附近增加 c84、c92 和 c94 测试点,以更细粒度覆盖有效的帕累托前沿。 --- configs/nvidia-master.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/configs/nvidia-master.yaml b/configs/nvidia-master.yaml index 234014734a..2b0dbad9c2 100644 --- a/configs/nvidia-master.yaml +++ b/configs/nvidia-master.yaml @@ -7199,7 +7199,7 @@ qwen3.5-fp4-b300-sglang-agentic-mtp: - dram-utilization: 0.80 search-space: - { tp: 4, ep: 1, spec-decoding: mtp, kv-offloading: none, conc-list: [1, 4, 8, 12, 16, 20, 24, 28, 32, 40, 48, 56, 64, 72] } - - { tp: 4, ep: 1, spec-decoding: mtp, kv-offloading: dram, kv-offload-backend: { name: hicache }, conc-list: [64, 68, 72, 76, 88, 96] } + - { tp: 4, ep: 1, spec-decoding: mtp, kv-offloading: dram, kv-offload-backend: { name: hicache }, conc-list: [64, 68, 72, 76, 84, 88, 92, 94, 96] } - { tp: 2, ep: 2, spec-decoding: mtp, kv-offloading: none, conc-list: [1, 4, 8, 12, 16, 20, 24, 28, 32] } - { tp: 2, ep: 2, spec-decoding: mtp, kv-offloading: dram, kv-offload-backend: { name: hicache }, conc-list: [40, 48, 56, 60, 64, 68, 72, 76, 80] } From c43766e2d03a0f948796795f4e0441432bb298a0 Mon Sep 17 00:00:00 2001 From: Cam Quilici Date: Thu, 30 Jul 2026 03:08:07 -0500 Subject: [PATCH 21/30] perf(agentx): densify B300 TP2 cache crossover MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 中文:在 B300 TP2 的 c32 至 c56 区间增加 HiCache 重叠测试点,以覆盖一小时 AgentX 预热下可能提前出现的缓存悬崖。 --- configs/nvidia-master.yaml | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/configs/nvidia-master.yaml b/configs/nvidia-master.yaml index 2b0dbad9c2..49a5f3fbd2 100644 --- a/configs/nvidia-master.yaml +++ b/configs/nvidia-master.yaml @@ -7180,8 +7180,9 @@ qwen3.5-fp8-b300-sglang-agentic-hicache: # TP4 replicates the model's two KV heads and measured 30.5 KB/token node-wide; # TP2 measured 15.3 KB/token. Against the 256k trace's 88.8k median and 148.8k # p75 ISL, TP2 no-offload peaks at c32; c40/c48 plateau at the same input -# throughput with worse latency, and c56 loses all prefix hits. HiCache takes -# over at c40. TP4 no-offload is healthy through c72, while c96 loses roughly +# throughput with worse latency, and c56 loses all prefix hits. HiCache overlaps +# from c32 and densely resolves that crossover for the one-hour sweep. TP4 +# no-offload is healthy through c72, while c96 loses roughly # half its throughput as prefix hits fall. HiCache c88 is clean and dominates # no-offload c88. Both c80 trials produced shortened outputs, so that invalid # point is excluded while the clean c72-96 cache-cliff neighborhood stays dense. @@ -7201,7 +7202,7 @@ qwen3.5-fp4-b300-sglang-agentic-mtp: - { tp: 4, ep: 1, spec-decoding: mtp, kv-offloading: none, conc-list: [1, 4, 8, 12, 16, 20, 24, 28, 32, 40, 48, 56, 64, 72] } - { tp: 4, ep: 1, spec-decoding: mtp, kv-offloading: dram, kv-offload-backend: { name: hicache }, conc-list: [64, 68, 72, 76, 84, 88, 92, 94, 96] } - { tp: 2, ep: 2, spec-decoding: mtp, kv-offloading: none, conc-list: [1, 4, 8, 12, 16, 20, 24, 28, 32] } - - { tp: 2, ep: 2, spec-decoding: mtp, kv-offloading: dram, kv-offload-backend: { name: hicache }, conc-list: [40, 48, 56, 60, 64, 68, 72, 76, 80] } + - { tp: 2, ep: 2, spec-decoding: mtp, kv-offloading: dram, kv-offload-backend: { name: hicache }, conc-list: [32, 36, 40, 44, 48, 52, 56, 60, 64, 68, 72, 76, 80] } kimik2.5-fp4-b200-vllm-agentic-lmcache: image: vllm/vllm-openai:v0.22.0 From e0b8e280681dcc83f72113c21d6a0640ab3b71fd Mon Sep 17 00:00:00 2001 From: Cam Quilici Date: Thu, 30 Jul 2026 03:19:34 -0500 Subject: [PATCH 22/30] fix(agentx): scale Qwen tokenization by topology MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Use six tokenizer workers for TP4 long-context replay while retaining SGLang default single-worker startup for TP2 HiCache. 中文:TP4 长上下文回放使用 6 个 tokenizer worker;TP2 HiCache 保持 SGLang 默认单 worker 启动路径,避免共享内存初始化竞态。 --- .../single_node/agentic/qwen3.5_fp4_b300_sglang_mtp.sh | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/benchmarks/single_node/agentic/qwen3.5_fp4_b300_sglang_mtp.sh b/benchmarks/single_node/agentic/qwen3.5_fp4_b300_sglang_mtp.sh index 23bf3c6d27..05aafe16c2 100755 --- a/benchmarks/single_node/agentic/qwen3.5_fp4_b300_sglang_mtp.sh +++ b/benchmarks/single_node/agentic/qwen3.5_fp4_b300_sglang_mtp.sh @@ -82,6 +82,14 @@ PARALLEL_ARGS=( ) STREAM_INTERVAL=50 +# TP4 needs parallel tokenization to keep 256k AgentX warmups below the client +# request timeout. Keep TP2 on SGLang's single-worker default: multi-tokenizer +# startup races with the TP2 HiCache shared-memory initialization path. +TOKENIZER_ARGS=() +if [ "$TP" -ge 4 ]; then + TOKENIZER_ARGS=(--tokenizer-worker-num 6) +fi + # AgentX concurrency counts live session trees rather than individual HTTP # requests. Leave room for subagent fan-out and avoid spending HBM on graphs # above the batch sizes that remain useful for this long-context workload. @@ -123,6 +131,7 @@ SGLANG_CMD=( --mem-fraction-static 0.80 --stream-interval "$STREAM_INTERVAL" --scheduler-recv-interval "$SCHEDULER_RECV_INTERVAL" + "${TOKENIZER_ARGS[@]}" --tokenizer-path "$MODEL" --reasoning-parser qwen3 --tool-call-parser qwen3_coder From f8b5e3c3d9df431f0b218aa640100866ee99d4af Mon Sep 17 00:00:00 2001 From: Cam Quilici Date: Thu, 30 Jul 2026 03:30:25 -0500 Subject: [PATCH 23/30] perf(agentx): densify B300 TP2 cache boundary MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Add HiCache concurrency 34 and 38 around the measured c36-to-c40 transition. 中文:在实测 c36 到 c40 的转折区间补充 HiCache 并发点 34 和 38。 --- configs/nvidia-master.yaml | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/configs/nvidia-master.yaml b/configs/nvidia-master.yaml index 49a5f3fbd2..dcd0350850 100644 --- a/configs/nvidia-master.yaml +++ b/configs/nvidia-master.yaml @@ -7181,7 +7181,8 @@ qwen3.5-fp8-b300-sglang-agentic-hicache: # TP2 measured 15.3 KB/token. Against the 256k trace's 88.8k median and 148.8k # p75 ISL, TP2 no-offload peaks at c32; c40/c48 plateau at the same input # throughput with worse latency, and c56 loses all prefix hits. HiCache overlaps -# from c32 and densely resolves that crossover for the one-hour sweep. TP4 +# from c32; warm-cache probes put a sharp transition between c36 and c40, so +# c34/c38 densely resolve that crossover for the one-hour sweep. TP4 # no-offload is healthy through c72, while c96 loses roughly # half its throughput as prefix hits fall. HiCache c88 is clean and dominates # no-offload c88. Both c80 trials produced shortened outputs, so that invalid @@ -7202,7 +7203,7 @@ qwen3.5-fp4-b300-sglang-agentic-mtp: - { tp: 4, ep: 1, spec-decoding: mtp, kv-offloading: none, conc-list: [1, 4, 8, 12, 16, 20, 24, 28, 32, 40, 48, 56, 64, 72] } - { tp: 4, ep: 1, spec-decoding: mtp, kv-offloading: dram, kv-offload-backend: { name: hicache }, conc-list: [64, 68, 72, 76, 84, 88, 92, 94, 96] } - { tp: 2, ep: 2, spec-decoding: mtp, kv-offloading: none, conc-list: [1, 4, 8, 12, 16, 20, 24, 28, 32] } - - { tp: 2, ep: 2, spec-decoding: mtp, kv-offloading: dram, kv-offload-backend: { name: hicache }, conc-list: [32, 36, 40, 44, 48, 52, 56, 60, 64, 68, 72, 76, 80] } + - { tp: 2, ep: 2, spec-decoding: mtp, kv-offloading: dram, kv-offload-backend: { name: hicache }, conc-list: [32, 34, 36, 38, 40, 44, 48, 52, 56, 60, 64, 68, 72, 76, 80] } kimik2.5-fp4-b200-vllm-agentic-lmcache: image: vllm/vllm-openai:v0.22.0 From 023f5438d7f24653bd777ac1866f5deada4dfcd8 Mon Sep 17 00:00:00 2001 From: Cam Quilici Date: Thu, 30 Jul 2026 04:12:41 -0500 Subject: [PATCH 24/30] perf(agentx): refine B300 cache frontier MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Densify the TP4 no-offload cliff and remove TP4 HiCache points that are dominated by the TP4 no-offload and TP2 HiCache arms. Keep TP2 HiCache dense through the measured host-KV saturation region.\n\n中文:细化 B300 缓存帕累托前沿;加密 TP4 无卸载缓存临界区间,移除被 TP4 无卸载与 TP2 HiCache 方案支配的 TP4 HiCache 测点,并保留覆盖主机 KV 饱和区间的密集 TP2 HiCache 测点。 --- configs/nvidia-master.yaml | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/configs/nvidia-master.yaml b/configs/nvidia-master.yaml index dcd0350850..b2fc4a0166 100644 --- a/configs/nvidia-master.yaml +++ b/configs/nvidia-master.yaml @@ -7179,14 +7179,15 @@ qwen3.5-fp8-b300-sglang-agentic-hicache: # Qwen3.5 target FP8 KV is 15,360 bytes/token before the native MTP layer. # TP4 replicates the model's two KV heads and measured 30.5 KB/token node-wide; # TP2 measured 15.3 KB/token. Against the 256k trace's 88.8k median and 148.8k -# p75 ISL, TP2 no-offload peaks at c32; c40/c48 plateau at the same input -# throughput with worse latency, and c56 loses all prefix hits. HiCache overlaps -# from c32; warm-cache probes put a sharp transition between c36 and c40, so -# c34/c38 densely resolve that crossover for the one-hour sweep. TP4 -# no-offload is healthy through c72, while c96 loses roughly -# half its throughput as prefix hits fall. HiCache c88 is clean and dominates -# no-offload c88. Both c80 trials produced shortened outputs, so that invalid -# point is excluded while the clean c72-96 cache-cliff neighborhood stays dense. +# p75 ISL, TP2 no-offload peaks at c32. HiCache overlaps from c32; probes put +# the throughput transition between c34 and c40, while host KV reaches 98% at +# c52 and c56 is the last useful stress point. c64+ warmups only deepen the +# queue and are excluded. TP4 no-offload remains healthy into the c56-72 +# neighborhood, which is sampled every four requests around the cache cliff. +# TP4 HiCache is dominated there: c68 sustained 197k tok/s versus 224k for +# no-offload c64, while c76 fell to 158k with host KV full. Clean HiCache c94 +# was also dominated by no-offload c56 (210k vs 234k tok/s, with 44 ms vs 7 ms +# median ITL), so the TP4 HiCache arm is excluded. # DEP8 was rejected after fragmenting the trace across eight radix caches. qwen3.5-fp4-b300-sglang-agentic-mtp: image: lmsysorg/sglang:v0.5.16-cu130 @@ -7200,10 +7201,9 @@ qwen3.5-fp4-b300-sglang-agentic-mtp: agentic-coding: - dram-utilization: 0.80 search-space: - - { tp: 4, ep: 1, spec-decoding: mtp, kv-offloading: none, conc-list: [1, 4, 8, 12, 16, 20, 24, 28, 32, 40, 48, 56, 64, 72] } - - { tp: 4, ep: 1, spec-decoding: mtp, kv-offloading: dram, kv-offload-backend: { name: hicache }, conc-list: [64, 68, 72, 76, 84, 88, 92, 94, 96] } + - { tp: 4, ep: 1, spec-decoding: mtp, kv-offloading: none, conc-list: [1, 4, 8, 12, 16, 20, 24, 28, 32, 40, 48, 56, 60, 64, 68, 72] } - { tp: 2, ep: 2, spec-decoding: mtp, kv-offloading: none, conc-list: [1, 4, 8, 12, 16, 20, 24, 28, 32] } - - { tp: 2, ep: 2, spec-decoding: mtp, kv-offloading: dram, kv-offload-backend: { name: hicache }, conc-list: [32, 34, 36, 38, 40, 44, 48, 52, 56, 60, 64, 68, 72, 76, 80] } + - { tp: 2, ep: 2, spec-decoding: mtp, kv-offloading: dram, kv-offload-backend: { name: hicache }, conc-list: [32, 34, 36, 38, 40, 44, 48, 52, 56] } kimik2.5-fp4-b200-vllm-agentic-lmcache: image: vllm/vllm-openai:v0.22.0 From 012e78fc41110dc11de182cb57362e9fe07b905b Mon Sep 17 00:00:00 2001 From: Cam Quilici Date: Thu, 30 Jul 2026 12:05:45 -0500 Subject: [PATCH 25/30] fix(agentx): cap Qwen trace idle gaps Pin the AIPerf trace idle-gap branch and set the Qwen B300 replay cap to 300 seconds. --- benchmarks/single_node/agentic/qwen3.5_fp4_b300_sglang_mtp.sh | 1 + perf-changelog.yaml | 1 + utils/aiperf | 2 +- 3 files changed, 3 insertions(+), 1 deletion(-) diff --git a/benchmarks/single_node/agentic/qwen3.5_fp4_b300_sglang_mtp.sh b/benchmarks/single_node/agentic/qwen3.5_fp4_b300_sglang_mtp.sh index 05aafe16c2..e0781a3d21 100755 --- a/benchmarks/single_node/agentic/qwen3.5_fp4_b300_sglang_mtp.sh +++ b/benchmarks/single_node/agentic/qwen3.5_fp4_b300_sglang_mtp.sh @@ -168,6 +168,7 @@ if [ "${EVAL_ONLY:-false}" = "true" ]; then run_eval --port "$PORT" else build_replay_cmd "$RESULT_DIR" + REPLAY_CMD+=" --trace-idle-gap-cap-seconds 300" REPLAY_CMD+=" --server-metrics http://localhost:$PORT/metrics" run_agentic_replay_and_write_outputs "$RESULT_DIR" fi diff --git a/perf-changelog.yaml b/perf-changelog.yaml index 4ab147d2a4..2553ab2bcf 100644 --- a/perf-changelog.yaml +++ b/perf-changelog.yaml @@ -5345,5 +5345,6 @@ description: - "Add Qwen3.5-397B-A17B NVFP4 AgentX benchmark on B300 with SGLang native NEXTN MTP" - "Use the 256k trace dataset and golden synthetic acceptance length 3.39" + - "Pin AIPerf trace idle-gap support and cap per-trace idle gaps at 300 seconds" - "Image: lmsysorg/sglang:v0.5.16-cu130" pr-link: https://github.com/SemiAnalysisAI/InferenceX/pull/2421 diff --git a/utils/aiperf b/utils/aiperf index be758d6218..c1f4ea78f1 160000 --- a/utils/aiperf +++ b/utils/aiperf @@ -1 +1 @@ -Subproject commit be758d6218268171e2957fbec9d4f557275bca2d +Subproject commit c1f4ea78f1226cddc00ec45f553569d3b1b7c3f6 From c9187d787fc50ccff52c153628f276261743cd48 Mon Sep 17 00:00:00 2001 From: Cam Quilici Date: Thu, 30 Jul 2026 12:14:31 -0500 Subject: [PATCH 26/30] chore(aiperf): pin merged trace idle cap branch --- utils/aiperf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/utils/aiperf b/utils/aiperf index c1f4ea78f1..63d8be31b6 160000 --- a/utils/aiperf +++ b/utils/aiperf @@ -1 +1 @@ -Subproject commit c1f4ea78f1226cddc00ec45f553569d3b1b7c3f6 +Subproject commit 63d8be31b6d03f0f30a76efa8db35fa077ffefc8 From 6144fe059d2c468b2371f0623b3fb11aab9cbc5b Mon Sep 17 00:00:00 2001 From: Cam Quilici Date: Thu, 30 Jul 2026 13:16:19 -0500 Subject: [PATCH 27/30] chore(agentx): bump AIPerf trace idle cap fix Signed-off-by: Cam Quilici --- utils/aiperf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/utils/aiperf b/utils/aiperf index 63d8be31b6..1e5015f2c6 160000 --- a/utils/aiperf +++ b/utils/aiperf @@ -1 +1 @@ -Subproject commit 63d8be31b6d03f0f30a76efa8db35fa077ffefc8 +Subproject commit 1e5015f2c6f5ea220f2025fe8c4c6c1534e87f77 From 9c65228f9d6e95b1b1db5051a7c5788810ac328b Mon Sep 17 00:00:00 2001 From: Cam Quilici Date: Thu, 30 Jul 2026 13:35:04 -0500 Subject: [PATCH 28/30] fix(agentx): update AIPerf trace-cap cleanup Signed-off-by: Cam Quilici --- utils/aiperf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/utils/aiperf b/utils/aiperf index 1e5015f2c6..040766e5e0 160000 --- a/utils/aiperf +++ b/utils/aiperf @@ -1 +1 @@ -Subproject commit 1e5015f2c6f5ea220f2025fe8c4c6c1534e87f77 +Subproject commit 040766e5e0ea1656283b6a76c870d1bd35bda092 From 94353501dbf6bede75e26b700a641c296998b74e Mon Sep 17 00:00:00 2001 From: Cam Quilici Date: Thu, 30 Jul 2026 14:58:13 -0500 Subject: [PATCH 29/30] chore(agentx): pin reconstruction-only idle cap Update AIPerf after removing runtime trace idle enforcement. Signed-off-by: Cam Quilici --- utils/aiperf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/utils/aiperf b/utils/aiperf index 040766e5e0..61a29cda34 160000 --- a/utils/aiperf +++ b/utils/aiperf @@ -1 +1 @@ -Subproject commit 040766e5e0ea1656283b6a76c870d1bd35bda092 +Subproject commit 61a29cda34b828c4624278a1ae70910d6487156d From 2a7e8613152b381af7633370863197ab0ad6c584 Mon Sep 17 00:00:00 2001 From: Cam Quilici Date: Thu, 30 Jul 2026 16:39:59 -0500 Subject: [PATCH 30/30] fix(agentx): update AIPerf warmup handoff Signed-off-by: Cam Quilici --- utils/aiperf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/utils/aiperf b/utils/aiperf index 61a29cda34..b6e4ecf4ba 160000 --- a/utils/aiperf +++ b/utils/aiperf @@ -1 +1 @@ -Subproject commit 61a29cda34b828c4624278a1ae70910d6487156d +Subproject commit b6e4ecf4ba87ed1ab085380828c464ea601343d2