我目前正在gtx1070上开发和分析一个在tensorflow中的神经网络。由于一些昂贵的FFT操作,我的第一个实现变得相当低效。 上图中的时间线显示,一个训练步骤需要大约115ms,而第二个(在数学上等价)实现似乎花费的时间要少得多,一个步骤需要不到10ms
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*10ms,这比我预期的python开销要多。 网络使用队列进行馈送,但结果是相同的,直接将numpy数组送入图中,因此我得出结论empyt队列不会成为瓶颈。在
原则上,时间线的记录与我测量的两次运行的差异相同:
^{pr2}$第一次运行的时间总是比相应的后续运行时间长得多,tensorflow是在进行一些优化还是首次分配内存?在
有人能解释这些不一致的结果吗? 为什么我的第二个实现所用的时间与python中测量的时间相同,而profiling时间轴显示它应该运行得更快?在
由于全局内存池增长、PTX编译和优化,首次运行可能需要更长的时间。在
您可以关闭一些优化,如下所示
但是,PTX编译仍然可以为第一次运行增加1-2秒。因此,出于分析的目的,人们通常会在分析之前包含一个“预热”运行来运行相同的计算。在
另外,如果您的},那么运行
^{pr2}$train_op
类似于assign
或{train_op
会将结果返回到Python中。Python<;->;TensorFlow内存传输不会反映在时间线上(grpc传输也会丢失,跟踪issue)。为了进行分析,可以运行op并省略Python传输,如下所示相关问题 更多 >
编程相关推荐