一、硬件与方案前置说明
1. RV1126B 硬件限制(部署 LLM 核心前提)
主控:4×Cortex-A53@1.6GHz,3TOPS INT8 NPU,支持 INT4/INT8/FP16 量化
内存选型硬性要求:
1GB DDR:仅支持 300M 以内极小模型(TinyLLaMA、MiniCPM-0.2B),极易 OOM
2GB DDR 推荐起步:稳定跑 0.5B~1B 轻量化 LLM(Qwen-0.7B、MiniCPM-1B、Phi-2)
4GB DDR:可流畅运行 1.5B 模型,支持短上下文 8K
存储:eMMC≥16GB,存放量化模型 + 词表 + 运行库
功耗:整机 2~7W,适合离线 IPC、边缘语音问答、本地文本分析场景
2. 适配轻量化大模型清单(RV1126B 实测可用)
模型 | 参数规模 | 推荐量化 | 最低内存 |
Qwen-0.7B-Chat | 700M | W4A16 | 2GB |
MiniCPM-1B-Small | 1B | W4A16 | 2GB |
Phi-2 | 1.3B | W4A16 | 4GB |
TinyLLaMA-1.1B | 1.1B | INT8 | 4GB |
RWKV7-0.4B | 400M | INT4 | 2GB |
禁止部署≥2B 模型:NPU 算力 + 内存不足,持续 OOM、推理卡顿
3. 两条部署路线(二选一)
1. RKLLM(瑞芯微官方 LLM 专用框架,推荐):专门优化 Transformer 大模型,支持流式 Token 输出、LoRA、W4 量化,底层封装 RKNN Runtime,上手最快
2. 原生 RKNN-Toolkit2:拆分 Encoder/Decoder 单独转 rknn,自行实现循环解码,适合自定义多模态图文大模型
二、环境搭建
2.1 PC 宿主机环境(模型转换,Ubuntu20.04)
1)安装 RKNN-Toolkit2 + RKLLM 工具链
# 1. 创建虚拟环境
conda create -n rknn python=3.8
conda activate rknn
# 2. 安装依赖
pip install torch torchvision onnx onnxsim transformers sentencepiece accelerate
# 3. 安装RKNN-Toolkit2(瑞芯微官网下载对应whl)
pip install rknn_toolkit2-2.4.0-cp38-cp38-linux_x86_64.whl
# 4. 安装RKLLM模型转换工具
pip install rkllm
2)交叉编译工具链(板端 C++ 推理)
从 RV1126B 官方 SDK 获取 arm-rockchip830-linux-uclibcgnueabihf 工具链,解压并配置环境变量:
export PATH=$PWD/toolchain/bin:$PATH
2.2 RV1126B 核心板板端环境
1. 固件要求:Linux5.10/6.1,内置Galcore NPU 驱动、rknn_server、librknn\[_runtime.so](_runtime.so)
# 校验NPU驱动正常
dmesg | grep Galcore
strings /usr/lib/librknn_runtime.so | grep version
2. 板端依赖安装(Debian 系统)
apt update
apt install python3-pip libopencv-dev libgomp1
# 安装板端推理库 rknn_toolkit_lite2
pip3 install rknn_toolkit_lite2-2.3.2-cp38-aarch64.whl
# 部署RKLLM板端运行库
cp ./rkllm_lib/aarch64/* /usr/lib/
3. 关键配置:关闭系统内存交换,预留大模型运行内存
swapoff -a
echo 0 > /proc/sys/vm/swappiness
三、方案 A:RKLLM 轻量化大模型一键转换(推荐)
RKLLM 封装完整 LLM 流水线,自动完成模型量化、NPU 编译、生成.rkllm推理文件,适配 RV1126B 平台
步骤 1:HuggingFace 轻量化模型本地下载
from transformers import AutoModelForCausalLM, AutoTokenizer
model_name = "Qwen/Qwen-0.7B-Chat"
save_path = "./qwen0.7b_origin"
tokenizer = AutoTokenizer.from_pretrained(model_name)
model = AutoModelForCausalLM.from_pretrained(
model_name, load_in_8bit=False, device_map="cpu"
)
tokenizer.save_pretrained(save_path)
model.save_pretrained(save_path)
步骤 2:RKLLM 量化编译(指定 RV1126B 硬件)
新建build_rkllm.py
from rkllm import RKLLM
# 1. 初始化RKLLM对象
rkllm = RKLLM()
# 2. 加载原始HF模型
ret = rkllm.load_huggingface(model_path="./qwen0.7b_origin")
# 3. 量化&编译配置(RV1126B最优参数)
rkllm.build(
target_platform="rv1126b", # 目标芯片
quant_type="w4a16", # INT4权重量化,大幅降低内存占用
optimization_level=3, # 最高NPU优化
max_context_len=4096, # 上下文长度(2GB内存建议≤4K)
num_threads=4 # 4核A53全部启用
)
# 4. 导出板端可用.rkllm文件
rkllm.export_rkllm("./qwen0.7b_w4_rv1126b.rkllm")
rkllm.release()
print("模型转换完成")
执行转换:
python build_rkllm.py
输出文件:qwen0.7b_w4_rv1126b.rkllm(包含权重、词表、NPU 算子)
步骤 3:RV1126B 板端 Python 流式推理
新建llm_infer.py,支持逐 Token 流式输出
from rkllm import RKLLM, RKLLMInput, RKLLMParam
# 全局回调函数:实时打印生成token
def stream_callback(result, userdata):
print(result.text, end="", flush=True)
# 1. 初始化推理参数
llm_param = RKLLMParam()
llm_param.model_path = "./qwen0.7b_w4_rv1126b.rkllm"
llm_param.max_new_tokens = 512
llm_param.temperature = 0.7
llm_param.top_p = 0.8
llm_param.stream_callback = stream_callback
# 2. 加载模型到NPU
rkllm = RKLLM()
rkllm.init(llm_param)
# 3. 构造输入Prompt
prompt = "你是本地离线AI助手,请简短回答问题:什么是边缘计算?"
input_data = RKLLMInput()
input_data.text = prompt
# 4. 执行本地NPU推理
print("AI回复:")
rkllm.run(input_data)
# 5. 释放NPU内存(必须执行,否则内存泄漏)
rkllm.destroy()
板端运行命令:
# 配置库路径
export LD_LIBRARY_PATH=./lib:/usr/lib
python3 llm_infer.py
步骤 4:C++ 高性能推理(产品量产推荐)
1. 使用 SDK 中rkllm_demo示例,修改CMakeLists指定rv1126b交叉编译链
2. 核心 API 流程:rkllm_init() → rkllm_run() → rkllm_destroy()
3. 支持 LoRA 动态加载:rkllm_load_lora(),适配行业微调模型
四、方案 B:原生 RKNN-Toolkit2 拆分 LLM 部署(多模态场景)
适用于需要视觉 Encoder+LLM Decoder 组合(Qwen-VL 轻量化),将 Transformer 拆分为输入 Embedding、Attention、FFN、Decoder独立 ONNX,分别转 rknn
1. ONNX 导出与简化
# 导出Decoder单模块ONNX
torch.onnx.export(
decoder_model,
dummy_input,
"llm_decoder.onnx",
opset_version=17,
do_constant_folding=True
)
# 简化模型去除冗余算子
import onnxsim
model = onnx.load("llm_decoder.onnx")
sim_model, ok = onnxsim.simplify(model)
onnx.save(sim_model, "llm_decoder_sim.onnx")
2. RKNN 转换脚本(target 指定 rv1126b)
from rknn.api import RKNN
rknn = RKNN(verbose=True)
# 硬件平台锁定RV1126B
rknn.config(target_platform="rv1126b", quantized_dtype="w4")
rknn.load_onnx("llm_decoder_sim.onnx")
# INT4量化,校准数据集
rknn.build(do_quantization=True, dataset="./calib.txt")
rknn.export_rknn("llm_decoder.rknn")
rknn.release()
3. 板端循环解码逻辑
1. 预处理:token 编码、position embedding CPU 计算
2. NPU 推理:循环调用rknn_infer生成 next token
3. 后处理:token 解码,终止符判断,循环直到生成结束
缺点:需自行实现 KV 缓存、流式输出,开发量大于 RKLLM
五、关键优化方案(解决 RV1126B 内存 / 速度瓶颈)
1. 内存优化(杜绝 OOM)
1. 强制W4A16 量化,模型体积压缩 75%,优先 2GB 核心板使用
2. KV 缓存分块:RKLLM 开启cache_block_size=128,减少瞬时内存占用
3. 关闭并行加载:单次仅运行 1 个 LLM 模型,不与 YOLO/OCR 同时跑 NPU
4. 系统裁剪:Buildroot 固件删除无用服务,空闲内存≥800MB 再启动大模型
2. 推理速度优化
1. NPU 独占:停止 rknn_server 其他任务,echo 1 > /proc/galcore/exclusive
2. CPU 四线程拉满:num_threads=4,关闭 CPU 节能调频
3. 上下文截断:2GB 内存 max_context_len=4096,不要开到 16K
4. 模型剪枝:源头裁剪 LLM 层数、头数,使用 MiniCPM/TinyLLaMA 原生轻量版本
3. 量化精度平衡
离线问答 / 文本总结:W4A16(速度优先,损失可忽略)
高精度代码 / 数学推理:INT8 量化,需 4GB DDR 核心板
六、常见报错与排错
1. NPU 内存溢出 OOM
原因:内存不足、上下文过长、未使用 W4 量化
解决:更换 2GB/4GB 核心板、降低 max_context_len、重新 W4 量化
2. rknn_init 失败 Galcore 报错
解决:重启 rknn_server,升级固件匹配 RV1126B 驱动版本
3. 推理速度极慢(<1token/s)
排查:未指定 target_platform="rv1126b",模型跑在 CPU 而非 NPU
4. token 输出乱码
解决:转换时同步导出 tokenizer 词表,板端使用配套 sentencepiece
七、量产落地建议
1. 硬件选型:优先2GB DDR RV1126B 核心板,eMMC≥16GB
2. 模型标准:统一使用 RKLLM W4 量化.rkllm格式,兼容 SDK 迭代
3. 系统:Debian 完整系统方便调试;量产使用 Buildroot 精简固件
4. 场景适配:本地语音问答、设备故障文本分析、离线工单摘要、IPC 画面图文联动
需求留言: