ARTICLE DETAIL

资讯详情

深耕编程入门与网站建设的一线实战洞察。

CANN AMCT Conv2dQAT 量化感知训练算子 API 实战指南:从构造、配置到源码原理

CANN AMCT Conv2dQAT 量化感知训练算子 API 实战指南:从构造、配置到源码原理 CANN AMCT Conv2dQAT 量化感知训练算子 API 实战指南从构造、配置到源码原理【免费下载链接】amctAMCT是CANN提供的昇腾AI处理器亲和的模型压缩工具仓。项目地址: https://gitcode.com/cann/amct导读Conv2dQAT 是 CANN AMCT昇腾 AI 处理器亲和的模型压缩工具仓提供的 2D 卷积量化感知训练QAT单算子用于将浮点torch.nn.Conv2d替换为带量化感知训练能力的算子在训练/重训过程中学习数据的截断上下限与量化因子从而显著降低 INT8/INT4 量化带来的精度损失。本文以官方 API 文档为主体结合仓库源码与测试用例系统讲解 Conv2dQAT 的两种构造方式、全部参数语义、量化配置项retrain_data_config / retrain_weight_config、底层量化流程IFMR 初始化 → ULQ/ARQ 重训与常见约束帮助你在昇腾场景下快速完成卷积层的 QAT 接入。产品支持情况Conv2dQAT 在以下昇腾硬件产品上获得支持来源于 Conv2dQAT.md产品是否支持Ascend 950PR / Ascend 950DT√Atlas A3 训练系列产品 / Atlas A3 推理系列产品√Atlas A2 训练系列产品 / Atlas A2 推理系列产品√功能说明Conv2dQAT 用于构造 Conv2d 的 QAT 算子。与普通卷积层不同该算子在网络前向中会依次完成激活量化对输入 activation 先通过 IFMRInitialization For MinMax Range算法在初始化阶段统计量化范围再经由 ULQ截断上下限重训算法学习/微调 clip_min、clip_max 等参数权重量化对卷积权重执行 ARQAdaptive Rounding-based Quantization或 ULQ 重训量化浮点卷积计算使用量化后的激活与量化后的权重调用F.conv2d完成卷积bias 保持浮点直接参与计算。从源码结构看Conv2dQAT定义于 conv2d.py它同时继承torch.nn.Conv2d与统一的 QAT 基类QATBase见 qat_base.py因此在具备完整 Conv2d 行为的同时自动获得量化参数注册、IFMR 初始化、ULQ/ARQ 重训等 QAT 能力。函数原型Conv2dQAT 提供两种等价的构造方式直接构造接口qat amct_pytorch.nn.module.quantization.conv2d.Conv2dQAT(in_channels, out_channels, kernel_size, stride, padding, dilation, groups, bias, padding_mode, device, dtype, config)基于原生算子构造接口推荐用于已有浮点模型的改造qat amct_pytorch.nn.module.quantization.conv2d.Conv2dQAT.from_float(mod, config)其中amct_pytorch.nn.module.quantization.conv2d是公共转出模块内部将Conv2dQAT从实现路径 re-export 出来见 conv2d.py两种写法最终指向同一个类。参数说明表 1直接构造接口参数参数名输入/输出说明in_channels输入含义输入 channel 个数。数据类型intout_channels输入含义输出 channel 个数。数据类型intkernel_size输入含义卷积核大小。数据类型int/tuplestride输入含义卷积步长。数据类型int/tuple默认值1padding输入含义填充大小。数据类型int/tuple默认值0dilation输入含义kernel 元素之间的间距。数据类型int/tuple默认值1groups输入含义输入和输出的连接关系。数据类型int默认值1bias输入含义是否开启偏置项参与学习。数据类型bool其他数据类型比如整数、字符串、列表等按照 Python 真值判断规则转换默认值Truepadding_mode输入含义填充方式。使用约束仅支持zerosdevice输入含义运行设备。默认值Nonedtype输入含义torch 数值类型。torch 数据类型仅支持 torch.float32config输入含义量化配置。数据类型dict默认值None不传时按默认配置执行 QAT详见下文表 2基于原生算子构造接口参数参数名输入/输出说明mod输入含义待量化的原生 Conv2d 算子。数据类型torch.nn.Module必须是torch.nn.Conv2d否则抛 TypeErrorconfig输入含义量化配置。数据类型dict默认值Nonefrom_float的转换逻辑位于 qat_base.py首先校验mod必须是_float_module即torch.nn.Conv2d的实例随后从_required_paramsin_channels、out_channels、kernel_size、stride、padding、dilation、groups、bias、padding_mode中提取原生算子的超参数bias会被转换为是否存在偏置的布尔值最后构造 QAT 算子并直接复用原生算子的 weight 与 bias 参数保证转换前后模型权重完全一致。config 量化配置config为 dict 类型官方参考样例如下详见 Conv2dQAT.mdconfig { retrain_enable: True, retrain_data_config: { dst_type: INT8, batch_num: 10, fixed_min: False, clip_min: -1.0, clip_max: 1.0 }, retrain_weight_config: { dst_type: INT8, weights_retrain_algo: arq_retrain, channel_wise: False } }各配置项的完整语义请参见 量化配置参数说明核心要点归纳如下。retrain_enable作用该层是否进行量化感知训练。类型bool取值范围true 或 false。说明true表示该层进行 QAT默认行为false表示该层不进行量化感知训练此时前向中激活与权重直接透传见 qat_base.py。推荐配置true可选参数。retrain_data_config数据/激活量化配置类型为 dict包含以下可选参数batch_num量化使用的 batch 数量。类型 int取值范围大于 0默认值 1。batch_num * batch_size为量化使用的校准集图片数量batch_size 为每个 batch 所用的图片数量建议校准集图片数量不超过 50 张。clip_max截断量化算法上限。类型 float要求clip_max 0。若配置则固定算法截断上限若不配置则通过 IFMR 算法学习获取上限。推荐取 activation 分布最大值 max 的0.3*max ~ 1.7*max区间。clip_min截断量化算法下限。类型 float要求clip_min 0。若配置则固定算法截断下限若不配置则通过 IFMR 算法学习获取下限。推荐取 activation 分布最小值 min 的0.3*min ~ 1.7*min区间。fixed_min数据量化算法下限固定开关。类型 booltrue表示固定下限且下限为 0false表示不固定下限。默认不选。dst_type量化位宽类型。类型 string当前激活量化支持 INT8/INT16默认 INT8。配置示例来自官方文档retrain_data_config: { dst_type: INT8, batch_num: 10, fixed_min: False, clip_min: -1.0, clip_max: 1.0 }retrain_weight_config权重量化配置类型为 dict包含以下可选参数weights_retrain_algo权重量化算法。类型 string取值范围ulq_quantizeULQ 截断上下限量化算法与arq_retrainARQ 量化算法默认arq_retrain。从源码看实际算法分发键为arq_retrain/ulq_retrain见 qat_base.py。channel_wise是否对每个 channel 采用不同的量化因子。类型 booltrue表示每个 channel 独立量化、量化因子不同false表示所有 channel 共享量化因子。默认 true推荐。dst_type量化位宽类型。类型 string当前仅支持 INT8默认为 INT8。从源码结构看Conv2dQAT 的_supported_weight_dst_types (INT8, INT4)见 conv2d.py即权重同时支持 INT4 量化INT4 权重要求激活为 INT8且权重的 W 轴宽度为偶数。返回值说明直接构造返回构造的 QAT 单算子实例Conv2dQAT。基于原生算子构造返回torch.nn.Module转化后的 QAT 单算子仍是Conv2dQAT实例且沿用了原生算子的 weight/bias。调用示例示例一直接构造from amct_pytorch.nn.module.quantization.conv2d import Conv2dQAT Conv2dQAT(in_channels1, out_channels1, kernel_size1, stride1, padding0, dilation1, groups1, biasTrue, padding_modezeros, deviceNone, dtypeNone, configNone)示例二基于原生算子构造模型改造场景import torch from amct_pytorch.nn.module.quantization.conv2d import Conv2dQAT conv2d_op torch.nn.Conv2d(in_channels1, out_channels1, kernel_size1, stride1, padding0, dilation1, groups1, biasTrue, padding_modezeros, deviceNone, dtypeNone) Conv2dQAT.from_float(modconv2d_op, configNone)示例三携带量化配置的完整使用可运行参考 test_qat_op.py 中的用法可以构造一个带配置的 Conv2dQAT 并执行前向import torch from amct_pytorch.classic.graph_based.amct_pytorch.nn.module.quantization.conv2d import Conv2dQAT quant_config { retrain_enable: True, retrain_data_config: { dst_type: INT8, batch_num: 3, fixed_min: False, clip_min: -1.0, clip_max: 1.0, }, retrain_weight_config: { dst_type: INT8, weights_retrain_algo: arq_retrain, channel_wise: True, }, } qat_conv Conv2dQAT(in_channels3, out_channels16, kernel_size1, stride1, padding0, configquant_config) inputs torch.randn((3, 3, 224, 224)) # 4 维输入N, C, H, W output qat_conv.forward(inputs) print(output.shape)底层实现原理类定义与继承关系Conv2dQAT(nn.Conv2d, QATBase)见 conv2d.py同时继承原生torch.nn.Conv2d与QATBase继承nn.Conv2d获得卷积超参数与 weight/bias 参数管理能力继承QATBase获得统一的量化感知训练实现IFMR 初始化、ULQ/ARQ 重训、量化参数注册、Dynamo 导出支持等。__init__中先以原生方式初始化nn.Conv2d随后调用QATBase.__init__(self, Conv2d, devicedevice, configconfig)其中Conv2d为层类型标识用于后续统计/分发。前向计算流程forward见 conv2d.py要求输入必须是 4 维N, C, H, W流程为forward_qat(inputs)返回量化后的激活quantized_acts与量化后的权重quantized_wts调用F.conv2d(quantized_acts, quantized_wts, bias, stride, padding, dilation, groups)完成卷积bias 以浮点形式直接参与。forward_qat见 qat_base.py的核心逻辑为输入 dtype 必须是torch.float32否则抛 ValueErrorretrain_enableTrue时若尚未完成初始化do_initTrue调用acts_quant_init用 IFMR 模块统计首个 batch 的 scale/offset/clip 范围否则调用acts_quant走 ULQ 重训随后调用wts_quant走 ARQ/ULQ 权重量化retrain_enableFalse时激活与权重直接透传等价于普通浮点卷积。量化参数注册_register_qat_params见 qat_base.py会为算子注册以下可训练/缓冲参数激活侧acts_clip_max、acts_clip_min可训练 Parameter默认 1.0 / -1.0、acts_scale、acts_offset_deploy、acts_clip_max_pre、acts_clip_min_pre、cur_batch权重侧wts_scales、wts_offsets数量由 channel_wise 决定True时为 out_channels 个False时为 1 个、wts_offsets_deploy、s_rec_flag。这些参数会在重训过程中由copy_tensor持续更新最终用于部署阶段的 Q/DQ 节点导出Dynamo ONNX 导出时通过add_qdq_dynamo/add_weight_qdq_dynamo构建见 qat_base.py。配置校验与使用约束QATBase._check_qat_config见 qat_base.py会在构造时严格校验配置常见约束包括激活dst_type仅支持 INT8/INT16激活量化仅支持 per-tensorchannel_wise必须为 False否则报错 Activation quantization only supports per-tensorbatch_num必须是大于 0 的整数fixed_min必须是 boolclip_min必须是小于 0 的 floatclip_max必须是大于 0 的 float权重量化算法仅支持arq_retrain/ulq_retrainINT4 权重量化要求激活为 INT8padding_mode 仅支持 zeroscheck_quantifiable见 conv2d.py在开启重训且 padding_mode 非 zeros 时抛 ValueError同时若权重为 INT4 且权重形状 W 轴宽度为奇数也会报错。测试用例验证仓库测试 test_qat_op.py 对 Conv2dQAT 覆盖了完整的行为验证可作为接入时的自测参考test_conv2d_qat_from_float_success/test_conv2d_qat_from_float_failed_padding_mode_not_zeros验证from_float成功路径以及 padding_mode 为reflect时抛 ValueErrortest_conv2d_qat_from_float_failed_ori_op_not_conv2d传入Conv3d抛 TypeErrortest_conv2d_qat_forward/test_conv2d_qat_forward_ulq_retrain验证默认 ARQ 与 ULQ 重训配置下的前向均可正常输出输入(3, 3, 224, 224)test_conv2d_qat_unsupport_shape_inputs非 4 维输入抛 RuntimeErrortest_conv2d_qat_accepts_int4_per_tensor_and_per_channel验证 INT4 权重在 per-tensor1 个 scale与 per-channel4 个 scale下的参数注册数量test_conv2d_qat_int4_odd_kernel_width_raisesINT4 权重 W 轴宽度为奇数时报错test_grouped_conv2d_qat_int4_even_width_is_supported验证 groups4 的分组卷积同样受支持。测试中还提供了多组quant_configs组合如ulq_retrainbatch_num3、fixed_minTrue、clip_min/clip_max同时配置等可用于覆盖不同算法分支的前向验证。常见问题与最佳实践padding_mode 必须为 zeros构造或from_float时若传入reflect、replicate、circular等填充方式在开启重训时直接抛 ValueError请在替换前先调整原生模型。输入必须为 4 维且 dtype 为 float32Conv2dQAT 前向只接受 (N, C, H, W) 的 torch.float32 输入否则分别抛 RuntimeError / ValueError。config 传 None 时的默认行为从源码看config 为 None 时按空 dict 处理retrain_enable默认 True即默认开启量化感知训练clip_min/clip_max不配置时通过 IFMR 在首轮前向自动学习范围。clip_min/clip_max 建议成对配置需要手动固定截断范围时应同时给出clip_min 0与clip_max 0的合理取值官方推荐基于 activation 分布的 0.3~1.7 倍区间并合理设置batch_num使校准数据量适中。模型改造流程遍历named_modules()找到torch.nn.Conv2d实例逐一用Conv2dQAT.from_float(module, config...)替换随后按常规流程训练/重训最后借助 AMCT 的部署能力导出带 Q/DQ 节点的量化模型。更多量化配置细节请参考 量化配置参数说明。【免费下载链接】amctAMCT是CANN提供的昇腾AI处理器亲和的模型压缩工具仓。项目地址: https://gitcode.com/cann/amct创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表