What was measured, and where
Two hosts, same golden, same oracle revision 29f2d1746d8f41e316523194b19018707749b1b1, same mode=decode. n=1 per arm.
| host |
arch |
mamba arm |
fa2 |
cutlass-fp8 |
A3 |
exit |
thor:gpu0 |
sm_110 |
HOST (VT_NEMOTRON_H_DEVICE_MAMBA=0) |
DISABLED |
DISABLED |
93/96 DIVERGENCE |
1 |
thor:gpu0 |
sm_110 |
DEVICE FP8 W8A8 (A2-Q1, default) |
DISABLED |
DISABLED |
96/96 STRICT PASS |
0 |
dgx:gpu0 |
sm_121a |
HOST (no device arm existed then) |
ENABLED |
ENABLED |
96/96 STRICT PASS |
0 |
The earlier phrasing of this issue said the host arm is what main does "on a GPU today" and therefore that main is token-wrong on GPU. That is established for sm_110 ONLY, and GB10 is a direct counter-measurement. The correction matters: read the other way, someone checks on GB10, gets 96/96, and dismisses a real silicon-specific defect.
What IS established
On one box, holding the entire rest of the tower constant, flipping only the mamba arm moves 93/96 to 96/96. Same binary, same session, same checkpoint. So on Thor the mamba arm is implicated; the attention, MoE and norm kernels are common to both Thor runs and cannot account for the difference between them.
The leading mechanism, and the hole in it
The golden comes from an oracle that computes these projections W8A8. The host arm is W8A16 by construction — DenseBf16 states at nemotron_h.cpp:419-422 that input_scale is carried, not applied, and nothing on the host path quantizes the activation. So the host arm is a deliberate approximation of the arithmetic the golden was generated with.
That explains why an unapplied input_scale would bite. It does not yet explain why GB10 does not show it. The obvious reading is that the approximation is marginal rather than grossly wrong: it perturbs the residual stream, and whether that perturbation crosses a decision boundary depends on the rest of the tower's numerics, which differ by arch.
Correcting one candidate before it is chased
"The two arms resolve different fp8 GEMMs" was proposed as the differentiator. It cannot be, within the OFF configuration: that configuration runs no fp8 GEMM on either box. Linear(..., const NemotronHOwned&) reaches DenseFor (nemotron_h.cpp:238), which calls DenseBf16() and hands the result to vt::MatmulBT on the CPU queue (nemotron_h_device.cpp:2027 resolves hq to the host queue). It is a host bf16 GEMM on both boxes, and cutlass-fp8 is not on that path.
What genuinely differs on the device between the two boxes is the rest of the tower, and the checkable one is attention: cmake/CudaArchFeatures.cmake:349 provides fa2 for 8.0,8.6,8.7,8.9,12.0a,12.1a. 12.1a is in that list and 11.0 is not, so GB10 runs vendored FlashAttention-2 over the 6 GQA layers where Thor runs the portable fallback. Different attention arithmetic feeding the same marginal mamba perturbation is a mechanism that predicts a token flipping on one box and not the other.
Next traceable step, in order
- Ask the oracle's top-2 margin at the three tokens that moved, before calling this a defect. This repository has already had a "divergence" on this family turn out to be a bit-exact near-tie. If those tokens are near-ties, the host arm is a near-tie sensitivity rather than a wrong answer, and A2-Q1 is the right fix for a stronger reason than "it passed".
- Bisect which layer diverges, via
NemotronHTrace, on Thor with the arm off.
- Re-run both arms on both boxes to lift
n=1.
Status
Not closed by measurement. A2-Q1 (#1289) makes the Thor gate read 96/96, and it does so by running the arithmetic the golden was generated with rather than an approximation of it — which is the right change independent of how this issue resolves. Whether anything was wrong on GB10 is an open question that this issue owns.
What was measured, and where
Two hosts, same golden, same oracle revision
29f2d1746d8f41e316523194b19018707749b1b1, samemode=decode. n=1 per arm.fa2cutlass-fp8thor:gpu0sm_110VT_NEMOTRON_H_DEVICE_MAMBA=0)93/96DIVERGENCEthor:gpu0sm_11096/96STRICT PASSdgx:gpu0sm_121a96/96STRICT PASS/workspace/a2q1-thor/20260818T222352Z/a3_{off,on}.log.reference-tier lines: 0on both, so neither took the portable CPU tier./usr/local/nas_share/rc/nh1157/gate_fixed.out.The earlier phrasing of this issue said the host arm is what
maindoes "on a GPU today" and therefore thatmainis token-wrong on GPU. That is established forsm_110ONLY, and GB10 is a direct counter-measurement. The correction matters: read the other way, someone checks on GB10, gets96/96, and dismisses a real silicon-specific defect.What IS established
On one box, holding the entire rest of the tower constant, flipping only the mamba arm moves
93/96to96/96. Same binary, same session, same checkpoint. So on Thor the mamba arm is implicated; the attention, MoE and norm kernels are common to both Thor runs and cannot account for the difference between them.The leading mechanism, and the hole in it
The golden comes from an oracle that computes these projections W8A8. The host arm is W8A16 by construction —
DenseBf16states atnemotron_h.cpp:419-422thatinput_scaleis carried, not applied, and nothing on the host path quantizes the activation. So the host arm is a deliberate approximation of the arithmetic the golden was generated with.That explains why an unapplied
input_scalewould bite. It does not yet explain why GB10 does not show it. The obvious reading is that the approximation is marginal rather than grossly wrong: it perturbs the residual stream, and whether that perturbation crosses a decision boundary depends on the rest of the tower's numerics, which differ by arch.Correcting one candidate before it is chased
"The two arms resolve different fp8 GEMMs" was proposed as the differentiator. It cannot be, within the OFF configuration: that configuration runs no fp8 GEMM on either box.
Linear(..., const NemotronHOwned&)reachesDenseFor(nemotron_h.cpp:238), which callsDenseBf16()and hands the result tovt::MatmulBTon the CPU queue (nemotron_h_device.cpp:2027resolveshqto the host queue). It is a host bf16 GEMM on both boxes, andcutlass-fp8is not on that path.What genuinely differs on the device between the two boxes is the rest of the tower, and the checkable one is attention:
cmake/CudaArchFeatures.cmake:349providesfa2for8.0,8.6,8.7,8.9,12.0a,12.1a.12.1ais in that list and11.0is not, so GB10 runs vendored FlashAttention-2 over the 6 GQA layers where Thor runs the portable fallback. Different attention arithmetic feeding the same marginal mamba perturbation is a mechanism that predicts a token flipping on one box and not the other.Next traceable step, in order
NemotronHTrace, on Thor with the arm off.n=1.Status
Not closed by measurement. A2-Q1 (#1289) makes the Thor gate read
96/96, and it does so by running the arithmetic the golden was generated with rather than an approximation of it — which is the right change independent of how this issue resolves. Whether anything was wrong on GB10 is an open question that this issue owns.