Repository navigation
[Rules] Check 13 draft precision: process-wide ROCm opt-ins and whether measured real-workload AL can be evidence #3841
Description
Ask
Check 13 (Draft runs as shipped) currently rules out two ROCm target-side optimizations for DeepSeek-V4.1-Flash because both knobs are process-wide in the pinned image and therefore also touch the DSpark draft. We would like to avoid carrying an unmerged upstream vLLM change purely as a gate-passing mechanism, and instead ask:
- Will measured real-workload acceptance length — from the InferenceX GSM8K harness, with the real draft and real rejection sampling — be admitted as evidence under Check 13, given that
CONTRIBUTING.mdcurrently excludes only synthetic AgentX acceptance? - If not, can the rule state the acceptance criteria explicitly, so submitters know whether any measurement could ever satisfy it?
We are not asking for a blanket exemption, and we are not asking to ship a cheaper draft as a trick. We are asking whether the rule's own stated harm, when it is directly measured and found to be below run-to-run variation, can close the check.
What happened
- #3697 was rejected on Check 13:
VLLM_ROCM_QUICK_REDUCE_QUANTIZATION: INT4quantizes the DSpark draft's all-reduce activations to INT4. - #3690 carries the same setting and is exposed to the same finding.
Why this is not draft-targeted precision hacking
Neither knob has draft/target granularity in the pinned image:
| Knob | What it is for | Why it hits the draft |
|---|---|---|
VLLM_ROCM_QUICK_REDUCE_QUANTIZATION=INT4 |
quantized codec for TP all-reduce | global; the draft's attention/MoE all-reduces take the same path once batches pass the size threshold |
VLLM_ROCM_USE_AITER_MOE_A4W4_DSV4=1 (vllm#58819) |
FP4 MoE activations on the target | global; on ROCm the DSpark draft reuses DeepseekV4DecoderLayer, so the draft's MoE becomes FP4 too |
There is no supported way to apply either to the target only. So Check 13 does not merely constrain how we serve the draft — it removes a legitimate target-side gain entirely.
Data
All acceptance length (AL) figures below come from the eval server logs (eval_server_logs_*), i.e. the lm-eval GSM8K run with chat template, real draft and real rejection sampling. No synthetic acceptance is involved; we verified no synthetic-acceptance setting is present in any of these runs. Warmup and drain samples (AL > 4.05, where the batch is nearly empty and acceptance is trivially high) are excluded; every steady-state sample is listed.
Acceptance length, DeepSeek-V4.1-Flash + DSpark (k=5), MI355X, a8w4 target
| Config | Runs | n | AL mean | sd | Δ vs baseline | Δ in baseline sd |
|---|---|---|---|---|---|---|
| Baseline — neither opt-in | 2 runs / 3 evals | 20 | 3.912 | 0.051 | — | — |
+ INT4 quick reduce |
2 | 17 | 3.891 | 0.041 | −0.021 (−0.55%) | 0.42× |
+ INT4 quick reduce + a4w4 |
1 | 6 | 3.893 | 0.062 | −0.019 (−0.48%) | 0.37× |
Per-run detail:
| Run | Config | Steady-state AL samples | mean |
|---|---|---|---|
| 36824408313 (#3571) | baseline | 3.83 3.98 3.91 3.92 3.93 3.98 3.93 3.92 3.82 | 3.913 |
| 37070984585 eval-1 | baseline | 3.95 3.94 3.94 3.85 | 3.920 |
| 37070984585 eval-2 | baseline | 3.84 3.98 3.93 3.96 3.92 3.87 3.84 | 3.906 |
| 37510490434 | INT4 QR | 3.84 3.93 3.89 3.93 3.88 3.80 3.93 | 3.886 |
| 37673698137 | INT4 QR | 3.83 3.95 3.93 3.90 3.93 3.91 3.86 3.90 3.86 3.87 | 3.894 |
| 37424787697 | INT4 QR + a4w4 | 3.93 3.90 3.91 3.86 3.78 3.98 | 3.893 |
Config attribution is taken from each run's own runtime Env: line, not from the recipe, so inherited settings are accounted for.
Two things we want to be precise about, rather than overstate:
- The AL delta is not zero. It is about −0.5%, in the direction the rule predicts. Our claim is only that it is smaller than baseline run-to-run variation (0.42× and 0.37× of the baseline sd, with baseline itself spanning 3.82–3.98 across 20 samples).
- Adding a4w4 on top of INT4 quick reduce does not compound the loss (3.891 → 3.893). If draft precision were the dominant term, stacking a second precision reduction on the draft's MoE should have shown up here.
GSM8K accuracy (5-shot, chat completions) — the baseline spread fully brackets the opt-in results:
| Config | strict / flexible |
|---|---|
| Baseline | 0.9712 / 0.9704, 0.9697 / 0.9689, 0.9757 / 0.9750 |
| INT4 QR | 0.9727 / 0.9719, 0.9719 / 0.9712 |
| INT4 QR + a4w4 | 0.9750 / 0.9742 |
We note that CONTRIBUTING.md is right that target-model evals do not measure this harm, and we are not resting the argument on GSM8K. We include it only to show there is no accuracy regression hiding behind the AL numbers.
On the rule's current wording
CONTRIBUTING.md says:
Matching an upstream recipe, passing evals, a claimed unchanged acceptance length (AL), or a newly measured AL curve does not exempt a submission that lowers draft precision. Synthetic AgentX acceptance is not evidence either way. Draft-precision changes shift the accuracy hit onto acceptance rate, which the target-model evals do not measure.
The stated harm is lost acceptance rate that evals do not measure. We agree with that mechanism. Our point is that acceptance rate is itself directly measurable, and the sentence excluding acceptance evidence names synthetic AgentX acceptance — which is indeed meaningless here. The numbers above are not synthetic: they are real-draft, real-rejection-sampling AL from the GSM8K eval harness, repeated across six evals and five sweeps.
As written, the clause covers both "a claimed unchanged AL" and "a newly measured AL curve", which makes the check unfalsifiable: there is no measurement a submitter could produce. If that is the intent, we would like it stated plainly, because it changes the rule from "do not degrade the draft" into "do not touch any global knob that reaches the draft", which is a much broader constraint and worth making explicit.
What we did upstream anyway
Because we accept the rule's intent, we implemented draft isolation in vLLM rather than arguing only on data:
vllm-project/vllm#59884 — "[Spec Decode][ROCm] Keep draft models at checkpoint precision under a4w4 and quantized quick reduce" (open, +178/−7)
It adds a draft_model_scope() applied once in initialize_model, covering construction, forward, and CUDA-graph capture on both model runners; FusedMoEConfig stops enabling a4w4 for draft MoE layers, and QuickAllReduce.should_quick_allreduce returns False inside a draft forward. Unit tests assert the gates (17 passed), and each gate's test fails when that gate is reverted.
We offer this as evidence of intent, and also as the reason for this issue. Using it to pass Check 13 means:
- it touches
vllm/config,vllm/distributed, and the MoE config — core paths, for a benchmark gate; - it is not merged, so it cannot be relied on; and
- even after it merges it must land in a pinned image before any submission can use it, since patching the pinned image is itself forbidden by the engine-patch rule.
So today the only compliant option is to drop a real target-side optimization, and the measured cost to the draft is below the noise floor of the metric the rule is protecting.
Suggested resolution
Any of these would unblock us; we have no preference beyond wanting the criteria written down:
- Admit real-workload AL from the GSM8K harness as Check 13 evidence when the precision change comes from a knob with no target-only option upstream, with a stated threshold (e.g. AL within 1% and within baseline run-to-run variation, across ≥2 independent sweeps).
- Keep Check 13 absolute, but say so explicitly — that no acceptance measurement can satisfy it — and confirm that the path forward is draft isolation landed in a pinned image.
- Confirm that once vllm#59884 is merged and present in a pinned image, enabling these two knobs with draft isolation active is compliant, and state how reviewers should verify the scope is in effect.
Happy to run additional AL measurements — more sweeps, an AL-vs-concurrency curve, or an A/B on a single node with the two knobs as the only variable — if that would make the determination easier.
AI assistance was used to gather the run data and draft this issue. The data above was extracted from CI artifacts of the linked runs and is reproducible from them.
Metadata
Metadata
Assignees
Labels
Type
Projects
- StatusShow more project fieldsDone
Activity
Fangzhou-Ai commentedon Oct 8, 2026
Short version
Position: a draft-precision change that is (a) a side effect of a process-wide upstream knob rather than a draft-targeted setting, and (b) measured on the real eval workload to cost less than run-to-run variation, should be acceptable under Check 13. Rewriting vLLM to isolate the draft purely so a benchmark gate passes is not our preferred solution.
What is actually happening.
VLLM_ROCM_QUICK_REDUCE_QUANTIZATION=INT4andVLLM_ROCM_USE_AITER_MOE_A4W4_DSV4=1are both global in the pinned image. On ROCm the DSpark draft reusesDeepseekV4DecoderLayer, so a target-side optimization unavoidably reaches the draft. Neither knob has a target-only form. We are not selecting a cheaper draft; we are unable to exclude it.The measurement. Acceptance length from the lm-eval GSM8K harness — real draft, real rejection sampling. This is not the synthetic AgentX acceptance that
CONTRIBUTING.mdexcludes; we verified no synthetic-acceptance setting is present in any of these runs.+ INT4 quick reduce+ INT4 quick reduce + a4w4Two points we want to keep honest: the delta is not zero (about −0.5%, in the direction the rule predicts), and our claim is only that it is smaller than the baseline's own run-to-run spread (3.82–3.98 across 20 samples). Separately, stacking a4w4 on top of quick reduce does not compound the loss (3.891 → 3.893) — if draft precision were the dominant term, a second precision reduction on the draft's MoE should have shown up.
GSM8K is unaffected, with the baseline spread fully bracketing the opt-in results (baseline 0.9697–0.9757 strict; opt-ins 0.9719–0.9750 strict). We are not resting the argument on GSM8K —
CONTRIBUTING.mdis right that target-model evals do not measure this harm — and include it only to show nothing is hiding behind the AL numbers.Why we would rather not fix this in vLLM. We already wrote the isolation patch, vllm-project/vllm#59884, so this is not reluctance to do the work. But relying on it to pass Check 13 means carrying a change that touches
vllm/configandvllm/distributed— core paths — for a benchmark gate; it is not merged, so it cannot be relied on; and even after it merges it must reach a pinned image before any submission may use it, since patching the pinned image is itself forbidden. Changing engine behavior to satisfy a scoring rule, rather than because it is the right engine design, is the part we want to avoid.Ask: admit measured real-workload AL as Check 13 evidence when the precision change comes from a knob with no target-only option upstream, with a stated threshold. If the check is meant to be absolute, please say so explicitly, since the current wording also excludes "a newly measured AL curve" and therefore leaves no measurement a submitter could ever produce.
中文
立场: 如果一次 draft 精度变化(a)是进程级上游开关的副作用,而非针对 draft 的设置,并且(b)在真实评测负载上实测的代价小于 run-to-run 波动,那么它应当被 Check 13 接受。仅仅为了通过评测门禁而去改写 vLLM 以隔离 draft,不是我们倾向的方案。
实际情况。
VLLM_ROCM_QUICK_REDUCE_QUANTIZATION=INT4与VLLM_ROCM_USE_AITER_MOE_A4W4_DSV4=1在 pinned image 中都是全局生效的。在 ROCm 上 DSpark draft 复用DeepseekV4DecoderLayer,因此一项面向 target 的优化不可避免地会波及 draft。这两个开关都没有仅作用于 target 的形式。我们并不是在挑一个更廉价的 draft,而是无法把它排除在外。测量方式。 接受长度(AL)取自 lm-eval GSM8K 评测——真实 draft、真实 rejection sampling。这不是
CONTRIBUTING.md所排除的 synthetic AgentX acceptance;我们已核实这些运行中不存在任何 synthetic acceptance 设置。+ INT4 quick reduce+ INT4 quick reduce + a4w4有两点我们希望如实说明:该差值并非为零(约 −0.5%,方向与规则的预期一致),我们的主张仅仅是它小于基线自身的 run-to-run 波动(20 个样本跨越 3.82–3.98)。另外,在 quick reduce 之上再叠加 a4w4 并未使损失累积(3.891 → 3.893)——若 draft 精度确为主导项,在 draft 的 MoE 上再加一层降精度本应显现出来。
GSM8K 未受影响,基线区间完全覆盖了启用开关后的结果(基线 strict 0.9697–0.9757;启用后 strict 0.9719–0.9750)。我们并不以 GSM8K 作为论据支点——
CONTRIBUTING.md指出 target 模型评测无法衡量这类损害,这是正确的——列出它只是为了表明 AL 数据背后没有被掩盖的问题。为何我们不倾向于在 vLLM 侧解决。 隔离补丁我们已经写好了,即 vllm-project/vllm#59884,所以这并非不愿投入工作。但若要依靠它来通过 Check 13,就意味着为了一个评测门禁而携带一项改动
vllm/config与vllm/distributed等核心路径的变更;它尚未合并,因此无法作为依靠;而且即便合并,也必须先进入 pinned image 才能被任何提交使用,因为给 pinned image 打补丁本身就是被禁止的。为满足评分规则而改变引擎行为、而非因为那才是正确的引擎设计——这正是我们想要避免的部分。诉求: 当精度变化源自上游没有 target-only 选项的开关时,请接受实测的真实负载 AL 作为 Check 13 的证据,并给出明确阈值。如果该检查本意就是绝对不可破的,也请明确写出来——现有措辞连"a newly measured AL curve"一并排除,这意味着提交方不存在任何可以提供的测量结果。