DeepSeek部署¶
Copyright © Quectel Wireless Solutions Co., Ltd. 2026. All rights reserved.
DeepSeek 介绍¶
DeepSeek 是一款由国内团队研发的高性能开源大语言模型,具备强大的自然语言理解、代码生成与逻辑推理能力。
本文档演示如何在 Quectel PI M2(RK3576)上通过 RKLLM(Rockchip LLM)工具链 在 NPU 上部署 DeepSeek-R1-Distill-Qwen-1.5B 蒸馏小模型。
完整版 DeepSeek-V3/R1(671B 参数)无法在嵌入式板端运行;本方案部署的是官方蒸馏小模型,保留 R1 的推理(thinking)能力,适合边缘端问答、推理场景。
部署方案¶
部署方案:RKLLM SDK v1.2.1(SDK 内置在
external/rknn-llm/)模型:DeepSeek-R1-Distill-Qwen-1.5B,W4A16 量化
推理硬件:RK3576 NPU(6 TOPS),单核
板端系统:Debian 13 (trixie),内存 4GB
整体架构¶
┌────────────────────────── PC 端(x86_64)──────────────────────────┐
│ 1. rkllm-toolkit (Python) │
│ 2. HuggingFace 下载原模型 │
│ 3. 生成量化校准数据 (data_quant.json) │
│ 4. 模型转换 + 量化 → .rkllm 文件 │
│ 5. 交叉编译板端 demo (llm_demo) │
└──────────────────────────────────┬─────────────────────────────────┘
│ adb push
┌────────────────────────── RK3576 板端 ────────────────────────────┐
│ 6. librkllmrt.so(板端运行时,aarch64 预编译) │
│ 7. llm_demo 加载 .rkllm 模型 → NPU 推理 │
└───────────────────────────────────────────────────────────────────┘
环境准备¶
硬件与连接¶
项目 |
说明 |
|---|---|
开发板 |
Quectel PI M2(RK3576) |
内存 |
4GB LPDDR4X |
NPU |
6 TOPS,可用频率最高 950MHz |
连接方式 |
USB ADB(板端 adbd 已启用,root 权限) |
PC 系统 |
Ubuntu 22.04,Python 3.10 |
SDK 内置资源(无需额外下载)¶
external/rknn-llm/
├── rkllm-toolkit/ # PC 端模型转换工具(含 whl 安装包)
├── rkllm-runtime/ # 板端运行时
│ └── Linux/librkllm_api/
│ ├── aarch64/librkllmrt.so # aarch64 预编译运行时库
│ └── include/rkllm.h # C/C++ API 头文件
├── examples/
│ └── DeepSeek-R1-Distill-Qwen-1.5B_Demo/
│ ├── export/ # 模型转换脚本
│ └── deploy/ # 板端 demo
├── scripts/fix_freq_rk3576.sh # NPU/CPU 定频脚本
└── doc/ # RKLLM SDK 文档 PDF
详细搭建步骤¶
安装 rkllm-toolkit(PC 端)¶
# 创建 venv,继承系统已装的 torch/numpy
python3 -m venv --system-site-packages /home/q/rkllm-venv
# 仅安装 rkllm-toolkit 本体(不拉依赖)
/home/q/rkllm-venv/bin/pip install --no-deps \
<SDK>/external/rknn-llm/rkllm-toolkit/rkllm_toolkit-1.2.1-cp310-cp310-linux_x86_64.whl
# 补装缺失的小依赖(用国内源)
/home/q/rkllm-venv/bin/pip install -i https://mirrors.aliyun.com/pypi/simple/ \
colorlog transformers==4.51.3 sentencepiece tiktoken einops safetensors \
tqdm accelerate protobuf tabulate jinja2 jsonlines flatbuffers jsonschema datasets
# 验证
/home/q/rkllm-venv/bin/python -c "from rkllm.api import RKLLM; print('OK')"
坑点:wheel 元数据里写死 torch==2.3.0 等版本,直接
pip install xxx.whl会在线下载全套依赖(2GB+)。用--no-deps+ 系统 torch 可绕开。
下载原模型¶
从 HuggingFace 镜像站下载(hf-mirror 国内速度快):
mkdir -p /home/q/deepseek-1.5b && cd /home/q/deepseek-1.5b
for f in model.safetensors config.json generation_config.json tokenizer.json tokenizer_config.json; do
wget -c "https://hf-mirror.com/deepseek-ai/DeepSeek-R1-Distill-Qwen-1.5B/resolve/main/$f" -O "$f"
done
模型文件:model.safetensors(约 3.4GB)+ 4 个配置文件。
生成量化校准数据¶
cd /home/q/deepseek-1.5b
/home/q/rkllm-venv/bin/python \
<SDK>/external/rknn-llm/examples/DeepSeek-R1-Distill-Qwen-1.5B_Demo/export/generate_data_quant.py \
-m /home/q/deepseek-1.5b \
-o /home/q/deepseek-1.5b/data_quant.json
产出 data_quant.json(21 条样本)。CPU 推理耗时约 20~40 分钟。
模型转换(关键步骤)¶
转换脚本关键参数(必须针对 RK3576 修改,官方示例默认 RK3588):
# export_rkllm_rk3576.py(基于官方 export_rkllm.py 修改)
from rkllm.api import RKLLM
import os
os.environ['CUDA_VISIBLE_DEVICES']='-1' # 无 GPU,强制 CPU
modelpath = '/home/q/deepseek-1.5b'
llm = RKLLM()
ret = llm.load_huggingface(model=modelpath, device='cpu',
dtype="float32", custom_config=None, load_weight=True)
dataset = "/home/q/deepseek-1.5b/data_quant.json"
target_platform = "RK3576" # ★ 官方示例是 RK3588,必须改
quantized_dtype = "W4A16" # ★ W4A16 内存减半、速度更快
quantized_algorithm = "grq" # ★ grq 算法配合 W4A16
num_npu_core = 1 # ★ RK3576 单核
ret = llm.build(do_quantization=True, optimization_level=1,
quantized_dtype=quantized_dtype, quantized_algorithm=quantized_algorithm,
target_platform=target_platform, num_npu_core=num_npu_core,
dataset=dataset, hybrid_rate=0, max_context=4096)
ret = llm.export_rkllm(f"/home/q/deepseek-1.5b/deepseek-1.5b_W4A16_RK3576.rkllm")
执行:
/home/q/rkllm-venv/bin/python /home/q/deepseek-1.5b/export_rkllm_rk3576.py
产出:deepseek-1.5b_W4A16_RK3576.rkllm(约 1.3GB)。耗时约 75 分钟(CPU 量化)。
交叉编译板端 demo¶
TC=<SDK>/prebuilts/gcc/linux-x86/aarch64/gcc-arm-10.3-2021.07-x86_64-aarch64-none-linux-gnu/bin/aarch64-none-linux-gnu
# 复制 deploy 目录到工作区(避免污染 SDK 仓库)
cp -r <SDK>/external/rknn-llm/examples/DeepSeek-R1-Distill-Qwen-1.5B_Demo/deploy /home/q/llm_demo_deploy
# CMakeLists.txt 中 RKLLM_API_PATH 改为绝对路径:
# set(RKLLM_API_PATH "/home/q/rkllm-runtime/Linux/librkllm_api")
mkdir -p /home/q/llm_demo_deploy/build && cd /home/q/llm_demo_deploy/build
cmake .. \
-DCMAKE_SYSTEM_PROCESSOR=aarch64 -DCMAKE_SYSTEM_NAME=Linux \
-DCMAKE_C_COMPILER=$TC-gcc -DCMAKE_CXX_COMPILER=$TC-g++ \
-DCMAKE_BUILD_TYPE=Release -DCMAKE_POSITION_INDEPENDENT_CODE=ON
make -j4 && make install
产出:/home/q/llm_demo_deploy/install/demo_Linux_aarch64/,含 llm_demo + lib/librkllmrt.so。
部署到板子¶
adb shell mkdir -p /root/llm_demo/lib
cd /home/q/llm_demo_deploy/install/demo_Linux_aarch64
adb push llm_demo /root/llm_demo/
adb push lib/librkllmrt.so /root/llm_demo/lib/
adb push /home/q/deepseek-1.5b/deepseek-1.5b_W4A16_RK3576.rkllm /root/llm_demo/
adb shell chmod +x /root/llm_demo/llm_demo
NPU/CPU 定频(跑模型前必须执行)¶
官方 fix_freq_rk3576.sh 写死 NPU 1GHz,但本板 NPU 最高 950MHz,需适配:
# 板端执行(root)
echo userspace > /sys/class/devfreq/27700000.npu/governor
echo 950000000 > /sys/class/devfreq/27700000.npu/userspace/set_freq # 最高 950MHz
# CPU 大核(policy4)定频到最高 2208MHz:
echo userspace > /sys/devices/system/cpu/cpufreq/policy4/scaling_governor
echo 2208000 > /sys/devices/system/cpu/cpufreq/policy4/scaling_setspeed
运行¶
adb shell
cd /root/llm_demo
export LD_LIBRARY_PATH=./lib
sh fix_freq_rk3576_debian.sh
export RKLLM_LOG_LEVEL=1 # 打印性能统计
./llm_demo deepseek-1.5b_W4A16_RK3576.rkllm 2048 4096
# 参数说明:2048=推理 batch 大小上限,4096=最大上下文长度
进入交互后输入 0 测试鸡兔同笼,或直接输入自定义问题。
实测结果¶
功能验证¶
鸡兔同笼问题(头 14、腿 38)回答正确:鸡 9 只、兔 5 只,带完整 thinking 推理过程。
性能数据(NPU 950MHz 定频)¶
指标 |
实测值 |
|---|---|
模型加载时间 |
1.54 s |
Prefill |
103.31 tokens/s(40 tokens / 0.39s) |
生成速度 |
10.29 tokens/s(459 tokens / 44.6s) |
峰值内存 |
1.10 GB(4GB 内存余量充足) |
量化方案对比(RK3576 官方 benchmark,1.5B)¶
量化 |
内存占用 |
生成速度 |
|---|---|---|
W8A8 |
1665 MB |
8.51 tokens/s |
W4A16 |
932 MB |
14.45 tokens/s |
结论:RK3576(4GB 内存)选 W4A16 更优——内存省一半、速度提升约 70%。
常见问题¶
问题 |
原因与解决 |
|---|---|
pip 装 rkllm-toolkit 卡死 |
wheel 依赖 torch 2.3.0 等大包,用 |
|
deploy 目录复制后 CMakeLists 相对路径失效,改为绝对路径 |
|
用 SDK prebuilts 完整工具链 |
定频写 1GHz 失败 |
本板 NPU 最高 950MHz,改 |
板端 |
模型文件路径不对或未 push |
libgomp.so.1 找不到 |
板端安装 |
后续扩展¶
OpenAI 兼容 API 服务:SDK 自带
examples/rkllm_server_demo,可起 HTTP 服务远程调用固件集成:可将 llm_demo + 模型打进 rootfs,开机自启
换更大模型:7B W4A16 约 4GB,4GB 内存紧张,不建议;1.5B 是当前最优解