Le guide ultime des cartes graphiques (GPUs) pour le Deep Learning

Par Vincent Coulombe, 1er novembre 2023

Le Deep Learning, ou apprentissage profond, est une sous-discipline de l’intelligence artificielle qui a gagné en popularité ces dernières années grâce à ses performances remarquables dans des domaines tels que la vision par ordinateur et le traitement du langage naturel.

Dans ces réseaux, les données d’entrée et les poids des connexions entre les neurones sont représentés sous forme de matrices. Bref, lorsque qu’un réseau de neurones effectue une prédiction, ou propagation avant (forward propagation), il réalise une série de calculs matriciels. Ces calculs matriciels sont essentiellement des opérations algébriques sur les matrices qui déterminent la sortie du réseau pour une entrée donnée.

Aussi, lors de l’entraînement d’un réseau de neurones, l’algorithme de back propagation est utilisé pour calculer les gradients (dérivées partielles) des poids par rapport à la fonction de perte. Ces gradients indiquent la direction et l’amplitude des ajustements nécessaires pour minimiser l’erreur du modèle. Encore une fois, ces calculs sont basés sur des opérations matricielles, où les erreurs sont propagées en sens inverse à travers le réseau. Une fois les gradients calculés, vous utilisez un algorithme d’optimisation tel que la descente de gradient pour ajuster les poids du réseau. Les calculs matriciels sont essentiels pour mettre à jour les poids de manière efficace.

Bref, autant l’entraînement que l’exploitation des réseaux de neurones nécessite beaucoup de calculs matriciels. Pour gérer efficacement cette charge de calcul intense, les cartes graphiques (GPUs) sont devenues des composants essentiels de l’infrastructure de l’apprentissage profond.

Une prédiction ou propagation avant (forward propagation) dans un réseau de neurones peut être vulgarisé et présenté comme une transformation d’une matrice d’entrée (une image, une séquence de mots, etc.) en une matrice de sortie (une prédiction, une classe, etc.) grâce à une série de calculs majoritairement matriciels.

Les GPUs

Une carte graphique, aussi appelée GPU, est un composant d’ordinateur essentiel pour gérer les graphismes, les jeux, et les calculs complexes. Elle possède sa propre mémoire (VRAM) et des processeurs spéciaux pour accélérer les tâches graphiques et de calcul. C’est comme un super outil magique qui exécute des tâches difficiles sur un ordinateur.

Une carte graphique (GPU) RTX-3080. Photo tirée de GPU deal: Gigabyte’s GeForce RTX 3080 Gaming OC drops to new lowest price on Amazon

GPUs vs CPUs

Tout d’abord, il est essentiel de comprendre que les unités centrales de traitement (CPUs) sont optimisées pour le calcul séquentiel, tandis que les cartes graphiques (GPUs) sont optimisées pour le calcul parallèle. Une analogie pertinente serait de comparer les CPUs à des voitures de sport et les GPUs à des autobus. Les CPUs sont conçus pour la vitesse ce qui en fait le choix idéal pour des tâches telles que le transport d’un passager du point A au point B. Cependant, ils sont moins adaptés lorsque vous devez transporter 100 passagers.

Au lieu de forcer la voiture de sport à effectuer 100 allers-retours, une approche plus efficace serait de mettre les 100 passagers dans un autobus. Certes, l’autobus effectuera le trajet plus lentement que la voiture de sport, mais il le fera en une seule fois au lieu de 100 déplacements distincts.

Cela nous permet de mieux comprendre la distinction entre ces deux types d’unités de traitement. Les CPUs sont parfaits pour des tâches séquentielles, comme la navigation sur Internet ou l’envoi de courriels. Cependant, pour des tâches parallèles telles que les calculs matriciels, les GPUs offriront des gains de performance substantiels.

Quoi rechercher chez un bon GPU pour le Deep Learning

Il est important de noter que l’industrie des cartes graphiques est encore largement influencée par le marché des jeux vidéo. La plupart des GPUs disponibles sont donc optimisés pour cet usage. Cependant, il ne faut pas automatiquement en déduire qu’une carte graphique idéale pour le gaming conviendra nécessairement au Deep Learning. C’est pourquoi, dans les prochaines sections, j’expliquerai quelles caractéristiques privilégier lors du choix d’une carte graphique pour travailler avec des réseaux de neurones.

La taille de la VRAM

Pour expliquer brièvement, disons que, contrairement aux unités centrales de traitement (CPUs), les cartes graphiques disposent de leur propre mémoire dédiée, appelée VRAM (Random Access Memory Video), ou mémoire vidéo. Cette particularité améliore grandement leurs performances, car elles n’ont pas besoin d’aller chercher les données dans la mémoire de l’ordinateur, puisqu’elles les ont déjà enregistrées dans leur propre mémoire.

Pour de nombreuses applications, telles que le gaming ou la création de cryptomonnaie, la taille de la VRAM (mémoire vidéo) d’une carte graphique n’est généralement pas un facteur limitant en termes de performance. Cependant, c’est une caractéristique cruciale à prendre en compte pour le Deep Learning. Cela est vrai à la fois pour l’inférence (lorsque le réseau effectue des prédictions sur de nouvelles données) et pour l’entraînement (lorsque le modèle apprend à partir de données).

En ce qui concerne l’entraînement, pour améliorer statistiquement l’optimisation du modèle, l’algorithme de rétropropagation (back propagation) est effectué sur un ensemble de données appelé mini-batch. En général, plus la taille de ce mini-batch est grande (à l’intérieur de certaines limites), plus l’entraînement est efficace. Cependant, ce mini-batch doit être stocké en VRAM. Il serait donc dommage que la taille optimale du mini-batch pour l’entraînement d’un modèle ne puisse pas être atteinte en raison d’une VRAM insuffisante.

Le même principe s’applique à l’inférence où, afin de tirer pleinement parti de la capacité de parallélisation des GPUs, de nombreuses entreprises optent pour une inférence parallélisée sur un mini-batch d’entrées. Cela leur permet d’accélérer considérablement le temps moyen d’inférence pour chacune de ces entrées. Une VRAM de grande capacité permet donc une parallélisation plus efficace, ce qui se traduit par un temps d’inférence moyen plus rapide.

Toutefois, il est important de noter que vous pouvez atténuer ce problème en parallélisant, soit les données, soit le modèle, en utilisant plusieurs cartes graphiques, ou encore en accumulant le gradient. Ces méthodes permettent de contourner les limitations liées à la taille de la VRAM, en maintenant une taille de mini-batch adéquate pour l’entraînement et/ou l’inférence. Cependant, les détails de ces techniques dépassent le cadre de cette discussion et pourraient faire l’objet d’un article futur.

En résumé, la taille de la VRAM a un impact sur la vitesse d’inférence et d’entraînement d’un réseau de neurones profonds, mais elle n’a pas nécessairement d’incidence sur la qualité intrinsèque du modèle.

Le nombre de tensor cores

Un tensor core est une unité de calcul créée spécifiquement pour le calcul matriciel numérique d’opérations, notamment la multiplication de matrices et la convolution. Ils sont donc l’unité de calcul parfaite pour le Deep Learning.

La différence entre un tensor core et une unité de calcul GPU standard, appelé CUDA core, est que ce dernier est conçu pour le calcul à usage général et le rendu graphique. Il est polyvalent, mais moins spécialisé pour les tâches typiques du Deep Learning.

En somme, dans le contexte du Deep Learning, la priorité est de disposer de GPUs équipés du plus grand nombre possible de tensor cores, plutôt que de chercher à maximiser le nombre de CUDA cores.

La taille de la bande passante mémoire

Dans la section précédente, j’ai mentionné que les tensor cores effectuent très rapidement les calculs qui nous intéressent. En fait, tellement rapidement, qu’ils restent inactifs la plupart du temps, car ils doivent attendre que les données soient chargées de la mémoire de l’ordinateur vers la VRAM.

Le goulot de performance devient alors la vitesse avec laquelle un GPU est en mesure de transférer de l’information dans sa VRAM soit la taille de sa bande passante mémoire.

Donc, pour deux GPUs équipés du même nombre de tensor cores, l’un des indicateurs les plus fiables de la performance est la taille de la bande passante mémoire.

Nvidia vs AMD

Il est important de noter que dans le domaine du Deep Learning, Nvidia occupe actuellement une position dominante. Bien qu’AMD propose d’excellentes cartes graphiques pour les jeux vidéo, elles ne sont pas concurrentielles en ce qui concerne le nombre de cœurs tensor. Cependant, la raison principale pour laquelle les produits d’AMD ne sont pas aussi largement utilisés réside dans le manque de support logiciel.

Nvidia propose CUDA, une plateforme qui permet aux professionnels d’exploiter leurs cartes graphiques de manière efficace. Malheureusement pour AMD, CUDA bénéficie du soutien d’une communauté massive et de grandes entreprises telles que Google, Microsoft et Meta. En conséquence, il existe beaucoup plus d’experts en CUDA que d’experts en OpenCL (le logiciel équivalent pour les GPUs AMD), renforçant ainsi la position dominante de Nvidia. Une communauté d’experts plus étendue signifie également une plus grande disponibilité de ressources pédagogiques.

En résumé, si vous envisagez d’acheter une carte graphique pour le Deep Learning, Nvidia est actuellement la seule option réaliste.

FP32 vs FP16 vs FP8

Le calcul à faible précision est devenu un sujet important dans le domaine de l’apprentissage profond (Deep Learning) en raison de son potentiel pour accélérer les calculs sur les unités de traitement graphique (GPUs), tout en économisant de la mémoire. Deux formats de précision couramment utilisés dans ce contexte sont le FP32 (virgule flottante sur 32 bits) et le FP16 (virgule flottante sur 16 bits).

D’un côté, le FP32 (Simple Précision) est utilisé pour stabiliser l’entraînement des modèles en offrant une meilleure précision sur les poids. Cependant, diverses avancées algorithmiques, comme la mise à l’échelle dynamique (dynamic scaling), ont permis d’atteindre un niveau de stabilisation similaire en n’utilisant que 16 bits de précision. Ce niveau de précision, connu sous le nom de demi-précision (Half Precision), permet d’accélérer légèrement les entraînements, mais surtout de réduire de manière significative l’utilisation de la VRAM.

Pour cette raison, mon premier conseil à ceux qui ont des contraintes de VRAM lors de l’entraînement de réseaux de neurones profonds est de réduire la précision à FP16. Ce faisant, il devient possible de travailler avec des réseaux presque deux fois plus grands sans avoir à doubler la capacité de la VRAM. Toutefois, il est à noter que la transition vers FP16 doit être effectuée avec prudence, car elle peut ne pas être appropriée pour toutes les tâches. Pour certaines applications où la précision est critique, il peut être nécessaire de continuer à utiliser FP32 ou d’envisager des formats de précision mixtes, où certaines parties du modèle utilisent FP16, tandis que d’autres utilisent FP32 pour maintenir la précision.

Si vous envisagez de travailler en FP16, il est recommandé d’éviter les GPUs de la famille GTX de NVIDIA, en particulier ceux basés sur les architectures plus anciennes, telles que Kepler, Maxwell et Pascal. En général, ces GPUs ne sont pas conçus pour prendre en charge efficacement ce type de calcul.

De plus, au moment de la rédaction de cet article, certaines publications ont suggéré des méthodes pour effectuer des entraînements stables en FP8, offrant ainsi davantage d’économie de mémoire et de temps de calcul. Cependant, il convient de noter que travailler à ce niveau de précision semble encore expérimental et précaire. De plus, cette option n’est actuellement prise en charge que par les cartes graphiques H100 et celles de la série 40.

Conclusion

Vous devriez maintenant avoir une compréhension plus claire de ce qu’est une carte graphique (GPU), de son rôle essentiel dans le Deep Learning, et des éléments à considérer lors de la recherche d’une carte graphique pour travailler avec des réseaux de neurones profonds.

Pour ceux qui ont peu de temps, voici les grandes lignes :

  • Malheureusement, en raison de contraintes logicielles, il est recommandé d’utiliser exclusivement des GPUs Nvidia.
  • Priorisez les cartes graphiques avec la plus grande quantité de VRAM possible.
  • Privilégiez le nombre de tensor cores par rapport au nombre de CUDA cores.
  • Pour un nombre de tensor cores similaire, optez pour la carte avec la bande passante VRAM plus élevée.
  • Idéalement, choisissez un GPU de la famille RTX ou de la famille Tesla, car ils permettent de travailler efficacement en demi-précision (FP16). Je recommande même une carte de la série 40, car elle offre la possibilité de travailler en FP8, dont la stabilité devient de plus en plus certaine.