当 运行 GPU 上的 Tensorflow 脚本时,两个完全相同的系统具有非常不同的性能
Two exactly same systems have very different performances when running Tensorflow script on GPU
我有两台具有相同 GPU(GTX 1080) 的计算机,安装了相同的 OS 副本和软件。但是当我 运行 我的 tensorflow 程序(一个 RNN 模型)时,速度非常不同。一个比另一个快 1.5 倍。
以下是两者的主要规格:
系统 A:华硕 Z170-P,i7 6700T,32GB 内存,GTX 1080。
SystemB:Asus X99 E-WS,i7 5930K,128G Ram,GTX 1080。(问题一)
两者都安装了(使用相同的方法):
OS: Ubuntu 16.04
GPU 驱动程序版本:378.13
库达版本: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,是的,较差的实际上更快。
主要观察结果:
- SystemB 在 运行 运行程序时出现更大的页面错误。
- 通过监控来自
nvidia-smi
的Volatile GPU-Util
,系统A稳定在40%左右,而系统B在30%左右。
我在 systemB 上尝试过的东西:
- 将 BIOS 升级到最新版本并重置默认设置。
- 致电华硕客服寻求帮助。
- 与系统A交换GPU卡
- 更改 PCI-e 插槽以确保它 运行在 x16 gen3 上可用。
- 将
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
任何人都可以指出如何 profile/debug 这个问题的方向吗?非常感谢!
您可能没有使用 GPUs。要测试这个使用
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)
如果不是这种情况,请在评论中添加您的结果,我会跟进看看我还能做些什么。
根据 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(GTX 1080) 的计算机,安装了相同的 OS 副本和软件。但是当我 运行 我的 tensorflow 程序(一个 RNN 模型)时,速度非常不同。一个比另一个快 1.5 倍。
以下是两者的主要规格:
系统 A:华硕 Z170-P,i7 6700T,32GB 内存,GTX 1080。
SystemB:Asus X99 E-WS,i7 5930K,128G Ram,GTX 1080。(问题一)
两者都安装了(使用相同的方法):
OS: Ubuntu 16.04
GPU 驱动程序版本:378.13
库达版本: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,是的,较差的实际上更快。
主要观察结果:
- SystemB 在 运行 运行程序时出现更大的页面错误。
- 通过监控来自
nvidia-smi
的Volatile GPU-Util
,系统A稳定在40%左右,而系统B在30%左右。
我在 systemB 上尝试过的东西:
- 将 BIOS 升级到最新版本并重置默认设置。
- 致电华硕客服寻求帮助。
- 与系统A交换GPU卡
- 更改 PCI-e 插槽以确保它 运行在 x16 gen3 上可用。
- 将
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
任何人都可以指出如何 profile/debug 这个问题的方向吗?非常感谢!
您可能没有使用 GPUs。要测试这个使用
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)
如果不是这种情况,请在评论中添加您的结果,我会跟进看看我还能做些什么。
根据
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) 导致性能差异。