使用AIAK-Training Pytorch版
前提条件
- 已经开通CCE云原生AI服务。
支持的版本列表
AIAK-Training PyTorch 版目前支持如下版本列表,用户如有其他版本需求,可提交工单获得支持。
| CUDA版本 | Pytorch版本 | Python版本 |
|---|---|---|
| 11.7 | 1.12.0 | 3.8 |
加速特性
- 针对低带宽网络环境的通信优化,新增分层Allreduce算法,支持PowerSGD、FP16等通信压缩算法快速使能。
- 引入nvidia apex amp o2混合精度模式,并提供兼容torch amp原生用法的使用方式,方便更多计算转FP16来加速训练。
- 支持fused optimizer,融合计算Kernel,减少访存、kernel launch等开销,提升参数更新阶段效率。
- 支持lamb优化器算法,可用于解决超大batch训练中的收敛问题。
实践流程
1.获取训练镜像
在CCR公共镜像的“百度智能云AI镜像”中选择“aiak-training”加速镜像,作为训练基础镜像,该镜像内已安装了CUDA、Python、PyTorch 和AIAK-Training加速软件等。

2.任务提交
提交任务,可详细按照 新建Pytorch任务 文档进行。过程中,需要将镜像地址设置为 registry.baidubce.com/ai-public/aiak-training,镜像版本设置为 ubuntu20.04-cu11.7-pytorch1.12.0-py38-lastest。
3.应用加速能力
3.1 加速低配网络条件下的分布式训练
在网络带宽较低的环境下,跨机梯度同步会成为分布式训练速度的主要瓶颈。为了优化该类问题,AIAK-Training新增了分层AllReduce算法实现,来减少跨机通信的影响。同时,我们简化了Pytorch官方提供的PowerSGD、FP16等通信压缩hook的使用方式,用户无需修改代码,仅通过环境变量即可直接开启。注意:在单机多卡或RDMA环境等通信并非瓶颈情况下,上述功能可能不会带来加速收益。
| 功能 | 环境变量 | 默认 | 取值说明 | 建议说明 |
|---|---|---|---|---|
| 分层 AllReduce配置 | AIAK_HIERARCHICAL_ALLREDUCE | 0 | 0 表示关闭该功能;1 表示开启该功能 | TCP网络环境下建议开启 |
| 通信压缩算法配置 | AIAK_FP16_COMPRESSION | 0 | 0 表示关闭该功能;1 表示采用FP16格式压缩梯度;2 表示采用BF16格式压缩梯度 | 优先设置为1,即采用FP16格式压缩;BF16目前实验性功能,需要NCCL版本在2.9.6以上;该功能开启后,梯度通信之前,会先将梯度转换成float16/bfloat16,通信结束之后转换回float32 |
| 通信压缩算法配置 | AIAK_POWERSGD_COMPRESSION |
0 | 0 表示关闭该功能;1 开启 powersgd 压缩;2 开启 batched powersgd 压缩 | 优先设置为 1,即采用 powersgd 压缩方式;batched powersgd 性能更好,但是精度损失会更多;如果在 AIAK_MATRIX_APPROXIMATION_RANK=1 的情况下模型精度达到要求,可考虑使用 batched powersgd;该功能可以单独使用,也可以和 FP16 压缩组合开启,此时压缩算法会叠加进行 |
| 通信压缩算法配置 | AIAK_MATRIX_APPROXIMATION_RANK | 1 | 可以从1开始,按2的倍数来设置,比如1、2、4,... | 针对powersgd算法的超参数,该值决定了压缩率,值越小,压缩越强;通常情况,设置为1-4即可,如果精度影响较多,可以尝试调大 |
| 通信压缩算法配置 | AIAK_START_COMPRESS_ITER | 1000 | 表示从第几个step开始执行压缩算法,默认为1000 | 如果训练中有warmup阶段,该值通常不应少于warmup的step数量;过早使用梯度压缩可能会影响最终收敛效果,如要调整该值,建议不小于总训练step的10% |
3.2 AMP O2混合精度模式,进一步加速计算
Pytorch官方提供了AMP自动混合精度功能,用户可以使用该技术加速模型的计算效率。AIAK-Training在该功能基础之上,引入了NVIDIA APEX AMP中的O2模式,并在接口层面与Torch AMP做了兼容,用户仅需增加一行代码,即可快速使能更为激进的纯FP16训练方案。具体用法如下:
- 用户需要在模型和 optimizer 准备就绪后,增加一行
aiak_amp_decorate函数调用代码。另外当使用 DDP 时,aiak_amp_decorate需在 DDP 执行之前调用(具体见下述示例)。 - 当使用梯度裁剪时,
clip_grad_norm_(model.parameters(), max_norm)中的model.parameters()需要替换为torch.cuda.amp.aiak_amp_parameters(optimizer)。
1# 定义 model 和优化器
2model = Model().cuda()
3optimizer = optim.SGD(model.parameters(), ...)
4
5# 新增 aiak_amp_decorate 封装调用,用于使能 Apex AMP O2模式
6model, optimizer = torch.cuda.amp.aiak_amp_decorate(model, optimizer)
7
8# 在O2优化初始化之后构造DDP model
9model = DDP(model)
10
11# torch 原生 amp 用法的相关代码,无需修改
12scaler = GradScaler()
13
14for input, target in data:
15 optimizer.zero_grad()
16 # 在autocast enable 区域运行forward
17 with autocast():
18 output = model(input)
19 loss = loss_fn(output, target)
20 # 用scaler,scale loss(FP16),backward得到scaled的梯度(FP16)
21 scaler.scale(loss).backward()
22 # 当使用梯度裁剪时,遵守torch原生AMP调用规则,调用unscale进行梯度恢复
23 scaler.unscale_(optimizer)
24 # 梯度裁剪时,需要替换model.parameters()为amp.amp_parameters(optimizer)
25 torch.nn.utils.clip_grad_norm_(torch.cuda.amp.aiak_amp_parameters(optimizer), max_norm)
26 # scaler 更新参数,会先自动unscale梯度, 如果有nan或inf,自动跳过
27 scaler.step(optimizer)
28 # scaler factor更新
29 scaler.update()
aiak_amp_decorate 接口参数详细如下:
| 参数项 | 是否必填 | 默认值 | 说明 |
|---|---|---|---|
| model | 是 | 无 | 模型 |
| optimizer | 是 | 无 | 优化器 |
| keep_batchnorm_fp32 | 否 | TRUE | 一般不需要调整该参数。该参数具体值是否保持batchNorm计算精度为FP32,通常设置为True |
| loss_scale | 否 | None | 一般不需要调整该参数;如果设置为一个浮点数,则使用该静态值进行梯度缩放;如果设置为字符串“dynamic”,则会随时间推移调整损失比例,自动动态缩放;设置为None,会启动和“dynamic”相同的效果 |
| num_losses | 否 | 1 | 一般不需要调整该参数;表示有多少个loss/backward的pass使用 |
| min_loss_scale | 否 | None | 一般不需要调整该参数;表示动态缩放时loss_scale的下限 |
| max_loss_scale | 否 | 2**24 | 一般不需要调整该参数;表示动态缩放时loss_scale的上限 |
其他注意点:在使用O2模式时,torch原生GradScaler类的backoff_factor、growth_factor、growth_interval等参数,会按照o2模式自动更新,用户无需手动调整,如手动调整也不会实际生效。
若运行环境未开启 CUDA,或未使用 AIAK-Training 对应运行时,可能出现 Torch not compiled with CUDA enabled,或 torch.cuda.amp 中不存在 aiak_amp_decorate / aiak_amp_parameters 的情况。#### 3.3 FusedOptimizer 加速参数更新效率
用户使能优化器融合功能,只需设置如下环境变量:
| 功能 | 环境变量 | 默认 | 取值说明 | 建议说明 |
|---|---|---|---|---|
| 优化器算子融合 | AIAK_FUSED_OPTIMIZER | 0 | 0 表示关闭该功能;1 表示开启该功能 | 加速优化器 step 阶段效率,建议开启 |
3.4 大 BatchSize 训练,使能 LAMB优化器
LAMB 优化器,和其他优化器使用方式类似,具体举例如下:
1import torch.optim as optim
2...
3optimizer = optim.LAMB(model.parameters(), lr=args.lr, weight_decay=args.weight_decay, eps=args.eps, betas=args.betas)
Lamb 优化器参数详细如下:
| 参数项 | 是否必填 | 默认值 | 说明 |
|---|---|---|---|
| params | 是 | 无 | 模型参数 |
| lr | 否 | 1e-3 | 初始学习率,默认1e-3,用户按需进行配置 |
| weight_decay | 否 | 0 | 权重衰减系数,用户按需进行配置 |
| betas | 否 | (0.9, 0.999) | 一般不需要调整该参数;betas = (beta1,beta2),用于计算梯度以及梯度平方的运行平均值的系数;beta1:一阶矩阵的指数衰减率(如0.9);beta2:二阶矩阵的指数衰减率(如0.999) |
| eps | 否 | 1e-8 | 一般不需要调整该参数;模糊因子,防止出现除0的情况 |
| adam_w_mode | 否 | TRUE | 一般不需要调整该参数;表示是否使用L2正则化,默认开启 |
| grad_averaging | 否 | TRUE | 一般不需要调整该参数;表示计算平均梯度时,是否使用系数(1-beta2) |
| set_grad_none | 否 | TRUE | 一般不需要调整该参数;执行zero_grad时,是否将梯度设置为None |
| max_grad_norm | 否 | 1 | 一般不需要调整该参数;表示梯度裁剪系数 |
评价此篇文章
