本文基于CANN开源社区的cann-recipes-train仓库进行技术解读

  • CANN组织链接:https://atomgit.com/cann
  • 仓库链接:https://atomgit.com/cann/cann-recipes-train

前言

之前聊过cann-recipes-infer,是推理相关的样例。今天要说的cann-recipes-train则是训练相关的。

训练和推理虽然都用同样的模型,但技术挑战完全不同。训练涉及反向传播、梯度计算、优化器更新,还有分布式训练等问题。

训练vs推理的区别

简单对比一下:

方面推理训练
目标跑得快跑得动+学得好
精度可以较低通常需要较高
规模可以单卡常常需要多卡
复杂度只有前向前向+反向+优化

所以训练需要单独的优化策略。

cann-recipes-train包含什么

从项目信息来看,这个仓库提供了:

1. 训练样例代码

各种主流模型的训练代码:

  • 大语言模型训练
  • 视觉模型训练
  • 多模态模型训练

2. 分布式训练方案

多卡、多机训练的配置和样例。

3. 优化技术

各种训练加速技术的应用。

分布式训练策略

大模型训练必须用多卡。常见的并行策略:

数据并行

数据

分成N份

卡0处理batch0

卡1处理batch1

卡2处理batch2

梯度汇总

更新模型

每张卡跑不同的数据,梯度汇总后一起更新。

模型并行

输入

层1-4\n卡0

层5-8\n卡1

层9-12\n卡2

输出

模型太大一张卡放不下,切开放到不同卡上。

流水线并行

卡2(层9-12)卡1(层5-8)卡0(层1-4)卡2(层9-12)卡1(层5-8)卡0(层1-4)Batch0前向Batch1前向Batch0前向Batch1前向Batch2前向

像工厂流水线一样,同时处理多个batch。

训练优化技术

1. 混合精度训练

前向\nFP16

损失计算

Loss Scaling

反向\nFP16

梯度\nFP32

更新\nFP32

计算用FP16快,权重用FP32保证精度。

2. 梯度检查点

正常情况下,前向的中间结果要保存着用于反向。这很占显存。

梯度检查点技术:只保存部分中间结果,其他的反向时重新计算。

空间换时间 → 时间换空间

3. ZeRO优化

分布式训练中,每张卡同时存着优化器状态、梯度、模型参数。

ZeRO技术:把这些分散到不同卡上,需要时再通信获取。

使用示例

大致的使用方式:

# 伪代码
from cann_recipes_train import TrainConfig, Trainer

# 配置
config = TrainConfig(
    model_name="llama",
    batch_size=32,
    num_gpus=8,
    mixed_precision=True,
    gradient_checkpointing=True,
)

# 创建训练器
trainer = Trainer(config)

# 加载数据
train_data = load_dataset("path/to/data")

# 开始训练
trainer.train(train_data, epochs=3)

# 保存模型
trainer.save("./output")

具体API以官方文档为准。

常见问题

1. 显存不够

解决方案:

  • 减小batch size
  • 开启梯度检查点
  • 使用模型并行

2. 训练不收敛

可能原因:

  • 学习率不合适
  • 数据有问题
  • 精度损失

3. 速度太慢

可能原因:

  • 通信开销大
  • IO瓶颈
  • 配置不优

和其他框架的关系

PyTorch\nDeepSpeed

torch_npu适配

MindSpore

原生支持

cann-recipes-train\n样例代码

cann-recipes-train可以配合主流训练框架使用。

总结

cann-recipes-train是CANN的训练样例库,主要提供:

  • 主流模型的训练代码
  • 分布式训练方案(数据并行、模型并行、流水线并行)
  • 优化技术应用(混合精度、梯度检查点等)

对于想在NPU上训练大模型的同学,这是个很好的参考。

相关链接

  • cann-recipes-train仓库:https://atomgit.com/cann/cann-recipes-train
  • cann-recipes-infer仓库:https://atomgit.com/cann/cann-recipes-infer
  • DeepSpeed文档

这篇是我学习大模型训练时的笔记整理,如有错误欢迎指正。

更多推荐