DeepSpeed 深入:从 ZeRO 到压缩与推理加速

FreeGuideOnline 最新 2026-06-14

DeepSpeed 分布式训练:从 ZeRO 到压缩与推理加速

什么是 DeepSpeed?

DeepSpeed 是微软开源的一个深度学习优化库,专为分布式训练设计。它能够在不修改模型代码的前提下,显著降低大模型训练的内存占用和计算时间。无论是预训练一个百亿参数的语言模型,还是微调已有的基础模型,DeepSpeed 都提供了开箱即用的加速方案。

其核心能力可以归纳为三个方面:

  • ZeRO 优化:将模型状态(优化器状态、梯度、参数)切分到多个设备,实现超大规模模型训练。
  • 压缩技术:通过量化、稀疏化等方法减小模型体积与通信开销。
  • 推理加速:利用内核融合、并行化和模型压缩实现低延迟推理。

环境准备与基础安装

在开始之前,你需要有一个支持 CUDA 的 GPU 环境。DeepSpeed 可以通过 pip 方便安装:

pip install deepspeed

建议同时安装匹配的 PyTorch 版本。如果你需要使用 CPU offload 或 NVMe offload,需注意依赖库。

安装完成后,可以使用 ds_report 检查环境支持情况:

ds_report

若出现缺少某些算子(如稀疏注意力)的提示,可根据输出指引安装对应依赖。

ZeRO 优化:把大模型塞进有限显存

为什么需要 ZeRO?

训练大模型时,显存主要消耗在三个方面:

  1. 模型参数(fp16 下每个参数占 2 字节)
  2. 梯度(与参数同样大小)
  3. 优化器状态(如 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 模型的完整示例。

  1. 准备数据集和 tokenizer
  2. 编写训练脚本 train.py,模型使用 AutoModelForCausalLM
  3. 创建 DeepSpeed 配置文件 ds_config.json,使用 ZeRO Stage 2 + CPU offload
  4. 启动分布式训练
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_sizestage3_prefetch_bucket_size 进行调优。
  • 混合精度训练:务必启用 fp16 并设置损失缩放(DeepSpeed 可自动处理),以获得速度提升和显存节约。
  • 检查点保存与加载:DeepSpeed 使用自己的 checkpoint 格式,通过 model_engine.save_checkpoint()load_checkpoint() 操作,与单纯保存模型参数不同,因为 ZeRO 需要保存各分片状态。

扩展资源

掌握 DeepSpeed 的核心能力,你将能够高效训练和部署从数亿到数万亿参数的大模型。从 ZeRO 优化到压缩与推理加速,这套工具体系已经支撑了当前众多前沿 AI 项目。