Skip to content

[trap] Reload-to-reload score drift was autotune, not the checkpoint: two flags fix it at zero cost (extends trap 35) #73

Description

@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:

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:

  1. 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.
  2. 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.
  3. 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.

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions