0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

开源鸿蒙MNN AI应用开发与MNN移植经验

OpenAtom OpenHarmony ? 来源:OpenAtom OpenHarmony ? 2025-09-04 11:31 ? 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

【拆·应用】是为开源鸿蒙应用开发者打造的技术分享平台,是汇聚开发者的技术洞见与实践经验、提供开发心得与创新成果的展示窗口。诚邀您踊跃发声,期待您的真知灼见与技术火花!

引言

本期内容由AI Model SIG提供,介绍了在开源鸿蒙中,利用MNN开源框架开发AI应用以及基于MNN源码编译与Har包封装的方法。

技术背景

MNN是一个由阿里巴巴开发的轻量级的深度神经网络引擎,支持深度学习的推理和训练,适用于服务器、手机嵌入式等各类设备。MNN提供了对大语言模型和多模态大模型的支持,可以将原本需要在云端运行的大模型,经过压缩、编译和系统级优化后,直接部署在手机、PC、车载、XR 头显、机器人等终端设备上,使其无需联网即可完成生成、理解、推理等任务。

MNN的主要特性:

1.轻量性:MNN的主体功能无任何依赖,代码精简,可以方便地部署到移动设备和各种嵌入式设备中。

2.通用性:MNN提供了丰富的算子,支持多种文件格式,如:Tensorflow、ONNX、Torchscripts等,支持CNN、Transformer等网络结构;在大模型领域,MNN提供了对目前主流的开源LMM模型的支持。

3.高性能:MNN对iOS / Android / PC / Server 的CPU架构进行了适配,充分发挥了 CPU的算力,单线程下运行常见CV模型接近设备算力峰值;支持基于 Metal / OpenCL / Vulkan 使用端侧设备上的GPU进行推理,支持部分设备的 NPU 计算。

目前已完成MNN在OpenHarmony 5.1 Release上的适配,支持在CPU下进行LLM、MLLM推理。

环境准备

1.硬件准备

(1)开发板DAYU200,详情介绍

https://gitee.com/hihope_iot/docs/blob/master/HiHope_DAYU200/README.md。

(2)芯片型号

SOC 系统芯片: Rockchip RK3568。

CPU中央处理器: Cortex-A55。

GPU图形处理器: Mali-G52。

2.软件准备

(1)开发环境:windows 10 + ubuntu 22.04。windows下进行设备连接、程序烧录、文件传输;linux进行程序编译(官方推荐)。参考文档:

https://docs.openharmony.cn/pages/v4.1/zh-cn/device-dev/quick-start/quickstart-pkg-prepare.md。

(2)OpenHarmony:SDK下载ohos-sdk-windows_linux-public

链接地址如下:

https://repo.huaweicloud.com/harmonyos/os/5.1.0-Release。

解压到指定目录,里边包含window和linux的库文件,分别放到对应的设备上。

(3)DevEco Studio: 版本5.1.0。下载地址:https://developer.huawei.com/consumer/cn/deveco-studio/。

开源鸿蒙MNN AI 应用开发

1.mnnllm har包介绍

mnnllm har包是由开源鸿蒙AI Model SIG发布的大模型本地推理库,基于mnnllm推理框架通过native api进行封装,可供ArkTS语言快速开发应用程序,当前已支持大语言模型和多模态大模型本地推理。

mnnllm har包已提交到开源鸿蒙第三方中心仓库,可通过以下地址详细了解相关信息。

https://ohpm.OpenHarmony.cn/#/cn/detail/@ai_model_sig%2Fmnnllm

2.基于mnnllm har包的应用开发

(1)安装mnnllm har包,通过ohpm install命令,可快速安装,命令如下:

952195d4-88a5-11f0-8c8f-92fbcf53809c.png

(2)准备大模型并转换成mnn支持的格式

在进行测试前,需要先下载并转换成mnn格式的模型, 通过llmexport工具即可快速转换成mnn格式,如果不想转换,也可以直接从魔搭社区下载已经转换好的mnn模型。

将大模型转换成mnn格式,llmexport命令可参考mnn官方文档,详情可查看链接,具体链接如下:

https://mnn-docs.readthedocs.io/en/latest/transformers/llm.html

从modelscope社区直接下载mnn模型,可访问仓库地址:

https://www.modelscope.cn/organization/MNN?tab=model

文件准备好了之后,需要将模型文件放在entry/src/main/resource/rawfile目录下(仅模型文件,不需要包含模型名称的外层目录),对于多模态大模型,还需在rawfile下准备一张测试图片test.jpg。

注意:DAYU200的开发板由于算力限制,可以选择参数较小的模型(如SmolVLM-256M-Instruct-MNN)进行验证。

(3)应用程序开发

从mnnllm har包中通过import导入对应的函数,具体函数说明,见表1。

import{nativeLoad,nativeChat,nativeChatVLM,nativeUnload}from '@ai_model_sig/mnnllm';

定义函数onCopyRawFileToLocal,将模型文件拷贝到应用程序沙箱。

调用nativeLoad函数,加载模型。

如果是大语言模型,调用nativeChat函数,输入对话内容,返回模型回答结果;如果是多模态大模型,调用nativeChatVLM函数,输入对话内容和图片,返回模型回答结果。

应用程序结束,调用nativeUnload函数,释放模型资源。

表1 Har包函数说明

958673f0-88a5-11f0-8c8f-92fbcf53809c.png

(4)代码示例

以下是部分关键示例代码,供参考。

95e954de-88a5-11f0-8c8f-92fbcf53809c.png

编译并执行示例代码后,屏幕打印出的信息

基于mnn源码编译与native接口封装

以下内容介绍基于mnn源码编译与native接口封装,如果对系统移植感兴趣的可以继续往下阅读,如果只专注应用开发,可跳过此部分内容。

源代码地址和编译方法链接:

https://gitcode.com/ai_model_sig/ohos_mnn。

1. 适配OpenHarmony的mnn静态库打包

(1)设置HARMONY_HOME环境变量,指向SDK解压后的目录。

export HARMONY_HOME=/home/xxx/ohos-sdk

(2)编译mnn的静态库,cmake时指定

-DCMAKE_TOOLCHAIN_FILE、

-DMNN_BUILD_SHARED_LIBS=OFF,

-DMNN_BUILD_LLM=ON。

(3)获取编译后的libMNN.a的静态库。

2. 基于mnn的c++推理代码开发

(1)准备头文件和mnn的静态库,从/path/to/MNN拷贝到src/main/cpp目录下,libMNN.a拷贝到/path/to/cpp/libs/。

(2)模型的准备。模型的转换,参考文档:https://mnn-docs.readthedocs.io/en/latest/transformers/llm.html。

(3)mnn的c++推理代码开发和验证。代码示例(非完整代码):

96bc59d8-88a5-11f0-8c8f-92fbcf53809c.png

3. 基于NAPI的native方法封装

(1)开发前的准备。

打开DevEco,在创建好的项目处,右键选择new > Module > Static Library。

将2中准备好的头文件和静态库,复制到新创建的Module的src/main/cpp的libs和include目录下。

(2)接口函数的制定

97217048-88a5-11f0-8c8f-92fbcf53809c.png

(3)Native方法的封装,封装以上4个函数

97820502-88a5-11f0-8c8f-92fbcf53809c.png

(4)har包的开发

在src/main/cpp/types/libentry/Index.d.ts,定义ArkTS接口。

oh-package.json5 文件,将API与so相关联,成为一个完整的ArkTS模块。

在src/main/ets/export.ets导出native方法。

通过Index.ets对外暴露har包的接口函数。

常见问题和解决方法

Native方法封装过程中,libllm.so、libMNN.so、libMNN_Express.so等动态库之间的复杂相互依赖问题导致的失败。

解决方法:MNN的编译过程中,指定cmake的参数DMNN_BUILD_SHARED_LIBS=OFF,编译静态库libMNN.a,放置在src/main/cpp/libs下面。

Native方法封装过程中,接口函数中load、chat等方法难以通过NAPI的数据类型来传递模型实例。

解决方法:在c++推理代码中定义静态全局的模型,然后在load中通过reset方法重置模型的配置文件。

应用开发调用时,接口函数load调用过程中,传入的模型文件无法读取的问题。

解决方法:将转换好的MNN模型文件全部放在rawfile目录下,然后将文件全部拷贝到应用沙箱中,最后通过沙箱路径读取模型的文件。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 移植
    +关注

    关注

    1

    文章

    403

    浏览量

    28835
  • AI
    AI
    +关注

    关注

    88

    文章

    36190

    浏览量

    284225
  • 开源
    +关注

    关注

    3

    文章

    3818

    浏览量

    44272
  • 鸿蒙
    +关注

    关注

    60

    文章

    2690

    浏览量

    44527

原文标题:拆·应用丨第5期:开源鸿蒙MNN AI应用开发与MNN移植经验

文章出处:【微信号:gh_e4f28cfa3159,微信公众号:OpenAtom OpenHarmony】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    【每日精选】开源鸿蒙系统DAYU200教程及Tina Wi-Fi模组移植

    ] 支持开源鸿蒙系统 DAYU200 镜像烧录教程【问答】请问下HiHope_DAYU200 如何搭建编译开发环境?[经验]作品分享-基于RT-Thread系统和N32G457
    发表于 03-15 15:32

    CoolPi CM5运行ChatGLM-MNN大语言模型

    ChatGLM-MNN project git clone https://github.com/wangzhaode/ChatGLM-MNN.git Compile MNN library
    发表于 04-29 09:39

    Coolpi CM5运行ChatGLM-MNN大语言模型

    Download ChatGLM-MNN project git clone https://github.com/wangzhaode/ChatGLM-MNN.git Compile MNN
    发表于 05-03 11:30

    阿里正式开源轻量级深度学习端侧推理引擎“MNN

    Interpreter 由 Engine 和 Backends 构成。前者负责模型的加载、计算图的调度;后者包含各计算设备下的内存分配、Op 实现。在 Engine 和 Backends 中,MNN
    的头像 发表于 05-10 09:04 ?3853次阅读

    阿里MNN支持华为NPU,优化MNN的性能和精度问题

    今天上午据软件绿色联盟消息,阿里MNN已经接入华为 HiAI生态,正式支持华为NPU。
    的头像 发表于 12-23 14:04 ?3964次阅读

    实战MNN之Mobilenet SSD部署

    MNN 是一个轻量级的深度学习端侧推理引擎,核心解决深度神经网络模型在端侧推理运行问题,涵盖深度神经网络模型的优化、转换和推理。目...
    的头像 发表于 12-10 18:14 ?961次阅读

    浅谈阿里轻量级的深度神经网络推理引擎MNN

    MNN是一个轻量级的深度神经网络推理引擎,在端侧加载深度神经网络模型进行推理预测。作者:开心的派大星首发:微信公众号:NeuroMem转自...
    的头像 发表于 12-10 19:29 ?1406次阅读

    实战MNN之量化部署

    今天MNN更新了新的工具包---CNN网络量化工具(quantization),作者也第一时间进行了测试。提升的效果还是很可观的,量化前的CNN网络大小...
    发表于 02-07 11:45 ?0次下载
    实战<b class='flag-5'>MNN</b>之量化部署

    详解MNN的tflite-MobilenetSSD-c++部署流程

    关于MNN以及Mobilenet SSD的介绍,大家可以参考我早些时候写过的一篇文章实战MNN之Mobilenet SSD部署(含源码)。本文我们少一些分析,...
    发表于 02-07 11:55 ?0次下载
    详解<b class='flag-5'>MNN</b>的tflite-MobilenetSSD-c++部署流程

    详解MNN的tf-MobilenetSSD-cpp部署流程

    关于MNN以及Mobilenet SSD的介绍,大家可以参考我早些时候写过的一篇文章实战MNN之Mobilenet SSD部署(含源码)。本文我们少一些分析,...
    发表于 02-07 12:18 ?0次下载
    详解<b class='flag-5'>MNN</b>的tf-MobilenetSSD-cpp部署流程

    PFLD-lite:基于MNN和mxnet的嵌入式部署

    之前的文章跟大家介绍过如何使用mxnet和MNN做产品化部署,选取的案例为MNIST手写数字识别的项目,该项目是一个比较简单的分类问题。今天...
    发表于 02-07 12:19 ?0次下载
    PFLD-lite:基于<b class='flag-5'>MNN</b>和mxnet的嵌入式部署

    谈谈MNN的模型量化(一)数学模型

    最近调研了一些关于CNN网络量化的论文,结合之前基于MNN的使用感受,打算跟大家谈一谈MNN中的模型量化以及其相关的数学模型。本文可能关...
    发表于 02-07 12:22 ?2次下载
    谈谈<b class='flag-5'>MNN</b>的模型量化(一)数学模型

    实战MNN之Mobilenet SSD部署(含源码)

    MNN 是一个轻量级的深度学习端侧推理引擎,核心解决深度神经网络模型在端侧推理运行问题,涵盖深度神经网络模型的优化、转换和推理。目...
    发表于 02-07 12:32 ?0次下载
    实战<b class='flag-5'>MNN</b>之Mobilenet SSD部署(含源码)

    2025开源鸿蒙开发者大会圆满落幕

    近日,开源鸿蒙开发者大会2025(OHDC.2025,简称“大会”)在深圳隆重开幕。大会正式发布了开源鸿蒙5.1 Release版本,举行了
    的头像 发表于 05-26 17:03 ?789次阅读

    开源鸿蒙开发者大会2025·AI分论坛圆满闭幕,探索开源鸿蒙AI无限可能

    5月24日,开源鸿蒙开发者大会2025·AI分论坛在深圳蛇口希尔顿南海酒店成功举办。活动特邀学术领袖、开源专家、行业先锋和社区
    的头像 发表于 05-26 18:06 ?1005次阅读
    <b class='flag-5'>开源</b><b class='flag-5'>鸿蒙</b><b class='flag-5'>开发</b>者大会2025·<b class='flag-5'>AI</b>分论坛圆满闭幕,探索<b class='flag-5'>开源</b><b class='flag-5'>鸿蒙</b><b class='flag-5'>AI</b>无限可能