quant_modules._DEFAULT_QUANT_MAP 量化主要只有卷积(Conv)、全连接(Linear)、池化(Pooling)和 LSTM,而没有 ReLU/SiLU 等激活函数
Gemmi 生成# 将一个普通的 PyTorch 神经网络模块如 Conv2d“变身”为一个量化感知模块如 QuantConv2d而不丢失原有模块的所有参数和状态。deftransfer_torch_to_quantization(nninstance:torch.nn.Module,quantmodule):# 创建未初始化的量化实例quant_instancequantmodule.__new__(quantmodule)# “偷梁换柱”复制原有属性fork,valinvars(nninstance).items():setattr(quant_instance,k,val)# 此时quant_instance 已经有了正确的权重和偏置但它还没有加载量化器。它本质上是一个“披着量化类外衣的空壳”。def__init__(self):# 从全局配置或类定义中提取输入激活值和权重权重参数的量化描述符如校准方法 max位宽 8 等。quant_desc_input,quant_desc_weightquant_nn_utils.pop_quant_desc_in_kwargs(self.__class__)# 仅量化输入 (如某些激活函数或特殊层)ifisinstance(self,quant_nn_utils.QuantInputMixin):#quant_desc_input quant_nn_utils.pop_quant_desc_in_kwargs(self.__class__, input_onlyTrue)self.init_quantizer(quant_desc_input)# Turn on torch_hist to enable higher calibration speedsifisinstance(self._input_quantizer._calibrator,calib.MaxCalibrator):self._input_quantizer._calibrator._torch_histTrueelse:# 量化输入和权重 (如标准的卷积层)self.init_quantizer(quant_desc_input,quant_desc_weight)# Turn on torch_hist to enable higher calibration speedsifisinstance(self._input_quantizer._calibrator,calib.MaxCalibrator):self._input_quantizer._calibrator._torch_histTrueself._weight_quantizer._calibrator._torch_histTrue__init__(quant_instance)returnquant_instancedefreplace_to_quantization_module(model:torch.nn.Module):module_dict{}# 遍历输入的 PyTorch 模型找到那些被注册在 quant_modules._DEFAULT_QUANT_MAP 中的特定层print(quant_modules:,quant_modules._DEFAULT_QUANT_MAP)forentryinquant_modules._DEFAULT_QUANT_MAP:# 原始模块所在的类或模块例如 mmcv.cnn.bricks.wrappers--原始模块的具体类名字符串例如 ConvTranspose2dmodulegetattr(entry.orig_mod,entry.mod_name)# 用于替换的量化模块类例如 quant_nn.QuantConvTranspose2d。# id(module): 获取该类对象在内存中的唯一标识符。module_dict[id(module)]entry.replace_mod# 将它们替换为对应的量化感知模块# 这是一个深度优先搜索DFS函数用于遍历整个模型树。defrecursive_and_replace_module(module,prefix):fornameinmodule._modules:submodulemodule._modules[name]pathnameifprefixelseprefix.name recursive_and_replace_module(submodule,path)submodule_idid(type(submodule))ifsubmodule_idinmodule_dict:print(submodule_id:,submodule_id,module_dict[submodule_id])module._modules[name]transfer_torch_to_quantization(submodule,module_dict[submodule_id])recursive_and_replace_module(model)quant_modules: [ quant_entry( orig_modmodule torch.nn from /torch/nn/__init__.py, mod_nameConv1d, replace_modclass pytorch_quantization.nn.modules.quant_conv.QuantConv1d), quant_entry(orig_modmodule torch.nn from /torch/nn/__init__.py, mod_nameConv2d, replace_modclass pytorch_quantization.nn.modules.quant_conv.QuantConv2d), quant_entry(orig_modmodule torch.nn from /torch/nn/__init__.py, mod_nameConv3d, replace_modclass pytorch_quantization.nn.modules.quant_conv.QuantConv3d), quant_entry(orig_modmodule torch.nn from /torch/nn/__init__.py, mod_nameConvTranspose1d, replace_modclass pytorch_quantization.nn.modules.quant_conv.QuantConvTranspose1d), quant_entry(orig_modmodule torch.nn from /torch/nn/__init__.py, mod_nameConvTranspose2d, replace_modclass pytorch_quantization.nn.modules.quant_conv.QuantConvTranspose2d), quant_entry(orig_modmodule torch.nn from /torch/nn/__init__.py, mod_nameConvTranspose3d, replace_modclass pytorch_quantization.nn.modules.quant_conv.QuantConvTranspose3d), quant_entry(orig_modmodule torch.nn from /torch/nn/__init__.py, mod_nameLinear, replace_modclass pytorch_quantization.nn.modules.quant_linear.QuantLinear), quant_entry(orig_modmodule torch.nn from /torch/nn/__init__.py, mod_nameLSTM, replace_modclass pytorch_quantization.nn.modules.quant_rnn.QuantLSTM), quant_entry(orig_modmodule torch.nn from /torch/nn/__init__.py, mod_nameLSTMCell, replace_modclass pytorch_quantization.nn.modules.quant_rnn.QuantLSTMCell), quant_entry(orig_modmodule torch.nn from /torch/nn/__init__.py, mod_nameAvgPool1d, replace_modclass pytorch_quantization.nn.modules.quant_pooling.QuantAvgPool1d), quant_entry(orig_modmodule torch.nn from /torch/nn/__init__.py, mod_nameAvgPool2d, replace_modclass pytorch_quantization.nn.modules.quant_pooling.QuantAvgPool2d), quant_entry(orig_modmodule torch.nn from /torch/nn/__init__.py, mod_nameAvgPool3d, replace_modclass pytorch_quantization.nn.modules.quant_pooling.QuantAvgPool3d), quant_entry(orig_modmodule torch.nn from /torch/nn/__init__.py, mod_nameAdaptiveAvgPool1d, replace_modclass pytorch_quantization.nn.modules.quant_pooling.QuantAdaptiveAvgPool1d), quant_entry(orig_modmodule torch.nn from /torch/nn/__init__.py, mod_nameAdaptiveAvgPool2d, replace_modclass pytorch_quantization.nn.modules.quant_pooling.QuantAdaptiveAvgPool2d), quant_entry(orig_modmodule torch.nn from /torch/nn/__init__.py, mod_nameAdaptiveAvgPool3d, replace_modclass pytorch_quantization.nn.modules.quant_pooling.QuantAdaptiveAvgPool3d)] 为何只有卷积没有激活函数这个问题问得很到点子上你在日志里看到的这个quant_modules映射表实际上是pytorch_quantization的猴子补丁机制Monkey Patching /quant_modules.initialize()在工作。之所以这个列表中主要只有卷积Conv、全连接Linear、池化Pooling和 LSTM而没有 ReLU/SiLU 等激活函数主要有以下两个核心原因1. 硬件部署视角激活函数的量化节点会被“融合Fusion”在 TensorRT 或 CUDA 硬件加速推理时ReLU / GELU / SiLU 等激活函数通常不会作为独立的硬件指令执行。层融合Layer FusionTensorRT 在编译 Engine 时会自动把Conv Bias ReLU融合成一个单一的 CUDA 内核Kernel。截断自动完成卷积层输出时带有的量化参数Scale / Zero-point已经能够把负数截断ReLU 的作用就是把000的部分清零激活函数的逻辑已经在硬件计算卷积的算子末端顺带完成了。无需额外伪量化FakeQuant如果给 ReLU 节点单独插入一个伪量化算子不仅无法提升精度反而会在 TensorRT 导出时引入多余的 Tensor 转换开销甚至破坏 TensorRT 的算子融合优化。2. 量化算法视角计算密集型 vs 激活/非线性节点pytorch_quantization的设计初衷是做INT8 权重量化Weight Quantization与激活值量化Activation Quantization重点监控的是权重/输入计算量极大的算子算子类型代表模块为什么需要替换为Quantized版本计算密集型Conv2d,Linear包含可学习参数权重Weight需要为其插入Weight FakeQuantizer并在输入端插入Input FakeQuantizer。下采样/汇聚型AvgPool2d,AdaptiveAvgPool2d影响特征图数值范围分布且涉及张量重组需要独立的Input/Output FakeQuantizer来对齐 Scale。非线性激活ReLU,SiLU,Sigmoid无权重仅对输入元素做逐元素Element-wise映射。在标准 INT8 量化体系中它的输入/输出 Scale 可以直接继承前一级 Conv 或下一级 Conv 的 Scale无需单独替换 Class。3. 那激活值的量化Activation Quantization是怎么做的虽然没有QuantReLU这个类但这并不意味着激活值没有被量化当你调用quant_modules.initialize()时Conv2d被替换成了QuantConv2d。在QuantConv2d内部包含了两个量化器weight_quantizer专门用来伪量化卷积核权重。input_quantizer专门用来伪量化传入该卷积层的输入特征图Activation。也就是说激活值的量化已经被打包收纳在下一个层比如下一个 Conv 或 Linear的输入端或者上一个层的输出端了根本不需要额外去替换torch.nn.ReLU。 总结与建议你看到的映射表只是pytorch_quantization自动将 PyTorch 默认带有权重的算子替换为支持伪量化Fake Quantization插桩的子类。对于 MMDetection/MMRazor 训练这种设计完全符合 NVIDIA 官方推荐的 INT8 量化范式。在校准Calibration或 QAT 微调时直接按照正常流程启用quant_modules.initialize()即可无需手动给激活函数添加量化节点。

相关新闻

专业问卷设计:从基础逻辑到高级技巧

专业问卷设计:从基础逻辑到高级技巧

1. 问卷调查设计基础与核心逻辑问卷调查作为最基础也最有效的数据收集工具,在商业决策、学术研究和社会调研中扮演着关键角色。我从事市场调研工作十二年,经手设计的问卷超过300份,发现90%的问卷设计者都会犯一些根本性错误——要么问题设置带…

2026/7/22 8:10:52 阅读更多 →
面试官问:Java模块化(Project Jigsaw)与反射限制?一张图+公寓门禁比喻,彻底拿下这道必考题(附图解+比喻+避坑指南)

面试官问:Java模块化(Project Jigsaw)与反射限制?一张图+公寓门禁比喻,彻底拿下这道必考题(附图解+比喻+避坑指南)

面试官问:Java模块化(Project Jigsaw)与反射限制?一张图公寓门禁比喻,彻底拿下这道必考题(附图解比喻避坑指南) 预计阅读:13分钟 📌 你是不是也这样:升级到JD…

2026/7/22 8:10:52 阅读更多 →
软件测试CMA认可人员资质资格要求与培训内容

软件测试CMA认可人员资质资格要求与培训内容

人员是实验室运行中非常关键的一个要素,也是实验室在进行软件测试CMA认可过程中非常重要的一个评审要素。软件测试实验室在申请CMA认可时,首先需要明确人员的资质,人员资质符合要求后,需要对人员进行培训、监督、授权和监控&#…

2026/7/22 8:10:52 阅读更多 →

最新新闻

Microsoft服务器核心服务端口配置与排障指南

Microsoft服务器核心服务端口配置与排障指南

1. Microsoft服务器端口全景图:核心服务与通信要道在企业IT基础设施中,Microsoft服务器产品构成了网络通信的中枢神经系统。作为Windows Server的资深运维工程师,我经常需要处理因端口配置不当导致的连接故障。本文将系统梳理Active Director…

2026/7/22 8:54:06 阅读更多 →
RESTful接口设计规范与安全性能优化实践

RESTful接口设计规范与安全性能优化实践

1. 接口的本质与核心价值在软件开发领域,接口(Interface)就像不同设备之间的通用充电口——它定义了一套标准化的连接规范,让原本互不相识的组件能够安全可靠地交换数据。我经历过多个大型项目后深刻体会到,良好的接口…

2026/7/22 8:54:06 阅读更多 →
C2000 DSP ePWM模块深度解析:从寄存器配置到电机控制实战

C2000 DSP ePWM模块深度解析:从寄存器配置到电机控制实战

1. ePWM模块核心架构与设计哲学 在嵌入式电机控制和功率转换领域,生成一个精准、稳定且灵活的PWM波形,远不止是简单地开启一个定时器。它涉及到周期与占空比的精确协调、多路输出的同步与互补、硬件死区的插入、故障的即时响应,以及如何以最小…

2026/7/22 8:54:06 阅读更多 →
Pinia模块化拆分与性能优化实战指南

Pinia模块化拆分与性能优化实战指南

1. 项目概述:Pinia模块化拆分的必要性在大型前端项目中,状态管理一直是架构设计的核心痛点。Pinia作为Vue官方推荐的状态管理方案,其模块化特性为复杂应用提供了天然优势。但模块化不是简单的功能拆分,而是需要结合业务逻辑、数据…

2026/7/22 8:54:06 阅读更多 →
深入解析pytest_runtest_setup钩子:掌控测试用例执行前的最后时机

深入解析pytest_runtest_setup钩子:掌控测试用例执行前的最后时机

1. 项目概述:深入pytest_runtest_setup钩子 在自动化测试的世界里,pytest框架以其简洁、灵活和强大的插件体系而备受青睐。很多测试工程师都能熟练地编写 pytest.fixture 、使用 assert ,但当测试用例的执行流程需要更精细的控制&#xf…

2026/7/22 8:54:06 阅读更多 →
车载心率监测技术:智能座舱健康监测的突破与应用

车载心率监测技术:智能座舱健康监测的突破与应用

1. 车载心率监测技术的突破与价值 路畅科技最新公布的车载心率电路专利,标志着智能座舱健康监测领域迈出了关键一步。这项技术通过在方向盘或座椅内置高精度传感器,实现驾驶员心率数据的实时采集与分析。与消费级手环相比,其独特之处在于采用…

2026/7/22 8:53:06 阅读更多 →

日新闻

TI DSP系统配置模块SYSCFG详解:中断机制与主设备优先级配置实战

TI DSP系统配置模块SYSCFG详解:中断机制与主设备优先级配置实战

1. 项目概述与SYSCFG模块的核心价值在嵌入式系统,尤其是像TI C6000系列这样的高性能DSP开发中,我们常常会与芯片手册里那些密密麻麻的寄存器打交道。很多开发者可能更关注算法实现、内存优化或者外设驱动,但对于一个稳定、高效的系统而言&…

2026/7/22 0:00:26 阅读更多 →
微信Server酱:高到达率的应急通知方案实践

微信Server酱:高到达率的应急通知方案实践

1. 为什么我们需要"最次"的通知方案? 在数字化协作环境中,消息通知系统的重要性不言而喻明。但现实情况是,企业级通知方案往往需要复杂的API对接(如企业微信、钉钉、飞书),个人开发者的小项目又经…

2026/7/22 0:00:26 阅读更多 →
甲方要的“简洁“PPT,到底是简洁还是省事?

甲方要的“简洁“PPT,到底是简洁还是省事?

甲方说"简洁一点",乙方听到的是"少做几页"。甲方说"不要太复杂",乙方理解成"别放图表了"。结果交过去,甲方说"我说的简洁不是这个意思"。"简洁"这个词在PPT语境里,是…

2026/7/22 0:00:26 阅读更多 →

周新闻

Go语言静态资源打包方案对比与实践指南

Go语言静态资源打包方案对比与实践指南

1. 项目背景与核心需求在Go语言开发中,我们经常需要处理静态资源文件的打包问题。无论是Web应用的模板文件、前端资源,还是配置文件、证书等,都需要随程序一起分发。传统做法是将这些文件与编译后的二进制文件放在同一目录下,但这…

2026/7/21 8:48:31 阅读更多 →
Go语言实现高性能LDAP认证服务的架构与实践

Go语言实现高性能LDAP认证服务的架构与实践

1. 项目背景与核心价值LDAP(轻量级目录访问协议)作为企业级身份认证的黄金标准,已经服务了超过80%的财富500强公司。我在金融科技领域实施统一认证体系时,发现传统Java方案存在启动慢、内存占用高等痛点。而Go语言凭借其协程并发模…

2026/7/21 5:34:47 阅读更多 →
【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

更多请点击: https://intelliparadigm.com 第一章:AI面试官实战指南的核心价值与适用场景 AI面试官并非替代人类HR的“黑箱工具”,而是以可解释、可审计、可迭代的方式,赋能招聘全链路的关键基础设施。其核心价值在于将主观经验沉…

2026/7/21 8:25:39 阅读更多 →

月新闻