HorovodRunner per il Deep Learning distribuito

Completato

Si desidera eseguire il training di modelli di Deep Learning usando i framework open source TensorFlow, Keras o PyTorch in Azure Databricks. Si è provato a usare un cluster a nodo singolo, ma il modello o i dati sono eccessivi per il cluster. In tal caso, è possibile scegliere di usare Horovod su quanto già fato per distribuire il training. Di seguito verrà spiegato come farlo con HorovodRunner.

Attivare Horovod in Azure Databricks con HorovodRunner

HorovodRunner è un'API generale, che attiva processi Horovod. Il vantaggio correlato all'uso di HorovodRunner anziché direttamente del framework Horovod è che HorovodRunner è stato progettato per distribuire i processi di Deep Learning tra ruoli di lavoro Spark. Di conseguenza, HorovodRunner è più stabile per i processi di training Deep Learning a esecuzione prolungata in Azure Databricks.

Processo di Horovod

Per distribuire il training di un modello di Deep Learning con HorovodRunner, eseguire le operazioni seguenti:

  • Preparare e testare il codice a nodo singolo con TensorFlow, Keras o PyTorch.
  • Eseguire la migrazione del codice a Horovod.
  • Usare HorovodRunner per eseguire il codice e distribuire il lavoro.

Eseguire il training con nodo singolo

Prima di usare Horovod e HorovodRunner, è necessario testare il codice usato per eseguire il training del modello di Deep Learning in un cluster a nodo singolo. Dopo averne verificato il funzionamento, assicurarsi di eseguire il wrapping della routine di training principale in una singola funzione Python. Questa funzione verrà usata più avanti per avviare l'esecuzione distribuita del codice.

Eseguire la migrazione a Horovod

Dopo aver testato il codice a nodo singolo per eseguire il training di un modello di Deep Learning, è necessario eseguirne la migrazione a Horovod prima di poter attivare il processo con HorovodRunner.

  1. Importare il framework Horovod come hvd.
  2. Inizializzare la libreria Horovod con hvd.init().
  3. Aggiungere una GPU per processo. L'aggiunta è necessaria per disabilitare l'associazione casuale dei ruoli di lavoro ed evitare conflitti. L'aggiunta viene ignorata quando si usano le CPU.
  4. Specificare la modalità di partizionamento o campionamento dei dati in modo che ogni ruolo di lavoro usi un subset univoco dei dati per eseguire il training di un modello. Come procedura consigliata, assicurarsi che i subset siano tutti delle stesse dimensioni. A seconda del set di dati di input, esistono diverse tecniche per eseguire il campionamento. Ad esempio, è possibile usare Petastorm per lavorare con set di dati in formato Apache Parquet. Per altre informazioni sulla libreria open source Petastorm, vedere qui.
  5. Dimensionare la frequenza di apprendimento in base al numero di ruoli di lavoro per assicurarsi che i pesi vengano modificati correttamente dopo ogni periodo.
  6. Usare l'ottimizzatore distribuito Horovod per gestire la comunicazione tra i ruoli di lavoro.
  7. Trasmettere i parametri iniziali in modo che tutti i ruoli di lavoro inizino con gli stessi parametri.
  8. Salvare i checkpoint solo sul ruolo di lavoro 0 per evitare conflitti tra i ruoli di lavoro.

Usare HorovodRunner

Per eseguire HovorodRunner, è necessario creare un'istanza di HorovodRunner in cui specificare il numero di nodi (definiti dall'argomento np) in cui si vuole distribuire il lavoro. È possibile specificare di usare un nodo se si vuole eseguire il test in un cluster a nodo singolo con np=-1. Infine, è possibile attivare il processo di training di Horovod con HorovodRunner richiamando la funzione Python creata per il codice di training.