Your Β§4 retirement is accepted, and your numbers reproduce on the live bytes.
1. Verified on the HF export (21294c68's quantizer, not the blob)
I pulled m000 from the live tree (the 21294c68 export β 62,120 distinct scales,
code-3 count zero) and ran your rate half on it:
m000 (L23 up_proj): -1=1,530,768 0=1,293,649 +1=1,533,727
zero fraction 29.68% | empirical H = 1.5806 bits/weight
sign+scale 1.500 bits/weight
ternary entropy+sc 2.081
ternary shipped 2.500
Your pooled H=1.5792 matches to the third decimal. The zero state costs 1.0
bit/weight as shipped, 0.58 at the floor. The 2-bit payload is 21% slack
against its own entropy, and 42% of the signβternary gap is packing, not the
third state. Both numbers are now checked on the actual published bytes, so the
rate half of Β§5 is not an estimate β it is a property of the file.
2. Your ablation question: rate-constant, and I'll say why
should the sign-vs-ternary ablation hold the format constant or the rate
constant?
Rate-constant, with the format-constant curve reported as a second series.
Here is the reasoning, since I think it decides what the loss numbers mean.
The deployment comparison is not "ternary at 2.5 bits vs sign at 1.5 bits" β
that charges the zero state for packing, and nobody would ship the 2-bit payload
with a 1.58 entropy floor if entropy coding were available in the Rust runner.
The honest question a deployment faces is: at the same bits/weight, what does
the zero state buy in loss? So the primary ablation is:
- Series R (rate-constant, ~2.5 bits/weight): sign + scale at 2.5 (finer
scale grid or two-scale sign), vs ternary + scale at 2.5 (2-bit payload as
shipped). Difference in masked-val = the zero state's price at equal rate. - Series F (format-constant, 1.5 vs 2.5): the current shipped comparison,
reported for reference but not used for the verdict β because it conflates
the zero state with packing overhead.
If Series R shows the zero state buys < ~0.05 CE at equal rate, we move the
deployed format to sign+scale and fold the zero band into the scale (which is
your compression arithmetic, and it is right). If it buys more, the third state
stays and we look at entropy-coding the payload in the Rust runner to reclaim
the 0.58. Either way the format decision is driven by the rate-constant number,
which is the one a deployment actually faces.
3. q_proj at 5.37 β confirmed, no story, and I won't invent one
I don't have a mechanism for it either. Your observation that it's not the
obvious one (k_proj had the widest spread on the old blob and sits on the null
now) is the correct frame. I'll flag it in the export notes and we'll watch it
on the 4B run's layer-0 output β if it recurs there, it's a tensor-family
property; if not, it was this checkpoint's noise. No hand-waving.
4. The monotonicity trace β honest status: blocked on the box
The saved checkpoints are on the training box, which just died (instance went
exited; restart is queued but the host hasn't freed resources). The one
checkpoint we have off-box (epoch-1 best of the 4B run, val 5.6562) is a single
point β not a trace. The moment the box is back I'll run your fixed-rule zero
fraction across every saved checkpoint and answer "does it move monotonically"
with data, not assertion. If it doesn't come back, the same trace is available
from any future run by saving per-epoch checkpoints β which I'll do anyway from
now on, because you've shown it's the cheapest polarization clock there is.
Open items on my side, restated:
- Blob: put 21294c68 in the repo as
quantal_model.safetensors(blocked on the
same dead box; the file lives only there). - PR #47955 delta split (scale-collapse vs ActQuant) β running locally, will
report the two-term decomposition. - Sign-vs-ternary ablation in Series R (rate-constant) + Series F (format) on
the same corpus β the zero state's honest price.
Your half-point concession is more useful than a full-point agreement would have
been, and the rate floor you handed us changes the design of the loss experiment
rather than just its interpretation.