Quantization¶
Un problème simple¶
Les réseaux de neurones (deep learning) sont de plus en plus gros et nécessitent de plus en plus de puissance de calcul. La quantization est une façon de contourner en réduisant la mémoire nécessaire pour stocker les coefficients et le temps de calcul avec les dernières cartes graphiques. La quantization est équivalent à une discrétisation. Voir aussi [Gholami2021] et quelques bout de codes quantization.py.
Les produits matriciels sont fréquents dans les réseaux de neurones où
on multiple les entrées X d’une couche de neurones avec les coefficients
A : . Lors de l’apprentissage, la matrice B est apprise soit en float 32 bit
soit en float 16 bit puis elle est discrétisée sur 8 bit, soit 256 valeurs.
Si on note q(B) la forme discrétisée de B, le plus simple de minimiser
. On pourrait également se pencher sur la minimisation
de
mais la matrice X vient des données.
Il faudrait soit prendre des hypothèses de distribution sur X
ou optimiser sur un jeu de données
.
On considère le cas simple qui consiste à minimiser
.
Discrétisation sur un octet¶
On discrétise sur 256 valeurs espacées de façon régulière sur un intervalle.
Mais les coefficients ne sont pas tous situés dans un même intervalle.
On doit alors trouver les meilleurs paramètres et
qui définissent la quantization au travers de deux fonctions. On note
la fonction qui x
dans l’intervalle [0, 255], 0 à gauche, 255 à droite.
La fonction est la partie entière asociée à la fonction
.
Le problème est la fonction qui n’est pas dérivable.
C’est un problème d’optimisation discrète. Le paramètre
est appelé scale ou échelle. Il peut y en avoir un ou plusieurs
mais dans ce cas, on considère les différentes parties de B
qui sont quantizées avec les mêmes paramètres
et z
Cette quantization est appelée quantization linéaire. Elle est privilégiée car elle est très rapide et la transformation inverse (ou déquantization) l’est tout autant.
Discrétisation sur une float 8¶
Un float 8 est un réel codé sur 8 bits. Il y a plusieurs variantes.
Nous allons considérer la version E4M3FN, :
1 bit pour le signe
4 bits pour l’exposant
3 bits pour la mantisse
Et la valeur réelle est :
si l’exposant est nul,
sinon
le réel vaut NaN s’il suit le format :
(255 ou 127),
le réel vaut zéro s’il suit le format :
(0 ou 128)
Les valeurs ne sont plus uniformément espacées mais il y en a toujours entre 252 et 255
selon les formats de float 8 et on cherche toujours à trouver les meilleurs
paramètres et z. La formule est quasiment la même. On n’arrondit
plus à l’entier inférieur (ou le plus proche) mais au float 8
inférieur (ou le plus proche).
Optimisation¶
L’idée est de traiter la discrétisation sur un ensemble fini de valeurs,
quel qu’il soit, des entiers ou des réels codés sur 8 bits. On note cet
ensemble . On réécrit le problème d’optimisation :
On note le noyau gaussien.
Cette notation ne tient pas compte du décalage z qu’on peut ajouter comme suit :
Le problème est beaucoup plus simple à résoudre si on enlève l’indicatrice
et la fonction devient dérivable. L’idée est de regarder l’évolution des valeurs trouvées
pour et z en faisant tendre h vers 0.
On commence par le plus simple, le cas float 8 pour lequel on impose
.
(1)¶
Si on suppose que les coefficients de B suivent une certaine loi de probabilité, ce calcul devient une somme d’espérence.
Résolution¶
If then
.
Let’s denote
. Then:
Applied to (1):
Then:
Notebooks¶
Bibliographie¶
Amir Gholami, Sehoon Kim, Zhen Dong, Zhewei Yao, Michael W. Mahoney, Kurt Keutzer, University of California, Berkeley A Survey of Quantization Methods for Efficient Neural Network Inference