Calcolo distribuito con le best practice per SageMaker AI - Amazon SageMaker AI

Calcolo distribuito con le best practice per SageMaker AI

Questa pagina delle migliori pratiche presenta vari tipi di calcolo distribuito per i processi di machine learning (ML) in generale. Il termine calcolo distribuito in questa pagina comprende l’addestramento distribuito per le attività di machine learning e il calcolo parallelo per l'elaborazione dei dati, la generazione di dati, l'ingegneria delle caratteristiche e l'apprendimento per rinforzo. In questa pagina, discutiamo delle sfide più comuni del calcolo distribuito e delle opzioni disponibili in SageMaker Training ed Elaborazione SageMaker. Per ulteriori materiali di lettura sul calcolo distribuito, consulta What is Distributed Computing?.

Puoi configurare le attività di machine learning in modo che vengano eseguite in modo distribuito su più nodi (istanze), acceleratori (GPU NVIDIA, chip AWS Trainium) e core vCPU. Eseguendo il calcolo distribuito, puoi raggiungere una serie di obiettivi, ad esempio velocizzare le operazioni di calcolo, gestire set di dati di grandi dimensioni o addestrare modelli ML di grandi dimensioni.

L'elenco seguente illustra le sfide più comuni che potresti affrontare quando esegui un processo di addestramento ML su larga scala.

  • Devi prendere decisioni su come distribuire il calcolo in base alle attività di machine learning, alle librerie software che desideri utilizzare e alle risorse di calcolo.

  • Non tutte le attività di machine learning sono semplici da distribuire. Inoltre, non tutte le librerie ML supportano il calcolo distribuito.

  • Il calcolo distribuito potrebbe non portare sempre a un aumento lineare dell'efficienza di calcolo. In particolare, dovrai identificare se l'I/O dei dati e la comunicazione tra GPU presentano rallentamenti o causano sovraccarichi.

  • Il calcolo distribuito potrebbe disturbare i processi numerici e modificare la precisione del modello. In particolare per quanto riguarda l'addestramento su reti neurali parallele ai dati, quando modifichi la dimensione globale del batch durante la scalabilità a un cluster di calcolo più grande, dovrai regolare anche il tasso di apprendimento di conseguenza.

SageMaker AI offre soluzioni di addestramento distribuito per semplificare tali sfide in vari casi d’uso. Scegli una delle seguenti opzioni che meglio si adatta al tuo caso d'uso.

Opzione 1: utilizzare un algoritmo integrato di SageMaker AI che supporti l’addestramento distribuito

SageMaker AI fornisce algoritmi integrati che puoi utilizzare immediatamente tramite la console SageMaker AI o SageMaker Python SDK. Utilizzando gli algoritmi integrati, non dovrai dedicare tempo alla personalizzazione del codice, alla comprensione della scienza alla base dei modelli o all'esecuzione di Docker su istanze Amazon EC2 fornite.

Un sottoinsieme degli algoritmi integrati di SageMaker AI supporta l’addestramento distribuito. Per verificare se l'algoritmo di tua scelta supporta l'addestramento distribuito, consulta la colonna Parallelizzabile nella tabella Informazioni comuni sugli algoritmi integrati. Alcuni algoritmi supportano l'addestramento distribuito su più istanze, mentre gli altri algoritmi parallelizzabili supportano la parallelizzazione su più GPU in una singola istanza, come indicato nella colonna Parallelizzabile.

Opzione 2: eseguire un codice ML personalizzato nell’ambiente di addestramento o elaborazione gestito da SageMaker AI

I processi SageMaker AI possono creare istanze di ambienti di addestramento distribuito per casi d’uso e framework specifici. Questo ambiente funge da lavagna pronta all'uso, in cui è possibile importare ed eseguire il tuo codice ML.

Se il tuo codice ML utilizza un framework di deep learning

È possibile avviare job di addestramento distribuito utilizzando i container AWS per il Deep Learning (DLC) per SageMaker Training, che puoi orchestrare tramite i moduli Python dedicati in SageMaker AI Python SDK o tramite le API di SageMaker con AWS CLI, AWS SDK per Python (Boto3). SageMaker AI fornisce container di addestramento per framework di machine learning, tra cui PyTorch, TensorFlow, Hugging Face Transformers e Apache MXNet. Sono disponibili due opzioni per scrivere codice di deep learning per l’addestramento distribuito.

  • Librerie di addestramento distribuito di SageMaker AI

    Le librerie di addestramento distribuito di SageMaker AI propongono codice gestito da AWS per la parallelizzazione dei modelli e la parallelizzazione dei dati delle reti neurali. L’addestramento distribuito di SageMaker AI include anche client con utilità di avvio integrati in SageMaker Python SDK, per cui non è necessario creare codice di avvio parallelo. Per ulteriori informazioni, consulta la Libreria di parallelizzazione dei dati di SageMaker AI e la Libreria di parallelizzazione dei modelli di SageMaker AI.

  • Librerie di addestramento distribuito open source

    I framework open source hanno i propri meccanismi di implementazione come DistributedDataParallelism (DDP) in PyTorch o i moduli tf.distribute in TensorFlow Puoi scegliere di eseguire questi framework di addestramento distribuito nei container di framework gestiti da SageMaker AI. Ad esempio, il codice di esempio per l’addestramento di MaskRCNN in SageMaker AI mostra come utilizzare sia PyTorch DDP nel container del framework SageMaker AI PyTorch che Horovod nel container del framework SageMaker TensorFlow.

I container SageMaker AI ML sono inoltre dotati di MPI preinstallato, quindi è possibile parallelizzare lo script del punto di ingresso utilizzando mpi4py. L’utilizzo dei container di addestramento integrati MPI rappresenta un’ottima scelta quando si lancia un’utilità di avvio di addestramento distribuito di terze parti o si scrive un codice parallelo apposito nell’ambiente di addestramento gestito di SageMaker AI.

Note per l'addestramento di reti neurali parallele ai dati su GPU

  • Se necessario, passa al parallelismo multi-GPU e multi-macchina

    Spesso eseguiamo processi du addestramento sulle reti neurali su istanze con più CPU o più GPU. Ogni istanza basata su GPU di solito contiene più dispositivi GPU. Di conseguenza, il calcolo distribuito su GPU può avvenire all'interno di una singola istanza GPU con più GPU (addestramento multi-GPU a nodo singolo) o su più istanze GPU con più core GPU ciascuna (addestramento multi-GPU multinodo). L'addestramento su istanza singola è più semplice per scrivere codice ed eseguire il debug e il throughput da GPU a GPU tra nodi è in genere più veloce del throughput da GPU a GPU tra nodi. Pertanto, è consigliabile scalare innanzitutto il parallelismo dei dati verticalmente (utilizzare un'istanza GPU con più GPU) ed espanderlo a più istanze GPU, se necessario. Ciò potrebbe non applicarsi ai casi in cui il budget della CPU è elevato (ad esempio, un carico di lavoro enorme per la preelaborazione dei dati) e quando il rapporto CPU/GPU di un'istanza multi-GPU è troppo basso. In tutti i casi, è necessario sperimentare diverse combinazioni di tipi di istanze in base alle proprie esigenze di addestramento in machine learning e al proprio carico di lavoro.

  • Monitoraggio della qualità della convergenza

    Quando si addestra una rete neurale con parallelismo dei dati, l'aumento del numero di GPU mantenendo costante la dimensione dei mini-batch per GPU comporta un aumento delle dimensioni del mini-batch globale per il processo MSGD (mini-batch stochastic gradient descent). È noto che le dimensioni dei mini-batch per MSGD influiscono sul rumore di discesa e sulla convergenza. Per ridimensionare correttamente preservando la precisione, è necessario regolare altri iperparametri come il tasso di apprendimento [Goyal et al. (2017)].

  • Monitoraggio dei colli di bottiglia di I/O

    Con l'aumento del numero di GPU, dovrebbe aumentare anche la velocità effettiva per l’archiviazione in lettura e scrittura. Assicurati che l'origine dati e la pipeline non diventino ostacoli.

  • Modifica dello script di addestramento in base alle esigenze

    Gli script di addestramento scritti per l'addestramento a GPU singola devono essere modificati per l'addestramento multi-GPU a più nodi. Nella maggior parte delle librerie di parallelismo dei dati, è necessaria la modifica degli script per effettuare le seguenti operazioni.

    • Assegnare batch di dati di addestramento a ciascuna GPU.

    • Utilizzare un ottimizzatore in grado di gestire il calcolo del gradiente e gli aggiornamenti dei parametri su più GPU.

    • Assegnare la responsabilità del checkpoint a un host e a una GPU specifici.

Se il codice ML prevede l'elaborazione di dati tabulari

PySpark è un frontend Python di Apache Spark, un framework di calcolo distribuito open source. PySpark è stato ampiamente adottato per l'elaborazione di dati tabulari distribuiti per carichi di lavoro di produzione su larga scala. Se desideri eseguire codice di elaborazione dati tabulare, prendi in considerazione l'utilizzo dei container SageMaker Processing PySpark e l'esecuzione di processi paralleli. Puoi anche eseguire processi di elaborazione dati in parallelo utilizzando le API SageMaker Training e SageMaker Processing in Amazon SageMaker Studio Classic, che è integrato con Amazon EMR e AWS Glue.

Opzione 3: scrivere il proprio codice di addestramento distribuito personalizzato

Quando invii un job di addestramento o elaborazione a SageMaker AI, le API SageMaker Training e SageMaker AI Processing avviano istanze di calcolo Amazon EC2. Puoi personalizzare l'ambiente di addestramento ed elaborazione nelle istanze eseguendo il tuo container Docker o installando librerie aggiuntive nei container gestiti AWS. Per ulteriori informazioni su Docker con SageMaker Training, consulta Adattamento del proprio container Docker per lavorare con SageMaker AI e Crea un container con algoritmi e modelli personalizzati. Per ulteriori informazioni su Docker con SageMaker AI Processing, consulta Utilizzare il proprio codice di elaborazione.

Ogni ambiente per job di addestramento di SageMaker contiene un file di configurazione in /opt/ml/input/config/resourceconfig.json e ogni ambiente per processi di elaborazione di SageMaker contiene un file di configurazione simile in /opt/ml/config/resourceconfig.json. Il codice può leggere questo file per trovare hostnames e stabilire comunicazioni tra i nodi. Per ulteriori informazioni, incluso lo schema del file JSON, consulta Distributed Training Configuration e How Amazon SageMaker Processing Configures Your Processing Container. Puoi inoltre installare e utilizzare librerie di calcolo distribuito di terze parti come Ray o DeepSpeed in SageMaker AI.

Puoi anche utilizzare Addestramento SageMaker ed Elaborazione SageMaker per eseguire calcoli distribuiti personalizzati che non richiedono la comunicazione tra i worker. Nella letteratura informatica, queste attività sono spesso descritte come di facile parallelizzabilità o di zero condivisione. Gli esempi includono l'elaborazione parallela di file di dati, l'addestramento di modelli in parallelo su diverse configurazioni o l'esecuzione di inferenze in batch su una raccolta di record. Puoi parallelizzare in modo semplice questi casi d’uso senza condivisione con Amazon SageMaker AI. Quando avvii un job di addestramento o un processo di elaborazione SageMaker su un cluster con più nodi, per impostazione predefinita SageMaker AI replica e avvia il codice di addestramento (in Python o Docker) su tutti i nodi. Le attività che richiedono l’implementazione casuale dei dati di input su tali nodi multipli possono essere facilitate impostando S3DataDistributionType=ShardedByS3Key nella configurazione di immissione dei dati dell’API TrainingInput di SageMaker AI.

Opzione 4: avviare più processi in parallelo o in sequenza

Puoi inoltre distribuire un flusso di lavoro di elaborazione ML in attività di elaborazione parallele o sequenziali più piccole, ciascuna rappresentata dal proprio lavoro Addestramento SageMaker o Elaborazione SageMaker. La suddivisione di un'attività in più processi può essere utile per le seguenti situazioni o attività:

  • Quando sono presenti canali di dati e voci di metadati specifici (come iperparametri, configurazione del modello o tipi di istanza) per ogni attività secondaria.

  • Quando si implementano le fasi di ripetizione dei tentativi a livello di sottoattività.

  • Quando si modifica la configurazione delle sottoattività nel corso del carico di lavoro, ad esempio durante l’addestramento sull'aumento delle dimensioni dei batch.

  • Quando è necessario eseguire un'attività di machine learning che richiede più tempo del tempo di addestramento massimo consentito per un singolo processo di addestramento (massimo 28 giorni).

  • Quando diverse fasi di un flusso di lavoro di elaborazione richiedono tipi di istanze diversi.

Per il caso specifico della ricerca iperparametrica, utilizza Regolazione automatica dei modelli di SageMaker AI. Regolazione automatica dei modelli di SageMaker AI è un orchestratore di ricerca parametrica serverless che avvia più job di addestramento per conto dell’utente, secondo una logica di ricerca che può essere casuale, bayesiana o HyperBand.

Inoltre, per orchestrare più job di addestramento, puoi prendere in considerazione anche strumenti di orchestrazione del flusso di lavoro, come SageMaker Pipelines, AWS Step Functions e Apache Airflow supportati da Flusso di lavoro gestito da Amazon per Apache Airflow (MWAA) e Flussi di lavoro SageMaker AI.