【问题标题】:Two exactly same systems have very different performances when running Tensorflow script on GPU在 GPU 上运行 Tensorflow 脚本时,两个完全相同的系统具有非常不同的性能
【发布时间】:2017-05-08 08:09:58
【问题描述】:

我有两台具有相同 GPU (GTX 1080) 的计算机,安装了相同的操作系统和软件副本。但是当我运行我的 tensorflow 程序(一个 RNN 模型)时,速度却大不相同。一个比另一个快大约 1.5 倍。

以下是两者的主要规格:

SystemA:华硕 Z170-P、i7 6700T、32GB 内存、GTX 1080。
SystemB:华硕X99 E-WS,i7 5930K,128G Ram,GTX 1080。(问题一)

两者都安装(使用相同的方法):

操作系统:Ubuntu 16.04
GPU驱动版本:378.13
Cuda 版本:8.0
cuDNN 版本:5.1
Tensorflow:使用方法安装pip install tensorflow-gpu==1.0.1
Python:蟒蛇 3.6

示例代码:

import tensorflow as tf
import numpy as np
from tqdm import trange

h,w = 3000, 2000
steps = 1000

x = tf.placeholder(dtype=tf.float32, shape=[h, w], name='x')
t = tf.constant(np.random.random(size=[w, w]), dtype=tf.float32)
m = tf.matmul(x,t)

x0 = np.random.random(size=[h, w])
sess = tf.Session()
for i in trange(steps):
    x0 = sess.run(m, feed_dict={x: x0})

SystemA 执行 75 iter/sec,而 systemB 只有 50 iter/sec,是的,更差的实际上更快。

主要观察:

  1. SystemB 在运行程序时出现更大的页面错误。
  2. 通过从nvidia-smi监控Volatile GPU-Util,systemA稳定在40%左右,systemB在30%左右。

我在 systemB 上尝试过的事情:

  1. 将 BIOS 升级到最新版本并重置默认设置。
  2. 致电华硕客服寻求帮助。
  3. 将 GPU 卡与系统 A 交换。
  4. 更改 PCI-e 插槽以确保它在 x16 gen3 上运行。
  5. LD_PRELOAD="/usr/lib/libtcmalloc.so" 注入.bashrc 文件。

/usr/bin/time -v输出的主要区别是:

# The first value is for systemB and the second is for systemA.
System time (seconds): 7.28  2.95
Percent of CPU this job got: 85%  106%
Elapsed (wall clock) time (h:mm:ss or m:ss): 0:22.41  0:14.89
Minor (reclaiming a frame) page faults: 684695  97853
Involuntary context switches: 164  91063
File system inputs: 0  24
File system outputs: 8  0

谁能指出如何分析/调试此问题的方向?非常感谢!

【问题讨论】:

    标签: io tensorflow gpu nvidia


    【解决方案1】:

    您可能没有使用 GPU。要测试这个使用

    sess = tf.Session(config=tf.ConfigProto(log_device_placement=True))
    

    显示您正在使用的设备。

    如果您确实在使用 CPU,那么您可以在 tensorflow 代码之前添加以下内容

    with tf.device('/gpu:0'):  # NEW LINE
        x = tf.placeholder(dtype=tf.float32, shape=[h, w], name='x')
        t = tf.constant(np.random.random(size=[w, w]), dtype=tf.float32)
        m = tf.matmul(x,t)
    

    如果不是这样,请在您的结果中添加评论,我会跟进看看我还能做些什么。

    根据to some sources tf.constant 是GPU 内存消耗。换个试试

    t = tf.constant(np.random.random(size=[w, w]), dtype=tf.float32)
    

    t = tf.Variable(np.random.random(size=[w, w]), dtype=tf.float32)
    

    尝试没有网络流量的模型

    import tensorflow as tf
    import numpy as np
    from tqdm import trange
    
    h,w = 3000, 2000
    steps = 1000
    
    x = tf.random_normal( [h, w] , dtype=tf.float32 )
    t = tf.constant(np.random.random(size=[w, w]), dtype=tf.float32)
    m = tf.matmul(x,t)
    s = tf.reduce_mean( tf.reduce_mean( m ) )
    
    sess = tf.Session()
    for i in range(steps):
        sess.run(s)
    

    Xer 实验结果 经过多次讨论和故障排除,很明显这两台机器确实不同。更换了 Nvidia 卡,结果没有任何变化。它们有 2 种不同的 CPU,一种内置图形处理器,另一种没有。一个有更高的CPU,一个没有。我建议在 i7 上带有板载图形的机器禁用操作系统图形窗口系统,以确保测试是未使用的 GPU 与未使用的 GPU。问题依然存在。

    发布的原始问题会在主总线上从 CPU 到 Nvidia GPU 产生大量数据流量,如下所示

         Tx Throughput               : 75000 KB/s
         Rx Throughput               : 151000 KB/s
    

    我们尝试将问题的大小从 W=2000、W=200 和 W=1000 改变,发现当 W 足够小时,两台机器的性能几乎相同。 W 不仅控制 GPU 上问题的大小,还控制 CPU 和 GPU 之间的流量。

    虽然我们确实找到了解决方案或精确的模型,但我相信经过@Xer 的大量探索后,我可以自信地说这两个系统并不相同它们的物理差异(BUS+CPU)造成了性能差异。

    【讨论】:

    • 非常感谢您回答我的问题!不幸的是,问题仍然存在,手动将所有操作设置为 gpu,不到 30% gpu-volatile 和 50 iter/sec。
    • log_device_placement 报告了什么?
    • 它报告:MatMul: (MatMul): /job:localhost/replica:0/task:0/gpu:0 I tensorflow/core/common_runtime/simple_placer.cc:841] MatMul: (MatMul)/job:localhost/replica:0/task:0/gpu:0 Const: (Const): /job:localhost/replica:0/task:0/gpu:0 I tensorflow/core/common_runtime/simple_placer.cc:841] Const: (Const)/job:localhost/replica:0/task:0/gpu:0 x: (Placeholder): /job:localhost/replica:0/task:0/gpu:0 I tensorflow/core/common_runtime/simple_placer.cc:841] x: (Placeholder)/job:localhost/replica:0/task:0/gpu:0
    • 我添加了另一种可能性,它是 tf.constant。你能试试看吗?另外,您可以尝试将 W 的大小减小 x10 吗?
    • 我将 W 设置为 200,volatile 约为 20%,spped 为 561 iter/sec。抱歉,我不太明白你的意思 baout tf.constant,它现在在 tf.device('/gpu:0") 块下,我应该把它移出吗?
    猜你喜欢
    • 2020-03-28
    • 1970-01-01
    • 2014-11-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-23
    • 2018-07-14
    • 1970-01-01
    相关资源
    最近更新 更多