参数详解与实战指南)
AMCT 量化感知训练简易配置文件retrain_config_pytorch.proto参数详解与实战指南【免费下载链接】amctAMCT是CANN提供的昇腾AI处理器亲和的模型压缩工具仓。项目地址: https://gitcode.com/cann/amct导读本文档面向使用 CANN AMCT昇腾 AI 处理器亲和的模型压缩工具仓进行**量化感知训练QAT**的开发者系统讲解基于retrain_config_pytorch.proto构造的简易配置文件从 proto 消息结构、每个字段的取值与优先级到量化、通道稀疏、4选2结构化稀疏及组合压缩四类典型.cfg配置样例并穿插源码级解析说明参数在工具内部的解析与生效方式。读完本文你将能够独立编写一份可运行、可调参的简易配置文件并通过create_quant_retrain_config接口的config_defination参数驱动模型完成量化感知训练或压缩配置生成。retrain_config_pytorch.proto文件位于_AMCT安装目录_/amct_pytorch/proto/retrain_config_pytorch.proto对应本仓库源码 retrain_config_pytorch.proto基于该文件可以配置出量化感知训练简易配置文件、稀疏简易配置文件、组合压缩简易配置文件三类配置用户按实际场景选择使用。适用前提说明本文参数与样例均以当前开源仓库CANN AMCT实际实现为准。proto 定义采用 proto2 语法required字段必填、optional字段可选、repeated字段可重复出现配置文件中层名/层类型需与模型图中的实际名称一致如conv1、fc、Linear、Conv2d等。一、配置文件定位简易配置文件与 JSON 配置文件的关系在 AMCT 的量化感知训练流程中存在两种形态的配置文件JSON 格式配置由 create_quant_retrain_config 接口根据图结构自动生成参数说明见量化感知训练配置参数当推理精度不满足要求时需手动调整该 JSON 文件。简易配置文件.cfg本文主题。它基于retrain_config_pytorch.proto编写通过create_quant_retrain_config(config_file, model, input_data, config_defination)接口的config_defination参数传入默认值为 None工具会将其解析为具体的量化/稀疏配置后再生成 JSON 配置。从源码看该流程由 retrain_config_base.py 中的create_config_from_proto完成先调用RetrainProtoConfig读取 proto 文本见 retrain_proto.py再结合图结构生成逐层的 JSON 配置。简易配置文件的价值在于以文本格式集中表达全局量化参数 全局稀疏参数 按层/按类型差异化覆盖 跳过层比直接手改 JSON 更清晰、更适合批量复用。二、AMCTRetrainConfig简易配置文件的顶层消息AMCTRetrainConfig是简易配置文件的根消息其字段如下字段是否必填类型说明skip_layersrepeatedstring全局参数按层名跳过不做压缩的层。用于同时覆盖量化、稀疏等多特性场景下需要跳过的层若与quant_skip_layers或regular_prune_skip_layers同时配置取两者并集skip_layer_typesrepeatedstring全局参数按层类型跳过不做压缩的层若与quant_skip_types或regular_prune_skip_types同时配置取两者并集override_layer_configsrepeatedRetrainOverrideLayer按层名重写部分层实现差异化压缩如 INT8 全局下对个别层差异化配置override_layer_typesrepeatedRetrainOverrideLayerType按层类型重写部分层实现差异化压缩fakequant_precision_modeoptionalFakequantPrecisionModefakequant 模型中 quant 自定义算子的scale_d数值精度模式FORCE_FP16_QUANT将scale_d数值转换为 float16 精度数值类型仍为 float32不配置默认则保持 float32 精度batch_numoptionaluint32量化使用的 batch 数量默认值 1proto 中[default 1]retrain_data_quant_configrequiredRetrainDataQuantConfig全局数据量化配置量化感知训练数据量化配置retrain_weight_quant_configrequiredRetrainWeightQuantConfig全局权重量化配置量化感知训练权重量化配置quant_skip_layersrepeatedstring量化场景专用按层名跳过不需要量化的层与skip_layers同时配置时取并集quant_skip_typesrepeatedstring量化场景专用按层类型跳过不需要量化的层与skip_layer_types同时配置时取并集prune_configoptionalPruneConfig全局稀疏配置regular_prune_skip_layersrepeatedstring稀疏场景专用按层名跳过不需要结构化稀疏的层与skip_layers同时配置时取并集regular_prune_skip_typesrepeatedstring稀疏场景专用按层类型跳过不需要结构化稀疏的层与skip_layer_types同时配置时取并集实现细节佐证源码中 retrain_proto.py 的get_quant_skip_layers()会先收集quant_skip_layers再extend(self.get_skip_layers())后去重即以并集方式合并全局与量化各自的跳过层get_regular_prune_skip_layers()对稀疏场景同理。batch_num若未显式配置proto 默认取 1。参数优先级规则override_layer_configs、override_layer_types与全局配置之间按如下优先级生效文档明确给出量化场景override_layer_configsoverride_layer_typesretrain_data_quant_config/retrain_weight_quant_config稀疏场景override_layer_configsoverride_layer_typesprune_config从源码可以印证在 retrain_config_base.py 的_generate_retrain_config中遍历可量化层时依次判断层名是否命中 override_layers→层类型是否命中 override_types→否则使用全局 data/weight 配置命中覆盖配置的层还会强制retrain_enable True。优先级最高的override_layer_configs可以只重写数据量化retrain_data_quant_config或只重写权重量化retrain_weight_quant_config未重写的部分仍取自全局配置。三、数据量化配置RetrainDataQuantConfig 与 ActULQquantize数据激活量化配置消息为RetrainDataQuantConfig通过ulq_quantize字段选择ULQUniversal Linear Quantization数据量化算法算法介绍见ULQ 数据量化算法AMCT 在训练过程中不断训练量化因子以减少量化损失初始化时会对数值做量化因此对初始化敏感。当前数据量化算法仅支持 ULQ。ActULQquantize的字段字段是否必填类型说明dst_typeoptionalDataType数据量化位宽支持 INT4 / INT8 / INT16默认 INT8当前版本仅支持 INT8 量化clip_max_minoptionalClipMaxMin初始化的上下限值不配置时默认用 IFMR 算法进行初始化fixed_minoptionalbool是否固定下限且下限为 0。默认ReLU 之后为 true其他场景为 falseClipMaxMin子消息包含两个必填字段字段是否必填类型说明clip_maxrequiredfloat初始上限值clip_minrequiredfloat初始下限值使用注意源码佐证在 retrain_proto.py 的_get_retrain_data_config中一旦配置了clip_max_min则clip_max与clip_min必须同时出现否则直接报错 clip_max and clip_min are both required.。clip_max_min会参与计算缩放因子后续训练在其初始值基础上做调优——因此建议初始值与实际推理数据的上下限保持一致否则可能导致量化后精度较差。四、权重量化配置RetrainWeightQuantConfig、ARQRetrain 与 WtsULQRetrain权重量化配置消息为RetrainWeightQuantConfig支持两种算法oneof 二选一字段是否必填类型说明arq_retrain-ARQRetrainARQ 权重量化算法Adaptive Range Quantization对权重直接量化ulq_retrain-WtsULQRetrainULQ 权重量化算法ARQRetrain字段字段是否必填类型说明dst_typeoptionalDataType选择 INT8 或 INT4 量化位宽默认 INT8当前版本仅支持 INT8channel_wiseoptionalbool是否做 channel-wise 的 ARQWtsULQRetrain字段字段是否必填类型说明dst_typeoptionalDataType选择 INT8 或 INT4 量化位宽默认 INT8当前版本仅支持 INT8channel_wiseoptionalbool是否做 channel-wise 的 ULQchannel_wise语义true表示每个 channel 独立量化、量化因子不同推荐配置通常精度更好false表示所有 channel 共享量化因子。ARQ 算法详情可参见 ARQ 权重量化算法。实现细节佐证proto 中dst_type字段均带[default INT8]解析层_parse_data_type将枚举值 0/1/2 分别映射为 INT4/INT8/INT16_get_retrain_weight_config会按arq_retrain或ulq_retrain二选一解析出algo、channel_wise、dst_type三项见 retrain_proto.py。同时 retrain_config_base.py 中的check_dst_type_legal会校验激活与权重的位宽组合形如 A8W8不在白名单RETRAIN_ACT_WTS_TYPES内的组合会被拒绝。五、按层差异化配置RetrainOverrideLayer 与 RetrainOverrideLayerType当全局量化配置如 INT8不满足个别层需求时可通过这两个消息做差异化覆盖。当前版本仅支持 INT8 量化INT4 差异化配置为预留能力需以版本实际支持为准。RetrainOverrideLayer按层名重写字段是否必填类型说明layer_namerequiredstring层名retrain_data_quant_configrequiredRetrainDataQuantConfig重写的数据层量化参数retrain_weight_quant_configrequiredRetrainWeightQuantConfig重写的权重层量化参数prune_configoptionalPruneConfig重写的稀疏配置参数RetrainOverrideLayerType按层类型重写字段是否必填类型说明layer_typerequiredstring层类型retrain_data_quant_configrequiredRetrainDataQuantConfig重写的数据层量化参数retrain_weight_quant_configrequiredRetrainWeightQuantConfig重写的权重层量化参数prune_configoptionalPruneConfig重写的稀疏配置参数实现细节佐证RetrainProtoConfig.get_override_layers()与get_override_layer_types()会检测 override 中是否存在重复的层名/层类型重复会直接raise ValueErrorPlease delete repeated items...因此编写配置时务必保证层名唯一、层类型唯一随后read_override_config/read_override_type_config按命中项读回重写后的 data、weight、prune 三组参数见 retrain_proto.py。六、稀疏配置PruneConfig、FilterPruner 与 NOutOfMPruner简易配置文件同时支持结构化稀疏配置顶层通过prune_config开启内部按 oneof 选择两种稀疏策略之一字段是否必填类型说明filter_pruner-FilterPrunerfilter输出维度通道稀疏的配置n_out_of_m_pruner-NOutOfMPruner4选2稀疏的配置硬件约束提醒文档明确由于硬件约束Ascend 950PR / Ascend 950DT 不支持 4选2 结构化稀疏特性在目标硬件为这两类产品时应使用 filter 稀疏或仅量化方案。FilterPruner 与 BalancedL2NormFilterPruner通道稀疏FilterPruner仅支持balanced_l2_norm_filter_prune字段即BalancedL2NormFilterPruner简称 BCP算法。该算法通过计算权重各个 filter输出维度通道的 L2 范数各元素平方和再开方对输出通道做重要性排序优先裁剪重要性低的通道算法介绍见手工通道稀疏算法。BalancedL2NormFilterPruner字段字段是否必填类型说明prune_ratiorequiredfloat稀疏率 被稀疏的 filter 数量 / filter 总数。推荐配置为 0.2即裁剪 20% 的输出通道ascend_optimizedoptionalbool是否做昇腾亲和优化。如果稀疏后的模型要部署在昇腾 AI 处理器上建议配置为 trueproto 中默认值即[default true]NOutOfMPruner 与 L1SelectivePruner4选2结构化稀疏NOutOfMPruner仅支持l1_selective_prune字段即L1SelectivePrune 算法通过比较权重的 l1 值绝对值决定保留哪些权重每 4 个连续权重中保留 l1 值最大的 2 个算法介绍见4选2结构化稀疏算法。L1SelectivePruner字段字段是否必填类型说明n_out_of_m_typeoptionalNOutOfMType目前仅支持 M4N2即每 4 个连续权重中保留 2 个proto 中默认值[default M4N2]update_freqoptionaluint32更新 4选2 稀疏选择的间隔。update_freq0时仅在第一个 batch 更新稀疏选择update_freq2时每 2 个 batch 更新一次以此类推。默认 0实现细节佐证在重训练过程中权重会随每个训练 batch 改变l1 值排序也可能随之变化比如原本保留 4 个元素中的前两个更新后可能变成保留第 1、第 3 个update_freq正是控制这一重新选择的频率_parse_n_out_of_m_type中非 M4N2 的值会直接报错见 retrain_proto.py。prune_ratio为balanced_l2_norm_filter_prune的必填字段缺失时解析层会报 prune_ratio is required for balanced_l2_norm_filter_prune, please add it.。七、实战四类典型简易配置文件样例以下样例均直接基于retrain_config_pytorch.proto构造Opname需替换为真实层名Optype需替换为真实层类型可供create_quant_retrain_config的config_defination参数直接使用。7.1 量化感知训练简易配置文件quant.cfg# global quantize parameter retrain_data_quant_config: { ulq_quantize: { clip_max_min: { clip_max: 6.0 clip_min: -6.0 } fixed_min: true dst_type: INT8 } } retrain_weight_quant_config: { arq_retrain: { channel_wise: true dst_type: INT8 } } skip_layers: Opname skip_layer_types: Optype override_layer_types : { layer_type: Optype retrain_weight_quant_config: { arq_retrain: { channel_wise: false dst_type: INT8 } } } override_layer_configs : { layer_name: Opname retrain_data_quant_config: { ulq_quantize: { clip_max_min: { clip_max: 3.0 clip_min: -3.0 } dst_type: INT8 } } }要点解读全局数据量化采用 ULQ初始化上下限为 [-6.0, 6.0]fixed_min: true表示下限固定为 0 且不学习适合量化层前一层为 ReLU 的场景全局权重量化采用 ARQchannel-wise 打开通过skip_layers/skip_layer_types全局跳过指定层override_layer_types对某类层关闭 channel-wiseoverride_layer_configs对某个具体层重写数据量化上下限为 [-3.0, 3.0]按优先级层级覆盖 类型覆盖 全局。7.2 通道稀疏简易配置文件prune.cfg# global prune parameter prune_config{ filter_pruner { balanced_l2_norm_filter_prune { prune_ratio: 0.3 ascend_optimized: True } } } # skip layers regular_prune_skip_layers: Opname regular_prune_skip_layers: Opname # overide specific layers override_layer_configs: { layer_name: Opname prune_config : { filter_pruner: { balanced_l2_norm_filter_prune: { prune_ratio: 0.5 ascend_optimized: True } } } }要点解读全局通道稀疏率 0.3裁剪 30% 输出通道并开启昇腾亲和优化regular_prune_skip_layers可重复出现以列出多个跳过层repeated 字段override_layer_configs对单个层将稀疏率差异化调整为 0.5——该层级的prune_config优先级高于全局prune_config。7.3 4选2结构化稀疏简易配置文件selective_prune.cfg# global prune parameter prune_config{ n_out_of_m_pruner { l1_selective_prune { n_out_of_m_type: M4N2 update_freq: 0 } } } # skip layers regular_prune_skip_layers: Opname regular_prune_skip_layers: Opname # overide specific layers override_layer_configs: { layer_name: Opname prune_config : { n_out_of_m_pruner: { l1_selective_prune: { n_out_of_m_type: M4N2 update_freq: 1 } } } }要点解读全局采用 M4N2 结构化稀疏update_freq: 0表示只在第一个 batch 更新稀疏选择对指定层通过 override 将update_freq调整为 1每 1 个 batch 更新一次适应权重快速变化的层再次提醒该特性不受 Ascend 950PR/Ascend 950DT 支持部署目标为上述硬件时应改用 filter 稀疏。7.4 组合压缩通道稀疏 INT8 量化简易配置文件compressed1.cfgprune_config : { filter_pruner : { balanced_l2_norm_filter_prune : { prune_ratio : 0.3 ascend_optimized: True } } } # skip_layers: skip_layers_name_0 skip_layer_types: Optype quant_skip_layers: Opname quant_skip_types: Optype retrain_weight_quant_config: { arq_retrain: { channel_wise: true dst_type: INT8 } } override_layer_types : { layer_type: Optype retrain_weight_quant_config: { arq_retrain: { channel_wise: false dst_type: INT8 } } retrain_data_quant_config : { ulq_quantize : { clip_max_min : { clip_max : 6.0 clip_min : -6.0 } } } prune_config : { filter_pruner : { balanced_l2_norm_filter_prune : { prune_ratio : 0.5 ascend_optimized: True } } } }要点解读同一份配置文件内同时出现prune_config通道稀疏与retrain_weight_quant_configINT8 权重量化即通道稀疏 INT8 量化组合压缩skip_layer_types是全局跳过稀疏与量化共同生效quant_skip_layers/quant_skip_types只跳过量化、不跳稀疏二者并集生效override_layer_types中同时重写了权重量化关闭 channel-wise、数据量化设定上下限与稀疏提高稀疏率到 0.5三组参数。7.5 组合压缩4选2结构化稀疏 INT8 量化简易配置文件compressed2.cfgprune_config{ n_out_of_m_pruner { l1_selective_prune { n_out_of_m_type: M4N2 update_freq: 0 } } } # skip_layers: skip_layers_name_0 skip_layer_types: Optype quant_skip_layers: quant_skip_layers_name_0 quant_skip_types: Optype retrain_weight_quant_config: { arq_retrain: { channel_wise: true dst_type: INT8 } } override_layer_types : { layer_type: Optype retrain_weight_quant_config: { arq_retrain: { channel_wise: false dst_type: INT8 } } retrain_data_quant_config : { ulq_quantize : { clip_max_min : { clip_max : 6.0 clip_min : -6.0 } } } prune_config{ n_out_of_m_pruner { l1_selective_prune { n_out_of_m_type: M4N2 update_freq: 1 } } } }要点解读与 7.4 结构对称区别仅在于全局与层级的prune_config均改用n_out_of_m_prunerM4N2 结构化稀疏并在 override 中把该类型层的update_freq调整为 1。组合压缩场景的源码佐证在 retrain_config_base.py 的create_config_from_proto中当enable_prune and enable_retrain同时为 True即压缩场景时会先通过proto.parse_proto_enable()探测 proto 中量化与稀疏各自是否被启用再分别调用_generate_retrain_config与_generate_prune_config生成两套配置并合并到同一 JSON 中。相关解析与异常分支如 prune 配置缺失prune_ratio、override 重复等均有对应单元测试覆盖可参见 test_retrain_config.py 及配置样例目录 configuration/utils。八、与其他文档的衔接算法原理ULQ、ARQ、BalancedL2NormBCP、L1SelectivePrune 的算法介绍见 算法简述接口用法create_quant_retrain_config的参数说明、调用示例及 JSON 配置文件落盘样例见 create_quant_retrain_configJSON 配置调参当接口生成的 config.json 精度不满足要求时按量化感知训练配置参数手动调整version、batch_num、retrain_enable、retrain_data_config、retrain_weight_config、algo、channel_wise、fixed_min、clip_max、clip_min、dst_type等字段修改 json 时请确保层名唯一QAT 完整流程与训练/保存接口参见 量化感知训练 相关章节create_quant_retrain_model、save_model等接口文档。九、编写与排障要点速查必填字段检查retrain_data_quant_config、retrain_weight_quant_config为顶层必填clip_max/clip_min成对出现balanced_l2_norm_filter_prune的prune_ratio必填。唯一性override_layer_configs的层名、override_layer_types的层类型不可重复重复会导致解析报错。跳层取并集全局skip_layers/skip_layer_types与各场景专用 skip 参数并存时取并集无需重复配置。优先级记忆override_layer_configsoverride_layer_types 全局配置量化与稀疏场景一致。硬件约束Ascend 950PR / Ascend 950DT 不支持 4选2 结构化稀疏INT8 为当前版本唯一实际支持的量化位宽。部署前检查稀疏场景建议ascend_optimized: trueclip_max_min初始值应贴近真实数据分布否则影响量化后精度。【免费下载链接】amctAMCT是CANN提供的昇腾AI处理器亲和的模型压缩工具仓。项目地址: https://gitcode.com/cann/amct创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考