8GB卡片SBC跑多模态大模型:我在可乐派上把Qwen3-VL 2B跑起来了
说出来自己都不太信——一块几百块的信用卡大小开发板,硬是跑起来了多模态大模型。
不是云端,是本地。10.8 tok/s,NPU加速,断网也能用。
RK3588S跑Qwen3-VL 2B能跑,但坑不少。我折腾了一整周才跑通,记录一下血泪经验。
背景
之前一直觉得大模型是云端的事,直到碰上这个需求:摄像头画面要做本地分析,数据不想上云。
研究了一圈云端GPT-4V,问题很明显:
- 摄像头画面传云端?隐私说不通
- 网络延迟2-3秒?忍不了
- 天天调API烧钱?钱包更忍不了
目标很简单:本地跑通,延迟低,隐私好,成本可控。
硬件配置
可乐派 CPM-3588S,尺寸85×56mm,就一张卡片大小:
| 配置 | 参数 |
|---|---|
| SoC | 瑞芯微 RK3588S(4×A76 + 4×A55) |
| NPU | 6 TOPS(int4/int8/int16/FP16) |
| RAM | 8GB 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 w8a8 | 42.58 | 654 MB |
| Qwen2.5 1.5B w8a8 | 16.32 | 1659 MB |
| Qwen3-VL 2B w8a8 | 15.12 | 1892 MB |
| Qwen3 0.6B w8a8 | 32.16 | 774 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.rkllm 和 qwen3-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/s | 1.5s |
| 长代码生成(1023 tokens) | 10.8 tok/s | 94.6s |
| 视觉问答(20 tokens) | 2.1 tok/s | 9.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的视觉支持在这个端点上更稳定
一点感想
- NPU是边缘LLM的关键——没有NPU的话,8GB跑2B模型基本做梦,光加载模型进内存就够呛。
- rkllama确实是用RK3588跑LLM的最优选——API兼容做得好,文档持续更新,已经接近商用水平了。
- HF镜像在国内是必选项——huggingface.co动不动超时,hf-mirror.com稳定多了。
- 真正的瓶颈是内存带宽,不是NPU算力——跑起来后观察
/sys/class/devfreq/fdab0000.npu/total_trans_rate,NPU确实跑满了,但速度还是没官方快,瓶颈在内存带宽这边。
后续计划
- Day 4:装whisper.cpp + piper,加语音对话
- 摄像头实时分析demo继续优化
- Web控制台
- Speculative Decoding,理论上能快一倍
你用的是什么硬件?跑什么模型?速度怎么样?评论区聊聊。