由Goldie Gadde和Nikita Namjoshi为TensorFlow团队发布
TF 2.4来了!由于增加了对分布式训练和混合精度的支持,新的NumPy前端和用于监控和诊断瓶颈的工具,这个版本都是关于性能和扩展的新功能和改进。
tf.distribution的新功能
参数服务器策略
在2.4版本中,tf.distribute 模块引入了对使用ParameterServerStrategy和自定义训练循环的模型异步训练的实验性支持。与MultiWorkerMirroredStrategy 一样,ParameterServerStrategy 是一个多工种数据并行策略;但是,梯度更新是异步的。
一个参数服务器训练集群由工作者和参数服务器组成。变量在参数服务器上创建,然后在每个步骤中由工作者读取和更新。变量的读取和更新在工作者之间独立发生,没有任何同步。由于工作者不相互依赖,这种策略具有工作者容错的好处,如果你使用可抢占的虚拟机,这种策略是有用的。
要开始使用这一策略,请查看参数服务器培训教程。该教程向你展示了如何设置ParameterServerStrategy和定义训练步骤,并解释了如何使用ClusterCoordinator类将训练步骤的执行调度给远程工作者。
多工人镜像策略
[MultiWorkerMirroredStrategy](https://www.tensorflow.org/api_docs/python/tf/distribute/MultiWorkerMirroredStrategy)已经脱离了实验阶段,现在是稳定 API 的一部分。就像它的单工作者对应物一样。 [MirroredStrategy](https://www.tensorflow.org/api_docs/python/tf/distribute/MirroredStrategy)一样,MultiWorkerMirroredStrategy ,通过同步数据并行实现分布式训练。然而,正如其名称所示,通过MultiWorkerMirroredStrategy ,你可以在多台机器上进行训练,每台机器可能有多个GPU。
在同步训练中,每个工作者在输入数据的不同片断上计算前向和后向传递,在更新模型之前,梯度被聚合起来。对于这种聚合,也就是所谓的全还原,MultiWorkerMirroredStrategy ,使用集体运算来保持变量的同步。集合运算是TensorFlow图中的一个运算,它可以根据硬件、网络拓扑结构和张量大小,在TensorFlow运行时自动选择一个全还原算法。
要开始使用MultiWorkerMirroredStrategy ,请查看Keras的多工作器训练教程,该教程已经更新了关于数据集分片、保存/加载用分布策略训练的模型以及用 [BackupAndRestore](https://www.tensorflow.org/api_docs/python/tf/keras/callbacks/experimental/BackupAndRestore)回调的故障恢复。
如果你是分布式训练的新手,想了解如何开始,或者你对GCP上的分布式训练感兴趣,请看这篇博文,了解关键概念和步骤的介绍。
Keras中的更新
混合精度
在TensorFlow 2.4中,Keras的混合精度API已经脱离了实验性,现在是一个稳定的API。大多数TensorFlow模型使用float32 dtype;然而,也有更低精度的类型,如float16,使用更少的内存。混合精度是指在同一个模型中使用16位和32位的浮点类型,以实现更快的训练。这个API在GPU上可以提高3倍的模型性能,在TPU上可以提高60%。
为了利用混合精度API,你必须使用Keras层和优化器,但没有必要使用其他Keras类,如模型或损失。如果你好奇地想了解如何利用这个API以获得更好的性能,请查看混合精度教程。
优化器
这个版本包括重构了 [tf.keras.optimizers.Optimizer](https://www.tensorflow.org/api_docs/python/tf/keras/optimizers/Optimizer) 类,使model.fit 或自定义训练循环的用户能够写出适用于任何优化器的训练代码。 所有内置的tf.keras.optimizer.Optimizer 子类现在都接受gradient_transformers 和gradient_aggregator 参数,使你能够轻松地定义自定义梯度转换。
通过重构,你现在可以在编写自定义训练循环时直接将损失张量传递给Optimizer.minimize 。
tape = tf.GradientTape()
with tape:
y_pred = model(x, training=True)
loss = loss_fn(y_pred, y_true)
# You can pass in the `tf.GradientTape` when using a loss `Tensor` as shown below.
optimizer.minimize(loss, model.trainable_variables, tape=tape)
这些变化的目的是使Model.fit 和自定义训练循环对优化器的细节更加无关紧要,让你写的训练代码无需修改就能与任何优化器一起工作。
功能性API模型构建的内部改进
最后,TensorFlow 2.4包括对Keras Functional API内部的重大重构,改善了功能模型构建的内存消耗,并简化了触发逻辑。这一重构还确保了TensorFlowOpLayers 的行为是可预测的,并与CompositeTensor 类型签名一起工作。
介绍tf.experimental.numpy
TensorFlow 2.4引入了对NumPy APIs子集的实验性支持,可作为 [tf.experimental.numpy](https://www.tensorflow.org/api_docs/python/tf/experimental/numpy).这个模块使你能够运行NumPy代码,由TensorFlow加速。因为它是建立在TensorFlow之上的,这个API与TensorFlow无缝互通,允许访问TensorFlow的所有API,并使用编译和自动矢量提供优化的执行。例如,TensorFlow ND数组可以与NumPy函数互操作,同样,TensorFlow NumPy函数可以接受不同类型的输入,包括tf.Tensor 和np.ndarray 。
import tensorflow.experimental.numpy as tnp
# Use NumPy code in input pipelines
dataset = tf.data.Dataset.from_tensor_slices(
tnp.random.randn(1000, 1024)).map(
lambda z: z.clip(-1,1)).batch(100)
# Compute gradients through NumPy code
def grad(x, wt):
with tf.GradientTape() as tape:
tape.watch(wt)
output = tnp.dot(x, wt)
output = tf.sigmoid(output)
return tape.gradient(tnp.sum(output), wt)
你可以在TensorFlow的NumPy API指南中了解更多关于如何使用这个API。
新的分析器工具
TensorFlow分析器中的多工作器支持
TensorFlow分析器是一套工具,你可以用来测量你的TensorFlow模型的训练性能和资源消耗。TensorFlow分析器帮助你了解你的模型中的操作的硬件资源消耗,诊断瓶颈,并最终更快地训练。
以前,TensorFlow剖析器支持监控多GPU,单主机训练作业。在2.4中,你现在可以剖析MultiWorkerMirroredStrategy 训练作业。例如,你可以使用采样模式API来执行按需剖析,并连接到MultiWorkerMirroredStrategy 工作者使用的相同服务器:端口。
# Start a profiler server before your model runs.
tf.profiler.experimental.server.start(6009)
# Model code goes here....
# E.g. your worker IP addresses are 10.0.0.2, 10.0.0.3, 10.0.0.4, and you
# would like to profile for a duration of 2 seconds. The profiling data will
# be saved to the Google Cloud Storage path “your_tb_logdir”.
tf.profiler.experimental.client.trace(
'grpc://10.0.0.2:6009,grpc://10.0.0.3:6009,grpc://10.0.0.4:6009',
'gs://your_tb_logdir',
2000)
或者,你可以使用TensorBoard剖析插件,向捕获剖析工具提供工作者地址。
剖析之后,你可以使用新的Pod Viewer工具来选择一个训练步骤,并查看其在所有工人中的步骤时间类别细分。
关于如何使用TensorFlow分析器的更多信息,请查看新发布的GPU性能指南。该指南显示了你在对模型训练工作进行剖析时可能遇到的常见情况,并提供了一个调试工作流程,以帮助你获得更好的性能,无论你是用一个GPU,多个GPU,还是多个机器进行训练。
TFLite剖析器
TFLite剖析器能够在安卓系统中追踪TFLite的内部结构,以确定性能瓶颈。TFLite性能测量指南告诉你如何添加跟踪事件,启用TFLite跟踪,并使用Android Studio CPU Profiler和系统跟踪应用程序捕获跟踪。
使用Android系统追踪应用的追踪实例
支持GPU的新功能
TensorFlow 2.4与CUDA 11和cuDNN 8一起运行,实现了对新推出的NVIDIA Ampere GPU架构的支持。要了解更多关于CUDA 11的功能,请查看此NVIDIA开发者博客。
此外,基于安培的GPU上对TensorFloat-32的支持是默认启用的。TensorFloat-32,简称TF32,是NVIDIA Ampere GPU的一种数学模式,它使某些float32操作,如矩阵乘法和卷积,在Ampere GPU上运行得更快,但精度降低。要了解更多信息,请参见以下文档 [tf.config.experimental.enable_tensor_float_32_execution](https://www.tensorflow.org/api_docs/python/tf/config/experimental/enable_tensor_float_32_execution).
接下来的步骤
请查看发布说明以了解更多信息。要保持最新的信息,你可以阅读TensorFlow博客,关注twitter.com/tensorflow,或者订阅youtube.com/tensorflow。如果你已经建立了一些你想分享的东西,请提交给我们的社区焦点,地址是goo.gle/TFCS。如需反馈,请在GitHub上提交问题。谢谢你