RK3588 NPU运行RKLLM
1、rknpu升级0.9.8驱动
前言
为了更好的在rk的npu上运行llm,需要升级rknpu驱动,笔者使用的开发板是rock 5b,系统是官方Debain,内核为6.1
radxa官方内核开发教程:https://docs.radxa.com/rock5/rock5b/low-level-dev/kernel
radxa官方rknpu升级教程:https://docs.radxa.com/rock5/rock5b/app-development/rkllm_install#开发板
瑞芯微官方教程:https://github.com/airockchip/rknn-llm/tree/main/doc
笔者在个人的虚拟机中完成内核编译,配置如下:
x86 ubunutu20.04 4核心4线程 8GB内存 100G磁盘
安装依赖
sudo apt update
sudo apt install -y git qemu-user-static binfmt-support
# Podman (推荐)
sudo apt install -y podman podman-docker
sudo touch /etc/containers/nodocker
# Docker
#sudo apt install docker.io
# 次要功能的可选依赖
sudo apt install -y systemd-container
构建内核
bsp 使用了 git 子模块。因此,请使用以下命令获取代码:
git clone --recurse-submodules https://github.com/radxa-repo/bsp.git
./bsp linux rk2410 --no-build
# `--no-build` 仅配置代码不编译
下载压缩包 rknpu_driver_0.9.8_20241009.tar.bz2 (https://github.com/airockchip/rknn-llm/tree/release-v1.1.4/rknpu-driver),
解压该压缩包,将其中的 rknpu 驱动代码覆盖到当前内核代码目录
/bsp/.src/linux/drivers/rknpu
内核源码的路径位于 bsp 目录下的 .src/linux,在修改内核源码后,可再次构建内核
cd bsp
./bsp --no-prepare-source linux rk2410 -r 999
# 参数说明:
# --no-prepare-source # 首次编译不需要加该参数,加该参数是为了使用本地修改进行编译,如果不加这个参数将会从 Radxa kernel 仓库同步最新代码并覆盖本地修改
# -r 999 # 指定内核的版本号为 999,以优先使用
编译完成以后,在bsp目录下查看
开发板端安装
将上面对应的 deb
包复制到板子上使用 dpkg
指令安装即可完成内核安装
radxa@rock-5b:~$ sudo dpkg -i linux-headers-6.1.84-900-rk2410_6.1.84-900_arm64.deb
radxa@rock-5b:~$ sudo dpkg -i linux-headers-rock-5b_6.1.84-900_all.deb
radxa@rock-5b:~$ sudo dpkg -i linux-image-6.1.84-900-rk2410_6.1.84-900_arm64.deb
radxa@rock-5b:~$ sudo dpkg -i linux-image-rock-5b_6.1.84-900_all.deb
# 重启
reboot
radxa@rock-5b:~$ sudo cat /sys/kernel/debug/rknpu/version
[sudo] password for radxa:
RKNPU driver: v0.9.8
通过网盘分享的文件:rk3588-linux6.1升级npu版本0.9.8
链接: https://pan.baidu.com/s/1non6Y_Exzzfsx2i5U64mMA 提取码: xdhq
可能遇到的问题
(base) abc@abc-virtual-machine:~/bsp$ sudo ./bsp linux rk2410 --no-build
main: Pulling from radxa-repo/bsp
Digest: sha256:01a853cd42c4dd56ef8a38039d581bc2655d9710bb714b6d26263c16af865caf
Status: Image is up to date for ghcr.io/radxa-repo/bsp:main
ghcr.io/radxa-repo/bsp:main
fatal: detected dubious ownership in repository at '/home/abc/bsp'
To add an exception for this directory, call:
git config --global --add safe.directory /home/abc/bsp
Part of the code in this script are stored in git submodules.
However, it appears that submodules were not initialized in this repo.
Please run "git submodule init && git submodule update" to fix this issue.
bsp
# 以普通用户身份添加安全目录配置(不要用 sudo)
git config --global --add safe.directory /home/abc/bsp
# 进入仓库目录(以普通用户身份,不要用 sudo)
cd ~/bsp
git submodule init
git submodule update
2、转换部署Qwen2.5-1.5B-Instruct
2.1 RKLLM-Toolkit安装
要使用 RKNPU,用户需要先在 x86 工作站上运行 RKLLM-Toolkit 工具,将训练好的模型转换为 RKLLM 格式的模型,然后在开发板上使用 RKLLM C API 进行推理
# 安装conda
wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh
bash ~/Miniconda3-latest-Linux-x86_64.sh
安装miniconda:https://docs.anaconda.com/miniconda/install/
# 刷新终端
source ~/.bashrc
# 创建 conda 环境
conda create -n rkllm python=3.8.2
# 进入 rkllm conda 环境
conda activate rkllm
# 退出环境
conda deactivate
RKLLM-Toolkit是一套软件开发包,供用户在 PC 上进行 Huggingface 格式的 LLM 模型转换和量化
git clone -b release-v1.1.4 https://github.com/airockchip/rknn-llm.git
pip3 install ./rknn-llm/rkllm-toolkit/packages/rkllm_toolkit-1.1.4-cp38-cp38-linux_x86_64.whl
python3
from rkllm.api import RKLLM
2.2 模型转换
sudo apt update
sudo apt install git-lfs # 重要
git clone https://huggingface.co/Qwen/Qwen2.5-1.5B-Instruct
# 记住Qwen2.5-1.5B-Instruct的地址,后面需要使用
(rkllm) ➜ ~ du -sh Qwen2.5-1.5B-Instruct
5.8G Qwen2.5-1.5B-Instruct
conda activate rkllm # 激活 rkllm conda 环境
更改 rknn-llm/rkllm-toolkit/examples/test.py 中 modelpath 模型路径, dataset路径, rkllm 导出路径
15 modelpath = 'Your Huggingface LLM model'
29 datasert = None # 默认是 "./data_quant.json", 如无可以填写 None
83 ret = llm.export_rkllm("./Your_Huggingface_LLM_model.rkllm")
运行模型转换脚本
cd rknn-llm/rkllm-toolkit/examples/
python3 test.py
Qwen2.5-1.5B-Instruct在转换中,内存占用>8GB
转换成功后可得到 rkllm 模型
(rkllm) ➜ examples du -sh Qwen2.5-1.5B-Instruct.rkllm
1.9G Qwen2.5-1.5B-Instruct.rkllm
2.3 编译可执行文件
下载交叉编译工具链 gcc-arm-10.2-2020.11-x86_64-aarch64-none-linux-gnu
:https://developer.arm.com/downloads/-/gnu-a/10-2-2020-11
# 解压,在rknn-llm目录下
tar -xvf gcc-arm-10.2-2020.11-x86_64-aarch64-none-linux-gnu.tar.xz
pwd # 查看路径
修改主程序 rknn-llm/examples/rkllm_api_demo/src/llm_demo.cpp 代码, 这里修改两个地方
184 text = PROMPT_TEXT_PREFIX + input_str + PROMPT_TEXT_POSTFIX;
185 // text = input_str;
修改 rknn-llm/examples/rkllm_api_demo/build-linux.sh 编译脚本中 GCC_COMPILER_PATH 路径
# 填写实际路径
GCC_COMPILER_PATH=rknn-llm/gcc-arm-10.2-2020.11-x86_64-aarch64-none-linux-gnu/bin/aarch64-none-linux-gnu
运行模型转换脚本
cd rknn-llm/examples/rkllm_api_demo/
# sudo apt install cmake
bash build-linux.sh
生成的可执行文件在 build/build_linux_aarch64_Release/llm_demo
2.4 开发板端
RKLLM Runtime 为 Rockchip NPU 平台提供 C/C++ 编程接口,帮助用户部署 RKLLM 模型,加速 LLM 应用的实现
git clone -b release-v1.1.4 https://github.com/airockchip/rknn-llm.git
(base) radxa@rock-5b:~$ du -sh rknn-llm/
282M rknn-llm/
将转换成功后的 rkllm 模型与编译后的二进制文件 llm_demo 复制到板端
# 导入环境变量
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:rknn-llm/rkllm-runtime/Linux/librkllm_api/aarch64
运行 llm_demo,输入 exit 退出
# 设置,每次查看 RKLLM 在板端推理的性能
export RKLLM_LOG_LEVEL=1
# 添加执行权限
chmod +x llm_demo
./llm_demo your_rkllm_path 10000 10000
# ./llm_demo Qwen2.5-1.5B-Instruct.rkllm 10000 10000
3、转换部署 DeepSeek-R1-Distilled-Qwen-1.5B
DeepScaleR-1.5B-Preview :https://huggingface.co/agentica-org/DeepScaleR-1.5B-Preview
DeepScaleR-1.5B-Preview 是一种语言模型,使用 DeepSeek-R1-Distilled-Qwen-1.5B 进行微调,使用分布式强化学习 (RL) 扩展到较长的上下文长度。该模型在 AIME 2024 上实现了 43.1% 的 Pass@1 准确率,比基本模型 (28.8%) 提高了 15%,仅以 1.5B 参数超过了 OpenAI 的 O1-Preview 性能
3.1 RKLLM-Toolkit安装
要使用 RKNPU,用户需要先在 x86 工作站上运行 RKLLM-Toolkit 工具,将训练好的模型转换为 RKLLM 格式的模型,然后在开发板上使用 RKLLM C API 进行推理
# 安装conda
wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh
bash ~/Miniconda3-latest-Linux-x86_64.sh
安装miniconda:https://docs.anaconda.com/miniconda/install/
# 刷新终端
source ~/.bashrc
# 创建 conda 环境
conda create -n rkllm python=3.8.2
# 进入 rkllm conda 环境
conda activate rkllm
# 退出环境
conda deactivate
RKLLM-Toolkit是一套软件开发包,供用户在 PC 上进行 Huggingface 格式的 LLM 模型转换和量化
git clone -b release-v1.1.4 https://github.com/airockchip/rknn-llm.git
pip3 install ./rknn-llm/rkllm-toolkit/packages/rkllm_toolkit-1.1.4-cp38-cp38-linux_x86_64.whl
python3
from rkllm.api import RKLLM
3.2 模型转换
sudo apt update
sudo apt install git-lfs # 重要
git clone https://huggingface.co/agentica-org/DeepScaleR-1.5B-Preview
conda activate rkllm # 激活 rkllm conda 环境
更改 rknn-llm/rkllm-toolkit/examples/test.py 中 modelpath 模型路径, dataset路径, rkllm 导出路径
15 modelpath = 'Your DeepSeek-R1-Distill-Qwen-1.5B Folder Path'
29 datasert = None # 默认是 "./data_quant.json", 如无可以填写 None
83 ret = llm.export_rkllm("./DeepScaleR-1.5B-Preview.rkllm")
运行模型转换脚本
cd rknn-llm/rkllm-toolkit/examples/
python3 test.py
DeepScaleR-1.5B-Preview在转换中,内存占用>8GB
转换成功后可得到 rkllm 模型
3.3 编译可执行文件
下载交叉编译工具链 gcc-arm-10.2-2020.11-x86_64-aarch64-none-linux-gnu
:https://developer.arm.com/downloads/-/gnu-a/10-2-2020-11
# 解压,在rknn-llm目录下
tar -xvf gcc-arm-10.2-2020.11-x86_64-aarch64-none-linux-gnu.tar.xz
pwd # 查看路径
修改主程序 rknn-llm/examples/rkllm_api_demo/src/llm_demo.cpp
代码, 这里修改 PROMPT 格式的设置,和 PROMPT 的构造
24 #define PROMPT_TEXT_PREFIX "<|im_start|>system\nYou are a helpful assistant.\n<|im_end|>\n<|im_start|>user\n"
25 #define PROMPT_TEXT_POSTFIX "\n<|im_end|>\n<|im_start|>assistant\n<think>"
184 text = PROMPT_TEXT_PREFIX + input_str + PROMPT_TEXT_POSTFIX;
185 // text = input_str;
为什么要修改 PROMPT_TEXT_PREFIX 和 PROMPT_TEXT_POSTFIX? 这里需要参考 DeepSeek-R1 论文中 Table1 的说明,需按照其格式对 DeepSeek-R1 模型提问
修改 rknn-llm/examples/rkllm_api_demo/build-linux.sh 编译脚本中 GCC_COMPILER_PATH 路径
# 填写实际路径
GCC_COMPILER_PATH=rknn-llm/gcc-arm-10.2-2020.11-x86_64-aarch64-none-linux-gnu/bin/aarch64-none-linux-gnu
运行模型转换脚本
cd rknn-llm/examples/rkllm_api_demo/
# sudo apt install cmake
bash build-linux.sh
生成的可执行文件在 rknn-llm/examples/rkllm_api_demo/build/build_linux_aarch64_Release/llm_demo
3.4 开发板端
RKLLM Runtime 为 Rockchip NPU 平台提供 C/C++ 编程接口,帮助用户部署 RKLLM 模型,加速 LLM 应用的实现
git clone -b release-v1.1.4 https://github.com/airockchip/rknn-llm.git
(base) radxa@rock-5b:~$ du -sh rknn-llm/
282M rknn-llm/
# 导入环境变量
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:rknn-llm/rkllm-runtime/Linux/librkllm_api/aarch64
将转换成功后的 rkllm 模型与编译后的二进制文件 llm_demo 复制到板端
通过网盘分享的文件:rkllm-DeepSeek-R1-1.5B
链接: https://pan.baidu.com/s/1K_IgSHsa_q7ifx2SYjLgJg 提取码: c2hd
# 添加执行权限
chmod +x llm_demo
# 设置,每次查看 RKLLM 在板端推理的性能
export RKLLM_LOG_LEVEL=1
./llm_demo your_rkllm_path 10000 10000
# ./llm_demo DeepScaleR-1.5B-Preview.rkllm 10000 10000
运行 llm_demo,输入 exit 退出
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 如何调用 DeepSeek 的自然语言处理 API 接口并集成到在线客服系统
· 【译】Visual Studio 中新的强大生产力特性
· 2025年我用 Compose 写了一个 Todo App
2022-02-28 树莓派|使用USB摄像头前测试