当前位置: 首页 > article >正文

【鸿蒙实战】从零编译ONNX Runtime,解锁鸿蒙端侧AI推理

1. 为什么要在鸿蒙上折腾ONNX Runtime最近几年AI应用爆发式增长手机端跑模型已经不是什么新鲜事了。但当我第一次尝试在鸿蒙系统上部署AI模型时发现事情没那么简单——官方居然没有提供现成的ONNX Runtime库这就像你买了台新电脑结果发现连Python都没预装那种酸爽你们懂的。ONNX Runtime作为业界标准的推理引擎能支持PyTorch、TensorFlow等主流框架导出的模型。把它移植到鸿蒙上就意味着我们能直接在手机、手表等设备上运行各种AI模型。想象一下你的鸿蒙应用可以实时处理图像识别、语音转文字甚至运行Stable Diffusion生成图片这难道不香吗不过现实总是骨感的。鸿蒙的NDK工具链和常规Linux环境差异不小直接git clonemake的常规操作根本行不通。我花了整整三天时间踩遍了编译环境、依赖项、工具链适配的所有坑终于把这块硬骨头啃下来了。下面就把我的完整踩坑记录分享给大家。2. 环境准备搭建鸿蒙编译战场2.1 硬件配置建议先说个血泪教训编译ONNX Runtime是个资源大户。我的MacBook Pro 16G内存第一次编译时直接卡死后来换了台32G的Linux服务器才搞定。建议配置内存最低16G推荐32G以上存储至少预留50G空间源码编译中间文件很占地方系统Ubuntu 20.04/22.04最稳妥鸿蒙工具链对Linux支持最好2.2 安装鸿蒙SDK鸿蒙的Native开发需要用到专门的SDK包这里有个坑要注意版本匹配# 下载鸿蒙Native SDK以3.2版本为例 wget https://repo.huaweicloud.com/harmonyos/sdk/3.2/native/HarmonyOS-Native-SDK-3.2.0.0-Linux.tar.gz tar -zxvf HarmonyOS-Native-SDK-3.2.0.0-Linux.tar.gz解压后目录结构长这样sdk/ └── default/ ├── oh-uni-package.json └── openharmony/ ├── build-tools/ # 包含cmake/ninja等工具 ├── llvm/ # 鸿蒙定制版Clang编译器 └── sysroot/ # 系统库和头文件2.3 配置交叉编译工具链鸿蒙设备普遍采用ARM架构我们需要配置交叉编译环境。编辑~/.bashrc添加export OHOS_SDK/path/to/sdk/default/openharmony export PATH$OHOS_SDK/build-tools/cmake/bin:$PATH export CC$OHOS_SDK/llvm/bin/clang export CXX$OHOS_SDK/llvm/bin/clang验证配置是否生效source ~/.bashrc cmake --version # 应该显示鸿蒙定制版cmake $CC --version # 应该显示clang版本号3. 编译ONNX Runtime实战3.1 获取源码与补丁文件ONNX Runtime官方源码并不直接支持鸿蒙好在社区有热心大佬做了适配git clone https://gitee.com/zhong-luping/tpc_c_cplusplus.git cd tpc_c_cplusplus git checkout -b fix_other origin/fix_other这个仓库关键提供了thirdparty/onnxruntime/HPKBUILD鸿蒙专用的编译脚本lycium/build.sh自动化构建工具3.2 修改编译配置打开HPKBUILD文件重点修改这些参数pkgverv1.22.2 # ONNX Runtime版本号 archsarm64-v8a # 鸿蒙设备常用架构 downloadpackagetrue # 自动下载源码如果是内网环境需要手动下载源码记得设置downloadpackagefalse把源码包放在lycium/onnxruntime目录下3.3 开始编译终于到激动人心的编译环节先调整并行编译数防止OOM# 修改lycium/build.sh中的并行参数 sed -i s/-j32/-j8/g lycium/build.sh然后运行编译脚本cd lycium ./build.sh onnxruntime这个过程视机器性能需要30分钟到2小时不等。我遇到过几个典型报错内存不足编译进程被kill需要减少-j参数或增加swap空间证书错误在build.sh开头添加export GIT_SSL_NO_VERIFY1依赖缺失安装libssl-dev和protobuf-compiler4. 集成到鸿蒙项目4.1 获取编译产物编译成功后在lycium/usr目录下会生成usr/ ├── include/ # 头文件 │ └── onnxruntime/ └── lib/ # 动态库 ├── libonnxruntime.so.1.22.2 └── libonnxruntime.so - libonnxruntime.so.14.2 项目配置把库文件复制到鸿蒙工程的libs目录cp -r usr/lib/* your_project/libs/arm64-v8a/ cp -r usr/include your_project/src/main/cpp/onnxruntime修改CMakeLists.txt添加链接配置target_include_directories(your_app PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/onnxruntime/include) target_link_libraries(your_app PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/../../../libs/${OHOS_ARCH}/libonnxruntime.so)4.3 验证推理功能写个简单的测试代码验证是否正常工作#include onnxruntime/core/session/onnxruntime_cxx_api.h void testInference() { Ort::Env env(ORT_LOGGING_LEVEL_WARNING, test); Ort::SessionOptions session_options; auto session Ort::Session(env, model.onnx, session_options); // 准备输入输出张量... // 运行推理... }如果运行时不报错恭喜你鸿蒙AI推理的大门已经向你敞开。5. 性能优化技巧5.1 启用ARM NEON加速在HPKBUILD中添加编译选项CFLAGS-marcharmv8-asimd # 启用NEON指令集实测在麒麟芯片上启用后推理速度提升可达40%。5.2 量化模型优化ONNX Runtime支持动态量化能大幅减少内存占用# 在Python环境中生成量化模型 from onnxruntime.quantization import quantize_dynamic quantize_dynamic(float_model.onnx, quant_model.onnx)8位量化后模型大小通常能减少到原来的1/4。5.3 线程池配置鸿蒙设备的核心数有限建议限制线程数Ort::ThreadingOptions tp_options; tp_options.SetGlobalIntraOpNumThreads(2); // 根据CPU核心数调整 session_options.SetThreadingOptions(tp_options);6. 常见问题排查6.1 运行时找不到符号如果报undefined symbol错误可能是编译时链接了错误版本的protobuf。解决方法# 在编译前清理protobuf缓存 rm -rf ~/.cache/protobuf6.2 模型加载失败鸿蒙的文件系统路径和Linux有所不同建议// 使用鸿蒙的路径API获取模型绝对路径 char model_path[256] {0}; OH_IO_GetDataPath(/, model_path, sizeof(model_path)); strcat(model_path, /model.onnx);6.3 内存泄漏检测在build.sh中添加编译选项export CFLAGS-fsanitizeaddress export LDFLAGS-fsanitizeaddress运行时发现内存泄漏会打印详细堆栈信息。折腾完这一整套我的鸿蒙设备终于能流畅运行YOLOv5模型了。虽然过程曲折但看到自己编译的库在真机上跑起AI模型的那一刻所有的熬夜都值了。建议大家在尝试时做好心理准备遇到问题多查鸿蒙社区的issue大多数坑都已经有人踩过了。

相关文章:

【鸿蒙实战】从零编译ONNX Runtime,解锁鸿蒙端侧AI推理

1. 为什么要在鸿蒙上折腾ONNX Runtime? 最近几年AI应用爆发式增长,手机端跑模型已经不是什么新鲜事了。但当我第一次尝试在鸿蒙系统上部署AI模型时,发现事情没那么简单——官方居然没有提供现成的ONNX Runtime库!这就像你买了台新…...

mysql修改字段长度是否影响数据_隐式转换与字符集限制分析

ALTER TABLE MODIFY 会静默截断超长数据,且不报错;需先检查长度、开事务验证;utf8mb4下VARCHAR字符数≠字节数,索引易超限;TEXT不可直接转VARCHAR;隐式转换多因collation不一致导致索引失效。ALTER TABLE M…...

零基础入门:使用Xinference快速部署tao-8k,体验长文本向量化

零基础入门:使用Xinference快速部署tao-8k,体验长文本向量化 1. 认识tao-8k:为什么选择这个长文本向量化模型 在当今信息爆炸的时代,处理长文本数据已成为许多应用场景的刚需。tao-8k是由Hugging Face开发者amu研发并开源的一款…...

Ubuntu 20.04服务器部署Youtu-Parsing:生产环境配置全攻略

Ubuntu 20.04服务器部署Youtu-Parsing:生产环境配置全攻略 最近在帮一个做内容分析的朋友搭建一套视频理解系统,他们需要从海量视频里自动提取关键信息。试了几个方案,最后选定了Youtu-Parsing,效果确实不错,但要把这…...

Ostrakon-VL扫描终端实战:对接RPA机器人自动触发补货OA流程

Ostrakon-VL扫描终端实战:对接RPA机器人自动触发补货OA流程 1. 项目背景与价值 在零售行业,货架缺货是影响销售转化的重要因素。传统的人工巡检方式效率低下,且难以实现实时响应。Ostrakon-VL扫描终端结合RPA技术,构建了一套完整…...

Redis 缓存预热方案优化实践

Redis 缓存预热方案优化实践 在分布式系统中,Redis 作为高性能缓存层,对系统响应速度至关重要。冷启动或缓存失效时,大量请求直接穿透到数据库,可能导致服务雪崩。缓存预热通过提前加载热点数据到 Redis,有效缓解这一…...

AI Agent生产环境监控清单:10个核心指标与告警阈值设置

AI Agent生产环境监控清单:10个核心指标与告警阈值设置 关键词:AI Agent监控、生产环境可观测性、告警阈值配置、LLM应用运维、Agent可靠性、大模型应用SLO、智能体故障排查 摘要:随着AI Agent在企业客服、内部知识库、自动化办公等场景的大规模落地,生产环境的稳定性和输出…...

一文吃透路由基础:从核心概念到转发全流程,网工入门必看

我们日常上网、聊天、访问网页,数据能从终端穿越千里抵达目标服务器,背后最核心的网络基石,就是「路由」。很多刚接触网络的朋友,总会被路由、路由器、路由表等概念绕晕,也搞不懂管理距离、度量值的核心区别&#xff0…...

DeepSeek-R1-Distill-Qwen-1.5B应用场景:智能客服系统搭建案例

DeepSeek-R1-Distill-Qwen-1.5B应用场景:智能客服系统搭建案例 1. 引言:小模型也能有大作为 如果你正在为搭建智能客服系统发愁,觉得大模型太贵、小模型太笨,那今天这个案例可能会让你眼前一亮。 我最近帮一家电商公司搭建了一…...

算法训练营第四天|螺旋矩阵

今日学习的文章链接和视频链接: https://www.bilibili.com/video/BV1SL4y1N7mV/ 自己看到题目的第一想法: 第一想法是,先定义矩阵的上下左右四个边界,然后按照从左到右,从上到下,从右到左,从下到…...

像素幻梦效果展示:FLUX.1-dev+LoRA生成RPG角色/场景/道具高清像素图

像素幻梦效果展示:FLUX.1-devLoRA生成RPG角色/场景/道具高清像素图 1. 像素幻梦创意工坊概览 Pixel Dream Workshop(像素幻梦创意工坊)是一款基于FLUX.1-dev扩散模型的下一代像素艺术生成工具。它采用明亮的16-bit像素工坊视觉设计&#xf…...

IDEA中JDK版本自动回滚?Maven项目终极解决方案(附多模块配置技巧)

IDEA中JDK版本自动回滚的根治方案:Maven项目配置全指南 每次在IDEA中修改完JDK版本,一刷新Maven就回到解放前?这种令人抓狂的问题困扰着不少Java开发者。特别是在多模块项目中,不同模块的JDK版本频繁跳转,不仅影响开发…...

SAM 3图像视频分割:小白友好,快速部署体验AI黑科技

SAM 3图像视频分割:小白友好,快速部署体验AI黑科技 1. SAM 3是什么?它能做什么? SAM 3是Facebook推出的一个强大的AI模型,专门用于图像和视频中的物体分割。简单来说,它就像一个"智能剪刀"&…...

Qwen3-14B效果展示:看它如何理解复杂指令,进行深度逻辑推理

Qwen3-14B效果展示:看它如何理解复杂指令,进行深度逻辑推理 如果你对大语言模型的印象还停留在“聊天机器人”或者“文本生成器”的阶段,那么Qwen3-14B可能会彻底颠覆你的认知。它不是一个简单的问答工具,而是一个能够理解复杂意…...

Qwen2-VL-2B-Instruct对比测试:与通用视觉模型在特定场景下的效果差异

Qwen2-VL-2B-Instruct对比测试:与通用视觉模型在特定场景下的效果差异 最近在尝试一些视觉语言模型,发现一个挺有意思的现象:很多号称“通用”的模型,在面对一些特定任务时,表现可能还不如一些专门优化过的“小”模型…...

建立论坛网站

...

UVM面试高频考点精讲:从uvm_component到phase机制的避坑指南

UVM面试高频考点精讲:从uvm_component到phase机制的避坑指南 在IC验证工程师的求职路上,UVM面试题往往成为区分候选人专业水平的关键分水岭。无论是寒武纪、比特大陆这类芯片设计巨头,还是新兴的AI芯片公司,对UVM底层机制的理解深…...

Python环境变量实战:PYTHONUNBUFFERED的深度解析与应用

1. PYTHONUNBUFFERED环境变量核心解析 第一次在Docker里跑Python服务时,我盯着空白的日志窗口等了半小时,直到同事提醒才意识到问题所在——输出被缓冲了。这就是PYTHONUNBUFFERED环境变量给我的启蒙课。这个看似简单的配置,实际上影响着程序…...

快速上手Seed-Coder-8B-Base:从下载到生成代码,完整教程

快速上手Seed-Coder-8B-Base:从下载到生成代码,完整教程 1. Seed-Coder-8B-Base简介 Seed-Coder-8B-Base是一款由字节团队开源的8B级代码生成模型,专为开发者设计。它不像通用聊天模型那样泛泛而谈,而是专注于一件事&#xff1a…...

python面向对象————图书馆借阅系统(综合练习)

练习题5:图书馆借阅系统(综合练习) 设计一个图书馆借阅系统,综合运用三大特性: **要求:** - 基类 LibraryItem(封装):- 私有属性:__item_id、__title、__is_b…...

0基础速通Python+AI|2026热门轻量化玩法全攻略:从入门到实战,3天搞定AI应用开发

🎁个人主页:我滴老baby 🎉欢迎大家点赞👍评论📝收藏⭐文章 🔍系列专栏:AI 文章目录:【前言】一、2026年PythonAI:轻量化爆发,0基础最佳入局期1.1 为什么2026是…...

面向对象高级(枚举)

3.1 认识枚举 3.1.1 认识枚举、枚举的原理枚举是一种特殊的类,它的格式是:public enum 枚举类名{枚举项1,枚举项2,枚举项3; } 3.1.2 枚举深入public enum A{//定义枚举项X,Y,Z("张三"); //枚举项后面加括号,就是在执行枚举类的带参…...

工业软件设计辅助:使用Qwen3将SolidWorks模型概念转化为二维讲解图

工业软件设计辅助:使用Qwen3将SolidWorks模型概念转化为二维讲解图 你有没有遇到过这种情况?在SolidWorks里精心设计了一个复杂的3D模型,内部结构巧妙,装配关系清晰,但当你需要向同事、客户或者新来的工程师讲解时&am…...

AI代码审查不是替代开发者,而是接管重复劳动:Gartner验证的12项ROI指标,你达标了几项?

第一章:AI代码审查不是替代开发者,而是接管重复劳动:Gartner验证的12项ROI指标,你达标了几项? 2026奇点智能技术大会(https://ml-summit.org) AI代码审查工具的核心价值,从来不是取代工程师的判断力与架构…...

day09统计师考试(初级)统计行政法规

统计行政法规(一)制定机关(二)法律地位(三)现行统计行政法规例题(一)制定机关 行政法规是国家最高行政机关国务院制定的有关国家行政管理的规范性法律文件的总称。 (二)法律地位 其法律地位和效力仅次于宪法和法律。统计行政法规是由国务院制定的规范性法律文件,…...

丹青幻境Z-Image Atelier快速上手:从部署到生成第一幅国风AI画作

丹青幻境Z-Image Atelier快速上手:从部署到生成第一幅国风AI画作 1. 走进丹青幻境 想象一下,当你打开电脑,看到的不是冰冷的代码界面,而是一张泛着古意的宣纸。这就是丹青幻境Z-Image Atelier带给你的第一印象——一个将现代AI技…...

生成式AI流量洪峰应对方案:4种动态负载策略+实时QPS压测数据验证

第一章:生成式AI应用负载均衡方案 2026奇点智能技术大会(https://ml-summit.org) 生成式AI服务(如大语言模型推理、文生图API)具有显著的负载非线性特征:请求长度差异大、显存占用波动剧烈、响应延迟敏感,传统基于连接…...

DFlash 的架构密码——扩散模型如何「寄生」在自回归模型上

好,先搞清楚问题是什么。 大语言模型写代码的时候,是一个字一个字往外蹦的——这是自回归,token by token。GPU 很强,但这种串行方式让它大部分时间都在等,利用率低得可怜。 以前有人想了个办法叫 Speculative Decoding:让一个小模型先快速"猜"一串 token,大…...

视觉Transformer的「近视眼」手术——LaSt-ViT如何让机器真正「看懂」图像

一、先从一个奇怪的实验说起 想象一下这个场景:你正在训练一个视觉模型来识别图片里的猫。你给它看一张猫坐在沙发上的照片,模型说:「这是猫。」准确无误。 但当你问它:「你『看』到了什么?」 它指着沙发、指着地毯、指着墙上的挂饰——唯独没有指着那只猫。 这听起来…...

Leetcode704 二分查找(数组)

# 这里是二分查找,题目当中 只给出了 n个 升序 整型 数组nums,目标变量名称是 target,# 要求 存在返回 下标,不存在 返回 -1,时间复杂度O(logn)class Solution(object):def search(self, nums, target):""&q…...