分布式训练策略与云端实践
立即解锁
发布时间: 2025-09-02 01:22:56 阅读量: 4 订阅数: 47 AIGC 

### 分布式训练策略与云端实践
在机器学习领域,分布式训练是提高模型训练效率和处理大规模数据的关键技术。TensorFlow 提供了多种分布式训练策略,下面将详细介绍这些策略及其使用方法。
#### 1. 分布式训练策略介绍
##### 1.1 MirroredStrategy
在 `MirroredStrategy` 对象的 `scope()` 方法内,我们可以创建想要以分布式和并行方式运行的计算。该对象负责在可用的 GPU 上复制模型训练、聚合梯度等。每个输入批次会在副本之间平均分配。例如,若输入批次大小为 16,使用两个 GPU 的 `MirroredStrategy`,每个 GPU 在每一步将获得 8 个输入示例。为有效利用 GPU 的计算能力,应适当调整批次大小。
```python
# 使用所有可见的 GPU
strategy = tf.distribute.MirroredStrategy()
# 仅使用部分 GPU
strategy = tf.distribute.MirroredStrategy(devices=["/gpu:0", "/gpu:1"])
```
练习:修改相关代码示例,使用 `MirroredStrategy` 以分布式模式训练数字识别模型。
##### 1.2 CentralStorageStrategy
`CentralStorageStrategy` 将模型变量放置在 CPU 上,并在一台机器的所有本地 GPU 上复制计算。除了变量放置在 CPU 而非 GPU 上复制外,它与 `MirroredStrategy` 类似。目前该策略处于实验阶段,未来可能会有变化。
```python
strategy = tf.distribute.experimental.CentralStorageStrategy()
```
##### 1.3 MultiWorkerMirroredStrategy
`MultiWorkerMirroredStrategy` 与 `MirroredStrategy` 类似,它将训练分布在多个机器上,每个机器有一个或多个 GPU。它会在所有机器的每个设备上复制模型中的所有变量,进行计算的机器称为工作节点。为保持所有工作节点上的变量同步,该策略使用 `CollectiveOps` 作为全归约通信方法。
```python
# 默认的 MultiWorkerMirroredStrategy
strategy = tf.distribute.experimental.MultiWorkerMirroredStrategy()
# 使用 RING 实现
strategy = tf.distribute.experimental.MultiWorkerMirroredStrategy(tf.distribute.experimental.CollectiveCommunication.RING)
# 使用 NCCL 实现
strategy = tf.distribute.experimental.MultiWorkerMirroredStrategy(tf.distribute.experimental.CollectiveCommunication.NCCL)
```
在使用 `MultiWorkerMirroredStrategy` 进行分布式训练之前,必须在所有参与模型训练的工作节点上设置 `TF_CONFIG` 环境变量。
##### 1.4 数据集分片与容错
在多工作节点训练中,当使用 `model.fit()` 函数时,TensorFlow 会自动对数据集进行分片。若任何一个工作节点失败,整个集群将失败,TensorFlow 没有内置的故障恢复机制。但 `tf.distribute.Strategy` 与 Keras 结合,通过保存训练检查点提供了容错机制。若有工作节点失败,其他工作节点将等待其重启,由于检查点已保存,失败节点恢复后训练将从停止的位置继续。
##### 1.5 TPUStrategy
张量处理单元(TPU)是谷歌设计的专用应用特定集成电路(ASIC),用于显著加速机器学习工作负载。TPU 可在 Cloud TPU 和 Google Colab 上使用。`TPUStrategy` 的实现与 `MirroredStrategy` 相同,只是模型变量会镜像到 TPU 上。
```python
cluster_resolver = tf.distribute.cluster_resolver.TPUClusterResolver(tpu=tpu_address)
tf.config.experimental_connect_to_cluster(cluster_resolver)
tf.tpu.experimental.initialize_tpu_system(cluster_resolver)
tpu_strategy = tf.distribute.experimental.TPUStrategy(cluster_resolver)
```
##### 1.6 ParameterServerStrategy
在 `ParameterServerStrategy` 中,模型变量放置在称为参数服务器的专用机器上,部分机器指定为工作节点,其他为参数服务器。计算在所有工作节点的所有 GPU 上复制,而变量在参数服务器中更新。
```python
strategy = tf.distribute.experimental.ParameterServerStrategy()
```
##### 1.7 OneDeviceStrategy
有时在将分布式代码迁移到涉及多个设备的完全分布式系统之前,我们想在单个设备(GPU)上测试代码。`OneDeviceStrategy` 就是为此目的而设计的,使用该策略时,模型变量会放置在指定的设备上。
```python
strategy = tf.distribute.OneDeviceStrategy(device="/gpu:0")
```
需要注意的是,除 `MirroredStrategy` 外,上述所有分布式训练策略目前都处于实验阶段。
#### 2. TF_CONFIG:TensorFlow 集群配置
TensorFlow 分布式训练集群由一个或多个称为工作节点的机器组成,模型训练的计算在每个工作节点上进行。有一个特殊的工作节点,称为主节点或首席工作节点,除了作为普通工作节点外,还承担额外的职责,如保存检查点和为 TensorBoard 写入摘要文件。集群可能还包括用于参数服务器的专用机器,在 `ParameterServerStrategy` 中,参数服务器是必需的。
`TF_CONFIG` 环境变量指定了 TensorFlow 集群的配置,必须在集群中的所有机器上设置该环境变量。其格式是一个 JSON 文件,由 `cluster` 和 `task` 两个组件组成。
| Key | Description | Example |
| --- | --- | --- |
| cluster | 包含 `worker`、`chief` 和 `ps` 键的字典,每个键是参与训练的所有机器的主机名和通信端口列表。 | `cluster: { "worker":["host1:12345","host2:2345"] }` |
| task | 指定特定机器将执行的任务,包含以下键:<br> - `type`:指定工作节点类型,取值为 `worker`、`chief` 或 `ps`。<br> - `index`:任务的从零开始的索引。<br> - `trial`:用于超参数调优时,设置训练的试验次数。 | `task: { "type": "chief", "index": 0 }` |
| job | 启动作业时使用的作业参数,可选,大多数情况下可忽略。 | |
例如,有一
0
0
复制全文
相关推荐









