第一次接触瑞芯微RKNN开发的朋友,往往会被环境配置的各种依赖搞得头大。不同版本的Python、系统库冲突、交叉编译工具链缺失...这些问题我都经历过。直到发现用Docker部署RKNN开发环境这个方案,才真正体会到什么叫"开箱即用"。
RKNN作为瑞芯微的神经网络推理框架,最大的优势在于跨平台部署能力。但它的工具链依赖相当复杂,比如:
传统安装方式就像搭积木,稍有不慎就会因为版本冲突全盘崩溃。而Docker的容器化方案直接把所有依赖打包成标准镜像,相当于给你一个预装好所有软件的"开发机"。我实测从零开始部署,用Docker方案比传统方式节省了至少3小时环境调试时间。
瑞芯微官方很贴心地提供了完整工具链的网盘打包(虽然需要提取码rknn)。建议先创建项目目录,比如我习惯用~/rknn_projects,然后依次获取这些关键资源:
bash复制# 创建项目目录
mkdir -p ~/rknn_projects && cd ~/rknn_projects
# 获取官方工具包(需要网络畅通)
git clone https://github.com/airockchip/rknn-toolkit2.git --depth 1
git clone https://github.com/airockchip/rknn_model_zoo.git --depth 1
特别提醒:交叉编译器和NDK的版本必须严格匹配。以RK3568开发板为例:
拿到rknn-toolkit2-v2.3.0-cp38-docker.tar.gz镜像包后,别急着加载。先检查两点:
加载命令很简单:
bash复制docker load --input rknn-toolkit2-v2.3.0-cp38-docker.tar.gz
但这里有个隐藏坑点——如果你的Docker默认存储路径在系统盘,可能遇到空间不足。解决方法是在/etc/docker/daemon.json中配置data-root到更大分区。
基础运行命令文档里都有,我想分享几个实战中特别有用的参数:
bash复制docker run -it --privileged \
-v /dev/bus/usb:/dev/bus/usb \ # USB设备直通(用于连接开发板)
-v ~/rknn_projects:/workspace \ # 项目目录映射
-e DISPLAY=$DISPLAY \ # GUI支持(可视化工具用)
-v /tmp/.X11-unix:/tmp/.X11-unix \ # X11转发
--shm-size=2g \ # 共享内存大小(影响大模型转换)
rknn-toolkit2:2.3.0-cp38
注意privileged权限在正式环境应该用更精细的device cgroup规则替代。如果要在容器内使用GUI工具(如模型可视化),记得先执行xhost +允许显示。
进入容器后,除了文档提到的cmake,这些工具也强烈推荐安装:
bash复制apt-get update && apt-get install -y \
git-lfs \ # 大文件管理(模型下载用)
screen \ # 会话保持
htop \ # 资源监控
libgl1-mesa-glx \ # OpenGL支持
python3-pip
遇到过最头疼的问题是容器内中文乱码,解决方法:
bash复制apt-get install -y locales
locale-gen zh_CN.UTF-8
echo 'export LANG=zh_CN.UTF-8' >> ~/.bashrc
虽然镜像预装了Python3.8,但直接pip install可能破坏原有环境。我的经验是:
bash复制python3 -m venv /workspace/venv
source /workspace/venv/bin/activate
重要依赖的版本锁死示例:
bash复制pip install numpy==1.19.5 opencv-python==4.5.3.56 protobuf==3.20.0
以RetinaFace为例,官方提供的download_model.sh有时下载速度很慢。可以手动替换为国内源:
bash复制# 修改download_model.sh中的下载链接为:
wget https://ghproxy.com/${original_url}
或者预先在宿主机下载好模型,通过映射目录直接使用。对于大模型文件,建议用git lfs管理。
模型转换最关键的dataset.txt生成,文档说的简单,实际有这些坑:
我常用的快速生成命令:
bash复制find /dataset/ -name "*.jpg" | head -n 1500 > dataset.txt
convert.py的隐藏参数很多,比如这些实用选项:
bash复制python convert.py \
--mean_values=[[123.675,116.28,103.53]] \ # 图像归一化参数
--std_values=[[58.395,57.12,57.375]] \ # 图像归一化参数
--quantized_dtype=dynamic_fixed_point-i8 \ # 量化方式
--optimization_level=3 # 优化等级
遇到不支持的算子时,可以尝试:
编译C++ demo时最容易遇到工具链版本问题。关键检查点:
Android编译的完整命令示例:
bash复制ANDROID_NDK_PATH=/workspace/android-ndk-r19c \
./build-android.sh -t rk3568 -a arm64-v8a \
-DCMAKE_CXX_FLAGS="-stdlib=libc++"
adb连接开发板后,这些命令能救命:
bash复制adb root && adb remount # 获取root权限
adb shell setenforce 0 # 关闭SELinux(临时)
adb logcat -c && adb logcat # 清空并查看日志
遇到模型推理异常时,先用rknn_test验证基础功能:
bash复制adb push retinanet.rknn /data
adb shell rknn_test /data/retinanet.rknn
最后提醒:所有操作建议写进Makefile或shell脚本自动化。我在项目里通常会维护: