ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

PyTorch 量化 API 全面解析:Eager/FX 图模式量化、Observer、QConfig 与量化数学原理

PyTorch 量化 API 全面解析:Eager/FX 图模式量化、Observer、QConfig 与量化数学原理 PyTorch 量化 API 全面解析Eager/FX 图模式量化、Observer、QConfig 与量化数学原理【免费下载链接】pytorchTensors and Dynamic neural networks in Python with strong GPU acceleration项目地址: https://gitcode.com/GitHub_Trending/py/pytorch导读本文以 docs/source/quantization-support.md 为核心骨架系统梳理 PyTorch 的torch.ao.quantization量化 API 全景从 PTQ训练后量化与 QAT量化感知训练的顶层工作流到 Observer 与 FakeQuantize 的底层统计与模拟机制再到量化/反量化的数学原理与qscheme/dtype等核心概念并佐以仓库源码中的真实实现如 quantize.py、observer.py、quantize_fx.py。读完本文你将掌握如何在当前 PyTorch 仓库version.txt的代码基础上使用 Eager 与 FX 两种模式完成 INT8/FP16 量化、正确选择 Observer 与 QConfig并理解量化参数从何而来、如何在自定义算子中扩展新的量化方案。一、量化 API 的整体架构从顶层工作流到模块分类量化支持的核心代码位于 torch/ao/quantization 目录按功能可划分为以下几大模块这也正是原文档的章节组织逻辑模块职责torch.ao.quantizationEager 模式量化顶层 APIquantize、prepare、convert等torch.ao.quantization.quantize_fxFX 图模式量化 APIprototype 阶段prepare_fx、convert_fx等torch.ao.quantization.qconfig_mappingFX 模式下按算子/模块配置量化策略的QConfigMappingtorch.ao.quantization.backend_config定义后端如何支持量化的BackendConfig当前仅 FX 模式使用torch.ao.quantization.observer标定PTQ与训练QAT阶段收集统计量的 Observertorch.ao.quantization.fake_quantizeQAT 阶段执行伪量化的模块torch.ao.quantization.qconfig定义单个算子的量化配置QConfig及一系列默认值torch.ao.quantization.quantization_mappings浮点模块 ↔ 量化模块 ↔ QAT 模块之间的映射表torch.ao.nn.intrinsic/torch.ao.nn.qat/torch.ao.nn.quantized融合算子convrelu 等及其 QAT、量化实现FX 图模式量化通过torch.fx.symbolic_trace对模型进行符号追踪将模型转化为图后执行算子融合、插入观察点、替换量化算子等变换因此它需要example_inputs来驱动追踪见 quantize_fx.py。Eager 模式则直接在nn.Module层级上递归遍历子模块完成替换。二、顶层 APIPTQ 与 QAT 的完整工作流原文档将顶层 API 归纳为quantize、quantize_dynamic、quantize_qat、prepare、prepare_qat、convert六个函数它们在 quantize.py 中实现构成三种量化的标准流水线。2.1 静态训练后量化Static PTQprepare → calibrate → convertquantize(model, run_fn, run_args, mappingNone, inplaceFalse)将 prepare、标定与 convert 串成一步torch._C._log_api_usage_once(quantization_api.quantize.quantize) if mapping is None: mapping get_default_static_quant_module_mappings() if not inplace: model copy.deepcopy(model) model.eval() prepare(model, inplaceTrue) # 1. 插入 Observer run_fn(model, *run_args) # 2. 运行标定数据 convert(model, mapping, inplaceTrue) # 3. 替换为量化算子对应源码见 quantize.py。若希望手动控制标定过程可拆开调用先prepare得到带 Observer 的模型跑若干 batch 数据收集激活值统计量再convert成真正的量化模型。mapping参数控制浮点模块到量化模块的替换关系缺省使用get_default_static_quant_module_mappings()。prepare(model, inplaceFalse, allow_listNone, observer_non_leaf_module_listNone, prepare_custom_config_dictNone)的具体行为见 quantize.py遍历模型为每个带有效qconfig属性的子模块插入activation_post_process即 Observer 或 FakeQuantize通过propagate_qconfig_向所有子模块传播 qconfig若整个模型没有任何子模块被应用 qconfig会发出warnings.warn提示配置可能未生效prepare_custom_config_dict支持通过float_to_observed_custom_module_class键将用户自定义模块映射到自定义的“观测版”模块。convert(module, mappingNone, inplaceFalse, remove_qconfigTrue, is_referenceFalse, convert_custom_config_dictNone, use_precomputed_fake_quantFalse)通过调用目标模块类的from_float类方法完成替换并在结束时移除模型上的qconfig属性见 quantize.py。convert_custom_config_dict的observed_to_quantized_custom_module_class键负责自定义模块的“观测版 → 量化版”转换。2.2 动态量化Dynamic/Weights-only Quantizationquantize_dynamic(model, qconfig_specNone, dtypetorch.qint8, mappingNone, inplaceFalse)将模型转换为权重预量化、激活在推理时动态量化的模型。其默认qconfig_spec依据dtype自动生成见 quantize.pydtype默认应用到的模块使用的 QConfigtorch.qint8nn.Linear、nn.LSTM、nn.GRU、nn.LSTMCell、nn.RNNCell、nn.GRUCelldefault_dynamic_qconfigtorch.float16同上 RNN/Linear 系列float16_dynamic_qconfigtorch.quint8nn.EmbeddingBag、nn.Embeddingfloat_qparams_weight_only_qconfigtorch.quint4x2nn.EmbeddingBagfloat_qparams_weight_only_qconfig_4bit支持两种细粒度控制方式传入dict模块名/类型 → QConfig 实例或传入set模块类型集合配合dtype指定位宽。一旦显式提供qconfig_specdtype参数即被忽略。2.3 量化感知训练QATprepare_qat(model, mappingNone, inplaceFalse)要求模型处于training模式否则抛出AssertionError其内部先按get_default_qat_module_mappings()将浮点模块替换为 QAT 版如torch.ao.nn.qat.Conv2d再调用prepare为这些非叶子模块插入 FakeQuantize见 quantize.py。quantize_qat(model, run_fn, run_args, inplaceFalse)则是完整流水线model.train()→prepare_qat→ 运行训练循环 →convert得到最终量化模型见 quantize.py。三、量化准备融合、QuantStub 与自定义模块机制3.1 算子融合Eager 模式使用fuse_modules.fuse_modulesfuse_modules.py以及 QAT 专用的fuse_modules_qat完成 convbn、convbnrelu、linearrelu 等融合。融合后的组合模块定义在torch.ao.nn.intrinsic如ConvReLU1d/2d/3d、LinearReLU、ConvBnReLU1d/2d/3d、BNReLU2d/3d。值得注意的是量化版的融合算子没有 BatchNorm 变体——因为推理时 BN 通常已被折叠进卷积见原文档torch.ao.nn.intrinsic.quantized章节说明。FX 模式对应fuse_fx(model, fuse_custom_configNone, backend_configNone)其内部先torch.fx.symbolic_trace(model)再按融合规则执行图变换融合规则定义于torch.ao.quantization.fx.fusion_pattern.py且模型必须处于eval()模式见 quantize_fx.py。3.2 QuantStub / DeQuantStub / QuantWrapper这三个类位于 stubs.pyQuantStub标定前等价于 Observerconvert后被替换为nnq.QuantizeDeQuantStub标定前等价于恒等映射convert后被替换为nnq.DeQuantizeQuantWrapper包裹叶子模块并自动添加quant、dequant两个子模块forward依次执行quant → module → dequant。add_quant_dequant(module)会自动为“无子模块且有有效 qconfig”的叶子模块包上QuantWrapper见 quantize.py。3.3 自定义模块torch.ao.nn.quantizable提供两个“可量化”高层模块LSTM与MultiheadAttention。它们需配合自定义模块机制使用在prepare和convert中分别通过custom_module_configEager 模式对应prepare_custom_config_dict/convert_custom_config_dict注册float_to_observed_custom_module_class与observed_to_quantized_custom_module_class映射。对应 FX 模式下的配置类为torch.ao.quantization.fx.custom_config中的FuseCustomConfig、PrepareCustomConfig、ConvertCustomConfig与StandaloneModuleConfigEntry。四、Observer量化参数从哪里来Observer 负责在标定PTQ或训练QAT期间收集张量统计量并据此计算 scales与 zero pointz。所有 Observer 继承自ObserverBaseobserver.py主要实现包括Observer统计策略适用场景MinMaxObserver记录运行中的全局 min/max静态量化的默认选择MovingAverageMinMaxObserver以指数移动平均更新 min/max标定数据存在波动时更稳健PerChannelMinMaxObserver按通道记录 min/max权重的 per-channel 量化MovingAveragePerChannelMinMaxObserver按通道的移动平均权重量化 平滑统计HistogramObserver直方图统计可计算更优的 min/max追求更低量化误差PlaceholderObserver占位/调试默认不收集统计量仅传递 qconfig 信息RecordingObserver记录输入值本身调试、后处理分析NoopObserver完全空操作跳过某层的观察4.1 量化参数的计算公式以MinMaxObserver为例observer.py运行 min/max 按以下规则迭代更新x_min min(X) 若当前 x_min 为 None min(x_min, min(X)) 否则 x_max max(X) 若当前 x_max 为 None max(x_max, max(X)) 否则然后根据对称/非对称方案计算s与z对称量化Symmetric: s 2 * max(|x_min|, |x_max|) / (Q_max - Q_min) z 0 若 dtype 为 qint8 z 128 否则 非对称量化Otherwise: s (x_max - x_min) / (Q_max - Q_min) z Q_min - round(x_min / s)其中Q_min/Q_max是量化 dtype 的最小/最大值[x_min, x_max]是输入数据的取值范围。特别地当运行 min 等于 max 时scale 与 zero_point 被置为 1.0 和 0。一个重要的精度结论原文档与源码 docstring 均强调只要 0 落在输入数据范围内或者使用对称量化0 的表示就是无误差的。MinMaxObserver构造参数还包括reduce_range、quant_min/quant_max、eps与is_dynamic。其中reduce_rangeTrue会将量化范围缩减 1 bit如 quint8 从 [0,255] 缩到 [0,127]这是为 x86 上的vpmaddubsw指令防溢出而设计的注释见 observer.py但会损失一点激活精度。注意MinMaxObserver的 qscheme 仅支持per_tensor_symmetric与per_tensor_affine传入 per-channel 方案会抛出NotImplementedError同时 quint8 对称 reduce_range的组合也被禁止。4.2 默认 Observer 工厂函数原文档列出了一组默认工厂函数使用示例与含义如下工厂函数含义default_observerquint8 per-tensor 仿射的默认激活 Observerdefault_weight_observerqint8 per-tensor 对称的默认权重 Observerdefault_per_channel_weight_observerqint8 per-channel 对称的权重 Observerdefault_histogram_observer直方图 Observerdefault_dynamic_quant_observer动态量化专用 Observerdefault_fixed_qparams_range_0to1_observer/default_fixed_qparams_range_neg1to1_observer固定量化参数如 sigmoid/tanh 输出范围default_float_qparams_observer/default_float_qparams_observer_4bit浮点 scale 的 weight-only 量化Embedding 等default_debug_observer、default_placeholder_observer调试与占位weight_observer_range_neg_127_to_127系列将权重范围限制在 [-127, 127]Observer 的状态可通过get_observer_state_dict/load_observer_state_dict保存与恢复便于跨进程复用标定结果。五、FakeQuantizeQAT 中的伪量化QAT 的核心思想是让模型在前向传播中模拟 INT8 量化带来的舍入误差使训练出的权重对量化“免疫”。torch.ao.quantization.fake_quantize模块实现这一机制其类层次为FakeQuantizeBase → FakeQuantize → FixedQParamsFakeQuantize / FusedMovingAvgObsFakeQuantizefake_quantize.py。FakeQuantize内部组合一个 Observer 与量化/反量化逻辑前向时“先量化再反量化”输入输出仍为浮点FusedMovingAvgObsFakeQuantize将移动平均 Observer 与 FakeQuantize 融合为一个模块前向一次完成统计与伪量化常用工厂函数default_fake_quant、default_per_channel_weight_fake_quant、default_fused_act_fake_quant、default_fused_per_channel_wt_fake_quant、default_histogram_fake_quant等控制函数disable_fake_quant/enable_fake_quant/disable_observer/enable_observer用于在推理或标定阶段按需关闭伪量化或统计。在torch.ao.nn.qat中Conv2d/Conv3d/Linear的 QAT 版实现“以 FP32 运行但施加舍入以模拟 INT8 量化效果”torch.ao.nn.qat.dynamic.Linear则是“以 FP32 运行模拟 INT8 舍入、但推理时会被动态量化”的版本。torch.ao.nn.intrinsic.qat提供融合算子的 QAT 版并额外提供update_bn_stats与freeze_bn_stats两个工具QAT 前期用update_bn_stats让 BN 统计量随训练更新后期用freeze_bn_stats冻结统计量以便在convert时正确折叠进卷积。六、QConfig 与 QConfigMapping逐算子配置量化策略6.1 QConfig单个算子的配置QConfig是(activation, weight)的命名元组qconfig.py分别指定激活与权重的 Observer/FakeQuantize。仓库内置的默认 QConfig 及含义QConfigactivation / weight用途default_qconfigdefault_observer/default_weight_observer静态量化通用默认值default_per_channel_qconfigdefault_observer/default_per_channel_weight_observer权重按通道量化default_dynamic_qconfigdefault_dynamic_quant_observer/default_weight_observer动态量化float16_dynamic_qconfigNoopObserver/placeholderFP16 动态量化float16_static_qconfigFP16 观察FP16 静态量化float_qparams_weight_only_qconfig/float_qparams_weight_only_observerEmbedding 等 weight-only浮点 scalefloat_qparams_weight_only_qconfig_4bit/ 4bit 版本4bit EmbeddingBagdefault_qat_qconfigdefault_fused_act_fake_quant/default_fused_per_channel_wt_fake_quantQAT 通用默认值default_qat_qconfig_v2v2 变体QATx86 后端新版本default_weight_only_qconfig/纯权重量化default_activation_only_qconfig激活量化 /仅激活量化default_debug_qconfigRecordingObserver/RecordingObserver调试记录输入输出get_default_qconfig(backendx86, version0)与get_default_qat_qconfig(backendx86, version1)按后端与版本返回默认配置qconfig_equals(q1, q2)判断两个 QConfig 是否等价。此外还有带torch.finfo与 dtype 约束的QConfigDynamic变体。6.2 QConfigMappingFX 模式的全局配置FX 图模式使用QConfigMappingqconfig_mapping.py替代 Eager 模式下“往子模块上贴 qconfig 属性”的做法。它支持按全局、按模块类型、按模块名、按算子名function/method分层配置from torch.ao.quantization import get_default_qconfig_mapping, QConfigMapping qconfig_mapping QConfigMapping() qconfig_mapping.set_global(default_qconfig) # 全局默认 qconfig_mapping.set_object_type(torch.nn.Linear, ...) # 按类型 qconfig_mapping.set_module_name(features.conv1, ...) # 按模块名 qconfig_mapping.set_module_name_regex(...) # 按正则 qconfig_mapping.set_module_name_object_type_order(...) # 组合优先级get_default_qconfig_mapping(backendx86, version0)与get_default_qat_qconfig_mapping(backendx86, version1)提供开箱即用的默认映射。6.3 BackendConfig后端量化能力的声明BackendConfigtorch.ao.quantization.backend_config以声明式方式描述“某个后端如何支持量化”包括算子如何被观察、支持哪些融合模式、量化/反量化算子如何插入、支持的 dtype 组合等。相关类型包括BackendPatternConfig、DTypeConfig、DTypeWithConstraints、ObservationType。仓库自带三个后端的配置工厂get_fbgemm_backend_config()— fbgemm 后端x86 权重打包get_onednn_backend_config()— oneDNN 后端mkldnnget_executorch_backend_config()— ExecuTorch 移动端后端。torch.ao.quantization.backend_config.utils提供一组从 BackendConfig 提取信息的工具函数例如get_fused_module_classes、get_fuser_method_mapping、get_module_to_qat_module、get_qat_module_classes、get_pattern_to_dtype_configs、get_root_module_to_quantized_reference_module等它们把声明式配置翻译为 Eager 模式也能理解的结构化数据。七、FX 图模式量化 API原文档标注 FX 图模式量化目前仍属 prototype核心 API 位于torch.ao.quantization.quantize_fxAPI作用prepare_fx(model, qconfig_mapping, example_inputs, prepare_custom_configNone, _equalization_configNone, backend_configNone)PTQ 准备追踪为图、插入观察点返回QuantizedGraphModuleprepare_qat_fx(...)QAT 准备convert_fx(...)将准备好的图转换为量化图fuse_fx(model, fuse_custom_configNone, backend_configNone)图上的算子融合convert_to_reference_fx(...)转换为“参考量化模型”保持浮点算子 显式量化/反量化节点便于跨后端移植attach_preserved_attrs_to_model(...)将原模型属性附加到转换后的图上保留需要透传的属性prepare_fx要求提供example_inputs模型forward的位置参数元组用于torch.fx.symbolic_trace驱动追踪fuse_fx则要求模型处于eval()模式见 quantize_fx.py。图上的量化节点为QuantizedGraphModuletorch.ao.quantization.fx.graph_module。torch.ao.quantization.fx.utils提供大量图变换辅助函数覆盖节点参数判定node_arg_is_weight、node_arg_is_bias、get_non_observable_arg_indexes_and_types、算子 prepack 查找get_qconv_prepack_op、get_linear_prepack_op_for_dtype、子图提取graph_module_from_producer_nodes、collect_producer_nodes等是理解 FX 量化图变换内部机制的重要入口。八、量化张量dtype、qscheme 与张量级 API8.1 量化的数学定义原文档给出了量化与反量化的统一数学定义与MinMaxObserver的实现一致量化Quantization: Q_out clamp(x_input / s z, Q_min, Q_max) 反量化Dequantization: x_out (Q_input - z) * s其中clamp(·)即torch.clamps与z的计算见第 4.1 节。量化是一个“有损”映射误差大小取决于数据范围与量化区间如 8bit 共 256 个离散值的匹配程度。8.2 量化数据类型dtypedtype含义torch.quint88 位无符号整数范围 [0, 255]常用于激活torch.qint88 位有符号整数范围 [-128, 127]常用于权重torch.qint3232 位有符号整数常用于累加器/偏置bias8.3 量化方案qschemeqscheme粒度与对称性torch.per_tensor_affine整张张量共享一个 (s, z)非对称torch.per_channel_affine每通道独立 (s, z)非对称torch.per_tensor_symmetric整张张量共享一个 sz 固定qint8 为 0 / quint8 为 128对称torch.per_channel_symmetric每通道独立 s对称需要强调的是原文档的明确说明当前算子实现只支持 conv 与 linear 算子的权重做 per-channel 量化激活一般使用 per-tensor。torch.ao.quantization.observer中还新增了更细粒度的枚举Granularity、MappingType、PerAxis/PerBlock/PerGroup/PerRow/PerTensor/PerToken、ZeroPointDomain、TorchAODType等反映量化粒度正在向 Group/Block 级扩展服务于低比特权重量化方向并提供了get_block_size等辅助函数。8.4 torch 命名空间与 Tensor 方法torch命名空间提供三个底层量化原语torch.quantize_per_tensor(input, scale, zero_point, dtype) # per-tensor 量化 torch.quantize_per_channel(input, scales, zero_points, axis, dtype) # per-channel 量化 torch.dequantize(tensor) # 反量化torch.Tensor对量化张量只支持“有限子集”的数据操作方法原文档明确说明这一点包括视图/形状类view、as_strided、expand、flatten、select、resize_比较类ne、eq、ge、le、gt、lt、equal复制/克隆copy_、clone量化专属dequantize、int_repr、q_scale、q_zero_point、q_per_channel_scales、q_per_channel_zero_points、q_per_channel_axis归约/排序max、mean、min、sort、topk。这些方法大多直接透传到底层量化 kernel其余未列出的全精度方法对量化张量不可用。九、量化模块族intrinsic / qat / quantized / dynamic 全景9.1 融合模块torch.ao.nn.intrinsic实现“可量化的融合算子”覆盖三个形态子模块内容torch.ao.nn.intrinsic浮点融合版ConvReLU1d/2d/3d、LinearReLU、ConvBn1d/2d/3d、ConvBnReLU1d/2d/3d、BNReLU2d/3dtorch.ao.nn.intrinsic.qatQAT 融合版LinearReLU、ConvBn*、ConvReLU*外加update_bn_stats/freeze_bn_statstorch.ao.nn.intrinsic.quantized推理量化融合版ConvReLU*、LinearReLU、BNReLU2d/3d无 BatchNorm 融合变体推理时 BN 已折叠进卷积torch.ao.nn.intrinsic.quantized.dynamic动态量化融合版LinearReLU9.2 量化模块torch.ao.nn.quantized实现nn.Conv2d、nn.ReLU等层的量化版包括ReLU6、Hardswish、ELU、LeakyReLU、Sigmoid、BatchNorm2d/3d、Conv1d/2d/3d、ConvTranspose1d/2d/3d、Embedding、EmbeddingBag、FloatFunctional/FXFloatFunctional、QFunctional、Linear、LayerNorm、GroupNorm、InstanceNorm1d/2d/3d。函数式版本位于torch.ao.nn.quantized.functional覆盖conv1d/2d/3d、linear、avg_pool2d/3d、adaptive_avg_pool2d/3d、max_pool1d/2d、interpolate、upsample系列以及celu、leaky_relu、hardtanh、hardswish、threshold、elu、hardsigmoid、clamp等激活。注意torch.nn.functional.relu原生支持量化输入。9.3 动态量化模块torch.ao.nn.quantized.dynamic提供动态量化的Linear、LSTM、GRU、RNNCell、LSTMCell、GRUCell——权重在转换时即完成量化激活则在每次前向时动态量化特别适合权重占主导的 RNN/线性层。9.4 映射表torch.ao.quantization.quantization_mappingsquantization_mappings模块维护浮点/量化/QAT 三类模块之间的对应关系核心函数包括get_default_static_quant_module_mappings、get_default_dynamic_quant_module_mappings、get_default_qat_module_mappings、get_default_static_quant_reference_module_mappings、get_default_float_to_quantized_operator_mappings、get_default_qconfig_propagation_list、get_static_quant_module_class、get_dynamic_quant_module_class、get_quantized_operator以及no_observer_set无需 Observer 的算子集合等。convert阶段正是通过这类映射加上模块类的from_float类方法完成替换。十、实用工具函数速览原文档还列出了两个工具模块供深度定制时调用torch.ao.quantization.utils激活量化类型判定activation_is_statically_quantized、activation_is_dynamically_quantized、activation_is_int8_quantized、activation_is_int32_quantized、量化参数计算calculate_qmin_qmax、validate_qmin_qmax、check_min_max_valid、determine_qparams、get_qparam_dict、qconfig 提取get_qconfig_dtypes、get_quant_type、get_combined_dict、模块 FQN 工具getattr_from_fqn、get_fqn_to_example_inputs、自定义模块处理get_swapped_custom_module_class以及NodePattern/Pattern类型别名torch.ao.quantization.fx.utilsFX 图变换的辅助函数见第七章如maybe_get_next_module、create_getattr_from_value、get_skipped_module_name_and_classes、get_new_attr_name_with_prefix等。此外文档末尾还以隐藏 toctree 的方式引用了quantization-support.aliases.md即torch.quantization命名空间下的历史别名模块torch.nn.quantized、torch.nn.qat、torch.nn.intrinsic等这些别名用于兼容旧代码新代码应使用torch.ao前缀。十一、量化方案扩展自定义算子机制原文档明确指出额外的数据类型与量化方案可通过自定义算子机制torch script custom ops实现。这意味着当内置的 affine 量化per_tensor_affine等四种方案无法满足需求时开发者可以通过torch.library即原文档所提 custom operator 机制注册新的量化/反量化算子与 kernel在quantization_mappings或BackendConfig中声明新算子与既有模块的对应关系用自定义 Observer 计算新的量化参数如浮点 scale 的 weight-only 方案即float_qparams_weight_only_qconfig的先例。仓库中的torch.ao.quantization.experimental.quantizer等模块即体现了此类扩展方向。这一机制保证了量化框架的可扩展性也是当前仓库在 observer.py 中新增PerGroup/PerBlock/PerToken等粒度枚举的底层动因。十二、总结与选型建议结合文档与源码量化的完整生命周期可概括为准备插入 Observer/FakeQuantize→ 标定或训练收集统计量/模拟舍入→ 转换按映射替换为量化算子→ 推理。选型建议如下追求易用性优先使用quantize_dynamic权重占主导的 LLM/RNN 场景收益最大无需标定数据追求精度静态 PTQprepare 标定 convert权重用default_per_channel_qconfig精度仍不足QATprepare_qat/quantize_qat配合update_bn_stats/freeze_bn_stats控制 BN 统计量需要细粒度算子级配置或自定义后端使用 FX 图模式prepare_fxQConfigMappingBackendConfig或通过custom_module_config注入自定义模块。本文所有结论均可在仓库对应源码中验证顶层流程见 quantize.pyObserver 统计与公式见 observer.pyFX 模式见 quantize_fx.py配置对象见 qconfig.py 与 qconfig_mapping.py伪量化见 fake_quantize.py融合与桩模块见 fuse_modules.py 与 stubs.py。【免费下载链接】pytorchTensors and Dynamic neural networks in Python with strong GPU acceleration项目地址: https://gitcode.com/GitHub_Trending/py/pytorch创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表