Risoluzione dei problemi del parallelismo dei modelli - Amazon SageMaker

Le traduzioni sono generate tramite traduzione automatica. In caso di conflitto tra il contenuto di una traduzione e la versione originale in Inglese, quest'ultima prevarrà.

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 SageMaker Debugger con la Model Parallelism Library SageMaker

SageMaker Debugger non è disponibile per la libreria di parallelismo dei modelli. SageMaker Il debugger è abilitato per impostazione predefinita per tutti i processi di PyTorch formazione SageMaker TensorFlow 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

Potresti riscontrare il seguente errore quando salvi i checkpoint di un modello di grandi dimensioni su: SageMaker

InternalServerError: We encountered an internal error. Please try again

Ciò potrebbe essere causato da una SageMaker limitazione durante il caricamento del checkpoint locale su Amazon S3 durante la formazione. Per disabilitare il checkpoint in SageMaker, usa il seguente esempio per caricare esplicitamente i checkpoint.

Se riscontrate l'errore precedente, non utilizzatelo con la chiamata. checkpoint_s3_uri 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 a SageMaker più nodi con TensorFlow e la libreria di parallelismo 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ò, assicuratevi 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 lavori 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 assistenza, contatta il team di formazione SageMaker distribuito tramite AWS Support.

  • 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, assicuratevi 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 SageMaker blocco del processo di formazione distribuito 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 eControllo di un PyTorch modello distribuito (per la libreria di parallelismo dei modelli tra v1.6.0 e v1.9.0 SageMaker ).

  • 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 lavoro con il AWS team e, se possibile, riavvia il processo di addestramento da un checkpoint.

  • In rari casi, una configurazione di lavoro che funzionava in precedenza ma è 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 formazione richieda molto tempo durante la fase di download dei dati, assicurati che il percorso Amazon S3 che hai fornito checkpoint_s3_uri per il SageMaker Estimator corso sia unico per il corso di formazione 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, assicuratevi di attendere che lo status diventi disponibile prima di iniziare un processo di addestramento che lo utilizzi.

Ricezione di un errore NCCL per un job di formazione 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.

Ricezione RecursionError per un PyTorch tirocinio

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

RecursionError: maximum recursion depth exceeded

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