Choisir entre CPU et GPU pour former un réseau de neurones

29

J'ai vu des discussions sur la «surcharge» d'un GPU, et que pour les «petits» réseaux, il peut en fait être plus rapide de s'entraîner sur un CPU (ou réseau de CPU) qu'un GPU.

Qu'entend-on par «petit»?

Par exemple, un MLP monocouche avec 100 unités cachées serait-il «petit»?

Notre définition de «petit» change-t-elle pour les architectures récurrentes?

Y a-t-il d'autres critères à prendre en compte pour décider de s'entraîner sur CPU ou GPU?

EDIT 1:

Je viens de trouver un article de blog (peut-être obsolète? C'est de 2014):

"... La plupart des cartes réseau ne fonctionnent qu'avec de la mémoire enregistrée auprès du processeur et le transfert GPU vers GPU entre deux nœuds serait ainsi: GPU 1 vers CPU 1 vers carte réseau 1 vers carte réseau 2 vers CPU 2 vers GPU 2. Cela signifie que si l'on choisit une carte réseau lente, il peut ne pas y avoir d'accélération sur un seul ordinateur. Même avec des cartes réseau rapides, si le cluster est volumineux, on n'obtient même pas d'accélération des GPU par rapport aux processeurs car les GPU fonctionnent tout simplement trop vite pour que les cartes réseau les suivent.

C'est la raison pour laquelle de nombreuses grandes entreprises comme Google et Microsoft utilisent des grappes CPU plutôt que GPU pour former leurs grands réseaux de neurones. "

Donc, à un moment donné, selon cet article, il aurait pu être plus rapide d'utiliser des processeurs. Est-ce toujours le cas?

EDIT 2: Oui, cet article de blog peut très bien être obsolète car:

Il semble maintenant que les GPU au sein d'un nœud soient connectés via un bus PCIe, de sorte que la communication peut se produire à environ 6 Go / s. (Par exemple: https://www.youtube.com/watch?v=el1iSlP1uOs , environ 35 minutes). L'orateur implique que cela est plus rapide que de passer de GPU1 à CPU à GPU2. Cela signifierait que la carte réseau n'est plus le goulot d'étranglement.

StatsSorcière
la source
Ce gars avec son billet de blog soulève de bons points. Je n'ai pas compris toutes ses justifications. Cependant, le fait que Google, Facebook, Twitter et tous les principaux groupes d'apprentissage en profondeur du monde universitaire exécutent leurs codes principalement sur des GPU suggère que c'est une bonne idée. Bien que biaisé: nvidia.com/content/events/geoInt2015/LBrown_DL.pdf
JahKnows

Réponses:

28

Contrairement à certaines des autres réponses, je déconseille fortement de toujours s'entraîner sur des GPU sans y réfléchir. Cela est dû à l'utilisation de méthodes d'apprentissage approfondi sur les images et les textes, où les données sont très riches (par exemple, beaucoup de pixels = beaucoup de variables) et le modèle a de même des millions de paramètres. Pour d'autres domaines, cela pourrait ne pas être le cas.

Qu'entend-on par «petit»? Par exemple, un MLP monocouche avec 100 unités cachées serait-il «petit»?

Oui, c'est vraiment très petit par rapport aux normes modernes. À moins que vous n'ayez un GPU parfaitement adapté à la formation (par exemple NVIDIA 1080 ou NVIDIA Titan), je ne serais pas surpris de constater que votre CPU était plus rapide.

Notez que la complexité de votre réseau de neurones dépend également de votre nombre de caractéristiques d'entrée, et pas seulement du nombre d'unités dans votre couche cachée. Si votre couche cachée a 100 unités et que chaque observation de votre jeu de données a 4 entités en entrée, alors votre réseau est minuscule (~ 400 paramètres). Si chaque observation a à la place des fonctionnalités d'entrée 1M comme dans certains contextes médicaux / biotechnologiques, alors votre réseau est assez grand en termes de nombre de paramètres. Pour le reste de ma réponse, je suppose que vous avez assez peu de fonctionnalités d'entrée pr. observation.

Un bon exemple que j'ai trouvé de comparer les performances du CPU et du GPU était quand j'ai formé un robot de poker en utilisant l'apprentissage par renforcement. Pour l'apprentissage par renforcement, vous ne voulez souvent pas autant de couches dans votre réseau neuronal et nous avons constaté que nous n'avions besoin que de quelques couches avec peu de paramètres. De plus, le nombre de fonctions d'entrée était assez faible. Au départ, je me suis entraîné sur un GPU (NVIDIA Titan), mais cela prenait beaucoup de temps car l'apprentissage par renforcement nécessite beaucoup d'itérations. Heureusement, j'ai trouvé que la formation sur mon processeur a rendu ma formation 10 fois plus rapide! C'est juste pour dire que les processeurs peuvent parfois être meilleurs pour la formation.

Y a-t-il d'autres critères à prendre en compte pour décider de s'entraîner sur CPU ou GPU?

Il est important de noter que tandis que sur un GPU, vous voudrez toujours remplir toute la mémoire du GPU en augmentant la taille de votre lot, ce n'est pas le cas sur le CPU. Sur le CPU, une augmentation de la taille du lot augmentera le temps pr. lot. Par conséquent, s'il est important pour vous d'avoir une très grande taille de lot (par exemple en raison d'un signal très bruyant), il peut être avantageux d'utiliser un GPU. Je n'ai pas vécu cela dans la pratique cependant et normalement de petites tailles de lot sont préférées.

pir
la source
Merci @pir! Avez-vous des références spécifiques où je peux en savoir plus?
StatsSorceress
Vous pouvez facilement trouver le nombre de paramètres de VGG par exemple pour comparer et voir que votre réseau est minuscule en comparaison.
pir
3
Je n'ai pas vu beaucoup de comparaisons CPU / GPU sur de petits réseaux car ce n'est pas ce qui intéresse les grandes entreprises et les laboratoires de recherche.
pir
@StatsSorceress Si vous voulez le tester par vous-même, pourquoi ne pas simplement configurer un simple MLP Keras et tester les performances sur GPU vs CPU? Voir aussi ma réponse mise à jour wrt. la taille de votre réseau.
pir
5

Le CPU est le gestionnaire de la branche, il peut faire un peu de tout, mais il n'est pas très bon sauf pour déléguer des tâches. Cependant, le GPU est un mathématicien dédié qui se cache dans votre machine. Si vous effectuez des processus mathématiques lourds, vous devez utiliser votre GPU. Toujours.

Si vous utilisez un langage de programmation populaire pour l'apprentissage automatique tel que python ou MATLAB, il s'agit d'une ligne de code pour indiquer à votre ordinateur que vous souhaitez que les opérations s'exécutent sur votre GPU.

Vous devez également vous assurer d'utiliser tous les cœurs de votre machine. Cela signifie utiliser l'informatique parallèle. Surtout pour les réseaux de neurones où les opérations peuvent être effectuées indépendamment, cela augmentera considérablement votre vitesse.

JahKnows
la source
4
J'ai constaté que parfois le surcoût du transfert de données vers et depuis le GPU efface complètement l'augmentation de vitesse du parallélisme. Ce n'est pas toujours une bonne idée d'aller au GPU.
Adrian Keister
1
Cela dépend de la complexité de votre modèle. Si vous entraînez un simple K-NN, cela ne vaut peut-être pas la peine. Cependant, si vous entraînez un modèle qui nécessite une matrice inverse ou un réseau neuronal qui nécessite de nombreuses opérations de matrice conséquentes, il est toujours judicieux d'opter pour le GPU.
JahKnows
1
@AdrianKeister, je suis d'accord. C'est ce que j'essayais de comprendre dans ma réponse. Pour le réseau mentionné par OP, ce serait probablement le goulot d'étranglement.
pir
1
100 unités cachées est plus rapide sur GPU en utilisant ma machine. J'aurais besoin d'un très petit nombre d'unités cachées pour que le CPU soit plus rapide. De plus, j'ai toujours tendance à faire ma formation par lots. Dans ce cas, je doute qu'un processeur soit le goulot d'étranglement compte tenu des données suffisamment denses.
JahKnows
3

Je vais d'abord faire référence à quelques citations de questions similaires:

En ce qui concerne les opérations matricielles, n'hésitez pas, vous optez toujours pour des GPU. la source

L'architecture parallèle dans un GPU est bien adaptée aux opérations vectorielles et matricielles. la source

Donc, si vous lisez ces questions, vous verrez qu'elles conseillent d'utiliser le GPU quel que soit le cas; cela apportera toujours une certaine amélioration.

La raison pour laquelle vous avez peut-être lu que les `` petits '' réseaux devraient être formés avec le CPU, c'est parce que la mise en œuvre de la formation GPU pour un petit réseau peut prendre plus de temps que la simple formation avec le CPU - cela ne signifie pas que le GPU sera plus lent.

Un réseau de 100 unités cachées est un peu petit , je l'appellerais un petit réseau par rapport aux grands réseaux profonds. Les architectures récurrentes ont (pour la plupart) plus de synapses que les réseaux à action directe, donc un RNN à 100 unités cachées est «plus grand» qu'un FFN à 100 unités cachées.

Thomas W
la source
N'est-il pas vrai que si vous avez un MLP avec une seule couche cachée de 100 unités, qui a le même nombre de paramètres qu'un RNN standard avec 100 unités cachées à cause du partage de poids? Il a plus de «synapses» - plus d '«activations» - mais le même nombre de paramètres, non?
StatsSorceress
je ne connais pas le terme «partage de poids». Il a le même nombre d'activations, mais plus de connexions donc plus de paramètres ...
Thomas W
Le partage de poids signifie que la matrice de poids d'une couche cachée dans le RNN à la couche cachée suivante est la même; c'est la même matrice en «U», répliquée dans le temps. De plus, les pondérations de l'entrée vers la couche cachée sont les mêmes dans le temps.
StatsSorceress
@StatsSorceress je ne suis pas familier avec le travail avec les matrices. Oui, la matrice de poids d'une couche cachée à la suivante est la même. Cependant, il y a plus de connexions au total (car une couche peut également se connecter à la couche PRÉCÉDENTE). Je ne sais pas comment je peux l'expliquer, mais un RNN aura toujours plus de paramètres car il y a plus de couches connectées ..
Thomas W
Oui, je comprends qu'il y a physiquement plus de paramètres, mais beaucoup de ces paramètres prennent la même valeur, ce qui signifie que le nombre effectif de paramètres dans un MLP et un RNN avec le même nombre de dimensions d'entrée et le même nombre de dimensions cachées sera le même.
StatsSorceress