Les traductions sont fournies par des outils de traduction automatique. En cas de conflit entre le contenu d'une traduction et celui de la version originale en anglais, la version anglaise prévaudra.
Bonnes pratiques d’informatique distribuée avec SageMaker AI
Cette page de bonnes pratiques présente différentes variantes de l'informatique distribuée pour les tâches générales de machine learning (ML). Le terme informatique distribuée utilisé dans cette page englobe l'entraînement distribué pour les tâches de machine learning et le calcul parallèle pour le traitement des données, la génération de données, l'ingénierie des fonctionnalités et l'apprentissage par renforcement. Dans cette page, nous abordons les défis courants de l'informatique distribuée et les options disponibles dans l'entraînement SageMaker et le traitement SageMaker. Pour des documents de lecture supplémentaires sur l'informatique distribuée, consultez Qu'est-ce que l'informatique distribuée ?
Vous pouvez configurer les tâches de machine learning pour qu'elles s'exécutent de manière distribuée sur plusieurs nœuds (instances), accélérateurs (GPU NVIDIA, puces AWS Trainium) et cœurs vCPU. En exécutant l'informatique distribuée, vous pouvez atteindre divers objectifs tels que l'accélération des opérations de calcul, la gestion de grands jeux de données ou l'entraînement de grands modèles de machine learning.
La liste suivante décrit les défis courants auxquels vous pouvez être confronté lorsque vous exécutez un projet d'entraînement de machine learning à grande échelle.
-
Vous devez prendre des décisions sur la manière de répartir les calculs en fonction des tâches de machine learning, des bibliothèques logicielles que vous souhaitez utiliser et des ressources de calcul.
-
Les tâches de machine learning ne sont pas toutes simples à distribuer. De plus, toutes les bibliothèques de machine learning ne prennent pas en charge l'informatique distribuée.
-
L'informatique distribuée n'entraîne pas toujours une augmentation linéaire de l'efficacité du calcul. En particulier, vous devez déterminer si les E/S de données et les communications entre GPU présentent des goulots d'étranglement ou entraînent des surcharges.
-
L'informatique distribuée peut perturber les processus numériques et modifier la précision du modèle. En ce qui concerne l'entraînement des réseaux neuronaux de parallélisme de données, lorsque vous mettez à l'échelle la taille globale du lot tout en passant à un cluster de calcul plus important, vous devez également ajuster le taux d'apprentissage en conséquence.
SageMaker propose des solutions d’entraînement distribué pour relever ces défis dans différents cas d’utilisation. Choisissez l'option, parmi les suivantes, la mieux adaptée à votre cas d'utilisation.
Rubriques
Option 1 : utiliser un algorithme intégré à SageMaker AI qui prend en charge l’entraînement distribué
SageMaker AI fournit des algorithmes intégrés que vous pouvez utiliser immédiatement via la console SageMaker AI ou le kit SageMaker Python SDK. Grâce aux algorithmes intégrés, vous n'avez pas besoin de perdre du temps à personnaliser le code, à comprendre la science qui sous-tend les modèles ou à exécuter Docker sur des instances Amazon EC2 provisionnées.
Un sous-ensemble des algorithmes intégrés à SageMaker AI prend en charge l’entraînement distribué. Pour vérifier si l'algorithme de votre choix prend en charge l'entraînement distribué, consultez la colonne Parallélisable du tableau Informations communes aux algorithmes intégrés. Certains algorithmes prennent en charge l'entraînement distribué multi-instances, tandis que les autres algorithmes parallélisables prennent en charge la parallélisation sur plusieurs GPU dans une seule instance, comme indiqué dans la colonne Parallélisable.
Option 2 : exécuter un code de machine learning personnalisé dans l’environnement d’entraînement ou de traitement géré par SageMaker AI
Les tâches SageMaker AI peuvent instancier un environnement d’entraînement distribué pour des cas d’utilisation et des cadres spécifiques. Cet environnement agit comme un tableau blanc prêt à l'emploi, où vous pouvez apporter et exécuter votre propre code de machine learning.
Si votre code de machine learning utilise un framework de deep learning
Vous pouvez lancer des tâches d’entraînement distribué à l’aide des conteneurs de deep learning (DLC)
-
Bibliothèques d’entraînement distribué SageMaker AI
Les bibliothèques d’entraînement distribué SageMaker AI proposent un code géré par AWS pour le parallélisme des données des réseaux neuronaux et le parallélisme des modèles. L’entraînement distribué SageMaker AI est également fourni avec des clients lanceurs intégrés au kit SageMaker Python SDK et vous n’avez pas besoin de créer de code de lancement parallèle. Pour en savoir plus, consultez la bibliothèque SageMaker AI de parallélisme des données et la bibliothèque SageMaker AI de parallélisme des modèles.
-
Bibliothèques d'entraînement distribué open source
Les frameworks open source ont leurs propres mécanismes de distribution tels que DistributedDataParallelism(DDP) dans PyTorch
ou les modules tf.distributedans TensorFlow. Vous pouvez choisir d’exécuter ces cadres d’entraînement distribués dans les conteneurs de cadres gérés par SageMaker AI. Par exemple, l’exemple de code pour l’entraînement de MaskRCNN dans SageMaker AImontre comment utiliser à la fois PyTorch DDP dans le conteneur du cadre SageMaker PyTorch et Horovod dans le conteneur du cadre SageMaker TensorFlow.
Les conteneurs SageMaker AI de machine learning sont également fournis avec MPI
Notes relatives à l'entraînement des réseaux neuronaux de parallélisme de données sur les GPU
-
Mise à l'échelle du parallélisme multi-GPU et multi-machines, le cas échéant
Nous exécutons souvent des tâches d'entraînement de réseaux neuronaux sur des instances à CPU multiples ou à GPU multiples. Chaque instance basée sur un GPU contient généralement plusieurs dispositifs GPU. Par conséquent, le calcul GPU distribué peut se faire soit au sein d'une seule instance de GPU avec plusieurs GPU (entraînement multi-GPU à nœud unique), soit au sein de plusieurs instances de GPU avec plusieurs cœurs de GPU chacune (entraînement multi-GPU à plusieurs nœuds). Il est plus facile d'écrire du code et de débogueur l'entraînement à instance unique et le débit GPU à GPU intra-nœud est généralement plus rapide que le débit GPU à GPU inter-nœuds. Par conséquent, il est conseillé de mettre à l'échelle d'abord le parallélisme de données verticalement (utilisez une seule instance de GPU avec plusieurs GPU) et de l'étendre à plusieurs instances de GPU si nécessaire. Cela peut ne pas s'appliquer aux cas où le budget du CPU est élevé (par exemple, une charge de travail importante pour le prétraitement des données) et lorsque le ratio CPU à GPU d'une instance multi-GPU est trop faible. Dans tous les cas, vous devez expérimenter différentes combinaisons de types d'instances en fonction de vos propres besoins d'entraînement au machine learning et de votre charge de travail.
-
Surveillance de la qualité de la convergence
Lors de l'entraînement d'un réseau neuronal avec le parallélisme de données, l'augmentation du nombre de GPU tout conservant la taille du mini-lot par GPU entraîne une augmentation de la taille du mini-lot global pour le processus de descente de gradient stochastique (MSGD) par mini-lots. La taille des mini-lots dans le cadre du MSGD est connue pour avoir un impact sur le bruit de descente et la convergence. Pour une mise à l'échelle correcte tout en préservant la précision, vous devez ajuster d'autres hyperparamètres tels que le taux d'apprentissage [Goyal et al.
(2017)]. -
Surveillance des goulots d'étranglement des E/S
À mesure que vous augmentez le nombre de GPU, le débit de stockage de lecture et d'écriture doit également augmenter. Assurez-vous que votre source de données et votre pipeline ne deviennent pas des goulots d'étranglement.
-
Modification de votre script d'entraînement selon vos besoins
Les scripts d'entraînement écrits pour l'entraînement à un seul GPU doivent être modifiés pour un entraînement multi-GPU à plusieurs nœuds. Dans la plupart des bibliothèques de parallélisme de données, la modification des scripts est nécessaire pour effectuer les opérations suivantes.
-
Attribuez des lots de données d'entraînement à chaque GPU.
-
Utilisez un optimiseur capable de gérer le calcul du gradient et les mises à jour des paramètres sur plusieurs GPU.
-
Attribuez la responsabilité du point de contrôle à un hôte et à un GPU spécifiques.
-
Si votre code de machine learning implique un traitement de données tabulaire
PySpark est une frontend Python d'Apache Spark, un framework d'informatique distribuée open source. PySpark a été largement adopté pour le traitement de données tabulaires distribuées pour les charges de travail de production à grande échelle. Si vous souhaitez exécuter du code tabulaire pour le traitement des données, pensez à utiliser les conteneurs PySpark de traitement SageMaker et à exécuter des tâches parallèles. Vous pouvez également exécuter des tâches de traitement des données en parallèle à l’aide des API d’entraînement SageMaker et de traitement SageMaker dans Amazon SageMaker Studio Classic, qui est intégré à Amazon EMR
Option 3 : écrire votre propre code d'entraînement distribué personnalisé
Lorsque vous soumettez une tâche d’entraînement ou de traitement à SageMaker AI, les API d’entraînement SageMaker et de traitement SageMaker AI lancent des instances de calcul Amazon EC2. Vous pouvez personnaliser l'environnement d'entraînement et de traitement dans les instances en exécutant votre propre conteneur Docker ou en installant des bibliothèques supplémentaires dans les conteneurs gérés par AWS. Pour plus d’informations sur Docker avec l’entraînement SageMaker, consultez Adaptation de votre propre conteneur Docker pour utiliser SageMaker AI et Création d’un conteneur avec vos propres algorithmes et modèles. Pour plus d’informations sur Docker avec le traitement SageMaker AI, consultez Utiliser votre propre code de traitement.
L’environnement de chaque tâche d’entraînement SageMaker contient un fichier de configuration à l’adresse /opt/ml/input/config/resourceconfig.json et l’environnement de chaque tâche de traitement SageMaker contient un fichier de configuration similaire à l’adresse /opt/ml/config/resourceconfig.json. Votre code peut lire ce fichier pour trouver hostnames et établir des communications entre nœuds. Pour en savoir plus, notamment sur le schéma du fichier JSON, consultez Configuration d'entraînement distribué et Configuration de votre conteneur de traitement par Amazon SageMaker Processing. Vous pouvez également installer et utiliser des bibliothèques d’informatique distribuée tierces telles que Ray
Vous pouvez également utiliser l'entraînement SageMaker et le traitement SageMaker pour exécuter de l'informatique distribuée personnalisée qui ne nécessite aucune communication entre les utilisateurs. Dans la littérature informatique, ces tâches sont souvent décrites comme des tâches dont la simultanéité pose problèmes ou ne rien partager. Les exemples incluent le traitement parallèle de fichiers de données, l’entraînement des modèles en parallèle sur différentes configurations ou l’exécution d’une inférence par lots sur une collection d’enregistrements. Vous pouvez facilement paralléliser de tels cas d’utilisation « ne rien partager » avec Amazon SageMaker AI. Lorsque vous lancez une tâche d’entraînement ou de traitement SageMaker sur un cluster comportant plusieurs nœuds, SageMaker AI réplique et lance par défaut votre code d’entraînement (que ce soit du code Python ou une image Docker) sur tous les nœuds. Les tâches nécessitant une répartition aléatoire des données d’entrée sur de tels nœuds multiples peuvent être facilitées en configurant S3DataDistributionType=ShardedByS3Key dans la configuration de saisie des données de l’API TrainingInput SageMaker AI.
Option 4 : lancer plusieurs tâches en parallèle ou de manière séquentielle
Vous pouvez également répartir un flux de travail de calcul de machine learning en tâches de calcul parallèles ou séquentielles plus petites, chacune étant représentée par sa propre tâche d'entraînement SageMaker ou de traitement SageMaker. La division d'une tâche en plusieurs tâches peut être bénéfique dans les situations ou les tâches suivantes :
-
Lorsque vous disposez de canaux de données et d'entrées de métadonnées spécifiques (tels que les hyperparamètres, la configuration du modèle ou les types d'instance) pour chaque sous-tâche.
-
Lorsque vous implémentez des étapes de nouvelle tentative au niveau d'une sous-tâche.
-
Lorsque vous modifiez la configuration des sous-tâches au cours de la charge de travail, par exemple lors d'un entraînement sur l'augmentation de la taille des lots.
-
Lorsque vous devez exécuter une tâche de machine learning qui prend plus de temps que la durée d'entraînement maximale autorisée pour une seule tâche d'entraînement (28 jours maximum).
-
Lorsque les différentes étapes d'un flux de travail de calcul nécessitent différents types d'instances.
Dans le cas spécifique de la recherche par hyperparamètres, utilisez SageMaker AI Automated Model Tuning. SageMaker AI Automated Model Tuning est un orchestrateur de recherche de paramètres sans serveur qui lance plusieurs tâches d’entraînement en votre nom, selon une logique de recherche qui peut être aléatoire, bayésienne ou HyperBand.
En outre, pour orchestrer plusieurs tâches d’entraînement, vous pouvez également envisager des outils d’orchestration de flux de travail, tels que les pipelines SageMaker