Équivalence numérique entre backends hétérogènes
CUDA, ROCm, Adreno et les CPU ne s'accorderont jamais bit à bit. Que l'essaim produise malgré tout un modèle cohérent est une propriété conçue, pas de la chance.
Exact vs équivalent — deux propriétés différentes
- Au sein d'un backend — exact (3.6e-12) : répartir les experts entre nœuds puis combiner, c'est la même somme pondérée regroupée ; la seule différence est l'ordre d'accumulation flottante. Vérifié par oracle.
- Entre backends — équivalent (1e-3…1e-6) : la même opération sur des matériels différents porte une erreur relative par op d'environ 1e-3–1e-6, jamais nulle. L'essaim vit dans ce régime.
« Exact », c'est ce que la décomposition garantit dans un seul appareil. « Équivalent », c'est ce que donne le matériel hétérogène. Le travail de l'essaim est d'empêcher l'équivalence de se composer en divergence.
Pas une théorie — mesuré sur le matériel
Le même FFN d'experts de layer-0 de Qwen3.5-122B, calculé par linkcpp-expert-worker sur un MI250 (ROCm), l'ARM CPU d'un téléphone (SM-S938N) et une référence numpy x86 — mêmes entrées, mêmes poids, jeux d'instructions et ordres de réduction différents :

| Paire de backends | max|Δ| | cosine |
|---|---|---|
| ROCm (GPU) vs numpy (x86) | 7.9e-7 | 0.99996 |
| ARM CPU téléphone vs numpy (x86) | 1.4e-6 | 0.99992 |
| GPU ROCm vs ARM CPU téléphone | 1.5e-6 | 0.99990 |
Trois jeux d'instructions, un seul calcul — chaque paire équivalente (cosine ≈ 0.9999), aucune paire bit-identique (Δ ≈ 1e-6). Les résidus sont petits parce que l'autorité du routeur a épinglé les entrées et la sélection d'experts.
Une exécution ultérieure sur du vrai matériel NVIDIA GB10 Grace Blackwell a clos la matrice sur le dernier backend : CUDA ↔ ROCm a atteint cosine 1.0000000000 (max abs 3.5e-10, effectivement bit-identique, puisque les deux backends GPU partagent leurs sources de kernel), et CUDA ↔ Grace ARM CPU cosine 0.99975 — le même motif GPU↔CPU vu ci-dessus.
L'addition flottante n'est pas associative
- Ordre de réduction du matmul — tensor cores, tuiles MFMA, workgroups OpenCL et lanes SIMD accumulent chacun dans des ordres et pavages différents.
- Fusion FMA —
a*b+carrondi une fois (FMA) ou deux, fusionné différemment selon le backend. - Précision d'accumulation — stockage F16/BF16 avec accumulateurs F32 vs F16 (le plus grand levier de divergence).
- Approximations transcendantes — variantes polynomiales/tabulées d'exp (softmax), silu/sigmoid (swiglu), rsqrt (norms).
- Voie dequant + matmul — déquantifier-puis-multiplier vs kernels quantifiés fusionnés arrondissent les intermédiaires différemment.
- Kernels non déterministes — les réductions atomic/split-K peuvent varier d'une exécution à l'autre sur le même appareil.
Rien de tout cela n'est un bug. C'est le prix que paie la voie rapide de chaque accélérateur.
Une autorité pour les décisions, assez de précision pour l'accumulation
AUTORITÉ DU ROUTEUR — l'invariant central. La seule décision discrète du réseau est le routage MoE (top-8 sur 256). Si chaque backend rejouait le routeur, les tokens limites choisiraient des experts différents et divergeraient pour de bon. Kvasir exécute le routeur une fois, sur le backbone, et n'envoie aux workers que les ids des experts choisis. Un essaim hétérogène peut différer dans la *grandeur* de la sortie de chaque expert — jamais dans *quels experts tournent*. Cela convertit une divergence discrète catastrophique en erreur continue bornée : c'est la règle de cohérence du sharding hétérogène d'experts.
- Argmax discret : décoder, c'est un argmax sur les logits. Un frémissement de 1e-3 ne bascule un token que lorsque deux candidats sont à moins de 1e-3 — à la plupart des positions la marge est bien plus grande, donc les tokens sortent identiques ; les rares bascules sont des positions aussi ambiguës qu'une autre graine.
- Le combine est une addition : les résultats partiels fusionnent en somme pondérée par probabilité. Des erreurs indépendantes d'environ 1e-4 s'ajoutent de façon incohérente — elles croissent en √k, pas en k — et sans annulation de grandes valeurs, le résidu reste bien conditionné.
Modes de divergence et défenses
| Mode de divergence | Mécanisme | Règle |
|---|---|---|
| Désaccord de routage | Les backends choisissent des top-8 différents pour les tokens limites | Autorité du routeur — décidé une fois sur le backbone, ids expédiés |
| Bifurcation de trajectoire | Le frémissement des logits finit par basculer un token ; la séquence bifurque comme une nouvelle graine | Décodage/échantillonnage épinglés à un nœud |
| Accumulation en profondeur | 49 couches × ~1e-4 chacune → jusqu'à 1e-2 sur les logits finaux | Accumulation F32 aux frontières et au combine |
| Auto-non-déterminisme | Les kernels atomic/split-K varient d'une exécution à l'autre | Kernels de combine déterministes ; la vérification utilise des tolérances |
| Désaccord de précision | Un nœud accumule en F16, un autre en F32 | Précision d'accumulation annoncée comme capacité ; nœuds F32 préférés pour les rangs de sortie |
Le protocole de mesure
- Delta par op — mêmes entrées, erreur relative A vs B sur matmul, swiglu, softmax, norm.
- Dérive à la frontière de couche — delta du résiduel après une couche, empilé pour voir si la profondeur accumule en √L ou en L.
- Divergence des logits de bout en bout — L∞, L2 et divergence KL sur le forward complet.
- Accord des décisions — accord top-1 des tokens plus accord top-8 du routage (validant la nécessité de l'autorité du routeur).
- Stabilité de génération — N tokens greedy ; le premier indice où A et B divergent.
- Niveau tâche — deltas de perplexité et de scores d'éval : la seule métrique que l'utilisateur ressent.
Une réussite est une tolérance — « accord top-1 ≥ 99.x %, KL ≤ ε ». Un nœud hors tolérance est marqué inapte aux rangs sensibles, pas rejeté d'office.
L'accord au bit près est impossible — et inutile
Un cluster homogène peut supposer l'exactitude au bit ; un essaim non — sa prémisse est *le matériel qui se présente*. Kvasir traite donc l'équivalence numérique exactement comme la compatibilité de protocole : un contrat de premier ordre, mesuré. Backends et précision d'accumulation sont annoncés comme capacités de nœud, l'autorité du routeur est imposée comme invariant, et chaque vérification utilise des tolérances plutôt que l'égalité de bits. Équivalence numérique mesurée + décisions discrètes à autorité unique — voilà ce qui permet à un modèle de tourner sur chaque GPU de la planète à la fois. Voilà l'essaim.