专栏算法工具链j3 QAT时转换hbm文件时出现问题

j3 QAT时转换hbm文件时出现问题

解答中
默认478722026-01-20
114
18
  1. 芯片型号:J3

  2. 天工开物开发包 OpenExplorer 版本:horizon_xj3_open_explorer_v2.6.4-py38_20240319

  3. 问题定位:模型量化编译hbm文件时报错

  4. 问题具体描述:我们自己搭建的模型,浮点训练、校准和QAT训练都正常,但在最后做模型量化编译时出现问题,具体报错信息如下:

Description

log全文如下:

附件:
算法工具链
征程3
评论3
0/1000
  • YCJ
    Lv.4

    你好,在 common.py 里的 compile 前对量化模型包了一层 quantized_model = InversePermuteWrapper(quantized_model), 这一步会在模型最外层强制插入一次 NHWC/NCHW 的 transpose。 在使用 input_source = pyramid 的情况下,模型内部已经采用了硬件 pack 的 layout(如 NHCW_8W4C / 16W16C),再叠加这次 transpose 会触发 HBDK 当前不支持的 layout conversion 路径,从而导致编译失败。 我这边验证过:去掉 quantized_model = InversePermuteWrapper(quantized_model) 后,模型可以正常编译生成 hbm,说明网络结构和量化本身是 OK 的。

    2026-01-21
    1
    14
    • 默认47872回复YCJ:
      您好,我这边去掉包这个 InversePermuteWrapper(quantized_model) ,还是同样的报错, not implemented: file=57d68021d11d02e6b273a179dfdf24ac7fbc51d2:2709: unsupported layout conversion, old layouts: (NHCW_8W4C, NHCW_8W4C_S2D, NHCW_16W16C, NHCW_16W16C_S2D), but new layouts: (NHWC_32W2C) ,并且我之前尝试修改fx_mode_yolov8.py中 get_model_fx 中march的值为BAYES,就能通过编译,但是改回 march=March.BERNOULLI2 就会出现上述报错,我的common.py 里的compile函数现在是这样:
      2026-01-22
      0
    • YCJ回复默认47872:

      那你检查一下你的docker环境是不是J3?J3的架构是 BERNOULLI2, BAYES 是 J5 的架构

      2026-01-22
      0
    • 默认47872回复YCJ:
      您好,目前的环境是这样的:
      2026-01-22
      0
    • YCJ回复默认47872:

      我这里的目前是可以编译成功的,这样吧,你给我一个邮箱,我把我的 fx_mode_yolov8.py 发给你,你先试一试,怎么样

      2026-01-22
      0
    • 默认47872回复YCJ:
      可以,十分感谢WishingStar_org.svg我的邮箱:726325928@qq.com
      2026-01-22
      0
    • 默认47872回复YCJ:
      您好,还是没通beishang_org.svg,您能否把common.py也发我邮箱
      2026-01-22
      0
    • YCJ回复默认47872:

      没事儿,我把整个工程打包给你,你再试一试

      2026-01-22
      0
    • 默认47872回复YCJ:
      我用您的工程包直接跑是通的,
      我再排查一下我的问题在哪里zhongguozan_org.svg
      2026-01-22
      0
    • YCJ回复默认47872:

      好的!后续有问题咱随时交流!

      2026-01-22
      1
    • 默认47872回复YCJ:
      您好,请问我编译的时候配置的ddr或是pyramid模式会带来什么影响吗,最后模型的部署脚本前处理应该怎么写呢,上板的时候我打算上传一部分数据,直接读取图片来推理ding_org.svg
      2026-01-23
      0
    • YCJ回复默认47872:

      是这样的,ddr 和 pyramid 是板端的器件。配置 ddr 是设置 hbm 的输入数据格式为 rgb 格式的,如果配置了 ddr ,那你得准备int8的数据(通过hrt工具也可以看模型的输入输出)。配置 pyramid 是设置 hbm 的输入数据格式为 nv12 的数据,那你在推理时就应该准备 nv12的数据。你配置的是 pyramid ,所以要准备nv12的数据,OE 包里有相关示例。里面有转换函数 read_image_2_tensor_as_nv12,你可以参考一下。 路径在/horizon_xj3_open_explorer_v2.6.4-py38_20240319/ddk/samples/ai_toolchain/horizon_runtime_sample/code/00_quick_start/src/run_mobileNetV1_224x224.cc

      2026-01-26
      0
    • 默认47872回复YCJ:
      设置为pyramid后除了前处理准备nv12格式的数据,编译的时候是不是还要插入yuv_2_rgb的算子,因为模型训练的时候是用的rgb训练的kun_org.svg
      2026-01-26
      0
    • 默认47872回复YCJ:
      我设置为pyramid后,试着在编译的时候插入 centered_yuv2rgb 算子,报错如下,是J3的不支持这个操作吧,J5才行,那如果我要走pyramid模式的话需要重新用YUV数据类型训练模型是吧
      2026-01-26
      0
    • YCJ回复默认47872:
      不用,J3也是支持插入 centered_yuv2rgb 算子的,具体示例可以看手册。你这里报错的原因是functional.py里有个断言,你可以尝试去把这个断言注释掉或者加上J3的架构。
      2026-01-27
      0
  • YCJ
    Lv.4

    好的收到,这边先帮您复现一下问题,有进展第一时间同步给您

    2026-01-20
    0
    0
  • YCJ
    Lv.4

    你好,目前这边复现了你的问题,问题还在排查中,有进展第一时间和你同步。不过建议你可以尝试一下将qat-checkpoint.ckpt转成onnx走PTQ链路。

    2026-01-21
    0
    1
    • 默认47872回复YCJ:

      好的我试试

      2026-01-21
      0