Le format numérique bfloat16

L'utilisation de nombres à virgule flottante avec une précision réduite est une méthode courante qui permet de réduire le délai de convergence sans perdre en précision. Les TPU utilisent le format de nombre bfloat16 lors de l'exécution d'opérations matricielles. Les opérations de multiplication matricielle sont effectuées sur les valeurs bfloat16, et les accumulations sont effectuées sur les valeurs float32 IEEE.

bfloat16 est un format personnalisé de 16 bits à virgule flottante pour le machine learning. Il se compose d'un bit de signe, de huit bits d'exposant et de sept bits de mantisse. Le schéma suivant montre les caractéristiques internes de trois formats à virgule flottante: float32: IEEE à simple précision, float16: demi-précision IEEE et bfloat16.

Image

La plage dynamique de bfloat16 et de float32 est équivalente. Cependant, bfloat16 occupe la moitié de l'espace mémoire. Pour en savoir plus sur les performances de bfloat16, consultez A Study of BFLOAT16 for Deep Learning Training.

Choisir bfloat16

L'équipe matérielle de Google a choisi bfloat16 pour les Cloud TPU afin d'améliorer l'efficacité matérielle tout en conservant la possibilité d'entraîner les modèles de deep learning avec précision, le tout avec des coûts de basculement minimaux de float32. La taille physique d'un multiplicateur matériel s'adapte au carré de la largeur de la mantisse. Avec un nombre de bits de mantisse inférieur à celui de FP16, les multiplicateurs bfloat16 sont environ de la moitié de la taille d'un multiplicateur FP16 classique, et ils sont huit fois plus petits qu'un multiplicateur float32.

Les réseaux de neurones sont plus sensibles à la taille de l'exposant que à la taille de la mantisse. Afin de garantir un comportement identique pour les sous-exécutions, les sur-exécutions et les NaN, bfloat16 a la même taille d'exposant que float32. bfloat16 traite les dénormalisations différemment de float32, et les remet à zéro. Contrairement à float16, qui nécessite généralement un traitement spécial comme la mise à échelle des pertes, bfloat16 est une option de remplacement pour float32 lors de l'entraînement et de l'exécution de réseaux de neurones profonds.

Entraînement de précision mixte

La plupart des calculs effectués au sein d'un réseau de neurones profond peuvent effectuer une tâche avec la même précision en utilisant des valeurs de précision inférieure. Certains modèles peuvent même atteindre une justesse supérieure avec des valeurs de précision plus faibles.

Lors de la programmation de Cloud TPU, le compilateur XLA convertit automatiquement les valeurs entre float32 et bfloat16.

Informations sur la conversion de format

La conversion du format de float32 en bfloat16 est automatiquement insérée par le compilateur XLA. Sur TPU, le schéma d'arrondi dans la conversion est arrondi au pair le plus proche et déborde sur l'inf. En outre, le modèle bfloat16 de Cloud TPU n'est pas compatible avec les sous-normales. Ainsi, toutes les sous-normales sont vidées à zéro lors de la conversion. Les valeurs spéciales, telles que NaN et inf, sont conservées dans la conversion.

La conversion du format de bfloat16 en float32 est également insérée automatiquement par le compilateur XLA. Étant donné que float32 peut représenter toutes les valeurs exactes en bfloat16, la conversion remplit simplement 16 zéros dans les bits de mantisse. Les valeurs spéciales sont conservées dans la conversion.

Portabilité des modèles

Les valeurs des paramètres et des activations d'un modèle peuvent être stockées au format 32 bits, car le matériel TPU peut automatiquement caster ces valeurs en bfloat16. Les points de contrôle obtenus à partir d'un modèle entraîné sur Cloud TPU peuvent être déployés sur d'autres plates-formes matérielles (par exemple, des inférences ou des réglages sur des processeurs ou des GPU) sans conversions manuelles approfondies.

Améliorer les performances avec bfloat16

Bien que la conversion automatique de format dans les TPU vous permette d'éviter de penser à la précision numérique, vous pouvez améliorer davantage les performances en convertissant explicitement des valeurs en bfloat16. Deux raisons peuvent expliquer pourquoi des valeurs sont explicitement converties en bfloat16:

  1. Le stockage de valeurs au format bfloat16 permet d'économiser de la mémoire sur puce, permettant ainsi aux Cloud TPU d'entraîner des modèles plus volumineux ou d'utiliser des tailles de lot plus importantes.

  2. Certaines opérations sont associées à la bande passante mémoire, ce qui signifie que le temps nécessaire au chargement des données à partir de la mémoire peut ralentir le temps global d'exécution du calcul. Le stockage des opérandes et des sorties de ces opérations au format bfloat16 réduit la quantité de données à transférer, améliorant ainsi la vitesse globale.

Pour commencer, nous vous recommandons de vous familiariser avec l'un des modèles de référence compatibles avec bfloat16 et qui ont été optimisés pour les Cloud TPU. Vous pourrez ensuite consulter notre guide sur les performances, notre guide sur les outils de profilage et notre guide de dépannage. Vous y trouverez des informations techniques détaillées pour vous aider à créer et à optimiser vous-même des modèles de machine learning.