当前位置: 首页 > news >正文

昇腾ACL应用开发之模型转换ATC

一.前提条件

在前面的章节中我们已经安装了包含模型转换的套件包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

相关文章:

  • unity学习(34)——角色选取界面(跨场景坑多)
  • MySQL 多表操作
  • Tomcat 学习之 Servlet
  • 12 Autosar_SWS_MemoryMapping.pdf解读
  • Android全新UI框架之常用ComposeUI组件
  • Mysql表字符集更换
  • unity学习(32)——跳转到角色选择界面(父子类问题)
  • Pytorch 复习总结 3
  • Sora:开启视频内容创作新纪元的AI革命
  • 喝点小酒-胡诌“编程语言学习”
  • 算法:有效的括号
  • 压缩感知(Compressed Sensing)的MATLAB仿真实现
  • 即时通讯技术文集(第33期):IM开发综合技术合集(Part6) [共12篇]
  • Opencv3.2 ubuntu20.04安装过程
  • 新媒体运营-职业属性篇
  • JavaScript对象详解
  • Java教程_软件开发基础
  • JS 面试题总结
  • Js实现点击查看全文(类似今日头条、知乎日报效果)
  • PhantomJS 安装
  • python docx文档转html页面
  • Python学习之路16-使用API
  • win10下安装mysql5.7
  • 创建一种深思熟虑的文化
  • 干货 | 以太坊Mist负责人教你建立无服务器应用
  • ------- 计算机网络基础
  • 猫头鹰的深夜翻译:Java 2D Graphics, 简单的仿射变换
  • 使用 @font-face
  • 视频flv转mp4最快的几种方法(就是不用格式工厂)
  • 它承受着该等级不该有的简单, leetcode 564 寻找最近的回文数
  • 腾讯大梁:DevOps最后一棒,有效构建海量运营的持续反馈能力
  • 我看到的前端
  • 译有关态射的一切
  • 原生Ajax
  • 如何在 Intellij IDEA 更高效地将应用部署到容器服务 Kubernetes ...
  • ​DB-Engines 12月数据库排名: PostgreSQL有望获得「2020年度数据库」荣誉?
  • !!java web学习笔记(一到五)
  • # 透过事物看本质的能力怎么培养?
  • (04)Hive的相关概念——order by 、sort by、distribute by 、cluster by
  • (1)bark-ml
  • (JS基础)String 类型
  • (九)c52学习之旅-定时器
  • (原創) 如何將struct塞進vector? (C/C++) (STL)
  • (转)http-server应用
  • .gitignore文件设置了忽略但不生效
  • .net 使用$.ajax实现从前台调用后台方法(包含静态方法和非静态方法调用)
  • .Net(C#)常用转换byte转uint32、byte转float等
  • .NET(C#、VB)APP开发——Smobiler平台控件介绍:Bluetooth组件
  • .Net7 环境安装配置
  • .Net环境下的缓存技术介绍
  • @angular/cli项目构建--Dynamic.Form
  • @TableLogic注解说明,以及对增删改查的影响
  • [20180312]进程管理其中的SQL Server进程占用内存远远大于SQL server内部统计出来的内存...
  • [C++]四种方式求解最大子序列求和问题
  • [CSS]浮动