训练代码中使用的加速技术如下:
已使用的加速技术
1. Flash Attention(已讨论)
- 位置:
--attn_impl flash_attn(默认) - 效果:约 2–4 倍加速,显存节省约 50%
2. 混合精度训练(Mixed Precision)
# 第124行:默认使用 bfloat16
dtype = torch.bfloat16 if args.dtype == "bfloat16" else torch.float16
autocast_ctx = torch.cuda.amp.autocast(dtype=dtype) # 第124行
# 第139行:GradScaler(仅float16需要)
scaler = torch.cuda.amp.GradScaler(enabled=(args.dtype == 'float16'))
# 第34-45行:在autocast上下文内计算,scaler缩放梯度
with autocast_ctx:
res = model(X)
loss = ...
scaler.scale(loss).backward()
- 效果:约 1.5–2 倍加速,显存节省约 50%
3. 分布式训练(DDP)
# 第152-154行:多卡训练
if dist.is_initialized():
model._ddp_params_and_buffers_to_ignore = {"freqs_cos", "freqs_sin"}
model = DistributedDataParallel(model, device_ids=[local_rank])
- 效果:N 卡理论加速约 N 倍(实际受通信开销影响)
4. 梯度累积(Gradient Accumulation)
# 第90行:默认 accumulation_steps=8
# 第43行:loss /= accumulation_steps
# 第47行:每accumulation_steps步更新一次
if (step + 1) % args.accumulation_steps == 0:
scaler.step(optimizer)
- 效果:等价于增大 batch size,在显存受限时可提升吞吐
5. Pin Memory(数据加载加速)
# 第165行:pin_memory=True
loader = DataLoader(..., pin_memory=True)
- 效果:CPU→GPU 数据传输加速约 10–20%
6. 优化器内存优化
# 第54行:set_to_none=True 避免零填充操作
optimizer.zero_grad(set_to_none=True)
- 效果:轻微加速,降低内存使用
7. 半精度模型保存
# 第74行:保存时转为半精度
state_dict = {k: v.half() for k, v in state_dict.items()}
- 效果:节省存储空间(约 50%),不直接加速训练
加速效果总结
| 技术 | 加速倍数 | 显存节省 | 说明 |
|---|---|---|---|
| Flash Attention | 2-4x | ~50% | 注意力计算优化 |
| 混合精度 (bfloat16) | 1.5-2x | ~50% | 训练精度优化 |
| DDP (N卡) | ~N倍 | - | 多卡并行 |
| 梯度累积 | 等效增大batch | 减少峰值显存 | 显存受限时有效 |
| Pin Memory | 1.1-1.2x | - | 数据加载优化 |
| zero_grad优化 | 轻微 | 轻微 | 内存优化 |
综合效果
- 单卡:Flash Attention + 混合精度 ≈ 3–8 倍加速,显存节省约 75%
- 多卡:在上述基础上再乘以卡数
进一步优化建议
如需更快,可考虑:
- DeepSpeed ZeRO(代码中未集成,需额外配置)
- 编译优化:
torch.compile(model)(PyTorch 2.0+) - 调整
num_workers:增加 DataLoader 工作线程数 - 使用更高效的优化器:AdamW 已较优,也可尝试 LION 等
代码已使用了常用的训练加速技术。
1571

被折叠的 条评论
为什么被折叠?



