Entraînement distribué de modèles Deep Learning sur Azure

Stockage Blob
Container Registry
Machine Learning

Cette architecture de référence montre comment effectué un entraînement distribué de modèles Deep Learning sur plusieurs clusters de machines virtuelles compatibles GPU. Le scénario est une classification d’images, mais la solution peut être généralisée à d’autres scénarios de Deep Learning, tels que la segmentation ou la détection d’objet.

Une implémentation de référence pour cette architecture est disponible sur GitHub.

Architecture

Diagramme d’architecture montrant le Deep Learning distribué.

Téléchargez un fichier Visio de cette architecture.

Workflow

Cette architecture se compose des services suivants :

La capacité de calcul Azure Machine Learning joue le rôle central dans cette architecture en effectuant des opérations de mise à l’échelle de ressources en fonction des besoins. Capacité de calcul Azure Machine Learning est un service qui permet d’approvisionner et de gérer des clusters de machines virtuelles, de planifier des travaux, de collecter des résultats, de mettre à l’échelle des ressources et de gérer les défaillances. Il prend en charge les machines virtuelles compatibles GPU pour les charges de travail de Deep Learning.

Le service Stockage Blob Standard est utilisé pour stocker les journaux et les résultats. Le service Stockage Blob Premium est utilisé pour stocker les données d’apprentissage et est monté dans les nœuds du cluster d’apprentissage à l’aide de l’adaptateur blobfuse. Le niveau Premium du service Stockage Blob offre de meilleures performances que le niveau Standard et est recommandé pour les scénarios d’apprentissage distribué. Lors du montage à l’aide de l’adaptateur blobfuse, pendant la première époque, les données d’apprentissage sont téléchargées sur les disques locaux du cluster d’apprentissage et mises en cache. Pour chaque époque suivante, les données sont lues à partir des disques locaux, ce qui constitue l’option la plus performante.

Azure Container Registry est utilisé pour stocker l’image Docker que le service Capacité de calcul Azure Machine Learning utilise afin d’effectuer l’apprentissage.

Composants

  • Azure Machine Learning est une plateforme ouverte permettant de gérer le développement et le déploiement de modèles Machine Learning à grande échelle. La plateforme prend en charge les infrastructures ouvertes les plus courantes et propose une sélection automatisée d’ingénierie de caractéristiques et des algorithmes. Vous pouvez utiliser Azure Machine Learning pour déployer des modèles sur différentes cibles, comme Azure Container Instances.
  • Stockage Blob Azure est un service qui fait partie de Stockage Azure. Stockage Blob offre un stockage d’objets cloud optimisé destiné à d’importants volumes de données non structurées.
  • Container Registry est un service de registre privé basé sur le cloud. Vous pouvez utiliser Container Registry pour stocker et gérer des images conteneur Docker privées et les artefacts associés.

Détails du scénario

Scénario : Classifier des images est une technique largement appliquée dans la vision par ordinateur et souvent traitée par l’entraînement d’un réseau neuronal convolutif (CNN). Pour les modèles particulièrement grands avec des jeux de données volumineux, le processus d’entraînement peut prendre plusieurs semaines ou mois sur un seul GPU. Dans certains cas, les modèles sont tellement grands qu’il n’est pas possible d’ajuster des tailles de lot raisonnables sur le GPU. L’utilisation de l’entraînement distribué peut alors raccourcir la durée d’entraînement.

Dans ce scénario précis, un modèle CNN ResNet50 est entraîné avec Horovod sur le jeu de données ImageNet et des données synthétiques. L’implémentation de référence montre comment accomplir cette tâche à l’aide de TensorFlow.

Différentes méthodes sont disponibles pour procéder à un apprentissage distribué de modèles Deep Learning, comme les approches à parallélisme de données et à parallélisme de modèle s’appuyant sur des mises à jour synchrones ou asynchrones. Actuellement, le scénario le plus courant est l’entraînement à parallélisme de données avec mises à jour synchrones. Cette approche est la plus facile à implémenter et est suffisante pour la plupart des cas d’usage.

Dans l’entraînement distribué à parallélisme de données avec mises à jour synchrones, le modèle est répliqué sur n appareils. Un mini-lot d’exemples d’entraînement est divisé en n micro-lots. Chaque appareil effectue des propagations vers l’avant et vers l’arrière pour un micro-lot. Quand un appareil a terminé le traitement, il partage les mises à jour avec les autres appareils. Ces valeurs sont utilisées pour calculer les pondérations mises à jour de tout le mini-lot, et ces pondérations sont synchronisées entre les modèles. Ce scénario est décrit dans le référentiel GitHub associé.

Entraînement distribué à parallélisme de données.

Cette architecture peut également servir pour le parallélisme de modèle et les mises à jour asynchrones. Dans l’entraînement distribué à parallélisme de modèle, le modèle est divisé entre n appareils, chaque appareil détenant une partie du modèle. Dans le cadre de l’implémentation la plus simple, chaque appareil contient une couche du réseau, et les informations sont transmises entre les appareils pendant les propagations vers l’avant et vers l’arrière. L’apprentissage des réseaux neuronaux de plus grande taille peut être effectué de cette façon, mais au détriment des performances, car les appareils s’attendent les uns les autres continuellement pour effectuer la propagation vers l’avant ou vers l’arrière. Certaines techniques avancées tentent de pallier partiellement ce problème au moyen de gradients synthétiques.

Les étapes de l’entraînement sont les suivantes :

  1. Créez des scripts destinés à s’exécuter sur le cluster et à effectuer l’apprentissage de votre modèle.
  2. Écrivez des données d’apprentissage dans le service Stockage Blob.
  3. Créez un espace de travail Machine Learning. Cette étape crée également une instance de Container Registry pour héberger vos images Docker.
  4. Créez un cluster Machine Learning avec GPU.
  5. Envoyez des travaux d’entraînement. Pour chaque travail avec des dépendances uniques, une nouvelle image Docker est générée et envoyée à votre registre de conteneurs. Pendant l’exécution, l’image Docker appropriée est exploitée et exécute votre script.
  6. Tous les résultats et journaux sont écrits dans le service Stockage Blob.

Considérations relatives aux clusters d’entraînement

Azure fournit différents types de machines virtuelles avec GPU adaptées à l’apprentissage des modèles Deep Learning. En termes de prix et de vitesse, elles varient de la plus faible à la plus élevée comme suit :

Série Machines virtuelles Azure GPU NVIDIA
NC K80
NDs P40
NCsv2 P100
NCsv3 V100
NDv2 8x V100 (NVLink)
ND A100 v4 8x A100 (NVLink)

Nous recommandons d’effectuer un scale-up de votre apprentissage avant de procéder à un scale-out. Par exemple, essayez un seul V100 avant d’opter pour un cluster de K80. De même, utilisez une seule NDv2 plutôt que huit machines virtuelles NCsv3.

Le graphique suivant montre les différences de performance entre différents types de GPU, selon les tests d’évaluation effectués avec TensorFlow et Horovod. Le graphique renseigne sur le débit de 32 clusters GPU, dans divers modèles, sur des versions MPI et des types de GPU différents. Les modèles ont été implémentés dans TensorFlow 1.9

Débits des modèles TensorFlow sur les clusters GPU.

Chaque série de machines virtuelles affichée dans le précédent tableau comprend une configuration avec InfiniBand. Utilisez les configurations InfiniBand lors de l’exécution de l’entraînement distribué pour accélérer la communication entre les nœuds. InfiniBand augmente également l’efficacité de la mise à l’échelle de l’entraînement pour les frameworks qui peuvent en tirer parti. Pour plus d’informations, consultez la comparaison des tests d’évaluation Infiniband.

Considérations

Ces considérations implémentent les piliers d’Azure Well-Architected Framework, un ensemble de principes directeurs que vous pouvez utiliser pour améliorer la qualité d’une charge de travail. Pour plus d'informations, consultez Microsoft Azure Well-Architected Framework.

Stockage

Lors de l’apprentissage de modèles Deep Learning, l’emplacement de stockage des données d’apprentissage est un aspect souvent négligé. Si le stockage est trop lent pour répondre aux exigences des GPU, les performances d’entraînement peuvent se détériorer.

La capacité de calcul Azure Machine Learning prend en charge de nombreuses options de stockage. Pour des performances optimales, téléchargez les données localement sur chaque nœud. Ce processus peut toutefois s’avérer fastidieux, car vous devez télécharger les données sur chacun des nœuds à partir du service Stockage Blob. Avec le jeu de données ImageNet, ce processus peut prendre beaucoup de temps. Par défaut, Machine Learning monte le stockage de sorte qu’il mette les données en cache localement. Par conséquent, en pratique, après la première époque, les données sont lues à partir du stockage local. Combiné avec le niveau de Stockage Blob Premium, cet arrangement offre un bon compromis entre facilité d’utilisation et performances.

Bien que le service Capacité de calcul Azure Machine Learning puisse monter le niveau de Stockage Blob Standard à l’aide de l’adaptateur blobfuse, nous vous déconseillons d’utiliser le niveau Standard pour l’apprentissage distribué, car les performances ne sont généralement pas suffisantes pour gérer le débit nécessaire. Utilisez le niveau Premium pour le stockage des données d’apprentissage, comme indiqué précédemment sur le diagramme d’architecture. Consultez le billet de blog Stockage d’objets blob de blocs Premium : un nouveau niveau de performances pour une comparaison du débit et de la latence entre les deux niveaux.

Container Registry

Chaque fois qu’un espace de travail Machine Learning est approvisionné, un ensemble de ressources dépendantes (Stockage Blob, Key Vault, Container Registry et Application Insights) est également approvisionné. Vous pouvez également utiliser des ressources Azure existantes et les associer au nouvel espace de travail Machine Learning lors de sa création.

Par défaut, le niveau Container Registry De base est approvisionné. Pour le Deep Learning à grande échelle, nous vous recommandons de personnaliser votre espace de travail afin d’utiliser le niveau Container Registry Premium. Ce niveau offre une bande passante nettement supérieure qui vous permet d’extraire rapidement des images Docker sur les nœuds de votre cluster d’apprentissage.

Format de données

Avec les jeux de données volumineux, il est souvent recommandé d’utiliser des formats de données comme TFRecords ou Petastorm qui offrent de meilleures performances d’E/S que plusieurs petits fichiers image.

Sécurité

La sécurité fournit des garanties contre les attaques délibérées, et contre l’utilisation abusive de vos données et systèmes importants. Pour plus d’informations, consultez Vue d’ensemble du pilier Sécurité.

Utiliser un espace de travail HBI (High Business Impact)

Dans les scénarios qui utilisent des données sensibles, pensez à désigner un espace de travail Machine Learning comme espace de travail HBI (High Business Impact) en définissant un indicateur hbi_workspace sur true lors de sa création. Un espace de travail HBI permet, entre autres, de chiffrer les disques de travail locaux des clusters de calcul, d’activer le filtrage IP et de réduire la quantité de données de diagnostic collectées par Microsoft. Pour plus d’informations, consultez Chiffrement de données avec Azure Machine Learning.

Chiffrer les données au repos ou en déplacement

Chiffrez les données sensibles au repos, à savoir, dans le stockage blob. Chaque fois que des données se déplacent d’un emplacement à l’autre, utilisez SSL pour sécuriser leur transfert. Pour plus d’informations, consultez le guide de sécurité Stockage Azure.

Protéger les données dans un réseau virtuel

Pour les déploiements de production, envisagez de déployer le cluster Machine Learning dans un sous-réseau d’un réseau virtuel que vous spécifiez. Grâce à cette configuration, les nœuds de calcul du cluster peuvent communiquer en toute sécurité avec d’autres machines virtuelles ou avec un réseau local. Vous pouvez également utiliser des points de terminaison de service ou privés pour toutes les ressources associées afin d’accorder l’accès à partir d’un réseau virtuel.

Optimisation des coûts

L’optimisation des coûts consiste à examiner les moyens de réduire les dépenses inutiles et d’améliorer l’efficacité opérationnelle. Pour plus d’informations, consultez Vue d’ensemble du pilier d’optimisation des coûts.

Utilisez la calculatrice de prix Azure pour estimer le coût d’exécution de votre charge de travail Deep Learning. Pour les considérations relatives à la planification et à la gestion des coûts propres au Machine Learning, consultez Planifier la gestion des coûts pour Azure Machine Learning. Pour plus d’informations, consultez Vue d’ensemble du pilier d’optimisation des coûts.

Stockage Blob Premium

Le service Stockage Blob Premium présente un coût de stockage des données élevé, mais le coût des transactions est inférieur au coût de stockage des données du niveau chaud du service Stockage Blob Standard. Ainsi, le service Stockage Blob Premium peut être moins onéreux pour les charges de travail présentant des taux de transactions élevés. Pour plus d’informations, consultez Stockage Blob Azure - Tarifs.

Container Registry

Container Registry propose les niveaux suivants : De base, Standard et Premium. Choisissez un niveau en fonction du stockage dont vous avez besoin. Choisissez Premium si vous avez besoin de la géo-réplication ou si vous avez amélioré le débit pour les Docker pulls sur les nœuds simultanés. En outre, des frais de mise en réseau standard s’appliquent. Pour plus d’informations, consultez la tarification Azure Container Registry.

Capacité de calcul Azure Machine Learning

Dans cette architecture, le service Capacité de calcul Azure Machine Learning est probablement le principal facteur de coût. L’implémentation a besoin d’un cluster de nœuds de calcul GPU. Le prix de ces nœuds dépend de leur nombre et de la taille de la machine virtuelle que vous sélectionnez. Pour plus d’informations sur les tailles de machines virtuelles qui incluent des GPU, consultez Tailles de machines virtuelles à GPU optimisé et Tarification des machines virtuelles Azure.

En règle générale, les charges de travail Deep Learning suivent la progression après chaque époque ou après un certain nombre d’époques. Cette pratique limite l’impact des interruptions inattendues de l’apprentissage. Vous pouvez associer cette pratique à l’utilisation de machines virtuelles basse priorité pour les clusters de calcul Machine Learning. Les machines virtuelles basse priorité utilisent la capacité excédentaire d’Azure à des tarifs considérablement réduits, mais elles peuvent être préemptées si les demandes de capacité augmentent.

Excellence opérationnelle

L’excellence opérationnelle couvre les processus d’exploitation qui déploient une application et maintiennent son fonctionnement en production. Pour plus d’informations, consultez Vue d’ensemble du pilier Excellence opérationnelle.

Pendant que vous exécutez votre tâche, il est important de superviser la progression et de vérifier que tout fonctionne comme prévu. Cependant, superviser un cluster de nœuds actifs peut s’avérer ardu.

Machine Learning offre de nombreuses façons d’instrumenter vos expériences. Les flux stdout et stderr de vos scripts sont automatiquement consignés dans des journaux. Ces journaux sont automatiquement synchronisés avec le stockage blob de votre espace de travail. Vous pouvez afficher ces fichiers via le Portail Azure, ou les télécharger ou les diffuser en continu à l’aide du kit de développement logiciel (SDK) Python ou de l’interface CLI de Machine Learning. Si vous consignez vos expériences dans des journaux à l’aide de Tensorboard, ces journaux sont automatiquement synchronisés. Vous pouvez y accéder directement ou utiliser le kit de développement logiciel (SDK) Machine Learning pour les diffuser dans une session Tensorboard.

Efficacité des performances

L’efficacité des performances est la capacité de votre charge de travail à s’adapter à la demande des utilisateurs de façon efficace. Pour plus d’informations, consultez Vue d’ensemble du pilier d’efficacité des performances.

L’efficacité de la mise à l’échelle de l’apprentissage distribué est toujours inférieure à 100 % en raison de la charge réseau ; la synchronisation de l’ensemble du modèle entre les appareils se transforme en goulot d’étranglement. Par conséquent, l’apprentissage distribué convient davantage à ce qui suit :

  • Grands modèles dont l’apprentissage ne peut pas être effectué à l’aide d’une taille de lot raisonnable sur un seul GPU.
  • Problèmes qui ne peuvent pas être résolus en distribuant le modèle de manière simple et parallèle.

L’apprentissage distribué n’est pas recommandé pour effectuer des recherches d’hyperparamètres. L’efficacité de la mise à l’échelle a une incidence sur les performances, et rend l’approche distribuée moins efficace que l’entraînement de plusieurs configurations de modèle séparément.

Une solution permettant d’augmenter l’efficacité de la mise à l’échelle consiste à accroître la taille de lot. Cette modification doit toutefois être effectuée avec précaution. L’augmentation de la taille de lot sans modifier les autres paramètres peut nuire aux performances finales du modèle.

Déployer ce scénario

L’implémentation de référence de cette architecture est disponible sur GitHub. Suivez les étapes qui y sont décrites pour effectuer un entraînement distribué de modèles Deep Learning sur les clusters de machines virtuelles compatibles GPU.

Contributeurs

Cet article est géré par Microsoft. Il a été écrit à l’origine par les contributeurs suivants.

Auteurs principaux :

Pour afficher les profils LinkedIn non publics, connectez-vous à LinkedIn.

Étapes suivantes

La sortie de cette architecture est un modèle formé qui est enregistré dans un stockage blob. Vous pouvez faire fonctionner ce modèle pour le scoring en temps réel ou le scoring par lots. Pour en savoir plus, consultez les architectures de référence suivantes :

Pour accéder à des architectures qui impliquent un apprentissage distribué ou du Deep Learning, consultez les ressources suivantes :