TensorFlow 2.9 中有哪些新功能?
2022 年 5 月 18 日

由 TensorFlow 团队的 Goldie Gadde 和 Douglas Yarrington 发布

TensorFlow 2.9 已发布!亮点包括使用 oneDNN 的性能改进,以及 DTensor 的发布,这是一个用于模型分布的新 API,可用于从数据并行无缝过渡到模型并行。

我们还对核心库进行了改进,包括 Eigen 和 tf.function 的统一,确定性行为以及对 Windows 的 WSL2 的新支持。最后,我们发布了用于 tf.function 重新跟踪和 Keras 优化器的新的实验性 API。让我们来看看这些新功能和改进功能。

改进的 CPU 性能:默认情况下使用 oneDNN

我们与英特尔合作,将 oneDNN 性能库集成到 TensorFlow 中,以在英特尔 CPU 上实现最佳性能。自 TensorFlow 2.5 以来,TensorFlow 已对 oneDNN 提供 实验性支持,这可以提供高达 4 倍的 性能提升。在 TensorFlow 2.9 中,我们默认在 Linux x86 包和具有针对神经网络的硬件功能(如 AVX512_VNNI、AVX512_BF16、AMX 等)的 CPU 上启用 oneDNN 优化,这些功能在 英特尔 Cascade Lake 和更新的 CPU 上可用。

运行已启用 oneDNN 优化的 TensorFlow 的用户可能会观察到与优化关闭时的数值结果略有不同。这是因为浮点舍入方法和顺序不同,并且可能会产生细微的误差。如果这会导致您遇到问题,请在运行 TensorFlow 程序之前通过设置 TF_ENABLE_ONEDNN_OPTS=0 来关闭优化。要启用或重新启用它们,请在运行 TensorFlow 程序之前设置 TF_ENABLE_ONEDNN_OPTS=1。要验证优化是否已启用,请在程序日志中查找以 "oneDNN custom operations are on" 开头的消息。我们欢迎您在 GitHubTensorFlow 论坛 上提供反馈。

使用 DTensor 进行模型并行

DTensor 是一个用于分布式模型处理的新 TensorFlow API,它允许模型从数据并行无缝过渡到基于单程序多数据 (SPMD) 的模型并行,包括 空间分区。这意味着您拥有工具可以轻松训练模型,其中模型权重或输入太大,无法容纳在一个设备上。(如果您熟悉 TF1 中的 Mesh TensorFlow,DTensor 具有类似的用途。)

DTensor 的设计核心包含以下原则

  • 与设备无关的 API:这允许在 CPU、GPU 或 TPU 上使用相同的模型代码,包括跨设备类型分区的模型。
  • 多客户端执行:删除协调器,让每个任务驱动其本地连接的设备,从而实现模型的扩展,而不会影响启动时间。
  • 全局视角与每副本视角:传统上,使用 TensorFlow,分布式模型代码围绕副本编写,但在 DTensor 中,模型代码是从全局视角编写的,每副本代码由 DTensor 运行时生成和运行。其中一项含义是,您不再需要确定批归一化是在全局级别还是每副本级别进行。

我们已经开发了一些关于 DTensor 的入门教程,从 DTensor 概念到使用 Keras 训练 DTensor ML 模型

用于 tf.function 的 TraceType

我们已经彻底改变了 tf.function 重新跟踪的方式,使其更简单、更可预测和可配置。

tf.function 的所有参数都被分配了一个 tf.types.experimental.TraceType。自定义用户类可以使用跟踪协议 (tf.types.experimental.SupportsTracingProtocol) 声明一个 TraceType

TraceType 系统使理解重新跟踪规则变得容易。例如,子类型 规则指示可以使用哪些类型的参数与特定函数跟踪一起使用。子类型还解释了如何将不同的特定形状合并成一个通用的形状,该形状是它们的超类型,以减少函数的跟踪数量。

要了解更多信息,请参阅 tf.types.experimental.TraceTypetf.types.experimental.SupportsTracingProtocoltf.functionreduce_retracing 参数的新 API。

支持 WSL2

用于 Linux 的 Windows 子系统 允许开发人员直接在 Windows 上运行 Linux 环境,而无需传统虚拟机或双启动设置的开销。TensorFlow 现在开箱即用地支持 WSL2,包括 GPU 加速。请参阅文档以获取有关要求以及如何在 Windows 上安装 WSL2 的更多详细信息。

确定性行为

API tf.config.experimental.enable_op_determinism 使 TensorFlow 操作确定性。

确定性意味着,如果您使用相同的输入多次运行操作,则操作每次都会返回完全相同的输出。这对于调试模型很有用,如果您使用确定性从头开始多次训练模型,则您的模型权重每次都会相同。通常,许多操作是非确定性的,因为在操作中使用了线程,这些线程可能会以非确定性的顺序添加浮点数。

TensorFlow 2.8 引入了 API 使操作确定性,TensorFlow 2.9 在某些情况下改进了 tf.data 中的确定性性能。如果您希望您的 TensorFlow 模型确定性运行,只需在程序的开头添加以下内容

```

tf.keras.utils.set_random_seed(1)

tf.config.experimental.enable_op_determinism()

```

第一行设置 Python、NumPy 和 TensorFlow 的随机种子,这对于确定性是必要的。第二行使每个 TensorFlow 操作确定性。请注意,通常确定性是以较低性能为代价的,因此当启用操作确定性时,您的模型可能会运行得更慢。

使用 Keras 优化训练

在 TensorFlow 2.9 中,我们发布了 Keras 优化器 API 的一个新的实验版本,tf.keras.optimizers.experimental。该 API 提供了一个更统一且扩展的内置优化器目录,这些优化器可以更轻松地定制和扩展。

在将来的版本中,tf.keras.optimizers.experimental.Optimizer(及其子类)将取代 tf.keras.optimizers.Optimizer(及其子类),这意味着使用旧版 Keras 优化器的流程将自动切换到新优化器。当前(旧版)tf.keras.optimizers.* API 仍然可以通过 tf.keras.optimizers.legacy.* 访问,例如 tf.keras.optimizers.legacy.Adam。

以下是新的优化器类的几个亮点

  • 对于某些模型,训练速度逐渐加快。
  • 更容易编写自定义优化器。
  • 内置支持模型权重的移动平均值(“Polyak 平均”)。

对于大多数用户,您无需执行任何操作。但是,如果您有遇到以下情况的复杂流程,请做出相应的更改

用例 1:您根据 Keras 优化器实现了一个自定义优化器

对于这些工作,请首先检查是否有可能将您的依赖项更改为 tf.keras.optimizers.experimental.Optimizer. 如果您由于任何原因决定保留旧的优化器(我们不建议这样做),那么您可以将您的优化器更改为 tf.keras.optimizers.legacy.Optimizer 以避免在以后的 TensorFlow 版本中自动切换到新的优化器。

用例 2:您的工作依赖于第三方 Keras 优化器(例如 tensorflow_addons)

只要库继续支持特定优化器,您的工作应该能够成功运行。但是,如果库维护者未能采取措施来适应 Keras 优化器更改,您的工作将出错。因此,请关注第三方库的公告,并向 Keras 团队提交 bug 报告,如果您的工作由于优化器故障而中断。

用例 3:您的工作基于 TF1

首先,请尝试 迁移到 TF2。这是值得的,并且可能比您想象的更容易!如果您由于任何原因无法很快迁移,那么请将您的 tf.keras.optimizers.XXX 替换为 tf.keras.optimizers.legacy.XXX 以避免自动切换到新的优化器。

用例 4:您的工作具有自定义梯度聚合逻辑

通常这意味着您在优化器之外进行梯度聚合,并使用 experimental_aggregate_gradients=False 调用 apply_gradients()。我们更改了参数名称,因此请将您的优化器更改为 tf.keras.optimizers.experimental.Optimizer 并设置 skip_gradients_aggregation=True。如果在进行此更改后出错,请向 Keras 团队提交 bug 报告

用例 5:您的工作直接调用已弃用的优化器公共 API

请检查您的方法调用是否与 此处 相匹配。将您的优化器更改为 tf.keras.optimizers.experimental.Optimizer。如果您由于任何原因想继续使用旧的优化器,请将您的优化器更改为 tf.keras.optimizers.legacy.Optimizer

后续步骤

查看 发行说明 以获取更多信息。要保持最新状态,您可以阅读 TensorFlow 博客,关注 twitter.com/tensorflow,或订阅 youtube.com/tensorflow。如果您构建了一些想要分享的东西,请将其提交到我们社区的重点推荐中,网址为 goo.gle/TFCS。如需反馈,请在 GitHub 上提交问题或在 TensorFlow 论坛 上发布。

下一篇文章
What's new in TensorFlow 2.9?

由 TensorFlow 团队的 Goldie Gadde 和 Douglas Yarrington 发布 TensorFlow 2.9 已发布!亮点包括使用 oneDNN 的性能改进,以及 DTensor 的发布,这是一个用于模型分布的新 API,可用于无缝地从数据并行迁移到模型并行。我们还对核心库进行了改进,包括 Eigen 和 tf.function 的统一,d…