2016-11-22 3 views
2

Ich experimentiere mit GPU Berechnungen zum ersten Mal und hoffte auf eine große Beschleunigung, natürlich. Jedoch mit einem grundlegenden Beispiel in Tensorflow war es tatsächlich schlimmer:Tensorflow Matmul Berechnungen auf GPU sind langsamer als auf CPU

Auf CPU: 0, dauert jeder der zehn Läufe im Durchschnitt 2 Sekunden, GPU: 0 dauert 2,7 Sekunden und GPU: 1 ist 50% schlechter als CPU: 0 mit 3 Sekunden.

Hier ist der Code:

import tensorflow as tf 
import numpy as np 
import time 
import random 

for _ in range(10): 
    with tf.Session() as sess: 
     start = time.time() 
     with tf.device('/gpu:0'): # swap for 'cpu:0' or whatever 
      a = tf.constant([random.random() for _ in xrange(1000 *1000)], shape=[1000, 1000], name='a') 
      b = tf.constant([random.random() for _ in xrange(1000 *1000)], shape=[1000, 1000], name='b') 
      c = tf.matmul(a, b) 
      d = tf.matmul(a, c) 
      e = tf.matmul(a, d) 
      f = tf.matmul(a, e) 
      for _ in range(1000): 
       sess.run(f) 
     end = time.time() 
     print(end - start) 

Was ich hier beobachte? Kann die Laufzeit hauptsächlich durch das Kopieren von Daten zwischen RAM und GPU bestimmt werden?

+0

Versuchen Sie, die Matrizen zu erhöhen und die GPU-Nutzung in 'nvidia-smi' gegenüber der CPU-Nutzung in' top' zu sehen. – sygi

+0

@sygi danke, ich wusste nicht über 'nvidia-smi'. Es zeigt, dass GPU-Util nicht über 2% hinausgeht. Python scheint jedoch den größten Teil des Speichers zu beanspruchen. Der Stromverbrauch ist ziemlich stabil bei 40W/180W – stefan

+1

So scheint es, dass der Code, den Sie geschrieben haben, nicht gpu-gebunden ist. Können Sie versuchen, 'a' und' b' in 'tf.random_uniform ([1000, 1000])' 'zu ändern? Was Speicher anbelangt, nimmt TF standardmäßig den gesamten GPU-Speicher (sick!), Aber es gibt eine Option, die übergeben wird, um die dynamische Zuweisung zu erzwingen. – sygi

Antwort

3

Die Art, wie Sie Daten generieren, wird auf der CPU ausgeführt (random.random() ist eine reguläre Python-Funktion und nicht TF-one). Außerdem wird die Ausführung 10^6 mal langsamer sein als die Anforderung von 10^6 Zufallszahlen in einem Lauf. den Code ändern:

a = tf.random_uniform([1000, 1000], name='a') 
b = tf.random_uniform([1000, 1000], name='b') 

so dass die Daten auf einer GPU in parallel und keine Zeit, es zu GPU von RAM zu übertragen verschwendet wird erzeugt werden.

Verwandte Themen