OE Agent“天工”新版本发布,请前往论坛顶部查看,欢迎试用并反馈~
查看OE-Skills
专栏算法工具链【地平线J6工具链入门教程】PTQ深度使用指南-v2.0

【地平线J6工具链入门教程】PTQ深度使用指南-v2.0

芯链情报局2025-10-30
624
0

文档版本

修订内容

修订时间

v2.0

使用流程、精度起始推荐配置修改订正

2026/06/20

v1.0

初始版本

2025/10/30

这份指南聚焦开发者使用 PTQ 时的实际需求,从 “解决什么问题”“怎么用 PTQ 解决” 的角度,提供实战步骤与技巧,手册(训练后量化PTQ)中已有的通用内容将直接引用在线链接,避免重复。

一、PTQ推荐使用流程

模型检查

解决的核心问题

对于一个新的 ONNX 模型,首先需要快速确认 J6 平台 BPU 对于模型结构、算子等的支持情况,打通 ONNX 浮点模型到板端 hbm 部署模型的全链路验证。

PTQ实战操作

使用hb_compile工具进行模型的快速检查,详细内容可参考用户手册:模型验证

参考命令:

模型检查运行后,会生成一份基础版config.yaml(默认生成路径在 .check 目录下,后续可直接修改使用)。

快速性能评测:摸透模型性能上限

解决的核心问题

快速获取 ONNX 模型在 J6 平台上的最高运行性能,无需投入大量时间配置参数。

PTQ实战操作

使用hb_compile工具--fast-perf参数,一步完成性能评测,详细内容可参考用户手册:快速性能评测模式

参考命令:

fast-perf 模式的核心作用:

  1. 自动将 BPU 可执行算子优先分配到 BPU(int8 精度),最大化性能。

  2. 自动删除模型首尾冗余算子(如 Quantize/Dequantize、Cast、Transpose、Reshape 等),减少性能损耗。

  3. 输出两个关键结果:板端最高性能数据、基础版config.yaml(默认生成路径在 .fast_perf 目录下,后续可直接修改使用)。

参考手册

详细原理与参数细节可查看:hb_compile 工具模型转换说明

yaml模板生成

解决的核心问题

生成一份基础的 yaml 配置模板,避免从零编写的繁琐工作,用于后续模型调优的精细配置。

PTQ实战操作

  1. 复用模型检查或性能评测时生成的基础模板,再进行二次开发。两个环节默认 yaml 生成路径为

    1. 模型检查:.check/xxx_config.yaml

    2. 性能评测:.fast_perf/xxx_config.yaml

  2. 使用 hb_config_generator 工具直接生成模型的基础配置,详细内容可见用户手册:hb_config_generator工具
    1.   参考命令:

  3. Yaml 中核心模块的常见修改示例参考如下:

配置模块

核心修改项

场景示例

calibration_parameters

cal_data_dir(校准数据路径)

quant_config(量化配置文件路径)

input_parameters

input_shape(输入尺寸)

input_type_rt(运行时输入类型)

input_type_train(训练时输入类型)

separate_batch(多batch拆分)

compiler_parameters

compile_mode(编译目标)

extra_params(额外编译选项)

model_parameters

working_dir(输出目录)

remove_node_type(删除首尾算子)

精度上限摸底

解决的核心问题

将所有算子设置为 BPU 约束内的最高精度,摸底精度上限。若精度仍不满足,则需要考虑优化模型、调整校准数据、调整校准方法等。

精度上限推荐配置

J6E/M/B平台

J6P/H平台

J6P/H 平台因为支持更多浮点能力,所以建议全局 float16 降低量化难度(部分算子还支持 float32,具体请见用户手册《J6P/H ONNX算子BPU约束列表》)。

混合精度调优

解决的核心问题

开发者在部署时需兼顾性能(速度)精度(模型效果) ,避免出现 “性能达标但精度不足” 或 “精度够但速度太慢” 的问题,需找到最优性价比的混合精度方案。
基于上述操作已确认模型的性能上限和精度上限,可进一步借助hmct-debugger 工具进行混合精度调优,从低精度配置开始逐步将量化敏感算子配置高精度。

精度起始推荐配置

J6E/M平台

J6E/M 建议全局 int8+int16 混合量化,在精度存在误差时相应增加 int16 算子,例如:

  • 敏感 head 相比于 backbone 通常需要配置更多的 int16 算子

  • Attention 结构中 SoftMax * V 的 MatMul 通常需要对 SoftMax 输入配置 int16 高精度

J6P/H平台

J6P/H 因为支持更多的浮点能力,所以建议全局 float16 降低量化难度(部分算子还支持 float32,具体请见用户手册《J6P/H ONNX算子BPU约束列表》),Gemm 类算子使用 int8+int16 的混合精度量化,在精度存在误差时相应增加 int16 算子,例如:
  • 敏感 head 相比于 backbone 通常需要配置更多的 int16 算子

  • Attention 结构中 SoftMax * V 的 MatMul 通常需要对 SoftMax 输入配置 int16 高精度

J6B平台

J6B 因为没有单独的 VPU 浮点硬件支持量化/反量化计算,所以量化配置建议为 int8+int16 的混合精度,并且移除模型首尾部的量化/反量化算子(可参考社区文章《反量化节点的融合实现》在前后处理中自行集成)。
注意

J6B 的 Resize 算子对 int16 原生支持更友好,建议可以优先尝试 int16 高精度缓解量化误差。

量化敏感度分析

  1. 问题定位:使用hmct-debugger工具,分析哪些算子用 int8 时精度损耗大(如 Softmax、MatMul),哪些算子用 int8 无明显精度影响(如 Conv、Add)。
  2. 混合配置:在quant_config.json中,对精度敏感算子单独设置 int16,其余用 int8。示例配置如下:
  1. 验证效果:执行hb_compile -c config.yaml --skip compile,测试混合精度模型的性能与精度,确保性能接近 int8 上限、精度接近 int16 上限。
注意
hb_compile 支持 --skip 参数跳过暂不关注的环节,例如在精度调试阶段可以模型编译。参考命令:

hb_compile -c config.yaml --skip compile

参考手册

二、常见问题与PTQ解决方案

问题 1:模型量化精度损失太多

  1. 优先尝试不同的校准方法(例如 max、kl、max_percentile 等)或自动搜索策略(例如 modelwise_search、layerwise_search),参考配置如下:

  1. 尝试开启权重偏差校正(bias correction),参考配置如下:

  1. 尝试开启 per_channel 量化优化,参考配置如下:

  1. 尝试开启 asymmetric 非对称量化优化,参考配置如下:

  1. 对敏感算子配置更高精度,例如:

    1. Sin、Cos 算子在 J6P/H 上建议全局使用 float32,其他平台可以参考社区文章【地平线J6工具链进阶教程】算子优化方案集锦 - 地平线开发者社区 的 2.2.3 章节进行去周期处理
    2. float16 触发数值溢出时工具不会自动截断,会导致输出出现 nan,此时需要使用 float32

    3. 将基于 hmct-debugger 工具分析出的敏感算子通过 node_config 配置为更高精度

问题 2:校准结果不稳定

  1. 检查校准数据集的合理性,例如是否有全黑、全白、全部为固定值等异常数据,是否正确提供时序输入等

  2. 增加校准样本数,例如某些复杂模型可能需要更多的校准数据

  3. 启用多校准方法搜索

三、关键配置文件模板

Yaml示例

含校准搜索与混合精度的json模板

四、附录

核心参数总表

参数名称

参数作用

可选/必选

默认值

支持平台

模型参数组

prototxt

指定 Caffe 浮点模型的 prototxt 文件名称


两种模型
二选一

/

XJ3、J5、J6

caffe_model

指定 Caffe 浮点模型的 caffemodel 文件名称

/

XJ3、J5、J6

onnx_model

指定 ONNX 浮点模型的 onnx 文件名称

/

XJ3、J5、J6

march

指定产出混合异构模型需要支持的平台架构

必选

/

XJ3、J5、J6

output_model_file_prefix

指定转换产出混合异构模型的名称前缀

可选

model

XJ3、J5、J6

working_dir

指定模型转换输出的结果的存放目录

可选

model_output

XJ3、J5、J6

layer_out_dump

指定混合异构模型是否保留输出中间层值的能力

可选

FALSE

XJ3、J5

output_nodes

指定模型的输出节点

可选

/

XJ3、J5、J6

remove_node_type

设置删除节点的类型

可选

/

XJ3、J5、J6

remove_node_name

设置删除节点的名称

可选

/

XJ3、J5、J6

debug_mode

保存用于精度 debug 分析的校准数据

可选

/

XJ3、J5、J6

set_node_data_type

指定算子以 int16 输出,其功能已合入 node_info,后续版本将废弃

可选

/

J5

node_info

指定算子以 int16 输入输出,或强制指定算子运行在 CPU 或 BPU 上,j6使用quant_config配置

可选

/

J5

输入信息参数组

input_name

指定原始浮点模型的输入节点名称

可选

/

XJ3、J5、J6

input_type_train

指定原始浮点模型的输入数据类型

必选

/

XJ3、J5、J6

input_layout_train

指定原始浮点模型的输入数据排布

必选

/

XJ3、J5、J6

input_type_rt

转换后混合异构模型需要适配的输入数据格式

必选

/

XJ3、J5、J6

input_layout_rt

转换后混合异构模型需要适配的输入数据排布

可选

/

XJ3、J5

input_space_and_range

指定输入数据格式的特殊制式

可选

regular

XJ3、J5、J6

input_shape

指定原始浮点模型的输入数据尺寸

可选

/

XJ3、J5、J6

input_batch

指定转换后混合异构模型需要适配的输入 batch 数量

可选

1

XJ3、J5、J6

separate_batch

设置是否开启独立batch模式

可选

/

J6

separate_name

不开启独立batch模式时,用于指定拆分的节点名称

可选

/

J6

norm_type

在模型中添加的输入数据预处理方法

可选

no_preprocess

XJ3、J5、J6

mean_value

指定预处理方法的图像减去的均值

可选

/

XJ3、J5、J6

scale_value

指定预处理方法的数值 scale 系数

可选

/

XJ3、J5、J6

校准参数组(所有参数并非独立可选,不能都不配置)

cal_data_dir

指定模型校准使用的标定样本的存放目录

可选

/

XJ3、J5、J6

quant_config

J6平台支持对多种与量化相关的参数进行灵活配置,您可以通过该参数配置模型算子的计算精度、校准方法以及校准参数搜索方法。

可选

/

J6

cal_data_type

指定校准数据二进制文件的数据存储类型

可选

/

XJ3、J5

preprocess_on

开启图片校准样本自动处理

可选

FALSE

XJ3、J5

calibration_type

校准使用的算法类型

可选

default

XJ3、J5

max_percentile

用于调整 max 校准的截取点

可选

1.0

XJ3、J5

per_channel

是否对 featuremap 的每个 channel 分别校准

可选

FALSE

XJ3、J5

run_on_cpu

强制指定算子在 CPU 上运行,其功能已合入 node_info,后续版本将废弃

可选

/

XJ3、J5

run_on_bpu

强制指定算子在 BPU 上运行,其功能已合入 node_info,后续版本将废弃

可选

/

XJ3、J5

optimization

提供多种性能/精度的调优手段

可选

/

XJ3、J5

编译参数组(要求至少有一个参数,不能都不配置)

compile_mode

编译策略选择

可选

latency

XJ3、J5、J6

balance_factor

balance 编译策略时的比例系数

可选

/

J5、J6

debug

是否打开编译的 debug 信息(最终部署时建议关闭以减少hbm文件大小)

可选

TRUE

XJ3、J5

core_num

模型运行核心数

可选

1

XJ3、J5、J6

optimize_level

模型编译的优化等级选择

可选

O0

XJ3、J5、J6

input_source

设置上板 bin 模型的输入数据来源

可选

/

XJ3、J5、J6

max_time_per_fc

指定模型每个 function-call 的最大可连续执行时间(单位μs)

可选

0

XJ3、J5、J6

jobs

编译 bin 模型时的进程数,J6编译 bc 模型时的进程数

可选

/

XJ3、J5、J6

advice

提示模型编译后预估的耗时增加的情况(单位μs)

可选

/

XJ3、J5、J6

extra_params

通过此参数,可以额外对一些模型编译相关的参数进行灵活地配置

可选

/

J6

自定义算子参数组(J6不支持)

custom_op_method

自定义算子策略选择

可选

/

XJ3、J5

op_register_files

自定义算子的 Python 实现文件名称

可选

/

XJ3、J5

custom_op_dir

自定义算子的 Python 实现文件存放路径

可选

/

XJ3、J5

quant_config配置说明

编译模型时可以通过 quant_config 进行量化参数的配置,支持在 model_config、op_config、subgraph_config、node_config 四个层面配置模型量化参数:

  • model_config:配置模型总体的量化参数,key 是自定义名称。

  • op_config:配置某类算子的量化参数,key 是算子的类型。

  • subgraph_config:配置某个子图的量化参数,key 是子图的名字。

  • node_config:配置某个具体节点的量化参数,key 是节点的名字。

配置时四个层面存在优先级关系,配置粒度越小优先级越高,即优先级 model_config < op_config < subgraph_config < node_config,当某个节点同时被多个维度配置时,优先级高的维度最终生效。

激活参数配置

  • calibration_type:校准方式支持max、kl、[max、kl]

  • num_bin、max_num_bin:这些是kl量化的参数

  • max_percentile:用于max校准百分位

  • per_channel:是否开启per-channel量化

  • asymmetric:是否开启非对称量化

注:如果配置了多个校准方法,会启动Modelwise搜索方法,从多个候选校准模型中找出最优的量化模型;如果配置了Layerwise参数,则启动Layerwise搜索方法,逐层搜索最优的量化参数。

权重校准参数配置

  • num_sample:配置参与bias correction的样本数

  • metric:偏差校正误差度量方法cosine-similarity、mse、mae、mre、sqnr以及chebyshev,默认值cosine-similarity。

校准参数搜索方法

  • modelwise_search:在模型层面对量化参数进行搜索,该方法允许一次性配置多种校准方法,通过比较量化前后模型输出的量化损失 metric(可配置),找到一个量化损失最小的校准方法。

  • layerwise_search:在节点层面对量化参数进行搜索,该方法会根据每个节点量化前后模型输出,计算量化损失metric(可配置),为该节点分配量化损失最小的校准方法。

注:多个校准方法时modelwise_search和layerwise_search可以都不配置,但默认会执行modelwise_search的逻辑(metric会采用默认的cosine-similarity)。

注:modelwise和layerwise同时配置的时候,layerwise优先级高。

参考手册

quant_config 详细配置指南:quant_config 配置指南
算法工具链
社区征文官方教程征程6
评论0
0/600