RK182X系列CNN推理(RK1828型号)
整体框图
Host (RK3588) RK1828 (PCIe AI 协处理器)
────────────────── ─────────────────────
test.jpg (224×224) 8 核 NPU
│ │
▼ │
rknn3_cnn_demo -m -w -i -c 1 -cl 10 -mm │
│ │
▼ │
PCIe Gen3 x4 ──────────────────────────────► NPU 推理 (1 核)
-c(core_mask)必须匹配模型编译时声明的核数,不是 NPU 物理核数:NPU 实际为 8 核(RK1828 PCIe 卡,1d87:182a),MobileNet V2 编译时声明 1 核(用-c 1),Qwen3-1.7B 声明 8 核(用-c 0xff)。当前预装的 mobilenet_v2 只有 FP16 版本(INT8 需自行转换,见 ch05 模型转换)。
1. 前置条件
# 1. RK182X NPU 服务正常
systemctl is-active rknn3.service # → active
ls -l /dev/pcie-rkep-* # → /dev/pcie-rkep-0004:41:00.0
# 2. 已有 MobileNet V2 的 RKNN 模型(参考 ch05)验证:
systemctl is-active rknn3.service输出:
activels -l /dev/pcie-rkep-*输出:
crw------- 1 root root 10, 124 8月20日 16:56 /dev/pcie-rkep-0004:41:00.02. 已部署的模型(FP16)
/userdata/RK1820_RK1828_AI_SDK/examples/gstreamer/MobilenetV2/
├── mobilenetv2-12.rknn 60,352 B # FP16 模型结构
├── mobilenetv2-12.weight 7,037,440 B # FP16 模型权重
├── labels.txt 21 KB # ImageNet 1000 类标签
└── config.json # 模型配置验证文件:
ls -la /userdata/RK1820_RK1828_AI_SDK/examples/gstreamer/MobilenetV2/输出:
-rw-r--r-- 1 linaro linaro 218 2026年 1月28日 config.json
-rw-r--r-- 1 linaro linaro 21675 2026年 1月28日 labels.txt
-rw-r--r-- 1 linaro linaro 60352 2026年 1月28日 mobilenetv2-12.rknn
-rw-r--r-- 1 linaro linaro 7037440 2026年 1月28日 mobilenetv2-12.weight文件大小:
du -h /userdata/RK1820_RK1828_AI_SDK/examples/gstreamer/MobilenetV2/*.{rknn,weight}输出:
60K .../MobilenetV2/mobilenetv2-12.rknn
6.8M .../MobilenetV2/mobilenetv2-12.weight3. 推理测试(FP16,-c 1 单核模型)
rknn3_cnn_demo \
-m /userdata/RK1820_RK1828_AI_SDK/examples/gstreamer/MobilenetV2/mobilenetv2-12.rknn \
-w /userdata/RK1820_RK1828_AI_SDK/examples/gstreamer/MobilenetV2/mobilenetv2-12.weight \
-i /rockchip-test/npu2/model/cat_224x224.jpg \
-c 1 \
-cl 10 \
-mm
-c取值需与模型编译时声明的核数一致:MobileNet V2 声明 1 核 →-c 1(实测正常)。不匹配时报core_mask X is not match with npu core number N!(N 为模型声明的核数)。
工具帮助:
rknn3_cnn_demo --help输出:
Usage:
rknn3_cnn_demo [options]
Options:
-m, --model_path .rknn model path
-w, --weight_path .weight model path
-c, --core_mask core mask
-i, --image_path core mask
-cl, --cnt_loop default:1
-tl, --time_loop(hours)
-id, --device_id
--yuv input image is yuv420sp nv12
-mm, --enable_memory_monitor enable memory monitoring (default: disabled)测试图片:
ls -la /rockchip-test/npu2/model/cat_224x224.jpg输出:
-rwxr-xr-x 1 root root 58701 5月26日 09:09 /rockchip-test/npu2/model/cat_224x224.jpg4. 参数说明
| 参数 | 长选项 | 含义 |
|---|---|---|
-m | --model_path | RKNN 模型路径 |
-w | --weight_path | 权重路径(API 强制要求) |
-i | --image_path | 输入图片(224×224 JPG) |
-c | --core_mask | NPU 核掩码,须匹配模型编译时声明的核数 |
-cl | --cnt_loop | 循环次数 |
-id | --device_id | 设备 ID |
-mm | --enable_memory_monitor | 启用 memory 监控(需 root) |
5. 性能(-c 1 单核模型,10 次平均)
| RunCount | TotalTime | AvgFPS | AvgCost | AvgMemoryUsage | AvgNpuUtilization |
|---|---|---|---|---|---|
| 10 | 45.44 ms | 220.064 | 4.54 ms | unavailable | unavailable |
| 精度 | 单次推理 | FPS | 模型大小 |
|---|---|---|---|
| FP16 | 4.54 ms | 220 | 60KB + 6.8MB |
| INT8 | — | — | — |
-mm需要 root(普通用户会报 Permission denied),推理本身不需 root:sudo rknn3_cnn_demo ... -mm
6. 对比:CNN 与 LLM 的 -c 参数
| 模型类型 | 模型声明核数 | 推荐 -c |
|---|---|---|
| CNN(MobileNet V2) | 1 | 1 / 0x01 |
| LLM(Qwen3-1.7B) | 8 | 0xff |
7. 获取更多精度版本
# 下载 ONNX 源模型
cd /userdata/RK1820_RK1828_AI_SDK/rknn/rknn3-model-zoo/examples/mobilenet_v2/model
bash download_model.sh
# → 下载到 mobilenetv2-12.onnx
# 用 rknn3-toolkit 转 INT8 RKNN(参考 ch05)8. 常见问题
| 现象 | 原因 | 处理 |
|---|---|---|
core_mask X is not match with npu core number N! | -c 与模型核数不匹配 | MobileNetV2 用 -c 1,LLM 用 -c 0xff |
Permission denied (开 -mm 时) | 普通用户无权限 | 加 sudo |
rknn_load_model failed! ret=-2 | 模型架构不匹配 | 确认是 RK1828 版(不是 RK356X/RK3588 版) |
weight_path is null or empty! | 缺 -w 参数 | 加 -w <path>.weight |
