OE Agent“天工”新版本发布,请前往论坛顶部查看,欢迎试用并反馈~
查看OE-Skills
专栏算法工具链J6编译生成hbr hbm模型报错

J6编译生成hbr hbm模型报错

thui2026-05-21
119
-2

芯片J6M,使用cat_filter为FCOSMultiStrideCatFilter"后报错RuntimeError:Hbir output shape is different with actual torch output([59136] vs torch.Size([5])),please report a bug to horizon_plugin_pytorch develop team Hbir output 和torch output都是库函数的中间计算结果,

现在就是想把FCOSMultiStrideCatFilter做到hbm里,你们应该有成功案例,初始输入经过FilterModule后输出形状即torch.size()改变了,那expand到初始形状可以吗?能否讲下复原逻辑,因为输入是3个tensor,
当前报错 [59136] vs torch.Size([5])发生在horizon_plugin_pytorch/quantization/hbdk4/export_hbir/export_hbir.py,请问这里FuncConverterBase和ModuleConverterBase的区别,他们的convert_with_hbir都没有实现,没有问题吗?
算法工具链
技术深度解析征程6
评论2
0/600
  • 默认24672
    Lv.1

    原来是这样

    2026-06-16
    0
    0
  • 费小财
    Lv.5
    如果业务允许,必须保证 Filter 的输出 Shape 是固定的
    做法:修改 FCOSMultiStrideCatFilter 的实现,使其输出一个固定大小的 Tensor(例如最大可能检测数 NmaxN_{max}Nmax​)。
    复原逻辑
    1. Padding:如果筛选后的结果不足 NmaxN_{max}Nmax​,用无效值(如 -1 或 0)填充剩余位置。
    2. Valid Mask:额外输出一个 Mask Tensor 或 Count Tensor,指示哪些位置是有效数据。
    3. 后续处理:在 HBIR 之后的 CPU 后处理代码中,根据 Mask/Count 读取有效数据。
    2026-05-22
    0
    3
    • thui回复费小财:
      这个思路就是你们当前用FCOSMultiStrideCatFilter的做法吗,可是在转hbir的过程中看到export_hbir.py库中有attach_hbir_to_tensor,gather_hbir等函数,是要做infer把tensor值和hbir关联吗?为什么这么做?这些操作和FCOSMultiStrideCatFilter有干涉吧,因为filter后的值要传到hbir,这里怎么处理呢?THX
      2026-05-22
      0
    • 费小财回复thui:

      以下是对这些内部机制的解析,以及它们与 FCOSMultiStrideCatFilter 报错之间的逻辑关系:

      1. attach_hbir_to_tensor 和 gather_hbir 的作用是什么?

      核心目的:建立 PyTorch Tensor 与 HBIR Node 的“血缘关系”映射。

      在地平线的导出流程中,并不是简单地把 PyTorch 图翻译成 HBIR,而是一个 Tracing + Mapping 的过程:

      Tracing (追踪):

      插件会运行一次 PyTorch 模型(使用 `example_inputs)。

      在这个过程中,每一个中间产生的 torch.Tensor对象都会被“挂钩”一个对应的 HBIR 节点(或值)。

      attach_hbir_to_tensor(tensor, hbir_value):这个操作就是把当前 PyTorch运行时产生的 Tensor对象,绑定到正在构建的 HBIR图中的某个具体节点上。这样,当后续算子引用这个 Tensor时,插件知道它对应 HBIR里的哪个值。

      Gathering (收集/校验):

      gather_hbir():通常在函数出口或模块出口调用。它的作用是收集当前作用域内所有“输出 Tensor”所绑定的 HBIR节点,并将它们组装成 HBIR函数的正式输出列表。

      关键校验点:正是在这个阶段(或紧随其后的形状检查阶段),插件会对比 HBIR推导出的Shape 和 PyTorch实际运行得到的Tensor Shape。

      为什么要这么做?

      一致性保证:确保生成的 HBIR模型在结构上与 PyTorch模型完全等价。

      调试支持:如果中间某一步 Shape对不上,工具链可以精确指出是哪一个 Tensor(通过名字或ID)出了问题,而不是只报一个通用的编译错误。

      处理复杂控制流:虽然 HBIR本身不支持动态控制流,但通过这种映射机制,插件可以尝试将某些静态化的分支逻辑映射过去。如果映射失败(如动态Shape),就会在你看到的 export_hbir.py中抛出 RuntimeError。
      2026-05-25
      0
    • thui回复费小财:
      谢谢回答,我还有疑问1、”当后续算子引用这个 Tensor时,插件知道它对应 HBIR里的哪个值“,这个时候已通过QAT训练得到带量化参数的模型,转hbir和hbm还要再改量化参数吗,不改的话做这一步的意义在哪呢2、接上述问题,目前filter后的值(形状已变)要传到hbir做校验,这里如何改hbir,我看到本来有一个hbir.filter(HBIR filter op =_ods_ext.FilterOp)的操作,在这里改成model filter一致的逻辑和输出吗?3、新问题:如果2的形状过滤一致了,还有接下来AddDesc做校验不通过,这里有个horizon.set_annotation和pred,tensor_idx=regroup(flat_tensors,fmt)的操作,能讲述下思想吗4、如果做完一切,把FCOSMultiStrideCatFilter加进来,需要重新训练吗?非常感谢
      2026-05-25
      0