Path: blob/master/site/zh-cn/guide/core/distribution.ipynb
25118 views
Copyright 2022 The TensorFlow Authors.
使用 Core API 和 DTensor 进行分布式训练
简介
此笔记本使用 TensorFlow Core 低级 API 和 DTensor 来演示数据并行分布式训练示例。访问 Core API 概述以详细了解 TensorFlow Core 及其预期用例。请参阅 DTensor 概述指南和使用 DTensor 进行分布式训练教程以详细了解 DTensor。
本示例使用多层感知器教程中显示的相同模型和优化器。首先请参阅本教程,以熟悉使用 Core API 编写端到端机器学习工作流。
注:DTensor 仍然是一个实验性 TensorFlow API,这意味着它的功能可用于测试,并且仅用于测试环境。
使用 DTensor 进行数据并行训练的概述
在构建支持分布的 MLP 之前,花点时间探索 DTensor 用于数据并行训练的基础知识。
DTensor 允许您跨设备运行分布式训练,以提高效率、可靠性和可扩缩性。DTensor 通过称为单程序多数据 (SPMD) 扩展的过程根据分片指令分布程序和张量。DTensor
感知层的变量被创建为 dtensor.DVariable
,除了通常的层参数外,DTensor
感知层对象的构造函数还接受额外的 Layout
输入。
数据并行训练的主要思路如下:
分别在 N 台设备上复制模型变量。
将全局批次拆分成 N 个按副本批次。
每个按副本批次都在副本设备上进行训练。
在对所有副本共同执行数据加权之前进行梯度归约。
数据并行训练能够根据设备数量提供近乎线性的速度。
安装
DTensor 是 TensorFlow 2.9.0 版本的一部分。
为本实验配置 8 个虚拟 CPU。DTensor 也可以与 GPU 或 TPU 设备一起使用。鉴于此笔记本使用虚拟设备,分布式训练所获得的加速效果并不明显。
MNIST 数据集
可从 TensorFlow Datasets 获得该数据集。将数据拆分为训练集和测试集。仅使用 5000 个样本进行训练和测试以节省时间。
预处理数据
通过将数据的形状改变为二维并重新缩放数据以适合单位区间 [0,1] 来预处理数据。
构建 MLP
使用 DTensor 感知层构建 MLP 模型。
密集层
首先创建一个支持 DTensor 的密集层模块。dtensor.call_with_layout
函数可用于调用接受 DTensor 输入并产生 DTensor 输出的函数。这对于使用 TensorFlow 支持的函数初始化 DTensor 变量 dtensor.DVariable
十分有用。
MLP 序贯模型
现在,创建一个按顺序执行密集层的 MLP 模块。
使用 DTensor 执行“数据并行”训练等效于 tf.distribute.MirroredStrategy
。为此,每个设备将在数据批次的一个分片上运行相同的模型。因此,您将需要以下各项:
具有单个
"batch"
维度的dtensor.Mesh
用于在网格中复制(对每个轴使用
dtensor.UNSHARDED
)的所有权重的dtensor.Layout
用于在网格中拆分批次维度的数据的
dtensor.Layout
创建一个包含单个批次维度的 DTensor 网格,其中每个设备都成为从全局批次接收分片的副本。使用此网格实例化具有以下架构的 MLP 模式:
前向传递:ReLU(784 x 700) x ReLU(700 x 500) x Softmax(500 x 10)
训练指标
使用交叉熵损失函数和准确率指标进行训练。
优化器
与标准梯度下降相比,使用优化器可以显著加快收敛速度。Adam 优化器在下面实现,并已配置为与 DTensor 兼容。要将 Keras 优化器与 DTensor 一起使用,请参阅实验性 tf.keras.dtensor.experimental.optimizers
模块。
数据打包
首先,编写一个用于将数据传输到设备的辅助函数。此函数应使用 dtensor.pack
将用于副本的全局批次的分片发送(并且仅发送)到支持副本的设备。为简单起见,假设采用一个单客户端应用。
接下来,编写一个函数,它使用此辅助函数将训练数据批次打包到沿批次(第一个)轴分片的 DTensor 中。这可确保 DTensor 将训练数据均匀分布到“批次”网格维度。请注意,在 DTensor 中,批次大小始终指全局批次大小;因此,批次大小的选择应使其可以被批次网格维度的大小均匀拆分。计划使用其他 DTensor API 来简化 tf.data
集成,敬请期待。
训练
编写一个可跟踪的函数,在给定一批数据的情况下执行单个训练步骤。此函数不需要任何特殊的 DTensor 注解。此外,还要编写一个执行测试步骤并返回适当性能指标的函数。
现在,以 128 为批次大小对 MLP 模型训练 3 个周期。
性能评估
首先,编写一个绘图函数来呈现模型在训练期间的损失和准确率。
保存模型
tf.saved_model
和 DTensor 的集成仍在开发中。从 TensorFlow 2.9.0 开始,tf.saved_model 仅接受具有完全复制变量的 DTensor 模型。作为替代方法,您可以通过重新加载检查点将 DTensor 模型转换为完全复制的模型。但是,保存模型后,所有 DTensor 注解都会丢失,保存的签名只能与常规张量一起使用。本教程将在固化后进行更新以展示集成。
结论
此笔记本概括介绍了如何使用 DTensor 和 TensorFlow Core API 进行分布式训练。下面是一些可能有所帮助的提示:
TensorFlow Core API 可用于构建具有高度可配置性的机器学习工作流,并支持分布式训练。
DTensor 概念指南和使用 DTensor 进行分布式训练教程包含有关 DTensor 及其集成的最新信息。
有关使用 TensorFlow Core API 的更多示例,请查阅指南。如果您想详细了解如何加载和准备数据,请参阅有关图像数据加载或 CSV 数据加载的教程。