Quel est l'avantage de conserver une taille de lot de 2?

16

Lors de la formation de modèles à l'apprentissage automatique, pourquoi est-il parfois avantageux de maintenir la taille du lot à une puissance de 2? J'ai pensé qu'il serait préférable d'utiliser une taille qui correspond le mieux à votre mémoire / RAM GPU.

Cette réponse affirme que pour certains packages, une puissance de 2 est meilleure comme taille de lot. Quelqu'un peut-il fournir une explication détaillée / un lien vers une explication détaillée à ce sujet? Est-ce vrai pour tous les algorithmes d'optimisation (descente de gradient, rétropropagation, etc.) ou seulement pour certains d'entre eux?

James Bond
la source

Réponses:

20

Il s'agit d'un problème d'alignement des processeurs virtuels (VP) sur les processeurs physiques (PP) du GPU. Étant donné que le nombre de PP est souvent une puissance de 2, l'utilisation d'un nombre de VP différent d'une puissance de 2 entraîne de mauvaises performances.
Vous pouvez voir le mappage du VP sur le PP comme une pile de tranches de la taille du nombre de PP .
Disons que vous avez 16 PP.
Vous pouvez mapper 16 PV sur eux: 1 VP est mappé sur 1 PP.
Vous pouvez leur associer 32 PV: 2 tranches de 16 PV, 1 PP seront responsables de 2 PV.
Etc. Pendant l'exécution, chaque PP exécutera le travail du 1er VP dont il est responsable, puis le travail du 2e VP etc.
Si vous utilisez 17 VP, chaque PP exécutera le travail de son 1er PP, puis 1 PP exécutera exécuter le travail du 17e ETles autres ne feront rien (précisé ci-dessous).
Cela est dû au paradigme SIMD (appelé vecteur dans les années 70) utilisé par les GPU. Ceci est souvent appelé Data Parallelism: tous les PP font la même chose en même temps mais sur des données différentes. Voir https://en.wikipedia.org/wiki/SIMD .
Plus précisément, dans l'exemple avec 17 VP, une fois le travail de la 1ère tranche effectué (par tous les PP faisant le travail de leur 1er VP), tous les PP feront le même travail (2ème VP), mais un seul en a données sur lesquelles travailler .
Rien à voir avec l'apprentissage. Ce n'est que de la programmation.

jcm69
la source
serait-il plus exact de dire que la taille des lots devrait alors être un multiple du nombre de PP? Autrement dit, dans votre exemple, nous pourrions mapper 16x3 = 48 VP à 16 PP?
1west
Oui. eh bien ... Si vous faites le mappage VP -> PP, vous-même, vous avez 100% raison. Si vous utilisez une bibliothèque et demandez 80 PV. Je ne suis pas sûr. Je ne dis pas que tu as tort. Si le rapport est une puissance de 2, vous pouvez utiliser des optimisations très classiques et faciles. Pensez aux accès mémoire. Si le nombre de voisins à l'étage d'un VP n'est pas une puissance de 2, disons 5, la bibliothèque ne pourra pas utiliser les accès O classiques (log_2 (n)) à la mémoire des voisins aussi facilement.
jcm69
@ jcm69 pouvez-vous expliquer ou donner le lien pour le temps d'accès log_2 (n) pour l'accès mémoire VP
Arayan Singh
C'est juste une considération générale sur la manipulation d'objets en informatique. Lorsque vous êtes sûr que les objets respectent la puissance de 2 règles, ils peuvent être facilement et en toute sécurité gérés par des arbres de recherche binaires, des décalages binaires, etc. Quoi qu'il en soit, c'est un peu loin de la question initiale;)
jcm69