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

RK3576 + OpenHarmony 6.1 RKNN2 NPU 验证指南

0. 前置条件

项目说明
开发板RK3576 + OpenHarmony 6.1 标准系统
调试工具hdc (HarmonyOS Device Connector),能hdc shell
PC 编译环境WSL2 + GCC linaro 7.5.0 aarch64 交叉编译器
RKNN2 SDKrknpu2/runtime/Linux/目录(含librknnrt.sorknn_api.h
测试模型rknpu2/examples/rknn_api_demo/model/RK3576/mobilenet_v1.rknn

GCC linaro 路径(参考):

D:\Projects\RKNN3\gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu\gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu

1. 板端 NPU 驱动检查

通过 hdc shell 连上板子,依次执行:

hdc shell
# 1.1 NPU 驱动版本 cat /sys/kernel/debug/rknpu/version

期望输出RKNPU driver: v0.9.x

# 1.2 NPU 设备节点 ls -la /dev/dri/renderD128

期望输出crw-rw-rw- 1 root graphics 226, 128 ...

# 1.3 板端 libc 类型确认 ls /lib/ld-musl* /lib/ld-linux* 2>/dev/null

期望输出/lib/ld-musl-aarch64.so.1(OH 6.1 使用 musl libc,这是后续需要 glibc 兼容层的原因)

如果驱动未加载

检查内核配置:

dmesg | grep -i rknpu zcat /proc/config.gz | grep RKNPU 2>/dev/null

若 NPU 驱动未编译进内核,需要重新编译 OH 内核并启用 RKNPU 驱动。


2. 在板端搭建 glibc 兼容环境

由于librknnrt.so用 GCC linaro 编译、依赖 glibc,而 OH 6.1 使用 musl,需要自带 glibc 运行时。

2.1 从 GCC 工具链提取 glibc 文件

在 PC 端(PowerShell):

$GCC_LIB = "D:\Projects\RKNN3\gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu\gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu\aarch64-linux-gnu\libc\lib" $HDC = "D:\hdc\hdc.exe" $BOARD_DIR = "/data/glibc" ​ # 创建目录 & $HDC shell "mkdir -p $BOARD_DIR" ​ # 推送 8 个核心库文件 $files = @( "ld-2.25.so", "libc-2.25.so", "libm-2.25.so", "libdl-2.25.so", "libpthread-2.25.so", "libstdc++.so.6.0.24", "libgcc_s.so.1", "librt-2.25.so" ) ​ foreach ($f in $files) { & $HDC file send "$GCC_LIB\$f" "$BOARD_DIR/$f" }

2.2 创建 SONAME 符号链接

在板端 shell 中:

cd /data/glibc ln -sf ld-2.25.so ld-linux-aarch64.so.1 ln -sf libc-2.25.so libc.so.6 ln -sf libm-2.25.so libm.so.6 ln -sf libdl-2.25.so libdl.so.2 ln -sf libpthread-2.25.so libpthread.so.0 ln -sf libstdc++.so.6.0.24 libstdc++.so.6 ln -sf librt-2.25.so librt.so.1

2.3 验证 glibc 环境

ls -la /data/glibc/

期望:看到 8 个*-2.25.so文件 + 7 个*.so.*符号链接


3. 编译推理测试程序

3.1 源文件

源文件位于rknpu2/rknn_oh_test.c,可以作为模板直接使用。核心调用链:rknn_init()rknn_query()rknn_inputs_set()rknn_run()rknn_outputs_get()rknn_destroy()

3.2 在 WSL 中用 GCC linaro 编译

编译脚本build_oh_test.sh位于rknpu2/目录,在 WSL 中执行:

wsl bash /mnt/d/Projects/rknn-toolkit2/rknpu2/build_oh_test.sh

编译脚本做了什么

  1. 修复 LTO plugin 符号链接缺失

  2. 在 sysroot 中用cp创建 SONAME 别名(DrvFS 不支持 symlink)

  3. 编译命令关键参数:

    • -Wl,-rpath-link,"$LIBC_LIB"— 链接时找到 glibc 库

    • -Wl,--dynamic-linker=/data/glibc/ld-linux-aarch64.so.1— 运行时使用板端的 glibc ld

    • -Wl,-rpath='$ORIGIN:/data/glibc:/data/local/tmp'— 运行时库搜索路径

编译输出:rknpu2/rknn_oh_test(aarch64 ELF 可执行文件)

3.3 编译常见问题

错误原因解决
fatal error: liblto_plugin.so not foundGCC 工具链 LTO plugin 文件名不对ln -sf liblto_plugin.so.0.0.0 liblto_plugin.so
cannot find -lpthreadsysroot 缺少 SONAME 符号链接cp libpthread-2.25.so libpthread.so.0
cannot find -lstdc++同上cp libstdc++.so.6.0.24 libstdc++.so.6
cannot find -lgcc_s同上cp libgcc_s.so.1 libgcc_s.so

4. 推送二进制和模型到板端

4.1 推送文件

$HDC = "D:\hdc\hdc.exe" # 推送推理测试程序 & $HDC file send "D:\Projects\rknn-toolkit2\rknpu2\rknn_oh_test" "/data/local/tmp/rknn_oh_test" # 推送测试模型 & $HDC file send "D:\Projects\rknn-toolkit2\rknpu2\examples\rknn_api_demo\model\RK3576\mobilenet_v1.rknn" "/data/local/tmp/mobilenet_v1.rknn" # 推送 librknnrt.so(如果首次部署) & $HDC file send "D:\Projects\rknn-toolkit2\rknpu2\runtime\Linux\librknn_api\aarch64\librknnrt.so" "/data/local/tmp/librknnrt.so" # 设置权限 & $HDC shell "chmod 755 /data/local/tmp/rknn_oh_test"

4.2 验证文件就位

hdc shell "ls -la /data/local/tmp/rknn_oh_test /data/local/tmp/mobilenet_v1.rknn /data/local/tmp/librknnrt.so"

5. 运行推理测试

hdc shell
cd /data/local/tmp /data/glibc/ld-linux-aarch64.so.1 \ --library-path /data/glibc:/data/local/tmp \ ./rknn_oh_test mobilenet_v1.rknn

期望输出

=== RKNN OH6.1 Test === [1] Loading model: mobilenet_v1.rknn model size: xxxxxxx bytes [2] rknn_init()... OK, ctx=366754551280 [3] Query SDK version... api: 2.3.2 drv: 0.9.8 [4] Query I/O count... inputs: 1, outputs: 1 [5] Input tensor(s): [0] input: INT8 NHWC dims=[1,224,224,3] n_elems=150528 size=150528 [6] Output tensor(s): [0] MobilenetV1/Predictions/Reshape_1: FP16 NHWC dims=[1,1001] n_elems=1001 size=2002 [7] Running inference... rknn_run OK rknn_outputs_get OK output[0] first 5: 0.0001 0.0003 0.0011 0.0000 0.0000 [8] Cleanup... done. === ALL TESTS PASSED ===

6. 一键快速验证清单

按以下顺序逐项确认,全部 OK 即可判定 NPU 可用:

#检查项命令通过标准
1NPU 驱动cat /sys/kernel/debug/rknpu/version输出v0.9.x
2设备节点ls -la /dev/dri/renderD128存在且权限正确
3glibc 环境ls /data/glibc/ld-linux-aarch64.so.1文件存在
4librknnrt.sols /data/local/tmp/librknnrt.so文件存在
5测试程序ls /data/local/tmp/rknn_oh_test文件存在且可执行
6测试模型ls /data/local/tmp/mobilenet_v1.rknn文件存在
7推理运行执行第 5 节命令ALL TESTS PASSED

7. 常见问题排查

7.1 "No such file or directory"(即使文件确实存在)

原因:动态链接器不匹配。OH 使用/lib/ld-musl-aarch64.so.1,而程序编译时指定了 glibc 的 ld。

确认

readelf -l ./rknn_oh_test | grep interpreter # 应输出: [Requesting program interpreter: /data/glibc/ld-linux-aarch64.so.1]

解决:必须用 glibc 的 ld 启动:

/data/glibc/ld-linux-aarch64.so.1 --library-path /data/glibc:/data/local/tmp ./rknn_oh_test

7.2 rknn_init 返回错误

  • -1(RKNN_ERR_FAIL):检查模型文件完整性、检查/dev/dri/renderD128权限

  • -4(RKNN_ERR_DEVICE_UNAVAILABLE):NPU 驱动未加载

  • -6(RKNN_ERR_MODEL_INVALID):模型与 SDK 版本不匹配,确认使用对应 RK3576 的模型

7.3 rknn_server "Address already in use"

原因/dev/usb-ffs/被 hdc 占用,rknn_server 的 NPUTransfer 组件无法绑定 USB 通道。

结论:rknn_server 是给 PC↔板端 USB 通信用的,RK3576 内部 NPU 推理不需要 rknn_server,直接调用 librknnrt.so 即可。

7.4 程序段错误 (SEGV)

可能是--library-path路径不完整,检查:

echo $LD_LIBRARY_PATH # 确认 /data/glibc 和 /data/local/tmp 都在搜索路径中

8. 相关文件索引

文件路径用途
推理测试源码rknpu2/rknn_oh_test.c最小 RKNN 推理验证程序
编译脚本rknpu2/build_oh_test.shWSL + GCC linaro 编译
RKNN API 头文件rknpu2/runtime/Linux/librknn_api/include/rknn_api.h完整 C API 定义
运行时库rknpu2/runtime/Linux/librknn_api/aarch64/librknnrt.so7.7MB,板端部署
RK3576 模型rknpu2/examples/rknn_api_demo/model/RK3576/mobilenet_v1.rknn分类模型测试
YOLOv5 模型rknpu2/examples/rknn_yolov5_demo/model/RK3576/yolov5s-640-640.rknn检测模型测试
Reusable Skill~/.workbuddy/skills/rknn2-oh-cross-compile/可复用的 AI 辅助 skill

9. 架构要点备忘

┌─────────────────────────────────────────────────────┐ │ ArkTS App (OH 6.1 / LLVM+musl) │ │ │ 未来通过 IPC/NAPI 调用 │ │ ▼ │ │ rknn_oh_test (GCC linaro / glibc) │ │ │ 直接链接 │ │ ▼ │ │ librknnrt.so (GCC linaro / glibc) │ │ │ ioctl │ │ ▼ │ │ /dev/dri/renderD128 → NPU 驱动 v0.9.8 │ │ │ │ │ ▼ │ │ RK3576 双核 NPU (2×3 TOPS) │ └─────────────────────────────────────────────────────┘
  • 不要用 rknn_server:它依赖 USB-FFS,在 OH 上被 hdc 占用

  • GCC linaro 编译:所有直接调 RKNN API 的代码必须用 GCC 编译

  • 自带 glibc/data/glibc/是运行时基础,每块新板子都要先搭好

  • RK3576 双核:可通过rknn_set_core_mask(ctx, RKNN_NPU_CORE_0_1)启用双核并行

http://www.jsqmd.com/news/1332973/

相关文章:

  • 3ds Max建模布线核心技巧:从基础拓扑到风格化天空屋实战
  • 通识:计算机组成原理 + 计算机网络 + 操作系统
  • 30亿条数据驱动预警,智慧应急从救到防的闭环跃迁
  • 2026年,苏州吴江这家实用装修公司,精装局改超好用! - 产品评测官
  • 实测5家成都geo优化工具软件:头部GEO机构硬核实测横评与企业选型避坑指南 - 资讯报道
  • 如何用AI智能放大技术让模糊图片视频重获新生
  • Java Comparator 实战:多字段排序、thenComparing、reversed 与 null 值处理
  • 英雄联盟玩家的终极效率工具:League Akari 深度使用指南
  • 从 Excel 到电价 API:2026 市场化后能源系统如何结构化维护电价数据
  • 解决Linux下ffmpeg报错libmvec.so.1缺失的完整指南
  • 信号隔离器哪家靠谱?抗干扰性能解析与采购要点全梳理 - 品牌推荐大师
  • 西安总线机箱厂家 8槽总线机箱 型号多样 - 科进网络
  • 网站建设合同.doc怎么签才不踩坑?资深运营揭秘避坑指南与核心条款解析
  • 电力模块采购指南:2026年智算时代高集成供配电方案深度解析
  • Windows跨设备共享:配置指南与效率提升实战
  • 维普AI率怎么降?它和查重根本是两回事,弄反顺序白花两次检测费。
  • AI转 word 工具推荐:平板端首选AI 导出鸭
  • Oracle面试全攻略:从基础到高可用实战解析
  • 海外品牌做TikTok本地化要注意什么?7个影响完播率与互动率的核心环节及优化思路
  • 广西市政雨水收集系统怎么选不踩坑?2026避坑指南:可拼装雨水模块厂家哪家好 - geo88
  • DeepSeek-Reasonix:在终端中部署AI Agent实现智能协作与自动化
  • Docker存储与网络架构解析及优化实践
  • 当三角形网格遇见实体模型:stltostp如何重塑你的3D工作流
  • 妊娠油哪个品牌好|产后收拾浴室,翻出孕期用过的油,说说感受 - 产品评测官
  • 如何快速掌握阿里云OSS Browser:面向开发者的完整云存储管理桌面工具指南
  • KeSpeech:构建中国首个多方言语音数据集的架构创新与AI应用突破
  • 胶辊厂家制作造纸厂胶辊采用什么包胶工艺?
  • 西安酒吧点餐系统源码实战指南:从开发到部署全流程解析
  • 临海市家里到处漏水发霉?卫生间屋顶外墙全场景漏水原因一次讲透 - 宅安选房屋修缮
  • 江苏PP模块批发|环保PP模块厂家哪家好?2026避坑指南:4个坑+5条硬标准 - geo88