Tensolflow distribuito: la differenza tra replica in-graph e replicazione tra grafici

Mi sono confuso sui due concetti: In-graph replication e In-graph replication Between-graph replication durante la lettura dell’allenamento replicato nel tutorial ufficiale di tensorflow.

  1. Si dice nel link sopra che

    Replica in-graph. In questo approccio, il client crea un singolo tf.Graf che contiene un set di parametri (in tf.I nodes variabili aggiunti a / job: ps); …

    Significa che ci sono più tf.Graph s nell’approccio Between-graph replication ? Se sì, dove sono i codici corrispondenti negli esempi forniti?

  2. Sebbene esista già un esempio di Between-graph replication nel link sopra, chiunque potrebbe fornire un’implementazione di In-graph replication (lo pseudo codice va bene) ed evidenziare le sue principali differenze dalla Between-graph replication ?

    Grazie in anticipo!


Modifica_1: altre domande

Grazie mille per le spiegazioni dettagliate e il codice gist @mrry @YaroslavBulatov! Dopo aver esaminato le tue risposte, ho le seguenti due domande:

  1. C’è la seguente dichiarazione nella formazione replicata :

    Riproduzione tra grafici. In questo approccio, esiste un client separato per ogni / job: task worker, in genere nello stesso processo dell’attività worker. Ogni client costruisce un grafo simile contenente i parametri (aggiunti a / job: ps come prima usando tf.train.replica_device_setter () per mapparli deterministicamente alle stesse attività); e una singola copia della parte ad alta intensità di calcolo del modello, associata all’attività locale in / job: worker.

    Ho due sotto-domande relative alle parole precedenti in grassetto.

    (A) Perché diciamo che ogni cliente costruisce un grafico simile , ma non lo stesso grafico ? Mi chiedo se il grafico generato in ciascun client nell’esempio della formazione replicata debba essere lo stesso, perché sotto i codici di costruzione del grafico sono condivisi all’interno di tutti i worker :

    # Build model...

    loss = ...

    global_step = tf.Variable(0)

    (B) Non dovrebbe essere più copie della parte ad alta intensità di calcolo del modello, dal momento che abbiamo più workers ?

  2. L’esempio nella formazione replicata supporta l’addestramento su più macchine, ognuna delle quali ha più GPU? In caso contrario, possiamo utilizzare simultaneamente la In-graph replication per supportare l’allenamento su più GPU su ciascuna macchina e la Between-graph replication per l’allenamento cross-machine? Chiedo questa domanda perché @mrry ha indicato che la In-graph replication è essenzialmente la stessa del modo utilizzato nel modello di esempio CIFAR-10 per più GPU .

Prima di tutto, per alcuni contesti storici, “replica in-graph” è il primo approccio che abbiamo provato in TensorFlow, e non ha raggiunto le prestazioni richieste da molti utenti, quindi l’approccio “tra i grafici” più complicato è l’attuale modo consigliato per eseguire un allenamento distribuito. Le librerie di livello superiore come tf.learn utilizzano l’approccio “tra i grafici” per la formazione distribuita.

Per rispondere alle tue domande specifiche:

  1. Significa che ci sono più tf.Graph nell’approccio di replica tra grafici? Se sì, dove sono i codici corrispondenti negli esempi forniti?

    Sì. L’impostazione tipica della replica tra grafici utilizzerà un processo TensorFlow separato per ciascuna replica di worker e ognuno di essi creerà un tf.Graph separato per il modello. Di solito ogni processo utilizza il grafico di default globale (accessibile tramite tf.get_default_graph() ) e non viene creato esplicitamente.

    (In linea di principio, è ansible utilizzare un singolo processo TensorFlow con lo stesso tf.Graph e più oggetti tf.Session che condividono lo stesso grafico sottostante, purché l’opzione tf.ConfigProto.device_filters per ogni sessione sia stata configurata in tf.ConfigProto.device_filters diverso, ma questo è una configurazione insolita.)

  2. Sebbene esista già un esempio di replica tra grafici nel link sopra, qualcuno potrebbe fornire un’implementazione di replica in-graph (lo pseudocodice va bene) ed evidenziare le sue principali differenze dalla replica tra grafici?

    Per ragioni storiche, non ci sono molti esempi di replica in-graph ( l’essenza di Yaroslav è un’eccezione). Un programma che utilizza la replica in-graph in genere include un ciclo che crea la stessa struttura grafica per ciascun lavoratore (ad esempio il ciclo sulla linea 74 del gist ) e utilizza la condivisione variabile tra i lavoratori.

    L’unico punto in cui persiste la replica in-graph è l’utilizzo di più dispositivi in ​​un singolo processo (ad esempio più GPU). Il modello di esempio CIFAR-10 per più GPU è un esempio di questo modello (vedere qui i dispositivi loop over GPU).

(A mio parere, l’incoerenza tra il modo in cui vengono trattati più lavoratori e più dispositivi in ​​un singolo lavoratore è sfortunata. La replica in-graph è più semplice da capire rispetto alla replica tra grafici, perché non si basa sulla condivisione implicita tra le repliche. Le librerie di livello superiore, come tf.learn e TF-Slim, nascondono alcuni di questi problemi e offrono la speranza di poter offrire uno schema di replica migliore in futuro.)

  1. Perché diciamo che ogni cliente costruisce un grafico simile , ma non lo stesso grafico?

    Perché non è richiesto che siano identici (e non esiste un controllo di integrità che lo imponga). In particolare, ogni lavoratore può creare un grafico con assegnazioni di dispositivi espliciti diversi ( "/job:worker/task:0" , "/job:worker/task:1" , ecc.). Il capo operaio potrebbe creare ulteriori operazioni che non sono state create (o utilizzate) dai lavoratori non principali. Tuttavia, nella maggior parte dei casi, i grafici sono logicamente (ad es. Assegnazione dei moduli modulo) uguali.

    Non dovrebbe essere più copie della parte ad alta intensità di calcolo del modello, dal momento che abbiamo più lavoratori?

    In genere, ogni lavoratore ha un grafico separato che contiene una singola copia della parte ad alta intensità di calcolo del modello. Il grafico per worker i non contiene i nodes per worker j (assumendo i ≠ j). (Un’eccezione potrebbe essere il caso in cui si utilizza la replica tra grafici per la formazione distribuita e la replica in-graph per l’utilizzo di più GPU in ciascun lavoratore. In tal caso, il grafico per un lavoratore normalmente contiene N copie del calcolo – parte intensiva del grafico, dove N è il numero di GPU in quel lavoratore.)

  2. L’esempio nella formazione replicata supporta l’addestramento su più macchine, ognuna delle quali ha più GPU?

    Il codice di esempio copre solo la formazione su più macchine e non dice nulla su come allenarsi su più GPU in ciascuna macchina. Tuttavia, le tecniche si compongono facilmente. In questa parte dell’esempio:

     # Build model... loss = ... 

    … è ansible aggiungere un loop sulle GPU nel computer locale, per ottenere formazione distribuita su più worker ciascuno con più GPU.