Supponendo che tu abbia già eseguito i tutorial, questa pagina illustra le best practice per Neural Architecture Search. La prima sezione riassume un flusso di lavoro completo che puoi seguire per il tuo job di ricerca di architetture neurali. Le sezioni seguenti forniscono una descrizione dettagliata di ciascun passaggio. Ti consigliamo vivamente di leggere l'intera pagina prima di eseguire il tuo primo job di ricerca di architetture neurali.
Flusso di lavoro suggerito
Di seguito è riportato un riepilogo di un flusso di lavoro suggerito per la ricerca di architetture neurali e i link alle sezioni corrispondenti per ulteriori dettagli:
- Suddividi il set di dati di addestramento per la ricerca di fase 1.
- Assicurati che lo spazio di ricerca rispetti le nostre linee guida.
- Esegui l'addestramento completo con il modello di riferimento e ottieni una curva di convalida.
- Esegui gli strumenti di progettazione delle attività proxy per trovare l'attività proxy migliore.
- Esegui i controlli finali per l'attività proxy.
- Imposta il numero appropriato di prove totali e parallele e poi avvia la ricerca.
- Monitora il grafico di ricerca e interrompilo quando converge o mostra un numero elevato di errori o non mostra alcun segno di convergenza.
- Esegui l'addestramento completo con i primi 10 esperimenti scelti dalla tua ricerca per il risultato finale. Per l'addestramento completo, puoi utilizzare più aumenti o pesi preaddestrati per ottenere il miglior rendimento possibile.
- Analizza le metriche/i dati salvati dalla ricerca e trarre conclusioni per le future iterazioni dello spazio di ricerca.
Ricerca di architetture neurali tipica
La figura sopra mostra una tipica curva di ricerca di architetture neurali.
Y-axis
mostra i premi della prova e X-axis
il numero di prove lanciate finora.
I primi circa 100-200 tentativi sono costituiti principalmente da esplorazioni casuali
dell'esplorazione dello spazio di ricerca da parte del controller.
Durante queste esplorazioni iniziali, i premi mostrano una grande varianza perché vengono provati molti tipi di modelli nello spazio di ricerca.
Con l'aumento del numero di prove, il controller inizia a trovare modelli migliori. Pertanto, in un primo momento il premio inizia ad aumentare, per poi diminuire in seguito con la varianza del premio e la crescita del premio, indicando così la convergenza. Il numero di prove
in cui si verifica la convergenza può variare in base alle dimensioni dello spazio di ricerca, ma in genere è dell'ordine di circa 2000 prove.
Due fasi di ricerca di architetture neurali: attività proxy e addestramento completo
Neural Architecture Search funziona in due fasi:
La ricerca di fase 1 utilizza una rappresentazione molto più piccola dell'addestramento completo, che in genere termina entro circa 1-2 ore. Questa rappresentazione è chiamata attività proxy e contribuisce a ridurre il costo della ricerca.
L'addestramento completo di fase 2 prevede l'addestramento completo dei circa 10 modelli con il punteggio migliore della ricerca di fase 1. A causa della natura stocastica della ricerca, il modello migliore della ricerca di fase 1 potrebbe non essere il migliore durante la formazione completa di fase 2 e, pertanto, è importante selezionare un insieme di modelli per l'addestramento completo.
Poiché il controller riceve l'indicatore del premio dall'attività proxy più piccola instead of the complete training, è importante trovare un'attività proxy ottimale per la tua attività.
Costo di Neural Architecture Search
Il costo di Neural Architecture Search è dato da:
search-cost = num-trials-to-converge * avg-proxy-task-cost
.
Supponendo che il tempo di calcolo della task proxy sia pari a circa 1/30 del tempo di addestramento completo e che il numero di prove necessarie per la convergenza sia di circa 2000, il costo della ricerca diventa di circa 67 * full-training-cost
.
Poiché il costo di Neural Architecture Search è elevato, è consigliabile dedicare del tempo alla regolazione dell'attività proxy e utilizzare uno spazio di ricerca più piccolo per la prima ricerca.
Set di dati suddiviso in due fasi di ricerca di architetture neurali
Supponendo che tu abbia già i training-data e i validation-data per la tua formazione di riferimento, è consigliata la seguente suddivisione del set di dati per le due fasi di NAS (Neural Architecture Search):
- Addestramento di Stage1-search: circa il 90% dei dati di addestramento
Convalida della ricerca di fase 1: circa il 10% dei dati di addestramento
Addestramento Stage2-full-training: 100% di training-data
Convalida dell'addestramento completo di fase 2: il 100% dei dati di convalida
La suddivisione dei dati di addestramento completo della fase 2 è la stessa dell'addestramento normale. Tuttavia, la ricerca stage1 utilizza una suddivisione dei dati di addestramento per la convalida. L'utilizzo di diversi dati di convalida nella fase 1 e nella fase 2 consente di rilevare eventuali bias nella ricerca del modello dovuti alla suddivisione del set di dati. Assicurati che i dati di addestramento siano ben mescolati prima di suddividerli ulteriormente e che il 10% finale della suddivisione dei dati di addestramento abbia una distribuzione simile ai dati di convalida originali.
Dati piccoli o sbilanciati
La ricerca di architetture non è consigliata con dati di addestramento limitati o per set di dati molto sbilanciati in cui alcuni classi sono molto rari. Se utilizzi già aggiunte significative per l'addestramento di riferimento a causa della mancanza di dati, la ricerca del modello non è consigliata.
In questo caso, puoi eseguire solo il comando augmentation-search per cercare il criterio di aumento migliore anziché cercare un'architettura ottimale.
Progettazione dello spazio di ricerca
La ricerca dell'architettura non deve essere confusa con la ricerca di potenziamenti o con la ricerca degli iperparametri (ad esempio l'apprendimento rate o le impostazioni dell'ottimizzatore). L'obiettivo della ricerca di architetture è confrontare il rendimento del modello A con quello del modello B quando esistono solo differenze basate sull'architettura. Pertanto, le impostazioni di aumento e degli iperparametri dovrebbero rimanere invariate.
La ricerca di aumenti può essere eseguita come fase diversa dopo la ricerca dell'architettura.
Neural Architecture Search può raggiungere fino a 10^20 in termini di dimensioni dello spazio di ricerca. Tuttavia, se lo spazio di ricerca è più ampio, puoi dividerlo in parti esclusivamente reciproche. Ad esempio, puoi cercare l'encoder separatamente dal decoder o dal primo elemento. Se vuoi comunque eseguire una ricerca congiunta su tutti, puoi creare uno spazio di ricerca più piccolo in base alle migliori opzioni individuali trovate in precedenza.
(Facoltativo) Puoi eseguire la scalabilità del modello da block-design quando progetti uno spazio di ricerca. La ricerca del design del blocco deve essere eseguita prima con un modello ridotto. In questo modo, il costo del tempo di esecuzione delle attività proxy può essere molto più basso. Puoi quindi eseguire una ricerca distinta per scalare il modello. Per ulteriori informazioni, consulta
Examples of scaled down models
.
Ottimizzazione del tempo di addestramento e ricerca
Prima di eseguire la ricerca di architetture neurali, è importante ottimizzare il tempo di addestramento del modello di riferimento. In questo modo risparmierai costi nel lungo periodo. Ecco alcune delle opzioni per ottimizzare l'addestramento:
- Massimizza la velocità di caricamento dei dati:
- Assicurati che il bucket in cui si trovano i dati si trovi nella stessa regione del tuo job.
- Se utilizzi TensorFlow, consulta
Best practice summary
. Puoi anche provare a utilizzare il formato TFRecord per i tuoi dati. - Se utilizzi PyTorch, segui le linee guida per un addestramento efficiente di PyTorch.
- Utilizza l'addestramento distribuito per sfruttare più acceleratori o più macchine.
- Utilizza l'addestramento con precisione mista per ottenere un notevole aumento della velocità di addestramento e una riduzione dell'utilizzo della memoria.
Per l'addestramento con precisione mista di TensorFlow,
consulta
Mixed Precision
. - Alcuni acceleratori (come A100) sono in genere più economici.
- Ottimizza la dimensione del batch per assicurarti di massimizzare l'utilizzo della GPU. Il seguente grafico mostra il sottoutilizzo delle GPU (al 50%). L'aumento della dimensione del batch può contribuire a utilizzare meglio le GPU. Tuttavia, il parametro batch-size deve essere aumentato con cautela, in quanto può aumentare gli errori di esaurimento della memoria durante la ricerca.
- Se alcuni blocchi dell'architettura sono indipendenti dall'area di ricerca, puoi provare a caricare checkpoint preaddestrati per questi blocchi per un addestramento più rapido. I checkpoint preaddestrati devono essere uguali nell'intero spazio di ricerca e non devono introdurre bias. Ad esempio, se lo spazio di ricerca è solo per il decodificatore, il codificatore può utilizzare i checkpoint preaddestrati.
Numero di GPU per ogni prova di ricerca
Utilizza un numero inferiore di GPU per prova per ridurre il tempo di inizio. Ad esempio, 2 GPU richiedono 5 minuti per l'avvio, mentre 8 GPU richiedono 20 minuti. È più efficiente utilizzare 2 GPU per prova per eseguire un'attività proxy di job di ricerca di architetture neurali.
Prove totali e prove parallele per la rete di ricerca
Impostazione della prova totale
Dopo aver cercato e selezionato l'attività proxy migliore, puoi avviare una ricerca completa. Non è possibile sapere in anticipo quante prove saranno necessarie per la convergenza. Il numero di prove in cui si verifica la convergenza può variare in base alle dimensioni dello spazio di ricerca, ma in genere è dell'ordine di circa 2000 prove.
Consigliamo un'impostazione molto elevata per --max_nas_trial
: circa 5000-10000, quindi annullare il job di ricerca in anticipo se il grafico di ricerca mostra la convergenza.
Hai anche la possibilità di riprendere un job di ricerca precedente utilizzando il comando search_resume
.
Tuttavia, non puoi riprendere la ricerca da un altro job di ripresa della ricerca.
Pertanto, puoi riprendere un job di ricerca originale una sola volta.
Impostazione delle prove parallele
Il job di ricerca di fase 1 esegue l'elaborazione batch eseguendo contemporaneamente un numero di prove --max_parallel_nas_trial
. Questo è fondamentale per ridurre il tempo di esecuzione complessivo
per il job di ricerca. Puoi calcolare il numero previsto di giorni per la ricerca:
days-required-for-search = (trials-to-converge / max-parallel-nas-trial) * (avg-trial-duration-in-hours / 24)
Nota: inizialmente puoi utilizzare 3000
come stima approssimativa per trials-to-converge
, che è un buon limite superiore per iniziare. Inizialmente puoi utilizzare 2
ore come stima approssimativa per avg-trial-duration-in-hours
, che è un buon limite superiore per il tempo impiegato da ogni attività proxy.
Ti consigliamo di utilizzare un'impostazione --max_parallel_nas_trial
di circa 20-50, a seconda della quota dell'acceleratore del tuo progetto e di days-required-for-search
.
Ad esempio, se imposti --max_parallel_nas_trial
su 20
e ogni attività proxy utilizza due GPU NVIDIA T4, devi aver riservato una quota di almeno 40 GPU NVIDIA T4. L'impostazione --max_parallel_nas_trial
non influisce sul risultato di ricerca complessivo, ma ha un impatto su days-required-for-search
.
È possibile anche un'impostazione più piccola per max_parallel_nas_trial
, ad esempio circa 10 (20 GPU), ma devi stimare approssimativamente days-required-for-search
e assicurarti che rientri nel limite di tempo del job.
Per impostazione predefinita, il job di addestramento completo di fase 2 addestra tutte le prove in parallelo. In genere, si tratta delle prime 10 prove in esecuzione in parallelo. Tuttavia, se ogni prova stage2-full-training utilizza troppe GPU (ad esempio otto GPU ciascuna) per il tuo caso d'uso e non hai una quota sufficiente, puoi eseguire manualmente i job stage2 in batch, ad esempio eseguire prima una prova stage2-full-training per solo cinque prove e poi un'altra prova stage2-full-training per le successive cinque prove.
Timeout job predefinito
Il timeout predefinito del job NAS è impostato su 14 giorni e, dopo questo periodo, il job viene cancellato. Se prevedi di eseguire il job per una durata maggiore, puoi provare a riprendere il job di ricerca solo un'altra volta per altri 14 giorni. In generale, puoi eseguire un job di ricerca per 28 giorni, incluso il ripristino.
Impostazione del numero massimo di prove non riuscite
Il numero massimo di prove non riuscite deve essere impostato su circa 1/3 dell'impostazione max_nas_trial
. Il job verrà annullato quando il numero di prove non riuscite raggiungerà questo limite.
Quando interrompere la ricerca
Devi interrompere la ricerca quando:
La curva di ricerca inizia a convergere (la varianza diminuisce): Nota: se non viene utilizzato alcun vincolo di latenza o se viene utilizzato il vincolo di latenza rigido con un limite di latenza flessibile, la curva potrebbe non mostrare un aumento del premio, ma dovrebbe comunque mostrare la convergenza. Questo accade perché il controllore potrebbe aver già ottenuto buoni risultati di accuratezza all'inizio della ricerca.
Più del 20% dei tuoi trial mostra premi non validi (errori):
La curva di ricerca non aumenta né converge (come mostrato sopra) anche dopo circa 500 prove. Se viene mostrato un aumento del premio o una diminuzione della varianza, puoi continuare.