在边缘端落地大模型,RK3588 是近两年最热门的平台之一:NPU 算力可用、生态逐步完善、硬件成本可控。很多开发者真正关心的不是“能不能跑”,而是能否形成一条稳定、可复现、可交付的部署链路。本文就围绕这个目标,给出一套完整方案:

模型准备 → RKLLM 转换 → 板端推理服务 → 局域网 Web 浏览与对话

重点说明:DeepSeek-R1 原始大模型参数规模极大,不可能直接部署在 RK3588。本文采用的是 DeepSeek-R1-Distill 系列(如 1.5B/7B)进行端侧部署实践,这才是工程上可落地的路径。


一、整体架构先看懂:你到底在部署什么?

把流程画成一句话就是:

在 x86 主机完成模型转换(HF/PyTorch → RKLLM 可执行格式)→ 拷贝到 RK3588 板卡 → 板端运行推理服务 → 局域网浏览器访问 WebUI。

建议拆成 4 层:

  1. 模型层:DeepSeek-R1-Distill(推荐先 1.5B)
  2. 转换层:RKLLM Toolkit(量化、编译、导出)
  3. 推理层:RK3588 板端 Runtime(NPU/CPU 协同)
  4. 应用层: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 起步?

  1. 转换成功率高
  2. 板端首 token 延迟更可控
  3. 便于先打通 API + Web 全流程
  4. 后续升级 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 到可交付

当你要把这套系统交给团队使用,建议加上这几项:

  1. Nginx 反代统一入口(80/443)
  2. API 鉴权(Token/JWT)
  3. 日志与监控(响应时延、错误率、温度)
  4. 模型与服务分版本管理(可回滚)
  5. 异常自动拉起(systemd/supervisor)

一个实用原则:
先让服务“持续可用”,再追求“极限性能”。


结语

“DeepSeek R1 部署到 RK3588”真正可落地的路径,不是追求一次性跑最大模型,而是走一条可迭代的工程链路:

  • 用 Distill 小模型打通转换与运行
  • 用 RKLLM 建立稳定的板端推理能力
  • 用 API + WebUI 完成局域网可访问应用
  • 最后通过版本、监控、反代把它变成可维护系统

如果你按本文步骤执行,基本可以在 1~2 天内完成从“模型文件”到“局域网网页可聊天”的完整闭环。后续你要做的,只是持续优化模型、提示词和业务流程,而不是反复填环境坑。

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐