跳到主要内容

RK1820

RK182X是一款AI协处理器, 与rk3588/rk3576相结合, 通过PCIe通信能灵活、快速的、高效地使用。本文旨在帮助开发者快速熟悉 RK182X 系列 AI 协处理器的硬件特性、软件环境、开发流程及性能优化方法,从而高效地将 AI 算法部署到 RK182X 的硬件平台上。

1. 概述

RK182X协处理器工作模式,即主控SoC通过PCIe/USB高速接口连接RK182X协处理器。

  • 主控SoC(Host):作为系统核心,负责任务调度、资源分配和整体控制。
  • RK182X协处理器(Device):作为AI计算加速单元,专注于高性能神经网络推理任务。
  • PCIe/USB高速接口(通信接口):实现主控与协处理器之间的低延迟、高带宽数据交互。

1.1 开发框架

  • PC端开发环境,包含RKNN3 Toolkit、RKNN3 Model Zoo等。
    • RKNN3 Toolkit:是一个软件开发工具包,可将PyTorch、ONNX等深度学习框架训练的模型转换为RKNN格式,支持用户进行模型转换、推理和性能评估;
    • RKNN3 Model Zoo:提供了丰富的模型转换示例,涵盖多种AI模型类型。
  • 板端开发环境,包含RKNN3 Runtime、AI应用Examples、工具集合、驱动等。
    • RKNN3 Runtime:模型转换完成后,可在开发板上使用RKNN3 API加载和运行RKNN模型。除RKNN3 API外,还支持OpenAI兼容API调用LLM模型;
    • Examples:结合实际应用,提供模型应用参考示例;
    • 工具集合:如用于调试的RKNN-SMI和RKNN Console;
    • 驱动:提供RK182X PCIe EP驱动。
    • RK182X协处理器:提供固件,通过PCIe/USB高速接口与主控SoC互联。
模块名功能部署环境
RKNN3 ToolkitPC端开发套件,用户可通过RKNN3 Toolkit将PyTorch、ONNX等深度学习框架训练的模型转换为RKNN格式PC
RKNN3 Model Zoo模型转换部署示例,涵盖多种AI模型类型,包括CNN模型、LLM模型、VLM模型PC
RKNN3 Runtime板端运行时序,RKNN 硬件加速接口库,使用RKNN3 API加载和运行RKNN模型Host
RKNN-SMI系统级调试和管理工具Host
RKNN Console调试终端工具Host
Drivers提供RK1820 PCIe EP驱动,其他接口则为通用驱动Host
Examples提供模型应用参考示例Host
Firmware提供预编译RK1820固件Device

1.2 支持平台

SDK版本Host平台Device平台(通信接口)
Alpha V0.0.1RK3588, RK3576RK1820(PCIe)
Alpha V0.0.2RK3588, RK3576RK1820(PCIe)

2. 环境准备

本文档将以Neardi LKD3588 搭配 RK1820 SODIMM 模组进行开发说明,需要准备以下环境:

  • Host: Neardi LKD3588
  • Device: 以下RK1820硬件之一
    • RK1820 SODIMM 模组
    • RK1820 SODIMM 模组 + PCIe EXT Board
  • LKD3588 预编译固件
  • RK1820 SODIMM 预编译软件安装包

2.1 硬件说明

配套该SDK的官方参考硬件有:

序号硬件名描述
1RK1820 SODIMMRK1820 SODIMM模组,模组采用260PIN内存余金手指接口,配套RK3588 EVB10做集成验证,也可设计开发底板配套使用,实现快速开发及其应用
2PCIe EXT BoardPCIe EXT Board可适配RK1820 SODIMM模组,外扩32GB eMMC并扩展USB3.0 OTG口、USB2.0 HOST口、GE-RJ45、FAN等,通过标准64Pin PCIe金手指与HOST端连接
3LKD3588LKD3588 可作为Host平台使用

3. RK1820 SDK

RK1820 SDK 是一个功能完备的软件开发套件,主要包含以下部分:

路径/文件说明
build.sh -> scripts/common/build.shSDK 编译脚本
docsSDK 文档
driver驱动程序,用于 Host 与 RK182X 硬件通信
examples示例代码,覆盖 CNN 和 LLM 等多种应用场景
gstreamerGStreamer 插件源码
rockit_yolo_detect预编译固件、工具集
web
pkgroot
rkmnRKNN3 工具集
rkmn3-model-zoo提供LLW/VLM/CNN模型转换示例等
rkmn3-runtime运行时序,提供 C++ 和 Python API,供应用程序调用
rkmn3-toolkit核心开发工具链,用于模型转换、量化和优化
rkmn-gstreamer-pluginsRKNN GStreamer 插件源码
scriptsSDK 脚本集合

3.1 PC 环境

系统推荐使用 Ubuntu 22.04 或更高版本的系统进行编译,文档下述操作均基于Ubuntu 22.04验证。

使用如 apt-get命令安装后续操作所需的库和工具:

sudo apt-get update && sudo apt-get install git make gcc python-is-python3 python2

3.2 配置和编译

3.2.1 SDK配置

SDK默认配置为 SODIMM 板卡。

如果配置方案和实际不符,可以通过 ./build.sh config 重新配置。

Select board type:
1) RK1820 EVB1
2) RK1820 SODIMM
3) RK1820 M2
4) Cancel
#?

3.2.2 编译

进入SDK根目录,执行编译脚本:

# PC端执行
./build.sh

生成的软件安装包在 output/firmware/rknn3_rk182x_sodium_installer_arm64.tgz。

4. Host环境准备

4.1 PCIe驱动安装

4.1.1 驱动文件结构

├── pcie-rkep
│   ├── Makefile
│   ├── pcie-dw-dmatest.c
│   ├── pcie-dw-dmatest.h
│   ├── pcie-rkep.c
│   ├── rk-pcie-ep.h
│   └── rockchip-pcie-dma.h
├── README_CN.md
└── README_EN.md

4.1.2 驱动编译

驱动的编译分为两种方式,KO方式与内建方式,可根据实际情况选择合适的编译方式。

编译时, kernel开启以下开关以开启相关功能支持:

# 启用 Rockchip PCIe EP 功能支持  
CONFIG_PCIE_FUNC_RKEP=y
CONFIG_PCIE_DM_DMATEST=y

驱动加载成功后,系统将创建设备节点:

linaro@linaro-alip:~$ ls -l /dev/pcie-rkep-*
crw------- 1 root root 10, 119 6月26日 14:58 /dev/pcie-rkep-0003:31:00.0

4.2 环境验证

RK1820 启动后,可以使用 rknn-smi 来获取信息:

linaro@linaro-alip:~$ sudo rknn-smi info
+-----------------------+---------------+---------------------------------------------------------------+
| rknn-smi Version: 1.0.0 |
+=======================+===============+===============================================================+
| Device | Health | Power(mW) Npu(%) Hugepages-Usage(page) |
| Chip Name | Bus-Id | Temp(C) Memory-Usage(MB) |
+=======================+===============+===============================================================+
| 0 | OK | 0 0 0 / 0 |
| 0 RK1820 | 0003:31:00.0 | 42 281 / 2560 |
+=======================+===============+===============================================================+

4.3 调试工具

4.3.1 rknn-smi

rknn-smi (System Management Interface) 工具用于 RK1820 设备信息收集、功能配置、日志管理等功能。

完整功能使用参考 docs/tools/Rockchip_User_Guide_RKNN-SMI_Tool_CN.pdf

4.3.2 版本信息

linaro@linaro-alip:~$ sudo rknn-smi -v
rknn-smi version : 1.0.0
PCIe driver version : 3.2.0
RC chips connect version : 3.2.0
EP chips connect version : 3.2.0
PCIe Device 0 firmware version: 0.0.2
linaro@linaro-alip:~$ sudo rknn-smi info -l
Device Count : 1
Device ID : 0
Communication mode : PCIe
Product Name : RM1820SA0
Serial Number : A10CB253900020
Chip Count : 1
Chip ID : 0
Chip Name : RK1820

4.3.3 性能模式

可通过rknn-smi调整RK1820性能档位,支持0-EFFICIENT, 1-NORMAL, 2-PERFORMANCE。

linaro@linaro-alip:~$ sudo rknn-smi set -t work_mode -s 1
Successfully set device 0 chip 0 work mode to 1

4.3.4 rknn-console

rknn-console工具用于在HOST端通过PCIe来模拟RK1820端的控制台,实现对RK1820的控制和调试

linaro@linaro-alip:~$ sudo rknn-console rk1820
ep dev max num : 1
08:01:11.608 I [cmp_pcie_rc: cc_cmp_pcie_device: 505] rk pcie tiny version: 30200
08:01:11.608 I [cmp_pcie_rc: cc_cmp_pcie_device: 519] using rc dma: 0, chn: 0
08:01:11.608 I [cmp_pcie_rc: cc_cmp_pcie_device: 522] use dma only in rc: 0
08:01:11.608 D [chipscon: cc_kernel_api_prob: 427] open rkep: /dev/pcie-rkep-0003:31:00.0 Success.
08:01:11.608 D [chipscon: cc_kernel_api_prob: 432] probe pcie_rkep, fd = 3
08:01:11.608 D [core_pcie_rc: cc_core_pcie_dev_i: 65] bar0 size=0x400000
08:01:11.609 D [core_pcie_rc: cc_core_pcie_dev_i: 65] bar1 size=0x100000
08:01:11.609 D [core_pcie_rc: cc_core_pcie_dev_i: 65] bar2 size=0x4000000
08:01:11.609 D [core_pcie_rc: cc_core_pcie_dev_i: 65] bar4 size=0x100000
08:01:11.609 D [core_pcie_rc: cc_core_pcie_dev_i: 65] bar5 size=0x100000
08:01:11.609 I [pcie_dma: cc_core_pcie_dma_i: 460] - id=182a1d87
08:01:11.609 I [pcie_dma: cc_core_pcie_dma_i: 469] - magic=524b4550, ver=1
08:01:11.609 I [pcie_dma: cc_core_pcie_dma_i: 471] - rc_cc_version=30200
08:01:11.609 I [pcie_dma: cc_core_pcie_dma_i: 472] - ep_cc_version=30200
08:01:11.609 I [pcie_dma: cc_core_pcie_dma_i: 473] - bar0_reserved=48000
08:01:11.609 I [pcie_dma: cc_core_pcie_dma_i: 474] - bar1_reserved=58000
08:01:11.609 I [pcie_dma: cc_core_pcie_dma_i: 475] - bar5_reserved=60000
08:01:11.609 I [pcie_dma: cc_core_pcie_dma_i: 497] - bar2 bus_addr=0x9c0000000, cpu_addr=0x1200000000
08:01:11.609 I [chipscon: cc_kernel_api_dbi_: 366] chip info: rk3588
08:01:11.609 D [hugepage_mem: hugepage_mem_init: 183] huagepage mem init success hugepage_manager 0x29ceb900
PCIE VUART RC (Version 0x10000000) started
Line buffered mode: Input will be sent to EP on newline
08:01:11.609 D [cmp_pcie_rc: pcie_task_rc_msg_t: 293] [0003:31:00.0] start
Press Ctrl+X to exit
RX polling thread started

msh />
Ctrl+X pressed, exiting...
08:01:19.614 D [cmp_pcie_rc: pcie_task_rc_msg_t: 321] [0003:31:00.0] end
PCIE VUART RC application terminated
linaro@linaro-alip:~$

5. 开发流程

RK1820支持模型、模型性能、模型精度、使用限制、性能测试、精度测试方案可参考rknn/rknn3-runtime/doc/00_Rockchip_RK1820_ReleaseNote_RKNN3_SDK_V0.3.0b0_CN.pdf

RK1820 模型部署流程可参考 rknn/rknn3-runtime/doc/01_Rockchip_RK1820_Quick_Start_RKNN3_SDK_V0.3.0b0_CN.pdf。

5.1 模型转换

模型转换工具路径为 rknn/rknn3-toolkit/,部署时可参考该目录下的文档。 在PC上面安装rknn3-toolkit/packages里的必要包, 如下:

linx@ubuntu2204-docker:~/rk1820/rknn/rknn3-toolkit/packages$ pip3 install -r requirements_cp310-0.3.0b0.txt
Downloading transformers-4.51.3-py3-none-any.whl (10.4 MB)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 10.4/10.4 MB 343.7 kB/s eta 0:00:00
Requirement already satisfied: pillow in /mnt/data/linx/.local/lib/python3.10/site-packages (from -r requirements_cp310-0.3.0b0.txt (line 15)) (11.1.0)
Collecting sentencepiece
Downloading sentencepiece-0.2.1-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl (1.4 MB)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 1.4/1.4 MB 3.5 MB/s eta 0:00:00
Collecting tabulate
Downloading tabulate-0.9.0-py3-none-any.whl (35 kB)

环境安装成功后就可以进行模型转换, 如下:

linx@ubuntu2204-docker:~/rk1820/rknn/rknn3-model-zoo/examples/yolov8/python$ python3 convert.py ../model/yolov8n_rknn3.onnx rk1820
I version: rknn3-toolkit 0.3.0(baf68a1c@2025-09-19T02:29:11)
--> Config model
subgraph: [[['/model.22/dfl_2/Softmax_output_0_sw', '/model.22/dfl_1/Softmax_output_0_sw', '/model.22/dfl/Softmax_output_0_sw', '/model.22/Reshape_11_output_0', '/model.22/Reshape_10_output_0', '/model.22/Reshape_9_output_0', '/model.22/Reshape_2_output_0', '/model.22/Reshape_output_0'], ['693'], 'w16a16']]
done
--> Loading model
I Loading : 100%|██████████████████████████████████████████████| 127/127 [00:00<00:00, 39823.31it/s]
done
--> Building model
I FoldConstant : 100%|███████████████████████████████████████████| 369/369 [00:00<00:00, 740.46it/s]
I OpFusing 0: 100%|██████████████████████████████████████████████| 100/100 [00:00<00:00, 342.10it/s]
I OpFusing 1 : 100%|█████████████████████████████████████████████| 100/100 [00:00<00:00, 180.78it/s]
I OpFusing 0 : 100%|██████████████████████████████████████████████| 100/100 [00:01<00:00, 68.64it/s]
I OpFusing 1 : 100%|██████████████████████████████████████████████| 100/100 [00:01<00:00, 64.27it/s]
I OpFusing 0 : 100%|██████████████████████████████████████████████| 100/100 [00:01<00:00, 61.54it/s]
I OpFusing 1 : 100%|██████████████████████████████████████████████| 100/100 [00:01<00:00, 60.00it/s]
I OpFusing 2 : 100%|██████████████████████████████████████████████| 100/100 [00:01<00:00, 56.12it/s]
I OpFusing 0 : 100%|██████████████████████████████████████████████| 100/100 [00:01<00:00, 54.05it/s]
I OpFusing 1 : 100%|██████████████████████████████████████████████| 100/100 [00:01<00:00, 52.91it/s]
I OpFusing 2 : 100%|██████████████████████████████████████████████| 100/100 [00:01<00:00, 52.74it/s]
I FoldConstant : 100%|███████████████████████████████████████| 229/229 [00:00<00:00, 550.91it/s]

这里会生成rknn模型, 如下:

linx@ubuntu2204-docker:~/rk1820/rknn/rknn3-model-zoo/examples/yolov8/model$ ls
bus.jpg coco_80_labels_list.txt dataset.txt download_model.sh yolov8n_rknn3.onnx yolov8n_rknn3.rknn yolov8n_rknn3.weight

5.2 应用开发

把转换后的模型拷贝到板端, 并编译yolov8 demo, 编译之前修改toolchain, 如下:

diff --git a/build-linux.sh b/build-linux.sh
index 4467884..d1954b4 100755
--- a/build-linux.sh
+++ b/build-linux.sh
@@ -53,7 +53,9 @@ if [ -z ${TARGET_SOC} ] || [ -z ${BUILD_DEMO_NAME} ]; then
exit -1
fi

+GCC_COMPILER=aarch64-linux-gnu
echo "$GCC_COMPILER"
export CC=${GCC_COMPILER}-gcc
export CXX=${GCC_COMPILER}-g++

再执行如下命令:

linaro@linaro-alip:/userdata/RK182X_AI_COPROCESSOR_SDK/ALPHA_V0.0.2/rknn/rknn3-model-zoo$ ./build-linux.sh -t rk3588 -a aarch64 -d yolov8 -b Release
./build-linux.sh -t rk3588 -a aarch64 -d yolov8 -b Release
aarch64-linux-gnu
===================================
BUILD_DEMO_NAME=yolov8
BUILD_DEMO_PATH=examples/yolov8/cpp
TARGET_SOC=rk3588
TARGET_ARCH=aarch64
BUILD_TYPE=Release
ENABLE_ASAN=OFF
DISABLE_RGA=OFF
DISABLE_LIBJPEG=OFF
INSTALL_DIR=/userdata/RK182X_AI_COPROCESSOR_SDK/ALPHA_V0.0.2/rknn/rknn3-model-zoo/install/rk3588_linux_aarch64/rknn_yolov8_demo
BUILD_DIR=/userdata/RK182X_AI_COPROCESSOR_SDK/ALPHA_V0.0.2/rknn/rknn3-model-zoo/build/build_rknn_yolov8_demo_rk3588_linux_aarch64_Release
CC=aarch64-linux-gnu-gcc
CXX=aarch64-linux-gnu-g++
===================================
-- !!!!!!!!!!!CMAKE_SYSTEM_NAME: Linux

生成如下可执行文件:

linaro@linaro-alip:/userdata/RK182X_AI_COPROCESSOR_SDK/ALPHA_V0.0.2/rknn/rknn3-model-zoo/install/rk3588_linux_aarch64/rknn_yolov8_demo$ tree .
.
├── dataset_eval
├── lib
│   ├── librga.so
│   └── librknn3_api.so
├── model
│   ├── bus.jpg
│   ├── coco_80_labels_list.txt
│   ├── yolov8n_rknn3.rknn
│   └── yolov8n_rknn3.weight
└── rknn_yolov8_demo

最后, 运行推理程序:

linaro@linaro-alip:/userdata/RK182X_AI_COPROCESSOR_SDK/ALPHA_V0.0.2/rknn/rknn3-model-zoo/install/rk3588_linux_aarch64/rknn_yolov8_demo$ ./rknn_yolov8_demo ./model/yolov8n_rknn3.rknn ./model/yolov8n_rknn3.weight ./model/bus.jpg 1
load lable ./model/coco_80_labels_list.txt
--> init model
model input num: 1, output num: 1
input tensors:
Tensor: name=images, n_dims=4, shape=[1, 640, 640, 3], stride=[1228800, 1920, 3, 1], aligned_size=1228800, layout=NHWC, dtype=UINT8, core_id=0, qnt_type=PER_LAYER_ASYMMETRIC
output tensors:
Tensor: name=693, n_dims=3, shape=[1, 256, 6], stride=[1536, 6, 1], aligned_size=3072, layout=UNDEFINED, dtype=FP16, core_id=0, qnt_type=NONE
model is NHWC input fmt
model input height=640, width=640, channel=3
origin size=640x640 crop size=640x640
input image: 640 x 640, subsampling: 4:2:0, colorspace: YCbCr, orientation: 1
--> inference model
scale=1.000000 dst_box=(0 0 639 639) allow_slight_change=1 _left_offset=0 _top_offset=0 padding_w=0 padding_h=0
rga_api version 1.10.1_[0]
Pre-process time: 1.99 ms
-->rknn_run
Inference time: 26.74 ms
Post-process time: 0.02 ms
Total time: 28.74 ms
person @ (211 241 282 507) 0.856
person @ (109 235 224 536) 0.856
bus @ (101 134 550 457) 0.853
person @ (477 225 561 521) 0.845
person @ (79 327 117 513) 0.270
write_image path: out.png width=640 height=640 channel=3 data=0x7f93916010

输出结果如下: