Le même modèle, exécuté sur un portable, sur un serveur et sur un microcontrôleur émulé, rend les mêmes mots octet pour octet. Pas « proche ». Identique à un calcul en simple précision. Pour un produit qui doit être certifié ou formellement revu, cela transforme « le modèle déployé se comporte comme celui qui a été validé » en un test qui passe ou échoue.
Les trois environnements
| Étape | Ce que c'est |
|---|---|
| Python · PyTorch | La passe avant de référence. C'est ce que votre data scientist a validé. |
| C99 · sans tas | Le moteur d'inférence. Pas d'allocateur, pas d'appel système. C'est ce qui est livré. |
| Cortex-M3 · QEMU MPS2-AN385 | L'ELF compilé s'exécutant réellement sur un cœur émulé. |
| Vérification | Résultat |
|---|---|
| Max |Δ| sur les trois étapes | 3.7e-7 |
| Parité multi-jetons, modèle 60K | 48 / 48 exacts |
| Parité multi-jetons, modèle 944K | 16 / 16 exacts |
| Suite de tests à HEAD | 146 / 146 au vert |
Pourquoi c'est le test multi-jetons qui compte
Un test de parité sur une seule passe avant est facile à réussir et facile à tromper. La génération est auto-régressive : la sortie du modèle devient son entrée suivante, si bien qu'un écart à la septième décimale au jeton 1 peut devenir un mot différent au jeton 40. La parité multi-jetons exécute toute la boucle de génération dans les deux environnements et compare les séquences émises.
La même discipline sur la ligne EDGE
- Le vrai moteur C99 évalué sur l'ensemble des 2 947 fenêtres de test, pas un échantillon : 0,9206 de précision, 99,19 % d'accord avec le modèle flottant Python.
- L'export ternaire-32 : 2947/2947 fenêtres identiques entre le vrai moteur C et la référence — parité exacte, pas un accord statistique.
- Le chemin en flux : décisions bit à bit identiques au recalcul complet sur chaque fenêtre.
Ce que vaut une affirmation de parité non exécutée
Un export antérieur portait la mention « parité : C == torch-static (par construction) ». Le raisonnement était juste et le moteur C n'avait jamais été exécuté sur le jeu de test. Quand il l'a enfin été, il a révélé un débordement de tampon : trois tableaux figés à 24 canaux alors que le nombre de canaux était lu à l'exécution, sans contrôle de bornes. Sur un appareil, c'est une corruption mémoire silencieuse, pas une mauvaise réponse. Cela a duré quatre semaines derrière une phrase qui sonnait comme une mesure.
C'est pourquoi les chiffres de cette page nomment le fichier de test qui les produit. « Par construction » est une hypothèse ; un test vert sur l'artefact réel est un résultat.
Ce qui n'est pas prouvé ici
- Le temps sur silicium. QEMU prouve l'arithmétique, pas l'horloge.
- Cortex-M33. La compilation ARMv8-M faute sous les deux émulateurs.
- L'énergie. Jamais mesurée sur matériel.