昇腾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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/695411.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

人为物累,心为形役

一、人是什么 你是你&#xff0c;他是他&#xff0c;我是我&#xff0c;有什么区别吗&#xff0c;直到自我发现我与你不同时&#xff0c;不同是什么&#xff0c;身体结构&#xff1f;人生经历&#xff1f;所拥有的一切&#xff1f;暂时搁置这些的话&#xff0c;抽离我们的意识…

[ai笔记11] 论ai韭菜的自我修养

欢迎来到文思源想的ai空间&#xff0c;这是技术老兵学习ai以及观点分享的第11篇内容&#xff01; 上班之后时间确实少了许多&#xff0c;但是最近也没闲着&#xff0c;关于ai的学习一直在探索两个部分&#xff0c;一个是看那本有名的书《这就是ChatGPT》&#xff0c;另外一个则…

Gmail邮箱群发邮件的技巧?邮箱怎么绑定?

Gmail邮箱注册教程指南&#xff1f;如何注册新的Gmail邮箱帐户&#xff1f; Gmail邮箱作为谷歌推出的邮件服务&#xff0c;以其高效、稳定和便捷的特性受到广大用户的喜爱。然而&#xff0c;如何在Gmail中进行有效的群发邮件&#xff0c;接下来&#xff0c;蜂邮将给大家介绍一…

odoo16-API(Controller)带有验证访问的接口

odoo16-API&#xff08;Controller&#xff09;带有验证访问的接口 目前我使用odoo原生的登录token来验证登陆的有效性 废话不多说直接上代码 # 测试获取session_id import requests class GetOdooData(http.Controller):def getOdooToken(self):# http://localhost:8123访问…

【深入理解设计模式】 工厂设计模式

工厂设计模式 工厂设计模式是一种创建型设计模式&#xff0c;它提供了一种在不指定具体类的情况下创建对象的接口。在工厂设计模式中&#xff0c;我们定义一个创建对象的接口&#xff0c;让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到其子类。 工厂设计模式的目…

part2 思维导图(微分部分)

1. 导数和微分 2. 一元微分学 2.1 四则运算 2.2 口诀 2.3 导数计算 2.3.1 计算1 2.3.1 计算2

win32汇编定时器继续学习2

前面学习了win32汇编定时器&#xff0c;还非常不熟悉&#xff0c;继续熟悉&#xff0c;稍微增加一点功能&#xff1b; .386.model flat,stdcalloption casemap:noneinclude windows.inc include user32.inc includelib user32.lib include kernel32.inc includelib kernel32…

2024生物发酵展创新盛会-兰格恒流泵

​ 参展企业介绍 兰格恒流泵有限公司成立于1997年&#xff0c;是英国豪迈国际有限公司&#xff08;Halma&#xff09;的全资子公司。我们始终坚持以客户需求为导向&#xff0c;提供安全、高精度及高品质的流体传输设备和解决方案。兰格产品系列超…

前端架构: 脚手架之Chalk和Chalk-CLI使用教程

Chalk Chalk 是粉笔的意思, 它想表达的是&#xff0c;给我们的命令行中的文本添加颜色类似彩色粉笔的功能 在官方文档当中&#xff0c;它的 Highlights 核心特性 Expressive API Highly performant No dependencies Ability to nest styles 256/Truecolor color support Auto-…

提高工作效率,体验ONLYOFFICE办公软件

ONLYOFFICE办公软件 一、前言二、特点完整办公套件协作过程更容易 三、访问地址 一、前言 随着数字化办公的普及&#xff0c;办公软件在我们的工作中扮演着越来越重要的角色。为了提高工作效率&#xff0c;我们需要一个功能强大、易于使用的办公软件。ONLYOFFICE作为一款全功能…

分布式系统一致性与共识算法

分布式系统的一致性是指从系统外部读取系统内部的数据时&#xff0c;在一定约束条件下相同&#xff0c;即数据&#xff08;元数据&#xff0c;日志数据等等&#xff09;变动在系统内部各节点应该是一致的。 一致性模型分为如下几种&#xff1a; ① 强一致性 所有用户在任意时…

安装SSH连接工具

连接Linux 1). 打开finalShell 2). 建立连接 Linux目录结构 在Linux系统中&#xff0c;也是存在目录的概念的&#xff0c;但是Linux的目录结构和Windows的目录结构是存在比较多的差异的 在Windows目录下&#xff0c;是一个一个的盘符(C盘、D盘、E盘)&#xff0c;目…

东南大学easyconnect无法连接校园网的解决方案

一般没设置柯学上网的电脑都没什么问题 1.网络异常 加上clash直连即可

五种多目标优化算法(NSWOA、MOJS、MOAHA、MOPSO、NSGA2)性能对比(提供MATLAB代码)

一、5种多目标优化算法简介 1.1NSWOA 1.2MOJS 1.3MOAHA 1.4MOPSO 1.5NSGA2 二、5种多目标优化算法性能对比 为了测试5种算法的性能将其求解9个多目标测试函数&#xff08;zdt1、zdt2 、zdt3、 zdt4、 zdt6 、Schaffer、 Kursawe 、Viennet2、 Viennet3&#xff09;&#xff0…

设计模式-创建型模式-抽象工厂模式

抽象工厂模式&#xff08;Abstract Factory Pattern&#xff09;&#xff1a;提供一个创建一系列相关或相互依赖对象的接口&#xff0c;而无须指定它们具体的类。抽象工厂模式又称为Kit模式&#xff0c;它是一种对象创建型模式。 由于工厂方法模式中的每个工厂只生产一类产品&…

stm32——hal库学习笔记(DAC)

这里写目录标题 一、DAC简介&#xff08;了解&#xff09;1.1&#xff0c;什么是DAC&#xff1f;1.2&#xff0c;DAC的特性参数1.3&#xff0c;STM32各系列DAC的主要特性 二、DAC工作原理&#xff08;掌握&#xff09;2.1&#xff0c;DAC框图简介&#xff08;F1&#xff09;2.2…

《穿越科技的前沿:计算机专业必看的电影盛宴》

文章目录 每日一句正能量前言电影推荐推荐一&#xff1a;《黑客帝国》推荐二&#xff1a;《社交网络》推荐三&#xff1a;《源代码》推荐四&#xff1a;《谍影重重》系列推荐五&#xff1a;《旋转木马》 技术与主题后记 每日一句正能量 一个人的一生&#xff0c;就是一座有了年…

探索Go语言中的HTTP路由和中间件

在Go语言中&#xff0c;HTTP路由和中间件是实现Web应用程序核心功能的关键组件。路由负责将传入的HTTP请求分发到适当的处理函数&#xff0c;而中间件则提供了一种在请求处理过程中插入额外逻辑的机制。 HTTP路由 在Go中&#xff0c;net/http标准库提供了基本的路由功能&…

WebGIS开发技术岗真实面经分享!

24春招在即&#xff0c;很多人都已经在开始踏上面试的征程 面对日益严峻的就业环境&#xff0c;想获得更好的工作机会&#xff0c;没有捷径可走&#xff0c;只有不断提升才是硬道理。在此小编分享几个网友GIS开发岗真实的面试经历&#xff0c;希望对正在求职的你&#xff0c;有…

六、回归与聚类算法 - 线性回归

目录 1、线性回归的原理 1.1 应用场景 1.2 什么是线性回归 1.2.1 定义 1.2.2 线性回归的特征与目标的关系分析 2、线性回归的损失和优化原理 2.1 损失函数 2.2 优化算法 2.2.1 正规方程 2.2.2 梯度下降 3、线性回归API 4、回归性能评估 5、波士顿房价预测 5.1 流…