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.