地平线 J6 部署 YOLO26:从 INT64 Div 算子约束到 Cast 修复全流程
本文记录了在地平线 RDK J6 平台(Nash-E 架构)上部署 YOLO26 检测模型时,遇到的 INT64 类型 Div 算子 BPU 不支持问题,以及从定位到修复的完整过程,适合有一定 ONNX 和地平线部署基础的读者参考。
一、YOLO26 的结构与创新
YOLO26 是基于 YOLOv8 架构改进的新一代目标检测模型,主要特征包括:
1. DFL 移除
分布焦点损失(DFL)模块虽然有效,但导出复杂且硬件兼容性有限。YOLO26 完全取消了 DFL,简化了推理,并拓宽了对边缘和低功耗设备的支持。
2. 端到端无 NMS 推断
与依赖 NMS 作为独立后处理步骤的传统探测器不同,YOLO26 本身是端到端的。预测数据直接生成,降低延迟,使得与生产系统的集成更快、更轻便、更可靠。ProgLoss + STAL 改进的损失函数提高了检测精度,显著提升了小物体识别能力,这是物联网、机器人、航拍及其他边缘应用的关键需求。
3. MuSGD 优化器
一款结合 SGD 与 Muon 的新型混合优化器。受 Moonshot AI 的 Kimi K2 启发,MuSGD 将 LLM 训练的先进优化方法引入计算机视觉,实现更稳定的训练和更快的融合。
二、问题出现:HMCT 转换时的 Warning
三、根本原因:INT64 数据链路分析
通过诊断脚本分析 ONNX 模型中所有 INT64 节点,可以看到问题的完整链路:
为什么 TopK 的输出必须是 INT64?
四、J6E/M BPU 对 Div 算子的约束
查阅地平线 J6E/M 的 ONNX 算子 BPU 约束列表,Div 算子的约束如下:
关键结论:BPU 支持的整数类型是 int8、int16、int32,但不支持 INT64。
这带来了两个严重后果:
后果一:HMCT 转换时报 Warning
HMCT 发现 Div 节点的输入是 INT64,无法对其量化,输出警告:
后果二:算子被迫回退到 CPU 执行

这意味着:
BPU 和 CPU 之间的数据搬运(内存拷贝)本身就有开销,加上 CPU 串行执行这些节点,在实时检测场景下会造成明显的延迟瓶颈,无法充分利用 BPU 的算力优势。
修复目标因此非常明确:将 Div 的数据类型改为 INT32,使其满足 BPU 算子约束,从 CPU 回退变为 BPU 执行,恢复完整的 BPU 推理链路。
五、为什么不能直接把 Div 改成 INT32
一个直觉上的想法是:直接修改 Div 节点的类型为 INT32 不就行了?
六、解决方案:在关键节点前插入 Cast
完整的修复链路如下:

真正需要做的只有两件事:
七、总结
问题 | 原因 | 解决方法 |
|---|---|---|
HMCT 报 INT64 Warning | Div 输入来自 TopK,类型强制 INT64,BPU 不支持量化 | 在 TopK 输出后插入 Cast(INT64→INT32) |
Div 回退 CPU 执行 | INT64 不在 BPU 算子约束支持列表,无法调度到 BPU | 改为 INT32 后满足 BPU 约束,恢复 BPU 执行 |