From 4a70e241edfa21abd8c94d9ec8d41377cc65cd48 Mon Sep 17 00:00:00 2001 From: wzhao18 Date: Sat, 25 Apr 2026 08:29:40 -0700 Subject: [PATCH 01/16] Add DSv4 B200 configs --- .github/configs/nvidia-master.yaml | 20 ++++ benchmarks/single_node/dsv4_fp4_b200_vllm.sh | 110 +++++++++++++++++++ 2 files changed, 130 insertions(+) create mode 100755 benchmarks/single_node/dsv4_fp4_b200_vllm.sh diff --git a/.github/configs/nvidia-master.yaml b/.github/configs/nvidia-master.yaml index 42c720a63..769acb51c 100644 --- a/.github/configs/nvidia-master.yaml +++ b/.github/configs/nvidia-master.yaml @@ -1705,6 +1705,26 @@ dsv4-fp4-b200-sglang: # max-throughput - { tp: 8, ep: 8, dp-attn: true, conc-start: 256, conc-end: 512 } +dsv4-fp4-b200-vllm: + image: vllm/vllm-openai:deepseekv4-cu130 + model: deepseek-ai/DeepSeek-V4-Pro + model-prefix: dsv4 + runner: b200-dsv4 + precision: fp4 + framework: vllm + multinode: false + seq-len-configs: + - isl: 1024 + osl: 1024 + search-space: + - { tp: 8, conc-start: 4, conc-end: 128 } + - { tp: 8, dp-attn: true, conc-start: 256, conc-end: 4096 } + - isl: 8192 + osl: 1024 + search-space: + - { tp: 8, conc-start: 4, conc-end: 32 } + - { tp: 8, dp-attn: true, conc-start: 64, conc-end: 1024 } + # NOTE: At the time of submission, https://cookbook.sglang.io/autoregressive/DeepSeek/DeepSeek-R1 # does not have a B300-specific recipe, so this config reuses the existing DSR1 FP4 # B200 SGLang recipe as-is until B300-specific tuning is available. diff --git a/benchmarks/single_node/dsv4_fp4_b200_vllm.sh b/benchmarks/single_node/dsv4_fp4_b200_vllm.sh new file mode 100755 index 000000000..88093aa62 --- /dev/null +++ b/benchmarks/single_node/dsv4_fp4_b200_vllm.sh @@ -0,0 +1,110 @@ +#!/usr/bin/env bash + +# DeepSeek-V4-Pro B200 single-node vLLM recipe derived from the B200 pareto +# sweep. Uses TP8 for low concurrency and DP8 (dp-attn=true) for high +# concurrency. Expert parallel is always enabled. + +source "$(dirname "$0")/../benchmark_lib.sh" + +check_env_vars \ + MODEL \ + TP \ + DP_ATTENTION \ + CONC \ + ISL \ + OSL \ + MAX_MODEL_LEN \ + RANDOM_RANGE_RATIO \ + RESULT_FILENAME + +if [[ -n "$SLURM_JOB_ID" ]]; then + echo "JOB $SLURM_JOB_ID running on $SLURMD_NODENAME" +fi + +nvidia-smi + +hf download "$MODEL" + +SERVER_LOG=/workspace/server.log +PORT=${PORT:-8888} + +# DeepSeek-V4-Pro weights are large; engine startup can exceed the default +# 600s. Give it an hour to load. +export VLLM_ENGINE_READY_TIMEOUT_S=3600 + +PARALLEL_ARGS=(--tensor-parallel-size "$TP" --data-parallel-size 1) +if [ "${DP_ATTENTION}" = "true" ]; then + PARALLEL_ARGS=(--tensor-parallel-size 1 --data-parallel-size "$TP") +fi + +# DP mode: mbt=ISL; TP mode: mbt=2*ISL; floor at 2048 +if [ "${DP_ATTENTION}" = "true" ]; then + MAX_NUM_BATCHED_TOKENS=$(( ISL < 2048 ? 2048 : ISL )) +else + MAX_NUM_BATCHED_TOKENS=$(( ISL * 2 < 2048 ? 2048 : ISL * 2 )) +fi + +BENCHMARK_MAX_MODEL_LEN="$MAX_MODEL_LEN" +if [ "$ISL" -eq 1024 ] && [ "$OSL" -eq 1024 ]; then + BENCHMARK_MAX_MODEL_LEN=4096 +fi + +if [ "${EVAL_ONLY}" = "true" ]; then + EVAL_MAX_MODEL_LEN=$(compute_eval_context_length "$MODEL" "$BENCHMARK_MAX_MODEL_LEN") + export EVAL_MAX_MODEL_LEN + SERVE_MAX_MODEL_LEN="$EVAL_MAX_MODEL_LEN" +else + SERVE_MAX_MODEL_LEN="$BENCHMARK_MAX_MODEL_LEN" +fi + +# Start GPU monitoring (power, temperature, clocks every second) +start_gpu_monitor + +set -x +vllm serve "$MODEL" --host 0.0.0.0 --port "$PORT" \ + "${PARALLEL_ARGS[@]}" \ + --pipeline-parallel-size 1 \ + --kv-cache-dtype fp8 \ + --trust-remote-code \ + --block-size 256 \ + --no-enable-prefix-caching \ + --enable-expert-parallel \ + --compilation-config '{"cudagraph_mode":"FULL_AND_PIECEWISE","custom_ops":["all"]}' \ + --attention_config.use_fp4_indexer_cache True \ + --tokenizer-mode deepseek_v4 \ + --tool-call-parser deepseek_v4 \ + --enable-auto-tool-choice \ + --reasoning-parser deepseek_v4 \ + --max-cudagraph-capture-size 2048 \ + --max-model-len "$SERVE_MAX_MODEL_LEN" \ + --max-num-batched-tokens "$MAX_NUM_BATCHED_TOKENS" > "$SERVER_LOG" 2>&1 & + +SERVER_PID=$! + +# Wait for server to be ready +wait_for_server_ready --port "$PORT" --server-log "$SERVER_LOG" --server-pid "$SERVER_PID" + +pip install -q datasets pandas + +run_benchmark_serving \ + --model "$MODEL" \ + --port "$PORT" \ + --backend vllm \ + --input-len "$ISL" \ + --output-len "$OSL" \ + --random-range-ratio "$RANDOM_RANGE_RATIO" \ + --num-prompts "$((CONC * 10))" \ + --max-concurrency "$CONC" \ + --result-filename "$RESULT_FILENAME" \ + --result-dir /workspace/ \ + --trust-remote-code + +# After throughput, run evaluation only if RUN_EVAL is true +if [ "${RUN_EVAL}" = "true" ]; then + run_eval --framework lm-eval --port "$PORT" + append_lm_eval_summary +fi + +# Stop GPU monitoring +stop_gpu_monitor +set +x From 6ee148f9b943fb806e8808a4b69365ec4667fce5 Mon Sep 17 00:00:00 2001 From: wzhao18 Date: Sat, 25 Apr 2026 08:45:26 -0700 Subject: [PATCH 02/16] Add changelog --- perf-changelog.yaml | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/perf-changelog.yaml b/perf-changelog.yaml index 397da6591..4309fe73a 100644 --- a/perf-changelog.yaml +++ b/perf-changelog.yaml @@ -1819,3 +1819,12 @@ - "Restore the recipe-per-CONC split (low-latency / balanced / max-throughput) on top of the low-latency-only fallback from #1143; the DeepEP FP8 weight-postprocess path is fixed, so the high-throughput scenario runs again" - "Recipes from https://docs.sglang.io/cookbook/autoregressive/DeepSeek/DeepSeek-V4" pr-link: https://github.com/SemiAnalysisAI/InferenceX/pull/1132 + +- config-keys: + - dsv4-fp4-b200-vllm + description: + - "Add DeepSeek-V4-Pro single-node B200 vLLM benchmark derived from B200 pareto sweep" + - "ISL=1024: TP8 conc 4-128; DP8 (dp-attn) conc 256-4096" + - "ISL=8192: TP8 conc 4-32; DP8 (dp-attn) conc 64-1024" + pr-link: https://github.com/SemiAnalysisAI/InferenceX/pull/1156 + From 707f2256d6f494f05ccdf89184fb283c5d0cca84 Mon Sep 17 00:00:00 2001 From: wzhao18 Date: Sat, 25 Apr 2026 09:36:41 -0700 Subject: [PATCH 03/16] fixup --- .github/configs/nvidia-master.yaml | 4 ++-- benchmarks/single_node/dsv4_fp4_b200_vllm.sh | 11 ++++++++--- 2 files changed, 10 insertions(+), 5 deletions(-) diff --git a/.github/configs/nvidia-master.yaml b/.github/configs/nvidia-master.yaml index 769acb51c..d1b0813ba 100644 --- a/.github/configs/nvidia-master.yaml +++ b/.github/configs/nvidia-master.yaml @@ -1718,12 +1718,12 @@ dsv4-fp4-b200-vllm: osl: 1024 search-space: - { tp: 8, conc-start: 4, conc-end: 128 } - - { tp: 8, dp-attn: true, conc-start: 256, conc-end: 4096 } + - { tp: 8, ep: 8, dp-attn: true, conc-start: 256, conc-end: 4096 } - isl: 8192 osl: 1024 search-space: - { tp: 8, conc-start: 4, conc-end: 32 } - - { tp: 8, dp-attn: true, conc-start: 64, conc-end: 1024 } + - { tp: 8, ep: 8, dp-attn: true, conc-start: 64, conc-end: 1024 } # NOTE: At the time of submission, https://cookbook.sglang.io/autoregressive/DeepSeek/DeepSeek-R1 # does not have a B300-specific recipe, so this config reuses the existing DSR1 FP4 diff --git a/benchmarks/single_node/dsv4_fp4_b200_vllm.sh b/benchmarks/single_node/dsv4_fp4_b200_vllm.sh index 88093aa62..be9f84f71 100755 --- a/benchmarks/single_node/dsv4_fp4_b200_vllm.sh +++ b/benchmarks/single_node/dsv4_fp4_b200_vllm.sh @@ -1,8 +1,8 @@ #!/usr/bin/env bash # DeepSeek-V4-Pro B200 single-node vLLM recipe derived from the B200 pareto -# sweep. Uses TP8 for low concurrency and DP8 (dp-attn=true) for high -# concurrency. Expert parallel is always enabled. +# sweep. TP mode (dp-attn=false) runs without expert parallel; DP mode +# (dp-attn=true) enables expert parallel (EP_SIZE=TP value = DP size). source "$(dirname "$0")/../benchmark_lib.sh" @@ -37,6 +37,11 @@ if [ "${DP_ATTENTION}" = "true" ]; then PARALLEL_ARGS=(--tensor-parallel-size 1 --data-parallel-size "$TP") fi +EP_ARGS=() +if [ "${EP_SIZE:-1}" -gt 1 ]; then + EP_ARGS=(--enable-expert-parallel) +fi + # DP mode: mbt=ISL; TP mode: mbt=2*ISL; floor at 2048 if [ "${DP_ATTENTION}" = "true" ]; then MAX_NUM_BATCHED_TOKENS=$(( ISL < 2048 ? 2048 : ISL )) @@ -68,7 +73,7 @@ vllm serve "$MODEL" --host 0.0.0.0 --port "$PORT" \ --trust-remote-code \ --block-size 256 \ --no-enable-prefix-caching \ - --enable-expert-parallel \ + "${EP_ARGS[@]}" \ --compilation-config '{"cudagraph_mode":"FULL_AND_PIECEWISE","custom_ops":["all"]}' \ --attention_config.use_fp4_indexer_cache True \ --tokenizer-mode deepseek_v4 \ From 8ec131053eafbd98baf5011516d5f521e9c2e503 Mon Sep 17 00:00:00 2001 From: wzhao18 Date: Sat, 25 Apr 2026 09:46:20 -0700 Subject: [PATCH 04/16] fixup --- .github/configs/nvidia-master.yaml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/configs/nvidia-master.yaml b/.github/configs/nvidia-master.yaml index d1b0813ba..4ec19cf27 100644 --- a/.github/configs/nvidia-master.yaml +++ b/.github/configs/nvidia-master.yaml @@ -1717,7 +1717,8 @@ dsv4-fp4-b200-vllm: - isl: 1024 osl: 1024 search-space: - - { tp: 8, conc-start: 4, conc-end: 128 } + - { tp: 8, conc-start: 4, conc-end: 64 } + - { tp: 8, ep: 8, conc-start: 128, conc-end: 128 } - { tp: 8, ep: 8, dp-attn: true, conc-start: 256, conc-end: 4096 } - isl: 8192 osl: 1024 From 81594d748eccff1078727ff541d644336d0e64dc Mon Sep 17 00:00:00 2001 From: wzhao18 Date: Sat, 25 Apr 2026 09:59:04 -0700 Subject: [PATCH 05/16] fixup --- benchmarks/single_node/dsv4_fp4_b200_vllm.sh | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/benchmarks/single_node/dsv4_fp4_b200_vllm.sh b/benchmarks/single_node/dsv4_fp4_b200_vllm.sh index be9f84f71..338b80bd9 100755 --- a/benchmarks/single_node/dsv4_fp4_b200_vllm.sh +++ b/benchmarks/single_node/dsv4_fp4_b200_vllm.sh @@ -42,6 +42,12 @@ if [ "${EP_SIZE:-1}" -gt 1 ]; then EP_ARGS=(--enable-expert-parallel) fi +# DP mode uses gpu-memory-utilization=0.85 (matched from pareto sweep) +GMU_ARGS=() +if [ "${DP_ATTENTION}" = "true" ]; then + GMU_ARGS=(--gpu-memory-utilization 0.85) +fi + # DP mode: mbt=ISL; TP mode: mbt=2*ISL; floor at 2048 if [ "${DP_ATTENTION}" = "true" ]; then MAX_NUM_BATCHED_TOKENS=$(( ISL < 2048 ? 2048 : ISL )) @@ -74,6 +80,7 @@ vllm serve "$MODEL" --host 0.0.0.0 --port "$PORT" \ --block-size 256 \ --no-enable-prefix-caching \ "${EP_ARGS[@]}" \ + "${GMU_ARGS[@]}" \ --compilation-config '{"cudagraph_mode":"FULL_AND_PIECEWISE","custom_ops":["all"]}' \ --attention_config.use_fp4_indexer_cache True \ --tokenizer-mode deepseek_v4 \ From f2fcfae6d0558bb85790182f71a15204e5287318 Mon Sep 17 00:00:00 2001 From: wzhao18 Date: Sat, 25 Apr 2026 10:18:59 -0700 Subject: [PATCH 06/16] fix runners --- runners/launch_b200-cw.sh | 10 +++++++++- runners/launch_b200-dgxc-slurm.sh | 10 +++++++++- runners/launch_b200-nb.sh | 10 +++++++++- 3 files changed, 27 insertions(+), 3 deletions(-) diff --git a/runners/launch_b200-cw.sh b/runners/launch_b200-cw.sh index ec7ba9a97..0b2dbf305 100644 --- a/runners/launch_b200-cw.sh +++ b/runners/launch_b200-cw.sh @@ -6,6 +6,14 @@ export PORT=8888 MODEL_CODE="${EXP_NAME%%_*}" FRAMEWORK_SUFFIX=$([[ "$FRAMEWORK" == "trt" ]] && printf '_trt' || printf '') SPEC_SUFFIX=$([[ "$SPEC_DECODING" == "mtp" ]] && printf '_mtp' || printf '') +# Prefer a framework-tagged script (e.g. dsv4_fp4_b200_vllm.sh) so models +# with multiple inference engines can coexist; fall back to the historical +# name without an engine suffix (`_trt` for trt, bare for everyone else). +BENCH_BASE="benchmarks/single_node/${MODEL_CODE}_${PRECISION}_b200" +BENCH_SCRIPT="${BENCH_BASE}_${FRAMEWORK}${SPEC_SUFFIX}.sh" +if [[ ! -f "$BENCH_SCRIPT" ]]; then + BENCH_SCRIPT="${BENCH_BASE}${FRAMEWORK_SUFFIX}${SPEC_SUFFIX}.sh" +fi PARTITION="b200" SQUASH_FILE="/tmp/gharunner/squash/$(echo "$IMAGE" | sed 's/[\/:@#]/_/g').sqsh" @@ -58,6 +66,6 @@ srun --jobid=$JOB_ID \ --container-mount-home \ --container-workdir=$CONTAINER_MOUNT_DIR \ --no-container-entrypoint --export=ALL \ -bash benchmarks/single_node/${MODEL_CODE}_${PRECISION}_b200${FRAMEWORK_SUFFIX}${SPEC_SUFFIX}.sh +bash "$BENCH_SCRIPT" scancel $JOB_ID diff --git a/runners/launch_b200-dgxc-slurm.sh b/runners/launch_b200-dgxc-slurm.sh index c07037ff4..edf5db957 100644 --- a/runners/launch_b200-dgxc-slurm.sh +++ b/runners/launch_b200-dgxc-slurm.sh @@ -253,6 +253,14 @@ else SQUASH_FILE="/home/sa-shared/containers/$(echo "$IMAGE" | sed 's/[\/:@#]/_/g').sqsh" FRAMEWORK_SUFFIX=$([[ "$FRAMEWORK" == "trt" ]] && printf '_trt' || printf '') SPEC_SUFFIX=$([[ "$SPEC_DECODING" == "mtp" ]] && printf '_mtp' || printf '') + # Prefer a framework-tagged script (e.g. dsv4_fp4_b200_vllm.sh) so models + # with multiple inference engines can coexist; fall back to the historical + # name without an engine suffix (`_trt` for trt, bare for everyone else). + BENCH_BASE="benchmarks/single_node/${EXP_NAME%%_*}_${PRECISION}_b200" + BENCH_SCRIPT="${BENCH_BASE}_${FRAMEWORK}${SPEC_SUFFIX}.sh" + if [[ ! -f "$BENCH_SCRIPT" ]]; then + BENCH_SCRIPT="${BENCH_BASE}${FRAMEWORK_SUFFIX}${SPEC_SUFFIX}.sh" + fi LOCK_FILE="${SQUASH_FILE}.lock" # TODO(Cam): lmsysorg/sglang:deepseek-v4-blackwell installs sglang editable at @@ -290,5 +298,5 @@ else --no-container-mount-home \ --container-workdir=$CONTAINER_MOUNT_DIR \ --no-container-entrypoint --export=ALL,PORT=8888 \ - bash benchmarks/single_node/${EXP_NAME%%_*}_${PRECISION}_b200${FRAMEWORK_SUFFIX}${SPEC_SUFFIX}.sh + bash "$BENCH_SCRIPT" fi diff --git a/runners/launch_b200-nb.sh b/runners/launch_b200-nb.sh index 6b411fec2..e0c8d92fb 100644 --- a/runners/launch_b200-nb.sh +++ b/runners/launch_b200-nb.sh @@ -4,6 +4,14 @@ HF_HUB_CACHE_MOUNT="/mnt/data/gharunners/hf-hub-cache/" PARTITION="main" FRAMEWORK_SUFFIX=$([[ "$FRAMEWORK" == "trt" ]] && printf '_trt' || printf '') SPEC_SUFFIX=$([[ "$SPEC_DECODING" == "mtp" ]] && printf '_mtp' || printf '') +# Prefer a framework-tagged script (e.g. dsv4_fp4_b200_vllm.sh) so models +# with multiple inference engines can coexist; fall back to the historical +# name without an engine suffix (`_trt` for trt, bare for everyone else). +BENCH_BASE="benchmarks/single_node/${EXP_NAME%%_*}_${PRECISION}_b200" +BENCH_SCRIPT="${BENCH_BASE}_${FRAMEWORK}${SPEC_SUFFIX}.sh" +if [[ ! -f "$BENCH_SCRIPT" ]]; then + BENCH_SCRIPT="${BENCH_BASE}${FRAMEWORK_SUFFIX}${SPEC_SUFFIX}.sh" +fi UCX_NET_DEVICES=eth0 @@ -27,4 +35,4 @@ srun --partition=$PARTITION --gres=gpu:$TP --exclusive --job-name="$RUNNER_NAME" --container-writable \ --container-workdir=$CONTAINER_MOUNT_DIR \ --no-container-entrypoint --export=ALL,PORT=8888,UCX_NET_DEVICES=$UCX_NET_DEVICES \ -bash benchmarks/single_node/${EXP_NAME%%_*}_${PRECISION}_b200${FRAMEWORK_SUFFIX}${SPEC_SUFFIX}.sh \ No newline at end of file +bash "$BENCH_SCRIPT" \ No newline at end of file From 98d83ffab9db0cf9360c4e707e04307d05ecad91 Mon Sep 17 00:00:00 2001 From: Wei Zhao <51183510+wzhao18@users.noreply.github.com> Date: Sat, 25 Apr 2026 20:12:12 -0400 Subject: [PATCH 07/16] Simplify MAX_NUM_BATCHED_TOKENS calculation Set MAX_NUM_BATCHED_TOKENS to a fixed value of 2048. --- benchmarks/single_node/dsv4_fp4_b200_vllm.sh | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/benchmarks/single_node/dsv4_fp4_b200_vllm.sh b/benchmarks/single_node/dsv4_fp4_b200_vllm.sh index 338b80bd9..7eeebddda 100755 --- a/benchmarks/single_node/dsv4_fp4_b200_vllm.sh +++ b/benchmarks/single_node/dsv4_fp4_b200_vllm.sh @@ -48,12 +48,7 @@ if [ "${DP_ATTENTION}" = "true" ]; then GMU_ARGS=(--gpu-memory-utilization 0.85) fi -# DP mode: mbt=ISL; TP mode: mbt=2*ISL; floor at 2048 -if [ "${DP_ATTENTION}" = "true" ]; then - MAX_NUM_BATCHED_TOKENS=$(( ISL < 2048 ? 2048 : ISL )) -else - MAX_NUM_BATCHED_TOKENS=$(( ISL * 2 < 2048 ? 2048 : ISL * 2 )) -fi +MAX_NUM_BATCHED_TOKENS=2048 BENCHMARK_MAX_MODEL_LEN="$MAX_MODEL_LEN" if [ "$ISL" -eq 1024 ] && [ "$OSL" -eq 1024 ]; then From c18f4132b6aa6b172c5c04809a979f08572e0a51 Mon Sep 17 00:00:00 2001 From: Wei Zhao <51183510+wzhao18@users.noreply.github.com> Date: Sat, 25 Apr 2026 20:36:21 -0400 Subject: [PATCH 08/16] Update perf-changelog.yaml with benchmark changes Removed and re-added DeepSeek-V4-Pro benchmark details in the changelog. --- perf-changelog.yaml | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/perf-changelog.yaml b/perf-changelog.yaml index 6ae2c64a5..9ac4a1e9a 100644 --- a/perf-changelog.yaml +++ b/perf-changelog.yaml @@ -1820,14 +1820,6 @@ - "Recipes from https://docs.sglang.io/cookbook/autoregressive/DeepSeek/DeepSeek-V4" pr-link: https://github.com/SemiAnalysisAI/InferenceX/pull/1132 -- config-keys: - - dsv4-fp4-b200-vllm - description: - - "Add DeepSeek-V4-Pro single-node B200 vLLM benchmark derived from B200 pareto sweep" - - "ISL=1024: TP8 conc 4-128; DP8 (dp-attn) conc 256-4096" - - "ISL=8192: TP8 conc 4-32; DP8 (dp-attn) conc 64-1024" - pr-link: https://github.com/SemiAnalysisAI/InferenceX/pull/1156 - - config-keys: - dsv4-fp8-mi355x-sglang description: @@ -1842,3 +1834,11 @@ - "Bump --chunked-prefill-size from 4096 to 8192" - "Retrigger dsv4-fp8-mi355x-sglang" pr-link: https://github.com/SemiAnalysisAI/InferenceX/pull/1159 + +- config-keys: + - dsv4-fp4-b200-vllm + description: + - "Add DeepSeek-V4-Pro single-node B200 vLLM benchmark derived from B200 pareto sweep" + - "ISL=1024: TP8 conc 4-128; DP8 (dp-attn) conc 256-4096" + - "ISL=8192: TP8 conc 4-32; DP8 (dp-attn) conc 64-1024" + pr-link: https://github.com/SemiAnalysisAI/InferenceX/pull/1156 From 5bab835a1f38937351c71d5d5c60f778de136bbb Mon Sep 17 00:00:00 2001 From: Wei Zhao <51183510+wzhao18@users.noreply.github.com> Date: Sun, 26 Apr 2026 00:46:43 -0400 Subject: [PATCH 09/16] Modify MAX_NUM_BATCHED_TOKENS logic Adjust MAX_NUM_BATCHED_TOKENS based on ISL and concurrency. --- benchmarks/single_node/dsv4_fp4_b200_vllm.sh | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/benchmarks/single_node/dsv4_fp4_b200_vllm.sh b/benchmarks/single_node/dsv4_fp4_b200_vllm.sh index 7eeebddda..9901f3966 100755 --- a/benchmarks/single_node/dsv4_fp4_b200_vllm.sh +++ b/benchmarks/single_node/dsv4_fp4_b200_vllm.sh @@ -48,7 +48,11 @@ if [ "${DP_ATTENTION}" = "true" ]; then GMU_ARGS=(--gpu-memory-utilization 0.85) fi -MAX_NUM_BATCHED_TOKENS=2048 +if [ "${ISL}" -eq 8192 ] && [ "${concurrency}" -le 128 ]; then + MAX_NUM_BATCHED_TOKENS=$(( ISL * 2 )) +else + MAX_NUM_BATCHED_TOKENS=2048 +fi BENCHMARK_MAX_MODEL_LEN="$MAX_MODEL_LEN" if [ "$ISL" -eq 1024 ] && [ "$OSL" -eq 1024 ]; then From e28c638b43c157c9b52c8acce2702a8599665e5e Mon Sep 17 00:00:00 2001 From: Wei Zhao <51183510+wzhao18@users.noreply.github.com> Date: Sun, 26 Apr 2026 10:26:23 -0400 Subject: [PATCH 10/16] Fix variable name from 'concurrency' to 'CONC' --- benchmarks/single_node/dsv4_fp4_b200_vllm.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/benchmarks/single_node/dsv4_fp4_b200_vllm.sh b/benchmarks/single_node/dsv4_fp4_b200_vllm.sh index 9901f3966..53b7e645f 100755 --- a/benchmarks/single_node/dsv4_fp4_b200_vllm.sh +++ b/benchmarks/single_node/dsv4_fp4_b200_vllm.sh @@ -48,7 +48,7 @@ if [ "${DP_ATTENTION}" = "true" ]; then GMU_ARGS=(--gpu-memory-utilization 0.85) fi -if [ "${ISL}" -eq 8192 ] && [ "${concurrency}" -le 128 ]; then +if [ "${ISL}" -eq 8192 ] && [ "${CONC}" -le 128 ]; then MAX_NUM_BATCHED_TOKENS=$(( ISL * 2 )) else MAX_NUM_BATCHED_TOKENS=2048 From e86d6e9b070e6ba5480cfddbca31cb4820309b66 Mon Sep 17 00:00:00 2001 From: Wei Zhao <51183510+wzhao18@users.noreply.github.com> Date: Sun, 26 Apr 2026 16:29:33 -0400 Subject: [PATCH 11/16] Revise perf-changelog.yaml with new benchmarks Updated performance changelog with new benchmarks and configurations for DeepSeek-V4-Pro and vLLM. Removed obsolete entries and added links to relevant pull requests. --- perf-changelog.yaml | 36 ++++++++++++++---------------------- 1 file changed, 14 insertions(+), 22 deletions(-) diff --git a/perf-changelog.yaml b/perf-changelog.yaml index 705a3f019..ac01a5c28 100644 --- a/perf-changelog.yaml +++ b/perf-changelog.yaml @@ -1857,32 +1857,24 @@ pr-link: https://github.com/SemiAnalysisAI/InferenceX/pull/1170 - config-keys: - - dsv4-fp4-b300-sglang - description: - - "Restore the recipe-per-CONC split (low-latency / balanced / max-throughput) on top of the low-latency-only fallback from #1143; the DeepEP FP8 weight-postprocess path is fixed, so the high-throughput scenario runs again" - - "Recipes from https://docs.sglang.io/cookbook/autoregressive/DeepSeek/DeepSeek-V4" - pr-link: https://github.com/SemiAnalysisAI/InferenceX/pull/1158 - -- config-keys: - - dsv4-fp4-b300-sglang + - dsv4-fp4-b300-sglang-mtp description: - - "Floor --max-running-requests at 8 in dsv4_fp4_b300_sglang.sh so low-CONC sweeps don't drop below the queue depth needed for stable benchmarking (CONC * 3 / 2 still applies above CONC=5)" - pr-link: https://github.com/SemiAnalysisAI/InferenceX/pull/1173 - -- config-keys: - - dsv4-fp4-b300-sglang - description: - - "better performance for dp-attention" - - "Recipes from https://docs.sglang.io/cookbook/autoregressive/DeepSeek/DeepSeek-V4" - pr-link: https://github.com/SemiAnalysisAI/InferenceX/pull/1174 + - "Add DeepSeek-V4-Pro FP4 B300 SGLang benchmark with EAGLE/MTP speculative decoding" + - "Image: lmsysorg/sglang:deepseek-v4-b300@sha256:26e116bd211e300dbb76924d56c5cbe6cc3ee5ee2fe314859cb8774f5bc070f3 (pinned for deep_gemm transform_weights_for_mega_moe support; same digest as PR #1158)" + - "Model: deepseek-ai/DeepSeek-V4-Pro" + - "EAGLE/MTP flags hardcoded in script: num-steps=3, eagle-topk=1, num-draft-tokens=4" + - "Recipe (MoE backend, chunked-prefill) selected in script by dp-attn: TP-only + flashinfer_mxfp4 (small batch) vs DP-attn + deepep mega_moe (large batch)" + - "Three CONC bands: A=TP8 (1-8), B=TP4 (16-128), C=DP4 dp-attn (64-512); B/C overlap at conc 64,128" + - "Configs: 1k1k and 8k1k, no validation.py / launcher / yaml-field changes (knob-free)" + pr-link: https://github.com/SemiAnalysisAI/InferenceX/pull/1166 - config-keys: - - dsv4-fp4-b200-vllm + - dsv4-fp4-b300-vllm description: - - "Add DeepSeek-V4-Pro single-node B200 vLLM benchmark derived from B200 pareto sweep" - - "ISL=1024: TP8 conc 4-128; DP8 (dp-attn) conc 256-4096" - - "ISL=8192: TP8 conc 4-32; DP8 (dp-attn) conc 64-1024" - pr-link: https://github.com/SemiAnalysisAI/InferenceX/pull/1156 + - "Update search space based on B300 pareto sweep results" + - "ISL=1024: TP4 conc 4-128; DP4 (dp-attn) conc 256-4096; DP8 (dp-attn) conc 2048-8192" + - "ISL=8192: TP4 conc 4-64; DP4 (dp-attn) conc 128-1024; DP8 (dp-attn) conc 1024-8192" + pr-link: https://github.com/SemiAnalysisAI/InferenceX/pull/1155 - config-keys: - dsv4-fp4-b200-vllm From a222193d444db56bcb5862d41bebc66656f828d6 Mon Sep 17 00:00:00 2001 From: Wei Zhao <51183510+wzhao18@users.noreply.github.com> Date: Sun, 26 Apr 2026 16:30:51 -0400 Subject: [PATCH 12/16] Update perf-changelog.yaml --- perf-changelog.yaml | 7 ------- 1 file changed, 7 deletions(-) diff --git a/perf-changelog.yaml b/perf-changelog.yaml index ac01a5c28..eb61839df 100644 --- a/perf-changelog.yaml +++ b/perf-changelog.yaml @@ -1779,13 +1779,6 @@ - "Prefix caching and speculative decoding disabled for baseline numbers" pr-link: https://github.com/SemiAnalysisAI/InferenceX/pull/1131 -- config-keys: - - dsv4-fp4-b300-sglang - description: - - "Restore the recipe-per-CONC split (low-latency / balanced / max-throughput) on top of the low-latency-only fallback from #1143; the DeepEP FP8 weight-postprocess path is fixed, so the high-throughput scenario runs again" - - "Recipes from https://docs.sglang.io/cookbook/autoregressive/DeepSeek/DeepSeek-V4" - pr-link: https://github.com/SemiAnalysisAI/InferenceX/pull/1158 - - config-keys: - dsv4-fp8-mi355x-sglang description: From 3f038c42113ba870130de09bd9b575c32ab98076 Mon Sep 17 00:00:00 2001 From: Wei Zhao <51183510+wzhao18@users.noreply.github.com> Date: Sun, 26 Apr 2026 19:46:57 -0400 Subject: [PATCH 13/16] lower batch size to fix OOM --- benchmarks/single_node/dsv4_fp4_b200_vllm.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/benchmarks/single_node/dsv4_fp4_b200_vllm.sh b/benchmarks/single_node/dsv4_fp4_b200_vllm.sh index 53b7e645f..2db6d899e 100755 --- a/benchmarks/single_node/dsv4_fp4_b200_vllm.sh +++ b/benchmarks/single_node/dsv4_fp4_b200_vllm.sh @@ -49,7 +49,7 @@ if [ "${DP_ATTENTION}" = "true" ]; then fi if [ "${ISL}" -eq 8192 ] && [ "${CONC}" -le 128 ]; then - MAX_NUM_BATCHED_TOKENS=$(( ISL * 2 )) + MAX_NUM_BATCHED_TOKENS=${ISL} else MAX_NUM_BATCHED_TOKENS=2048 fi From fae14d9be14f70fdf7b7f845462bb86da18cb395 Mon Sep 17 00:00:00 2001 From: Wei Zhao <51183510+wzhao18@users.noreply.github.com> Date: Sun, 26 Apr 2026 19:50:21 -0400 Subject: [PATCH 14/16] Remove GPU memory utilization for DP mode Removed GPU memory utilization settings for DP mode. --- benchmarks/single_node/dsv4_fp4_b200_vllm.sh | 6 ------ 1 file changed, 6 deletions(-) diff --git a/benchmarks/single_node/dsv4_fp4_b200_vllm.sh b/benchmarks/single_node/dsv4_fp4_b200_vllm.sh index 2db6d899e..c85637506 100755 --- a/benchmarks/single_node/dsv4_fp4_b200_vllm.sh +++ b/benchmarks/single_node/dsv4_fp4_b200_vllm.sh @@ -42,12 +42,6 @@ if [ "${EP_SIZE:-1}" -gt 1 ]; then EP_ARGS=(--enable-expert-parallel) fi -# DP mode uses gpu-memory-utilization=0.85 (matched from pareto sweep) -GMU_ARGS=() -if [ "${DP_ATTENTION}" = "true" ]; then - GMU_ARGS=(--gpu-memory-utilization 0.85) -fi - if [ "${ISL}" -eq 8192 ] && [ "${CONC}" -le 128 ]; then MAX_NUM_BATCHED_TOKENS=${ISL} else From acb851022464d992b1197844c0b9a98e1374da4c Mon Sep 17 00:00:00 2001 From: Wei Zhao <51183510+wzhao18@users.noreply.github.com> Date: Sun, 26 Apr 2026 20:35:52 -0400 Subject: [PATCH 15/16] Introduce GMU_ARGS for GPU memory utilization Add GPU memory utilization argument for DP attention. --- benchmarks/single_node/dsv4_fp4_b200_vllm.sh | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/benchmarks/single_node/dsv4_fp4_b200_vllm.sh b/benchmarks/single_node/dsv4_fp4_b200_vllm.sh index c85637506..d37dc5282 100755 --- a/benchmarks/single_node/dsv4_fp4_b200_vllm.sh +++ b/benchmarks/single_node/dsv4_fp4_b200_vllm.sh @@ -42,6 +42,11 @@ if [ "${EP_SIZE:-1}" -gt 1 ]; then EP_ARGS=(--enable-expert-parallel) fi +GMU_ARGS=() +if [ "${DP_ATTENTION}" = "true" ]; then + GMU_ARGS=(--gpu-memory-utilization 0.85) +fi + if [ "${ISL}" -eq 8192 ] && [ "${CONC}" -le 128 ]; then MAX_NUM_BATCHED_TOKENS=${ISL} else From 984064aa17c7b86e7730c6020408d72ff3e9ab63 Mon Sep 17 00:00:00 2001 From: wzhao18 Date: Sun, 26 Apr 2026 22:10:07 -0700 Subject: [PATCH 16/16] Add low-latency configs --- .github/configs/nvidia-master.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/configs/nvidia-master.yaml b/.github/configs/nvidia-master.yaml index 57157ba40..17d9b2b1d 100644 --- a/.github/configs/nvidia-master.yaml +++ b/.github/configs/nvidia-master.yaml @@ -1718,13 +1718,13 @@ dsv4-fp4-b200-vllm: - isl: 1024 osl: 1024 search-space: - - { tp: 8, conc-start: 4, conc-end: 64 } + - { tp: 8, conc-start: 1, conc-end: 64 } - { tp: 8, ep: 8, conc-start: 128, conc-end: 128 } - { tp: 8, ep: 8, dp-attn: true, conc-start: 256, conc-end: 4096 } - isl: 8192 osl: 1024 search-space: - - { tp: 8, conc-start: 4, conc-end: 32 } + - { tp: 8, conc-start: 1, conc-end: 32 } - { tp: 8, ep: 8, dp-attn: true, conc-start: 64, conc-end: 1024 } # NOTE: At the time of submission, https://cookbook.sglang.io/autoregressive/DeepSeek/DeepSeek-R1