怎样在Python中用PyTorch TorchScript实现模型量化推理

酷辰酱_7143

酷辰酱_7143

2026-10-16

129人浏览

原创

pytorch量化推理不强制要求torchscript,但实际部署必须;静态量化需先script化模型以支持图级分析与重写,动态量化仅限python内使用;推荐torch.jit.script处理含控制流模型;quantize_jit可端到端生成无python依赖的量化模型。

怎样在python中用pytorch torchscript实现模型量化推理

PyTorch量化推理必须用 TorchScript 吗?

不是必须,但实际部署中基本绕不开。PyTorch 的 torch.quantization 量化流程最终要导出为 torch.jit.ScriptModule 才能脱离 Python 环境运行(比如在 C++、移动端或 Triton 上)。直接对 nn.Module 做动态量化(quantize_dynamic)只能在 Python 中用,且不支持所有算子;而静态量化(quantize_static)必须走 torch.jit.trace 或 torch.jit.script 流程才能插入 observer 和 fake-quant node。

静态量化前为什么必须先 Script 化模型?

因为 PyTorch 量化依赖图级分析和重写:observer 插入、fake-quant 节点替换、融合(如 Conv+BN+ReLU)、以及最终的 quant/dequant 节点插入,这些操作都在 TorchScript IR 层完成。原始 Python 模块有控制流、闭包、动态属性访问等,TorchScript 无法安全分析——所以必须先获得一个可追踪/可脚本化的模型表示。

  • torch.jit.trace 适合无条件分支、输入 shape 固定的模型(如典型 CNN),但会丢失 if/for 等逻辑
  • torch.jit.script 支持控制流,但要求模型代码能被静态分析(比如不能用 isinstance 判别模块类型,不能依赖未标注的全局变量)
  • 推荐优先用 torch.jit.script,尤其当模型含 if、for 或自定义 forward 逻辑时

量化后保存的 .pt 文件为什么加载报错 “No module named ‘torch.quantization’”?

这是常见误区:TorchScript 序列化的是模型结构和参数,但默认**不打包量化相关 Python 类(如 torch.quantization.MinMaxObserver)**。一旦模型里残留未融合的 observer 或 fake-quant node,加载时就会因找不到定义而失败。

  • 必须调用 model.eval() + torch.quantization.convert(model, inplace=True) 完成 observer 移除和算子替换(例如把 Conv2d → QuantizedConv2d)
  • 确保没漏掉子模块:如果模型含 self.branch_a 和 self.branch_b,需显式对每个子模块调用 convert,或用 torch.quantization.quantize_jit 一站式处理
  • 验证是否成功:加载后检查 type(model.conv1) 是否变成 torch.nn.intrinsic.quantized.ConvBnReLU2d 或类似量化类

如何用 torch.quantization.quantize_jit 一步到位?

这是最稳妥的端到端路径,它自动完成 Script → fuse → prepare → convert → export 全流程,且输出纯量化 ScriptModule,无 Python 依赖。

Forge — Python Developer
Forge — Python Developer

Python开发助手 — 自动化脚本、API封装、命令行工具、数据管道、网页爬虫。经过测试的代码,包含错误处理和文档。当你需要...

下载
# 假设 model 是已 script 化的模块
model = torch.jit.script(MyModel())
model.eval()
<h1>准备校准:跑几个 batch 数据</h1><p>calib<em>data = [(torch.randn(1,3,224,224), torch.randint(0,1000,(1,))) for </em> in range(32)]
model = torch.quantization.quantize_jit(
model,
{'observed_inputs': calib_data},
backend='fbgemm'  # x86 用 'fbgemm',ARM 用 'qnnpack'
)</p><h1>保存(此时已完全量化,无 observer)</h1><p>model.save('quantized_model.pt')</p><h1>加载(无需 import torch.quantization)</h1><p>loaded = torch.jit.load('quantized_model.pt')
</p>

注意:quantize_jit 内部强制使用 torch.quantization.default_qconfig,若需自定义 observer(比如 PerChannelMinMaxObserver),得退回到手动 prepare + convert 流程,且必须保证 prepare 阶段也基于 ScriptModule。

量化真正难的不是跑通,是校准数据分布是否贴近真实 inference 场景——用训练集子集校准,可能让模型在测试集上掉点;而用少量真实边缘数据(如手机拍的模糊图)校准,往往更鲁棒。这点容易被忽略,但比选 backend 或 qconfig 影响更大。

Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

python pytorch

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
python打包成可执行文件
python打包成可执行文件

本专题为大家带来python打包成可执行文件相关的文章,大家可以免费的下载体验。

2023.07.20

1731

4

python能做什么
python能做什么

python能做的有:可用于开发基于控制台的应用程序、多媒体部分开发、用于开发基于Web的应用程序、使用python处理数据、系统编程等等。本专题为大家提供python相关的各种文章、以及下载和课程。

2023.07.25

4444

7

format在python中的用法
format在python中的用法

Python中的format是一种字符串格式化方法,用于将变量或值插入到字符串中的占位符位置。通过format方法,我们可以动态地构建字符串,使其包含不同值。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.07.31

1709

3

python教程
python教程

Python已成为一门网红语言,即使是在非编程开发者当中,也掀起了一股学习的热潮。本专题为大家带来python教程的相关文章,大家可以免费体验学习。

2023.08.03

26117

23

python环境变量的配置
python环境变量的配置

Python是一种流行的编程语言,被广泛用于软件开发、数据分析和科学计算等领域。在安装Python之后,我们需要配置环境变量,以便在任何位置都能够访问Python的可执行文件。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.04

3167

5

python eval
python eval

eval函数是Python中一个非常强大的函数,它可以将字符串作为Python代码进行执行,实现动态编程的效果。然而,由于其潜在的安全风险和性能问题,需要谨慎使用。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.04

3187

5

scratch和python区别
scratch和python区别

scratch和python的区别:1、scratch是一种专为初学者设计的图形化编程语言,python是一种文本编程语言;2、scratch使用的是基于积木的编程语法,python采用更加传统的文本编程语法等等。本专题为大家提供scratch和python相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.11

1183

5

python合并两个列表
python合并两个列表

Python是一种强大的编程语言,具有许多方便的功能和工具。在Python中,有多种方法可以合并两个列表。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.10

596

4

python是前端还是后端
python是前端还是后端

Python属于前端也属于后端,其灵活性和丰富的生态系统使得开发人员能够在不同的领域中灵活运用。本专题为大家提供python相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.11

2483

5

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Uvicorn官方安装与入门手册
Uvicorn官方安装与入门手册

共0课时 | 0人学习

Python uv官方项目管理指南
Python uv官方项目管理指南

共0课时 | 0人学习

Python uv官方安装与入门文档
Python uv官方安装与入门文档

共0课时 | 0人学习