华北地区负责人:17340067106(毛经理)
华东地区负责人:17358670739(甘经理)
华南、华西地区负责人:19113907060(耿女士)
软件算法咨询:18982151213(刘先生)

联系我们
产品咨询

RK1828 + RKNN3 Toolkit 适配PyTorch模型完整部署流程

作者:万物纵横
发布时间:2026-07-02 10:04
阅读量:

RK1828 是 RK3588/RK3576 配套 NPU 协处理器,仅支持 RKNN3 Toolkit V1.0+,PyTorch 模型必须走「PyTorch → ONNX → RKNN3」标准链路,分PC 主机模型转换、开发板端推理部署两大阶段,下文全流程含代码、配置、踩坑要点。


一、环境前置准备(PC 转换主机 + RK1828 开发板)


1. PC 转换主机环境(x86 Ubuntu20.04/22.04,推荐 Conda 虚拟环境)


(1)基础依赖安装


# 1. 创建虚拟环境

conda create -n rknn3 python=3.8

conda activate rknn3


# 2. PyTorch(匹配CUDA,导出ONNX用)

pip3 install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu118


# 3. ONNX链路工具(核心,解决算子不兼容)

pip install onnx onnxsim onnxruntime numpy opencv-python pillow


# 4. RKNN3 Toolkit(RK1828专用,不可用RKNN2)

# 从瑞芯微官网下载 rknn_toolkit3-1.0.0-cp38-cp38-linux_x86_64.whl

pip3 install rknn_toolkit3-1.0.0-cp38-cp38-linux_x86_64.whl


# 校验安装成功

python3 -c "from rknn.api import RKNN; print('RKNN3导入正常')"


关键约束


RKNN3 仅支持 Python3.8;RK1828 target_platform="rk3588"(RK1828 绑定 RK3588/RK3576 主芯片)


禁止混用 RKNN2 Toolkit,转换出的模型无法在 RK1828 运行


2. RK1828 开发板环境(Linux ARM64)


1. 固件要求:系统 SDK 内置RKNN3 Runtime [librknnrt.so](librknnrt.so) v1.0+,旧固件需全量升级


2. 板端依赖包:rknn_api_arm64、交叉编译工具链 aarch64-linux-gnu-gcc


3. 传输工具:ADB/SSH,用于推送 rknn 模型、推理程序、动态库


二、阶段 1:PyTorch 模型导出标准 ONNX(最易踩坑环节)


步骤 1:模型预处理(必须 eval+cpu,禁用动态训练逻辑)


核心规则:


1. 模型切model.eval(),关闭 Dropout/BatchNorm 训练分支


2. 移至 CPU 导出(GPU 导出易出现动态 shape 算子)


3. 固定输入尺寸(推荐静态 shape,动态输入会大幅降低 RK1828 推理速度)


4. 禁用 Torch 自定义算子、torch.where/ 复杂interpolate,尽量替换为标准 ONNX 算子


导出完整代码(通用分类 / 检测模型)


import torch

import torchvision


# 1. 加载训练好的PyTorch模型(.pt/.pth)

model = torchvision.models.resnet18(pretrained=True)

model.eval()

model.cpu()


# 2. 固定输入:NCHW [1,3,640,640] 匹配你的模型输入分辨率

dummy_input = torch.randn(1, 3, 640, 640)


# 3. ONNX导出参数(RKNN3兼容配置)

onnx_path = "model_raw.onnx"

torch.onnx.export(

    model,

    dummy_input,

    onnx_path,

    opset_version=17,          # RKNN3推荐opset16~17,过低算子缺失

    do_constant_folding=True,  # 常量折叠,减少计算节点

    input_names=["input"],

    output_names=["output"],

    dynamic_axes=None,         # 静态输入,注释掉则开启动态shape

)

print(f"原始ONNX导出完成:{onnx_path}")


步骤 2:ONNX 简化 + 校验(必做,解决冗余算子转换失败)


# 1. 模型简化,消除Reshape/Unsqueeze冗余节点

python3 -m onnxsim model_raw.onnx model_simplified.onnx


# 2. 合法性校验,报错则修改PyTorch导出逻辑

python3 -c "

import onnx

m = onnx.load('model_simplified.onnx')

onnx.checker.check_model(m)

print('ONNX模型校验通过')

"


常见导出报错修复


1. interpolate算子异常:替换align_corners=False,onnxsim 二次简化


2. 动态 Batch:删除dynamic_axes强制静态 batch=1


3. 自定义 loss / 推理分支:导出前注释训练相关代码


三、阶段 2:RKNN3 Toolkit 转换 ONNX → RK1828 专用.rknn 模型


RK1828 NPU 支持W8A8 对称 / 非对称 INT8 量化,大模型 LLM 支持 W4A16,CNN 视觉模型默认 W8A8,下面是完整转换脚本onnx2rknn_rk1828.py


完整转换脚本(含量化、仿真推理、模型导出)


from rknn.api import RKNN

import numpy as np


# ====================== 配置区(根据自己模型修改)======================

ONNX_MODEL = "model_simplified.onnx"

RKNN_MODEL = "rk1828_model.rknn"

DATASET_TXT = "./calib_dataset.txt"  # INT8量化校准数据集

TARGET_PLATFORM = "rk3588"           # RK1828配套主芯片固定填rk3588


# 图像预处理均值标准差(PyTorch归一化映射到RKNN NHWC格式)

# 例1:ImageNet归一化 input = img/255 mean / std

mean = [0.485, 0.456, 0.406]

std = [0.229, 0.224, 0.225]

# RKNN要求mean/std乘255,RGB通道顺序

MEAN_VALUES = [[m*255 for m in mean]]

STD_VALUES = [[s*255 for s in std]]

# ======================================================================


# 1. 初始化RKNN3对象

rknn = RKNN(verbose=True)


# 2. RKNN全局配置(适配RK1828 NPU)

print("===== RKNN配置 =====")

rknn.config(

    target_platform=TARGET_PLATFORM,

    mean_values=MEAN_VALUES,

    std_values=STD_VALUES,

    quantized_dtype="asymmetric_quantized-8", # 视觉模型推荐非对称INT8

    quantized_algorithm="normal",

    optimization_level=3,                     # 最高算子优化,释放RK1828算力

    rknn_batch_size=1,

    force_use_cpp_infer=True

)


# 3. 加载简化后的ONNX模型

print("===== 加载ONNX =====")

ret = rknn.load_onnx(model=ONNX_MODEL)

assert ret == 0, "ONNX加载失败,检查opset/算子兼容性"


# 4. 构建+INT8量化模型(核心步骤,使用校准数据集)

print("===== 构建并量化RKNN模型 =====")

ret = rknn.build(do_quantization=True, dataset=DATASET_TXT)

assert ret == 0, "模型构建量化失败"


# 5. PC端仿真推理校验(和PyTorch输出对比,判断量化精度损失)

print("===== PC仿真推理校验 =====")

# 构造测试输入 NCHW

test_input = np.random.randn(1, 3, 640, 640).astype(np.float32)

# RKNN自动转NHWC,无需手动调换通道

output = rknn.inference(inputs=[test_input])

print("RKNN推理输出shape:", output[0].shape)


# 6. 导出RK1828可部署.rknn模型

print("===== 导出RKNN模型 =====")

ret = rknn.export_rknn(RKNN_MODEL)

assert ret == 0, f"导出失败,目标文件:{RKNN_MODEL}"


# 7. 释放资源

rknn.release()

print(f"RK1828模型转换完成:{RKNN_MODEL}")


配套量化校准数据集制作(calib_dataset.txt)


INT8 量化必须提供真实样本校准,降低精度损耗:


1. 选取 100~300 张训练集图片,每行写图片绝对路径


/data/calib/img1.jpg

/data/calib/img2.jpg

/data/calib/img3.jpg

...


2. 脚本读取图片自动做和训练一致的预处理,RKNN 内部完成量化校准


量化策略选型(RK1828 专属)


模型类型

量化方案

参数配置

适用场景

CNN/YOLO 检测 / 分类

W8A8 非对称

quantized_dtype="asymmetric_quantized-8"

工业视觉、摄像头实时推理

ViT / 多模态小模型

W8A8 对称

quantized_dtype="symmetric_quantized-8"

精度敏感场景

LLM 大语言模型

W4A16 AWQ 量化

开启 weight_separate=True

RKLLM 专用大模型推理


四、阶段 3:RK1828 开发板端部署(ARM64 Linux 推理)


1. 板端文件准备


将 PC 生成文件推送至 RK3588 (RK1828) 开发板:


1. rk1828_model.rknn 转换完成模型


2. RKNN3 ARM64 运行时库:librknnrt.so、rknn_api.h


3. C++ 推理 Demo 源码(瑞芯微 RKNN3 SDK 自带示例)


推送命令(ADB):


adb push rk1828_model.rknn /data/ai_model/

adb push rknn_runtime/lib/aarch64-linux-gnu/librknnrt.so /data/ai_model/lib/


2. ARM64 交叉编译推理程序


CMakeLists.txt 核心配置:


cmake_minimum_required(VERSION 3.10)

project(rknn_demo)

set(CMAKE_CXX_STANDARD 11)


# RKNN3头文件&库路径

include_directories(./rknn_runtime/include)

link_directories(./lib)


add_executable(infer_demo main.cc)

target_link_libraries(infer_demo rknnrt)


编译脚本build.sh:


aarch64-linux-gnu-g++ -o infer_demo main.cc -I./include -L./lib -lrknnrt


3. 板端运行推理(RK1828 NPU 调用)


# 进入开发板shell

adb shell

cd /data/ai_model


# 指定RKNN3运行时库路径

export LD_LIBRARY_PATH=./lib:$LD_LIBRARY_PATH


# 运行推理程序,加载RK1828模型

./infer_demo ./rk1828_model.rknn


板端推理核心逻辑(C++ 极简流程)


1. rknn_init 加载.rknn 模型,自动绑定 RK1828 NPU 协处理器


2. 图像预处理:VPU 硬件缩放 + 通道转换 BGR→RGB(减轻 NPU 负载)


3. rknn_input_set 填充 NHWC 格式输入数据


4. rknn_run 调用 RK1828 多核 NPU 并行推理


5. rknn_output_get 获取推理结果,后处理(NMS / 分类解码)


6. rknn_destroy 释放 NPU 硬件资源


五、全链路关键适配要点(RK1828 专属避坑)


1. 数据格式转换(PyTorch NCHW ↔ RKNN NHWC)


PyTorch:[Batch, Channel, H, W]


RK1828 NPU 原生:[Batch, H, W, Channel]


RKNN3 内部自动转置通道,只需在rknn.config填写正确 mean/std,无需手动调换输入维度。


2. 输入预处理对齐(精度损失头号来源)


训练时归一化逻辑必须和 RKNN 配置完全一致:


训练:img = img / 255.0 mean / std


RKNN config:mean_values=[[m*255]], std_values=[[s*255]]


若训练直接归一化到[-1,1],则mean=127.5, std=127.5


3. RK1828 算力优化配置


1. optimization_level=3:开启层融合、算子重排,多核调度优化


2. 静态输入 shape:禁用dynamic_axes,NPU 缓存固定计算图,帧率提升 30%+


3. 多路视频:使用 VPU 硬解码预处理,不占用 CPU 做 resize/crop


4. 常见报错解决方案


1. 转换报错:target_platform 不匹配


RK1828 依附 RK3588 主芯片,必须填target_platform="rk3588",不能填 rk1828


2. 板端加载模型失败:版本不兼容


PC RKNN3 Toolkit 版本必须与板端 [librknnrt.so](librknnrt.so) 完全一致(均 V1.0.x)


3. 量化后精度暴跌


校准数据集数量不足、预处理均值 std 不匹配;改用混合量化hybrid_quantization固定关键卷积层 FP16


4. RK1828 推理速度慢


开启静态输入、优化等级 3;输入分辨率不要超过 NPU 最优尺寸(640×640/1280×720)


六、完整流程总览


1. PyTorch 模型 eval+CPU 导出 ONNX (opset17)


2. onnxsim 简化模型 + onnx 校验


3. RKNN3 配置 RK3588 平台、INT8 量化、输入归一化参数


4. 构建量化 RKNN 模型,PC 仿真推理校验精度


5. 导出.rknn 模型推送至 RK1828 开发板


6. ARM64 交叉编译 RKNN3 Runtime 推理程序


7. 开发板加载模型,调用 RK1828 NPU 完成端侧推理

家具美容培训

家具维修培训

- END -
分享:
留言 留言 试用申请
产品咨询 产品咨询 硬件设备咨询
华北地区负责人:17340067106(毛经理)
华东地区负责人:17358670739(甘经理)
华南、华西地区负责人:19113907060(耿女士)
技术咨询 技术咨询 软件算法咨询
18982151213(刘先生)
微信在线客服 微信在线客服 在线客服
返回官网顶部 返回官网顶部 回到顶部
关闭窗口
产品订购
  • *

  • *

  • *

  • *

  • *