文档
注册

NPU亲和优化器替换

基本原理

当前昇腾AI处理器支持NPU亲和的融合优化器功能,针对表1中的优化器做了昇腾AI处理器亲和性优化,使性能提升。

PyTorch在混合精度模式下典型参数更新流程如下。
  1. 前向传播。
  2. Loss乘缩放系数s。
  3. 反向传播。
  4. 梯度和参数更新,即梯度和参数除以缩放系数s。

以上流程每个迭代执行一次,对梯度和参数的更新计算会包含连续多个小算子(如add、mul、sqrt等)下发,由于小算子在NPU上计算快,导致算子在CPU上的下发成为主要瓶颈。

操作步骤

代码修改方法如下,其余参数配置情况均与原生函数一致。
表1 亲和优化器使用方法

优化器名称

样例原代码

修改后代码

sgd

optimizer = torch.optim.SGD(model.parameters(), lr=args.lr)

optimizer = torch_npu.optim.NpuFusedSGD(model.parameters(), lr=args.lr)

adadelta

optimizer = torch.optim.Adadelta(model.parameters(), lr=args.lr)

optimizer = torch_npu.optim.NpuFusedAdadelta(model.parameters(), lr=args.lr)

lamb

optimizer = torch.optim.Lamb(model.parameters(), lr=args.lr)

optimizer = torch_npu.optim.NpuFusedLamb(model.parameters(), lr=args.lr)

adam

optimizer = torch.optim.Adam(model.parameters(), lr=args.lr)

optimizer = torch_npu.optim.NpuFusedAdam(model.parameters(), lr=args.lr)

adamw

optimizer = torch.optim.AdamW(model.parameters(), lr=args.lr)

optimizer = torch_npu.optim.NpuFusedAdamW(model.parameters(), lr=args.lr)

adamp

optimizer = torch.optim.AdamP(model.parameters(), lr=args.lr)

optimizer = torch_npu.optim.NpuFusedAdamP(model.parameters(), lr=args.lr)

bert_adam

optimizer = torch.optim.BertAdam(model.parameters(), lr=args.lr)

optimizer = torch_npu.optim.NpuFusedBertAdam(model.parameters(), lr=args.lr)

rmsprop

optimizer = torch.optim.RMSprop(model.parameters(), lr=args.lr)

optimizer = torch_npu.optim.NpuFusedRMSprop(model.parameters(), lr=args.lr)

rmsprop_tf

optimizer = torch.optim.RMSpropTF(model.parameters(), lr=args.lr)

optimizer = torch_npu.optim.NpuFusedRMSpropTF(model.parameters(), lr=args.lr)

优化策略

使用昇腾AI处理器亲和的融合优化器替换原始优化器,如使用torch_npu.optim.NpuFusedRMSprop替换torch.optim.RMSprop。替换后重建训练的Profiling数据如下。使用案例请参见NPU亲和优化器替换调优案例

结果验证

若用户需要验证具体的优化效果,可参考E2E Profiling数据采集与分析,在Chrome浏览器中打开msprof.json文件,查看梯度更新部分,如下。

图1 梯度更新部分

通过上图可发现在梯度更新过程中,存在大量小算子下发。

图2 Profiling数据。

对比发现算子数量明显减少。

搜索结果
找到“0”个结果

当前产品无相关内容

未找到相关内容,请尝试其他搜索词