Tensorflow tf.subtract对于大型阵列来说花费的时间太长。
我的工作站配置:
CPU:Xeon E5 2699 v3
内存:384 GB
GPU:NVIDIA K80
CUDA:8.5
CUDNN:5.1
Tensorflow:1.1.0,GPU版本
以下是测试代码和结果。
import tensorflow as tf
import numpy as np
import time
W=3000
H=4000
in_a = tf.placeholder(tf.float32,(W,H))
in_b = tf.placeholder(tf.float32,(W,H))
def test_sub(number):
sess=tf.Session()
out = tf.subtract(in_a,in_b)
for i in range(number):
a=np.random.rand(W,H)
b=np.random.rand(W,H)
feed_dict = {in_a:a,
in_b:b}
t0=time.time()
out_ = sess.run(out,feed_dict=feed_dict)
t_=(time.time()-t0) * 1000
print "index:",str(i), " total time:",str(t_)," ms"
test_sub(20)
结果:
index:0总时间:338.145017624 ms
指数:1总时间:137.024879456 ms
指数:2总时间:132.538080215 ms
指数:3总时间:133.152961731 ms
指数:4总时间:132.885932922 ms
指数:5总时间:135.06102562 ms
指数:6总时间:136.723041534 ms
指数:7总时间:137.926101685 ms
指数:8总时间:133.605003357 ms
指数:9总时间:133.143901825 ms
指数:10总时间:136.317968369 ms
指数:11总时间:137.830018997 ms
指数:12总时间:135.458946228 ms
指数:13总时间:132.793903351 ms
指数:14总时间:144.603967667 ms
指数:15总时间:134.593963623 ms
指数:16总时间:135.535001755 ms
指数:17总时间:133.697032928 ms
指数:18总时间:136.134147644 ms
指数:19总时间:133.810043335 ms
测试结果显示它(即,tf.subtract)花费超过130毫秒来处理3000x4000减法,这显然太长了,特别是在NVIDIA k80 GPU平台上。
任何人都可以提供一些优化tf.subtract的方法吗? 提前谢谢。
答案 0 :(得分:1)
您不仅要测量tf.subtract
的执行时间,还要测量将输入数据从CPU内存传输到GPU内存所需的时间:这是您的瓶颈。
为了避免这种情况,不要使用占位符来提供数据,而是使用张量流生成(如果必须随机生成),或者如果必须读取它们,请使用tensorflow输入管道。 (创建在开始之前为您读取输入的线程,然后在不退出张量流图的情况下提供图形)
在张量流图中进行更多可能的操作以消除数据传输瓶颈非常重要。
答案 1 :(得分:0)
我测量的时间包含从CPU内存到GPU内存的数据传输时间,这听起来是合理的。
由于我必须读取输入数据(例如,输入数据是手机生成的图像并逐个发送到张量流),是否意味着必须使用张量流占位符?
对于上述情况(输入数据是手机生成的图像,并且它们被逐个发送到张量流),如果两个图像不是同时生成的(即,第二个图像在第一个),输入管道线程如何在启动之前读取输入数据(即,当张量流处理第一个图像时不生成第二个图像)?那么,你能给我一个简单的例子来解释tensorflow输入管道吗?