我测试了一下,只有在处理某张图片的时候才会调用BPU?如果我想使用BPU加速,我该怎么办?
你好 @my-gao,
你观察到的现象是完全正常的,这正是当前 RDK X5 部署 InternVL2_5 等多模态大模型(VLM)的标准架构。
核心结论
- 架构设计如此:在当前的官方部署方案中,ViT(视觉编码器)运行在 BPU 上,而 Qwen(语言解码器)运行在 CPU 上。
- BPU 调用时机:BPU 仅在处理图像、进行视觉编码的瞬间被调用。一旦图像特征提取完成,后续的文本生成(推理)过程完全由 CPU 承担,因此你只会看到瞬间的 BPU 占用。
- 如何加速:目前无法直接将 Qwen 语言模型部分迁移到 BPU 上运行。加速的重点在于优化 CPU 性能和内存带宽。
详细原理解析
1. 为什么 ViT 在 BPU,Qwen 在 CPU?
这是由地平线 RDK 系列芯片的硬件特性和当前工具链支持决定的:
- BPU (Brain Processing Unit):专为卷积神经网络(CNN)和 Transformer 中的视觉算子(如 Attention, Conv)高度优化。ViT 模型结构规整,算子固定,非常适合 BPU 加速。在 RDK X5 运行 vlm 模型 这个精华帖中,明确提到模型文件包含
vit_model_int16_v2.bin(BPU 模型) 和Qwen2.5-0.5B-Instruct-Q4_0.gguf(CPU 模型)。 - CPU:负责运行逻辑复杂、算子多样的语言模型。虽然 BPU 理论上能跑 LLM,但目前官方工具链对 LLM 的 BPU 部署支持有限(主要支持特定量化格式的特定模型),且 Qwen 这类模型在 llama.cpp 框架下主要依赖 CPU 推理。
2. 为什么感觉 BPU 没怎么工作?
- 工作流程:
- 输入图像 → ViT (BPU):耗时极短(毫秒级),提取图像特征向量。
- 特征向量 + 提示词 → Qwen (CPU):耗时较长(秒级),逐个 token 生成回答。
- 现象:因为第一步太快,你可能只看到 BPU 占用率闪了一下,绝大部分时间都在等 CPU 慢慢“打字”。
如何优化/加速?
既然语言部分跑在 CPU 上,优化的核心就是释放 CPU 算力和提高内存吞吐。
方案一:调整 CPU 频率(最直接)
确保你的 X5 处于高性能模式。
# 查看当前频率模式
cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor
# 设置为性能模式 (performance)
echo performance | sudo tee /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor
方案二:调整内存频率与大小
VLM 对内存带宽极其敏感。
- 增大 ION 内存:参考你使用的教程,使用
srpi-config将 ION 内存调整到最大(如 2.5GB 或更高,视板卡而定),防止 Swap 交换。 - 开启 Fast Perf 模式:如果板卡支持,开启高性能模式会同时提升 DDR 频率。
方案三:量化语言模型(降低计算量)
你目前使用的应该是 Q4_0 (4bit 量化) 的 Qwen 模型。
- 检查是否可以尝试更低精度的量化(如
Q2_K),但这会显著降低智商,通常不推荐。 - 确认你加载的 gguf 文件确实是量化过的,而不是 fp16 版本。
方案四:减少线程数干扰
在运行命令中,--threads 参数非常关键。
- 不要设置为 CPU 的总逻辑核心数。
- 建议:设置为大核数量或略少。X5 通常有 4 个 A53 大核和 4 个 A53 小核(或类似配置)。尝试设置为
4或6往往比8更快,因为过多的线程会导致上下文切换开销。# 尝试调整 threads 参数,例如设为 4 ./build/bin/llama-intern2vl-bpu-cli ... --threads 4
总结与社区资源
- 现状:Qwen 跑在 CPU 上是当前方案的限制,不是你的配置错误。
- 未来:地平线正在逐步完善 LLM 的 BPU 工具链(参考社区中关于
hobot_llamacpp的讨论),未来可能会有支持 BPU 加速语言部分的方案,但目前 InternVL2_5 的官方示例仍是混合架构。 - 建议:参考社区精华帖 RDK X5 运行 vlm 模型 的评论区,有其他开发者关于“生成速度慢”的讨论,可以借鉴他们的参数调整经验。
一句话建议:把 CPU 频率拉到最高,ION 内存给够,--threads 设为 4 试试,别指望 BPU 能加速文字生成部分。
X5 BPU没办法跑,本质10T算力也难达到LLM推理的需求,推荐关注下S100和S600