See Ascend
PyTorch模型迁移&调优——模型迁移方法和步骤
1.NPU&Davinci硬件架构介绍
NPU又叫AI芯片,是一种嵌入式神经网络处理器,其与CPU、GPU明显区别之一在于计算单元的设计,如图所示,在AI Core内部计算单元进一步划分为矩阵运算,向量运算和标量运算。下面详细介绍一下各部分:
- Cube,负责矩阵运算,每次可完成一个fp16类型的16 * 16与16 * 16大小的两个矩阵相乘,相关操作包括matmul,Conv2d,linear等运算。
- Vector,负责向量运算,算力低于Cube,但灵活度高。Vector运算类型包括fp16,fp32,int32,int8
- Scalar,负责标量运算和程序流程控制,功能上类似于一个小型cpu
2.Ascend-Pytorch(1.8)安装
放一个Ascend官方安装教程,具体不再赘述。
3.Pytorch模型迁移指导
注意:这里所说的迁移只是指用Pytorch搭建的模型在Ascend系列硬件上训练,并不直接涉及MindSpore。
Pytorch的模型迁移共有三种方式,根据源代码的不同修改的难易程度也不同,因此修改时需要因‘’地‘’制宜
自动迁移
- 难度系数:一颗心
- 操作方式:只需要在训练脚本中添加下面一行代码即可跑通整个模型
from torch_npu.contrib import transfer_to_npu
脚本转换工具迁移
- 难度系数:三颗心
- 操作方式:
# 进入脚本转换工具所在路径(即脚本工具的安装路径)
cd Ascend-cann-toolkit安装目录/ascend-toolkit/tools/ms_fmk_transplt/
# 执行脚本转换
./pytorch_ _gpu2npu.sh -i 原始脚本路径 -0 脚本转换结果输出路径 -V 原始脚本框架
# 查看结果
手工迁移,需要注意的点,已在下面列出
第一步——迁移准备(DDP&混合精度方式修改)
- 关于分布式:于NPU上的一 些限制,PyTorch需要使DistributedDataParallel(DDP), 若原始代码使用的是DataParallel(DP)则需要修改为DDP,DP相应的一些实现例如torch.cuda.common, 则可以替换为torch.distributed相关操作
- 由于npu天然的混合精度,因此需要使用apex对原始代码进行修改,如下图所示
第二步:单卡模型迁移(训练设备修改)
- 将设备从cuda切换至npu(具体示例参见文尾链接)
torch.cuda→torch.npu
第三步:多卡模型迁移
- 将分布式通讯方式“nccl”改为“hccl”(具体示例参见文尾链接)
个人经验:可以先试着使用自动迁移的方式,在训练脚本中添加添加那一行代码,若不行的话则直接进行手动迁移
4.总结
- 了解了Pytorch是如何适配到昇腾平台上的
- 了解了Davinci硬件架构以及什么样的模型在昇腾上更亲和
- 了解了软件术语和Ascend-Pytorch的安装步骤
- 了解了如何将原生Pytorch的模型代码适配到Ascend-Pytorch
5.链接