2016-12-16 3 views
4

Я использую TensorFlow для Windows 8 и Python 3.5. Я изменил код this, чтобы увидеть, поддерживает ли GPU (Titan X)). К сожалению, время работы с (tf.device("/gpu:0") и без (tf.device("/cpu:0")) с использованием графического процессора одинаково. Мониторинг процессора Windows показывает, что в обоих случаях загрузка процессора составляет около 100% при вычислении.TensorFlow, похоже, не использует GPU

Это пример кода:

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)) 

А вот выход для случая GPU:

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 

В случае CPU выход то же самое, с центрального процессора: 0 вместо gpu:0. Время вычисления не изменяется. Даже я использую больше операций, например. с временем работы около 1 минуты, графический процессор и процессор равны. Большое спасибо заранее!

ответ

2

В соответствии с информацией о журнале, в частности размещением устройства, код использует GPU. Просто время для запуска такое же. Я думаю, что:

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

является узким местом в вашем коде, двигая большие матрицы из памяти GPU в оперативную память и дальше. Вы можете попробовать:

  • изменить размер матрицы в 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

Спасибо! Теперь он работает, графический процессор примерно в 20 раз быстрее, чем процессор. – user3641158

+0

Кажется, что для создания матрицы необходимо использовать метод tensorflow, здесь tf.random_normal(), вместо определения матрицы numpy с np.random.rand(). – user3641158

1

Скажем, например, создающего tensorflow сеанс занимает 4,9 секунды, а фактические расчеты только принимает 0.1 на процессоре подачи вы время 5.0 секунд на процессор. Теперь скажем, что создание сеанса на gpu также занимает 4,9 секунды, но расчет занимает 0,01 секунды, давая время 4,91 секунды. Вы вряд ли увидите разницу. Создание сеанса - это однократная накладная стоимость при запуске программы. Вы не должны включать это в свое время. Также tensorflow делает некоторую компиляцию/оптимизацию, когда вы вызываете sess.run в первый раз, что делает первый запуск еще медленнее.

Попробуйте использовать его так.

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() 

Если это не исправить это может быть, что ваш расчет не позволяет достаточно параллелизма для GPU, чтобы действительно победить процессора. Увеличение размера матрицы может привести к различиям.