2022 年 5 月 18 日 - TensorFlow 团队的 Goldie Gadde 和 Douglas Yarrington 发布 TensorFlow 2.9 现已发布!亮点包括使用 oneDNN 的性能改进,以及 DTensor 的发布,这是一个用于模型分布的新 API,可用于从数据并行无缝过渡到模型并行。我们还对核心库进行了改进,包括 Eigen 和 tf.function 的统一,确定性行为以及对 Windows 的 WSL2 的新支持。最后,我们发布了用于 tf.function 重新跟踪和 Keras 优化器的新的实验性 API。让我们看看这些新功能和改进功能。
由 TensorFlow 团队的 Goldie Gadde 和 Douglas Yarrington 发布
TensorFlow 2.9 已发布!亮点包括使用 oneDNN 的性能改进,以及 DTensor 的发布,这是一个用于模型分布的新 API,可用于从数据并行无缝过渡到模型并行。
我们还对核心库进行了改进,包括 Eigen 和 tf.function
的统一,确定性行为以及对 Windows 的 WSL2 的新支持。最后,我们发布了用于 tf.function 重新跟踪和 Keras 优化器的新的实验性 API。让我们来看看这些新功能和改进功能。
我们与英特尔合作,将 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"
开头的消息。我们欢迎您在 GitHub 和 TensorFlow 论坛 上提供反馈。
DTensor 是一个用于分布式模型处理的新 TensorFlow API,它允许模型从数据并行无缝过渡到基于单程序多数据 (SPMD) 的模型并行,包括 空间分区。这意味着您拥有工具可以轻松训练模型,其中模型权重或输入太大,无法容纳在一个设备上。(如果您熟悉 TF1 中的 Mesh TensorFlow,DTensor 具有类似的用途。)
DTensor 的设计核心包含以下原则
我们已经开发了一些关于 DTensor 的入门教程,从 DTensor 概念到使用 Keras 训练 DTensor ML 模型
我们已经彻底改变了 tf.function 重新跟踪的方式,使其更简单、更可预测和可配置。
tf.function
的所有参数都被分配了一个 tf.types.experimental.TraceType。
自定义用户类可以使用跟踪协议 (tf.types.experimental.SupportsTracingProtocol
) 声明一个 TraceType
。
TraceType
系统使理解重新跟踪规则变得容易。例如,子类型 规则指示可以使用哪些类型的参数与特定函数跟踪一起使用。子类型还解释了如何将不同的特定形状合并成一个通用的形状,该形状是它们的超类型,以减少函数的跟踪数量。
要了解更多信息,请参阅 tf.types.experimental.TraceType
、tf.types.experimental.SupportsTracingProtocol
和 tf.function
的 reduce_retracing
参数的新 API。
用于 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 操作确定性。请注意,通常确定性是以较低性能为代价的,因此当启用操作确定性时,您的模型可能会运行得更慢。
在 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。
以下是新的优化器类的几个亮点
对于大多数用户,您无需执行任何操作。但是,如果您有遇到以下情况的复杂流程,请做出相应的更改
用例 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 论坛 上发布。