
Bfloat16, FP8, posit8, LNS…
les drôles de nombres des réseaux de neurones
⏱ 5 minLes formats classiques pour représenter les nombres sur ordinateur n’ont pas été pensés pour les réseaux de neurones. On en a donc inventé des ad hoc. Et on en prépare d’autres, encore plus bizarres…
Lorsque les réseaux de neurones ont pris leur envol, il y a une trentaine d’années, les ordinateurs disponibles proposaient des formats de représentation des nombres conçus pour d’autres applications. Mais qui peut le plus, peut le moins… et pour représenter les poids des réseaux, les nombres en « virgule flottante » faisaient l’affaire. Les poids étaient donc typiquement représentés par un nombre flottant simple précision à la norme IEEE 754 (dénommé “binary32”). La taille (23 bits) de la mantisse (on dit aussi “significande”, ou “fraction”) prévue par ce format dépassait les besoins réels, mais ce n’était pas bien grave, au moins dans les premiers temps.
Mais les réseaux devenaient de plus en plus gros, les jeux d’essai de plus en plus conséquents… et la puissance de calcul nécessaire dans la phase d’apprentissage commençait à devenir problématique. Pour accélérer les calculs et gagner de la place en mémoire, il y avait bien ce format “demi-précision » (“binay16”), également proposé par la norme IEEE 754… Avec ses dix bits de mantisse et ses cinq bits d’exposant, il permet de représenter des nombres dans l’intervalle ±65 504, avec une précision de 1/1024 autour de 1. Les développeurs de modèles d’apprentissage profond auraient préféré un format mieux adapté à la dynamique de leurs réseaux de neurones.
Dynamique vs précision
Voilà pourquoi un autre format a été proposé en 2016 par Google Brain : le “bfloat16” (avec un “b” pour “brain”). Il reprend la taille (huit bits) de l’exposant du flottant simple précision, ce qui lui permet comme ce dernier de représenter des nombres dans l’intervalle de ~10−38 à ~1038. De fait, il correspond aux seize premiers bits du format IEEE 754 flottant simple précision, ce qui simplifie grandement la conversion entre les deux formats, dans les deux sens. La précision est à la baisse, puisque la mantisse n’occupe plus que sept bits, mais ce compromis correspond mieux aux besoins des réseaux de neurones.
Ce format bfloat16 est aujourd’hui disponible sur de nombreux processeurs et GPU, à commencer par les puces de Google, mais aussi Nvidia, ARM, Intel … Ces trois derniers acteurs réfléchissent même à un format flottant sur 8 bits. Ils ont publié un livre blanc proposant une norme, dénommée FP8, qui serait intéressante à la fois pour l’apprentissage et pour l’inférence. Elle se conjugue en deux variantes : E5M2 et E4M3. Comme son nom l’indique, E5M2 accorde cinq bits à l’exposant et deux seulement à la mantisse. À l’inverse, E4M3 réduit l’exposant à quatre bits au profit de la mantisse qui en comporte trois. Le format FP8 est déjà implémenté sur les récentes puces GH100 de Nvidia et Gaudi2 d’Intel. Bien entendu, les processeurs qui gèrent le FP8 ou d’autres formats courts effectuent les calculs intermédiaires dans un format supérieur, pour éviter l’accumulation de pertes de précision.
Par rapport au flottant 32 bits, le recours à ces formats compacts induit un gain notable en efficacité, en termes de vitesse d’exécution mais aussi d’occupation mémoire. Ce qui est fort appréciable, surtout durant la phase d’entraînement d’un réseau de neurones, durant laquelle il doit traiter un jeu de données conséquent. Lorsqu’il s’agit au contraire d’exploiter le modèle ainsi obtenu, de l’utiliser donc en inférence, il est également important de chercher à économiser les ressources, mais dans un contexte différent. Si l’entraînement peut être effectué sur de gros serveurs, où en faisant appel à des ressources dans le cloud, le contexte de l’application dicte des contraintes parfois fortes sur la puissance de calcul disponible. On peut vouloir utiliser ce modèle sur un ordinateur banal, mais aussi sur une informatique embarquée, comme un véhicule, voire sur un smartphone… avec à chaque fois des contraintes en termes de coût et d’énergie disponible.
Des entiers pour inférer
Pour minimiser la puissance de calcul nécessaire pour faire tourner un modèle en inférence, on sait transformer les modèles de manière à représenter les poids à l’aide de valeurs entières. Notamment en faisant appel à la technique du « block floating point », qui consiste à interpréter, au niveau de chaque couche du réseau de neurones, les valeurs entières représentant les poids comme des mantisses de nombres flottants dont l’exposant est commun au bloc considéré.
Les processeurs réalisent les opérations sur les entiers plus rapidement que sur les nombres flottants. Ils vont encore plus vite si on fait appel, plutôt qu’au format standard sur 32 bits, aux entiers sur 16 bits. Mieux, on sait se contenter d’entiers représentés par un seul octet (format “int8”), donc sur huit bits. « Si pour l’apprentissage, c’est le bfloat16 qui a le vent en poupe, pour l’inférence, la tendance est aux entiers sur 8 bits, assure Frédéric Pétrot, professeur à l’Ensimag (Grenoble INP). TensorFlow le permet, notamment. Cela marche bien sur les transformers. » Certains vont même plus loin, et travaillent avec des entiers sur quatre bits (format “int4”), deux bits… et même un seul. « On sait que l’on peut transformer un réseau de neurones fonctionnant avec des entiers codés sur 8 bits en un réseau équivalent faisant appel à des poids codés sur un seul bit, mais bien sûr plus complexe », indique Florent de Dinechin, professeur à l’Insa Lyon.
On a même songé à oublier le système binaire pour la numération à base trois, qui permet de représenter les trois valeurs : -1, 0 et +1. « De très bons résultats ont été obtenus pour l’inférence, assure Maxime Christ, au laboratoire Tima de Grenoble, qui finalise une thèse, sous la direction de Frédéric Pétrot et la supervision de Florent de Dinechin, intitulée “Learning in very low precision”. Malheureusement, l’électronique contemporaine ne gère pas efficacement le ternaire. »
Des nombres encore plus flottants
L’art de représenter les nombres sur ordinateur n’a pas dit son dernier mot. En 2017, John Gustafson, un chercheur états-unien, travaillant à l’époque à Singapour, notamment à l’A*STAR (Agency for Science, Technology And Research), proposait un nouveau format, baptisé “posit”. Il reprend le principe de la virgule flottante, mais fait varier le partage des bits disponibles entre la mantisse et l’exposant, grâce à un champ supplémentaire (le “régime”). « Ce qui permet, explique Florent de Dinechin, d’attribuer plus de bits à la mantisse des nombres avec un petit exposant, et donc d’obtenir une précision supérieure autour de 1, au détriment de celle des nombres avec un fort exposant. Malheureusement, les circuits nécessaires pour réaliser les opérations arithmétiques sur les posits sont plus complexes que ceux qui traitent les flottants classiques. Ils occupent beaucoup plus de silicium. » Ce qui implique des temps de calcul plus importants… « Mais cet inconvénient diminue pour les formats les plus courts, ajoute le chercheur. Pour les réseaux de neurones, il est possible qu’un format très court, sur huit bits, soit intéressant. On peut donc imaginer que le bfloat16 soit un jour concurrencé par un “posit8”. Un posit sur quatre bits est peut-être même envisageable… »
Mais une proposition encore plus radicale fait son chemin. Elle repose sur une invention qui remonte au XVIIe siècle et que l’on doit au mathématicien écossais John Napier : le logarithme. En codant les nombres par leur logarithme, on obtient une grande précision autour de la valeur 1, et cette précision décroit très progressivement à mesure que les valeurs montent vers les grands (et les petits) ordres de grandeur. L’idée a été creusée dès les années 1970 et connait un regain d’intérêt dans le contexte de l’apprentissage profond. « Il y a plus de travaux portant sur les LNS (pour Logarithmic Number System) que sur les posits, assure Maxime Christ. On publie sur le sujet, notamment chez Facebook et Nvidia. » Le jeune chercheur a d’ailleurs récemment cosigné avec ses deux mentors une publication sur le sujet. Florent de Dinechin, qui présidait en septembre dernier ARITH 2022, le Symposium de l’IEEE sur l’arithmétique computationnelle, confirme cet élan vers les LNS : « Bill Dally, le chief scientist de Nvidia, a donné la première keynote, intitulée “Number Representations for Deep Learning”. Et il a désigné la représentation logarithmique comme la solution d’avenir. » Peut-on espérer voir annoncées bientôt des puces incorporant cette nouvelle arithmétique ? « Il est encore trop tôt pour s’attaquer à la standardisation », estime Maxime Christ.