
1. 项目缘起为什么要在DAYU200上折腾RKNN最近在搞一个边缘AI的小项目手头正好有一块润和出品的DAYU200开发板。这块板子核心是瑞芯微的RK3568芯片性能不错功耗也控制得挺好很适合做图像识别、目标检测这类边缘计算任务。项目里需要用到一个训练好的YOLOv5模型做实时检测模型是PyTorch格式的但直接放在开发板上用Python跑那效率肯定惨不忍睹帧率估计个位数都难保。这时候就得请出瑞芯微自家的“法宝”——RKNNRockchip Neural Network。简单来说RKNN是一套工具链能把你在PC上训练好的、各种框架PyTorch, TensorFlow, ONNX等的模型“翻译”成RK芯片比如RK3568、RK3588能高效理解和执行的格式。这个“翻译”过程叫模型转换和量化转换后的模型文件就是.rknn文件。在开发板上运行这个.rknn文件就能调用芯片内置的NPU神经网络处理单元进行加速推理性能相比CPU能有数量级的提升。但是官方文档和社区资料虽然丰富却有点“散”。关于在鸿蒙系统OpenHarmony的DAYU200上部署RKNN特别是使用rknn_toolkit_lite2这个轻量级推理库完整的、一步到位的实操记录并不多。很多教程要么停留在仿真环境要么是针对其他Linux发行版直接套用到鸿蒙上总会踩几个坑。所以我把这次从零开始在DAYU200鸿蒙系统上成功安装rknn_toolkit_lite2并跑通官方Demo的全过程记录下来希望能帮你省下几个小时甚至几天的折腾时间。2. 前期准备理清工具链与系统环境在动手之前我们必须先搞清楚几个关键概念和组件这决定了后续所有操作的路径。2.1 RKNN工具链的“三驾马车”瑞芯微的RKNN生态主要包含三个核心工具它们分工明确rknn-toolkit2这是在PCx86/ARM架构均可上运行的模型转换、量化、分析和仿真工具。你的主要工作比如将.pt或.onnx模型转换成.rknn文件都是在它上面完成的。它功能强大但依赖多体积也大。rknn-toolkit-lite2这是在开发板ARM架构上运行的轻量级推理库。它只负责一件事加载.rknn模型文件并调用NPU执行推理。它体积小、依赖少是最终部署到设备上的运行时环境。我们今天要在DAYU200上安装的就是它。RKNN API这是一套C语言和Python的编程接口。rknn-toolkit2和rknn-toolkit-lite2都提供了这套API使得在PC端转换模型和在板端执行推理的代码写法非常相似降低了学习成本。2.2 DAYU200的系统认知DAYU200预装的是OpenHarmony标准系统。它本质上是一个基于Linux内核的发行版但文件系统结构、包管理方式用的是HPM和OHPM和部分系统配置与常见的Ubuntu、Debian有所不同。这导致我们不能直接用apt-get或pip install来装东西很多依赖需要手动处理或从指定渠道获取。2.3 准备工作清单在连接开发板之前请在你的PC上准备好以下东西DAYU200开发板确保已烧录最新的OpenHarmony标准系统镜像并能通过串口或网络SSH登录。网络连接开发板必须能访问互联网这是下载安装包和依赖库的前提。可以通过网线直连路由器或者配置Wi-Fi。PC与开发板的文件传输方式推荐使用scp命令基于SSH方便可靠。你需要知道开发板的IP地址。rknn_toolkit_lite2安装包这是最关键的文件。你需要从瑞芯微的官方GitHub仓库rockchip-linux/rknn-toolkit2的release页面下载。注意要选择与你的RK3568芯片和Python版本匹配的包。对于RK3568通常需要下载rknn_toolkit_lite2-xxxx-cp39-cp39-linux_aarch64.whl这样的文件其中cp39代表Python 3.9。请下载最新稳定版。3. 安装实战步步为营解决依赖假设你已经通过串口或SSH登录到了DAYU200的开发板终端。我们开始正式的安装过程。3.1 基础系统更新与Python环境确认首先更新系统软件包列表并升级现有包虽然OHPM的源可能不如apt丰富但这一步有助于更新基础组件。hpm update检查Python3的版本。OpenHarmony通常预装了Python3。python3 --version # 输出应为 Python 3.9.x 或类似确认是3.9版本 which python3 # 确认python3解释器的路径通常是 /usr/bin/python3同时检查pip3是否可用。鸿蒙系统可能没有预装pip或者版本很旧。pip3 --version如果未安装或版本过低我们需要手动安装/升级pip。这里有个坑直接使用get-pip.py脚本可能会因为某些依赖问题失败。更稳妥的方法是使用系统包管理器尝试安装或者从Python官网下载对应版本的pip源码包手动安装。这里提供一个备用方案# 尝试使用ensurepip模块安装如果python3版本支持 python3 -m ensurepip --upgrade # 如果上述命令无效可以手动下载 wget https://bootstrap.pypa.io/get-pip.py python3 get-pip.py安装成功后再次验证pip3 --version。3.2 传输rknn_toolkit_lite2安装包到开发板在你的PC上打开终端使用scp命令将下载好的.whl文件传到开发板。假设开发板IP是192.168.1.100文件在PC的~/Downloads目录下。scp ~/Downloads/rknn_toolkit_lite2-2.0.0-cp39-cp39-linux_aarch64.whl root192.168.1.100:/home/传输完成后在开发板终端上进入文件所在目录。cd /home ls -la | grep rknn # 确认文件已存在3.3 安装依赖库最大的挑战直接运行pip3 install rknn_toolkit_lite2-xxx.whl几乎百分之百会失败因为缺少关键的运行时依赖库。RKNN Lite库底层依赖于一些特定的C库如libstdc.so.6,libgcc_s.so.1,libm.so.6等并且对版本有要求。在标准的Ubuntu上这些库很齐全但在精简的OpenHarmony根文件系统里可能缺失或版本不兼容。最常见的报错信息是ImportError: libxxxx.so.x: cannot open shared object file: No such file or directory或者是在安装过程中编译某些组件时失败。解决方案是手动安装或验证这些依赖。我们需要的主要是GCC运行时库。虽然OpenHarmony有自己的编译工具链但为了兼容RKNN这种闭源的二进制包我们需要确保GNU的C库存在。检查现有库ldconfig -p | grep stdc ldconfig -p | grep libgcc_s从OpenHarmony的包源中搜索并安装 OpenHarmony的hpm包管理器可能不直接提供这些库的包。一个更直接的方法是从瑞芯微提供的、针对其Debian/Ubuntu BSP的根文件系统中提取所需的库文件。但这比较进阶。对于大多数情况DAYU200的基础镜像可能已经包含了最低要求的版本。尝试安装开发工具链 安装gcc和g的包通常会连带安装这些运行时库。可以尝试hpm install gcc # 或者尝试更通用的做法安装C/C运行时环境注意OpenHarmony的包名可能与常规Linux发行版不同需要根据实际情况查找。3.4 实际安装rknn_toolkit_lite2在解决了基本的库依赖问题后或者至少确认了主要库文件存在我们开始安装。使用pip安装时强烈建议使用--no-deps参数避免pip自动下载不兼容的Python依赖包然后手动安装已知兼容的依赖。# 先尝试不检查依赖安装看核心库能否装上 pip3 install rknn_toolkit_lite2-2.0.0-cp39-cp39-linux_aarch64.whl --no-deps如果上述命令成功只是提示缺少某些Python包如numpy,opencv-python,psutil等我们再手动安装这些包。关键点来了必须安装ARM架构aarch64兼容的版本。直接pip3 install numpy可能会从源码编译在开发板上编译大型Python包极其耗时且容易失败。最佳实践是使用预编译的wheel文件。我们可以从https://github.com/archlinuxarm/archlinuxarm-packages或https://pkgs.org/等网站寻找aarch64架构的预编译wheel或者使用国内镜像源它们有时会提供二进制包。例如对于numpy# 尝试从国内镜像安装看是否有可用的二进制包 pip3 install numpy -i https://pypi.tuna.tsinghua.edu.cn/simple # 如果还是触发编译可以尝试指定一个较低的、可能有预编译包的版本 pip3 install numpy1.24 -i https://pypi.tuna.tsinghua.edu.cn/simple对于opencv-python在ARM平台上编译几乎不可能。替代方案是安装opencv-python-headless的轻量版或者更推荐只安装opencv的Python接口python3-opencv如果系统源里有的话。实际上对于RKNN的Demo我们可能只需要numpy和PillowPIL来处理图像。pip3 install Pillow如果rknn_toolkit_lite2安装失败提示缺少某个特定的.so文件你需要根据错误信息去其他Linux系统如Ubuntu for ARM中找到对应的库文件通过scp拷贝到开发板的/usr/lib或/lib目录下注意备份原文件并运行ldconfig更新缓存。这是一个比较“硬核”的解决方案但往往有效。4. 运行与验证让Demo真正跑起来安装成功后我们还需要获取Demo代码来验证RKNN Lite库是否工作正常。4.1 获取官方示例代码瑞芯微的RKNN-Toolkit2仓库里就包含了Lite版的示例。我们可以在PC上下载整个仓库然后将examples/rknn_toolkit_lite2目录下的示例代码传到开发板上。# 在PC上操作 git clone https://github.com/rockchip-linux/rknn-toolkit2.git scp -r rknn-toolkit2/examples/rknn_toolkit_lite2 root192.168.1.100:/home/4.2 准备模型和测试数据示例代码通常需要对应的.rknn模型文件和测试图片。这些文件一般在仓库的examples目录下可以找到或者有下载脚本。我们需要将这些资源文件也上传到开发板并放在示例代码指定的路径下通常是xxx/model和xxx/data目录。例如对于rknn_toolkit_lite2/examples/ssd_mobilenet_v2这个Demo在PC上进入rknn-toolkit2/examples/ssd_mobilenet_v2目录。运行python3 convert.py确保PC上已安装rknn-toolkit2生成ssd_mobilenet_v2.rknn模型文件。将生成的.rknn文件和data目录下的测试图片一并上传到开发板对应示例的目录中。4.3 运行第一个Demo在开发板上进入示例目录尝试运行。cd /home/rknn_toolkit_lite2/examples/ssd_mobilenet_v2 python3 ssd.py4.4 可能遇到的错误及解决错误RKNN init failed. error code: RKNN_ERR_MODEL_INVALID原因模型文件路径错误或者模型文件在传输过程中损坏或者模型文件与RKNN Lite库的版本不兼容。解决检查模型文件路径重新在PC端使用与板端RKNN Lite版本匹配的rknn-toolkit2转换模型使用md5sum校验文件完整性。错误RKNN init failed. error code: RKNN_ERR_DEVICE_UNAVAILABLE原因NPU设备驱动未加载或权限不足。解决检查NPU驱动模块是否已加载。lsmod | grep npu。在OpenHarmony上NPU驱动可能已内置在内核中。需要检查/dev/下是否有npu相关的设备节点。最重要的是确保你以root用户运行Python脚本因为访问NPU硬件通常需要root权限。错误ImportError: numpy.core.multiarray failed to import原因numpy版本不兼容或安装损坏。解决尝试升级或重装numpypip3 install --upgrade --force-reinstall numpy。性能问题Demo跑起来了但推理速度非常慢。原因可能NPU没有成功调用代码回退到了CPU推理。排查在RKNN的初始化配置中可以设置core_maskRKNN_NPU_CORE_0来指定NPU核心。同时检查代码中是否在rknn.init_runtime时传入了targetrk3568参数。确保推理是在NPU上执行的。可以在代码中打印推理时间并与纯CPU推理时间对比。5. 集成与优化从Demo到自己的应用成功运行Demo只是第一步。我们的目标是将RKNN集成到自己的鸿蒙应用或Python服务中。5.1 理解RKNN Lite的Python API工作流一个典型的RKNN Lite推理流程如下这与PC端的rknn-toolkit2非常相似from rknnlite.api import RKNNLite # 1. 创建RKNNLite对象 rknn_lite RKNNLite() # 2. 加载RKNN模型 ret rknn_lite.load_rknn(‘./model.rknn’) if ret ! 0: print(‘Load RKNN model failed’) exit(ret) # 3. 初始化运行时环境指定芯片平台 ret rknn_lite.init_runtime(core_maskRKNNLite.NPU_CORE_0) # 对于RK3568 if ret ! 0: print(‘Init runtime environment failed’) exit(ret) # 4. 推理 # 准备输入数据 (需要根据模型预处理如缩放、归一化、转换维度等) inputs [preprocessed_image_data] outputs rknn_lite.inference(inputs[inputs]) # 5. 后处理输出 # 解析outputs得到检测框、分类结果等 # 6. 释放资源 rknn_lite.release()5.2 模型转换的注意事项在PC端使用rknn-toolkit2转换模型时有几个参数直接影响板端运行target必须设置为‘rk3568’。quantize是否进行量化。量化能大幅减少模型体积和提升NPU推理速度但可能会轻微损失精度。对于部署通常建议开启量化True。dataset量化时需要提供的校准数据集路径。这个数据集不需要标签只需一批代表性的输入图片几十到几百张用于统计激活值分布。数据集的质量直接影响量化后模型的精度。mean_values/std_values预处理参数。必须与模型训练时以及板端推理前处理逻辑保持一致否则精度会严重下降。5.3 在鸿蒙应用中的调用方式如果你开发的是鸿蒙原生应用ArkTS无法直接调用Python的RKNN Lite库。这时需要采用C/S架构Python服务端编写一个独立的Python程序该程序加载RKNN模型并提供一个网络服务如HTTP Server、gRPC或简单的Socket服务或进程间通信IPC接口。鸿蒙客户端鸿蒙应用将需要推理的数据如图片通过定义好的接口发送给Python服务端。推理与返回Python服务端接收数据调用RKNN Lite进行推理然后将结果返回给鸿蒙客户端。另一种更高效但更复杂的方式是直接使用RKNN提供的C API编写一个共享库.so文件然后在鸿蒙的Native层C/C中调用这个库。这需要对鸿蒙的NDK和Native开发有较深了解但性能最好集成度最高。5.4 性能调优技巧输入数据预处理尽量使用numpy进行向量化操作避免在Python中使用慢循环。如果可能将归一化等操作放在模型转换阶段通过设置mean_values和std_values让NPU硬件完成可以节省CPU时间。固定输入尺寸如果应用场景输入图片尺寸固定在模型转换时就固定好输入尺寸避免在板端进行动态缩放。多线程推理RKNN Lite支持异步推理和批量推理。对于流水线作业可以考虑使用生产者-消费者模式一个线程负责数据预处理和加载另一个线程负责推理提高整体吞吐量。功耗与频率RK3568的NPU和CPU频率可以调节。在性能满足要求的情况下适当降低频率可以显著减少功耗和发热。这通常需要通过操作系统的性能管理接口如/sys/class/devfreq/下的节点进行设置。整个过程下来最耗时的部分往往不是安装命令本身而是解决那些因系统环境差异导致的依赖问题。一旦打通了这个环节RK3568的NPU性能在边缘侧确实能带来非常可观的效率提升。我的建议是建立一个属于自己的“基础镜像”在确保RKNN Lite能稳定运行的系统状态时备份整个系统或关键库文件这样在新的项目或重置开发板时就能快速恢复到可用的状态。