13

这里有一个例子来说明我的意思:
First session.run():
First run of a TensorFlow session

later session.run():
TensorFlow session 的后续运行

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

TensorFlow 源代码的哪一部分是造成这种行为的原因?GPU 操作在哪里“拆分”?

谢谢您的帮助!

4

1 回答 1

15

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

有一个未记录的环境变量可用于禁用自动调谐。TF_CUDNN_USE_AUTOTUNE=0在启动运行 TensorFlow 的进程(例如解释器)时设置python以禁用其使用。

于 2017-07-12T21:36:46.730 回答