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

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 de SageMaker Debugger avec le modèle parallèle distribué SageMaker

SageMaker Debugger n'est pas disponible pour le modèle distribué parallèle SageMaker. Debugger est activé par défaut pour toutes les tâches d'entraînement SageMaker TensorFlow et PyTorch, et une erreur semblable à la suivante peut s'afficher :

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 rencontrerez peut-être l'erreur suivante lors de la sauvegarde des points de contrôle d'un modèle volumineux sur SageMaker :

InternalServerError: We encountered an internal error. Please try again

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

Si vous rencontrez l'erreur précédente, n'utilisez pas checkpoint_s3_uri avec l'appel SageMaker estimator. 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 de TensorFlow

Lorsque vous utilisez l'entraînement à plusieurs nœuds SageMaker avec TensorFlow et le modèle parallèle distribué, la perte peut 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, veillez à ce que les fichiers d'entrée soient classés de la même façon dans tous les rangs avant d'être convertis en jeux de données TensorFlow. 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 distribuée SageMaker via le support AWS.

  • 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 Blocage de la tâche d'entraînement distribuée SageMaker pendant 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 Instructions pour l'utilisation de points de contrôle avec le parallélisme de tenseur.

  • 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 d'entraînement prend beaucoup de temps pendant la phase de téléchargement des données, assurez-vous que le chemin Amazon S3 que vous avez fourni à checkpoint_s3_uri pour la classe Estimator de SageMaker est unique pour la tâche d'entraînement actuelle. 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.

Erreur NCCL

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.