L’article a été écrit par Rakshith Vasudev et John Lockman, HPC AI Innovation Lab, en octobre 2019
Comme présenté précédemment, CheXNet est un modèle d’assistant radiologiste basé sur l’IA qui utilise DenseNet pour identifier jusqu’à 14 pathologies à partir d’une image de rayons X donnée. Plusieurs approches ont été explorées pour faire évoluer la formation d’un modèle capable d’atteindre des performances aussi bonnes ou meilleures que le modèle CheXNet-121 d’origine avec ResNet-50, ce qui est prometteur sur le plan de l’évolutivité et de l’amélioration de la précision de la formation (AUROC positif). Les auteurs ont fait preuve d’évolutivité sur les systèmes dotés de processeur, mais nous sommes intéressés par l’exploitation du parallélisme des processeurs graphiques pour accélérer le processus de formation. Dans cet article, nous décrivons les pratiques d’excellence pour obtenir des performances maximales sur la formation scale-out distribuée de CheXNet à l’aide des processeurs graphiques Nvidia V100 SXM2 dans les serveurs Dell EMC C4140. Le système Dell EMC PowerEdge C4140 offre à la fois densité et performances avec quatre processeurs graphiques Nvidia V100 dans une configuration SXM2.
Configuration matérielle : | Configuration du logiciel : |
---|---|
|
|
Comme les nouveaux appareils informatiques (tels que les processeurs graphiques et les TPU) permettent de former des réseaux neuronaux à un rythme de plus en plus rapide, le traitement du processeur est susceptible de devenir le goulot d’étranglement. L’API tf.data fournit aux utilisateurs des blocs de construction pour concevoir des pipelines d’entrée qui utilisent efficacement le processeur, optimisant chaque étape du processus ETL.
Pour effectuer une étape de formation, vous devez d’abord extraire et transformer les données de formation, puis les envoyer à un modèle exécuté sur un accélérateur. Toutefois, dans une implémentation synchrone naïve, l’accélérateur est inactif lorsque le processeur prépare les données. À l’inverse, lorsque l’accélérateur forme le modèle, le processeur est inactif. Le temps d’étape de formation correspond donc à la somme du temps de prétraitement du processeur et du temps de formation de l’accélérateur
Le pipelining englobe le prétraitement et l’exécution du modèle d’une étape de formation. Pendant que l’accélérateur effectue l’étape de formation N, le processeur prépare les données pour l’étape N+1. Cela réduit le temps d’étape au maximum (par opposition à la somme) de la formation et le temps nécessaire à l’extraction et à la transformation des données.
Sans pipelining, le processeur et le processeur graphique/TPU restent inactifs la plupart du temps :
Fig. 1 : Avec l’exécution séquentielle, le processeur graphique est souvent inactif
Avec le pipelining, le temps d’inactivité diminue considérablement :
Fig. 2 : Le pipelining englobe l’utilisation du processeur et du processeur graphique, optimisant ainsi l’utilisation du processeur graphique
L’API tf.data fournit un mécanisme de pipelining logiciel via la transformation tf.data.Dataset.prefetch, qui peut être utilisée pour dissocier l’heure à laquelle les données sont produites à partir du moment où elles sont consommées. Plus précisément, la transformation utilise un thread d’arrière-plan et une mémoire tampon interne pour prérécupérer des éléments du jeu de données d’entrée à l’avance, au moment où ils sont demandés.
Plus d’informations ici : https://www.tensorflow.org/guide/performance/datasets
En suivant les instructions fournies par tensorflow, il est possible d’obtenir un pipeline de données qui ressemble à ceci (ancienne approche) :
https://github.com/dellemc-hpc-ai/code-examples/blob/master/cheXNet-snippets/old_approach.py
Dans cette approche également appelée « ancienne approche », le pipeline de données tf effectue les opérations suivantes (en supposant que le jeu de données du rayon x est une séquence de TFRecords) :
Toutefois, il ne s’agit pas du code le plus performant. Il provoque des blocages et de fréquentes utilisations à 0 % du processeur graphique. En fait, il n’utilise pas efficacement les accélérateurs.
Pour configurer correctement le pipeline de données tf, nous suivons l’approche adoptée par les modèles officiels tensorflow, en particulier, celui de ResNet. La différence entre les ancienne et nouvelle approches est la façon dont le pipeline de données est configuré avant de l’alimenter vers le modèle.
Voici à quoi ressemble la nouvelle approche :
https://github.com/dellemc-hpc-ai/code-examples/blob/master/cheXNet-snippets/new_approach.py
L’approche officielle des modèles TensorFlow, également appelée nouvelle approche, est la suivante :
Voici une comparaison des performances des anciennes et nouvelles approches, à l’aide des modèles officiels de TF.
Fig. 3 : Avec la nouvelle approche, on peut s’attendre à une mise à l’échelle quasi linéaire.
Comme on peut le voir, il y a un impact significatif sur les performances et il n’y a pas de mise à l’échelle avec l’ancienne approche. Les processeurs graphiques n’ont souvent que peu d’utilisation, voire aucune utilisation, ce qui entraîne une stagnation des performances. Rendre le calcul plus efficace sur un processeur graphique se traduit par un calcul plus efficace sur plusieurs processeurs graphiques sur plusieurs nœuds, si la communication est bien gérée.
Le fait que les CPU effectuent le prétraitement en parallèle, que les données traitées soient prérécupérées en mémoire et que les processeurs graphiques se chargent de la multiplication des matrices avec une communication rapide est un autre aspect qui rend cette nouvelle approche plus intéressante pour plusieurs nœuds.
L’environnement qui exécute vos tâches est aussi important que vos tâches. Il est en effet essentiel d’avoir les bons modules/bibliothèques car ils auront un impact sur les performances de la formation. En outre, le fait de disposer des dernières bibliothèques associées à CUDA peut vous aider à améliorer les performances.
Suivez ce didacticiel pour l’installation, si vous n’avez pas de configuration d’environnement de travail.
MPI est une bibliothèque de communication qui aide horovod à distribuer les tâches. Différentes options de paramètres de liaison et de mappage ont été explorées et les meilleurs paramètres pour le C4140 étaient le mappage par socket. Le paramètre recommandé est le suivant :mpirun --map-by socket -np x python pyfile.py --pyoptions
Si plusieurs processus travaillent sur un processeur graphique, ils risquent de devoir lutter pour les ressources de ce processeur graphique, de consommer sa mémoire et de ne pas pouvoir adapter plus d’images par lot, ce qui entraîne une baisse des performances du processeur graphique. Tensorflow 1.13.1 a été exploré, mais il semblait qu’il avait un bug à l’époque. Il lançait plusieurs processus par processeur graphique.
En résumé :