Keras 使用tf.function的Tensorflow 2.0模型速度非常慢,每次列车计数发生变化时都会重新编译。“渴望”跑得快4倍左右

Keras 使用tf.function的Tensorflow 2.0模型速度非常慢,每次列车计数发生变化时都会重新编译。“渴望”跑得快4倍左右,keras,tensorflow2.0,Keras,Tensorflow2.0,我有从未编译的keras代码构建的模型,并试图通过定制的训练循环来运行它们 TF2.0eager(默认情况下)代码在CPU(笔记本电脑)上运行约30秒。当我使用包装好的tf.function调用方法创建一个keras模型时,它运行得非常慢,而且似乎需要很长时间才能启动,尤其是“第一次” 例如,在tf.function代码中,10个样本的初始序列需要40秒,10个样本的后续序列需要2秒 在20个样本中,初始值为50秒,后续值为4秒 1号样本上的第一列需要2秒,后续需要200毫秒 因此,似乎每次调用

我有从未编译的keras代码构建的模型,并试图通过定制的训练循环来运行它们

TF2.0eager(默认情况下)代码在CPU(笔记本电脑)上运行约30秒。当我使用包装好的tf.function调用方法创建一个keras模型时,它运行得非常慢,而且似乎需要很长时间才能启动,尤其是“第一次”

例如,在tf.function代码中,10个样本的初始序列需要40秒,10个样本的后续序列需要2秒

在20个样本中,初始值为50秒,后续值为4秒

1号样本上的第一列需要2秒,后续需要200毫秒

因此,似乎每次调用火车都在创建一个新的图表,其中复杂度随火车计数而变化

我只是在做这样的事情:

@tf.function
def系列(n=10):
步长=0
损失=0.0
精度=0.0
对于范围(n)中的i:
步骤+=1
d、 dd,l=列车一步(型号、选项、数据)
tf.打印(dd)
使用tf.name_范围(“列车”):
对于dd中的k:
tf.summary.scalar(k,dd[k],步长=步长)
如果tf.相等(步骤%10,0):
tf.打印(dd)
d、 更新(dd)
返回d

其中模型为
keras.model.model
,带有
@tf.function
装饰
调用
方法,如示例所示。

我在这里分析了
@tf.function
的这种行为

简而言之:
tf.function
的设计不会自动将Python本机类型装箱到具有定义良好的
dtype
tf.Tensor
对象

如果您的函数接受一个
tf.Tensor
对象,则在第一次调用该函数时,将分析该函数,并生成与该函数关联的图形。在每个非第一次调用中,如果
tf.Tensor
对象的
dtype
匹配,则重用该图

但是在使用Python本机类型的情况下,每次使用不同的值调用函数时,都会生成图形

简而言之:如果您计划使用
@tf.function
,那么将代码设计为处处使用
tf.Tensor
而不是Python变量


tf.function
不是一个能够神奇地加速在急切模式下正常工作的函数的包装器;是一个包装器,它需要设计渴望的函数(主体、输入参数、DYTPE),了解图形创建后会发生什么,以获得真正的速度提升。

这很好。。。我想这应该是文件中的一个大警告。如果有,我肯定错过了。有一件事我只是不明白为什么他们在这里有tf.function示例。。。如果autograph.passing模型(即keras对象)、tf.data.dataset或任何tf.*obejct存在已知问题,则在args中包含model etc。只有通过Python本机类型,性能才会降低我很乐意提供帮助!谢谢,@nessuno。我知道您指的是本机数字类型,但我还想补充一点,尽管列表在python中也被视为本机类型,但张量列表仍然可以正常工作。