首先,tf.session.run()与以后的运行有很大的不同。为什么?

时间:2017-07-12 16:49:11

标签: tensorflow cublas cudnn tensorflow-gpu tensorflow-xla

以下是澄清我的意思的一个例子:
第一个session.run():
First run of a TensorFlow session

稍后session.run():
Later runs of a TensorFlow session

我知道TensorFlow正在做一些初始化,但是我想知道它在源中的位置。这发生在CPU和GPU上,但效果更加突出在GPU上。例如,在显式Conv2D操作的情况下,第一次运行在GPU流中具有更大量的Conv2D操作。事实上,如果我改变Conv2D的输入大小,它可以从几十到几百个流Conv2D操作。但是,在以后的运行中,GPU流中始终只有五个Conv2D操作(无论输入大小如何)。在CPU上运行时,与后续运行相比,我们在第一次运行中保留相同的操作列表,但我们确实看到了相同的时间差异。

TensorFlow源的哪个部分负责此行为? GPU操作"拆分在哪里?"

感谢您的帮助!

1 个答案:

答案 0 :(得分:2)

tf.nn.conv_2d() op需要更长时间才能在第一次tf.Session.run()调用上运行,因为 - 默认情况下 - TensorFlow使用cuDNN的自动调谐工具来选择如何尽快运行后续卷积。您可以看到自动调谐调用here

您可以使用undocumented environment variable来禁用自动调谐。当您启动运行TensorFlow(例如TF_CUDNN_USE_AUTOTUNE=0解释程序)的进程时,请设置python以禁用其使用。