Équivalence numérique
Des backends différents ne s'accordent jamais bit à bit ; l'essaim traite la tolérance mesurée comme un contrat de premier ordre.
CUDA, ROCm, Adreno et les CPU calculent la même opération avec des ordres de réduction, des fusions FMA, des accumulateurs et des approximations de fonctions transcendantes différents — les résultats diffèrent de ~1e-6…1e-3 par opération, par conception, jamais à l'identique au bit près. Un essaim fait du matériel qui se présente ne peut exiger l'exactitude binaire, alors Kvasir mesure l'équivalence à la place.
| Paire de backends (122B réel, experts layer-0) | max|Δ| | cosine |
|---|---|---|
| CUDA (GB10 Blackwell) vs ROCm (MI250) | 3.5e-10 | 1.0000000000 |
| ROCm (MI250) vs numpy (x86) | 7.9e-7 | 0.99996 |
| ARM CPU de téléphone vs numpy (x86) | 1.4e-6 | 0.99992 |
| CUDA (GB10 Blackwell) vs Grace ARM CPU | 2.6e-5 | 0.99975 |
La matrice complète de backends est close : les deux backends GPU (CUDA, ROCm) partagent leurs sources de kernel et atterrissent effectivement bit-identiques (cosine 1.0000000000), tandis que les paires GPU↔CPU restent équivalentes à ~0.9997. Un worker CUDA et un worker ROCm sont interchangeables ; un worker GPU et un worker CPU sont numériquement équivalents.
L'addition en virgule flottante n'est pas associative
- Ordre de réduction du matmul — tensor cores, tuiles MFMA, workgroups OpenCL et lanes SIMD accumulent dans des ordres différents.
- Précision d'accumulation — stockage F16/BF16 avec accumulateurs F32 ou F16 : le plus grand levier de la divergence.
- Approximations transcendantes — exp (softmax), silu (swiglu) et rsqrt (norms) utilisent des variantes polynomiales/tabulées différentes selon le backend.
Tolérances, capacités, autorité unique
- La vérification est une tolérance — « accord top-1 ≥ 99.x %, KL ≤ ε » — jamais une égalité binaire.
- Les backends et la précision d'accumulation sont annoncés comme des capacités du nœud ; les nœuds accumulant en F32 sont préférés pour les rangs sensibles à la sortie.
- Les nœuds hors tolérance sont marqués inaptes pour les rangs sensibles, pas rejetés en bloc.
- Les décisions discrètes (routage, échantillonnage) sont épinglées à des autorités uniques pour que l'erreur continue ne puisse jamais devenir divergence discrète.