核心内容摘要
御梦子圣诞节Vlog:开启梦幻冰雪奇缘,惊喜升级不止一点点!
文章目录
CANN Kit 的定位与体系架构说明
关键概念 异构计算与 AIPP 硬件加速
开发环境与 OMG 工具链准备
模型转换的实操要点
Native 层的集成逻辑与代码实现
进阶优化 内存零拷贝技术
七、
总结前言本篇技术博客会带你初步认识 HarmonyOS Next 底层的计算加速引擎CANN Kit。
通过本文的学习你可以了解到如何利用麒麟芯片的异构计算能力来加速 AI 模型推理并掌握从模型转换到端侧部署的基本流程。
CANN Kit 的定位与体系架构说明在 HarmonyOS Next 的 AI 体系中CANN Kit处于底层加速的核心位置。
为了帮大家理清逻辑我们需要看它的上位与下位关系。
向上它支撑着MindSpore Lite Kit推理引擎和Neural Network Runtime Kit跨芯片运行时。
向下它直接驱动NPU神经网络处理器和CPU等异构硬件。
简单来说如果你需要进行极度偏向重载、需要深度榨干硬件性能的 AI 计算或者要写自定义的AscendC算子那么CANN Kit就是你的终极选择。
它不像上层框架那样做通用适配而是专为麒麟芯片调优能提供最直接的硬件访问权。
关键概念 异构计算与 AIPP 硬件加速在 CANN 的世界里有两个概念决定了你的应用跑得快不快。
首先是异构计算。
系统会自动识别模型里的子图把适合并行计算的卷积等操作交给NPU把逻辑复杂的处理交给CPU。
这种协同工作方式能让计算效率最大化同时降低功耗。
其次是AIPPAI Pre-Process。
这是硬件层面的图像预处理模块。
在真实的开发场景中摄像头采集的原始图片往往需要经过裁剪、色域转换比如 YUV 转 RGB、减均值等操作才能送入模型。
以往这些活儿由 CPU 干不仅慢还费电。
开启 AIPP 后这些逻辑会直接封装在.om 离线模型里由硬件电路直接完成推理性能会有质的提升。
开发环境与 OMG 工具链准备CANN Kit 遵循云端转换、端侧运行的逻辑。
开发者不能直接把训练好的原生模型塞进手机。
你需要在 Ubuntu 环境下使用OMGOffline Model Generator工具。
它的核心任务是将 Caffe、TensorFlow 或 ONNX 等框架的模型转换成专有的.om 离线模型。
转换过程中OMG 会进行图融合优化。
比如它会把卷积层和BN 层合并为一个计算过程。
这种预先的编译动作让模型在手机上加载后不需要再进行繁重的解析工作实现了真正的开箱即用。
模型转换的实操要点以ONNX 模型转换为例。
在执行转换前你需要明确输入张量的维度。
# 执行 OMG 转换命令 ./omg --model resnet
onnx --framework 5 --output ./resnet18_npu --input_shape input:1,3,224,224这里的参数framework 5对应 ONNX。
如果你的模型在特定芯片如麒麟 9020上运行转换时还可以配合平台插件包进行针对性优化。
为了进一步提升性能建议关注Model Zoo提供的推荐参数。
例如当卷积算子的输入和输出通道数Cin/Cout是16 或 32 的倍数时硬件的算力利用率最高这在模型训练阶段就应该提前规划。
Native 层的集成逻辑与代码实现在 HarmonyOS 项目里CANN Kit 的调用必须通过Native C实现。
你需要在CMakeLists.txt中链接libneural_network_core.so。
核心流程分为四步获取设备在多核心环境下锁定 NPU 标识。
构建编译实例将 .om 文件的 buffer 传入系统。
设置优先级根据业务需求设定计算优先级。
创建执行器生成最终用于推理的对象。
// 寻找硬件设备HIAI_F 代表高性能 NPU size_t deviceID 0; const size_t *allDevicesID nullptr; uint32_t deviceCount 0; OH_NNDevice_GetAllDevicesID(allDevicesID, deviceCount); for (uint32_t i 0; i deviceCount; i) { const char *name nullptr; OH_NNDevice_GetName(allDevicesID[i], name); if (std::string(name) HIAI_F) { deviceID allDevicesID[i]; break; } } // 编译离线模型注意 modelData 是从 rawfile 读取的二进制流 OH_NNCompilation *compilation OH_NNCompilation_ConstructWithOfflineModelBuffer(modelData, modelSize); OH_NNCompilation_SetDevice(compilation, deviceID); // 设为高性能优先级确保计算资源倾斜 OH_NNCompilation_SetPriority(compilation, OH_NN_PRIORITY_HIGH); OH_NNCompilation_Build(compilation); // 构造最终的执行器 OH_NNExecutor *executor OH_NNExecutor_Construct(compilation);
进阶优化 内存零拷贝技术性能优化的终点往往是内存管理。
CANN Kit 支持内存零拷贝Zero Copy。
传统的做法是将数据从应用内存拷贝到 Tensor 内存。
而零拷贝允许你直接申请底层的ION 内存并将其封装为输入和输出张量。
// 申请输入 Tensor直接获取底层 buffer 地址 NN_TensorDesc *tensorDesc OH_NNExecutor_CreateInputTensorDesc(executor,
; NN_Tensor *tensor OH_NNTensor_Create(deviceID, tensorDesc); void *dataBuffer OH_NNTensor_GetDataBuffer(tensor); // 此时直接将图片像素数据写入 dataBuffer无需后续拷贝动作 // 推理完成后输出 Tensor 的数据也可以通过同样方式直接读取通过这种方式数据直接在硬件单元之间流转极大降低了大规模数据推理如实时视频实时滤镜时的 CPU 负载。
七、
总结CANN Kit是鸿蒙系统内 AI 加速的基石。
它通过 OMG 工具实现了模型的高效转换通过 AIPP 解决了图像预处理的性能损耗并通过零拷贝技术消除了内存搬运的开销。
对于初学者建议先从Model Zoo下载成熟的 .om 模型跑通流程。
当你对性能有更高追求时再去深入研究AscendC算子开发。
在实际应用中别忘了在aboutToDisappear或 C 析构函数里及时调用Destroy接口释放 Tensor 和执行器避免长时间运行导致的内存泄漏。