参照2023年cann训练营第二季 Asced c 算子开发
一、在华为云搭建环境
进入到华为云控制台,左上角切换至北京4,租用服务器
进入镜像,安装环境。
进行Asced c开发需要cann 7.0环境,去昇腾官网下载Ascend-cann-toolkit_7.0.0.alpha002_linux-aarch64.run,下载链接如下:
https://www.hiascend.com/developer/download/community/result?module=cann&cann=7.0.0.alpha002
安装方法参照
https://blog.csdn.net/weixin_42140974/article/details/135093518?spm=1001.2014.3001.5502
安装完成。
二、pytorch MNIST Asced npu(910)训练
迁移训练有三种方法
1.自动迁移
自动迁移 导入脚本转换库 ,整体过程为:边训练边转换
import torch
import torch_npu
.....
import transfer_to_npu
2.工具迁移
工具迁移是使用 ascend-toolkit/latest/tools/ms_fmk_transplt 路径下的 pytorch_gpu2npu.sh脚本进行迁移 整体过程为:先转换脚本,再进行训练。
#单卡
./pytorch_gpu2npu.sh -i /home/train/ -o /home/out -v 1.11.0 [-s] [-m]
#分布式
./pytorch_gpu2npu.sh -i /home/train/ -o /home/out -v 1.11.0 [-s] [-m] distributed -m /home/train/train.py [-t model]
3.手工迁移
手动更改代码,完成设备的迁移。
迁移要点如下:
(1)定义NPU为训练设备,或将适配GPU的接口切换至适配NPU的接口。
(2)多卡迁移需修改芯片间通信方式为hccl。
官方推荐使用自动迁移进行训练
速度不是很快,是因为没有进行优化,只是完成了初步的迁移,不过听说马上昇腾npu和pytorch可以完美的适配了。
三、算子开发Addcmul
1.测试Add算子开发例程
算子例程测试成功。
2.重新搭建一个算子开发工程:
使用Mindstudio生成json IR文件:
生成文件内容如下:
[
{
"framework":"ONNX",
"op":"Addcmul",
"input_desc":[
{
"name":"x",
"format":"ND",
"type":"float",
"param_type":"required"
},
{
"name":"y",
"format":"ND",
"type":"float",
"param_type":"required"
},
{
"name":"z",
"format":"ND",
"type":"float",
"param_type":"required"
}
],
"output_desc":[
{
"name":"out",
"format":"ND",
"type":"float",
"param_type":"required"
}
],
"attr":[
{
"name":"value",
"type":"float",
"default_value":1.0,
"param_type":"required"
}
]
}
]
3.使用msopgen 工具生成算子开发文件
/home/ma-user/work/Ascend/ascend-toolkit/latest/python/site-packages/bin/msopgen gen -i ./IR_json.json -c ai_core-Ascend910 -lan cpp -out /home/ma-user/work/op_add/AddCustom
4.根据Asced c 视频课 将add工程中的代码 复制到本工程并做修改,文章最后提供完整的工程链接
更改过后运行
bash run.sh ascend910 cpu
发现报错如下:
代码只执行前128个数据运算,发现如果执行bash run.sh ascend310p cpu 或者ascend910B1是可以通过测试的,因为官方的算子课需要的平台是310p平台,每个平台的硬件设计不同,所以代码的编写也不同,在cann算子老师 大姚老师帮助下将
//constexpr int32_t TILE_NUM = 8;
//constexpr int32_t BUFFER_NUM = 2;
constexpr int32_t TILE_NUM = 16;
constexpr int32_t BUFFER_NUM = 1;
做如上修改,代码通过测试。
npu 测试命令
bash run.sh ascend910 npu_onboard
完结。
链接: https://pan.baidu.com/s/15E9gPEKHum0FyvQAqnp0Cg?pwd=5qy1 提取码: 5qy1 复制这段内容后打开百度网盘手机App,操作更方便哦