一.前提条件
在前面的章节中我们已经安装了包含模型转换的套件包CANN-TOOLKIT,默认的安装路径会在/usr/local/Ascend里面,我们将该套件所需要的东西加入到环境变量中以便我们调用:
将source /usr/local/Ascend/ascend-toolkit/set_env.sh加入到~/.bashrc中:
可能大家要区分这两个包的的区别:
nnrt是只含有算子库比如acl相关的依赖库,只可以用作推理,而cann-toolkit包含了很多其他库,比如模型转换库ATC、性能分析工具profiling等,所以对于开发板的大家在安装toolkit的时候会出现内存不足只能安装nnrt,对于服务器或者边缘小站这类的可以拉取Ascendhub官网镜像自带cann-toolkit, 下载链接AscendHub
对于大家没有足够的Ascend硬件资源,手里只有一块开发板,而且内存不足的时候,CANN-TOOLKIT也支持在非昇腾的设备上进行安装,就比如我们在windows上安装linux-ubuntu的虚拟机,虚拟机里面进行安装该软件,但是在安装的过程中大家会遇到一个问题,就是在非root用户下进行安装,在安装的时候没有加必要的参数,所以建议大家也可以所有操作都在root用户下操作,包括模型转换以及安装过程、模型文件的所属用户都是root用户。
可以参考链接:昇腾社区-官网丨昇腾万里 让智能无所不及
二.为什么需要atc工具(参考链接:昇腾社区-官网丨昇腾万里 让智能无所不及)
ATC(Ascend Tensor Compiler)是异构计算架构CANN体系下的模型转换工具, 它可以将开源框架的网络模型以及Ascend IR定义的单算子描述文件(json格式)转换为昇腾AI处理器支持的.om格式离线模型。简而言之:将大家在pytorch tensorflow cafffe mindspore 框架下训练的模型转换为昇腾硬件可以加载加速的模型,就跟大家使用nvidia jeston \ 瑞芯微的 rk3588 1808等设备需要转换为后缀为.engine 或者 .rknn类似的操作,atc将其他框架的模型转换为om,
还有一个问题就是:大家可能会问在昇腾设备上什么是离线推理、什么是在线推理,使用atc模型转换出来的om 模型或者但单算子文件这样直接加载模型的权重类型就是离线,不依赖任何AI框架,只需要支持模型的内部结构网络实现即可,在线推理就是我们在训练的时候手动实现模型结构加载参数进行推理输出。
三.如何使用atc工具
在这里我只介绍普遍出现的CV场景以及简单的nlp场景,对于大模型的离线推理大家可以去华为官网查看ATB同样类似的离线大模型推理。比如大家常用的OCR YOLOV5 deepsort resnet这几个模型的转换技巧,我这里主要针对onnx模型转换为om模型,因为onnx模型是开源框架支持较好的,讲解大家拿到一个onnx模型我们应该怎么去使用atc工具,怎么去写这个参数,怎么转换出来的模型更方便我们使用。
例如一:yolov5.onnx(yolov5.pt模型转换至onnx可根据官网github export.py进行导出)
下载netron查看onnx的模型结构:
我们在转换为onnx的时候可以指定为动态的也可以像我这里是定死了1.3.640.640,B C H W这样的维度信息,大家可以把B设置为-1就是动态的batch size;我们在进行模型转换时,先考虑之前英伟达或者瑞芯微上面数据的预处理解码用的是opencv还是pl,我们转换模型可以根据不同的输入来设置ATC转换的aipp参数,比如大部分人喜欢使用opencv 的imread或者videocapture去拉流rtsp或者图片:
opencv 默认读取到的图片格式为uint8 NHWC格式的图片,所以我们有两种方式解决这个问题:
(1)在源码中将uint8 NHWC图片转换为float32 NCHW格式的图片,如下所示:
python:
c++:
cv::Mat ResizeImg;cv::resize(frame, ResizeImg, cv::Size(g_modelWidth_, g_modelHeight_));cout<<ResizeImg.rows<<endl<<ResizeImg.cols<<endl;cv::cvtColor(ResizeImg, ResizeImg, cv::COLOR_BGR2RGB);// reiszeMat.convertTo(reiszeMat, CV_32FC3,1.0/255);ResizeImg.convertTo(ResizeImg, CV_32FC3);// cvtColor(MatBGRImage, RGBImg, COLOR_BGR2RGB);// cv::resize(RGBImg, ResizeImg, Size(224, 224));// mean_rgb = [0.485, 0.456, 0.406]// std_rgb = [0.229, 0.224, 0.225]int channels = ResizeImg.channels(), height = ResizeImg.rows, width = ResizeImg.cols;float* nchwMat = (float*)malloc(channels * height * width * sizeof(float));memset(nchwMat, 0, channels * height * width * sizeof(float));cout << channels * height * width * sizeof(float) << endl;// Convert HWC to CHW and Normalizefloat mean_rgb[3] = { 0.485, 0.456, 0.406 };float std_rgb[3] = { 0.229, 0.224, 0.225 };float* ptMat = ResizeImg.ptr<float>(0);int area = height * width;for (int c = 0; c < channels; ++c){for (int h = 0; h < height; ++h){for (int w = 0; w < width; ++w){int srcIdx = c * area + h * width + w;int divider = srcIdx / 3; // 0, 1, 2for (int i = 0; i < 3; ++i){nchwMat[divider + i * area] = static_cast<float>((ptMat[srcIdx] * 1.0 / 255.0 - mean_rgb[i]));}}}}
(2) 但是在实际应用中C++的预处理使用上述耗时太长,所以不建议编写代码进行通道转换,这时候大家可以使用aipp的功能,将模型的输入从float32 NCHW 转换为 uint8 NHWC就是将RGB格式输入转换为BGR参数输入:参考官方链接:昇腾社区-官网丨昇腾万里 让智能无所不及
大家也可以参考我的aipp配置参数:
aipp_op{
aipp_mode:static
input_format : RGB888_U8
csc_switch : false
rbuv_swap_switch:truevar_reci_chn_0 :0.003921568627451
var_reci_chn_1 :0.003921568627451
var_reci_chn_2 :0.003921568627451}
这时我们转换出来的模型直接可以使用videocapture 读取内存拷贝输入到模型中:om模型结构如下:
转换模型的命令如下:
atc --model=${model}.onnx --output=${model}_bs${bs}_aipp \--framework=5 --input_format=NCHW --soc_version=${soc} --log=error \--input_shape="images:${bs},3,640,640" \--enable_small_channel=1 --insert_op_conf=aipp.cfg --output_type=FP16 \--optypelist_for_implmode="Sigmoid" --op_select_implmode=high_performance \--fusion_switch_file=common/atc_cfg/fusion.cf
--model:为onnx模型名称:
--output为输出模型名称自行设定
----soc_version为运行设备芯片名称:有Ascend310 \Ascend310B1 Ascend310p3可以使用
npu-smi info查询:
--insert_op_conf=aipp.cfg;为刚刚配置的文件;
--output_type根据onnx模型的输出进行配置;防止输出数据错误
其他参数请参考atc参数命令。
列二:如果我们拿到一个deepsort_reid.onnx(重识别的onnx模型)
我们拿到陌生的模型先不用着急怎么处理,先用netron打开网络模型查看输入:
可以看到我们需要的输入为 -1 3 128 64大小的输入,并且为float32 NCHW,所以转换模型和上面的yolov5类似,但是在input_shape参数修改为1 3 128 64就可以。
下一章我们介绍昇腾硬解码dvpp
大家想要曻腾环境请关注Q群:855986726