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

news2024/11/16 8:18:36

一.前提条件

在前面的章节中我们已经安装了包含模型转换的套件包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 Normalize
    float 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, 2
                for (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:true

var_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.coloradmin.cn/o/1463094.html

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

相关文章

yml配置文件中常见的配置及含义

1.数据库连接的相关配置 项目名称:datasource:driver-class-name: com.mysql.cj.jdbc.Driverhost: localhostport: 3306database: 数据库名username: 用户名password: 密码 springboot配置文件,用于配置数据库源连接信息 数据库驱动类型为com.mysql.cj.jdbc.Driver,这是数据…

35岁测试经理自述:为何我做测试十年,内心仍无比恐慌?

记得在求职的时候&#xff0c;面试官经常问我&#xff1a;“为什么要选择软件测试工作?” 而我也会经常说一堆自己有的没的优势去应付。 工作这么久了&#xff0c;也不再浮躁&#xff0c;静下心来回忆当初选择软件测试工作的历程&#xff0c;也是对自己职业生涯的一次回顾。 …

vulnhub靶场之Deathnote

一.环境搭建 1.靶场描述 Level - easy Description : dont waste too much time thinking outside the box . It is a Straight forward box . This works better with VirtualBox rather than VMware 2.靶场下载 https://www.vulnhub.com/entry/deathnote-1,739/ 3.启动环…

图——最小生成树实现(Kruskal算法,prime算法)

目录 预备知识&#xff1a; 最小生成树概念&#xff1a; Kruskal算法&#xff1a; 代码实现如下&#xff1a; 测试&#xff1a; Prime算法 &#xff1a; 代码实现如下&#xff1a; 测试&#xff1a; 结语&#xff1a; 预备知识&#xff1a; 连通图&#xff1a;在无向图…

手写线程池(JUC复习自用)

手写线程池&#xff08;复习自用&#xff09; 介绍代码 介绍 参考黑马满老师的JUC课程&#xff0c;给代码加上了相应的注释 如图所示&#xff0c;线程池核心线程数为1&#xff0c;任务队列的容量为1&#xff0c;假设要执行的线程数为4个&#xff0c;首先取一个放入线程池运行&a…

SpringBoot-2.7.6如何自定义自动配置和starter

1.Starter SpringBoot中的一大优势就是starter,SpringBoot也提供了很多开箱即用的starter依赖,使得我们开发变更加方便和简单,遵循约定大于配置的理念。 启动器是一组方便的依赖描述符,您可以将其包含在应用程序中。您可以获得所需的所有Spring和相关技术的一站式商店,而…

uni-app搭建h5项目

一、 打开官方网站 https://uniapp.dcloud.net.cn/quickstart-cli.html 二、找到使用vue-cli命令行&#xff0c;按照文档上的步骤进行搭建 全局安装 vue-cli npm install -g vue/cli搭建项目 可以根据命令行搭建&#xff0c;搭建vue2.0对应的是webpack&#xff0c; 也可以搭…

A2L文件添加结构体数组测量量,并进行测试

首先看到如下的待测的结构体数组变量是一个7x50的一个Uint32&#xff0c;相当于二维数组。 在A2L文件的Map File中搜索当前变量并新建为Map测量量 然后在Overview中选择当前结构体&#xff0c;选择属性Properties 选择数据类型为Ulong&#xff0c;就是uint32类型 配置map解析的…

【Python常用包】typing

目录 typing准备工作typing 实践Tuple、List、DictTuple - 用于定义元组类型的类型注解Dict - 用于定义字典类型的类型注解List - 用于定义列表类型的类型注解 UnionOptional 小结 typing 在 Python 中&#xff0c;typing 模块提供了一些辅助工具来帮助开发者编写类型注解&…

JAVA工程师面试专题-并发编程篇

目录 一、线程 1、并发与并行的区别 2、同步和异步的区别 3、Java中创建线程有哪些方式? 4、Thread和Runnable的区别 5、Java中的Runnable、Callable、Future、FutureTask的区别和联系&#xff1f; 6、说一下你对 CompletableFuture 的理解 7、volatile关键字有什么用&…

css2的三大特性

css的三大特性 一.层叠性概念 二.继承性行高的继承 三. 优先级概念a标签默认蓝色优先级注意事项 一.层叠性 概念 二.继承性 行高的继承 可用倍数表示三. 优先级 概念 a标签默认蓝色 优先级注意事项 例子

基于ExtendSim的半导体制造工厂仿真

这是一个离散事件模型&#xff0c;使用ExtendeSim “高级资源管理&#xff08;ARM&#xff09;”功能来组织和分配资源。 此模型使用离散事件仿真和高级资源管理&#xff08;ARM&#xff09;功能。ARM是一个集成系统&#xff0c;用于组织资源、区分资源并在整个模型中分配资源。…

java效率为什么比c/c++慢,蓝桥杯上java只得50分,c++通过?

java效率为什么比c/c慢,蓝桥杯上java只得50分&#xff0c;c通过&#xff1f; 在开始前我有一些资料&#xff0c;是我根据网友给的问题精心整理了一份「c的资料从专业入门到高级教程」&#xff0c; 点个关注在评论区回复“888”之后私信回复“888”&#xff0c;全部无偿共享给大…

nginx 具体介绍

一&#xff0c;nginx 介绍 &#xff08;一&#xff09;nginx 与apache 1&#xff0c; Apache event 模型 相对于 prefork 模式 可以同时处理更多的请求 相对于 worker 模式 解决了keepalive场景下&#xff0c;长期被占用的线程的资源浪费问题 因为有监听线程&#…

[游戏开发][虚幻5]新建项目注意事项

鼠标右键点击Client.uproject文件&#xff0c;可以看到三个比较关键的选项&#xff0c; 启动游戏&#xff0c;生成sln解决方案&#xff0c;切换引擎版本 断点调试 C代码重要步骤 如果你想断点调试C代码&#xff0c;则必须使用使用代码编译启动引擎&#xff0c;你需要做几个操作…

容器_Docker ( 05 )

容器_Docker ( 04 ) K8S管理 集群管理 集群管理命令 kubectl是用于控制Kubernetes集群的命令行工具 语法格式 : kubectl [command] [Type] [Name] [flags] command : 子命令 , 如create , get , describe , delete 查询集群信息管理命令 子命令说明help用于查看命令及子命…

openGauss学习笔记-225 openGauss性能调优-系统调优-配置向量化执行引擎

文章目录 openGauss学习笔记-225 openGauss性能调优-系统调优-配置向量化执行引擎 openGauss学习笔记-225 openGauss性能调优-系统调优-配置向量化执行引擎 openGauss数据库支持行执行引擎和向量化执行引擎&#xff0c;分别对应行存表和列存表。 一次一个batch&#xff0c;读…

C++如何避免float误差?

C如何避免float误差&#xff1f; 在开始前我有一些资料&#xff0c;是我根据网友给的问题精心整理了一份「c的资料从专业入门到高级教程」&#xff0c; 点个关注在评论区回复“888”之后私信回复“888”&#xff0c;全部无偿共享给大家&#xff01;&#xff01;&#xff01; …

openEuler2203 LTS安装VMware WorkStation Pro 17并远程桌面连接Linux服务器

openEuler 2203 LTS默认只有命令行&#xff0c;没有GUI图形界面&#xff0c;在其中安装VMware WorkStation需要有图形界面的支持。这里以安装深度的DDE桌面环境&#xff0c;最后通过VNC远程桌面连接Linux服务器操作VMware WorkStation。 以下操作请保持网络能正常连接 1、安装…

如何使用idea连接服务器上的mysql?

安全组进行开放 具体步骤 关闭防火墙 开放端口号 重启防火墙 firewall-cmd --reload在mysql进行修改配置 update user set host % where user root;flush privileges;使得其他网络也可以连接这个数据库 另外如果想要sqlyog或者其他图形化界面要连接到数据库可以看下面这…