DeepSeek R1 在 RK3588 上的 RKLLM 转换与 Web 部署流程
本文记录 DeepSeek R1 7B(基于 Qwen 底座)在瑞芯微 RK3588 SoC 上的完整部署流程,涵盖开发板驱动适配、模型转换、板端推理及局域网 Web 访问。
一、项目背景介绍
本项目使用搭载瑞芯微 RK3588 SoC 的 ARM64 开发板。虽然此前主要进行 CV 领域模型的部署,但大模型已成为趋势,瑞芯微已针对开源 LLM/VLM 完成适配,按手册要求即可完成部署。
二、所需工具介绍
1. 硬件工具
- X86 PC 虚拟机:推荐安装 Ubuntu 20.04,用于模型转换环境。
- RK3588 开发板:需确保 NPU 驱动版本为 0.9.8 及以上。
检查 NPU 驱动版本命令:
sudo cat /sys/kernel/debug/rknpu/version
若版本低于 0.9.8(如 0.8.2),则无法调用 librkllm.so,需重新烧录固件。新版驱动支持 Transformer 算子、KV Cache 优化等特性,并修复了高负载下的稳定性问题。
固件烧录流程:
- 访问 Rockchip 官方或开发板厂商文档下载 Ubuntu 固件(如 ROC-RK3588S-PC_Ubuntu22.04-Xfce-r31161_v1.3.0b_250801.img)。
- 下载 RKDevTool 烧写工具及驱动助手。
- 安装驱动后打开 RKDevTool,通过 Recovery 模式连接开发板(按住 RECOVERY 键上电)。
- 选择固件文件点击升级,等待完成后重启。
- 重启后再次检查驱动版本确认升级成功。
2. 软件工具
- Hugging Face:下载开源模型权重(.safetensors 文件)。例如 DeepSeek-R1-Distill-Qwen-7B。
- RKNN-LLM-release:瑞芯微提供的模型转换与推理 SDK(GitHub: airockchip/rknn-llm)。需关注 release-v1.2.3 标签。
- rkllm-toolkit (PC 端):Python 包,负责加载 HF 格式模型、量化并导出 .rkllm 文件。
- rkllm-runtime (板端):C/C++ 推理库,核心动态库为
librkllmrt.so。
- rknpu-driver (系统层):NPU 内核驱动。
三、获取.safetensors 模型权重
从 Hugging Face 下载模型时,大模型通常被切分为多个文件(如 model-00001-of-00002.safetensors),需全部下载至本地目录。
四、safetensors 转 RKLLM
1. 转换环境搭建
确保 x86 服务器内存充足,建议配置 SWAP 防止转换崩溃。
创建 conda 环境:
conda create -n rkllm123 python=3.10
进入 rknn-llm-release-v1.2.3/rkllm-toolkit/packages 路径,安装工具包:
pip install rkllm_toolkit-1.2.3-cp310-cp310-linux_x86_64.whl
2. 模型转换
在目录下创建 export_model.py 和 generate_data.py。
generate_data.py(生成量化校准数据):
import json
from transformers import AutoTokenizer
model_path = '/xxx/RKNN-LLM/rkllm/DeepSeek-R1-Distill-Qwen-7B'
prompts = [
"你好,请介绍一下你自己。",
"Explain the theory of relativity in simple terms.",
"写一首关于春天的七言绝句。",
"瑞芯微 RK3588 芯片的主要特点是什么?"
]
tokenizer = AutoTokenizer.from_pretrained(model_path, trust_remote_code=True)
data_list = []
for prompt in prompts:
messages = [{"role": "user", "content": prompt}]
text = tokenizer.apply_chat_template(messages, tokenize=False, add_generation_prompt=True)
data_list.append({"input": text, "target": """})
with open('data_quant.json', 'w', encoding='utf-8') as f:
json.dump(data_list, f, ensure_ascii=False, indent=4)
print("量化数据已生成:data_quant.json")
export_model.py(执行转换):
from rkllm.api import RKLLM
import os
model_path = '/xxx/RKNN-LLM/rkllm/DeepSeek-R1-Distill-Qwen-7B'
platform = 'rk3588'
export_path = f'DeepSeek-R1-Distill-Qwen-7B_W8A8_{platform}.rkllm'
llm = RKLLM()
print(">>> Loading model...")
ret = llm.load_huggingface(
model=model_path,
device='cpu',
dtype='float16'
)
if ret != 0:
print("Model Load Failed!")
exit(ret)
print(">>> Building model (Quantization W8A8)...")
qparams = None
dataset = './data_quant.json'
ret = llm.build(
do_quantization=True,
optimization_level=1,
quantized_dtype='w8a8',
quantized_algorithm='normal',
target_platform=platform,
num_npu_core=3,
dataset=dataset
)
if ret != 0:
print("Model Build Failed!")
exit(ret)
print(f">>> Exporting model to {export_path}...")
ret = llm.export_rkllm(export_path)
if ret != 0:
print("Model Export Failed!")
exit(ret)
print("\n\n转换成功!请将 .rkllm 文件推送到板端进行测试。")
执行顺序:
python generate_data.py
python export_model.py
五、RKLLM 模型板端部署及推理
将生成的 .rkllm 文件复制到开发板指定路径(如 /home/firefly/models/...)。
1. 修改 C++ Demo
进入 rknn-llm-release-v1.2.3/examples/rkllm_api_demo/deploy,修改 llm_demo.cpp 中的 rkllm_set_chat_template 以适配 DeepSeek/Qwen 的 ChatML 格式:
rkllm_set_chat_template(llmHandle, "<|im_start|>system\nYou are a helpful assistant.<|im_end|>\n", "<|im_start|>user\n", "<|im_end|>\n<|im_start|>assistant\n");
2. 编译与运行
修改 build-linux.sh 脚本,设置编译器为系统默认(gcc/g++),目标架构为 aarch64。
bash build-linux.sh
设置环境变量:
export LD_LIBRARY_PATH=~/rknn-llm-release-v1.2.3/rkllm-runtime/Linux/librkllm_api/aarch64/lib:$LD_LIBRARY_PATH
运行模型:
cd /xxx/rknn-llm-release-v1.2.3/examples/rkllm_api_demo/deploy/install/demo_Linux_aarch64
./llm_demo <模型路径> <最大生成长度> <上下文长度>
./llm_demo /home/firefly/models/DeepSeek-R1-Distill-Qwen-7B_W8A8_rk3588.rkllm 512 2048
六、集成开源 Gradio 工具实现 Web 访问
根据官方手册,可使用 Python 服务化方案提供 Web 界面。
1. 环境准备
在开发板上执行:
pip3 install gradio
cd ~/rknn-llm-release-v1.2.3/examples/rkllm_server_demo/rkllm_server
cp ~/rknn-llm-release-v1.2.3/rkllm-runtime/Linux/librkllm_api/aarch64/librkllmrt.so ./lib/
2. 修改启动脚本
编辑 gradio_server.py,设置 server_name="0.0.0.0" 以允许局域网访问,并调整 chatRKLLM.launch() 参数。
关键代码片段:
os.environ["GRADIO_SERVER_NAME"]="0.0.0.0"
os.environ["GRADIO_SERVER_PORT"]="8080"
if __name__ == "__main__":
model_path = args.rkllm_model_path
rkllm_model = RKLLM(model_path, args.lora_model_path, args.prompt_cache_path, args.target_platform)
chatRKLLM.queue()
chatRKLLM.launch(server_name="0.0.0.0", server_port=8080)
rkllm_model.release()
3. 启动服务
python3 gradio_server.py --model_path /home/firefly/rkllm_model_zoo_selfconvert/DeepSeek-R1-Distill-Qwen-7B_W8A8_rk3588.rkllm --target_platform rk3588
4. 访问测试
在局域网内其他设备浏览器访问 http://<开发板 IP>:8080 即可进行对话测试。