2016-12-16 2 views
4

Ich verwende TensorFlow unter Windows 8 und Python 3.5. Ich habe this kurzes Beispiel geändert, um zu sehen, ob die GPU-Unterstützung (Titan X)) funktioniert. Leider ist die Laufzeit mit (tf.device("/gpu:0") und ohne (tf.device("/cpu:0")) mit der GPU identisch. Die Windows-CPU-Überwachung zeigt, dass in beiden Fällen die CPU-Auslastung während der Berechnung etwa 100% beträgt.TensorFlow scheint keine GPU zu verwenden

Dies ist der Code Beispiel:

import numpy as np 
import tensorflow as tf 
import datetime 

#num of multiplications to perform 
n = 100 

# Create random large matrix 
matrix_size = 1e3 
A = np.random.rand(matrix_size, matrix_size).astype('float32') 
B = np.random.rand(matrix_size, matrix_size).astype('float32') 

# Creates a graph to store results 
c1 = [] 

# Define matrix power 
def matpow(M, n): 
    if n < 1: #Abstract cases where n < 1 
     return M 
    else: 
     return tf.matmul(M, matpow(M, n-1)) 

with tf.device("/gpu:0"): 
    a = tf.constant(A) 
    b = tf.constant(B) 
    #compute A^n and B^n and store results in c1 
    c1.append(matpow(a, n)) 
    c1.append(matpow(b, n)) 

    sum = tf.add_n(c1) 

t1 = datetime.datetime.now() 
with tf.Session(config=tf.ConfigProto(log_device_placement=True)) as sess: 
    # Runs the op. 
    sess.run(sum) 
t2 = datetime.datetime.now() 

print("computation time: " + str(t2-t1)) 

Und hier ist der Ausgang für den GPU Fall:

I c:\tf_jenkins\home\workspace\release-win\device\gpu\os\windows\tensorflow\stream_executor\dso_loader.cc:128] successfully opened CUDA library cublas64_80.dll locally 
I c:\tf_jenkins\home\workspace\release-win\device\gpu\os\windows\tensorflow\stream_executor\dso_loader.cc:128] successfully opened CUDA library cudnn64_5.dll locally 
I c:\tf_jenkins\home\workspace\release-win\device\gpu\os\windows\tensorflow\stream_executor\dso_loader.cc:128] successfully opened CUDA library cufft64_80.dll locally 
I c:\tf_jenkins\home\workspace\release-win\device\gpu\os\windows\tensorflow\stream_executor\dso_loader.cc:128] successfully opened CUDA library nvcuda.dll locally 
I c:\tf_jenkins\home\workspace\release-win\device\gpu\os\windows\tensorflow\stream_executor\dso_loader.cc:128] successfully opened CUDA library curand64_80.dll locally 
C:/Users/schlichting/.spyder-py3/temp.py:16: VisibleDeprecationWarning: using a non-integer number instead of an integer will result in an error in the future 
    A = np.random.rand(matrix_size, matrix_size).astype('float32') 
C:/Users/schlichting/.spyder-py3/temp.py:17: VisibleDeprecationWarning: using a non-integer number instead of an integer will result in an error in the future 
    B = np.random.rand(matrix_size, matrix_size).astype('float32') 
I c:\tf_jenkins\home\workspace\release-win\device\gpu\os\windows\tensorflow\core\common_runtime\gpu\gpu_device.cc:885] Found device 0 with properties: 
name: GeForce GTX TITAN X 
major: 5 minor: 2 memoryClockRate (GHz) 1.076 
pciBusID 0000:01:00.0 
Total memory: 12.00GiB 
Free memory: 2.40GiB 
I c:\tf_jenkins\home\workspace\release-win\device\gpu\os\windows\tensorflow\core\common_runtime\gpu\gpu_device.cc:906] DMA: 0 
I c:\tf_jenkins\home\workspace\release-win\device\gpu\os\windows\tensorflow\core\common_runtime\gpu\gpu_device.cc:916] 0: Y 
I c:\tf_jenkins\home\workspace\release-win\device\gpu\os\windows\tensorflow\core\common_runtime\gpu\gpu_device.cc:975] Creating TensorFlow device (/gpu:0) -> (device: 0, name: GeForce GTX TITAN X, pci bus id: 0000:01:00.0) 
D c:\tf_jenkins\home\workspace\release-win\device\gpu\os\windows\tensorflow\core\common_runtime\direct_session.cc:255] Device mapping: 
/job:localhost/replica:0/task:0/gpu:0 -> device: 0, name: GeForce GTX TITAN X, pci bus id: 0000:01:00.0 

Ievice mapping: 
/job:localhost/replica:0/task:0/gpu:0 -> device: 0, name: GeForce GTX TITAN X, pci bus id: 0000:01:00.0 

C:0/task:0/gpu:0 
host/replica:0/task:0/gpu:0 
I c:\tf_jenkins\home\workspace\release-win\device\gpu\os\windows\tensorflow\core\common_runtime\simple_placer.cc:827] MatMul_108: (MatMul)/job:localhost/replica:0/task:0/gpu:0 
I c:\tf_jenkins\home\workspace\release-win\device\gpu\os\windows\tensorflow\core\common_runtime\simple_placer.cc:827] MatMul_109: (MatMul)/job:localhost/replica:0/task:0/gpu:0 
I c:\tf_jenkins\home\workspace\release-win\device\gpu\os\windows\tensorflow\core\common_runtime\simple_placer.cc:827] MatMul_110: (MatMul)/job:localhost/replicacalhost/replica:0/task:0/gpu:0 
I c:\tf_jenkins\home\workspace\release-win\device\gpu\os\windows\tensorflow\core\common_runtime\simple_placer.cc:827] MatMul_107: (MatMul)/job:localgpu:0 
I c:\tf_jenkins\home\workspace\release-win\device\gpu\os\windows\tensorflow\core\common_runtime\simple_placer.cc:827] MatMul_103: (MatMul)/job:localhost/replica:0/task:0/gpu:0 
I c:\tf_jenkins\home\workspace\release-win\device\gpu\os\windows\tensorflow\core\common_runtime\simple_placer.cc:827] MatMul_104: (MatMul)/job:localhost/replica:0/task:0/gpu:0 
I c:\tf_jenkins\home\workspace\release-win\device\gpu\os\windows\tensorflow\core\common_runtime\simple_placer.cc:827] MatMul_105: (MatMul)/job:localhost/replica:0/task:0/gpu:0 
I c:\tf_jenkins\home\workspace\release-win\device\gpu\os\windows\tensorflow\core\common_runtime\simple_placer.cc:827] MatMul_106: (MatMul)/job:lo c:\tf_jenkins\home\workspace\release-win\device\gpu\os\windows\tensorflow\core\common_runtime\simple_placer.cc:827] Const_1: (Const)/job:localhost/replica:0/task:0/gpu:0 
I c:\tf_jenkins\home\workspace\release-win\device\gpu\os\windows\tensorflow\core\common_runtime\simple_placer.cc:827] MatMul_100: (MatMul)/job:localhost/replica:0/task:0/gpu:0 
I c:\tf_jenkins\home\workspace\release-win\device\gpu\os\windows\tensorflow\core\common_runtime\simple_placer.cc:827] MatMul_101: (MatMul)/job:localhost/replica:0/task:0/gpu:0 
I c:\tf_jenkins\home\workspace\release-win\device\gpu\os\windows\tensorflow\core\common_runtime\simple_placer.cc:827] MatMul_102: (MatMul)/job:localhost/replica:0/task:0/Ionst_1: (Const): /job:localhost/replica:0/task:0/gpu:0 


MatMul_100: (MatMul): /job:localhost/replica:0/task:0/gpu:0 
MatMul_101: (MatMul): /job:localhost/replica:0/task:0/gpu:0 
... 
MatMul_198: (MatMul): /job:localhost/replica:0/task:0/gpu:0 
MatMul_199: (MatMul): /job:localhost/replica:0/task:0/gpu:0 
Const: (Const): /job:localhost/replica:0/task:0/gpu:0 
MatMul: (MatMul): /job:localhost/replica:0/task:0/gpu:0 
MatMul_1: (MatMul): /job:localhost/replica:0/task:0/gpu:0 
MatMul_2: (MatMul): /job:localhost/replica:0/task:0/gpu:0 
MatMul_3: (MatMul): /job:localhost/replica:0/task:0/gpu:0 
... 
MatMul_98: (MatMul): /job:localhost/replica:0/task:0/gpu:0 
MatMul_99: (MatMul): /job:localhost/replica:0/task:0/gpu:0 
AddN: (AddN): /job:localhost/replica:0/task:0/gpu:0 
computation time: 0:00:05.066000 

Bei CPU ist der Ausgang gleich, mit cpu: 0 statt gpu:0. Die Rechenzeit ändert sich nicht. Sogar ich verwende mehr Operationen, z.B. Bei einer Laufzeit von ca. 1 Minute sind GPU und CPU gleich. Vielen Dank im Voraus!

Antwort

2

Gemäß Protokollinformationen, insbesondere Geräteplatzierung, verwendet Ihr Code GPU. Nur die Zeit zu laufen ist die gleiche. Meine Vermutung ist, dass:

c1.append(matpow(a, n)) 
c1.append(matpow(b, n)) 

der Engpass in Ihrem Code ist, große Matrizen von GPU-Speicher bewegt in dem RAM auf und auf. Können Sie versuchen:

  • die Matrixgröße zu 1e4 x 1e4

  • with tf.device("/gpu:0"): 
        A = tf.random_normal([matrix_size, matrix_size]) 
        B = tf.random_normal([matrix_size, matrix_size]) 
        C = tf.matmul(A, B) 
    with tf.Session(config=tf.ConfigProto(log_device_placement=True)) as sess: 
        t1 = datetime.datetime.now() 
        sess.run(C) 
        t2 = datetime.datetime.now() 
    
+0

Danke! Jetzt funktioniert es, die GPU ist etwa 20x schneller als die CPU. – user3641158

+0

Scheint, dass für die Matrixerstellung die Tensorflow-Methode, hier tf.random_normal(), verwendet werden muss, anstatt eine numpige Matrix mit np.random.rand() zu definieren. – user3641158

1

Sagen Sie zum Beispiel Änderung nimmt die tensorflow Sitzung erstellt 4,9 Sekunden und die einzigen tatsächlichen Berechnungen 0,1 auf der CPU geben nimmt Sie haben eine Zeit von 5.0 Sekunden auf der CPU. Nun sagen wir, dass das Erstellen der Sitzung auf der GPU auch 4,9 Sekunden dauert, aber die Berechnung dauert 0,01 Sekunden, was eine Zeit von 4,91 Sekunden ergibt. Du würdest den Unterschied kaum sehen. Das Erstellen der Sitzung ist eine einmalige Gemeinkosten beim Starten eines Programms. Sie sollten das nicht in Ihr Timing aufnehmen. Auch Tensorflow führt einige Kompilierungen durch, wenn Sie sess.run zum ersten Mal aufrufen, was den ersten Lauf noch langsamer macht.

Versuchen Sie es wie folgt.

with tf.Session(config=tf.ConfigProto(log_device_placement=True)) as sess: 
    # Runs the op the first time. 
    sess.run(sum) 
    t1 = datetime.datetime.now() 
    for i in range(1000): 
     sess.run(sum) 
    t2 = datetime.datetime.now() 

Wenn diese es nicht beheben könnte es auch sein, dass Ihre Berechnung nicht für die GPU genügend Parallelität erlaubt, um wirklich die CPU zu schlagen. Eine Erhöhung der Matrixgröße könnte die Unterschiede aufzeigen.