SageMaker Risoluzione dei problemi del Training Compiler - 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à.

SageMaker Risoluzione dei problemi del Training Compiler

Importante

Amazon Web Services (AWS) annuncia che non ci saranno nuove release o versioni di SageMaker Training Compiler. Puoi continuare a utilizzare SageMaker Training Compiler tramite gli esistenti AWS Deep Learning Containers (DLCs) for SageMaker Training. È importante notare che, sebbene gli esistenti DLCs rimangano accessibili, non riceveranno più patch o aggiornamenti da AWS, in conformità con la politica di supporto del AWS Deep Learning Containers Framework.

Se si verifica un errore, è possibile utilizzare l'elenco seguente per cercare di risolvere i problemi relativi al processo di addestramento. Se hai bisogno di ulteriore assistenza, contatta il SageMaker team tramite AWS Support o AWS Developer Forums for Amazon SageMaker.

Il processo di addestramento non converge come previsto rispetto al processo di addestramento del framework nativo

I problemi di convergenza vanno da «il modello non apprende quando SageMaker Training Compiler è acceso» a «il modello sta imparando ma è più lento del framework nativo». In questa guida alla risoluzione dei problemi, supponiamo che la convergenza vada bene senza SageMaker Training Compiler (nel framework nativo) e consideriamo questa la linea di base.

Di fronte a tali problemi di convergenza, il primo passo consiste nell'identificare se il problema è limitato alla formazione distribuita o deriva da una formazione singola. GPU La formazione distribuita con SageMaker Training Compiler è un'estensione della GPU formazione singola con passaggi aggiuntivi.

  1. Configura un cluster con più istanze oppure. GPUs

  2. Distribuire i dati di input a tutti i worker.

  3. Sincronizzare gli aggiornamenti del modello di tutti i worker.

Pertanto, qualsiasi problema di convergenza nella formazione singola si GPU ripercuote sulla formazione distribuita con più lavoratori.

Un diagramma di flusso per risolvere i problemi di convergenza nei lavori di formazione quando si utilizza Training Compiler. SageMaker

Problemi di convergenza che si verificano nella formazione singola GPU

Se il problema di convergenza deriva dall'GPUaddestramento singolo, è probabilmente dovuto a impostazioni errate degli iperparametri o del. torch_xla APIs

Controllare gli iperparametri

L'addestramento con SageMaker Training Compiler comporta una modifica dell'impronta di memoria di un modello. Il compilatore arbitra in modo intelligente tra riutilizzo e ricalcolo, determinando un corrispondente aumento o diminuzione del consumo di memoria. Per sfruttare questo vantaggio, è essenziale ottimizzare nuovamente la dimensione del batch e gli iperparametri associati durante la migrazione di un processo di formazione su Training Compiler. SageMaker Tuttavia, impostazioni errate degli iperparametri spesso causano oscillazioni nella perdita dell'addestramento e, di conseguenza, una convergenza più lenta. In rari casi, gli iperparametri aggressivi possono far sì che il modello non apprenda (la metrica della perdita di addestramento non diminuisce né restituisce NaN) Per identificare se il problema di convergenza è dovuto agli iperparametri, esegui un side-by-side test di due lavori di formazione con e senza SageMaker Training Compiler mantenendo tutti gli iperparametri uguali.

Verifica se torch_xla APIs sono configurati correttamente per la formazione singola GPU

Se il problema di convergenza persiste con gli iperparametri di base, è necessario verificare se vi è un uso improprio di torch_xlaAPIs, in particolare quelli per l'aggiornamento del modello. Fondamentalmente, torch_xla continua ad accumulare istruzioni (posticipando l'esecuzione) sotto forma di grafico fino a quando non gli viene esplicitamente richiesto di eseguire il grafico accumulato. La funzione torch_xla.core.xla_model.mark_step() facilita l'esecuzione del grafico accumulato. L'esecuzione del grafico deve essere sincronizzata utilizzando questa funzione dopo ogni aggiornamento del modello e prima di stampare e registrare qualsiasi variabile . Se manca la fase di sincronizzazione, il modello potrebbe utilizzare valori obsoleti della memoria durante le stampe, i log e i successivi passaggi in avanti, invece di utilizzare i valori più recenti che devono essere sincronizzati dopo ogni iterazione e aggiornamento del modello.

Può essere più complicato quando si utilizza SageMaker Training Compiler con tecniche di ridimensionamento del gradiente (probabilmente dovuto all'uso di) o di gradient clipping. AMP L'ordine appropriato per il calcolo del gradiente con è il seguente. AMP

  1. Calcolo del gradiente con dimensionamento

  2. Annullamento del dimensionamento del gradiente, ritaglio del gradiente e quindi dimensionamento

  3. Aggiornamento del modello

  4. Sincronizzazione dell'esecuzione del grafico con mark_step()

Per trovare quello giusto APIs per le operazioni menzionate nell'elenco, consultate la guida per la migrazione dello script di addestramento a Training Compiler. SageMaker

Prendere in considerazione l'utilizzo di Automatic Model Tuning

Se il problema di convergenza si verifica quando si ottimizza nuovamente la dimensione del batch e gli iperparametri associati, come la frequenza di apprendimento, durante l'utilizzo di SageMaker Training Compiler, prendi in considerazione l'utilizzo di Automatic Model Tuning per ottimizzare gli iperparametri. Puoi fare riferimento al taccuino di esempio sull'ottimizzazione degli iperparametri con Training Compiler. SageMaker

Problemi di convergenza che si verificano nell'addestramento distribuito

Se il problema di convergenza persiste nell'allenamento distribuito, è probabile che ciò sia dovuto a impostazioni errate per l'inizializzazione del peso o al. torch_xla APIs

Controllare l'inizializzazione del peso tra i worker

Se si verifica un problema di convergenza quando si svolge un processo di addestramento distribuito con più worker, assicurarsi che vi sia un comportamento deterministico uniforme tra tutti i worker stabilendo un ritmo costante, ove applicabile. Fare attenzione a tecniche come l'inizializzazione del peso, che prevede la randomizzazione. Ogni worker potrebbe finire per addestrare un modello diverso in assenza di un seme costante.

Verificate se torch_xla APIs sono configurate correttamente per l'allenamento distribuito

Se il problema persiste, è probabile che ciò sia dovuto all'uso improprio della torch_xla APIs formazione distribuita. Assicurati di aggiungere quanto segue nel tuo estimatore per configurare un cluster per la formazione distribuita con SageMaker Training Compiler.

distribution={'torchxla': {'enabled': True}}

Questo dovrebbe essere accompagnato da una funzione _mp_fn(index) nello script di addestramento, che viene richiamata una volta per worker. Senza la funzione mp_fn(index), si potrebbe finire per consentire a ciascuno dei worker di addestrare il modello in modo indipendente senza condividere gli aggiornamenti del modello.

Successivamente, assicuratevi di utilizzare il campionatore di dati distribuiti torch_xla.distributed.parallel_loader.MpDeviceLoader API insieme al campionatore di dati distribuiti, come indicato nella documentazione sulla migrazione dello script di formazione a SageMaker Training Compiler, come nell'esempio seguente.

torch.utils.data.distributed.DistributedSampler()

Ciò garantisce che i dati di input siano distribuiti correttamente tra tutti i worker.

Infine, per sincronizzare gli aggiornamenti dei modelli di tutti i worker, utilizzare torch_xla.core.xla_model._fetch_gradients per raccogliere i gradienti di tutti i worker e torch_xla.core.xla_model.all_reduce per combinare tutti i gradienti raccolti in un unico aggiornamento.

Può essere più complicato quando si utilizza SageMaker Training Compiler con tecniche di ridimensionamento del gradiente (probabilmente dovuto all'uso di) o di gradient clipping. AMP L'ordine appropriato per il calcolo del gradiente con è il seguente. AMP

  1. Calcolo del gradiente con dimensionamento

  2. Sincronizzazione del gradiente tra tutti i worker

  3. Annullamento del dimensionamento del gradiente, ritaglio del gradiente e quindi dimensionamento

  4. Aggiornamento del modello

  5. Sincronizzazione dell'esecuzione del grafico con mark_step()

Si noti che questa lista di controllo contiene un elemento aggiuntivo per la sincronizzazione di tutti i lavoratori, rispetto alla lista di controllo per la formazione singola. GPU

Il processo di formazione non riesce a causa della mancata configurazione/ PyTorchXLA

Se un processo di formazione non riesce con il messaggio di Missing XLA configuration errore, potrebbe essere dovuto a un'errata configurazione del numero di istanze GPUs utilizzate.

XLArichiede variabili di ambiente aggiuntive per compilare il processo di formazione. La variabile di ambiente mancante più comune è GPU_NUM_DEVICES. Affinché il compilatore funzioni correttamente, è necessario impostare questa variabile di ambiente uguale al numero di GPUs per istanza.

Esistono tre approcci per impostare la variabile di ambiente GPU_NUM_DEVICES:

  • Approccio 1: utilizzare l'environmentargomento della classe SageMaker estimator. Ad esempio, se utilizzate un'ml.p3.8xlargeistanza che ne ha quattroGPUs, effettuate le seguenti operazioni:

    # Using the SageMaker Python SDK's HuggingFace estimator hf_estimator=HuggingFace( ... instance_type="ml.p3.8xlarge", hyperparameters={...}, environment={ ... "GPU_NUM_DEVICES": "4" # corresponds to number of GPUs on the specified instance }, )
  • Approccio 2: utilizzate l'hyperparametersargomento della classe SageMaker estimator e analizzatelo nel vostro script di addestramento.

    1. Per specificare il numero diGPUs, aggiungete una coppia chiave-valore all'argomento. hyperparameters

      Ad esempio, se utilizzi un'ml.p3.8xlargeistanza con quattroGPUs, procedi come segue:

      # Using the SageMaker Python SDK's HuggingFace estimator hf_estimator=HuggingFace( ... entry_point = "train.py" instance_type= "ml.p3.8xlarge", hyperparameters = { ... "n_gpus": 4 # corresponds to number of GPUs on specified instance } ) hf_estimator.fit()
    2. Nello script di addestramento, analizzare l'iperparametro n_gpus e specificarlo come input per la variabile di ambiente GPU_NUM_DEVICES.

      # train.py import os, argparse if __name__ == "__main__": parser = argparse.ArgumentParser() ... # Data, model, and output directories parser.add_argument("--output_data_dir", type=str, default=os.environ["SM_OUTPUT_DATA_DIR"]) parser.add_argument("--model_dir", type=str, default=os.environ["SM_MODEL_DIR"]) parser.add_argument("--training_dir", type=str, default=os.environ["SM_CHANNEL_TRAIN"]) parser.add_argument("--test_dir", type=str, default=os.environ["SM_CHANNEL_TEST"]) parser.add_argument("--n_gpus", type=str, default=os.environ["SM_NUM_GPUS"]) args, _ = parser.parse_known_args() os.environ["GPU_NUM_DEVICES"] = args.n_gpus
  • Approccio 3: codificare la variabile di ambiente GPU_NUM_DEVICES nello script di addestramento. Ad esempio, aggiungi quanto segue allo script se usi un'istanza che ne ha quattroGPUs.

    # train.py import os os.environ["GPU_NUM_DEVICES"] = 4
Suggerimento

Per trovare il numero di GPU dispositivi su istanze di machine learning che desideri utilizzare, consulta Accelerated Computing nella pagina Amazon EC2 Instance Types.

SageMaker Training Compiler non riduce il tempo totale di formazione

Se il tempo totale di allenamento non diminuisce con SageMaker Training Compiler, ti consigliamo vivamente di consultare la SageMaker Buone pratiche e considerazioni su Training Compiler pagina per controllare la configurazione di allenamento, la strategia di riempimento per la forma del tensore di input e gli iperparametri.