Daily LLM —— Efficient Training
LLM中的高效训练技术
在有限的计算资源下高效训练模型面临两个技术问题:如何提高训练效率;如何将庞大的模型有效地加载到不同的处理器中。常见的高效训练技术,包括3D 并行训练、零冗余优化器、激活重计算和混合精度训练。
3D并行
将 数据并行(Data Parallelism)、流水线并行(Pipeline Parallelism)、张量并行(Tensor Parallelism) 三种并行策略结合,解决超大规模模型训练时的显存和计算瓶颈。
数据并行
- 将模型参数和优化器状态复制到多个GPU 上,每个设备拥有完整的模型副本,将训练数据平均分配到GPU 上,每个GPU 只需要处理分配给它的数据,然后执行前向传播和反向传播以获取梯度。所有GPU 都执行完毕后将不同GPU 的梯度进行平均,以得到整体的梯度来统一更新所有GPU 上的模型参数。
- 优点:计算效率高,适合单卡可容纳的模型。
- 缺点:显存冗余(每个设备需保存完整模型参数和优化器状态)。
流水线并行
- 将模型按层切分到多个设备,不同设备处理不同的层(阶段)。
- 优化:采用 微批次(Micro-batches) 和 气泡填充(Pipeline Bubble) 减少空闲时间。 也可配合梯度累积(Gradient Accumulation)技术进行优化。
- 缺点:通信开销大,需平衡各阶段计算负载。
张量并行(模型并行)
- 将单个层的张量运算拆分到多个设备(如矩阵乘法的行或列切分),并行地执行张量操作,最后通过跨GPU 通信将多GPU 的输出组合成最终结果。典型实现为Megatron-LM 中的矩阵分块并行。
- 优点:支持单层参数超过单卡显存的场景。
- 缺点:通信频繁,设备间需同步中间结果。

零冗余优化器(ZeRO, Zero Redundancy Optimizer)
由DeepSpeed代码库提出,消除数据并行中的显存冗余,将 优化器状态(Optimizer States)、梯度(Gradients)、参数(Parameters) 分片存储在不同GPU,仅需在必要时同步。PyTorch 中也实现了与ZeRO 相似的技术,称为完全分片数据并行(Fully Sharded Data Parallel, FSDP)。ZeRO 三阶段如下:
- ZeRO-1:优化器状态分片
- 每个设备仅保存部分优化器状态(如Adam的动量、方差)。
- 显存节省:与数据并行相比减少4倍(假设优化器状态占显存主要部分)。
- ZeRO-2:梯度分片
- 梯度按设备分片存储,反向传播后通过 All-Gather 同步完整梯度。
- 显存节省:再减少2倍。
- ZeRO-3:参数分片
- 参数分片存储,前向/反向传播时动态重建完整参数。
- 显存节省:再减少与设备数成比例的显存,但通信开销增加。
优点:
- 显著降低显存占用,支持更大模型或更大批次训练。
- 兼容数据并行,易于与3D并行结合(如DeepSpeed框架)。
缺点:
- 分片导致通信量增加,需优化通信效率(如异步通信)。
激活重计算(Activation Checkpointing)
在前向传播时仅保存关键节点的激活值,在反向传播时重新计算部分中间结果(激活值),而非全程保存,以时间换空间。可设置每N层保存一次激活值(平衡显存和计算时间)。
优点:
- 显存节省:最高可减少至原来的平方根复杂度(如从O(n)降至O(√n))。
- 适用场景:显存紧张、模型深度大的场景(如Transformer)。
缺点:
- 计算开销:增加约30%的计算时间(需额外前向计算)。
混合精度训练(Mixed Precision Training)
结合FP16(半精度)和FP32(单精度)进行计算,提升训练速度并减少显存占用。具体技术可以看:为什么LLM中使用BF16而不是FP16?
- FP16计算:
- 前向和反向传播使用FP16加速计算。
- 风险:数值溢出(梯度消失/爆炸)。
- FP32主权重:
- 保存FP32格式的模型参数,更新时转换为FP16。
- 作用:避免舍入误差累积。
- 损失缩放(Loss Scaling):
- 对损失函数乘以缩放因子,放大梯度值以防止FP16下溢。
- 实现:动态或静态缩放(如NVIDIA的AMP库)。
优点:
- 速度提升:FP16计算效率比FP32高2-5倍(依赖硬件支持)。
- 显存节省:FP16占用显存为FP32的一半。
缺点:
- 需硬件支持(如GPU的Tensor Core)。
- 可能引入数值不稳定。
代码实现
LLM训练涉及复杂的分布式系统和框架支持,代码通常依赖 DeepSpeed、Megatron-LM 或 FairScale 等库,以下是核心逻辑的简化实现:
激活重计算
1 | from torch.utils.checkpoint import checkpoint |
ZeRO优化器(DeepSpeed集成)
需安装DeepSpeed:pip install deepspeed
配置文件 ds_config.json
:
1 | { |
训练代码 train.py
:
1 | import deepspeed |
运行命令:deepspeed train.py --deepspeed ds_config.json
3D并行(依赖Megatron-LM/DeepSpeed)
3D并行需要结合框架级API,以下是伪代码逻辑:
1 | # Megatron-LM风格的伪代码(实际需调用框架API) |
完整技术栈示例(DeepSpeed + 3D并行 + ZeRO)
实际代码需结合DeepSpeed和分布式训练框架,以下为配置示例:
配置文件 3d_parallel_config.json
:
1 | { |
运行命令:deepspeed --num_gpus 16 train.py --deepspeed_config 3d_parallel_config.json
依赖库:
- DeepSpeed:微软开源的分布式训练库,支持ZeRO、3D并行、混合精度。
- Megatron-LM:NVIDIA的大模型训练库,专注于张量并行和流水线并行。
- PyTorch AMP:原生混合精度训练支持。
分布式训练:
- 所有代码需在分布式环境中运行(如多GPU或多节点),启动命令示例:
1
deepspeed --num_gpus 4 train.py # 使用4张GPU
- 所有代码需在分布式环境中运行(如多GPU或多节点),启动命令示例:
性能调优:
- 根据硬件调整
micro_batch_size
和并行度。 - 使用
offload_optimizer
将优化器状态卸载到CPU以节省显存。
- 根据硬件调整
官方文档可获取完整实现:
- DeepSpeed: https://www.deepspeed.ai/
- Megatron-LM: https://github.com/NVIDIA/Megatron-LM
总结
技术协同与对比
技术 | 显存优化 | 计算开销 | 适用场景 |
---|---|---|---|
3D并行 | 高(分布式显存) | 通信开销高 | 超大规模模型(千亿参数以上) |
ZeRO | 极高(分片存储) | 通信复杂度中等 | 数据并行显存优化 |
激活重计算 | 高(时间换空间) | 计算时间增加30% | 显存紧张、模型深度大 |
混合精度训练 | 中等(FP16省显存) | 几乎无额外开销 | 资源受限、需加速训练 |
实际应用建议
组合使用:
- 3D并行 + ZeRO-3 + 激活重计算:适用于千亿参数模型训练(如GPT-3)。
- 混合精度 + ZeRO-2:平衡速度和显存的中等规模模型。
通信优化:
- 使用NCCL/RDMA高速通信库,减少并行策略的通信延迟。
硬件适配:
- 混合精度依赖Tensor Core(NVIDIA GPU),需确保硬件支持。