说出来自己都不太信——一块几百块的信用卡大小开发板,硬是跑起来了多模态大模型。

不是云端,是本地。10.8 tok/s,NPU加速,断网也能用。

RK3588S跑Qwen3-VL 2B能跑,但坑不少。我折腾了一整周才跑通,记录一下血泪经验。

背景

之前一直觉得大模型是云端的事,直到碰上这个需求:摄像头画面要做本地分析,数据不想上云。

研究了一圈云端GPT-4V,问题很明显:

  • 摄像头画面传云端?隐私说不通
  • 网络延迟2-3秒?忍不了
  • 天天调API烧钱?钱包更忍不了

目标很简单:本地跑通,延迟低,隐私好,成本可控

硬件配置

可乐派 CPM-3588S,尺寸85×56mm,就一张卡片大小:

配置参数
SoC瑞芯微 RK3588S(4×A76 + 4×A55)
NPU6 TOPS(int4/int8/int16/FP16)
RAM8GB LPDDR4
系统Ubuntu 22.04 LTS

RK3588S内置3核NPU,NPU 0给用户用(6 TOPS),NPU 1留给系统。

设备树确认:Rockchip RK3588S CokePi Model LP4 V10 Board

方案调研

市面上的方案摸了一遍:

方案性能难度
llama.cpp(纯CPU)0.5B ~10 tok/s简单
RKLLM官方SDK(NPU)0.5B ~42 tok/s复杂
rkllama(NPU,Ollama风格)0.5B ~42 tok/s中等
MNN / Tengine(CPU)同llama.cpp中等

最后选了 rkllama,原因很简单:

  • API兼容Ollama,用起来顺手
  • 兼容OpenAI格式,切换成本低
  • 支持Qwen2VL/Qwen3VL多模态
  • 自带vision encoder,不用自己折腾

官方benchmark数据(来源:rknn-llm官方仓库):

模型tok/s内存
Qwen2 0.5B w8a842.58654 MB
Qwen2.5 1.5B w8a816.321659 MB
Qwen3-VL 2B w8a815.121892 MB
Qwen3 0.6B w8a832.16774 MB

Qwen3-VL 2B是里面唯一的多模态模型,8GB内存塞得下,果断选了它。

部署过程

第一步:系统调优

先锁CPU性能、关swap,避免被系统调度干扰:

for cpu in /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor; do
  echo performance > $cpu
done
echo 0 > /proc/sys/vm/swappiness

第二步:装rkllama

git clone --depth 1 https://github.com/NotPunchnox/rkllama.git
cd rkllama

# 踩坑:webrtcvad需要gcc编译,但RK3588镜像没装
# 删掉这行依赖,VAD后面单独装
sed -i 's/ "webrtcvad==2.0.10",//' pyproject.toml
pip install .

第三步:锁NPU频率

rkllama官方提供了锁频脚本:

sudo bash src/rkllama/lib/fix_freq_rk3588.sh

# 确认一下
cat /sys/class/devfreq/fdab0000.npu/cur_freq
# 输出1000000000就是锁到了1GHz ✅

第四步:拉模型(3GB,用镜像站)

huggingface.co在国内经常超时,换hf-mirror.com:

import os
os.environ['HF_ENDPOINT'] = 'https://hf-mirror.com'
from huggingface_hub import snapshot_download

snapshot_download(
    repo_id="GatekeeperZA/Qwen3-VL-2B-Instruct-RKLLM-v1.2.3",
    local_dir="/home/xxx/rkllama/models/qwen3-vl-2b",
    allow_patterns=[
        "*.md",
        "qwen3-vl-2b-instruct_w8a8_rk3588.rkllm",
        "qwen3-vl-2b_vision_448_rk3588.rknn",
    ],
)

下完是两个文件:qwen3-vl-2b-instruct_w8a8_rk3588.rkllmqwen3-vl-2b_vision_448_rk3588.rknn

第五步:写Modelfile(多模态关键)

这个文件决定模型怎么跑,多模态一定要配这6行

FROM="qwen3-vl-2b-instruct_w8a8_rk3588.rkllm"
HUGGINGFACE_PATH="/home/xxx/.cache/rkllama_tokenizer"
TEMPERATURE=0.7

# 多模态必须配置这6行,缺一不可!
IMAGE_WIDTH=448
IMAGE_HEIGHT=448
N_IMAGE_TOKENS=196
IMG_START="<|vision_start|>"
IMG_END="<|vision_end|>"
IMG_CONTENT="<|image_pad|>"

第六步:预下载tokenizer

rkllama启动时会自动连接huggingface.co,提前拉到本地:

snapshot_download(
    repo_id="Qwen/Qwen3-VL-2B-Instruct",
    local_dir="/home/xxx/.cache/rkllama_tokenizer",
    allow_patterns=["tokenizer*", "vocab.json", "merges.txt",
                    "chat_template*", "preprocessor*", "added_tokens*"],
)

第七步:启动

nohup env HF_HUB_OFFLINE=1 TRANSFORMERS_OFFLINE=1 \
    rkllama_server --models /home/xxx/rkllama/models --port 8080 \
    > /tmp/rkllama/server.log 2>&1 &

看到这行就成功了:

Start the API at http://localhost:8080

性能实测

任务速度延迟
短问答(9 tokens)5.9 tok/s1.5s
长代码生成(1023 tokens)10.8 tok/s94.6s
视觉问答(20 tokens)2.1 tok/s9.6s
首字延迟(TTFT)800ms

比官方宣称的15 tok/s慢一些,原因:我这机子是8GB内存,官方用的是16GB Orange Pi 5 Plus,内存带宽差了一截。

实际体感已经挺流畅了,800ms看到第一个字出来,比等云端API快多了。

踩坑记录

这一周踩了五六个坑,挑几个重点说:

坑1:hf-mirror.com走IPv6超时

  • 现象:网络请求一直超时,getent看一下返回的是IPv6地址
  • 解决:确保网络走IPv4

坑2:webrtcvad编译失败

  • 现象:pip install报gcc找不到
  • 解决:编辑pyproject.toml,删掉webrtcvad那行依赖

坑3:多模态Modelfile缺字段

  • 现象:TypeError: int() argument must be … not 'NoneType'
  • 解决:IMAGE_WIDTH/HEIGHT/N_IMAGE_TOKENS/IMG_START/END/CONTENT这6行一定要配齐

坑4:tokenizer拉取失败

  • 现象:We couldn't connect to huggingface.co
  • 解决:提前用snapshot_download拉到本地,Modelfile里的HUGGINGFACE_PATH指向本地路径

坑5:Ollama格式视觉请求500错误

  • 现象:用/api/chat传图片报错了
  • 解决:换OpenAI格式/v1/chat/completions,rkllama的视觉支持在这个端点上更稳定

一点感想

  1. NPU是边缘LLM的关键——没有NPU的话,8GB跑2B模型基本做梦,光加载模型进内存就够呛。
  2. rkllama确实是用RK3588跑LLM的最优选——API兼容做得好,文档持续更新,已经接近商用水平了。
  3. HF镜像在国内是必选项——huggingface.co动不动超时,hf-mirror.com稳定多了。
  4. 真正的瓶颈是内存带宽,不是NPU算力——跑起来后观察/sys/class/devfreq/fdab0000.npu/total_trans_rate,NPU确实跑满了,但速度还是没官方快,瓶颈在内存带宽这边。

后续计划

  • Day 4:装whisper.cpp + piper,加语音对话
  • 摄像头实时分析demo继续优化
  • Web控制台
  • Speculative Decoding,理论上能快一倍

你用的是什么硬件?跑什么模型?速度怎么样?评论区聊聊。