首先tf.session.run()的执行与以后的运行截然不同。为什么?

Arm*_*nez 7 cublas tensorflow cudnn tensorflow-gpu tensorflow-xla

下面是一个示例来阐明我的意思:
First session.run():
TensorFlow会话的首次运行

稍后session.run():
稍后运行TensorFlow会话

我了解TensorFlow在这里进行一些初始化,但是我想知道这在源代码中体现了什么。这在CPU和GPU上都发生,但是在GPU上的影响更为明显。例如,在显式Conv2D操作的情况下,第一次运行在GPU流中具有大量Conv2D操作。实际上,如果我更改Conv2D的输入大小,则它可以从数十个流转换为Conv2D操作。但是,在以后的运行中,GPU流中始终只有五个Conv2D操作(与输入大小无关)。在CPU上运行时,与以后的运行相比,我们在第一次运行中保留了相同的操作列表,但是确实看到了相同的时间差异。

TensorFlow源的哪一部分负责此行为?GPU操作在哪里“分裂”?

谢谢您的帮助!

mrr*_*rry 5

由于在默认情况下,TensorFlow使用cuDNN的自动调整功能来选择如何尽快运行后续卷积,因此该tf.nn.conv_2d()操作在第一次tf.Session.run()调用时需要花费更长的时间。您可以在此处看到自动调谐调用。

有一个未记录的环境变量,可用于禁用自动调整。设置TF_CUDNN_USE_AUTOTUNE=0当你开始运行TensorFlow(例如过程python解释器)来禁用它的使用。