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/26 7:35:53 阅读更多 →
面试官问:Java模块化(Project Jigsaw)与反射限制?一张图+公寓门禁比喻,彻底拿下这道必考题(附图解+比喻+避坑指南)

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

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

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

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

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

2026/7/25 15:44:33 阅读更多 →

最新新闻

计算机Python毕设实战- 基于 Python 的老年人生理指标监测预警系统智慧养老老年人健康风险预警管理系统【完整源码+LW+部署说明+演示视频,全bao一条龙等】

计算机Python毕设实战- 基于 Python 的老年人生理指标监测预警系统智慧养老老年人健康风险预警管理系统【完整源码+LW+部署说明+演示视频,全bao一条龙等】

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

2026/7/26 17:24:13 阅读更多 →
CC2538 Flash内存操作详解:从寄存器到DMA,实现高效OTA与数据存储

CC2538 Flash内存操作详解:从寄存器到DMA,实现高效OTA与数据存储

1. 项目概述与Flash内存核心价值在嵌入式开发,尤其是物联网节点和无线传感网络设备中,Flash内存扮演着“数字大脑的永久记忆”这一关键角色。它不像我们电脑里的内存(RAM)那样一断电就失忆,而是能将程序代码、系统配置…

2026/7/26 17:24:13 阅读更多 →
一次检索覆盖整个会话:共现聚类让RAG覆盖率涨17%

一次检索覆盖整个会话:共现聚类让RAG覆盖率涨17%

标准 RAG 按语义相似度检索,但用户在一次会话里需要的文档未必"长得像"——建站用户同时需要域名配置、模板设计、支付设置,这三类文档在嵌入空间里相距甚远。南加州大学提出的共现感知知识库重组方法,用 Word2Vec 学习文档共现模式…

2026/7/26 17:24:13 阅读更多 →
计算机Python毕设实战-基于 Python Web 的在线音乐播放分享社区系统【完整源码+LW+部署说明+演示视频,全bao一条龙等】

计算机Python毕设实战-基于 Python Web 的在线音乐播放分享社区系统【完整源码+LW+部署说明+演示视频,全bao一条龙等】

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

2026/7/26 17:24:13 阅读更多 →
计算机Python毕设实战-基于 OpenCV 的人脸特征检测与身份识别系统 轻量化人脸识别与身份验证管理系统开发【完整源码+LW+部署说明+演示视频,全bao一条龙等】

计算机Python毕设实战-基于 OpenCV 的人脸特征检测与身份识别系统 轻量化人脸识别与身份验证管理系统开发【完整源码+LW+部署说明+演示视频,全bao一条龙等】

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

2026/7/26 17:24:13 阅读更多 →
二维码与区块链技术在产品防伪溯源中的创新应用实践

二维码与区块链技术在产品防伪溯源中的创新应用实践

最近在技术圈里,一款"需要勺子挖的啤酒"意外走红。你可能觉得奇怪:啤酒不是液体吗?怎么还需要勺子?更让人好奇的是,开罐居然要扫二维码! 这背后其实是一场关于 产品数字化与用户体验创新 的技…

2026/7/26 17:23:12 阅读更多 →

日新闻

深度学习道路桥梁裂缝检测系统 道路桥梁裂缝检测数据集 道路桥梁病害识别检测数据集

深度学习道路桥梁裂缝检测系统 道路桥梁裂缝检测数据集 道路桥梁病害识别检测数据集

深度学习道路桥梁裂缝检测系统 数据集6000张 完整源码已标注数据集训练好的模型环境配置教程程序运行说明文档,可以直接使用!系统支持图片、视频、摄像头等多种方式检测裂缝,功能强大实用。 1数据集6000张 8各类别

2026/7/26 0:00:31 阅读更多 →
深度学习YOLO模型如何训练 PUBG 绝地求生目标检测数据集

深度学习YOLO模型如何训练 PUBG 绝地求生目标检测数据集

pubg数据集 精选原图1.42万数据 1.49万标签 无任何重复、算法增强或冗余图像! pubg绝地求生目标检测数据集 1分类:e_body,14905个标签,txt格式 共计14244张图,99%为640*640尺寸图像 适合yolo目标检测、AI训练关键词&am…

2026/7/26 0:00:31 阅读更多 →
Apex英雄目标检测数据集 深度学习框架YOLO如何训练APEX数据集

Apex英雄目标检测数据集 深度学习框架YOLO如何训练APEX数据集

Apex检测数据集数据集详情检测类别: allies enemy tag图片总量:7247张训练集:5139张验证集:1425张测试集:683张标注状态:全部已标注,即拿即用数据格式:支持YOLO格式及其他格式&#…

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

周新闻

深度学习道路桥梁裂缝检测系统 道路桥梁裂缝检测数据集 道路桥梁病害识别检测数据集

深度学习道路桥梁裂缝检测系统 道路桥梁裂缝检测数据集 道路桥梁病害识别检测数据集

深度学习道路桥梁裂缝检测系统 数据集6000张 完整源码已标注数据集训练好的模型环境配置教程程序运行说明文档,可以直接使用!系统支持图片、视频、摄像头等多种方式检测裂缝,功能强大实用。 1数据集6000张 8各类别

2026/7/26 0:00:31 阅读更多 →
深度学习YOLO模型如何训练 PUBG 绝地求生目标检测数据集

深度学习YOLO模型如何训练 PUBG 绝地求生目标检测数据集

pubg数据集 精选原图1.42万数据 1.49万标签 无任何重复、算法增强或冗余图像! pubg绝地求生目标检测数据集 1分类:e_body,14905个标签,txt格式 共计14244张图,99%为640*640尺寸图像 适合yolo目标检测、AI训练关键词&am…

2026/7/26 0:00:31 阅读更多 →
Apex英雄目标检测数据集 深度学习框架YOLO如何训练APEX数据集

Apex英雄目标检测数据集 深度学习框架YOLO如何训练APEX数据集

Apex检测数据集数据集详情检测类别: allies enemy tag图片总量:7247张训练集:5139张验证集:1425张测试集:683张标注状态:全部已标注,即拿即用数据格式:支持YOLO格式及其他格式&#…

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

月新闻