2016-05-30 122 views
14

Per un po 'ho notato che TensorFlow (v0.8) non sembra utilizzare appieno la potenza di calcolo del mio Titan X. Per diversi CNN su cui ho eseguito la GPU l'uso non sembra superare il ~ 30%. In genere l'utilizzo della GPU è ancora più basso, più simile al 15%. Un esempio particolare di una CNN che mostra questo comportamento è la CNN dal documento Atari di DeepMind con Q-learning (vedi il link sotto per il codice).TensorFlow - Basso utilizzo della GPU su Titan X

Quando vedo altre persone del nostro laboratorio che eseguono CNN scritti in Theano o Torch, l'utilizzo della GPU è in genere 80% +. Questo mi fa domandare, perché le CNN che scrivo in TensorFlow sono così 'lente' e cosa posso fare per utilizzare in modo più efficiente la potenza di elaborazione della GPU? In generale, sono interessato ai modi per profilare le operazioni della GPU e scoprire dove sono i colli di bottiglia. Qualche raccomandazione su come farlo è molto gradita dato che questo non sembra possibile con TensorFlow al momento.

cose che ho fatto per saperne di più circa la causa di questo problema:

  1. Analizzando il posizionamento dispositivo di tensorflow, tutto sembra essere sulla gpu:/0 così sembra OK.

  2. Utilizzo di cProfilo, Ho ottimizzato la generazione batch e altri passaggi di pre-elaborazione. La preelaborazione viene eseguita su un singolo thread, ma l'effettiva ottimizzazione eseguita dai passaggi di TensorFlow richiede molto più tempo (vedere i runtime medi di seguito). Un'idea ovvia per aumentare la velocità è l'utilizzo di TF Queue Runner, ma dal momento che la preparazione del lotto è già 20 volte più veloce dell'ottimizzazione, mi chiedo se questo farà una grande differenza.

    Avg. Time Batch Preparation: 0.001 seconds 
    Avg. Time Train Operation: 0.021 seconds 
    Avg. Time Total per Batch: 0.022 seconds (45.18 batches/second) 
    
  3. Esegui su più macchine per escludere problemi hardware.

  4. Aggiornato alle ultime versioni di CuDNN v5 (RC), CUDA Toolkit 7.5 e reinstallato TensorFlow da fonti circa una settimana fa.

Un esempio della Q-learning CNN per i quali si verifica questo 'problema' può essere trovato qui: https://github.com/tomrunia/DeepReinforcementLearning-Atari/blob/master/qnetwork.py

Esempio di NVIDIA SMI visualizzazione del basso utilizzo della GPU: NVIDIA-SMI

+0

La modifica della dimensione del batch modifica il comportamento? O rendere la rete più complessa? – etarion

+0

+1 sull'aumento della dimensione mini batch. Il numero di GPU-Util volatile potrebbe avere tanto a causa dell'utilizzo della memoria che altro. Con 12 GB su un Titan X hai un sacco di spazio per la testa lì. Se il tuo modello non occupa molta memoria, puoi riempirlo con lotti più grandi. – j314erre

+1

Ho eseguito un piccolo esperimento per studiare l'influenza della modifica della dimensione del batch. Di seguito sono riportati i risultati per l'alimentazione dei lotti di dimensioni N = 1..512 all'operazione di allenamento. Ogni esempio di allenamento è un tensore 84x84x4 di tipo 'tf.float32'. I risultati sono qui: http: // pastebin.com/xrku9AjW Come si può vedere l'utilizzo della GPU non sembra cambiare in modo significativo, o diminuisce anche quando si aumenta la dimensione del batch. Le misurazioni del tempo sono medie su 100 lotti e sono registrate usando 'time.time()'. Qualche indizio su cosa c'è di sbagliato qui? –

risposta

0

Hai provato downgrade a Cuda 7.0? Come ho letto potrebbero esserci problemi con Tensorflow su Titan X con Cuda 7.5.

1

Con le versioni più recenti di Tensorflow (sto usando Tensorflow 1.4), possiamo ottenere runtime statistics e visualizzarle in Tensorboard.

Queste statistiche includono il tempo di elaborazione e l'utilizzo della memoria per ciascun nodo nel grafico di calcolo.