什么是关于 tf.function 的跟踪

Jak*_* Wu 5 python tensorflow eager-execution tensorflow2.0

在 TensorFlow 的指南中经常提到“跟踪”这个词,例如使用 tf.function 实现更好的性能

  1. 究竟什么是“跟踪”,它是指作为第一次调用 tf.function 的结果(随后取决于参数)生成图形吗?
  2. 当只有一部分计算被注释时会发生什么 @tf.function,它会混合急切执行和图执行吗?

jde*_*esa 5

  1. 是的,“跟踪”意味着运行 Python 函数并在图中“记录”其 TensorFlow 操作。请注意,如果 Autograph 执行了一些转换,则跟踪的代码可能与编写的 Python 代码不完全对应。理想情况下,跟踪只进行一次,即第一次调用函数时,因此后续调用可以直接使用跟踪图并保存 Python 代码执行。但是,正如您所说,如您发布的链接中所述,未来的调用可能需要根据给定的参数来回溯函数。

  2. 您可以@tf.function从在热切模式下工作的函数调用 a ,在这种情况下,是的,它会“混合”两种模式。但是如果你从 a 调用一个未注释的函数@tf.function,那么它的代码也会被跟踪——也就是说,你不能从@tf.function. 这就是为什么,在某些时候,有人建议您只需要注释更高级别的函数,因为无论如何,较低级别的函数也会被“绘制” - 尽管何时应该或不应该注释函数,请参阅我是否应该对所有函数使用 @tf.function?这个 GitHub 讨论

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