2016-11-22 335 views
2

我正在尝试第一次使用GPU计算,当然希望大幅加速。但是在张量流的一个基本例子中,它实际上更糟糕:GPU上的Tensorflow matmul计算比CPU上的计算速度慢

在cpu:0上,10次运行平均每次平均需要2秒,gpu:0需要2.7秒,而gpu:1比cpu差50% 0与3秒。

下面的代码:

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) 

什么我观察这里?运行时间可能主要是通过在RAM和GPU之间复制数据来控制的?

+0

尝试增加矩阵并查看'nvidia-smi'中的gpu用法与'top'中的cpu用法。 – sygi

+0

@sygi谢谢,我不知道'nvidia-smi'。它显示GPU-Util不会超过2%。尽管python似乎占用了大部分内存。功耗在40W/180W时相当稳定 – stefan

+1

因此,您所编写的代码看起来并不是gpu-bound。你可以尝试将'a'和'b'改成'tf.random_uniform([1000,1000])'? 就内存而言,TF默认采用所有GPU内存(恶心!),但是有一个选项可以通过强制动态分配。 – sygi

回答

3

您用于生成数据的方式在CPU上执行(random.random()是一个常规的python函数,而不是TF-one)。另外,在一次运行中执行10^6次将比请求10^6随机数慢。 代码更改为:

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

使得数据将在GPU上并行地生成并没有时间将被浪费将其从RAM传送到GPU。