Dépannage pour les modèles parallèles - Amazon SageMaker

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.

Dépannage pour les modèles parallèles

Si vous rencontrez une erreur, vous pouvez utiliser la liste suivante pour essayer de résoudre votre tâche d'entraînement. Si le problème persiste, contactez le support AWS.

Considérations relatives à l'utilisation du SageMaker débogueur avec la bibliothèque de parallélisme de SageMaker modèles

SageMaker Le débogueur n'est pas disponible pour la bibliothèque de parallélisme du SageMaker modèle. Le débogueur est activé par défaut pour toutes les tâches SageMaker TensorFlow et les tâches de PyTorch formation, et il est possible que le message d'erreur suivant s'affiche :

FileNotFoundError: [Errno 2] No such file or directory: '/opt/ml/checkpoints/metadata.json.sagemaker-uploading

Pour résoudre ce problème, désactivez Debugger en transmettant debugger_hook_config=False lors de la création d'un cadre estimator, comme illustré dans l'exemple suivant.

bucket=sagemaker.Session().default_bucket() base_job_name="sagemaker-checkpoint-test" checkpoint_in_bucket="checkpoints" # The S3 URI to store the checkpoints checkpoint_s3_bucket="s3://{}/{}/{}".format(bucket, base_job_name, checkpoint_in_bucket) estimator = TensorFlow( ... distribution={"smdistributed": {"modelparallel": { "enabled": True }}}, checkpoint_s3_uri=checkpoint_s3_bucket, checkpoint_local_path="/opt/ml/checkpoints", debugger_hook_config=False )

Sauvegarde des points de contrôle

Vous pouvez rencontrer l'erreur suivante lorsque vous enregistrez les points de contrôle d'un modèle de grande taille sur SageMaker :

InternalServerError: We encountered an internal error. Please try again

Cela peut être dû à une SageMaker limitation lors du téléchargement du point de contrôle local sur Amazon S3 pendant l'entraînement. Pour désactiver le point de contrôle SageMaker, utilisez l'exemple suivant pour télécharger explicitement les points de contrôle.

Si vous rencontrez l'erreur précédente, ne l'utilisez pas checkpoint_s3_uri avec l' SageMaker estimatorappel. Lors de la sauvegarde des points de contrôle pour les modèles plus volumineux, nous vous recommandons de sauvegarder les points de contrôle dans un répertoire personnalisé et de les transmettre à la fonction d'assistance (en tant qu'argument local_path).

import os def aws_s3_sync(source, destination): """aws s3 sync in quiet mode and time profile""" import time, subprocess cmd = ["aws", "s3", "sync", "--quiet", source, destination] print(f"Syncing files from {source} to {destination}") start_time = time.time() p = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE) p.wait() end_time = time.time() print("Time Taken to Sync: ", (end_time-start_time)) return def sync_local_checkpoints_to_s3(local_path="/opt/ml/checkpoints", s3_uri=os.path.dirname(os.path.dirname(os.getenv('SM_MODULE_DIR', '')))+'/checkpoints'): """ sample function to sync checkpoints from local path to s3 """ import boto3 #check if local path exists if not os.path.exists(local_path): raise RuntimeError("Provided local path {local_path} does not exist. Please check") #check if s3 bucket exists s3 = boto3.resource('s3') if not s3_uri.startswith("s3://"): raise ValueError(f"Provided s3 uri {s3_uri} is not valid.") s3_bucket = s3_uri.replace('s3://','').split('/')[0] print(f"S3 Bucket: {s3_bucket}") try: s3.meta.client.head_bucket(Bucket=s3_bucket) except Exception as e: raise e aws_s3_sync(local_path, s3_uri) return def sync_s3_checkpoints_to_local(local_path="/opt/ml/checkpoints", s3_uri=os.path.dirname(os.path.dirname(os.getenv('SM_MODULE_DIR', '')))+'/checkpoints'): """ sample function to sync checkpoints from s3 to local path """ import boto3 #try to create local path if it does not exist if not os.path.exists(local_path): print(f"Provided local path {local_path} does not exist. Creating...") try: os.makedirs(local_path) except Exception as e: raise RuntimeError(f"Failed to create {local_path}") #check if s3 bucket exists s3 = boto3.resource('s3') if not s3_uri.startswith("s3://"): raise ValueError(f"Provided s3 uri {s3_uri} is not valid.") s3_bucket = s3_uri.replace('s3://','').split('/')[0] print(f"S3 Bucket: {s3_bucket}") try: s3.meta.client.head_bucket(Bucket=s3_bucket) except Exception as e: raise e aws_s3_sync(s3_uri, local_path) return

Utilisation des fonctions d'assistance :

#base_s3_uri - user input s3 uri or save to model directory (default) #curr_host - to save checkpoints of current host #iteration - current step/epoch during which checkpoint is saved # save checkpoints on every node using local_rank if smp.local_rank() == 0: base_s3_uri = os.path.dirname(os.path.dirname(os.getenv('SM_MODULE_DIR', ''))) curr_host = os.environ['SM_CURRENT_HOST'] full_s3_uri = f'{base_s3_uri}/checkpoints/{curr_host}/{iteration}' sync_local_checkpoints_to_s3(local_path=checkpoint_dir, s3_uri=full_s3_uri)

Convergence à l'aide du modèle parallèle et TensorFlow

Lorsque vous utilisez l'entraînement SageMaker multi-nœuds avec TensorFlow la bibliothèque de parallélisme du modèle, la perte risque de ne pas converger comme prévu car l'ordre des fichiers d'entrée d'entraînement peut être différent sur chaque nœud. Certains rangs différents du même groupe de modèles parallèles peuvent alors travailler sur différents fichiers d'entrée, ce qui provoque des incohérences. Pour éviter cela, assurez-vous que les fichiers d'entrée sont ordonnés de la même manière dans tous les rangs avant qu'ils ne soient convertis en TensorFlow ensembles de données. Une façon d'y parvenir consiste à trier les noms de fichiers d'entrée dans le script d'entraînement.

Ralentissement ou plantage des tâches d'entraînement distribuée

Si votre tâche d'entraînement présente un ralentissement, un plantage ou ne répond pas, lisez les éléments de dépannage suivants pour identifier la cause du problème. Si vous avez besoin d'une assistance supplémentaire, contactez l'équipe de formation SageMaker distribuée via le AWS support.

  • Si vous voyez une tâche d'entraînement distribuée qui ralentit à l'étape d'initialisation de la NCCL, considérez ce qui suit :

    • Si vous utilisez l'une des instances compatibles EFA (ml.p4d ou ml.p3dn) avec un VPC personnalisé et son sous-réseau, assurez-vous que le groupe de sécurité utilisé dispose de connexions entrantes et sortantes pour tous les ports vers et depuis le même SG. En règle générale, vous avez également besoin de connexions sortantes à n'importe quelle adresse IP en tant que règle distincte (pour l'accès Internet). Pour obtenir des instructions sur la façon d'ajouter des règles entrantes et sortantes pour la communication de l'EPT, consultez SageMaker blocage de la tâche de formation distribuée lors de l'initialisation.

  • Si vous voyez une tâche d'entraînement distribuée qui ralentit lors du pointage du modèle complet, c'est peut-être parce que l'appel state_dict() sur le modèle ou l'optimiseur n'a pas été fait dans tous les rangs avec rdp_rank()==0 (lors de l'utilisation du parallélisme de tenseur) ou dp_rank()==0 (lorsque vous utilisez uniquement le parallélisme de pipeline). Ces grades doivent communiquer pour construire le point de contrôle à sauvegarder. Des problèmes de blocage similaires peuvent également survenir lors de l'optimisation partielle du point de contrôle si shard_optimizer_state est activé.

    Pour en savoir plus sur la création de points de contrôle d'un modèle avec parallélisme, consultez la section General Instruction for Saving and Loading et Vérification d'un PyTorch modèle distribué (pour la bibliothèque de parallélisme des SageMaker modèles entre v1.6.0 et v1.9.0).

  • Si le travail de formation tombe en panne avec une erreur de mémoire insuffisante CUDA, cela signifie que la configuration de formation distribuée doit être ajustée pour s'adapter au modèle sur le cluster GPU. Pour de plus amples informations et de bonnes pratiques, veuillez consulter Installation de la bonne configuration pour un modèle donné.

  • Si la tâche d'entraînement tombe en panne avec une erreur ECCnon corrigeable, cela signifie que l'un des GPU du cluster a mal tourné. Si vous avez besoin d'une assistance technique, partagez l'ARN de la tâche avec l'équipe AWS et redémarrez votre tâche d'entraînement à partir d'un point de contrôle si possible.

  • Dans de rares cas, une configuration de tâche qui fonctionnait auparavant mais qui est proche des limites de la mémoire GPU peut échouer ultérieurement avec un cluster différent en raison d'une erreur de mémoire insuffisante CUDA. Cela peut être dû au fait que certains GPU ont une mémoire disponible plus faible que d'habitude en raison d'erreurs ECC.

  • Un délai d'expiration du réseau peut se produire lors de l'exécution d'une tâche multinode qui n'utilise pas tous les GPU du nœud. Pour contourner ce problème, utilisez tous les GPU du nœud en veillant à ce que processes_per_host est défini sur le nombre de GPU dans chaque instance. Par exemple, il s'agit de processes_per_host=8 pour les instances ml.p3.16xlarge, ml.p3dn.24xlarge, et ml.p4d.24xlarge.

  • Si vous constatez que votre tâche de formation prend beaucoup de temps pendant la phase de téléchargement des données, assurez-vous que le chemin Amazon S3 que vous avez indiqué checkpoint_s3_uri pour le SageMaker Estimator cours est unique pour le poste de formation en cours. Si ce chemin est réutilisé dans plusieurs tâches d'entraînement exécutées simultanément, tous ces points de contrôle sont téléchargés et téléchargés sur le même chemin Amazon S3 et peuvent augmenter considérablement le temps de chargement des points de contrôle.

  • Utilisez FSx for Lustre lorsque vous gérez des données et des modèles volumineux.

    • Si votre jeu de données est volumineux et que l'extraction prend beaucoup de temps, nous vous recommandons de conserver votre jeu de données dans FSx for Lustre.

    • Lorsque les modèles d'entraînement dépassent 10 milliards de paramètres, nous vous recommandons d'utiliser FSx for Lustre pour le pointage.

    • Une fois que vous avez créé un système de fichiers, veillez à attendre que le statut devienne disponible avant de démarrer une tâche d'entraînement pour l'utiliser.

Réception d'une erreur NCCL pour un job de formation PyTorch

Si vous avez rencontré l'erreur suivante, cela peut être dû à un processus à court de mémoire GPU.

NCCL error in: ../torch/lib/c10d/ProcessGroupNCCL.cpp:825, unhandled system error, NCCL version 2.7.8 ncclSystemError: System call (socket, malloc, munmap, etc) failed.

Vous pouvez résoudre ce problème en réduisant la taille du lot ou active_microbatches. Si le partitionnement automatique n'entraîne pas un partitionnement équilibré, vous devrez peut-être envisager un partitionnement manuel. Pour de plus amples informations, veuillez consulter Parallélisme de pipeline entre nœuds.

Reçu RecursionError pour un poste PyTorch de formation

La bibliothèque ne prend pas en charge les appels super.forward() dans l'appel indirect d'un module. Si vous utilisez super.forward(), vous risquez de recevoir le message d'erreur suivant.

RecursionError: maximum recursion depth exceeded

Pour corriger l'erreur, au lieu d'appeler super.forward(), vous devez appeler super()._orig_forward().