关于 tf.function 的跟踪是什么

What is tracing with regard to tf.function

在 TensorFlow 的指南中经常提到“跟踪”这个词 Better performance with tf.function

  1. 究竟什么是“追踪”,是否指生成图形作为结果 第一次调用 tf.function (随后 取决于参数)?
  2. 当只有部分计算被注释时会发生什么 @tf.function,它会混合 eager execution 和 graph execution 吗?
  1. 是的,“追踪”意味着 运行 一个 Python 函数并在图表中“记录”它的 TensorFlow 操作。请注意,如果 Autograph 进行了一些转换,跟踪代码可能与书面 Python 代码不完全对应。 Tracing 理想情况下只做一次,第一次调用函数,所以后续调用可以直接使用 traced graph 并节省 Python 代码执行。不过,正如您所说,未来的调用可能需要根据给定的参数回溯函数,如您发布的 link 中所述。

  2. 您可以从在急切模式下工作的函数调用 @tf.function,在这种情况下,是的,它会“混合”两种模式。但是如果你从 @tf.function 中调用一个未注释的函数,那么它的代码也会被跟踪——也就是说,你不能暂时从 @tf.function 中返回到 eager/Python 模式。这就是为什么在某些时候,有人建议您只需要注释更高级别的功能,因为无论如何低级别的功能也会被“图形化”——尽管在什么时候应该或什么时候不是很明确不应注释函数,请参阅 Should I use @tf.function for all functions? and this GitHub discussion.

编辑:当我说“你不能暂时从 @tf.function 返回到 eager/Python 模式”时,我的意思是 @tf.function 不能退出“跟踪”模式。当然,使用tf.numpy_function or tf.py_function你可以有一个使用eager/Python模式的跟踪函数,它会被封装在一个操作中作为跟踪图的一部分。