Skip to content

Commit bb50c7b

Browse files
committed
fix(evals): stabilize DSV4 quality sweep
1 parent 2d50dc1 commit bb50c7b

6 files changed

Lines changed: 50 additions & 35 deletions

File tree

benchmarks/single_node/agentic/dsv4_fp4_mi355x_sglang.sh

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -110,8 +110,12 @@ MAX_RUNNING_REQUESTS=$((2 * CONC))
110110
CUDA_GRAPH_MAX_BS=$CONC
111111
[ "$CUDA_GRAPH_MAX_BS" -gt 128 ] && CUDA_GRAPH_MAX_BS=128
112112

113-
export SGLANG_DEFAULT_THINKING=1
114-
export SGLANG_DSV4_REASONING_EFFORT=high
113+
if [ "${IS_AGENTIC:-0}" = "1" ]; then
114+
export SGLANG_DEFAULT_THINKING=1
115+
export SGLANG_DSV4_REASONING_EFFORT=high
116+
else
117+
unset SGLANG_DEFAULT_THINKING SGLANG_DSV4_REASONING_EFFORT
118+
fi
115119
export SGLANG_USE_ROCM700A=0
116120
export SGLANG_HACK_FLASHMLA_BACKEND=unified_kv_triton
117121
export AITER_BF16_FP8_MOE_BOUND=0

configs/amd-master.yaml

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1984,7 +1984,7 @@ dsv4-fp4-mi355x-sglang-mtp:
19841984
# gpu-mem-util=0.6. TP8 sweeps conc 4-64; DEP8 has a single conc=64
19851985
# probe to validate the ROCm DP+EP path.
19861986
dsv4-fp4-mi355x-vllm:
1987-
image: vllm/vllm-openai-rocm:nightly-09663abde0f50944a8d5ea30120666024b503faa
1987+
image: vllm/vllm-openai-rocm:nightly-67fe73b2b47e2927af1e5ec6fb91e16e3b075940
19881988
model: deepseek-ai/DeepSeek-V4-Pro
19891989
model-prefix: dsv4
19901990
runner: mi355x
@@ -2008,10 +2008,10 @@ dsv4-fp4-mi355x-vllm:
20082008
# vllm-project/vllm#43385 (ROCm DeepSeek-V4 MTP, merged 2026-05-24, included in
20092009
# v0.22.0). Full conc 4-512 range maps the complete crossover curve: MTP wins
20102010
# at low batch (PR perf data: +75% @ conc1, +38% @ conc8) and falls behind STP
2011-
# above ~conc32 (-37% @ conc32). Image reuses the base entry's v0.22.0 ROCm
2012-
# build, which already contains the MTP commit.
2011+
# above ~conc32 (-37% @ conc32). The pinned nightly contains both the base
2012+
# DeepSeek-V4 ROCm path and the MTP implementation.
20132013
dsv4-fp4-mi355x-vllm-mtp:
2014-
image: vllm/vllm-openai-rocm:nightly-09663abde0f50944a8d5ea30120666024b503faa
2014+
image: vllm/vllm-openai-rocm:nightly-67fe73b2b47e2927af1e5ec6fb91e16e3b075940
20152015
model: deepseek-ai/DeepSeek-V4-Pro
20162016
model-prefix: dsv4
20172017
runner: mi355x

utils/evals/EVALS.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -156,7 +156,7 @@ cat ./evals/agg_eval_all.json | jq '[.[] | select(.hw == "B200")]'
156156
| `EVAL_LIMIT` | empty | Limit eval to first N instances (smoke tests); empty = full set |
157157

158158
### Score validation
159-
`utils/evals/validate_scores.py` checks full-split eval results against thresholds in `utils/evals/thresholds.yaml`. First-N smoke slices skip the quality gate because their scores are not statistically representative. Validation runs after artifact upload so full-run results are preserved even if the gate fails.
159+
`utils/evals/validate_scores.py` checks full-split eval results against thresholds in `utils/evals/thresholds.json`. The JSON format keeps validation independent of optional PyYAML installations on runner hosts. First-N smoke slices skip the quality gate because their scores are not statistically representative. Validation runs after artifact upload so full-run results are preserved even if the gate fails.
160160

161161
### Adding a new eval task
162162

@@ -214,7 +214,7 @@ append_lm_eval_summary
214214
is derived from the YAML's `dataset_path` so generation and scoring can't diverge;
215215
`SWEBENCH_DATASET`, if set, must match it (mismatch fails fast).
216216
- Scoring runs on Modal remote sandboxes in CI (`SWEBENCH_USE_MODAL=true`, no Docker on the GPU
217-
nodes); local Docker scoring needs ~120 GB disk. The `thresholds.yaml` gate is `0.50`, calibrated
217+
nodes); local Docker scoring needs ~120 GB disk. The `thresholds.json` gate is `0.50`, calibrated
218218
from full-split runs (54%); historical 50-instance slices scored 62–76%.
219219

220220
## Task files

utils/evals/thresholds.json

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
{
2+
"default": {
3+
"aime26": 0.3,
4+
"gsm8k": 0.9,
5+
"gpqa_diamond_cot_n_shot": 0.3,
6+
"swebench_lite": 0.5
7+
},
8+
"models": {
9+
"dsr1": {
10+
"gsm8k": 0.91
11+
},
12+
"dsv4": {
13+
"aime26": 0.3,
14+
"gpqa_diamond_cot_n_shot": 0.65,
15+
"gsm8k": 0.91
16+
},
17+
"glm5": {
18+
"gsm8k": 0.94
19+
},
20+
"glm5.1": {
21+
"gsm8k": 0.93
22+
},
23+
"gptoss": {
24+
"gsm8k": 0.91
25+
},
26+
"kimik2.5": {
27+
"gsm8k": 0.9
28+
},
29+
"minimaxm2.5": {
30+
"gsm8k": 0.92
31+
},
32+
"qwen3.5": {
33+
"gsm8k": 0.94
34+
}
35+
}
36+
}

utils/evals/thresholds.yaml

Lines changed: 0 additions & 25 deletions
This file was deleted.

utils/evals/validate_scores.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -186,7 +186,7 @@ def main() -> int:
186186
)
187187
parser.add_argument(
188188
"--thresholds", default=None,
189-
help="Path to thresholds config, YAML or JSON (default: utils/evals/thresholds.yaml)",
189+
help="Path to thresholds config, YAML or JSON (default: utils/evals/thresholds.json)",
190190
)
191191
parser.add_argument(
192192
"--meta-env", default="meta_env.json",
@@ -229,7 +229,7 @@ def main() -> int:
229229
config = {"default": {}, "models": {}}
230230
thresholds_path = args.thresholds
231231
if thresholds_path is None:
232-
default_path = Path(__file__).parent / "thresholds.yaml"
232+
default_path = Path(__file__).parent / "thresholds.json"
233233
if default_path.exists():
234234
thresholds_path = str(default_path)
235235
if thresholds_path:

0 commit comments

Comments
 (0)