重要前置说明
1. RKNN3 / RKLLM3 官方原生不支持多卡张量并行跑 27B 稠密大模型,没有开箱即用多卡 demo;整套多卡分片协同推理需要上层自研调度层(层并行 / 模型分片、PCIe 跨卡数据收发、多卡同步)
2. 硬件最低配置:RK3588 载板(≥4 路 M.2 Key M PCIe 扩展)+ 4 片 RK1828(单片 5GB HBM),INT4 量化;INT4 权重≈13.5GB + KV Cache,4 卡合计 20GB HBM 才能完整容纳;双卡 10GB HBM 无法全卡部署,只能做 SSD / 内存权重卸载,速度极慢,仅演示使用
3. 整体流程分为:硬件搭建与驱动适配 → PC 端模型分片、量化、导出 RKNN → 板端自研多卡调度程序开发 → 多卡协同推理调试、性能调优、API 封装
第一阶段:硬件搭建、内核与 RKNN3 运行时部署(RK3588 主控板)
Step1 硬件选型与装配
1. 主控:RK3588 核心板,配套支持 4 路 M.2 Key M PCIe扩展底板(普通双路底板无法 4 卡扩展)
2. 协算卡:4 张 RK1828 M.2 PCIe 卡,配套独立 12V 大功率供电、强化散热
3. 整机:大容量 DDR4 内存(≥16GB)、高速 NVMe SSD(存放分片模型权重)
4. 装配要点
RK1828 需要独立供电,PCIe 供电不足以满负载运行
上电时序:RK3588 主控先上电,再使能 RK1828(底板 GPIO 控制 PERST 复位),防止硬件损坏
Step2 固件、内核、设备树适配
1. 使用瑞芯微官方适配 RK1828 的 Linux 6.1 内核,底板设备树开启多路 PCIe 控制器、PCIe Switch(4 卡扩展必须 PCIe Switch)
2. 编译 RK1828 固件包 rknn3_rk182x_m2_installer_arm64.tgz
3. 拷贝固件包到 RK3588 板端,解压执行安装脚本
tar xzf rknn3_rk182x_m2_installer_arm64.tgz
cd rknn3_rk182x_m2_installer
sudo ./install.sh
reboot
Step3 验证 RK1828 识别、安装 RKNN3 Runtime + RKLLM3
# 查看PCIe是否识别全部4张RK1828
lspci | grep RK182
# 查看rk182设备信息,获取每张卡device-id/bus-id
rknn-smi info
正常输出 4 条 RK1828 设备,记录每一张的设备 ID:dev0 /dev1 /dev2 /dev3
1. 安装板端 RKNN3 Runtime、RKLLM3 库([librkllmrt.so](librkllmrt.so)、librknn\[_api.so](_api.so))
2. 安装依赖:aarch64 gcc、cmake、protobuf、openblas
3. 编译官方单卡 demo(Qwen3-8B),验证单张 RK1828 推理正常(必须先保证单卡可用,再做多卡开发)
第二阶段:PC 端(x86_64 Ubuntu)模型预处理、分片、量化导出
PC 配置建议:≥128GB 内存,NVIDIA GPU(用于 GRQ 量化),RKNN3 Toolkit(配套板端 Runtime 版本,建议 V1.0.4+)
Step1 下载原始模型
# 下载 Qwen3.8-27B 原始权重
git clone https://modelscope.cn/models/Qwen/Qwen3.8-27B
Step2 模型分片策略(自研核心,官方无工具)
两种分片方案可选:
1. 流水线并行 PP(推荐入门):把 Transformer Decoder 层按数量切分,例如 27B 一共 80 层,4 卡分配:20 层 / 卡;卡 0 输出中间特征通过 PCIe 传给卡 1,依次接力计算;实现简单,通信量更小
2. 张量并行 TP(性能更好,开发量大):每层 Attention 头、FFN 权重横向切分到 4 卡,每层推理完成后主控做 All-Gather/Reduce-Scatter 聚合;通信开销大,PCIe 带宽瓶颈明显
注意:RKLLM 原生只支持单卡完整 rknn 模型,不能直接加载分片 rknn,二选一实现方案:
方案 A:拆分模型为 4 个独立子模型,分别导出 4 套.rknn、tokenizer、embed.bin,自研主控调度程序依次调度每张卡加载对应子模型,传递中间 tensor
方案 B:基于 RKNN C API,自行封装分布式推理框架(参考 megatron-lm 分片逻辑)
Step3 INT4 量化(GRQ 量化,RKNN3 原生支持)
1. 准备量化校准数据集(CMMLU / 自建业务数据集,npy 格式)
2. 修改官方 export_rknn.py 脚本,适配 Qwen3.8-27B 模型结构,开启 INT4 GRQ 量化,设置 group-size=128/256
3. 导出 4 套分片模型文件,每个分片产出:
xxx_partX.rknn
xxx_partX.config.pkl
xxx_partX.tokenizer.gguf(全局共用 1 份即可)
xxx_partX.embed.bin(embedding 层可放在主控或第一张 RK1828)
导出命令参考(分片后子模型)
python export_rknn.py \
--onnx_path ./qwen3.8-27b_part0.onnx \
--config ./qwen3.8-27b_part0.config.pkl \
--rknn_path ./qwen3.8-27b_part0.rknn \
--platform rk1828 \
--quant int4 \
--quan_dataset ./calib.npy
Step4 打包全部分片模型,上传至 RK3588 板端 NVMe SSD
目录规划示例
/opt/llm/qwen3.8-27b-4split/
├── part0/
│ ├── qwen3.8-27b_part0.rknn
│ ├── qwen3.8-27b_part0.config.pkl
│ └── qwen3.8-27b_part0.embed.bin
├── part1/
├── part2/
├── part3/
└── qwen3.8-27b.tokenizer.gguf
第三阶段:自研多卡协同调度程序开发(核心定制开发工作)
官方 rkllm3-server 仅支持单卡单模型,原生不支持多卡串联 / 并行,必须自研 C/C++ 调度服务,调用 RKLLM C API
Step1 整体调度架构
1. RK3588 主控负责:tokenizer 编码、解码、prompt 管理、KV Cache 全局管理、PCIe 跨卡 tensor 数据拷贝、多卡任务调度、流式输出
2. 4 张 RK1828 协卡:各自加载对应分片子 rknn 模型,接收上层输入 tensor,执行 NPU 推理,输出中间 feature 返回主控
3. 通信链路:全部中间张量由主控内存中转(RK1828 之间无 P2P 直连,硬瓶颈)
Step2 开发核心模块
1. 多设备管理模块:调用 rknn api 打开 4 个 RK1828 设备句柄,绑定 bus-id
2. 分片加载模块:分别加载 part0~part3 四套 rknn 子模型到对应 RK1828 HBM
3. 流水线推理调度:prefill 填充阶段、decode 生成循环,串行 / 并行调度 4 张子模型,流转中间张量
4. KV Cache 分片管理:每层 KV 缓存跟随 decoder 分片存到对应 RK1828 片上 HBM,减少 PCIe 传输
5. API 封装:实现 OpenAI 兼容接口(/v1/chat/completions),对外提供服务
Step3 交叉编译调度服务
使用 aarch64-linux-gnu 交叉编译工具链,链接:librkllmrt.so librknn_api.so
cmake -DCMAKE_TOOLCHAIN_FILE=aarch64.cmake ..
make -j4
编译产出:llm_multi_card_server,拷贝到 RK3588 板端
第四阶段:板端多卡联调、推理验证与性能优化
Step1 板端启动多卡推理服务
# 调高文件句柄上限(大模型加载必备)
ulimit -n 102400
# 启动自研多卡调度服务,指定4张rk1828设备ID、分片模型目录
./llm_multi_card_server \
--model-root /opt/llm/qwen3.8-27b-4split \
--dev-id 0,1,2,3 \
--max-ctx-len 4096 \
--host 0.0.0.0 \
--port 8080
Step2 功能验证测试
1. curl 调用 OpenAI 接口,测试基础对话、长上下文
2. 排查常见问题:tensor 尺寸不匹配、分片权重对齐错误、PCIe 传输超时、HBM 内存溢出、KV Cache 泄漏
3. 日志打印各阶段耗时:TTFT(首 token 延迟)、token/s 生成速度
Step3 性能调优重点
1. 优化:embedding、lm_head 层放到 RK3588 主控 CPU/NPU,减少协卡 HBM 占用
2. 优化:合并小 tensor 传输、减少 PCIe 频繁小包拷贝,增加 batch 传输
3. 优化:限制上下文长度(4K/8K,16K 以上 HBM 极易溢出)
4. 优化:供电与散热,RK1828 过热降频会导致推理断崖式掉速
5. 权衡:分片越多,单卡计算越少,但 PCIe 通信延迟越高,4 卡是 27B 的平衡点
第五阶段(备选低成本方案:不做自研多卡张量并行)
如果无法投入大量自研开发,可以采用 llama.cpp GGUF + 分层卸载 折中方案
1. PC 端将 Qwen3.8-27B 导出 GGUF INT4 量化文件
2. 在 RK3588 板端编译适配 RK1828 后端的 llama.cpp
3. 使用 --ngl 参数,将部分 decoder 层卸载到多张 RK1828,剩余层跑 RK3588 CPU / 内存
优点:无需自研分片调度;缺点:速度慢,长上下文不稳定,不适合商用高并发场景
风险与落地建议总结
1. 开发周期长:多卡分片调度属于定制开发,无官方参考工程,开发周期通常 4~8 周;优先评估是否可以降级使用 Qwen3.8-14B / Qwen3-8B(单 / 双卡 RK1828 开箱可用)
2. 性能预期:PCIe 无卡间直连,27B 多卡推理 token 生成速度远低于同预算国产 GPU 方案,适合低并发、私有化边缘本地部署(智慧园区、本地私有知识库),不适合高吞吐业务
3. 硬件限制:市面绝大多数 RK3588 商用盒子仅支持双 RK1828 扩展,硬件层面无法 4 卡部署,选型底板前务必确认 PCIe 扩展能力
需求留言: