我目前正在开发和分析一个GTX 1070中tensorflow中的神经网络。由于一些昂贵的FFT操作,我的第一个实现结果相当低效。 附图中的上部时间线显示一个训练步骤大约需要115ms。第二个(数学等价的)实现似乎消耗更少的时间,一步需要10ms以下。Tensorflow剖析时间线与墙时间不一致
timelines (对不起,我不允许张贴图片还)
令人惊讶的两种方法需要约。通过在python测量时相同的时间:
build model, get train_op...
sess = tf.Session()
import timeit
t = timeit.default_timer()
for i in range(100):
sess.run(train_op)
dt = timeit.default_timer() - t
print(dt)
在两种情况下100次采取〜17S> 100 * 115ms> 100 * 10毫秒这是多余将从蟒开销期望。 网络使用队列进行馈送,但结果是直接将numpy数组馈送到图中,所以我得出结论empyt队列不能成为瓶颈。
的时间表是在记录与差别原则,我测量两个运行:
build model, get train_op...
sess = tf.Session()
def write_timeline(path):
from tensorflow.python.client import timeline
run_options = tf.RunOptions(trace_level=tf.RunOptions.FULL_TRACE)
run_metadata = tf.RunMetadata()
sess.run(train_op, options=run_options, run_metadata=run_metadata)
# Create the Timeline object, and write it to a json
tl = timeline.Timeline(run_metadata.step_stats)
ctf = tl.generate_chrome_trace_format()
with open(path, 'w') as f:
f.write(ctf)
write_timeline('timeline_1st_run.json')
write_timeline('timeline_2nd_run.json')
第一次运行总是比相应的以下运行更长的时间,是tensorflow做一些优化这里或在分配内存第一次?
有人能解释这些inconistent结果? 为什么我的第二个实现在python中使用同一时间进行测量时,分析时间表显示它应该运行得更快?
关闭优化确实加快了首轮一点,并提出以下运行慢一点。 我的train_op是由'tf.train.Optimizer.minimize(loss)'生成的,它肯定会在内部执行'assign'等操作。 'sess.run(train_op)'返回'无',我是对的,这就排除了Python <-> TensorFlow内存传输的问题? 调用'sess.run([loss,train_op])'需要更长的时间。 难道还有另外一个原因,为什么两个实现需要相同的挂墙时间? – sejanDee
返回'None'会排除Python内存传输的问题。您的高效率与低效率的实施似乎在时间轴上的时间相似(500 vs 700毫秒),您预热后的挂钟时间有多少差异? –
上面的第一个时间线实际上是预热(10ms vs 110ms)。预热的挂钟时间为160ms和170ms,平均测量超过1000次。 – sejanDee