RK3588 平台

大语言模型

1.RKLLM 介绍

RKLLM SDK可以帮助用户快速将大语言模型部署到RK182X开发套件上。 SDK下载

1.1 RKLLM-Toolkit 功能介绍

RKLLM-Toolkit 是为用户提供在计算机上进行大语言模型的量化、转换的开发套件。通过该工具提供的 Python 接口可以便捷地完成以下功能:

  • 模型转换:支持将 Hugging Face 格式的大语言模型(Large Language Model, LLM)转换为RKLLM 模型,转换后的 RKLLM 模型能够在 Rockchip NPU 平台上加载使用。

  • 量化功能:支持将浮点模型量化为定点模型,目前支持的量化类型包括 w4a16 和 w8a8。

1.2 RKLLM Runtime 功能介绍

RKLLM Runtime 主 要 负 责 加 载 RKLLM-Toolkit 转换得到的 RKLLM 模型,并在RK182X开发套件 板端通过调用 NPU 驱动在 Rockchip NPU 上实现 RKLLM 模型的推理。在推理RKLLM 模型时,用户可以自行定义 RKLLM 模型的推理参数设置,定义不同的文本生成方式,并通过预先定义的回调函数不断获得模型的推理结果。

2.RKLLM-Toolkit 安装

RKLLM-Toolkit目前只适用于Linux PC,建议使用Ubuntu20.04(x64)。因为系统中可能同时有多个版本的 Python 环境,建议使用 miniforge3 管理 Python 环境。

# 检查是否安装 miniforge3 和 conda 版本信息,若已安装则可省略此小节步骤。
conda -V
# 下载 miniforge3 安装包
wget -c https://mirrors.bfsu.edu.cn/github-release/conda-forge/miniforge/LatestRelease/Miniforge3-Linux-x86_64.sh
# 安装 miniforge3
chmod 777 Miniforge3-Linux-x86_64.sh
bash Miniforge3-Linux-x86_64.sh
# 进入Conda base 环境,miniforge3 为安装目录
source ~/miniforge3/bin/activate
# 创建一个 Python3.8 版本(建议版本)名为 RKLLM-Toolkit 的 Conda 环境
conda create -n RKLLM-Toolkit python=3.8
# 进入 RKLLM-Toolkit Conda 环境
conda activate RKLLM-Toolkit
# 安装 RKLLM-Toolkit,如rkllm_toolkit-1.1.4-cp38-cp38-linux_x86_64.whl
pip3 install rkllm-toolkit/rkllm_toolkit-1.1.4-cp38-cp38-linux_x86_64.whl

若执行以下命令没有报错,则安装成功。

python
from rkllm.api import RKLLM

3.大语言模型部署例程

RKLLM已支持的大模型如下

Model Huggingface Link
DeepSeek-R1-Distill LINK
LLAMA LINK
TinyLLAMA LINK
Qwen LINK
Phi LINK
ChatGLM3-6B LINK
Gemma LINK
InternLM2 LINK
MiniCPM LINK
TeleChat LINK
Qwen2-VL LINK
MiniCPM-V LINK

3.1 大语言模型转换运行Demo

下面以RKLLM SDK的rkllm_api_demo为例演示如何转换、量化、导出大语言模型,最后在板端部署运行。

3.1.1 在 PC 上转换模型

以DeepSeek-R1-Distill-Qwen-1.5B 模型为例,依据表格链接,找到对应模型仓库,克隆完整仓库内容。 在前述RKLLM-Toolkit安装正确的前提下,进入 Conda 环境。然后执行generate_data_quant.py生成量化标定数据。

# 注意设置正确的模型仓库路径
cd rknn-llm/examples/rkllm_api_demo/export
python3 generate_data_quant.py -m ~/DeepSeek-R1-Distill-Qwen-1.5B

如下按实际情况修改export_rkllm.py之后。执行export_rkllm.py。即可得到转换模型。

# 修改为实际路径
modelpath = '/rkllm/rkllm_model/DeepSeek-R1-Distill-Qwen-1.5B'
# 对于 RK3576, 量化方式为W4A16,且为双核NPU。RK3588则无需修改。
target_platform = "RK3576"
quantized_dtype = "W4A16"
num_npu_core = 2
lanzj@DL-Station:~/rknn-llm/examples/rkllm_api_demo/export$ python3 export_rkllm.py
INFO: rkllm-toolkit version: 1.2.3
Building model: 100%|█████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 371/371 [00:05<00:00, 69.25it/s]
Generating train split: 21 examples [00:00, 2604.93 examples/s]
Optimizing model: 100%|█████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 28/28 [00:26<00:00,  1.07it/s]
WARNING: The bos token has two ids: 151646 and 151643, please ensure that the bos token ids in config.json and tokenizer_config.json are consistent!
INFO: Setting token_id of bos to 151646
INFO: Setting token_id of eos to 151643
INFO: Setting add_bos_token to True
INFO: Setting add_eos_token to False
Converting model: 100%|██████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 339/339 [00:00<00:00, 4499585.62it/s]
INFO: Setting max_context_limit to 4096
INFO: Exporting the model, please wait ....
[=================================================>] 597/597 (100%)
INFO: Model has been saved to ./DeepSeek-R1-Distill-Qwen-1.5B_W8A8_RK3588.rkllm!
3.1.2 在 RK182X开发套件 上部署运行RKLLM模型
3.1.2.1 板端内核要求

在板端使用RKLLM Runtime 进行模型推理前,首先需要确认板端的NPU 内核是否为v0.9.8版本以上

root@firefly:/# cat /sys/kernel/debug/rknpu/version
RKNPU driver: v0.9.8

若所查询的 NPU 内核版本低于 v0.9.8,请前往官方固件地址下载最新固件进行更新

3.1.2.2 RKLLM Runtime 的编译要求

在使用 RKLLM Runtime 的过程中,需要注意gcc交叉编译工具的版本。推荐下载交叉编译工具gcc-arm-10.3-2021.07-x86_64-aarch64-none-linux-gnu。 若是选择使用 Android 平台,需要进行 Android 可执行文件的编译,推荐使用 Android NDK 工具进行交叉编译,下载路径为:Android_NDK 交叉编译工具下载地址,推荐使用 r21e 版本。

cd rknn-llm/examples/rkllm_api_demo/
# Linux 平台
# 修改 build-linux.sh,设置交叉编译器路径为本地工具所在路径
GCC_COMPILER_PATH=~/gcc-arm-10.3-2021.07-x86_64-aarch64-none-linux-gnu/bin/aarch64-none-linux-gnu
# 编译
./build-linux.sh
# Android 平台
# 修改 build-linux.sh,设置交叉编译器路径为本地工具所在路径
ANDROID_NDK_PATH=~/android-ndk-r21e
# 编译
./build-android.sh
3.1.2.3 板端运行推理

编译完成后生成目录:install/demo_Linux_aarch64,将所需文件推送到设备端,若板端不支持adb也可通过scp发送。

# 推送目录到设备端
adb push install/demo_Linux_aarch64 /data
# 推送转换好的模型到设备端
adb push rknn-llm/examples/rkllm_api_demo/export/DeepSeek-R1-Distill-Qwen-1.5B_W8A8_RK3588.rkllm /data/demo_Linux_aarch64
# 推送定频脚本到设备端
adb push rknn-llm/scripts/fix_freq_rk3588.sh /data/demo_Linux_aarch64

进入设备端运行

adb shell
cd /data/demo_Linux_aarch64
# 设置库路径
export LD_LIBRARY_PATH=./lib
# 执行定频脚本,以最高频率运行
sh ./fix_freq_rk3588.sh
# 设置log等级
export RKLLM_LOG_LEVEL=1
# 运行demo
./llm_demo ./DeepSeek-R1-Distill-Qwen-1.5B_W8A8_RK3588.rkllm 2048 4096

# Running result                                                          
rkllm init start
rkllm init success

**********************可输入以下问题对应序号获取回答/或自定义输入********************

[0] 现有一笼子,里面有鸡和兔子若干只,数一数,共有头14个,腿38条,求鸡和兔子各有多少只?
[1] 有28位小朋友排成一行,从左边开始数第10位是学豆,从右边开始数他是第几位?

*************************************************************************

user: 

4.其他

更多demo和api使用请参考RKLLM SDK例程和文档。

5.FAQs

Q1:转换模型失败?

A1:检查 PC 可用运行内存,参数量越大的模型转换或者运行时所需的内存越大,可以尝试增大 swapfile 或者使用大内存的 PC。

人工智能算法部署

RK182X开发套件支持一系列主流人工智能算法的部署,支持但不限于以下算法类別:

sample 算法类别
LPRNet 车牌识别
PPOCR OCR
RetinaFace 人脸检测
clip 多模态目标检测
deeplabv3 语义分割
lite_transformer 轻量化NLP
mobilenet 图像分类
ppseg 图像分割
ppyoloe 目标检测
resnet 图像分类
whisper 语音识别
YAMNet 音频分类
yolo_world 目标检测
yolov10 目标检测
yolov5 目标检测
yolov5_seg 实例分割
yolov6 目标检测
yolov7 目标检测
yolov8 目标检测
yolov8_obb 旋转框目标检测
yolov8_pose 人体关键点检测
yolov8_seg 实例分割
yolox 目标检测

除了以上人工智能算法,更多RK官方例程请参考rknn_model_zoo。RK182X开发套件还支持大语言模型,大语言模型部署请参考大模型部署这一章节

1.1 NPU使用

RK182X开发套件 内置 NPU 模块, 处理性能最高可达6TOPS。使用该NPU需要下载RKNN SDK,RKNN SDK 提供 C++/python 编程接口,能够帮助用户部署使用 RKNN-Toolkit2 导出的 RKNN 模型,加速 AI 应用的落地。RKNN 的整体开发步骤,流程主要分为3 个部分:模型转换、模型评估和板端部署运行。 _images/npu_development_process.png

  • 模型转换: 支持 CaffeTensorFlowTensorFlow LiteONNXDarkNetPyTorch 等模型转为 RKNN 模型,并支持 RKNN 模型导入导出,RKNN 模型能够在 Rockchip NPU 平台上加载使用。

  • 模型评估: 模型评估阶段帮助用户量化和分析模型性能,包括精度、连板推理性能和内存占用等关键指标。

  • 板端部署运行: 加载 RKNN 模型到 RKNPU 平台,进行模型前处理、推理、后处理、释放等流程。

1.2 RKNN-Toolkit2工具

RKNN-Toolkit2 是为用户提供在PC、Rockchip NPU 平台上进行模型转换、推理和性能评估的开发套件,用户通过该工具提供的 Python 接口可以便捷地完成各种操作。注意:RKNN-Toolkit2 开发套件运行在PC x86_64平台上,请勿安装在RK182X开发套件板端。

1.2.1 RKNN-Toolkit2安装

RKNN SDK 提供两种RKNN-Toolkit2安装方式,通过Docker方式安装和通过pip方式安装,用户可自行选择任意一种方式进行安装。这里以pip方式为例,在PC Ubuntu20.04(x64)安装。因为系统中可能同时有多个版本的 Python 环境,建议使用 miniforge3 管理 Python 环境。

# 检查是否安装 miniforge3 和 conda 版本信息,若已安装则可省略此小节步骤。
conda -V
# 下载 miniforge3 安装包
wget -c https://mirrors.bfsu.edu.cn/github-release/conda-forge/miniforge/LatestRelease/Miniforge3-Linux-x86_64.sh
# 安装 miniforge3
chmod 777 Miniforge3-Linux-x86_64.sh
bash Miniforge3-Linux-x86_64.sh
# 进入Conda base 环境,miniforge3 为安装目录
source ~/miniforge3/bin/activate
# 创建一个 Python3.8 版本(建议版本)名为RKNN-Toolkit2 的 Conda 环境
conda create -n RKNN-Toolkit2 python=3.8
# 进入 RKNN-Toolkit2 Conda 环境
conda activate RKNN-Toolkit2
# 安装依赖库
pip3 install -r rknn-toolkit2/packages/requirements_cp38-2.0.0b0.txt
# 安装 RKNN-Toolkit2,如
pip3 install rknn-toolkit2/packages/rknn_toolkit2-2.0.0b0+9bab5682-cp38-cp38-linux_x86_64.whl

若执行以下命令没有报错,则安装成功。

python
from rknn.api import RKNN

若安装失败或需要其他安装方式请查阅RKNN SDK文档

1.2.2 模型转换Demo

在rknn-toolkit2/examples下有各种功能的 Demo ,这里我们运行一个模型转换 Demo 为例子,这个 Demo 展示了在 PC 上将 yolov5 onnx 模型转换成 RKNN 模型,然后导出、在仿真器上推理的过程。模型转换的具体实现请参考 Demo 内源代码以及RKNN SDK文档。

root@9893c1c48f42:/rknn-toolkit2/examples/onnx/yolov5# python3 test.py 
I rknn-toolkit2 version: 2.0.0b0+9bab5682
--> Config model
done
--> Loading model
I It is recommended onnx opset 19, but your onnx model opset is 12!
I Model converted from pytorch, 'opset_version' should be set 19 in torch.onnx.export for successful convert!
I Loading : 100%|██████████████████████████████████████████████| 125/125 [00:00<00:00, 22152.70it/s]
done
--> Building model
I GraphPreparing : 100%|███████████████████████████████████████| 149/149 [00:00<00:00, 10094.68it/s]
I Quantizating : 100%|███████████████████████████████████████████| 149/149 [00:00<00:00, 428.06it/s]
W build: The default input dtype of 'images' is changed from 'float32' to 'int8' in rknn model for performance!
                       Please take care of this change when deploy rknn model with Runtime API!                                                                                                                      
W build: The default output dtype of 'output' is changed from 'float32' to 'int8' in rknn model for performance!
                      Please take care of this change when deploy rknn model with Runtime API!                                                                                                                       
W build: The default output dtype of '283' is changed from 'float32' to 'int8' in rknn model for performance!
                      Please take care of this change when deploy rknn model with Runtime API!                                                                                                                       
W build: The default output dtype of '285' is changed from 'float32' to 'int8' in rknn model for performance!
                      Please take care of this change when deploy rknn model with Runtime API!                                                                                                                       
I rknn building ...
I rknn buiding done.
done
--> Export rknn model
done
--> Init runtime environment
I Target is None, use simulator!
done
--> Running model
I GraphPreparing : 100%|███████████████████████████████████████| 153/153 [00:00<00:00, 10289.55it/s]
I SessionPreparing : 100%|██████████████████████████████████████| 153/153 [00:00<00:00, 1926.55it/s]
done
   class        score      xmin, ymin, xmax, ymax
--------------------------------------------------
   person       0.884     [ 208,  244,  286,  506]
   person       0.868     [ 478,  236,  559,  528]
   person       0.825     [ 110,  238,  230,  533]
   person       0.334     [  79,  353,  122,  517]
    bus         0.705     [  92,  128,  554,  467]
Save results to result.jpg!

如果 rknn-toolkit2 缺少您需要的模型Demo,可以参考rknn_model_zoo仓库的python例程。

1.3 RKNPU2使用

RKNPU2 提供在板端Rockchip NPU 平台上进行模型推理的C/C++编程接口。

1.3.1 环境安装

RKNPU2 Runtime 库文件librknnrt.so,若板端缺少该文件或需要更新,对于Linux系统可以将rknpu2/runtime/Linux/librknn_api/aarch64/librknnrt.so通过scp推送至/usr/lib目录。

1.3.2 板端推理

在RKNN SDK 目录rknpu2/examples提供了许多模型推理Demo,用户可以参考例程开发部署自己的AI应用。rknn_model_zoo仓库同样提供了C/C++的例程

1.4 RKNN-Toolkit Lite2介绍

RKNN-Toolkit Lite2 为用户提供板端模型推理Python 接口,方便用户使用 Python 语言进行 AI 应用开发。注意:RKNN-Toolkit Lite2安装运行在板端,且仅作推理使用,无法转换模型。

1.4.1 RKNN-Toolkit Lite2安装

# 安装python3/pip3
sudo apt-get update
sudo apt-get install -y python3 python3-dev python3-pip gcc python3-opencv python3-numpy
# RKNN-Toolkit Lite2安装,在rknn-toolkit-lite2/packages找到安装包,根据系统python版本安装对应版本
pip3 install rknn_toolkit_lite2-2.0.0b0-cp310-cp310-linux_aarch64.whl

1.4.2 RKNN-Toolkit Lite2使用

在 RKNN SDK/rknn-toolkit-lite2/examples 目录,有基于RKNN-Toolkit Lite2 开发的应用,虽然提供的例程数量有限,但是实际上RKNN-Toolkit Lite2RKNN-Toolkit2的接口使用是十分类似的,用户完全可以参考RKNN-Toolkit2例程移植到RKNN-Toolkit Lite2。

1.5 详细开发文档

NPU 及 Toolkit 详细使用方法请参考RKNN SDK下doc文档。

1.6 FAQs

Q1:rknn模型推理精度对比原模型精度下降?

A1:请参考《Rockchip_RKNPU_User_Guide_RKNN_SDK*》文档的精度排查章节逐步查找原因。

Q2:转换时提示 Expand 算子不支持?

A2:尝试更新 RKNN-Toolkit2 / RKNPU2 至最新版本或者采用 repeat 算子来替代 expand 算子。

更多转换问题或者报错原因可以参考《Rockchip_RKNPU_User_Guide_RKNN_SDK*》文档常见问题章节