Le format numérique bfloat16
L'utilisation de nombres à virgule flottante de précision réduite est une méthode couramment utilisée pour réduire le temps 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é à virgule flottante 16 bits pour le machine learning. Il est composé d'un bit de signe, de huit bits exposants et de sept bits mantissa. Le schéma suivant illustre les composants internes de trois formats à virgule flottante: float32
: précision simple pour l'IEEE, float16
: précision à demi-précision et bfloat16
.
La plage dynamique de bfloat16
et float32
est équivalente. Toutefois, bfloat16
occupe la moitié de l'espace mémoire. Pour en savoir plus sur les performances de bfloat16
, consultez la page 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 mantissa. 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 au sein d'un réseau de neurones profond peuvent effectuer une tâche avec la même précision à l'aide de valeurs moins précises. Certains modèles peuvent même atteindre une plus grande justesse avec des valeurs de précision inférieure.
Lors de la programmation des Cloud TPU, le compilateur XLA convertit automatiquement les valeurs entre float32
et bfloat16
.
Informations sur la conversion des formats
La conversion du format float32 en bfloat16 est automatiquement insérée par le compilateur XLA. Sur le TPU, le schéma d'arrondi est de la valeur arrondie la plus proche et un trop-plein pour inf. De plus, le bfloat16 sur Cloud TPU n'est pas compatible avec les sous-normals. Toutes les sous-normales sont vidées à zéro pendant la conversion. Les valeurs spéciales, telles que NaN et inf, sont conservées dans la conversion.
La conversion du format bfloat16 en float32 est également insérée automatiquement par le compilateur XLA. Étant donné que float32 peut représenter toutes les valeurs exactes de bfloat16, la conversion remplit simplement 16 zéros dans les bits de mantissa. Les valeurs spéciales sont conservées lors de la conversion.
Portabilité des modèles
Les valeurs des paramètres et des activations dans un modèle peuvent être stockées au format 32 bits, car le matériel TPU peut les caster automatiquement sur 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 permettent de caster des valeurs explicitement sur bfloat16
:
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.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
optimisés pour les Cloud TPU. Ensuite, le guide sur les performances, le guide des outils de profilage et le guide de dépannage fournissent des informations techniques détaillées pour vous aider à créer et à optimiser des modèles de machine learning par vous-même.