【DeepSeek R1 部署至 RK3588】从 RKLLM 转换到板端部署,再到局域网 Web 访问的完整实战
在边缘端落地大模型,RK3588 是近两年最热门的平台之一:NPU 算力可用、生态逐步完善、硬件成本可控。很多开发者真正关心的不是“能不能跑”,而是能否形成一条稳定、可复现、可交付的部署链路。本文就围绕这个目标,给出一套完整方案:
模型准备 → RKLLM 转换 → 板端推理服务 → 局域网 Web 浏览与对话
重点说明:DeepSeek-R1 原始大模型参数规模极大,不可能直接部署在 RK3588。本文采用的是 DeepSeek-R1-Distill 系列(如 1.5B/7B)进行端侧部署实践,这才是工程上可落地的路径。
一、整体架构先看懂:你到底在部署什么?
把流程画成一句话就是:
在 x86 主机完成模型转换(HF/PyTorch → RKLLM 可执行格式)→ 拷贝到 RK3588 板卡 → 板端运行推理服务 → 局域网浏览器访问 WebUI。
建议拆成 4 层:
- 模型层:DeepSeek-R1-Distill(推荐先 1.5B)
- 转换层:RKLLM Toolkit(量化、编译、导出)
- 推理层:RK3588 板端 Runtime(NPU/CPU 协同)
- 应用层:Flask/FastAPI + Gradio/OpenWeb 前端(LAN 访问)
这样拆分的好处是:后续升级模型、替换前端、增加 API 都不需要推翻重来。
二、硬件与软件准备清单(开工前务必确认)
1)硬件建议
- RK3588 开发板(建议 16GB 内存版本,8GB 也能跑但更紧张)
- 稳定散热(风扇/散热片)
- 千兆网口或稳定 Wi-Fi(局域网访问更顺)
- TF 卡或 eMMC/SSD(建议预留 20GB+)
2)主机环境(模型转换用)
- Ubuntu 20.04 / 22.04(x86_64)
- Python 3.10+
- Git、pip、conda(可选)
- Rockchip 官方 RKLLM Toolkit(以官方发布版本为准)
3)板端环境
- 官方推荐 Linux 镜像(带 NPU 驱动版本)
- 对应版本的 runtime 库(与转换工具版本严格匹配)
- Python3(若你用 Python 包装服务)
经验结论:90% 的“跑不起来”都来自版本不匹配,特别是 toolkit、runtime、内核驱动三者不一致。
三、模型选择策略:别直接上“最大”,先跑通最关键
DeepSeek-R1 在边缘端部署必须遵循“先小后大”:
- 首选:
DeepSeek-R1-Distill-Qwen-1.5B - 进阶:
DeepSeek-R1-Distill-Qwen-7B(对内存和速度要求明显更高)
为什么推荐 1.5B 起步?
- 转换成功率高
- 板端首 token 延迟更可控
- 便于先打通 API + Web 全流程
- 后续升级 7B 只需替换模型和参数,不改架构
四、RKLLM 转换实战(在 x86 主机上完成)
以下命令是通用范式,不同版本参数名可能略有差异,请以你下载的官方示例脚本为准。
1)创建环境并安装工具链
bash
conda create -n rkllm python=3.10 -y conda activate rkllm pip install -U pip # 安装 RKLLM toolkit(本地whl或官方源) pip install rkllm_toolkit-*.whl
2)下载模型(HF 目录结构保持完整)
bash
mkdir -p ~/models/deepseek_r1_1p5b # 将 tokenizer、config、safetensors 等文件完整放入该目录
3)编写转换脚本(示意)
python
# convert_deepseek_r1.py from rkllm.api import RKLLMModel model = RKLLMModel( model_path="~/models/deepseek_r1_1p5b", model_type="qwen2", # Distill 基于Qwen系时常用该类型 target="rk3588", quant_type="w4a16", # 常见端侧平衡方案 max_context_len=4096 ) model.build() model.export("./output/deepseek_r1_1p5b_w4a16.rkllm") print("export done")
4)执行转换
bash
python convert_deepseek_r1.py
成功后会得到类似: deepseek_r1_1p5b_w4a16.rkllm
5)转换阶段排错重点
- 报算子不支持:模型架构参数与
model_type填写不一致 - 报内存不足:主机内存不够或 context 设置太高
- 导出成功但板端崩溃:通常是 runtime 版本不匹配
五、板端部署:把模型真正跑起来
1)文件拷贝到 RK3588
bash
scp ./output/deepseek_r1_1p5b_w4a16.rkllm root@rk3588_ip:/opt/rkllm/models/
同时拷贝你当前版本对应的:
librkllm_runtime.so(或相关 runtime 库)- 示例推理程序(C++/Python)
2)检查 NPU 与驱动状态
在板端执行:
bash
dmesg | grep -i rknpu
看到正常初始化日志再继续。
3)先跑官方 demo(极其重要)
不要一上来就套 WebUI,先确保纯推理可用。
bash
cd /opt/rkllm/demo ./rkllm_demo --model /opt/rkllm/models/deepseek_r1_1p5b_w4a16.rkllm
输入简单提示词测试:
- “你好,请介绍一下你自己”
- “用三句话解释什么是边缘计算”
若能稳定输出,再进入服务化阶段。
六、封装 API 服务:为 Web 前端提供标准入口
推荐做一个轻量 API(FastAPI/Flask 均可),核心思想是:
POST /chat:传入 messages,返回模型回复GET /health:健康检查- 可选:
/stream做流式输出
示意(伪代码):
python
from fastapi import FastAPI app = FastAPI() @app.get("/health") def health(): return {"status": "ok"} @app.post("/chat") def chat(req: dict): prompt = req.get("prompt", "") # 调用 rkllm runtime 推理 answer = infer_with_rkllm(prompt) return {"answer": answer}
启动:
bash
uvicorn app:app --host 0.0.0.0 --port 8080
局域网内其他设备可访问: http://rk3588_ip:8080/health
七、局域网 Web 浏览:让同网段设备直接对话
你有两种方式:
方式 A:Gradio(最轻量,推荐先用)
python
import gradio as gr import requests API = "http://127.0.0.1:8080/chat" def chat_fn(text): r = requests.post(API, json={"prompt": text}, timeout=120) return r.json()["answer"] demo = gr.Interface(fn=chat_fn, inputs="text", outputs="text", title="DeepSeek R1 on RK3588") demo.launch(server_name="0.0.0.0", server_port=7860)
启动后在局域网浏览器访问: http://rk3588_ip:7860
方式 B:Open WebUI(功能多但更重)
如果板端资源紧张,可把 Open WebUI 放在另一台 PC/服务器,只把 API 指向 RK3588,这样体验更稳。
八、性能调优:让 RK3588 不只是“能跑”
1)上下文长度别盲目拉满
- 先 2048,再看资源逐步升到 4096
- context 太大直接拖慢首 token 和整体吞吐
2)量化优先级
w4a16常是速度与质量平衡点- 如果你只求速度,可尝试更激进量化(视工具链支持)
3)线程与并发
- 单实例先调到稳定,再考虑并发
- RK3588 适合“低并发、稳定长跑”,不适合高 QPS 压测思路
4)散热与电源
- 长时间推理必须主动散热
- 温度过高会降频,体感就是“越跑越慢”
九、常见坑位与排障手册
坑1:模型转换成功,板端一加载就退出
- runtime 与 toolkit 版本不一致
- 板端库文件路径没配置(
LD_LIBRARY_PATH)
坑2:能回答,但乱码或中文异常
- tokenizer 文件不匹配
- prompt 模板未按模型指令格式构造(Instruct 模型尤其明显)
坑3:WebUI 打得开但对话超时
- API 没启动或被防火墙拦截
- 单次输入太长导致推理超时
- 建议先限制最大输入长度和输出 token
坑4:局域网无法访问
- 你把服务绑在
127.0.0.1,应改为0.0.0.0 - 板端防火墙未放通 7860/8080
- 访问设备与板卡不在同一网段
十、生产化建议:从 Demo 到可交付
当你要把这套系统交给团队使用,建议加上这几项:
- Nginx 反代统一入口(80/443)
- API 鉴权(Token/JWT)
- 日志与监控(响应时延、错误率、温度)
- 模型与服务分版本管理(可回滚)
- 异常自动拉起(systemd/supervisor)
一个实用原则:
先让服务“持续可用”,再追求“极限性能”。
结语
“DeepSeek R1 部署到 RK3588”真正可落地的路径,不是追求一次性跑最大模型,而是走一条可迭代的工程链路:
- 用 Distill 小模型打通转换与运行
- 用 RKLLM 建立稳定的板端推理能力
- 用 API + WebUI 完成局域网可访问应用
- 最后通过版本、监控、反代把它变成可维护系统
如果你按本文步骤执行,基本可以在 1~2 天内完成从“模型文件”到“局域网网页可聊天”的完整闭环。后续你要做的,只是持续优化模型、提示词和业务流程,而不是反复填环境坑。
更多推荐



所有评论(0)