FP8
Découvre ce qu’est FP8, comment fonctionnent E4M3 et E5M2, et comment la mise à l’échelle, la prise en charge matérielle et la précision mixte améliorent l’entraînement et l’inférence de l’IA.
FP8, ou virgule flottante sur 8 bits, est un format numérique à faible précision qui stocke chaque valeur sur huit bits. Les systèmes d’IA utilisent FP8 pour réduire le trafic mémoire et accélérer les multiplications matricielles, les convolutions et autres opérations coûteuses sur le matériel compatible. Comparé à FP16 ou FP32, il représente moins de valeurs distinctes ; les workflows FP8 efficaces combinent donc un calcul rapide en faible précision avec une mise à l’échelle et certaines opérations en précision supérieure afin de préserver la qualité du modèle.
Comment FP8 représente les nombres#
Une valeur en virgule flottante contient un signe, un exposant qui contrôle la plage et une mantisse qui contrôle le niveau de détail. FP8 se présente généralement sous deux formats documentés par les types de données en virgule flottante de PyTorch :
- E4M3 : Un bit de signe, quatre bits d’exposant et trois bits de mantisse. Il offre davantage de détails numériques, mais une plage plus étroite.
- E5M2 : Un bit de signe, cinq bits d’exposant et deux bits de mantisse. Il couvre une plage plus large, mais arrondit les valeurs de manière plus agressive.
E4M3 convient souvent aux poids et aux activations, tandis que E5M2 peut mieux gérer les gradients présentant de grandes plages de valeurs. Les variantes exactes diffèrent selon les plateformes, comme l’indique la documentation AMD sur la virgule flottante en faible précision ; un modèle FP8 n’est donc pas automatiquement portable entre tous les accélérateurs et environnements d’exécution.
Comme huit bits ne peuvent pas représenter toute la plage et tous les détails d’origine d’un tenseur, les frameworks multiplient généralement les valeurs par un facteur d’échelle avant la conversion. Le guide introductif de NVIDIA sur la mise à l’échelle FP8 décrit des stratégies telles que la mise à l’échelle différée, qui déduit les échelles futures à partir des valeurs maximales observées précédemment. La mise à l’échelle limite les dépassements de capacité, les valeurs trop faibles et la saturation sans exiger que chaque opération s’exécute en précision supérieure.
FP8 et formats associés#
FP8 occupe une position intermédiaire parmi les types de données courants en IA :
- FP16 ou précision demi-mot : Utilise deux fois plus de bits, offrant davantage de détails numériques et un entraînement généralement plus simple. FP8 peut réduire davantage le stockage et la bande passante, mais nécessite une mise à l’échelle plus rigoureuse.
- BF16 : Conserve une large plage d’exposants tout en fournissant moins de détails fractionnaires que FP16. Il est souvent utilisé comme format compagnon en précision supérieure lors de l’entraînement en FP8.
- INT8 : Représente des entiers plutôt que des valeurs en virgule flottante. La quantification des modèles en INT8 repose généralement sur des échelles pour mapper les valeurs réelles vers des niveaux entiers fixes, tandis que FP8 conserve un exposant permettant un espacement naturellement non uniforme.
- FP4 : N’utilise que quatre bits et peut fournir une compression supérieure, mais sa plage et sa granularité extrêmement limitées rendent généralement la préservation de la précision plus difficile.
FP8 fait souvent partie d’un workflow en précision mixte plutôt que d’être le type de données de chaque tenseur. L’accumulation, la normalisation, l’état de l’optimiseur ou les couches sensibles peuvent rester en BF16, FP16 ou FP32. Par ailleurs, la précision numérique diffère de la métrique d’évaluation de la précision, qui mesure combien de prédictions positives du modèle sont correctes.
Applications concrètes#
Deux applications pratiques illustrent l’intérêt de FP8 :
-
Entraînement de grands modèles : L’entraînement des Transformer effectue de manière répétée de grandes multiplications matricielles. Un framework compatible avec FP8 peut convertir les poids et activations admissibles en FP8 tout en conservant une précision supérieure là où la stabilité l’exige. Cela réduit les besoins en bande passante et peut augmenter le débit d’entraînement. Le workflow d’entraînement quantifié de TorchAO inclut des options de mise à l’échelle par tenseur et par ligne, qui permettent de choisir entre une vitesse maximale et une meilleure gestion des valeurs aberrantes.
-
Inférence de vision à haut débit : Un centre de données peut exécuter la détection d’objets sur des centaines de flux vidéo issus du commerce, de la circulation ou de sites industriels. Les noyaux compatibles avec FP8 peuvent réduire le temps et la mémoire utilisés par les couches admissibles du modèle, ce qui peut diminuer la latence d’inférence et augmenter la capacité de flux simultanés. Le guide des types quantifiés de TensorRT explique comment les opérations explicites de quantification et de déquantification décrivent l’exécution en FP8.
Risques numériques et prise en charge matérielle#
Une mise à l’échelle inadéquate peut provoquer la saturation des grandes valeurs et l’arrondissement des petites valeurs à zéro. Les valeurs aberrantes sont particulièrement problématiques lorsqu’une seule échelle couvre tout un tenseur. Ces effets peuvent modifier les scores de confiance, déstabiliser l’entraînement ou réduire la précision de détection ; tu dois donc valider le modèle converti par rapport à sa référence en précision supérieure.
La prise en charge matérielle native est tout aussi importante. L’architecture NVIDIA Hopper a introduit l’accélération FP8 des Tensor Core, tandis que l’ancien GPU NVIDIA A100 prend en charge FP16, BF16 et INT8, mais pas le calcul FP8 natif. Tu dois donc consulter la matrice de prise en charge matérielle de TensorRT avant de choisir une précision de déploiement.
Utiliser FP8 en pratique#
Ce petit exemple PyTorch illustre la conversion E4M3 et l’erreur d’arrondi produite lorsque les valeurs FP8 sont reconverties en FP32 :
import torch
values = torch.tensor([0.1, 1.0, 3.14, 100.0], dtype=torch.float32)
# Convert to E4M3 FP8, then restore the values for comparison.
fp8_values = values.to(torch.float8_e4m3fn)
restored = fp8_values.to(torch.float32)
absolute_error = (restored - values).abs()
print(torch.stack((values, restored, absolute_error), dim=1))Le workflow documenté d’export Ultralytics vers TensorRT fournit des options FP16 et INT8 calibrées pour Ultralytics YOLO, plutôt qu’un export FP8 en un seul argument. Le déploiement FP8 nécessite donc une chaîne d’outils de conversion en aval compatible. Quelle que soit la précision sélectionnée, utilise le mode benchmark d’Ultralytics sur le GPU cible pour comparer la latence, le débit, l’utilisation mémoire et la précision de la tâche avant le déploiement en production.






