Scelta tra CPU e GPU per l'addestramento di una rete neurale


29

Ho visto discussioni sul "sovraccarico" di una GPU e che per le "piccole" reti, potrebbe effettivamente essere più veloce allenarsi su una CPU (o rete di CPU) rispetto a una GPU.

Cosa si intende per "piccolo"?

Ad esempio, un MLP a strato singolo con 100 unità nascoste sarebbe "piccolo"?

La nostra definizione di "piccolo" cambia per le architetture ricorrenti?

Ci sono altri criteri da considerare quando si decide se allenarsi su CPU o GPU?

MODIFICA 1:

Ho appena trovato un post sul blog (forse obsoleto? È del 2014):

"... La maggior parte delle schede di rete funziona solo con la memoria registrata con la CPU e quindi il trasferimento da GPU a GPU tra due nodi sarebbe simile a questo: GPU 1 a CPU 1 a Scheda di rete 1 a Scheda di rete 2 a CPU Da 2 a GPU 2. Ciò significa che se si sceglie una scheda di rete lenta, potrebbero non esserci accelerazioni su un singolo computer. Anche con le schede di rete veloci, se il cluster è grande, non si ottengono nemmeno accelerazioni dalle GPU rispetto alle CPU poiché le GPU funzionano troppo velocemente perché le schede di rete le stiano al passo.

Questo è il motivo per cui molte grandi aziende come Google e Microsoft utilizzano CPU anziché cluster GPU per addestrare le loro grandi reti neurali. "

Quindi ad un certo punto, secondo questo post, avrebbe potuto essere più veloce usare le CPU. È ancora così?

EDIT 2: Sì, quel post sul blog potrebbe benissimo essere obsoleto perché:

Ora sembra che le GPU all'interno di un nodo siano connesse tramite bus PCIe, quindi la comunicazione può avvenire a circa 6GiB / s. (Ad esempio: https://www.youtube.com/watch?v=el1iSlP1uOs , circa 35 minuti tra). L'altoparlante implica che questo è più veloce che passare da GPU1 a CPU a GPU2. Significherebbe che la scheda di rete non è più il collo di bottiglia.


Quel ragazzo con il suo post sul blog fa emergere buoni punti. Non ho capito tutte le sue giustificazioni. Tuttavia, il fatto che Google, Facebook, Twitter e tutti i principali gruppi di deep learning nel mondo accademico eseguano i loro codici principalmente su GPU suggerisce che sia una buona idea. Anche se di parte: nvidia.com/content/events/geoInt2015/LBrown_DL.pdf
JahKnows

Risposte:


28

A differenza di alcune delle altre risposte, consiglio vivamente di non allenarsi sempre sulle GPU senza pensarci due volte. Ciò è guidato dall'uso di metodi di deep learning su immagini e testi, in cui i dati sono molto ricchi (ad es. Molti pixel = molte variabili) e il modello ha analogamente molti milioni di parametri. Per altri domini, questo potrebbe non essere il caso.

Cosa si intende per "piccolo"? Ad esempio, un MLP a strato singolo con 100 unità nascoste sarebbe "piccolo"?

Sì, è decisamente molto piccolo per gli standard moderni. A meno che tu non abbia una GPU adatta perfettamente all'allenamento (ad esempio NVIDIA 1080 o NVIDIA Titan), non sarei sorpreso di scoprire che la tua CPU è stata più veloce.

Nota che la complessità della tua rete neurale dipende anche dal tuo numero di funzioni di input, non solo dal numero di unità nel tuo livello nascosto. Se il tuo livello nascosto ha 100 unità e ogni osservazione nel tuo set di dati ha 4 funzioni di input, la tua rete è minuscola (~ 400 parametri). Se invece ogni osservazione ha 1M di funzionalità di input come in alcuni contesti medico / biotecnologici, la tua rete è piuttosto grande in termini di numero di parametri. Per il resto della mia risposta suppongo che tu abbia abbastanza poche funzioni di input pr. osservazione.

Un buon esempio che ho trovato nel confrontare le prestazioni di CPU e GPU è stato quando ho allenato un bot di poker usando l'apprendimento per rinforzo. Per l'apprendimento per rinforzo spesso non si vogliono molti strati nella rete neurale e abbiamo scoperto che servivano solo pochi strati con pochi parametri. Inoltre, il numero di funzioni di input era piuttosto basso. Inizialmente mi sono allenato su una GPU (NVIDIA Titan), ma ci è voluto molto tempo perché l'apprendimento di rinforzo richiede molte iterazioni. Fortunatamente, ho scoperto che l'allenamento sulla mia CPU invece ha fatto il mio allenamento andare 10 volte più veloce! Questo è solo per dire che a volte la CPU può essere migliore per l'allenamento.

Ci sono altri criteri da considerare quando si decide se allenarsi su CPU o GPU?

È importante notare che durante una GPU vorrai sempre riempire l'intera memoria GPU aumentando le dimensioni del batch, non è il caso della CPU. Sulla CPU un aumento delle dimensioni del batch aumenterà il tempo pr. batch. Pertanto, se è importante avere una dimensione batch molto grande (ad esempio a causa di un segnale molto rumoroso), può essere utile utilizzare una GPU. Non ho sperimentato questo in pratica, e normalmente sono preferite le dimensioni di lotti piccoli.


Grazie @pir! Hai riferimenti specifici in cui posso leggere di più?
StatsSorceress

Puoi facilmente trovare il numero di parametri, ad esempio VGG da confrontare, e vedere che la tua rete è piccola in confronto.
pir

3
Non ho visto molti confronti CPU / GPU su piccole reti perché non è quello che interessano le grandi aziende e i laboratori di ricerca.
Pir

@StatsSorceress Se vuoi testarlo da solo, perché non configurare semplicemente un MLP Keras e testare le prestazioni su GPU vs. CPU? Inoltre, vedi la mia risposta aggiornata. la dimensione della tua rete.
pir

5

La CPU è la direttrice del ramo, può fare un po 'di tutto, ma non è eccezionale se non delegare compiti. Tuttavia, la GPU è un matematico dedicato che si nasconde nella tua macchina. Se stai eseguendo processi pesanti in matematica, allora dovresti usare la tua GPU. Sempre.

Se stai usando un linguaggio di programmazione popolare per l'apprendimento automatico come python o MATLAB, è una riga di codice per dire al tuo computer che vuoi che le operazioni vengano eseguite sulla tua GPU.

Dovresti anche assicurarti di usare tutti i core della tua macchina. Ciò significa utilizzare il calcolo parallelo. Soprattutto per le reti neurali in cui le operazioni possono essere eseguite in modo indipendente, ciò aumenterà immensamente la tua velocità.


4
Ho scoperto che a volte l'overhead del trasferimento di dati da e verso la GPU cancella completamente l'aumento di velocità dal parallelismo. Non è sempre una buona idea passare alla GPU.
Adrian Keister,

1
Dipende dalla complessità del tuo modello. Se stai allenando un semplice K-NN, forse non ne vale la pena. Tuttavia, se si sta formando un modello che richiede una matrice inversa o una rete neurale che richiede molte operazioni a matrice consequenziale, è sempre una buona idea optare per la GPU.
JahKnows,

1
@AdrianKeister Sono d'accordo. Questo è quello che stavo cercando di ottenere nella mia risposta. Per la rete menzionata da OP sarebbe probabilmente il collo di bottiglia.
pir

1
100 unità nascoste sono più veloci su GPU usando la mia macchina. Avrei bisogno di un numero molto piccolo di unità nascoste per rendere la CPU più veloce. Inoltre, tendo sempre a fare la mia formazione in lotti. In questo caso dubito che una CPU sarà il collo di bottiglia considerando i dati che sono abbastanza densi.
JahKnows

3

Per prima cosa farò riferimento ad alcune citazioni da domande simili:

Quando si tratta di operazioni a matrice, non ci pensi due volte, opti sempre per le GPU. fonte

L'architettura parallela in una GPU è ben adattata per le operazioni di vettore e matrice. fonte

Quindi, se leggi queste domande, vedrai che ti consigliano di usare la GPU indipendentemente dal caso; fornirà sempre qualche miglioramento.

Il motivo per cui potresti aver letto che le "piccole" reti dovrebbero essere addestrate con la CPU, è perché l'implementazione dell'addestramento GPU per una piccola rete potrebbe richiedere più tempo del semplice addestramento con CPU - ciò non significa che la GPU sarà più lenta.

Una rete di 100 unità nascoste è un po 'piccola , la definirei una piccola rete rispetto alle grandi reti profonde là fuori. Le architetture ricorrenti (per lo più) hanno più sinapsi delle reti forward forward, quindi un RNN con 100 unità nascoste è "più grande" di un FFN con 100 unità nascoste.


Non è vero che se hai un MLP con un singolo strato nascosto di 100 unità, questo ha lo stesso numero di parametri di un RNN standard con 100 unità nascoste a causa della condivisione del peso? Ha più "sinapsi" - più "attivazioni" - ma lo stesso numero di parametri, giusto?
StatsSorceress,

non ho familiarità con il termine "condivisione del peso". Ha la stessa quantità di attivazioni, ma più connessioni, quindi più parametri ...
Thomas W

La condivisione del peso significa che la matrice del peso da uno strato nascosto nell'RNN al successivo livello nascosto è la stessa; è la stessa matrice "U", replicata nel tempo. Inoltre, i pesi dall'input al livello nascosto sono gli stessi nel tempo.
StatsSorceress

@StatsSorceress non ho familiarità con il lavoro con le matrici. Sì, la matrice dei pesi da un livello nascosto a quello successivo è la stessa. Tuttavia, ci sono più connessioni in totale (perché un livello può anche essere collegato al livello PRECEDENTE). Non sono sicuro di come posso spiegare, ma un RNN avrà sempre più parametri in quanto vi sono più livelli collegati ..
Thomas W

Sì, capisco che ci sono fisicamente più parametri, ma molti di questi parametri assumono lo stesso valore, il che significa che il numero effettivo di parametri in un MLP e un RNN con lo stesso numero di dimensioni di input e lo stesso numero di dimensioni nascoste sarà il stesso.
StatsSorceress
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.