专栏算法工具链[求助]HAT包中的模型为何对列表支持的torch算子仍进行替换?

[求助]HAT包中的模型为何对列表支持的torch算子仍进行替换?

已解决
溺水小坦克2024-12-29
74
3
OE包版本:3.0.27
在查看OE包中的QAT示例DETR模型时,发现调用的HAT包中定义的DETR模型,对出现torch.cat、torch.add的地方全部使用quantized.FloatFunctional().cat或quantized.FloatFunctional().add替换。可是在3.0.27的用户手册上J6E/M Torch 算子支持列表中,显示torch.cat、torch.add算子全都支持BPU或CPU执行,请问HAT包中为什么不直接使用torch的算子,而是要进行替换?
Description
Description
算法工具链
征程6
评论1
0/1000
  • Huanghui
    Lv.5

    这个问题,分几个层面来看吧:

    1. 算子支持列表只是说用户模型如果包含列表中的算子并且符合约束,工具链可以支持以保证用户模型可以正常转化编译,但不代表是唯一方案,针对具体模型也不一定是最优方案。
    2. 工具链提供的模型是研发的同学针对量化场景和芯片支持情况可能会进行一些优化的,他能保证效率和量化友好性。

    3.torch.cat是常规操作,它没有考虑量化相关的特殊要求。而quantized.FloatFunctional().cat是专门为量化数据设计的拼接操作,在没有涉及量化时,它的行为与普通torch 函数类似。但量化场景下,它可以更好地处理量化后的张量,避免因为数据格式不匹配或未考虑量化特性而导致的错误,也能更好地控制数值精度,防止精度损失或溢出。量化网络的推理阶段,计算图的优化(如融合操作、减少中间存储等)需要所有操作都符合量化规范,quantized.FloatFunctional().cat能够满足这一要求,而torch.cat可能会破坏量化计算图的优化策略。

    2024-12-29
    2
    2
    • 溺水小坦克回复Huanghui:

      请问我是否可以理解为, quantized.FloatFunctional() 中定义好的算子,在我的模型中若出现了,最好都用 quantized.FloatFunctional() 替换掉torch的对应算子,这样能更好的保障量化精度?

      2024-12-30
      0
    • Huanghui回复溺水小坦克:

      是的,你的理解是OK的。在将量化模型中使用quantized.FloatFunctional()一方面 保持代码结构一致性,在模型最终量化时,不需要对代码进行大规模的修改, 有助于提高代码的可维护性 。另一方面 quantized.FloatFunctional() 可以 让模型提前适应量化过程中的计算模式 和计算规则 。

      2025-01-08
      1