以下是对这些内部机制的解析,以及它们与 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。