DeepSpeed

DeepSpeed 深入解析

Pasted image 20250429223411.png

混合精度训练

在训练过程中,DeepSpeed 支持同时使用 FP16 和 FP32 两种精度的数据类型。具体而言,在进行前向传播(forward)和反向传播(backward)时,数据类型会转换为 FP16,而在参数更新阶段则转换为 FP32。这种方法可以有效提高训练效率,同时保持较高的计算精度。关于混合精度训练的详细信息,可以参考 2.3.7 章。
Pasted image 20250429223429.png

ZeRO 零冗余优化器

ZeRO的显存分类

ZeRO 优化器通过显存的精细管理来提高模型训练的效率,其显存分类如下:

ZeRO 三个阶段以及显存占用分析

Pasted image 20250429223450.png

数据通信量分析

DeepSpeed ZeRO 主要采用数据并行的方法。

传统数据并行

在传统的数据并行中,每一步(step/iteration)计算梯度后,需要进行一次 AllReduce 操作来计算梯度均值。常用的方法是 Ring AllReduce,分为 ReduceScatter 和 AllGather 两步,每张卡的通信数据量(发送+接受)近似为 4Φ

Pasted image 20250429223505.png
Pasted image 20250429223527.png
Pasted image 20250429223535.png

ZeRO1、2阶段(优化器状态分区、梯度分区)

在 ZeRO1 和 ZeRO2 阶段,与传统数据并行类似。每张卡只存储 1N 的优化器状态和梯度。对于 gpu_0 来说,为了计算它这 1N 的梯度均值,需要进行一次 Reduce 操作,通信数据量是 21NΦN=2Φ(发送+接收)。实现中使用了 bucket 策略,保证 1N 的梯度每张卡只发送一次。当 gpu_0 计算好梯度均值后,就可以更新局部的优化器状态(包括 1NΦ 的参数),当反向传播过程结束,进行一次 Gather 操作,更新 (11N)Φ 的模型参数,通信数据量是 21NΦN=2Φ(发送+接收)。全局来看,相当于用 Reduce-Scatter 和 AllGather 两步,与数据并行一致。
Pasted image 20250429223545.png

深入理解 ZERO3 与 CPU 卸载技术

在深度学习的训练过程中,模型参数的存储和计算效率一直是研究的重点。本文将详细探讨 ZERO3 技术以及 CPU 卸载策略如何优化深度学习模型的训练过程。
Pasted image 20250429223811.png

通信效率分析

ZERO3 的通信量为 6Φ,相较于标准的数据并行,通信效率提升了 1.5 倍。这种提升主要得益于参数的分片存储和有效的通信策略。

CPU卸载策略

CPU卸载技术不仅仅是将数据卸载到 CPU,还包括将部分计算任务转移到 CPU,从而显著减少 GPU - CPU 之间的通信量。

CPU卸载的优化目标

CPU卸载应满足以下三个方面的最优:

  1. 减少CPU的计算量:避免 CPU 成为性能瓶颈。
  2. 最小化GPU - CPU之间的通信量:避免通信开销成为性能瓶颈。
  3. 在最小化通信量时,最大化GPU的显存节省
数据卸载策略
计算卸载策略
通信量分析

在 CPU卸载策略中,通信涉及到 FP16 的梯度和模型参数。这种策略有效地减少了 GPU 和 CPU 之间的数据传输需求。
Pasted image 20250429223825.png Pasted image 20250429223831.png