在嵌入式设备上运行大语言模型一直是个挑战,特别是当我们需要实时交互时。传统方案要么依赖云端计算(延迟高、隐私差),要么在本地用CPU硬算(速度慢、功耗高)。而地平线RDK S100开发板搭载的BPU(Brain Processing Unit)专用加速器,为我们提供了第三种可能——在边缘端实现高效的大模型推理。
我最近成功在RDK S100上部署了DeepSeek 1.5B模型,实测推理速度比纯CPU方案提升近10倍。整个过程踩了不少坑,特别是BPU专属内存分配这个关键问题。下面就把我的完整实现路径和解决方案分享给大家。
RDK S100开发板的主要规格:
需要特别注意:
从官方FTP服务器下载:
推理引擎包:OpenExplorer_LLM_0.9.0.tar.gz
xlm_demo专用模型文件:DeepSeek_R1_Distill_Qwen_1.5B_4096.hbm
下载命令:
bash复制curl -u "oeftp:Oeftp~123$%" -O "ftp://sdk.d-robotics.cc/oe_llm_v0.9.0/OpenExplorer_LLM_0.9.0.tar.gz"
curl -u "oeftp:Oeftp~123$%" -O "ftp://sdk.d-robotics.cc/oe_llm_v0.9.0/DeepSeek_R1_Distill_Qwen_1.5B_4096.hbm"
注意:浏览器下载大文件可能中断,建议直接用curl命令
使用scp命令通过局域网传输:
bash复制scp OpenExplorer_LLM_0.9.0.tar.gz DeepSeek_R1_Distill_Qwen_1.5B_4096.hbm root@192.168.137.100:/jinyl_dev/models/
常见问题处理:
bash复制sudo chmod 777 /jinyl_dev/models/
在开发板上操作:
bash复制cd /jinyl_dev/models/
tar -xzf OpenExplorer_LLM_0.9.0.tar.gz
目录结构说明:
code复制OpenExplorer_LLM_0.9.0/
├── runtime/ # 核心运行时
│ ├── bin/ # 可执行文件
│ ├── lib/ # BPU动态库
│ └── config/ # 模型配置文件
└── DeepSeek_R1_Distill_Qwen_1.5B_4096.hbm # BPU专用模型
进入运行时目录:
bash复制cd /jinyl_dev/models/OpenExplorer_LLM_0.9.0/runtime/
设置性能模式:
bash复制sudo sh set_permorfance_mode.sh
配置库路径(临时):
bash复制export LD_LIBRARY_PATH=$(pwd)/lib:$LD_LIBRARY_PATH
永久生效配置(写入.bashrc):
bash复制echo 'export LD_LIBRARY_PATH=/jinyl_dev/models/OpenExplorer_LLM_0.9.0/runtime/lib:$LD_LIBRARY_PATH' >> ~/.bashrc
source ~/.bashrc
执行推理命令:
bash复制./bin/xlm_demo \
--hbm_path /jinyl_dev/models/DeepSeek_R1_Distill_Qwen_1.5B_4096.hbm \
--tokenizer_dir ./config/DeepSeek_R1_Distill_Qwen_1.5B_config/ \
--template_path ./config/DeepSeek_R1_Distill_Qwen_1.5B_config/DeepSeek_R1_Distill_Qwen_1.5B.jinja \
--model_type 3
预期输出:
[User] <<<常见错误:
code复制Cannot malloc bpu memory with length 2234994104 bytes
这表示BPU需要约2.1GB连续内存,但当前ION内存池不足。需要区分两种内存:
系统内存:通过free -h查看
ION内存:BPU专用内存池
检查ION内存状态:
bash复制dmesg | grep -i "ion"
cat /sys/kernel/debug/ion/heaps/system 2>/dev/null
官方提供了设备树修改脚本update_ion_dtb.sh,主要功能:
执行步骤:
bash复制# 1. 创建脚本文件
nano update_ion_dtb.sh
# 粘贴脚本内容后保存
# 2. 赋予执行权限
chmod +x update_ion_dtb.sh
# 3. 执行修改(bpu_first模式)
sudo ./update_ion_dtb.sh bpu_first
# 4. 重启生效
sudo reboot
重要:修改前备份原始dtb文件!
bash复制cd /boot/hobot/ sudo cp rdk-s100-v1p0.dtb rdk-s100-v1p0.dtb.bak
重启后检查:
bash复制dmesg | grep -i "ion-pool"
成功输出示例:
code复制Reserved ion-pool MEM: size 0xf0000000
(0xf0000000 = 3840MiB)
创建clean_mem.sh:
bash复制#!/bin/bash
# 释放pagecache
sync; echo 1 > /proc/sys/vm/drop_caches
# 释放dentries和inodes
sync; echo 2 > /proc/sys/vm/drop_caches
# 全部释放
sync; echo 3 > /proc/sys/vm/drop_caches
使用方法:
bash复制sudo ./clean_mem.sh
free -h # 查看效果
创建start_demo.sh:
bash复制#!/bin/bash
# 设置性能模式
sudo /jinyl_dev/models/OpenExplorer_LLM_0.9.0/runtime/set_permorfance_mode.sh
# 清理内存
sync; echo 3 > /proc/sys/vm/drop_caches
# 启动推理
cd /jinyl_dev/models/OpenExplorer_LLM_0.9.0/runtime/
./bin/xlm_demo \
--hbm_path /jinyl_dev/models/DeepSeek_R1_Distill_Qwen_1.5B_4096.hbm \
--tokenizer_dir ./config/DeepSeek_R1_Distill_Qwen_1.5B_config/ \
--template_path ./config/DeepSeek_R1_Distill_Qwen_1.5B_config/DeepSeek_R1_Distill_Qwen_1.5B.jinja \
--model_type 3
赋予执行权限:
bash复制chmod +x start_demo.sh
| 维度 | Ollama方案 | 原生BPU方案 |
|---|---|---|
| 计算单元 | CPU通用计算 | BPU专用加速器 |
| 模型格式 | GGUF | HBM(硬件二进制模型) |
| 内存管理 | 系统内存 | 独立ION内存池 |
| 延迟 | 高(>500ms/token) | 低(<100ms/token) |
| 能效比 | 低(10-20TOPS/W) | 高(50-80TOPS/W) |
测试环境:
结果对比:
code复制Ollama(CPU): 12.5 token/s
BPU原生: 38.7 token/s
如需部署其他模型:
转换示例:
bash复制hb_mapper makertbin --model model.onnx --output model.hbm
C++调用示例:
cpp复制#include <hb_dnn/hb_dnn.h>
// 初始化BPU
hbDNNInitializeFromFiles(&model, "model.hbm");
// 准备输入
hbDNNTensor input;
hbDNNGetInputTensor(&input, 0, model);
// 执行推理
hbDNNTaskHandle_t task;
hbDNNInfer(&task, &output, &input, model, nullptr);
// 获取输出
hbDNNTensor output;
hbDNNGetOutputTensor(&output, 0, model);
| 错误现象 | 可能原因 | 解决方案 |
|---|---|---|
| Cannot malloc bpu memory | ION内存不足 | 调整设备树内存分配 |
| xlm_demo: not found | 库路径未设置 | 检查LD_LIBRARY_PATH |
| 段错误 (Segmentation fault) | 模型文件损坏 | 重新下载验证md5 |
| 推理结果乱码 | tokenizer配置不匹配 | 检查config目录文件 |
| BPU初始化失败 | 性能模式未启用 | 执行set_permorfance_mode.sh |
检查BPU状态:
bash复制cat /proc/ion/clients
监控BPU负载:
bash复制watch -n 1 "cat /sys/class/hobot/bpu/bpu0/load"
查看模型信息:
bash复制hb_model_info DeepSeek_R1_Distill_Qwen_1.5B_4096.hbm
通过这次在RDK S100上部署DeepSeek 1.5B模型的实践,我们验证了BPU在边缘计算场景下的巨大潜力。关键收获包括:
未来可探索方向:
这个方案特别适合需要本地化、低延迟AI能力的场景,如服务机器人、工业质检等。希望我的实践记录能为你的边缘计算项目提供参考。