TensorFlow, похоже, не использует GPU

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

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

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_jenkinshomeworkspacerelease-windevicegpuoswindowstensorflowstream_executordso_loader.cc:128] successfully opened CUDA library cublas64_80.dll locally
I c:tf_jenkinshomeworkspacerelease-windevicegpuoswindowstensorflowstream_executordso_loader.cc:128] successfully opened CUDA library cudnn64_5.dll locally
I c:tf_jenkinshomeworkspacerelease-windevicegpuoswindowstensorflowstream_executordso_loader.cc:128] successfully opened CUDA library cufft64_80.dll locally
I c:tf_jenkinshomeworkspacerelease-windevicegpuoswindowstensorflowstream_executordso_loader.cc:128] successfully opened CUDA library nvcuda.dll locally
I c:tf_jenkinshomeworkspacerelease-windevicegpuoswindowstensorflowstream_executordso_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_jenkinshomeworkspacerelease-windevicegpuoswindowstensorflowcorecommon_runtimegpugpu_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_jenkinshomeworkspacerelease-windevicegpuoswindowstensorflowcorecommon_runtimegpugpu_device.cc:906] DMA: 0 
I c:tf_jenkinshomeworkspacerelease-windevicegpuoswindowstensorflowcorecommon_runtimegpugpu_device.cc:916] 0:   Y 
I c:tf_jenkinshomeworkspacerelease-windevicegpuoswindowstensorflowcorecommon_runtimegpugpu_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_jenkinshomeworkspacerelease-windevicegpuoswindowstensorflowcorecommon_runtimedirect_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_jenkinshomeworkspacerelease-windevicegpuoswindowstensorflowcorecommon_runtimesimple_placer.cc:827] MatMul_108: (MatMul)/job:localhost/replica:0/task:0/gpu:0
I c:tf_jenkinshomeworkspacerelease-windevicegpuoswindowstensorflowcorecommon_runtimesimple_placer.cc:827] MatMul_109: (MatMul)/job:localhost/replica:0/task:0/gpu:0
I c:tf_jenkinshomeworkspacerelease-windevicegpuoswindowstensorflowcorecommon_runtimesimple_placer.cc:827] MatMul_110: (MatMul)/job:localhost/replicacalhost/replica:0/task:0/gpu:0
I c:tf_jenkinshomeworkspacerelease-windevicegpuoswindowstensorflowcorecommon_runtimesimple_placer.cc:827] MatMul_107: (MatMul)/job:localgpu:0
I c:tf_jenkinshomeworkspacerelease-windevicegpuoswindowstensorflowcorecommon_runtimesimple_placer.cc:827] MatMul_103: (MatMul)/job:localhost/replica:0/task:0/gpu:0
I c:tf_jenkinshomeworkspacerelease-windevicegpuoswindowstensorflowcorecommon_runtimesimple_placer.cc:827] MatMul_104: (MatMul)/job:localhost/replica:0/task:0/gpu:0
I c:tf_jenkinshomeworkspacerelease-windevicegpuoswindowstensorflowcorecommon_runtimesimple_placer.cc:827] MatMul_105: (MatMul)/job:localhost/replica:0/task:0/gpu:0
I c:tf_jenkinshomeworkspacerelease-windevicegpuoswindowstensorflowcorecommon_runtimesimple_placer.cc:827] MatMul_106: (MatMul)/job:lo c:tf_jenkinshomeworkspacerelease-windevicegpuoswindowstensorflowcorecommon_runtimesimple_placer.cc:827] Const_1: (Const)/job:localhost/replica:0/task:0/gpu:0
I c:tf_jenkinshomeworkspacerelease-windevicegpuoswindowstensorflowcorecommon_runtimesimple_placer.cc:827] MatMul_100: (MatMul)/job:localhost/replica:0/task:0/gpu:0
I c:tf_jenkinshomeworkspacerelease-windevicegpuoswindowstensorflowcorecommon_runtimesimple_placer.cc:827] MatMul_101: (MatMul)/job:localhost/replica:0/task:0/gpu:0
I c:tf_jenkinshomeworkspacerelease-windevicegpuoswindowstensorflowcorecommon_runtimesimple_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 выход такой же, с cpu:0 вместо gpu:0. Время вычислений не меняется. Даже я использую больше операций, например, со временем выполнения около 1 минуты, GPU и CPU равны. Большое спасибо заранее!

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

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

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

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 действительно бить cpu. Увеличение размера матрицы может выявить различия.