Qual è il vantaggio di mantenere una dimensione del lotto di una potenza di 2?


15

Durante l'addestramento dei modelli di apprendimento automatico, perché a volte è vantaggioso mantenere la dimensione del batch a una potenza di 2? Ho pensato che sarebbe meglio usare una dimensione che si adatta meglio alla tua memoria GPU / RAM.

Questa risposta afferma che per alcuni pacchetti, una potenza di 2 è migliore come dimensione del lotto. Qualcuno può fornire una spiegazione dettagliata / link a una spiegazione dettagliata per questo? Questo vale per tutti gli algoritmi di ottimizzazione (discesa del gradiente, backpropagation, ecc.) O solo alcuni di essi?

Risposte:


19

Questo è un problema di allineamento dei processori virtuali (VP) ai processori fisici (PP) della GPU. Poiché il numero di PP è spesso una potenza di 2, l'utilizzo di un numero di VP diverso da una potenza di 2 comporta prestazioni scadenti.
Puoi vedere la mappatura del VP sul PP come una pila di sezioni di dimensioni il numero di PP .
Supponiamo che tu abbia 16 PP.
Puoi mappare 16 VP su di essi: 1 VP è mappato su 1 PP.
Puoi mappare 32 VP su di essi: 2 sezioni da 16 VP, 1 PP sarà responsabile per 2 VP.
Ecc. Durante l'esecuzione, ogni PP eseguirà il lavoro del 1 ° VP di cui è responsabile, quindi il lavoro del 2 ° VP ecc.
Se usi 17 VP, ogni PP eseguirà il lavoro del loro 1 ° PP, quindi 1 PP eseguire il lavoro del 17 ANDgli altri non faranno nulla (precisato di seguito).
Ciò è dovuto al paradigma SIMD (chiamato vettore negli anni '70) utilizzato dalle GPU. Questo è spesso chiamato parallelismo dei dati: tutti i PP fanno la stessa cosa contemporaneamente ma su dati diversi. Vedi https://en.wikipedia.org/wiki/SIMD .
Più precisamente, nell'esempio con 17 VP, una volta terminato il lavoro della 1a fetta (da parte di tutti i PP che svolgono il lavoro del loro 1 ° VP), tutti i PP faranno lo stesso lavoro (2 ° VP), ma solo uno ne ha dati su cui lavorare .
Niente a che vedere con l'apprendimento. Questa è solo roba di programmazione.


sarebbe più preciso affermare che le dimensioni dei lotti dovrebbero essere un multiplo del numero di PP? Cioè, nel tuo esempio potremmo mappare 16x3 = 48 VP a 16 PP?
ovest

Sì. bene ... Se esegui la mappatura VP -> PP, tu stesso, assicurati di avere ragione al 100%. Se usi una biblioteca e chiedi 80 VP. Non ne sono sicuro. Non sto dicendo che ti sbagli. Se il rapporto è una potenza di 2, puoi utilizzare ottimizzazioni molto classiche e facili. Pensa agli accessi alla memoria. Se il numero di vicini di sopra di un VP non è una potenza di 2, diciamo 5, la lib non sarà in grado di usare gli accessi O (log_2 (n)) classici alla memoria dei vicini con la stessa facilità.
jcm69,

@ jcm69 puoi spiegare o fornire il link per log_2 (n) tempo di accesso per l'accesso alla memoria VP
Arayan Singh

Questa è solo una considerazione generale sulla gestione degli oggetti nell'informatica. Quando sei sicuro che gli oggetti seguano la potenza di 2 regole, possono essere gestiti in modo semplice e sicuro da alberi di ricerca binari, spostamenti binari ecc. Quando non sei sicuro, beh, potresti dover fare alcuni test aggiuntivi e un algoritmo più complicato. Comunque, è un po 'lontano dalla domanda iniziale;)
jcm69
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.