专栏算法工具链J6_M模型转换时由于ScatterND存在导致量化cosine失效,特别低

J6_M模型转换时由于ScatterND存在导致量化cosine失效,特别低

默认802562026-08-04
26
2

1、芯片型号:J6-M

2、OE包版本:j6_open_v3.9.0-py310

3、问题描述:模型转换

4、问题详细描述:

  • 在对模型执行03_build.sh构建时,cosine在ScatterND之后骤然下降,导致最后的板端推理精度很差。

5、产生ScatterND算子代码块:

附件:
算法工具链
技术深度解析征程6
评论1
0/600
  • XZH
    Lv.2
    您好,针对这个问题我做了最小模型复现,低余弦相似度根因不在于BPU+CPU分区本身,而在于ScatterND索引在转为INT64前参与了量化计算,我的模型原始图的索引路径类似:coors(float) → Mul(BPU) → Add(BPU) → Cast(INT64) → ScatterND虽然 Mul/Add 的浮点 cosine 仍较高,但量化后的结果一旦跨过整数边界,Cast(INT64) 得到的索引就会变化,导致 ScatterND 将特征写入错误的 BEV 位置。因此在 ScatterND 处会出现较低 cosine,并向后续卷积传播。你可以从模型代码侧修改索引生成逻辑:先将坐标转为整型,再计算一维索引。例如:
    coords_int = coords.to(torch.int64) flat_index = coords_int[:, 2] * self.nx + coords_int[:, 3]
    此外,ScatterND 配置为 float32 无法解决该问题,还会出现 INT64 can't be quantized to float32 警告,可以删除对应的quant_config配置。
    12小时前
    0
    1
    • 默认80256回复XZH:

      你好感谢解答,按照你说的方法修改了,consine确实变为0.99了,但是还会出现 INT64 can't be quantized to float32 警。最主要的是上板子推理报如下错误:[STEP 2] BPU Inference...

      [E][1822][08-26][01:53:12:758][dnn_op.cpp:806][gndnet_demo][DNN] [Plan] Run ude node failed! Info: kernel native::InplaceScatterND impl function call failure!It's defined at /scratch/hbcc_jenkins/default_executor_root/workspace/hbdk4/official_release_build@2/hbtl/lib/internal/UdeRegSilverC.cpp 32. Due to index out of range

      [E][1822][08-26][01:53:12:758][cpu_scheduler.cpp:36][gndnet_demo][UCP] Op DNNCpuFusionOp of task 5 for infer failed in CpuBackendSchedule with thread 6.

      10小时前
      0