一份关于
使用tf.function将程序转换为图形以获得最佳性能并使您的模型可以在任何地方部署。由于AutoGraph的存在,令人惊讶的是,大量Python代码可以直接与tf.function配合使用,但仍然需要注意一些陷阱。
主要的收获和建议是:
- 不要依赖Python副作用,如对象突变或列表附加。 - tf.function最适合TensorFlow操作,而不是NumPy操作或Python基元。 - 如果有疑问,请使用for x in y习语。
它只提到了如何实现带有
是否有一种启发式方法来决定是否应该至少尝试使用
@tf.function
的官方教程这样说:使用tf.function将程序转换为图形以获得最佳性能并使您的模型可以在任何地方部署。由于AutoGraph的存在,令人惊讶的是,大量Python代码可以直接与tf.function配合使用,但仍然需要注意一些陷阱。
主要的收获和建议是:
- 不要依赖Python副作用,如对象突变或列表附加。 - tf.function最适合TensorFlow操作,而不是NumPy操作或Python基元。 - 如果有疑问,请使用for x in y习语。
它只提到了如何实现带有
@tf.function
注释的函数,但没有提到何时使用它。是否有一种启发式方法来决定是否应该至少尝试使用
tf.function
注释函数?除非我懒得删除副作用或更改某些内容,例如range()
-> tf.range()
,否则似乎没有理由不这样做。但如果我愿意这样做...
是否有任何理由不使用@tf.function
注释所有函数?
tensorflow0.1
、tensorflow0.2
、tensorflow0.3
、tensorflow0.4
、tensorflow0.5
等标签,以及每个 这些tf
模块和类 的标签。此外,为什么不为 Python 的标准模块及其函数和类添加标签呢? - ForceBrutf.function
指南中提到:“装饰模块级函数和模块级类的方法,并避免装饰局部函数或方法”。我记得有更明确的措辞,比如“不要装饰每个函数,在高级函数(如训练循环)中使用tf.function
”,但我可能记错了(或者可能已经被删除)。另一方面,这个讨论有开发人员的有趣输入,最终似乎可以在任何张量/变量的函数中使用它。 - jdehesa@tf.function
注释的函数也会将它们自己调用的函数编译成图形。因此,您只需要注释与您描述的一致的模块入口点即可。但是,手动注释调用堆栈较低的函数也不会有任何损失。 - problemofficer - n.f. Monicatf.function
被多次调用,则无法防止图形中的“代码重复”,这就是为什么广泛使用似乎是可取的原因。 - jdehesa