昇腾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访问…

objectMapper、ObjectNode、JsonNode调用接口时进行参数组装

objectMapper、ObjectNode、JsonNode用于调用接口时进行参数组装 public String sendText( List< String > listUser, String content ) throws JsonProcessingException{if ( listUser.size() < 0 ){return "用户ID为空&#xff01;";}if ( content.lengt…

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

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

.Net Core_1_

从今天开始学习.Net Core的相关技术&#xff0c;我的文章内容基本出自B站杨中科老师的课程 .NET 6教程&#xff0c;.Net Core 2022视频教程&#xff0c;杨中科主讲_哔哩哔哩_bilibili 可以把这个系列文章看作是学习笔记&#xff0c;方便查阅和回顾 废话不多说&#xff0c;开…

part2 思维导图(微分部分)

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

RAID 创建使用以及ubuntu安装和使用zfs文件系统及Ubuntu软件安装

RAID 创建使用 部署 RAID 10 的学习 1. 搭建 RAID 10 就是 RAID 1 加上 RAID 0,准备四块磁盘&#xff0c;用于创建 RAID 10,配置vmware虚拟机&#xff0c;创建四个虚拟硬盘。 2. 检查磁盘信息 rootubuntu:~# ls /dev/sd* /dev/sda /dev/sda1 /dev/sda2 /dev/sda3 /dev/s…

OpenAI的Sora:AI视频模型的新里程碑

Sora - 探索AI视频模型的无限可能 随着人工智能技术的飞速发展&#xff0c;AI视频模型已成为科技领域的新热点。而在这个浪潮中&#xff0c;OpenAI推出的首个AI视频模型Sora&#xff0c;以其卓越的性能和前瞻性的技术&#xff0c;引领着AI视频领域的创新发展。让我们将一起探讨…

C++面试:数据库的权限管理数据库的集群和高可用

目录 一、数据库的权限管理 1. 用户和角色管理 用户管理 实例举例&#xff08;以MySQL为例&#xff09;&#xff1a; 角色管理 实例举例&#xff08;以MySQL为例&#xff09;&#xff1a; 总结 2. 权限和授权 用户和角色管理 用户管理 角色管理 权限和授权 权限 授…

【汽车点火开关的四个档位:START、ON、ACC、LOCK】

START档&#xff1a;启动档&#xff0c;将钥匙拧到此位置时&#xff0c;启动机电路接通&#xff0c;会带动发动机运转并启动。松开后钥匙会自动回到ON档。 而START档是发动机启动档位&#xff0c;启动后会自动恢复正常状态也就是ON档。 LOCK档&#xff1a;锁止档&#xff0c;…

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…

Web 服务相关概念

状态是web服务的概念&#xff0c;比如不需要登录的浏览门户网站就是无状态的&#xff0c;需要登陆转账买东西这种就是有状态的 有状态服务和无状态服务的区别&#xff1a; 有状态和无状态是两种却不同的服务架构&#xff0c;两者的不同之处在于服务状态的处理。服务状态是服务…

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

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

设计模式浅析(七) ·适配器模式

设计模式浅析(七) 适配器模式 日常叨逼叨 java设计模式浅析&#xff0c;如果觉得对你有帮助&#xff0c;记得一键三连&#xff0c;谢谢各位观众老爷&#x1f601;&#x1f601; 适配器模式 概念 适配器模式将一个类的接口转换成客户期望的另一个接口。适配器让原本接口不兼…

前端架构: 脚手架之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;目…