专栏算法工具链pluto 模型量化精度低的问题

pluto 模型量化精度低的问题

默认653442026-03-19
49
6
你好,我在使用 地平线工具链(尝试过OE3.2和3.7)进行模型转换部署,模型是 pluto 规划算法,bc 文件的实测精度与量化后的余弦相似度都很低,并且试过配置成 int16 精度,依然是一样的,请问这是什么问题导致的呢
附件:
算法工具链
技术深度解析征程6
评论1
0/1000
  • 费小财
    Lv.5
    多输入模型在转换过程中输入顺序可能变化,务必使用 hb_model_info 确认 .hbm 的实际输入顺序,避免因输入错位导致精度误判(来源),使用 hb_verifier 工具验证 .bc 与原始 ONNX 的余弦相似度,确保对比的是正确输入顺序下的输出
    2026-03-19
    0
    5
    • 默认65344回复费小财:

      你好,我将转换yaml配置为全部节点都为fp32,此时得到的bc文件使用 hb_verifier 工具验证其与原始 ONNX 的余弦相似度是1.0,输出数值也完全一样,这应该能排除数输入数据错位的原因吧

      2026-03-19
      0
    • Huanghui回复默认65344:
      从现象看,这个问题不像是单纯的 int8 量化误差。因为您这边已经尝试过 OE3.2 / OE3.7,并且切到 int16 后结果仍无明显改善,这种情况通常更建议优先排查:
      1. 输入链路是否与浮点基线完全一致
        尤其是 pluto 这类规划模型,往往对 输入顺序、shape/dtype、历史帧组织、mask/padding、坐标系/归一化 比较敏感;
      2. 模型是否在导出/优化阶段就已经引入偏差
        建议确认一下问题是从 原始 ONNX、优化后optimized模型、量化后quantized模型、还是最终hbm 开始明显变差的;
      3. 不要只看整体 cosine
        最好再看一下是否是某几个关键输出分支先失真,而不是所有输出都一致变差。

      建议您下一步先帮忙确认下这几个信息:

      • 问题是从哪个阶段开始明显变差的:
        原始 ONNX / 优化后 / 量化后 / 板端运行
      • 模型是单输入还是多输入,各输入的 name / shape / dtype / 实际喂入顺序 是否已逐项核对
      如果 int16 也没有改善,一般就要优先看输入链路一致性(确定流程问题)导出/优化后的图结构变化(结构问题,可能性不大但不排除)了,而不太像是普通 bitwidth 不够导致的。
      如果经过排查,确定bitwidth 不够导致,鉴于规划模型的复杂度和敏感性,量化不友好的复杂算子比较多,后面还是要通过QAT方式处理。
      2026-03-19
      0
    • 默认65344回复Huanghui:

      好的,感谢,我先按照您说的继续测试,定位一下问题

      2026-03-19
      0
    • 默认65344回复Huanghui:
      你好,经过测试:可以确认:
      1、输入链路(多输入的顺序name / shape / dtype)与浮点基线完全一致(对比原始 ONNX,bc,hbm的输入打印);
      2、原始 ONNX、optimized模型的推理的结果精度都是完全正常、calibrated和ptq就失控了(并非误差,而是轨迹完全失真);
      3、终端观察到在calibrate阶段有多个警告(出现大量 find inf threshold 和 find non positive threshold 警告,且集中在 注意力模块的 Where, Softmax, Add, Mul 等节点。)
      请问目前应该怎么处理,看似不是量化造成的误差。
      2026-03-19
      0
    • Huanghui回复默认65344:
      从您补充的信息看,问题已经基本收敛到 calibrate/PTQ 阶段。由于原始 ONNX 和 optimized 模型结果都正常,而 calibrated/PTQ 开始出现轨迹完全失真,同时 warning 又集中在注意力模块的 Where / Softmax / Add / Mul 等节点,这更像是 注意力子图在量化校准阶段的阈值求解异常,而不是普通的量化小误差。

      建议下一步优先围绕 warning 集中的注意力子图做处理,不建议继续全模型盲调。可优先尝试:
      1)将 attention 相关关键节点及其前后小段子图提升为更高精度(int16不行就fp32);
      2)检查 calibrate 数据是否覆盖真实输入分布(典型的场景数据就好, 不要搞特殊的甚至不校准,比如全0,);
      3)用debug工具做一次检查(get_sensitivity_of_nodes 和 sensitivity_analysis ),观察敏感节点 和 warning 节点附近的逐段输出对比,确认具体是从哪个节点开始分布失真。
      2026-03-19
      0