尧图网站建设 尧图网络
  • 首页
  • 关于我们
  • 服务项目
  • 案例展示
  • 建站流程
  • 资讯中心
  • 联系我们
首页/资讯中心/详情

CANN队列模型推理

CANN队列模型推理
📅 发布时间:2026/7/5 19:23:36

队列方式模型推理

【免费下载链接】docs该仓库用于维护cann公共文档项目地址: https://gitcode.com/cann/docs

本节介绍如何基于队列加载模型、准备模型输入数据、获取模型推理输出数据。

队列方式模型推理通过“队列”实现推理任务与数据生产/消费的解耦、异步调度,例如数据预处理和模型推理通过异步队列的方式实现异步并行。

基本原理

  • 调用aclmdlLoadFromFileWithQ或aclmdlLoadFromMemWithQ接口以队列方式加载模型。
  • 调用acltdtEnqueueData接口将模型的输入数据传入队列,由接口内部根据队列中的输入数据进行推理,无需调用模型执行的接口。
  • 调用acltdtDequeueData接口等待模型推理执行完毕,再由用户从输出内存中获取结果数据。

说明:如果涉及多线程,当模型有多个输入时,多个输入数据的入队任务(即调用acltdtEnqueueData接口)必须在同一个线程中;当模型有多个输出时,多个输出数据的出队任务(即调用acltdtDequeueData接口)必须在同一个线程中。

示例代码

以下是队列方式模型推理关键步骤的代码示例,不能直接拷贝编译运行,仅供参考。调用接口后,需增加异常处理的分支,并记录报错日志、提示日志,此处不一一列举。

#include "acl/acl.h" ...... // 获取当前AI软件栈的运行模式,根据不同的运行模式,后续的内存申请、内存复制等接口调用方式不同 extern bool g_isDevice; aclrtRunMode runMode; aclError ret = aclrtGetRunMode(&runMode); g_isDevice = (runMode == ACL_DEVICE); // 1. 加载并执行模型 // 此处的..表示相对路径,相对可执行文件所在的目录 // 例如,编译出来的可执行文件存放在out目录下,此处的..就表示out目录的上一级目录 const char* omModelPath = "../model/resnet50.om"; // 1.1 创建模型的输入队列,如果模型有多个输入,则创建多个输入队列,此处以一个输入为例 acltdtQueueAttr *attr = acltdtCreateQueueAttr(); uint32_t *inputQueueList = new (nothrow) uint32_t[num]; int32_t inputNum = 1; for (int n = 0; n < inputNum; n++) { uint32_t inputQid; ret = acltdtCreateQueue(attr, &inputQid); inputQueueList[n] = inputQid; } // 1.2 创建模型的输出队列,如果模型有多个输出,则创建多个输出队列,此处以一个输出为例 uint32_t *outputQueueList = new (nothrow) uint32_t[num]; int32_t outputNum = 1; for (int n = 0; n < outputNum; n++) { uint32_t outputQid; ret = acltdtCreateQueue(attr, &outputQid); outputQueueList[n] = outputQid; } // 1.3 加载模型 uint32_t modelId; ret= aclmdlLoadFromFileWithQ(modelPath, &modelId, inputQueueList, inputNum, outputQueueList, outputNum); // 1.4 根据模型的ID,获取该模型的描述信息 aclmdlDesc *modelDesc = aclmdlCreateDesc(); ret = aclmdlGetDesc(modelDesc, modelId); // 1.5 获取模型的输入内存大小,如果模型有多个输入,则需要获取每个输入的内存大小,此处以一个输入为例 size_t inputSize = aclmdlGetInputSizeByIndex(modelDesc, 0); // 1.6 加载测试图片数据,进行推理,并对推理结果数据进行后处理 string testFile[] = { "../data/dog1_1024_683.bin", "../data/dog2_1024_683.bin" }; for (size_t index = 0; index < sizeof(testFile) / sizeof(testFile[0]); ++index) { uint32_t devBufferSize; void *picDevBuffer = nullptr; // 自定义函数ReadBinFile,根据AI软件栈的运行模式,申请对应的内存,再调用C++标准库中的函数将图片数据读入内存 ret = Utils::ReadBinFile(testFile[index], picDevBuffer, devBufferSize); // 将模型输入数据传入队列中,执行模型推理,-1是表示阻塞程序直到输入数据入队完成 ret = acltdtEnqueueData(inputQid, picDevBuffer, devBufferSize, nullptr, 0, -1, 0); // 获取每个输出的大小 size_t dataSize = aclmdlGetOutputSizeByIndex(modelDesc, 0); void *data = nullptr; size_t retDataSize = 0; // 为模型输出数据申请内存 if (!g_isDevice) { aclError aclRet = aclrtMallocHost(&data, dataSize); } else { aclError aclRet = aclrtMalloc(&data, dataSize, ACL_MEM_MALLOC_HUGE_FIRST); } // 等待模型推理执行完毕,从输出内存中获取结果数据,-1是表示阻塞程序直到推理输出数据入队完成 ret = acltdtDequeueData(outputQid, data, dataSize, &retDataSize, nullptr, 0, -1); //将输出内存中的数据转换为float类型 float *outData = NULL; outData = reinterpret_cast<float*>(data); //屏显每张图片的top5置信度的类别编号 map<float, int, greater<float> > resultMap; for (int j = 0; j < len / sizeof(float); ++j) { resultMap[*outData] = j; outData++; } int cnt = 0; for (auto it = resultMap.begin(); it != resultMap.end(); ++it) { // print top 5 if (++cnt > 5) { break; } INFO_LOG("top %d: index[%d] value[%lf]", cnt, it->second, it->first); } if (!g_isDevice) { aclError aclRet = aclrtFreeHost(picDevBuffer); aclrtFreeHost(data); } else { aclError aclRet = aclrtFree(picDevBuffer); aclrtFree(data); } } // 2. 卸载模型,并释放模型推理相关资源 aclmdlUnload(modelId); aclmdlDestroyDesc(modelDesc); acltdtDestroyQueue(inputQid); acltdtDestroyQueue(outputQid); acltdtDestroyQueueAttr(attr); ......

【免费下载链接】docs该仓库用于维护cann公共文档项目地址: https://gitcode.com/cann/docs

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

  • 三步免费获取国家中小学智慧教育平台电子课本PDF:教师必备的高效工具指南
  • 鸣潮自动化工具终极指南:如何5分钟实现游戏全自动?
  • 3步快速获取国家中小学智慧教育平台电子课本PDF:完整免费下载指南

最新新闻

  • 【电力电子】运算放大器采集逆变器母线电压后使能驱动可控硅整流全过程讲解80.5:1 (逆变器三相半控整流+模拟稳压电路Three-phase half-controlled converter)
  • GitHub Desktop中文汉化终极指南:三步告别英文界面,畅享母语开发体验
  • 如何5分钟上手Path of Building PoE2:流放之路2玩家的终极构建规划神器
  • Mastering Embedded Linux Programming系统监控:使用BPF进行实时性能分析
  • GDash与Graphite集成实战:数据聚合、模板复用与动态参数传递
  • RWD-Table-Patterns与Bootstrap 5深度集成:打造企业级响应式数据表格

日新闻

  • 基于YOLOv12的番茄成熟度智能检测系统开发
  • 终极RimWorld模组管理指南:用RimSort告别模组冲突烦恼
  • AI Agent框架开发:从理论到实践的完整指南

周新闻

  • 基于YOLOv12的番茄成熟度智能检测系统开发
  • 终极RimWorld模组管理指南:用RimSort告别模组冲突烦恼
  • AI Agent框架开发:从理论到实践的完整指南

月新闻

  • 2026年6月公司网站搭建最新热门渠道测评:四大低成本/零代码平台对比+避坑
  • 【Linux】Linux arm 编译QT程序,出现expected “}“报错
  • 【MATLAB例程】四基站二维AOA定位与距离辅助增强对比仿真。基于角度观测和测距修正的固定目标平面定位精度分析

关于尧图

  • 公司简介
  • 团队介绍
  • 企业文化
  • 荣誉资质

服务项目

  • 定制开发
  • 电商建站
  • UI 设计
  • 运维服务

快速链接

  • 案例展示
  • 建站流程
  • 常见问题
  • 资讯中心

联系方式

  • 📍北京市朝阳区互联网产业园 A 座 10 层
  • 📞400-888-8888
  • ✉️contact@rkmt.cn
  • 🕐周一至周日 9:00-21:00

© 2024 北京尧图网络科技有限公司 版权所有 | 京 ICP 备 XXXXXXXX 号