【拆·應(yīng)用】是為開源鴻蒙應(yīng)用開發(fā)者打造的技術(shù)分享平臺(tái),是匯聚開發(fā)者的技術(shù)洞見與實(shí)踐經(jīng)驗(yàn)、提供開發(fā)心得與創(chuàng)新成果的展示窗口。誠(chéng)邀您踴躍發(fā)聲,期待您的真知灼見與技術(shù)火花!
引言
本期內(nèi)容由AI Model SIG提供,介紹了在開源鴻蒙中,利用MNN開源框架開發(fā)AI應(yīng)用以及基于MNN源碼編譯與Har包封裝的方法。
技術(shù)背景
MNN是一個(gè)由阿里巴巴開發(fā)的輕量級(jí)的深度神經(jīng)網(wǎng)絡(luò)引擎,支持深度學(xué)習(xí)的推理和訓(xùn)練,適用于服務(wù)器、手機(jī)、嵌入式等各類設(shè)備。MNN提供了對(duì)大語言模型和多模態(tài)大模型的支持,可以將原本需要在云端運(yùn)行的大模型,經(jīng)過壓縮、編譯和系統(tǒng)級(jí)優(yōu)化后,直接部署在手機(jī)、PC、車載、XR 頭顯、機(jī)器人等終端設(shè)備上,使其無需聯(lián)網(wǎng)即可完成生成、理解、推理等任務(wù)。
MNN的主要特性:
1.輕量性:MNN的主體功能無任何依賴,代碼精簡(jiǎn),可以方便地部署到移動(dòng)設(shè)備和各種嵌入式設(shè)備中。
2.通用性:MNN提供了豐富的算子,支持多種文件格式,如:Tensorflow、ONNX、Torchscripts等,支持CNN、Transformer等網(wǎng)絡(luò)結(jié)構(gòu);在大模型領(lǐng)域,MNN提供了對(duì)目前主流的開源LMM模型的支持。
3.高性能:MNN對(duì)iOS / Android / PC / Server 的CPU架構(gòu)進(jìn)行了適配,充分發(fā)揮了 CPU的算力,單線程下運(yùn)行常見CV模型接近設(shè)備算力峰值;支持基于 Metal / OpenCL / Vulkan 使用端側(cè)設(shè)備上的GPU進(jìn)行推理,支持部分設(shè)備的 NPU 計(jì)算。
目前已完成MNN在OpenHarmony 5.1 Release上的適配,支持在CPU下進(jìn)行LLM、MLLM推理。
環(huán)境準(zhǔn)備
1.硬件準(zhǔn)備
(1)開發(fā)板DAYU200,詳情介紹
https://gitee.com/hihope_iot/docs/blob/master/HiHope_DAYU200/README.md。
(2)芯片型號(hào)
SOC 系統(tǒng)芯片: Rockchip RK3568。
CPU中央處理器: Cortex-A55。
GPU圖形處理器: Mali-G52。
2.軟件準(zhǔn)備
(1)開發(fā)環(huán)境:windows 10 + ubuntu 22.04。windows下進(jìn)行設(shè)備連接、程序燒錄、文件傳輸;linux進(jìn)行程序編譯(官方推薦)。參考文檔:
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的庫文件,分別放到對(duì)應(yīng)的設(shè)備上。
(3)DevEco Studio: 版本5.1.0。下載地址:https://developer.huawei.com/consumer/cn/deveco-studio/。
開源鴻蒙MNN AI 應(yīng)用開發(fā)
1.mnnllm har包介紹
mnnllm har包是由開源鴻蒙AI Model SIG發(fā)布的大模型本地推理庫,基于mnnllm推理框架通過native api進(jìn)行封裝,可供ArkTS語言快速開發(fā)應(yīng)用程序,當(dāng)前已支持大語言模型和多模態(tài)大模型本地推理。
mnnllm har包已提交到開源鴻蒙第三方中心倉庫,可通過以下地址詳細(xì)了解相關(guān)信息。
https://ohpm.OpenHarmony.cn/#/cn/detail/@ai_model_sig%2Fmnnllm
2.基于mnnllm har包的應(yīng)用開發(fā)
(1)安裝mnnllm har包,通過ohpm install命令,可快速安裝,命令如下:
(2)準(zhǔn)備大模型并轉(zhuǎn)換成mnn支持的格式
在進(jìn)行測(cè)試前,需要先下載并轉(zhuǎn)換成mnn格式的模型, 通過llmexport工具即可快速轉(zhuǎn)換成mnn格式,如果不想轉(zhuǎn)換,也可以直接從魔搭社區(qū)下載已經(jīng)轉(zhuǎn)換好的mnn模型。
將大模型轉(zhuǎn)換成mnn格式,llmexport命令可參考mnn官方文檔,詳情可查看鏈接,具體鏈接如下:
https://mnn-docs.readthedocs.io/en/latest/transformers/llm.html
從modelscope社區(qū)直接下載mnn模型,可訪問倉庫地址:
https://www.modelscope.cn/organization/MNN?tab=model
文件準(zhǔn)備好了之后,需要將模型文件放在entry/src/main/resource/rawfile目錄下(僅模型文件,不需要包含模型名稱的外層目錄),對(duì)于多模態(tài)大模型,還需在rawfile下準(zhǔn)備一張測(cè)試圖片test.jpg。
注意:DAYU200的開發(fā)板由于算力限制,可以選擇參數(shù)較小的模型(如SmolVLM-256M-Instruct-MNN)進(jìn)行驗(yàn)證。
(3)應(yīng)用程序開發(fā)
從mnnllm har包中通過import導(dǎo)入對(duì)應(yīng)的函數(shù),具體函數(shù)說明,見表1。
import{nativeLoad,nativeChat,nativeChatVLM,nativeUnload}from '@ai_model_sig/mnnllm';
定義函數(shù)onCopyRawFileToLocal,將模型文件拷貝到應(yīng)用程序沙箱。
調(diào)用nativeLoad函數(shù),加載模型。
如果是大語言模型,調(diào)用nativeChat函數(shù),輸入對(duì)話內(nèi)容,返回模型回答結(jié)果;如果是多模態(tài)大模型,調(diào)用nativeChatVLM函數(shù),輸入對(duì)話內(nèi)容和圖片,返回模型回答結(jié)果。
應(yīng)用程序結(jié)束,調(diào)用nativeUnload函數(shù),釋放模型資源。
表1 Har包函數(shù)說明
(4)代碼示例
以下是部分關(guān)鍵示例代碼,供參考。
編譯并執(zhí)行示例代碼后,屏幕打印出的信息
基于mnn源碼編譯與native接口封裝
以下內(nèi)容介紹基于mnn源碼編譯與native接口封裝,如果對(duì)系統(tǒng)移植感興趣的可以繼續(xù)往下閱讀,如果只專注應(yīng)用開發(fā),可跳過此部分內(nèi)容。
源代碼地址和編譯方法鏈接:
https://gitcode.com/ai_model_sig/ohos_mnn。
1. 適配OpenHarmony的mnn靜態(tài)庫打包
(1)設(shè)置HARMONY_HOME環(huán)境變量,指向SDK解壓后的目錄。
export HARMONY_HOME=/home/xxx/ohos-sdk
(2)編譯mnn的靜態(tài)庫,cmake時(shí)指定
-DCMAKE_TOOLCHAIN_FILE、
-DMNN_BUILD_SHARED_LIBS=OFF,
-DMNN_BUILD_LLM=ON。
(3)獲取編譯后的libMNN.a的靜態(tài)庫。
2. 基于mnn的c++推理代碼開發(fā)
(1)準(zhǔn)備頭文件和mnn的靜態(tài)庫,從/path/to/MNN拷貝到src/main/cpp目錄下,libMNN.a拷貝到/path/to/cpp/libs/。
(2)模型的準(zhǔn)備。模型的轉(zhuǎn)換,參考文檔:https://mnn-docs.readthedocs.io/en/latest/transformers/llm.html。
(3)mnn的c++推理代碼開發(fā)和驗(yàn)證。代碼示例(非完整代碼):
3. 基于NAPI的native方法封裝
(1)開發(fā)前的準(zhǔn)備。
打開DevEco,在創(chuàng)建好的項(xiàng)目處,右鍵選擇new > Module > Static Library。
將2中準(zhǔn)備好的頭文件和靜態(tài)庫,復(fù)制到新創(chuàng)建的Module的src/main/cpp的libs和include目錄下。
(2)接口函數(shù)的制定
(3)Native方法的封裝,封裝以上4個(gè)函數(shù)
(4)har包的開發(fā)
在src/main/cpp/types/libentry/Index.d.ts,定義ArkTS接口。
oh-package.json5 文件,將API與so相關(guān)聯(lián),成為一個(gè)完整的ArkTS模塊。
在src/main/ets/export.ets導(dǎo)出native方法。
通過Index.ets對(duì)外暴露har包的接口函數(shù)。
常見問題和解決方法
Native方法封裝過程中,libllm.so、libMNN.so、libMNN_Express.so等動(dòng)態(tài)庫之間的復(fù)雜相互依賴問題導(dǎo)致的失敗。
解決方法:MNN的編譯過程中,指定cmake的參數(shù)DMNN_BUILD_SHARED_LIBS=OFF,編譯靜態(tài)庫libMNN.a,放置在src/main/cpp/libs下面。
Native方法封裝過程中,接口函數(shù)中l(wèi)oad、chat等方法難以通過NAPI的數(shù)據(jù)類型來傳遞模型實(shí)例。
解決方法:在c++推理代碼中定義靜態(tài)全局的模型,然后在load中通過reset方法重置模型的配置文件。
應(yīng)用開發(fā)調(diào)用時(shí),接口函數(shù)load調(diào)用過程中,傳入的模型文件無法讀取的問題。
解決方法:將轉(zhuǎn)換好的MNN模型文件全部放在rawfile目錄下,然后將文件全部拷貝到應(yīng)用沙箱中,最后通過沙箱路徑讀取模型的文件。
-
移植
+關(guān)注
關(guān)注
1文章
406瀏覽量
29066 -
AI
+關(guān)注
關(guān)注
88文章
37016瀏覽量
290048 -
開源
+關(guān)注
關(guān)注
3文章
3876瀏覽量
45215 -
鴻蒙
+關(guān)注
關(guān)注
60文章
2740瀏覽量
45026
原文標(biāo)題:拆·應(yīng)用丨第5期:開源鴻蒙MNN AI應(yīng)用開發(fā)與MNN移植經(jīng)驗(yàn)
文章出處:【微信號(hào):gh_e4f28cfa3159,微信公眾號(hào):OpenAtom OpenHarmony】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
【每日精選】開源鴻蒙系統(tǒng)DAYU200教程及Tina Wi-Fi模組移植
CoolPi CM5運(yùn)行ChatGLM-MNN大語言模型
Coolpi CM5運(yùn)行ChatGLM-MNN大語言模型
阿里正式開源輕量級(jí)深度學(xué)習(xí)端側(cè)推理引擎“MNN”
阿里MNN支持華為NPU,優(yōu)化MNN的性能和精度問題
實(shí)戰(zhàn)MNN之Mobilenet SSD部署
淺談阿里輕量級(jí)的深度神經(jīng)網(wǎng)絡(luò)推理引擎MNN
實(shí)戰(zhàn)MNN之量化部署

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

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

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

談?wù)?b class='flag-5'>MNN的模型量化(一)數(shù)學(xué)模型

實(shí)戰(zhàn)MNN之Mobilenet SSD部署(含源碼)

2025開源鴻蒙開發(fā)者大會(huì)圓滿落幕
開源鴻蒙開發(fā)者大會(huì)2025·AI分論壇圓滿閉幕,探索開源鴻蒙AI無限可能

評(píng)論