【2023 · CANN训练营第一季】进阶班 应用开发深入讲解→模型推理
1 模型离线推理
各步要解析如下:
- Host&Device内存管理与数据传输: Host&Device上的内存申请与释放,内存间的相互拷贝;
- 模型加载:将离线的om文件加载到Device上;在样例的资源初始化模块中进行。
- 模型输入输出准备∶根据禹线om的输入输出,在Device上申请好模型的输入输出内存;在样例的资源初始化模炔中进行。
- 执行推理:当模型的输入内存获取到有效数据后,便可以调用AscendCL接口执行模型推理,推理完成后结果生成到输出内存中;在样例的模型推理模块中进行。
- 输出解析︰使用AscendCL接口,将模型输出数据从特定格式中解析出来;在输出数据处理模块中进行。下面将按步要进行说明。
2 Host&Device内存管理与数据传输
代码中加载输入数据时,需要申请Host内存进行存储,当输入数据处理完毕后,需要将处理完成的数据从Host内存拷贝到Device的模型输入内存中。以便于Device进行模型推理的专用计算。
以上就是Host&Device内存管理与数据传输的典型场景。对于Host&Device内存管理与数据传输来说,实际上就是:
- Host内存管理: Host侧内存申请与释放
- Device内存管理:Device侧内存串请与释放
- Host&Device数据传输: Host和Device上的内存拷贝
内存管理中其它功能: - 内存初始化:对申请出来的Host或Device内存进行初始
化。 - Device内存查询:查询Deivce上有多少内存。

2.1 Host侧内存申请与释放
Host侧内存申请与释放接口的使用方式比较简单。函数原型如下:
aclError aclrtMallocHost(oid**hostPtr, size_t size);acError aclrtFreeHost(void*hostPtr);
其中aclrtMallocHost是内存申请接口。aclrtFreeHost是其对应的释放接口;调用伪代码如下
void *hostlnput = nullptr;
int64_t size_input = 256;
ret = aclrtMallocHost(8hostlnput, size_input);if (hostlnput I= nullptr){
ret = aclrtFreeHost(hostlnput);
}
注意:Host&Device申请和释放的配套关系类似1.acirtMalloc和aclrtFree要成对出现。
2.用aclrtMalloc申请出来的内存高要对齐。
内存大小向上对齐成32整数倍+32字节(m=ALIGN_UPlen,32]+32字节);
内存起始地址高满足64字节对齐(AilGN_UP[m,64])。
2.2 Device侧内存申请与释放
Device侧内存申语与释放接口和Host侧的很相似,函数原型如下:
aclError aclrtMalloclvoid **dePtr, size_t size,aclrtMemMallocPolicy policy);
aclError aclrtFreelvoid *devPtr);
申请内存的接口多了个参数: policy,指明申请内存的策略。当前一共有三种策略可选:
- ACL MEM MALLOC HUGE FIRST:当申请内存小于等于1M申请普通页内存。当申请内存大于1M时,优先申请天页内存,如果不够。则使用普通内存
- AcL MEM_MALLOC_HUGE_ONLY:仅申请大页,如果大页内存不够,则返回
错误 - ACL MEM MALLOC_NORMAL ONLY:仅申请普通页
void*devlnput = nullptr;
size_input -256;
ret = aclrtMalloc(BdevInput size_input,ACL_MEM_MALLOC_HUGE_FIRST5;if (devlnput != nullptr){
ret = aclrtFree(devInput);}
2.3 内存初始化
刚申请出来的内存,里边的数据是随机的,有时需要对其进行统—的初始化,此时可以使用这个接口:
aclError aclrtMemset(void *devPtr, size_t maxCount, int32_tvalue, size_t count);
其参数如下所示:
- devPtr: Host/Device上的内存的起始地址,系统会根据地址自动判断内存位置- maxCount:内存的是大长度,单位byte
- value:设置的值需要设置为指定值的内存长度,单位Byte内存初始化的伪码如下:
void *devlnput = nullptr;size_input = 256;
ret =aclrtMalloc(&devInput, size_input,ACL_MEM_MALLOC_HUGE_FIRST;
ret = aclrtMemset(devlnput,size_input,,1,size_input);ret = aclrtMallocHost(&hostinput, size_input);
aclrtMemcpy(devlnput size_input, hostlnput, size_input,ACL_MEMCPY_HoST_TO_DevIcE);
ret =aclrtFreeHost(hostlnput);ret = aclrtFree(devlnput);
...
ret = aclrtMalloc(BdevInput size_input,ACL_MEM_MALLOC_HUGE_FIRST5;if (devlnput != nullptr){
ret = aclrtFree(devInput);}
2.4 数据传输
数据传输所使用的内存拷贝函数原型如下:
aclError aclrtMemcpy(void *dst, size_t destMax,const void *src, size_t count, aclrtMemcpyKindkind);
其参数如下所示;. dst:目的地址
. destMax:目的内存地址的最大内存长度,单位Byte. src:源地址
. count:内存复制的长度,单位Byte
- kind:内存复制的类型,预留参数,配置枚举值中的值无效。系统内部会根据源内存地址指针、目的内存地址指针判断是否可以将源地址的数据复制到目的地址,如果不可以,则系统会返回报错。
其中的关键为kind参数,这里的kind实际上是一组枚举值,枚举定义如下所示:
typedef enum aclrtMemcpyKind {
ACL_MEMCPY_HOST_To_HosT,i/ Host -> HostACL_MEMCPY_HOST_TO_DEVICE,// Host -> DeviceACL_MEMCPY_DEVlCE_TO_HOST,// Device -> HostACL_MEMCPY_DEVICE_TO_DEVICE,// Device -> Device} aclrtMemcpyKind;
aclrtMemcpy(devlnput size_input, hostlnput, size_input,ACL_MEMCPY_HoST_TO_DevIcE);
ret =aclrtFreeHost(hostlnput);ret = aclrtFree(devlnput);
...
ret = aclrtMalloc(BdevInput size_input,ACL_MEM_MALLOC_HUGE_FIRST5;if (devlnput != nullptr){
ret = aclrtFree(devInput);}
2.5 Device内存查询
程序运行过程中,如何实时获取Device上有多少内存,以及多少可用内存呢?那不妨试试下面这个接口
aclError aclrtGetMemInfo(aclrtMemAttr attr, size_t *free, size_t *total)
其中的attr参数指的是内存的类型,枚举定义如下所示:
typedef enum aclrtMemAttr {
ACL_DDR_MEM,//DDR内存,DDR上所有大页内存+普通内存ACL_HBM_MEM,/ /HBM内存,HBM上所有大页内存+普通内存ACL_DDR_MEM_HUGE,//DDR大页内存
AcL_DDR_MEM_NORMAL.1/DDR普通内存ACL_HBM_MEM_HUGE,//HBM大页内存ACL_HBM_MEM_NORMAL, //HBM普通内存
ACL_DDR_MEM_P2P_HUGE.//DDR中用于Device间数据复制的大页内存ACL_DDR_MEM_P2P_NORMAL//DDR中用于Device间数据复制的普通内存ACL_HBM_MEM_P2P_HUGE,//HBM中用于Device间数据复制的大页内存ACL_HBM_MEM_P2p_NORMAL.//HBM中用于Device间数据复制的普通内存
}aclrtMemAttr;
这里提到了DDR和HBM,在这里,只需要知道Ascend910芯片中有HBM内存,在内存申请时会优先使用,使用完毕后再使用DDR内存;而Ascend310芯片中只有DDR内存。所以调用时,只需要根据自己的场景查询所有内存即可。
3 模型加载
模型加载支持多种加载方式,由用户根据需求选择从om模型文件或内存加载模型数据.选择由用户自行管理内存或由AscendCL管理内存。而不管用哪种接口,最终卸载时接口都是统一的。

4 模型输入输出准备
在调用AscendCL接口进行模型推理时,模型推理有输入、输出数据,输入、输出数据需要按照AscendCL规定的数据类型存放。相关数据类型如下:

- 使用aclmdlDesc类型的数据描述模型基本信息,例如输入/输出的个数、数据类型、Format、维度信息等。
- 使用acIDataBuffer类型的数据来描述每个输入/输出的内存地址、内存大小。
- 使用aclmdIDataset类型的数据描述模型的输入、输出数据集。
5 执行推理并获取输出数据
准备好模型执行所需的输入、输出数据类型后,存放好模型执行的输入数据后,可以执行模型推理了。当前AscendCL支持同步模型执行、异步模型执行两种方式,这里说的同步、异步是站在调用者和执行者的角度。
- 若调用模型执行的接口后需等待推理完成再返回,则表示同步的。当用户调用同步模型执行接口后,可直接从该接口的输出参数中获取模型执行的结果数据。接口调用逻辑简单。
- 若调用模型执行的接口后不等待推理完成完成再返回,则表示异步的。异步模型执行时,AscendCL提供了Callback机利,在指定时间内一旦有推理的结果数据,就触发回调函数藐取推理结果,提高处理效率。
相关文章:
【2023 · CANN训练营第一季】进阶班 应用开发深入讲解→模型推理
1 模型离线推理 各步要解析如下: Host&Device内存管理与数据传输: Host&Device上的内存申请与释放,内存间的相互拷贝;模型加载:将离线的om文件加载到Device上;在样例的资源初始化模块中进行。模型输入输出准备∶根据禹线om的输入输出,在Device…...
单词分析问题
题目描述 小蓝正在学习一门神奇的语言,这门语言中的单词都是由小写英文字母组 成,有些单词很长,远远超过正常英文单词的长度。小蓝学了很长时间也记不住一些单词,他准备不再完全记忆这些单词,而是根据单词中哪个字母出…...
3个月出国|材料科学老师自费赴韩国访学
K老师指定韩国为访学的目标国家,希望专业匹配,尽快出国。最终我们获得了韩国庆北大学的邀请函,其学校名气、专业匹配度及导师影响力都符合K老师的要求。本案例从开始委托我们申请到最终出国,仅仅用时3个月。 K老师背景:…...
MaaS来临,SaaS进入「奇点」时刻|产业深度
大模型热度持续发酵。MaaS的到来,不仅改变了云厂商的竞争格局,SaaS行业也将迎来「奇点」时刻。未来十年,基于MaaS底座,国内SaaS甚至可能会出现Salesforce一样的巨头。 作者|思杭 编辑|皮爷 出品|产业家 大模型热度正在持续发酵。…...
课程分享:华清远见联合NXP推出i.MX8M Plus开发与实践课程,超干超实用!
课程名称: i.MX8M Plus开发与实践课程 课程介绍: i.MX8M Plus应用处理器是NXP推出的一款致力于推动机器学习(ML),机器视觉,多媒体与工业边缘物联网应用的工业人工智能芯片。拥有4个ARM Cortex-A53核心…...
idea将java程序打包为jar
idea将java程序打包为jar 灵光一现: 用java拉起浏览器,打开指定的网络地址,省的手动打开浏览器再复制地址过去了 本文记录了使用idea将java程序打包为jar包的过程 源码地址:https://gitcode.net/qq_39339588/jar.git 文章目录 ide…...
快速掌握Redis基础知识及使用技巧
Redis 是一个高性能、基于内存的键值数据库,其主要特点是支持多种数据结构和高并发读写操作。在本文中,我们将介绍 Redis 的基本概念和使用方法,以帮助读者快速入门 Redis。 Redis 的基本概念 Redis 是一种基于内存的高性能 key-value 存储系…...
C++控制台打飞机小游戏
我终于决定还是把这个放出来。 视频在这:https://v.youku.com/v_show/id_XNDQxMTQwNDA3Mg.html 具体信息主界面上都有写。 按空格暂停,建议暂停后再升级属性。 记录最高分的文件进行了加密。 有boss(上面视频2分47秒)。 挺好…...
Pinna的使用以及pinna的持续化存储(两种方法)
一、简介 pinia是 vue3 新的状态管理工具,简单来说相当于之前 vuex,它去掉了 Mutations 但是也是支持 vue2 的,需要的朋友可以参考下 二、使用方法 1.安装 npm install pinia -S 2..引入 import { createPinia,PiniaPluginContext } from p…...
开发中造成空指针的常见用法,如何避免
1. 前言 《手册》的第 7 页和 25 页有两段关于空指针的描述: 【强制】Object 的 equals 方法容易抛空指针异常,应使用常量或确定有值的对象来调用 equals。 【推荐】防止 NPE,是程序员的基本修养,注意 NPE 产生的场景: 返回类型为…...
MySQL事务和索引
目录 事务的概念 事务的四大特性(ACID) 原子性 隔离性 持久性 一致性 什么是脏读、幻读和不可重复读? 脏读 幻读 不可重复读 事务的隔离级别 读未提交 读已提交 可重复读 串行化 索引 索引优点 索引缺点 索引分类 索引设…...
Kali工具集简介
Kali Linux提供了数种经过定制的专门为渗透测试设计的工具。工具都会按下图中下拉选单所示的方式按组分类聚合。了解工具是做渗透测试第一个认知。 口Information Gathering(信息收集) 这些都是侦察工具,用来收集目标网络和设备的数据。在这类工具中,从找出设备的工具到查看使…...
离散数学 | 图论 | 欧拉图 | 哈密顿图 | 割点 | 桥(欧拉图和哈密顿图有没有割点和桥?)
本文主要解决以下几个问题: 1.欧拉图能不能有割点,能不能有桥? 2.哈密顿图能不能有割点,能不能有桥? 首先我们要明白几个定义 割点的定义就是在一个图G中,它本来是连通的,去掉一个点v以后这个…...
Android生命周期:理解与应用
摘要:Android生命周期是开发Android应用程序时至关重要的概念。本文将介绍Android生命周期的概念、生命周期方法的执行顺序以及如何在应用程序中正确地管理生命周期。我们还将讨论生命周期对于应用程序的重要性,并提供一些实际应用中的最佳实践和注意事项…...
00后真的是内卷王中王,真的想离职了....
都说00后躺平了,但是有一说一,该卷的还是卷。这不,前段时间我们公司来了个00年的,工作没两年,跳槽到我们公司起薪18K,都快接近我了。后来才知道人家是个卷王,从早干到晚就差搬张床到工位睡觉了。…...
linux Fd以及重定向讲解
感谢你的阅读,是对我最大的鼓励!!!! 目录 fd理解 文件操作重定向 让我们回顾C语言文件操作 首选我们要知道2个知识点: 额外知识点 如何理解一切皆文件呢? 当父进程fork创建子进程是否创建…...
Moonbeam近日提案公投一览
正在跟进Moonbeam治理的小伙伴,一起来快速浏览一下近期生态中正在发生的事情吧!其中包含多个去中心化应用的Grant加速计划提案、HRMP开拓提案以及优化质押相关平台的内容。许多提案都与网络的运作息息相关,一起了解和参与Moonbeam的发展吧&am…...
凝聚青年力量,打造数字化人才队伍
当代青年人勇于探索、敢于创新、勤于变革,积极承担社会责任。这与ABeam倡导的「Build Beyond As One.™」的品牌理念不谋而合。ABeam的青年员工是未来社会的中坚力量,也正用他们的青春能量助力ABeam在中国的发展。 01 新兴青年力量 对ABeam而言&#…...
蓝牙资讯|智能家居标准Matter 1.1 发布,智能家居产品兼容更丰富
据“CSA 连接标准联盟”官方微信号,Matter 1.1 版本已发布,“1.1 版本带来的更新使设备制造商和开发者上手更容易、产品获取认证更方便,也让产品能更快地交付给用户。该版本还为电池供电设备提供了更大支持,而这类设备涉及多种类型…...
Cube Map 系列之:手把手教你 实现天空盒(Sky Box)
什么是天空盒 An skybox is a box with textures on it to look like the sky in all directions or rather to look like what is very far away including the horizon.天空盒是一个使用纹理贴图构建的盒子,人在其中朝任何一个方向看去,其纹理彷佛天空…...
(十)学生端搭建
本次旨在将之前的已完成的部分功能进行拼装到学生端,同时完善学生端的构建。本次工作主要包括: 1.学生端整体界面布局 2.模拟考场与部分个人画像流程的串联 3.整体学生端逻辑 一、学生端 在主界面可以选择自己的用户角色 选择学生则进入学生登录界面…...
1688商品列表API与其他数据源的对接思路
将1688商品列表API与其他数据源对接时,需结合业务场景设计数据流转链路,重点关注数据格式兼容性、接口调用频率控制及数据一致性维护。以下是具体对接思路及关键技术点: 一、核心对接场景与目标 商品数据同步 场景:将1688商品信息…...
服务器硬防的应用场景都有哪些?
服务器硬防是指一种通过硬件设备层面的安全措施来防御服务器系统受到网络攻击的方式,避免服务器受到各种恶意攻击和网络威胁,那么,服务器硬防通常都会应用在哪些场景当中呢? 硬防服务器中一般会配备入侵检测系统和预防系统&#x…...
Spring Boot+Neo4j知识图谱实战:3步搭建智能关系网络!
一、引言 在数据驱动的背景下,知识图谱凭借其高效的信息组织能力,正逐步成为各行业应用的关键技术。本文聚焦 Spring Boot与Neo4j图数据库的技术结合,探讨知识图谱开发的实现细节,帮助读者掌握该技术栈在实际项目中的落地方法。 …...
【 java 虚拟机知识 第一篇 】
目录 1.内存模型 1.1.JVM内存模型的介绍 1.2.堆和栈的区别 1.3.栈的存储细节 1.4.堆的部分 1.5.程序计数器的作用 1.6.方法区的内容 1.7.字符串池 1.8.引用类型 1.9.内存泄漏与内存溢出 1.10.会出现内存溢出的结构 1.内存模型 1.1.JVM内存模型的介绍 内存模型主要分…...
Chrome 浏览器前端与客户端双向通信实战
Chrome 前端(即页面 JS / Web UI)与客户端(C 后端)的交互机制,是 Chromium 架构中非常核心的一环。下面我将按常见场景,从通道、流程、技术栈几个角度做一套完整的分析,特别适合你这种在分析和改…...
【把数组变成一棵树】有序数组秒变平衡BST,原来可以这么优雅!
【把数组变成一棵树】有序数组秒变平衡BST,原来可以这么优雅! 🌱 前言:一棵树的浪漫,从数组开始说起 程序员的世界里,数组是最常见的基本结构之一,几乎每种语言、每种算法都少不了它。可你有没有想过,一组看似“线性排列”的有序数组,竟然可以**“长”成一棵平衡的二…...
相关类相关的可视化图像总结
目录 一、散点图 二、气泡图 三、相关图 四、热力图 五、二维密度图 六、多模态二维密度图 七、雷达图 八、桑基图 九、总结 一、散点图 特点 通过点的位置展示两个连续变量之间的关系,可直观判断线性相关、非线性相关或无相关关系,点的分布密…...
Copilot for Xcode (iOS的 AI辅助编程)
Copilot for Xcode 简介Copilot下载与安装 体验环境要求下载最新的安装包安装登录系统权限设置 AI辅助编程生成注释代码补全简单需求代码生成辅助编程行间代码生成注释联想 代码生成 总结 简介 尝试使用了Copilot,它能根据上下文补全代码,快速生成常用…...
compose 组件 ---无ui组件
在 Jetpack Compose 中,确实存在不直接参与 UI 渲染的组件,它们主要用于逻辑处理、状态管理或副作用控制。这些组件虽然没有视觉界面,但在架构中扮演重要角色。以下是常见的非 UI 组件及其用途: 1. 无 UI 的 Compose 组件分类 (…...
