专栏算法工具链【J5】请问量化时如何避免_hz_cat_1_rescale_1这类操作的产生

【J5】请问量化时如何避免_hz_cat_1_rescale_1这类操作的产生

已解决
YUANYI2026-04-10
867
19

【J5】

量化后使用perf_model发现每一个torch.cat算子都会附加产生大量的hz_cat_1_rescale_1这样的算子,影响模型性能,请问应该如何规避呢?torch.cat的多个输入使用的都是相同的qconfig配置(均为默认default_qat_8bit_fake_quant_qconfig)
算法工具链
技术深度解析征程5
评论2
0/1000
  • YCJ
    Lv.4
    这个问题的原因是 torch.cat 的多个输入 Tensor 虽然配置了相同的量化类型(如 int8),但其统计得到的量化参数Scale不一致。 在 BPU 硬件上,cat 操作要求所有输入必须具有完全相同的量化参数。如果不同分支的 Scale 不同,编译器必须插入 rescale 算子将其中一个或多个输入对齐到另一个输入的量化域。
    你可以让这些输入在进入 cat 之前,经过的是同一个 QuantStub 实例去避免 Scale 不一致的问题
    2026-04-13
    0
    17
    • YUANYI回复YCJ:

      请问要如何实现呢,我这样修改后,最后转hbm阶段执行torch.jit.trace会报错:AssertionError: input scale must be the same as op’s:

      class xxxx(nn.Module):

      def init(self, in_channels=128, window_sizes=[3, 7, 9]):

      super().__init__()

      self.quant_k = QuantStub() # for cat scale

      self.quant_v = QuantStub() # for cat scale

      def forward(self):

      k_features = torch.cat([self.quant_k(k_3x3), self.quant_k(k_7x7), self.quant_k(k_9x9)], dim=1) # for cat scale
      v_features = torch.cat([self.quant_v(v_3x3), self.quant_v(v_7x7), self.quant_v(v_9x9)], dim=1) # for cat scale
      2026-04-13
      0
    • YCJ回复YUANYI:
      你可以尝试浮点域就concat三个tensor,再把结果统一做量化,就能避免rescale算子
      2026-04-13
      0
    • YUANYI回复YCJ:

      是指三个tensor先反量化回float么?

      2026-04-13
      0
    • YCJ回复YUANYI:

      是的,这样可以避免产生rescale节点。但我有个疑问,你是在哪个模型上看到的这个算子,是校准模型吗?按理说这个算子不会影响hbm的推理。

      2026-04-13
      0
    • YUANYI回复YCJ:

      我是qat量化,是最后转hbm时发现产生大量rescale节点的(使用perf_model分析模型时发现),绝大多数torch.cat算子都被会附加上这个节点,这个节点一多就把模型速度拉低了

      2026-04-13
      0
    • YUANYI回复YCJ:

      大量使用反量化不是也会影响速度吗,我怕得不偿失

      2026-04-13
      0
    • YUANYI回复YCJ:

      rescale对精度没影响,我主要是在优化速度

      2026-04-13
      0
    • YCJ回复YUANYI:

      这样,你把perf_model的结果分享一下呢,我看下耗时有多严重

      2026-04-13
      0
    • YUANYI回复YCJ:

      单帧推理时间从68ms增至74ms,一共出现了104个rescale,平均每个耗时44us

      2026-04-13
      0
    • YCJ回复YUANYI:

      能分享html吗

      2026-04-13
      0
    • YUANYI回复YCJ:

      因为我有一个子模块里使用了多个cat操作,反复调用该子模块就会累计很多个cat

      2026-04-13
      0
    • YUANYI回复YCJ:

      html怎么上传呢

      2026-04-13
      0
    • YCJ回复YUANYI:

      873651674@qq.com

      2026-04-13
      0
    • YUANYI回复YCJ:
      你好,我这边邮箱不能外发,给您截图看下
      2026-04-13
      0
    • YUANYI回复YCJ:

      就是这样的结构反复了多次

      2026-04-13
      0
    • YCJ回复YUANYI:

      截一下那个时序图Temporal Statistics:

      2026-04-13
      0
    • YUANYI回复YCJ:
      2026-04-13
      0
  • zyhang
    Lv.1

    您好,鉴于长时间未收到你的答复,我们暂将该问题做关闭处理,如您仍有相同问题,请在新的帖子中重新发起提问,祝您工作愉快!

    2026-05-07
    0
    0