Risoluzione dei problemi del parallelismo dei modelli - Amazon SageMaker AI

Risoluzione dei problemi del parallelismo dei modelli

Se riscontri un errore, puoi utilizzare il seguente elenco per provare a risolvere il tuo processo di addestramento. Se il problema persiste, contatta l’Assistenza AWS.

Considerazioni sull'utilizzo di Debugger SageMaker con la libreria SageMaker Model Parallelism Library

Debugger SageMaker non è disponibile per la libreria di parallelismo dei modelli SageMaker. Debugger è abilitato di default per tutti i processi di addestramento SageMaker TensorFlow e PyTorch e potresti visualizzare un errore simile al seguente:

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

Per risolvere questo problema, disabilita Debugger passando debugger_hook_config=False durante la creazione di un framework estimator, come mostrato nell'esempio seguente.

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 )

Salvataggio dei checkpoint

È possibile che durante il salvataggio dei checkpoint di un modello di grandi dimensioni su SageMaker AI si verifichi il seguente errore:

InternalServerError: We encountered an internal error. Please try again

Questo potrebbe essere causato da una limitazione di SageMaker AI durante il caricamento del checkpoint locale su Amazon S3 durante l’addestramento. Per disabilitare il checkpointing in SageMaker AI, utilizza il seguente esempio per caricare esplicitamente i checkpoint.

Se si verifica l'errore precedente, non utilizzare checkpoint_s3_uri con la chiamata SageMaker estimator. Durante il salvataggio dei checkpoint per modelli più grandi, consigliamo di salvare i checkpoint in una directory personalizzata e di passarli alla funzione di supporto (come argomento 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

Utilizzo delle funzioni di supporto:

#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)

Convergenza utilizzando Model Parallel e TensorFlow

Quando si utilizza l’addestramento multi-nodo di SageMaker AI con TensorFlow e la libreria di parallelizzazione dei modelli, la perdita potrebbe non convergere come previsto, perché l’ordine dei file di input di addestramento potrebbe essere diverso su ciascun nodo. Ciò può far sì che ranghi diversi nello stesso gruppo parallelo del modello lavorino su file di input diversi, causando incongruenze. Per evitare ciò, assicurati che i file di input siano ordinati allo stesso modo in tutti i ranghi prima che vengano convertiti in set di dati TensorFlow. Un modo per raggiungere questo obiettivo è ordinare i nomi dei file di input nello script di addestramento.

Blocco o arresto anomalo dei processi di addestramento distribuiti

Se il processo di addestramento presenta problemi di blocco, arresto anomalo o mancata risposta, leggi i seguenti articoli per la risoluzione dei problemi per identificare la causa del problema. Se hai bisogno di ulteriore supporto, contatta il team addestramento distribuito di SageMaker tramite Assistenza AWS.

  • Se vedi un processo di addestramento distribuito che si blocca durante la fase di inizializzazione NCCL, considera quanto segue:

    • Se utilizzi una delle istanze (istanze ml.p4d o ml.p3dn) abilitate per EFA con un VPC personalizzato e relativa sottorete, assicurati che il gruppo di sicurezza utilizzato disponga di connessioni in entrata e in uscita per tutte le porte da e verso lo stesso SG. In genere sono inoltre necessarie connessioni in uscita a qualsiasi IP come regola separata (per l'accesso a Internet). Per trovare istruzioni su come aggiungere regole in entrata e in uscita per le comunicazioni EFA, consulta Il job di addestramento distribuito di SageMaker AI si blocca durante l’inizializzazione.

  • Se noti che un processo di addestramento distribuito si blocca durante il checkpoint del modello completo, ciò potrebbe essere dovuto al fatto che la chiamata state_dict() al modello o all'ottimizzatore non è stata effettuata a tutti i livelli con rdp_rank()==0 (quando si utilizza il parallelismo tensoriale) o dp_rank()==0 (quando si utilizza solo il parallelismo delle pipeline). Questi livelli devono comunicare per costruire il checkpoint da salvare. Problemi di stallo simili possono verificarsi anche quando l'ottimizzatore parziale di checkpoint shard_optimizer_state è abilitato.

    Per ulteriori informazioni sul checkpoint di un modello con parallelismo del modello, vedere Istruzioni generali per il salvataggio e il caricamento eCheckpointing di un modello PyTorch distribuito (per la libreria di parallelismo del modello SageMaker tra la v1.6.0 e la v1.9.0).

  • Se il processo di addestramento si blocca con un errore CUDA Memoria esaurita, significa che la configurazione di addestramento distribuito deve essere adattata al modello sul cluster GPU. Per ulteriori informazioni e best practice, consulta Impostazione della configurazione corretta per un determinato modello.

  • Se il processo di addestramento si blocca con un errore ECC non correggibile, significa che una delle GPU del cluster è danneggiata. Se hai bisogno di supporto tecnico, condividi l'ARN del processo con il AWS team e, se possibile, riavvia il processo di addestramento da un checkpoint.

  • In rari casi, la configurazione di un processo che funzionava in precedenza ma che è vicina ai limiti della memoria della GPU potrebbe fallire in seguito con un cluster diverso a causa di un errore CUDA Memoria esaurita. Ciò potrebbe essere dovuto al fatto che alcune GPU hanno una memoria disponibile inferiore al solito a causa di errori ECC.

  • Un arresto anomalo del timeout di rete potrebbe verificarsi quando si esegue un processo multinodo che non utilizza tutte le GPU del nodo. Per ovviare a questo problema, usa tutte le GPU sul nodo assicurandoti che il parametro processes_per_host sia impostato sul numero di GPU in ogni istanza. Ad esempio, questo è processes_per_host=8 per le istanze ml.p3.16xlarge, ml.p3dn.24xlarge, e ml.p4d.24xlarge.

  • Se ritieni che il tuo processo di addestramento richieda molto tempo durante la fase di download dei dati, assicurati che il percorso Amazon S3 che hai fornito a checkpoint_s3_uri per la classe Estimator SageMaker sia unico per il processo di addestramento corrente. Se questo percorso viene riutilizzato in più processi di addestramento eseguiti contemporaneamente, tutti i checkpoint vengono caricati e scaricati sullo stesso percorso Amazon S3 e potrebbero aumentare significativamente il tempo di caricamento dei checkpoint.

  • Usa FSx for Lustre quando gestisci dati e modelli di grandi dimensioni.

    • Se il set di dati è di grandi dimensioni e il recupero richiede molto tempo, consigliamo di conservare il set di dati in FSx for Lustre.

    • Quando i modelli di addestramento superano i 10 miliardi di parametri, consigliamo di utilizzare FSx for Lustre per il checkpoint.

    • Dopo aver creato un file system, assicurati di attendere che lo status diventi disponibile prima di iniziare un processo di addestramento che lo utilizzi.

Visualizzazione di un messaggio di errore NCCL per un processo di addestramento su PyTorch

Se hai riscontrato il seguente errore, potrebbe essere dovuto a un processo che sta esaurendo la memoria della 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.

È possibile risolvere questo problema riducendo la dimensione del batch o active_microbatches. Se il partizionamento automatico non porta a un partizionamento ben bilanciato, potrebbe essere necessario prendere in considerazione il partizionamento manuale. Per ulteriori informazioni, consulta Parallelismo delle pipeline tra i nodi.

Visualizzazione di un messaggio RecursionError per un processo di addestramento su PyTorch

La libreria non supporta le chiamate super.forward() all'interno della chiamata inoltrata di un modulo. Se utilizzi super.forward(), potresti visualizzare il seguente messaggio di errore:

RecursionError: maximum recursion depth exceeded

Per correggere l'errore, invece di chiamare super.forward(), dovresti chiamare super()._orig_forward().