量化API参考
torch.ao.quantization
此模块包含了急切模式下的量化API。
顶级API
对输入的浮点模型使用训练后静态量化进行量化。 |
|
将浮点模型转换为动态模型。 |
|
进行量化感知训练,并生成量化模型 |
|
为量化校准或量化的感知训练准备模型的副本。 |
|
准备模型的副本以进行量化校准或量化的感知训练,并将其转换为量化版本。 |
|
根据mapping,使用目标模块类的from_float方法将输入模块中的子模块转换为不同模块。 |
为量化准备模型
将一系列模块合并成一个单一模块。 |
|
在量化插桩模块进行校准之前,它与观察者的作用相同,并且会在 |
|
去量化的stub模块在校准之前等同于身份操作,在转换过程中将被替换为nnq.DeQuantize。 |
|
一个包装类,用于封装输入模块,并在其周围添加QuantStub和DeQuantStub。在调用该模块时,还会调用量化和去量化的模块。 |
|
如果叶级子模块具有有效的qconfig,则使用QuantWrapper将其包裹起来。需要注意的是,此函数会直接修改模块的子模块,并可能返回一个包装了输入模块的新模块。 |
实用函数
如果有对应的量化版本且已附加了观察器,则交换该模块。 |
|
将 qconfig 逐层传递并通过模块层次结构分配,在每个叶子模块上设置 qconfig 属性 |
|
定义默认的评价函数。 |
torch.ao.quantization.quantize_fx
此模块包含了FX图形模式量化的API(原型)。
为模型的训练后的量化做好准备 |
|
准备用于量化感知训练的模型 |
|
将校准或训练后的模型转换为量化模型 |
|
将模块如 conv+bn、conv+bn+relu 等进行融合,模型必须设置为评估模式。 |
torch.ao.quantization.qconfig_mapping
此模块包含了用于配置FX图形模式量化设置的QConfigMapping。
将模型操作映射到 |
|
返回后训练量化的默认 QConfigMapping。 |
|
返回量化感知训练的默认 QConfigMapping。 |
torch.ao.quantization.backend_config
此模块包含了 BackendConfig 配置对象,用于定义后端如何支持量化功能。当前该配置仅被 FX 图模式量化所使用,但未来我们可能也会将其应用于即时模式量化中。
定义在特定后端上可进行量化的模式集合,以及如何根据这些模式生成参考量化模型的配置。 |
|
一个配置对象,用于指定特定操作模式下的量化行为。 |
|
一个配置对象,指定了在参考模型规范中传递给量化操作的支持的数据类型,这些类型用于输入和输出激活、权重以及偏置。 |
|
用于指定给定数据类型的附加约束配置,例如量化值范围、比例因子范围和固定量化参数。这些配置将在 |
|
一个枚举,表示不同观察操作符/操作符模式的方式 |
torch.ao.quantization.fx.custom_config
此模块包含几个在急切模式和FX图模式量化中都使用的CustomConfig类。
为 |
|
为 |
|
用于 |
|
torch.ao.quantization.quantizer
torch.ao.quantization.pt2e (PyTorch 2.0 导出实现的量化)
torch.ao.quantization.pt2e.export_utils
如果 torch.nn.Module 被导出,则返回 True,否则返回 False。 |
PT2 导出 (pt2e) 数值调试工具
为模型中除占位符节点外的所有节点添加 numeric_debug_handle_id。输入模型的图节点将被原地修改。 |
|
str(object='') -> str |
|
str(object='') -> str |
|
为具有 numeric_debug_handle 的节点添加输出日志 |
|
对于给定的模型,提取每个调试句柄的张量统计信息和相关数据。 |
|
给定两个从debug_handle_id(整数)到张量列表的映射,返回一个从debug_handle_id到NodeAccuracySummary的映射,并包含如SQNR、MSE等比较信息。 |
torch.ao.quantization.observer
此模块包含了用于收集在量化校准(PTQ)或训练(QAT)过程中所观察到的值的统计信息的观察器。
基础观察者模块。 |
|
一个用于根据运行过程中的最小值和最大值来计算量化参数的观测模块。 |
|
一个用于根据最小值和最大值的滑动平均值来计算量化参数的观察模块。 |
|
一个用于根据运行时每通道的最小值和最大值来计算量化参数的观察模块。 |
|
一个用于根据运行时每通道的最小值和最大值来计算量化参数的观察模块。 |
|
该模块记录了张量值的运行直方图及其最小值和最大值。 |
|
一个不做任何操作,仅将配置传递给量化模块 |
|
该模块主要用于调试,会在运行时记录张量的值。 |
|
一个不做任何操作,仅将配置传递给量化模块 |
|
返回与观察器统计数据对应的状态字典。 |
|
给定输入模型和包含模型观测统计信息的 state_dict,将这些统计信息加载回模型中。 |
|
静态量化的默认观察器,通常用于调试。 |
|
默认的占位符观察器,通常用于将数据量化为 torch.float16。 |
|
默认的仅供调试使用的观察者。 |
|
默认重量观察器。 |
|
默认的直方图观察器,通常用于PTQ。 |
|
默认的按通道权重观察器,通常用于支持按通道权重量化的 Backend,如 fbgemm。 |
|
动态量化的默认观察器。 |
|
浮点数零值的默认观察器。 |
torch.ao.quantization.fake_quantize
此模块实现了用于在量化感知训练(QAT)过程中进行伪量化的功能。
基本的假量化模块。 |
|
在训练过程中模拟量化和反量化的操作。 |
|
在训练过程中模拟量化和反量化的过程。 |
|
定义一个融合模块来监控张量。 |
|
激活的默认假量化。 |
|
权重的默认伪量化。 |
|
通道权重的默认假量化。 |
|
使用直方图进行激活的 Fake_quant... |
|
改进性能后的 default_fake_quant 融合版本。 |
|
default_weight_fake_quant 的融合版本,性能得到提升。 |
|
基于 default_per_channel_weight_fake_quant 的融合版本,性能得到提升。 |
|
禁用模块的假量化。 |
|
为模块开启假量化。 |
|
关闭此模块的观察功能。 |
|
开启此模块的观察功能。 |
torch.ao.quantization.qconfig
此模块定义了QConfig对象,用于为每个操作配置量化设置。
描述了如何通过为激活和权重分别提供设置(观察者类)来量化网络中的一个层或部分。 |
|
默认的 qconfig 设置。 |
|
使用默认的 qconfig 配置进行调试。 |
|
通道级别权重量化默认的 qconfig 配置。 |
|
默认动态 qconfig。 |
|
动态 qconfig,权重量化为 torch.float16。 |
|
动态 qconfig,激活和权重都量化为 torch.float16。 |
|
动态qconfig,按通道量化权重。 |
|
带有浮点零点量化的动态 qconfig。 |
|
QAT 的默认配置 (qconfig)。 |
|
仅用于量化权重的默认 qconfig。 |
|
仅用于激活量化的默认 qconfig。 |
|
融合版的 default_qat_config,具有性能优势。 |
torch.ao.nn.intrinsic
此模块实现了结合(融合)的 conv + relu 模块,这些模块可以随后进行量化。
这是一个顺序容器,包含了Conv1d和ReLU模块的调用。 |
|
这是一个顺序容器,包含了Conv2d和ReLU模块。 |
|
这是一个顺序容器,包含了Conv3d和ReLU模块的调用。 |
|
这是一个序列容器,包含了Linear和ReLU模块的调用。 |
|
这是一个顺序容器,包含了Conv 1d和Batch Norm 1d模块的调用。 |
|
这是一个顺序容器,包含了Conv 2d和Batch Norm 2d模块的调用。 |
|
这是一个顺序容器,包含了Conv 3d和Batch Norm 3d模块的调用。 |
|
这是一个顺序容器,包含了Conv 1d、Batch Norm 1d和ReLU模块的调用。 |
|
这是一个顺序容器,包含了Conv 2d、Batch Norm 2d和ReLU模块的调用。 |
|
这是一个顺序容器,包含了Conv 3d、Batch Norm 3d和ReLU模块的调用。 |
|
这是一个顺序容器,包含了BatchNorm 2d和ReLU模块。 |
|
这是一个顺序容器,包含了BatchNorm 3d和ReLU模块。 |
torch.ao.nn.intrinsic.qat
此模块实现了用于量化感知训练所需的各种融合操作的版本。
LinearReLU模块是由Linear和ReLU模块融合而成的,并配备了用于权重的FakeQuantize模块,应用于量化感知训练。 |
|
ConvBn1d 模块是通过将 Conv1d 和 BatchNorm1d 融合而来的,并配备了用于权重的 FakeQuantize 模块,适用于量化感知训练。 |
|
ConvBnReLU1d 模块是通过融合 Conv1d、BatchNorm1d 和 ReLU 构建的,并配备了用于权重的 FakeQuantize 模块,适用于量化感知训练。 |
|
ConvBn2d 模块是通过将 Conv2d 和 BatchNorm2d 融合而来的,并且配备了用于权重的 FakeQuantize 模块,适用于量化感知训练。 |
|
ConvBnReLU2d 模块是通过融合 Conv2d、BatchNorm2d 和 ReLU 构建的,并配备了用于权重的 FakeQuantize 模块,适用于量化感知训练。 |
|
ConvReLU2d 模块是由 Conv2d 和 ReLU 融合而成的,并配备了用于量化感知训练的权重 FakeQuantize 模块。 |
|
ConvBn3d 模块是通过融合 Conv3d 和 BatchNorm3d 得到的,并且配备了用于权重的 FakeQuantize 模块,适用于量化感知训练。 |
|
ConvBnReLU3d 模块由 Conv3d、BatchNorm3d 和 ReLU 组成,并包含用于权重的 FakeQuantize 模块,适用于量化感知训练。 |
|
ConvReLU3d 模块是由 Conv3d 和 ReLU 融合而成的,并配备了用于量化感知训练的权重 FakeQuantize 模块。 |
|
torch.ao.nn.intrinsic.quantized
此模块实现了像卷积加ReLU这样的融合操作的量化版本。没有批量归一化的变体,因为在推理过程中它通常会被合并到卷积中。
BNReLU2d 模块是将 BatchNorm2d 和 ReLU 融合在一起的模块 |
|
BNReLU3d 模块是将 BatchNorm3d 和 ReLU 融合在一起的模块 |
|
ConvReLU1d 模块是由 Conv1d 和 ReLU 融合而成的 |
|
ConvReLU2d 模块是 Conv2d 和 ReLU 的结合体 |
|
ConvReLU3d 模块是 Conv3d 和 ReLU 的结合体 |
|
由Linear和ReLU模块结合而成的LinearReLU模块 |
torch.ao.nn.intrinsic.quantized.dynamic
此模块实现了像线性加ReLU这样的融合操作的量化动态实现。
一个结合了Linear和ReLU模块的LinearReLU模块,适用于动态量化。 |
torch.ao.nn.qat
此模块实现了关键的 nn 模块 Conv2d() 和 Linear() 的版本,在 FP32 精度下运行,但通过四舍五入来模拟 INT8 量化的效果。
一个带有用于权重的FakeQuantize模块的Conv2d模块,用于量化感知训练。 |
|
一个带有用于权重的FakeQuantize模块的Conv3d模块,用于量化感知训练。 |
|
一个带有用于权重的FakeQuantize模块的线性模块,用于量化感知训练。 |
torch.ao.nn.qat.dynamic
此模块实现了一些关键的nn模块(如Linear())的版本,它们在FP32环境下运行,但通过四舍五入来模拟INT8量化的效果,并且会在推理过程中进行动态量化。
一个带有用于权重的FakeQuantize模块的线性模块,用于动态量化感知训练。 |
torch.ao.nn.quantized
此模块实现了量化的nn层,例如~`torch.nn.Conv2d`和torch.nn.ReLU。
应用逐元素函数: |
|
这是 |
|
这是 |
|
这是 |
|
这是 |
|
这是 |
|
这是 |
|
对该输入信号进行一维卷积,该信号由多个量化输入平面组成。 |
|
对该输入信号进行二维卷积操作,该信号由多个量化输入平面组成。 |
|
对该输入信号进行三维卷积,该信号由多个量化输入平面组成。 |
|
对该一维输入图像(由多个输入平面组成)应用一维转置卷积运算。 |
|
对该输入图像进行二维转置卷积运算,该图像由多个输入平面组成。 |
|
对由多个输入平面组成的输入图像进行三维转置卷积操作。 |
|
一个具有量化打包权重输入的量化嵌入模块。 |
|
一个采用量化打包权重作为输入的量化EmbeddingBag模块。 |
|
用于浮点运算的状态收集类。 |
|
在FX图模式量化之前,使用该模块来替代FloatFunctional模块,因为activation_post_process将直接插入到顶层模块中。 |
|
用于量化操作的封装类。 |
|
一个具有量化张量作为输入和输出的量化线性模块。 |
|
这是 |
|
这是 |
|
这是 |
|
这是 |
|
这是 |
torch.ao.nn.quantized.functional
量化功能接口。
此模块实现了功能层的量化版本,例如 `torch.nn.functional.conv2d` 和 torch.nn.functional.relu。注意:relu()
支持量化输入。
在$kH \times kW$ 的区域内,以$sH \times sW$ 的步长应用二维平均池化操作。 |
|
在 $kD \times kH \times kW$ 区域内,通过 $sD \times sH \times sW$ 步长应用 3D 平均池化操作。 |
|
对该由多个量化输入平面组成的量化输入信号进行二维自适应平均池化操作。 |
|
对该由多个量化输入平面组成的量化输入信号进行三维自适应平均池化处理。 |
|
对该输入进行1D卷积,该输入是由多个输入平面组成的量化1D数据。 |
|
对该二维输入进行二维卷积运算,该输入由多个输入平面组成并已量化。 |
|
对该三维输入进行三维卷积操作,该输入由多个输入平面组成并已量化。 |
|
将输入下采样或上采样为指定的 |
|
对输入的量化数据进行线性变换:$y = xA^T + b$。 |
|
对由多个量化输入平面组成的量化输入信号进行一维最大池化操作。 |
|
对由多个量化输入平面组成的量化输入信号进行二维最大池化操作。 |
|
元素-wise 应用量化的 CELU 函数。 |
|
该内容的量化版本。 |
|
这是 |
|
这是 |
|
按元素应用量化阈值函数: |
|
这是 |
|
这是 |
|
float(input, min_, max_) -> Tensor |
|
将输入上采样至给定的 |
|
对输入采用双线性上采样进行放大。 |
|
使用最近邻的像素值对输入进行上采样处理。 |
torch.ao.nn.quantizable
此模块实现了某些nn层的可量化版本。可以使用custom_module_config
参数,将这些模块与自定义模块机制结合,在prepare和convert过程中进行配置。
可量化的时间长短记忆网络(LSTM)。 |
|
torch.ao.nn.quantized.dynamic
动态量化后的 Linear
、LSTM
、LSTMCell
、GRUCell
和 RNNCell
。
一个具有浮点张量输入和输出的动态量化线性模块。 |
|
一个具有浮点张量输入和输出的动态量化LSTM模块。 |
|
对输入序列应用多层门控循环单元(GRU)RNN。 |
|
带有 tanh 或 ReLU 激活函数的 Elman RNN 单元。 |
|
LSTM(长短期记忆)单元。 |
|
门控循环单元(GRU) |
量化数据类型及量化方案
请注意,当前的操作实现仅支持卷积和线性操作权重的通道级量化。此外,输入数据与量化后的数据之间存在线性映射关系,具体如下:
$\begin{aligned} \text{Quantization:}&\\ &Q_\text{out} = \text{clamp}(x_\text{input}/s+z, Q_\text{min}, Q_\text{max})\\ \text{Dequantization:}&\\ &x_\text{out} = (Q_\text{input}-z)*s \end{aligned}$
其中$\text{clamp}(.)$与clamp()
相同,而缩放因子$s$和零点$z$则按照MinMaxObserver
中的描述进行计算,具体如下:
$\begin{aligned} \text{if Symmetric:}&\\ &s = 2 \max(|x_\text{min}|, x_\text{max}) / \left( Q_\text{max} - Q_\text{min} \right) \\ &z = \begin{cases} 0 & \text{if dtype is qint8} \\ 128 & \text{otherwise} \end{cases}\\ \text{Otherwise:}&\\ &s = \left( x_\text{max} - x_\text{min} \right ) / \left( Q_\text{max} - Q_\text{min} \right ) \\ &z = Q_\text{min} - \text{round}(x_\text{min} / s) \end{aligned}$
其中$[x_\text{min}, x_\text{max}]$表示输入数据的范围,而$Q_\text{min}$和$Q_\text{max}$分别代表量化数据类型的最小值和最大值。
需要注意的是,当零处于输入数据的范围内或采用对称量化时,$s$ 和 $z$ 的选择确保了零可以无误差地表示。
可以通过自定义操作机制来实现额外的数据类型和量化方案。
-
torch.qscheme
— 用于描述张量量化方案的类型。支持的类型有:-
torch.per_tensor_affine
— 张量级别,非对称 -
torch.per_channel_affine
— 非对称的按通道处理 -
torch.per_tensor_symmetric
— 对称的张量范围 -
torch.per_channel_symymmetric
— 对称的通道处理
-
-
torch.dtype
— 描述数据类型的类型。支持的类型有:-
torch.quint8
— 8位无符号整数 -
torch.qint8
— 8位有符号整数 -
torch.qint32
— 32位有符号整数
-
量化感知训练模块
此包即将被弃用,请使用torch.ao.nn.qat.modules作为替代。
QAT动态模块
此包即将被弃用,请使用torch.ao.nn.qat.dynamic作为替代。
此文件正在迁移到torch/ao/quantization,为了兼容性暂时保留在原位置。如果你要添加新的条目或功能,请将其添加到torch/ao/quantization/fx/下的相应文件中,并在此处添加导入语句。
QAT动态模块
此包即将被弃用,请使用torch.ao.nn.qat.dynamic作为替代。
量化模块。
- 注意:
-
torch.nn.quantized 命名空间即将被弃用,请使用 torch.ao.nn.quantized 替代。
量化动态模块。
此文件正在迁移到torch/ao/nn/quantized/dynamic,并在迁移过程中为了兼容性暂时保留在此。如果你要添加新的条目或功能,请将其添加到torch/ao/nn/quantized/dynamic下的相应文件中,并在这里添加相应的导入语句。