L'intuition clé : la plupart des calculs de réseaux de neurones n'ont pas besoin de 32 bits de précision. Les poids, activations et gradients peuvent être représentés en 16 bits sans perte significative de qualité. Mais certaines opérations (calcul de la perte, mise à jour des poids) nécessitent une précision plus élevée pour éviter l'instabilité numérique. La précision mixte conserve une copie maîtresse des poids en FP32 pour les mises à jour, tout en utilisant FP16/BF16 pour les passes avant et arrière.
FP16 (IEEE demi-précision) a 5 bits d'exposant et 10 bits de mantisse. BF16 (Brain Float 16) a 8 bits d'exposant et 7 bits de mantisse. La plage d'exposant plus large de BF16 signifie qu'il peut représenter la même plage de valeurs que FP32 (évitant le dépassement), tandis que la plage plus étroite de FP16 nécessite une mise à l'échelle de la perte pour empêcher les gradients de sous-déborder à zéro. Pour l'entraînement, BF16 est plus simple et plus stable. Pour l'inférence, FP16 offre parfois une précision légèrement meilleure pour le même coût mémoire.
Les GPU les plus récents (NVIDIA H100, H200) supportent FP8 (virgule flottante 8 bits) pour des calculs encore plus rapides. FP8 divise la mémoire par deux et double le débit par rapport à FP16, mais nécessite une gestion soigneuse pour éviter la dégradation de qualité. La pratique actuelle : entraîner en BF16, servir en FP16 ou FP8, et quantifier en INT4/INT8 pour le déploiement en périphérie. Chaque pas vers le bas en précision échange un tout petit peu de qualité contre des gains significatifs en vitesse et en mémoire.