DeepSpeed 深入:从 ZeRO 到压缩与推理加速
DeepSpeed 分布式训练:从 ZeRO 到压缩与推理加速
什么是 DeepSpeed?
DeepSpeed 是微软开源的一个深度学习优化库,专为分布式训练设计。它能够在不修改模型代码的前提下,显著降低大模型训练的内存占用和计算时间。无论是预训练一个百亿参数的语言模型,还是微调已有的基础模型,DeepSpeed 都提供了开箱即用的加速方案。
其核心能力可以归纳为三个方面:
- ZeRO 优化:将模型状态(优化器状态、梯度、参数)切分到多个设备,实现超大规模模型训练。
- 压缩技术:通过量化、稀疏化等方法减小模型体积与通信开销。
- 推理加速:利用内核融合、并行化和模型压缩实现低延迟推理。
环境准备与基础安装
在开始之前,你需要有一个支持 CUDA 的 GPU 环境。DeepSpeed 可以通过 pip 方便安装:
pip install deepspeed
建议同时安装匹配的 PyTorch 版本。如果你需要使用 CPU offload 或 NVMe offload,需注意依赖库。
安装完成后,可以使用 ds_report 检查环境支持情况:
ds_report
若出现缺少某些算子(如稀疏注意力)的提示,可根据输出指引安装对应依赖。
ZeRO 优化:把大模型塞进有限显存
为什么需要 ZeRO?
训练大模型时,显存主要消耗在三个方面:
- 模型参数(fp16 下每个参数占 2 字节)
- 梯度(与参数同样大小)
- 优化器状态(如 Adam 需要保存动量与方差,每个参数需要 8 字节)
加起来,一个 10B 参数的模型在 Adam 混合精度训练下,仅这三项就会占用约 120 GB 显存,远超单卡容量。
ZeRO 的三个阶段
DeepSpeed 的 ZeRO(Zero Redundancy Optimizer)技术将以上数据并行所需的全量副本进行分片,不同阶段对应不同的切分粒度:
- ZeRO Stage 1:只切分优化器状态。每个 GPU 仅持有 1/N 的优化器状态,显存降低约 4 倍。
- ZeRO Stage 2:在 Stage 1 的基础上切分梯度。每个 GPU 只保留自己负责的那部分梯度,进一步降低显存。
- ZeRO Stage 3:切分优化器状态、梯度和模型参数。参数本身也被分片,仅在需要时通过 all-gather 重组,显存可降低与 GPU 数量成线性比例。
对于绝大多数百亿级以上的模型,Stage 3 是必需的。
配置与启用 ZeRO
DeepSpeed 使用 JSON 配置文件控制行为。一个典型的 ZeRO Stage 2 配置如下:
{
"train_batch_size": 32,
"gradient_accumulation_steps": 1,
"fp16": {
"enabled": true
},
"zero_optimization": {
"stage": 2,
"offload_optimizer": {
"device": "cpu"
}
}
}
offload_optimizer可以将优化器状态卸到 CPU 内存,进一步减少 GPU 显存,适合显存紧张但系统内存充足的场景。
要将 DeepSpeed 集成到训练脚本中,通常只需修改训练循环的初始化部分:
import deepspeed
model_engine, optimizer, _, _ = deepspeed.initialize(
args=args,
model=model,
model_parameters=params
)
之后在 model_engine.backward(loss) 和 model_engine.step() 中,DeepSpeed 会自动处理梯度累积、通信和参数更新。
ZeRO-Offload 与 ZeRO-Infinity
- ZeRO-Offload 进一步将数据和计算卸载到 CPU 甚至 NVMe,通过单 GPU 就能训练极大的模型(例如 13B 参数)。
- ZeRO-Infinity 是 ZeRO-3 的扩展,能利用 GPU、CPU 和 NVMe 异构存储,支持百万亿参数级别模型的训练。
模型压缩:让大模型变小
DeepSpeed 提供了训练中或训练后的压缩工具,主要包括量化和稀疏化。
DeepSpeed Compression 简介
这是一个独立的压缩库,可以无缝对接 Hugging Face、Megatron 等生态。它支持:
- 训练后量化(PTQ):对已训练好的模型进行权重量化,如 INT8、INT4。
- 量化感知训练(QAT):在训练中模拟量化,保持精度。
- 结构化/非结构化剪枝:移除冗余参数。
权重量化示例
以 INT8 量化为例,使用 DeepSpeed Compression:
from deepspeed.compression import compress
compressed_model = compress(model,
compression_config={
"weight_quantization": {
"quantization_bits": 8,
"group_size": 128
}
})
量化后的模型尺寸可缩小至原来的 1/4,同时保持极小的精度损失。
稀疏化
DeepSpeed 支持 2:4 结构化稀疏训练,直接在特定硬件(如 NVIDIA Ampere 架构)上获得推理加速。
"sparse_attention": {
"mode": "fixed",
"block": 16,
"num_heads": 16
}
通过配置稀疏注意力,可以大幅降低长序列的计算复杂度。
推理加速:低延迟部署大模型
训练出大模型后,推理同样面临高昂的延迟和显存问题。DeepSpeed 提供了多个推理加速方案。
DeepSpeed Inference
DeepSpeed Inference 是一款高性能推理引擎,具备以下特性:
- 内核融合:将多个层操作融合为一个 CUDA kernel,减少访存开销。
- 张量并行:与训练时的张量并行兼容,自动将模型分布在多 GPU 上。
- 动态批处理与连续批处理:适用于在线服务。
- 低精度推理:支持 INT8/FP16 推理,配合量化模型效果更佳。
如何使用
首先需要在配置中启用推理模式:
{
"train_micro_batch_size_per_gpu": 1,
"fp16": {
"enabled": true
},
"inference": {
"replace_with_kernel_inject": true,
"dtype": "fp16",
"tensor_parallel": {
"tp_size": 4
}
}
}
然后在代码中:
import deepspeed
engine = deepspeed.init_inference(model, config=inference_config)
output = engine.generate(input_ids)
通过 tensor_parallel,可以将模型切分到多张 GPU,实现低延迟的大模型推理,不修改任何模型代码。
面向 Transformer 的优化
DeepSpeed Inference 特别针对 Transformer 架构实现了高度优化的 kernel,例如:
- MHA 融合:将 QKV 投影、注意力计算、输出投影融合为一个或少数几个 kernel。
- MLP 融合:将两层线性层和激活函数融合。
- LayerNorm + Residual 融合。
这些优化可以带来 1.5 倍到 3 倍的吞吐量提升。
结合压缩与推理
在实际部署中,通常先使用 DeepSpeed Compression 将模型量化或者剪枝,再通过 DeepSpeed Inference 的 kernel 注入进行推理。例如,一个量化后的 13B 模型可以轻松在单块 A100 上运行,并达到毫秒级响应。
典型训练流程:从零训练 GPT-2 规模的模型
为了让读者快速上手,这里给出一个使用 Hugging Face Transformers 与 DeepSpeed 结合训练 GPT-2 模型的完整示例。
- 准备数据集和 tokenizer
- 编写训练脚本
train.py,模型使用AutoModelForCausalLM - 创建 DeepSpeed 配置文件
ds_config.json,使用 ZeRO Stage 2 + CPU offload - 启动分布式训练
deepspeed --num_gpus=4 train.py --deepspeed ds_config.json
训练过程中,DeepSpeed 会自动处理数据并行和模型状态的切分,日志会实时输出内存使用和吞吐信息。
常见问题与最佳实践
- OOM(显存不足):尝试降低
train_micro_batch_size_per_gpu,增加gradient_accumulation_steps;启用 ZeRO Stage 3;offload 到 CPU 或 NVMe。 - 通信瓶颈:ZeRO Stage 3 带来额外通信,建议使用高速互联的 GPU(如 NVLink)。配置
reduce_bucket_size和stage3_prefetch_bucket_size进行调优。 - 混合精度训练:务必启用
fp16并设置损失缩放(DeepSpeed 可自动处理),以获得速度提升和显存节约。 - 检查点保存与加载:DeepSpeed 使用自己的 checkpoint 格式,通过
model_engine.save_checkpoint()和load_checkpoint()操作,与单纯保存模型参数不同,因为 ZeRO 需要保存各分片状态。
扩展资源
- DeepSpeed 官方文档
- DeepSpeed GitHub 仓库
- DeepSpeed Examples:包含 Megatron、GPT-NeoX 等多种模型的训练示例
掌握 DeepSpeed 的核心能力,你将能够高效训练和部署从数亿到数万亿参数的大模型。从 ZeRO 优化到压缩与推理加速,这套工具体系已经支撑了当前众多前沿 AI 项目。