从零部署RK3588 NPU:Ubuntu环境下的RKNN-Toolkit2实战指南
1. 认识RK3588 NPU开发环境第一次接触RK3588的NPU开发时我完全被这块芯片的性能震撼到了。作为瑞芯微2022年推出的旗舰级处理器RK3588不仅拥有八核64位CPU和Mali-G610 GPU更重要的是集成了6TOPS算力的NPU神经网络处理单元。这意味着什么简单来说你可以用它实时处理4路1080p视频的AI分析或者以超过30FPS的速度运行YOLOv5这样的目标检测模型。我在自己的开发环境配置中选择了Ubuntu 18.04系统这个版本在兼容性方面表现非常稳定。不过要注意的是官方推荐使用Python 3.6-3.8版本太新的Python反而会遇到各种依赖冲突。我的开发机配置其实很普通一台老旧的i7-6700笔记本16GB内存通过VMware虚拟机运行Ubuntu刚开始我犯了个错误直接用了Ubuntu 20.04和Python 3.9结果在安装RKNN-Toolkit2时踩了不少坑。后来重装系统才解决所以强烈建议新手严格按官方推荐的环境配置。2. 基础环境搭建全流程2.1 系统级依赖安装在Ubuntu中打开终端第一件事就是安装基础依赖。这里有个小技巧先更新apt源避免后续安装时找不到包sudo apt update sudo apt upgrade -y接着安装必备的系统库这些是RKNN-Toolkit2运行的基础sudo apt-get install -y python3 python3-dev python3-pip \ libxslt1-dev zlib1g zlib1g-dev libglib2.0-0 \ libsm6 libgl1-mesa-glx libprotobuf-dev gcc我遇到过libgl1-mesa-glx安装失败的情况这是因为虚拟机没有启用3D加速。解决方法是在VMware设置中勾选加速3D图形然后重启虚拟机。2.2 Python环境配置RKNN-Toolkit2对Python包版本要求非常严格建议使用virtualenv创建隔离环境python3 -m pip install --upgrade pip python3 -m pip install virtualenv virtualenv -p python3 rknn_env source rknn_env/bin/activate接下来安装指定版本的Python包。这里有个关键点必须按顺序安装否则会出现依赖冲突。我的经验是先装numpy和protobufpip install numpy1.16.6 protobuf3.12.0然后一次性安装其他依赖建议保存为requirements.txtonnx1.7.0 onnxruntime1.6.0 tensorflow1.14.0 torch1.6.0 opencv-python4.4.0.46安装时如果遇到No matching distribution found错误可以尝试从whl文件安装。比如onnxruntime的问题我就是从PyPI下载了linux版本的whl文件然后手动安装pip install onnxruntime-1.6.0-cp36-cp36m-linux_x86_64.whl3. RKNN-Toolkit2安装与验证3.1 工具包安装实战从官网下载RKNN-Toolkit2的whl文件后安装命令很简单pip install rknn_toolkit2-1.3.0_11912b58-cp36-cp36m-linux_x86_64.whl但这里有个隐藏坑点如果之前安装过其他版本的RKNN-Toolkit必须先彻底卸载否则会出现莫名其妙的错误。我建议执行以下清理命令pip uninstall rknn_toolkit2 -y rm -rf ~/.rknn安装完成后用这个简单的Python脚本验证是否成功from rknn.api import RKNN print(RKNN-Toolkit2导入成功)如果运行时报错缺少库通常是libGL.so.1的问题解决方法是sudo apt install libgl1-mesa-glx3.2 开发板连接配置通过USB连接RK3588开发板后需要配置ADB连接。我遇到过设备不识别的情况解决方法分三步检查USB连接模式是否设置为传输文件在开发板上启用USB调试模式在Ubuntu中添加udev规则echo SUBSYSTEMusb, ATTR{idVendor}2207, MODE0666 | sudo tee /etc/udev/rules.d/51-android.rules sudo udevadm control --reload-rules连接成功后用以下命令检查设备adb devices看到类似ff3c685cc52f4821 device的输出就表示连接成功。如果显示未授权需要在开发板上点击允许USB调试。4. 模型部署与性能测试4.1 更新板端运行时库在运行模型前必须更新开发板上的两个关键文件adb root adb remount adb push librknnrt.so /vendor/lib64/ adb push rknn_server /vendor/bin/ adb shell chmod x /vendor/bin/rknn_server adb reboot这里有个常见错误adb root失败。解决方法是在开发板上执行adb shell setprop persist.sys.root_access 3然后重新尝试adb root。如果还是不行检查开发板是否已开启root权限。4.2 YOLOv5模型测试实战以YOLOv5s模型为例完整的部署流程如下从ONNX模型转换到RKNN格式rknn RKNN() rknn.config(target_platformrk3588) rknn.load_onnx(modelyolov5s.onnx) rknn.build(do_quantizationTrue, dataset./dataset.txt) rknn.export_rknn(./yolov5s.rknn)在开发板上运行推理rknn.load_rknn(path./yolov5s.rknn) ret rknn.init_runtime(targetrk3588) outputs rknn.inference(inputs[input_data])我在测试时发现量化后的模型精度下降明显后来调整了量化策略rknn.build(do_quantizationTrue, dataset./dataset.txt, quantized_dtypeasymmetric_quantized-8, quantized_algorithmnormal)这样处理后mAP精度从原来的0.82提升到了0.87接近原始ONNX模型的0.89。4.3 性能优化技巧通过adb可以监控NPU的使用情况adb shell cat /sys/kernel/debug/rknpu/load实测YOLOv5s的推理时间约28ms相当于35FPS。如果想进一步提升性能可以固定CPU频率adb shell echo performance /sys/devices/system/cpu/cpufreq/policy0/scaling_governor启用NPU低延迟模式rknn.init_runtime(targetrk3588, perf_debugTrue)使用多线程推理rknn.init_runtime(targetrk3588, core_maskRKNN.NPU_CORE_0_1_2)5. 常见问题解决方案5.1 版本冲突问题最常见的错误是protobuf版本冲突症状是导入rknn时报错TypeError。解决方法pip uninstall protobuf -y pip install protobuf3.12.0如果遇到numpy相关错误可以尝试pip install numpy1.16.6 --force-reinstall5.2 模型转换失败当ONNX模型转换失败时建议检查onnx版本是否为1.7.0简化模型结构移除不必要的算子使用官方提供的模型转换示例作为模板我遇到过一个特殊案例带Slice算子的模型转换失败解决方法是在导出ONNX时添加opset_version11参数。5.3 ADB连接异常如果adb devices看不到设备尝试重启adb服务adb kill-server adb start-server更换USB线有些线只能充电不能传输数据检查虚拟机USB设置是否已连接设备开发过程中保持开发板供电稳定也很重要我遇到过几次NPU运算时突然断电导致模型损坏的情况。