【智能硬件】从零部署:RKNN模型转换与端侧推理实战
1. RKNN模型转换基础入门第一次接触RKNN模型转换时我完全被各种专业术语搞晕了。经过几个项目的实战现在终于能把这个过程讲明白了。RKNN其实就是Rockchip NPU专用的模型格式就像iPhone只能用iOS应用一样Rockchip的神经网络处理器也只认.rknn格式的模型文件。模型转换的核心工具是RKNN-Toolkit这个Python工具包支持将主流框架训练的模型转换成NPU能吃的口粮。我常用的转换路径有TensorFlow的.pb或.ckpt文件PyTorch的.pt或.pth文件ONNX通用格式模型实际工作中遇到过最头疼的问题就是环境配置。建议直接用Ubuntu 18.04系统Python版本选3.6或3.7。我整理了个一键安装脚本sudo apt-get install python3-pip pip3 install numpy1.16.3 protobuf3.11.2 pip3 install rknn_toolkit-1.7.1-cp36-cp36m-linux_x86_64.whl装完后一定要测试下基础功能是否正常from rknn.api import RKNN rknn RKNN() print(RKNN版本:, rknn.version())2. 模型转换实战技巧2.1 关键参数配置转换模型时最容易翻车的就是参数配置。以我最近做的图像分类项目为例config配置里这几个参数最关键config { mean_values: [[123.675, 116.28, 103.53]], # 必须与训练时一致 std_values: [[58.395, 57.12, 57.375]], # 归一化参数 quantized_dtype: asymmetric_quantized-u8, # 量化类型 optimization_level: 3, # 优化等级越高速度越快 target_platform: rv1126 # 指定目标硬件 }特别提醒mean_values和std_values如果填错模型精度会直接崩盘。有次项目因为把RGB顺序搞反识别准确率从98%暴跌到30%。2.2 量化策略选择量化是模型瘦身的关键步骤Rockchip支持三种量化方式非对称量化(u8)最常用精度损失小动态定点量化(16位)适合对精度要求高的场景动态定点量化(8位)极致压缩模型体积实测发现MobileNetV2用u8量化后模型体积从12MB→3MB推理速度提升2.3倍精度仅下降0.5%ret rknn.build( do_quantizationTrue, dataset./quantization.txt, # 量化校准数据集 pre_compileFalse )3. 端侧部署全流程3.1 交叉编译环境搭建在RV1126开发板上跑模型需要先配置交叉编译工具链。我常用的配置如下export GCC_COMPILERarm-linux-gnueabihf-gcc mkdir build cd build cmake -DCMAKE_C_COMPILER${GCC_COMPILER} .. make -j4遇到最多的问题是库文件缺失解决方法将板端的/lib目录同步到PC端设置LD_LIBRARY_PATH环境变量编译时添加-static选项静态链接3.2 性能优化技巧在RV1126上部署YOLOv5时通过以下优化将FPS从15提升到28内存池优化复用内存减少分配开销多线程调度NPUCPU协同工作输入输出固定避免内存拷贝rknn_input inputs[1]; inputs[0].index 0; inputs[0].type RKNN_TENSOR_UINT8; inputs[0].size input_size; inputs[0].fmt RKNN_TENSOR_NHWC; inputs[0].buf input_data;4. 常见问题排查指南4.1 模型转换失败最近遇到个典型错误E [convert_to_rknn:384]Unsupported op type: HardSwish解决方法更新RKNN-Toolkit到最新版自定义算子实现修改模型结构替换不支持的算子4.2 精度异常排查当发现板端推理结果异常时我的诊断流程是用PC端模拟推理验证结果检查量化校准数据集是否具有代表性逐层对比浮点模型和量化模型的输出rknn.accuracy_analysis( modelfloat_model.onnx, targetquant_model.rknn, dataset./test_images/ )最近帮客户排查过一个案例因为校准图片全是白天场景导致夜间识别完全失效。扩充数据集后问题解决。