功能 |
开启方式举例 |
描述 |
---|---|---|
O1配置模式 |
model, optimizer = amp.initialize(model, optimizer, opt_level="O1") |
|
O2配置模式 |
model, optimizer = amp.initialize(model, optimizer, opt_level="O2") |
针对全网中float32数据类型的算子,按照内置优化策略,自动将部分float32的算子降低精度到float16,从而在精度损失很小的情况下提升性能并减少内存使用。 |
O3配置模式 |
model, optimizer = amp.initialize(model, optimizer, opt_level="O3") |
全部算子使用float16计算。 |
静态Loss Scale功能 |
model, optimizer = amp.initialize(model, optimizer, opt_level="O2",loss_scale=128.0) |
用户可在混合精度训练过程中使用自定义的固定Loss Scale系数。 |
动态Loss Scale功能 |
model, optimizer = amp.initialize(model, optimizer, opt_level="O2",loss_scale="dynamic") |
用户可使能在混合精度训练过程中,根据浮点计算异常状态动态调整Loss Scale系数。 |
推荐优先使用opt_level='O2', loss_scale=128.0的配置进行amp.initialize。若无法收敛,推荐使用opt_level='O1', loss_scale=128.0的配置进行amp.initialize。若依然无法收敛,推荐使用opt_level='O1', loss_scale=None的配置进行amp.initialize。
请用户参考《CANN 软件安装指南》中“安装PyTorch”章节内的“安装APEX混合精度模块”,安装PyTorch框架对应的APEX即可。
from apex import amp
model = ... optimizer = ... model, optimizer = amp.initialize(model, optimizer, combine_grad=True)
loss = criterion(…) #将loss.backward()替换为如下形式 with amp.scale_loss(loss, optimizer) as scaled_loss: scaled_loss.backward() optimizer.step()
from torch.nn.parallel import DistributedDataParallel as DDP from apex import amp ... model = ... optimizer = ... #在模型、优化器定义之后,初始化APEX模块。 model, optimizer = amp.initialize(model, optimizer, combine_ddp=False)
from apex import amp ... model = ... optimizer = ... #在模型、优化器定义之后,初始化APEX模块。 model, optimizer = amp.initialize(model, optimizer, combine_ddp=True)
更多混合精度模块的使用可参见官方文档。
适配后的APEX针对adadelta/adam/sgd/lamb做了昇腾AI处理器亲和性优化,得到的NPU融合优化器与原生算法保持一致,但运算速度更快。使用时只需将原有优化器替换为apex.optimizers.***,***为优化器名称,例如NpuFusedSGD。
optimizer = torch.optim.SGD(model.parameters(), lr=args.lr, momentum=args.momentum) model, optimizer = amp.initialize(model, optimizer, opt_level='O2', loss_scale=32.0)
optimizer = apex.optimizers.NpuFusedSGD(model.parameters(), lr=args.lr, momentum=args.momentum) model, optimizer = amp.initialize(model, optimizer, opt_level='O2', loss_scale=32.0, combine_grad=True)
amp.register_half_function(torch, 'bmm') #填入算子API名称。以bmm为例,bmm会强制使用half进行计算 amp.register_float_function(torch, 'bmm') #填入算子API名称。以bmm为例,bmm会强制使用float进行计算
当optimizer的可更新参数分为不同的多组,每组使用不同的策略,这种场景下,融合优化器只能优化掉第一个model分组的参数。因此,当优化器的参数相同时,尽量合并分组。
optimizer = apex.optimizers.NpuFusedSGD([ {'params': model.sharedNet.parameters()}, {'params': model.bottleneck.parameters()}, {'params': model.domain_classifier.parameters()}, {'params': model.dcis.parameters()}, {'params': model.source_fc.parameters(), 'lr': LEARNING_RATE}, ], lr=LEARNING_RATE / 10, momentum=args.momentum, weight_decay=args.l2_decay)
optimizer = apex.optimizers.NpuFusedSGD([ {'params': list(model.sharedNet.parameters()) + list(model.bottleneck.parameters()) + list(model.domain_classifier.parameters())+list(model.dcis.parameters())}, {'params': model.source_fc.parameters(), 'lr': LEARNING_RATE}, ], lr=LEARNING_RATE / 10, momentum=args.momentum, weight_decay=args.l2_decay)
适配后的APEX针对数据并行场景做了昇腾AI处理器亲和性优化,支持利用融合grad进行加速,同时保持计算逻辑一致性。通过开启combine_ddp开关,也就是将amp.initialize()接口参数combine_ddp设置为True并关闭框架的DDP模式,即可开启该功能。
model, optimizer = amp.initialize(model, optimizer, combine_ddp=True) #配置运算加速参数combine_ddp