Skip to content

NemotronH: the HOST mamba arm reads 93/96 on Thor sm_110 and 96/96 on GB10 sm_121a, against the same golden #1290

Description

@localai-bot

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

  1. 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".
  2. Bisect which layer diverges, via NemotronHTrace, on Thor with the arm off.
  3. 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.

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't working

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions