Scrub check
I have removed hostnames, IPs, absolute paths, usernames, tokens and keys from anything pasted below.
What broke
We nearly rejected a checkpoint for being irreproducible. It was the launch flags, and pinning them cost nothing.
This is offered as an extension to trap 35 (identical weights do not give identical scores), which documents the symptom well and stops short of a remedy. On this stack there is one, it is two flags, and it is free on both quality and speed. That seems worth having beside the symptom.
What you saw
Teacher-forced likelihood scoring of a 43-text corpus, same model, same weights, same serve command, across cold reloads:
stock flags 23 of 43 texts moved between two loads, max |delta NLL| 8.81
perplexity 3.48822 (load 1) vs 3.471547 (load 2)
That is a checkpoint that looks unusable for any temperature-0 comparison, and it is exactly the size of effect that would manufacture or erase a published result. Our first reading was "this checkpoint is not reproducible, prefer the sibling".
What fixed it
Two launch flags:
--enable-deterministic-inference --disable-flashinfer-autotune
Re-measured under the same protocol, quiet box, conditions recorded per cell:
pinned flags 0 of 43 texts moved, max |delta NLL| 0.0000
perplexity 3.473925 on BOTH loads, bit-identical
decode 45.45 tok/s vs stock 45.34 tok/s (within noise)
perplexity sits inside the stock band, so no quality cost
Speed protocol for those decode figures: 3 prompt kinds by 3 repeats, 512 output tokens each, single stream, batch 1, context 131072, idle box.
Three things follow, and the second one is the one we would have got wrong:
- Before attributing temperature-0 irreproducibility to a MODEL, test the same model with determinism pinning. The unpinned wobble comes from per-load kernel and autotune choices, not from the weights.
- A pinned serve is its own fixed point. It is not yesterday's stock behaviour frozen, it is one arbitrary variant frozen. Turning pinning on is a one-time behaviour transition and should be planned like a model switch, not slipped in.
- It did not transfer to a different model on a different engine in our estate: a large MoE on vLLM has a DIFFERENT signature (texts moving WITHIN a single load, not only across loads), so do not assume these flags tame that. Untested, stated as untested.
What were you serving
- Engine: SGLang, build
0.0.0.dev1+g5f55db35e, image lmsysorg/sglang:dev-cu13-qwen38-27b-dflash2
- Model:
RadixArk/Qwen3.8-27B-NVFP4, NVFP4, context length 131072, --mem-fraction-static 0.80, --kv-cache-dtype fp8_e4m3, --attention-backend flashinfer
- Hardware: NVIDIA GB10 Grace Blackwell, 128 GB unified, Ubuntu 24.04, aarch64
- Protocol: pre-registered before the run, quiet box, one model loaded at a time, conditions recorded per cell
Optional diagnostic evidence
Per-text sum_nll for all 43 texts on all 4 loads (stock x2, pinned x2) plus the two speed files are retained as score-stock-load{1,2}.json, score-pinned-load{1,2}.json, speed-stock.json, speed-pinned.json. The moved-text counts above are re-derivable from those files by comparing sum_nll per tag between the two loads of each arm. Happy to share the raw rows.
I am happy for this data and the credit to be published. Credit as @scottleimroth.
Scrub check
I have removed hostnames, IPs, absolute paths, usernames, tokens and keys from anything pasted below.
What broke
We nearly rejected a checkpoint for being irreproducible. It was the launch flags, and pinning them cost nothing.
This is offered as an extension to trap 35 (identical weights do not give identical scores), which documents the symptom well and stops short of a remedy. On this stack there is one, it is two flags, and it is free on both quality and speed. That seems worth having beside the symptom.
What you saw
Teacher-forced likelihood scoring of a 43-text corpus, same model, same weights, same serve command, across cold reloads:
That is a checkpoint that looks unusable for any temperature-0 comparison, and it is exactly the size of effect that would manufacture or erase a published result. Our first reading was "this checkpoint is not reproducible, prefer the sibling".
What fixed it
Two launch flags:
Re-measured under the same protocol, quiet box, conditions recorded per cell:
Speed protocol for those decode figures: 3 prompt kinds by 3 repeats, 512 output tokens each, single stream, batch 1, context 131072, idle box.
Three things follow, and the second one is the one we would have got wrong:
What were you serving
0.0.0.dev1+g5f55db35e, imagelmsysorg/sglang:dev-cu13-qwen38-27b-dflash2RadixArk/Qwen3.8-27B-NVFP4, NVFP4, context length 131072,--mem-fraction-static 0.80,--kv-cache-dtype fp8_e4m3,--attention-backend flashinferOptional diagnostic evidence
Per-text
sum_nllfor all 43 texts on all 4 loads (stock x2, pinned x2) plus the two speed files are retained asscore-stock-load{1,2}.json,score-pinned-load{1,2}.json,speed-stock.json,speed-pinned.json. The moved-text counts above are re-derivable from those files by comparingsum_nllpertagbetween the two loads of each arm. Happy to share the raw rows.I am happy for this data and the credit to be published. Credit as @scottleimroth.