量化API参考

torch.ao.quantization

此模块包含了急切模式下的量化API。

顶级API

quantize

对输入的浮点模型使用训练后静态量化进行量化。

quantize_dynamic

将浮点模型转换为动态模型。

quantize_qat

进行量化感知训练,并生成量化模型

prepare

为量化校准或量化的感知训练准备模型的副本。

prepare_qat

准备模型的副本以进行量化校准或量化的感知训练,并将其转换为量化版本。

convert

根据mapping,使用目标模块类的from_float方法将输入模块中的子模块转换为不同模块。

为量化准备模型

fuse_modules.fuse_modules

将一系列模块合并成一个单一模块。

QuantStub

在量化插桩模块进行校准之前,它与观察者的作用相同,并且会在convert过程中被替换为nnq.Quantize

DeQuantStub

去量化的stub模块在校准之前等同于身份操作,在转换过程中将被替换为nnq.DeQuantize

QuantWrapper

一个包装类,用于封装输入模块,并在其周围添加QuantStub和DeQuantStub。在调用该模块时,还会调用量化和去量化的模块。

add_quant_dequant

如果叶级子模块具有有效的qconfig,则使用QuantWrapper将其包裹起来。需要注意的是,此函数会直接修改模块的子模块,并可能返回一个包装了输入模块的新模块。

实用函数

swap_module

如果有对应的量化版本且已附加了观察器,则交换该模块。

propagate_qconfig_

将 qconfig 逐层传递并通过模块层次结构分配,在每个叶子模块上设置 qconfig 属性

default_eval_fn

定义默认的评价函数。

torch.ao.quantization.quantize_fx

此模块包含了FX图形模式量化的API(原型)。

prepare_fx

为模型的训练后的量化做好准备

prepare_qat_fx

准备用于量化感知训练的模型

convert_fx

将校准或训练后的模型转换为量化模型

fuse_fx

将模块如 conv+bn、conv+bn+relu 等进行融合,模型必须设置为评估模式。

torch.ao.quantization.qconfig_mapping

此模块包含了用于配置FX图形模式量化设置的QConfigMapping。

QConfigMapping

将模型操作映射到 torch.ao.quantization.QConfig

get_default_qconfig_mapping

返回后训练量化的默认 QConfigMapping。

get_default_qat_qconfig_mapping

返回量化感知训练的默认 QConfigMapping。

torch.ao.quantization.backend_config

此模块包含了 BackendConfig 配置对象,用于定义后端如何支持量化功能。当前该配置仅被 FX 图模式量化所使用,但未来我们可能也会将其应用于即时模式量化中。

BackendConfig

定义在特定后端上可进行量化的模式集合,以及如何根据这些模式生成参考量化模型的配置。

BackendPatternConfig

一个配置对象,用于指定特定操作模式下的量化行为。

DTypeConfig

一个配置对象,指定了在参考模型规范中传递给量化操作的支持的数据类型,这些类型用于输入和输出激活、权重以及偏置。

DTypeWithConstraints

用于指定给定数据类型的附加约束配置,例如量化值范围、比例因子范围和固定量化参数。这些配置将在DTypeConfig中使用。

ObservationType

一个枚举,表示不同观察操作符/操作符模式的方式

torch.ao.quantization.fx.custom_config

此模块包含几个在急切模式和FX图模式量化中都使用的CustomConfig类。

FuseCustomConfig

fuse_fx() 设置自定义配置。

PrepareCustomConfig

prepare_fx()prepare_qat_fx() 进行自定义配置。

ConvertCustomConfig

用于convert_fx()的自定义配置。

StandaloneModuleConfigEntry

torch.ao.quantization.quantizer

torch.ao.quantization.pt2e (PyTorch 2.0 导出实现的量化)

torch.ao.quantization.pt2e.export_utils

model_is_exported

如果 torch.nn.Module 被导出,则返回 True,否则返回 False。

PT2 导出 (pt2e) 数值调试工具

generate_numeric_debug_handle

为模型中除占位符节点外的所有节点添加 numeric_debug_handle_id。输入模型的图节点将被原地修改。

CUSTOM_KEY

str(object='') -> str
str(bytes_or_buffer[, encoding[, errors]]) -> str

NUMERIC_DEBUG_HANDLE_KEY

str(object='') -> str
str(bytes_or_buffer[, encoding[, errors]]) -> str

prepare_for_propagation_comparison

为具有 numeric_debug_handle 的节点添加输出日志

extract_results_from_loggers

对于给定的模型,提取每个调试句柄的张量统计信息和相关数据。

compare_results

给定两个从debug_handle_id(整数)到张量列表的映射,返回一个从debug_handle_idNodeAccuracySummary的映射,并包含如SQNR、MSE等比较信息。

torch.ao.quantization.observer

此模块包含了用于收集在量化校准(PTQ)或训练(QAT)过程中所观察到的值的统计信息的观察器。

ObserverBase

基础观察者模块。

MinMaxObserver

一个用于根据运行过程中的最小值和最大值来计算量化参数的观测模块。

MovingAverageMinMaxObserver

一个用于根据最小值和最大值的滑动平均值来计算量化参数的观察模块。

PerChannelMinMaxObserver

一个用于根据运行时每通道的最小值和最大值来计算量化参数的观察模块。

MovingAveragePerChannelMinMaxObserver

一个用于根据运行时每通道的最小值和最大值来计算量化参数的观察模块。

HistogramObserver

该模块记录了张量值的运行直方图及其最小值和最大值。

PlaceholderObserver

一个不做任何操作,仅将配置传递给量化模块 .from_float() 的观察者。

RecordingObserver

该模块主要用于调试,会在运行时记录张量的值。

NoopObserver

一个不做任何操作,仅将配置传递给量化模块 .from_float() 的观察者。

get_observer_state_dict

返回与观察器统计数据对应的状态字典。

load_observer_state_dict

给定输入模型和包含模型观测统计信息的 state_dict,将这些统计信息加载回模型中。

default_observer

静态量化的默认观察器,通常用于调试。

default_placeholder_observer

默认的占位符观察器,通常用于将数据量化为 torch.float16。

default_debug_observer

默认的仅供调试使用的观察者。

default_weight_observer

默认重量观察器。

default_histogram_observer

默认的直方图观察器,通常用于PTQ。

default_per_channel_weight_observer

默认的按通道权重观察器,通常用于支持按通道权重量化的 Backend,如 fbgemm

default_dynamic_quant_observer

动态量化的默认观察器。

default_float_qparams_observer

浮点数零值的默认观察器。

torch.ao.quantization.fake_quantize

此模块实现了用于在量化感知训练(QAT)过程中进行伪量化的功能。

FakeQuantizeBase

基本的假量化模块。

FakeQuantize

在训练过程中模拟量化和反量化的操作。

FixedQParamsFakeQuantize

在训练过程中模拟量化和反量化的过程。

FusedMovingAvgObsFakeQuantize

定义一个融合模块来监控张量。

default_fake_quant

激活的默认假量化。

default_weight_fake_quant

权重的默认伪量化。

default_per_channel_weight_fake_quant

通道权重的默认假量化。

default_histogram_fake_quant

使用直方图进行激活的 Fake_quant...

default_fused_act_fake_quant

改进性能后的 default_fake_quant 融合版本。

default_fused_wt_fake_quant

default_weight_fake_quant 的融合版本,性能得到提升。

default_fused_per_channel_wt_fake_quant

基于 default_per_channel_weight_fake_quant 的融合版本,性能得到提升。

disable_fake_quant

禁用模块的假量化。

enable_fake_quant

为模块开启假量化。

disable_observer

关闭此模块的观察功能。

enable_observer

开启此模块的观察功能。

torch.ao.quantization.qconfig

此模块定义了QConfig对象,用于为每个操作配置量化设置。

QConfig

描述了如何通过为激活和权重分别提供设置(观察者类)来量化网络中的一个层或部分。

default_qconfig

默认的 qconfig 设置。

default_debug_qconfig

使用默认的 qconfig 配置进行调试。

default_per_channel_qconfig

通道级别权重量化默认的 qconfig 配置。

default_dynamic_qconfig

默认动态 qconfig。

float16_dynamic_qconfig

动态 qconfig,权重量化为 torch.float16

float16_static_qconfig

动态 qconfig,激活和权重都量化为 torch.float16

per_channel_dynamic_qconfig

动态qconfig,按通道量化权重。

float_qparams_weight_only_qconfig

带有浮点零点量化的动态 qconfig。

default_qat_qconfig

QAT 的默认配置 (qconfig)。

default_weight_only_qconfig

仅用于量化权重的默认 qconfig。

default_activation_only_qconfig

仅用于激活量化的默认 qconfig。

default_qat_qconfig_v2

融合版的 default_qat_config,具有性能优势。

torch.ao.nn.intrinsic

此模块实现了结合(融合)的 conv + relu 模块,这些模块可以随后进行量化。

ConvReLU1d

这是一个顺序容器,包含了Conv1d和ReLU模块的调用。

ConvReLU2d

这是一个顺序容器,包含了Conv2d和ReLU模块。

ConvReLU3d

这是一个顺序容器,包含了Conv3d和ReLU模块的调用。

LinearReLU

这是一个序列容器,包含了Linear和ReLU模块的调用。

ConvBn1d

这是一个顺序容器,包含了Conv 1d和Batch Norm 1d模块的调用。

ConvBn2d

这是一个顺序容器,包含了Conv 2d和Batch Norm 2d模块的调用。

ConvBn3d

这是一个顺序容器,包含了Conv 3d和Batch Norm 3d模块的调用。

ConvBnReLU1d

这是一个顺序容器,包含了Conv 1d、Batch Norm 1d和ReLU模块的调用。

ConvBnReLU2d

这是一个顺序容器,包含了Conv 2d、Batch Norm 2d和ReLU模块的调用。

ConvBnReLU3d

这是一个顺序容器,包含了Conv 3d、Batch Norm 3d和ReLU模块的调用。

BNReLU2d

这是一个顺序容器,包含了BatchNorm 2d和ReLU模块。

BNReLU3d

这是一个顺序容器,包含了BatchNorm 3d和ReLU模块。

torch.ao.nn.intrinsic.qat

此模块实现了用于量化感知训练所需的各种融合操作的版本。

LinearReLU

LinearReLU模块是由Linear和ReLU模块融合而成的,并配备了用于权重的FakeQuantize模块,应用于量化感知训练。

ConvBn1d

ConvBn1d 模块是通过将 Conv1d 和 BatchNorm1d 融合而来的,并配备了用于权重的 FakeQuantize 模块,适用于量化感知训练。

ConvBnReLU1d

ConvBnReLU1d 模块是通过融合 Conv1d、BatchNorm1d 和 ReLU 构建的,并配备了用于权重的 FakeQuantize 模块,适用于量化感知训练。

ConvBn2d

ConvBn2d 模块是通过将 Conv2d 和 BatchNorm2d 融合而来的,并且配备了用于权重的 FakeQuantize 模块,适用于量化感知训练。

ConvBnReLU2d

ConvBnReLU2d 模块是通过融合 Conv2d、BatchNorm2d 和 ReLU 构建的,并配备了用于权重的 FakeQuantize 模块,适用于量化感知训练。

ConvReLU2d

ConvReLU2d 模块是由 Conv2d 和 ReLU 融合而成的,并配备了用于量化感知训练的权重 FakeQuantize 模块。

ConvBn3d

ConvBn3d 模块是通过融合 Conv3d 和 BatchNorm3d 得到的,并且配备了用于权重的 FakeQuantize 模块,适用于量化感知训练。

ConvBnReLU3d

ConvBnReLU3d 模块由 Conv3d、BatchNorm3d 和 ReLU 组成,并包含用于权重的 FakeQuantize 模块,适用于量化感知训练。

ConvReLU3d

ConvReLU3d 模块是由 Conv3d 和 ReLU 融合而成的,并配备了用于量化感知训练的权重 FakeQuantize 模块。

update_bn_stats

freeze_bn_stats

torch.ao.nn.intrinsic.quantized

此模块实现了像卷积加ReLU这样的融合操作的量化版本。没有批量归一化的变体,因为在推理过程中它通常会被合并到卷积中。

BNReLU2d

BNReLU2d 模块是将 BatchNorm2d 和 ReLU 融合在一起的模块

BNReLU3d

BNReLU3d 模块是将 BatchNorm3d 和 ReLU 融合在一起的模块

ConvReLU1d

ConvReLU1d 模块是由 Conv1d 和 ReLU 融合而成的

ConvReLU2d

ConvReLU2d 模块是 Conv2d 和 ReLU 的结合体

ConvReLU3d

ConvReLU3d 模块是 Conv3d 和 ReLU 的结合体

LinearReLU

由Linear和ReLU模块结合而成的LinearReLU模块

torch.ao.nn.intrinsic.quantized.dynamic

此模块实现了像线性加ReLU这样的融合操作的量化动态实现。

LinearReLU

一个结合了Linear和ReLU模块的LinearReLU模块,适用于动态量化。

torch.ao.nn.qat

此模块实现了关键的 nn 模块 Conv2d()Linear() 的版本,在 FP32 精度下运行,但通过四舍五入来模拟 INT8 量化的效果。

Conv2d

一个带有用于权重的FakeQuantize模块的Conv2d模块,用于量化感知训练。

Conv3d

一个带有用于权重的FakeQuantize模块的Conv3d模块,用于量化感知训练。

Linear

一个带有用于权重的FakeQuantize模块的线性模块,用于量化感知训练。

torch.ao.nn.qat.dynamic

此模块实现了一些关键的nn模块(如Linear())的版本,它们在FP32环境下运行,但通过四舍五入来模拟INT8量化的效果,并且会在推理过程中进行动态量化。

Linear

一个带有用于权重的FakeQuantize模块的线性模块,用于动态量化感知训练。

torch.ao.nn.quantized

此模块实现了量化的nn层,例如~`torch.nn.Conv2d`和torch.nn.ReLU

ReLU6

应用逐元素函数:

Hardswish

这是Hardswish的量化版本。

ELU

这是ELU torch.nn.ELU )的量化等价版本。

LeakyReLU

这是LeakyReLU的量化等价版本。

Sigmoid

这是Sigmoid的量化等价版本。

BatchNorm2d

这是BatchNorm2d的量化版本。

BatchNorm3d

这是BatchNorm3d的量化版本。

Conv1d

对该输入信号进行一维卷积,该信号由多个量化输入平面组成。

Conv2d

对该输入信号进行二维卷积操作,该信号由多个量化输入平面组成。

Conv3d

对该输入信号进行三维卷积,该信号由多个量化输入平面组成。

ConvTranspose1d

对该一维输入图像(由多个输入平面组成)应用一维转置卷积运算。

ConvTranspose2d

对该输入图像进行二维转置卷积运算,该图像由多个输入平面组成。

ConvTranspose3d

对由多个输入平面组成的输入图像进行三维转置卷积操作。

Embedding

一个具有量化打包权重输入的量化嵌入模块。

EmbeddingBag

一个采用量化打包权重作为输入的量化EmbeddingBag模块。

FloatFunctional

用于浮点运算的状态收集类。

FXFloatFunctional

在FX图模式量化之前,使用该模块来替代FloatFunctional模块,因为activation_post_process将直接插入到顶层模块中。

QFunctional

用于量化操作的封装类。

Linear

一个具有量化张量作为输入和输出的量化线性模块。

LayerNorm

这是LayerNorm的量化版本。

GroupNorm

这是GroupNorm的量化版本。

InstanceNorm1d

这是InstanceNorm1d的量化版本。

InstanceNorm2d

这是InstanceNorm2d的量化版本。

InstanceNorm3d

这是InstanceNorm3d的量化版本。

torch.ao.nn.quantized.functional

量化功能接口。

此模块实现了功能层的量化版本,例如 `torch.nn.functional.conv2d` 和 torch.nn.functional.relu。注意:relu() 支持量化输入。

avg_pool2d

$kH \times kW$ 的区域内,以$sH \times sW$ 的步长应用二维平均池化操作。

avg_pool3d

$kD \times kH \times kW$ 区域内,通过 $sD \times sH \times sW$ 步长应用 3D 平均池化操作。

adaptive_avg_pool2d

对该由多个量化输入平面组成的量化输入信号进行二维自适应平均池化操作。

adaptive_avg_pool3d

对该由多个量化输入平面组成的量化输入信号进行三维自适应平均池化处理。

conv1d

对该输入进行1D卷积,该输入是由多个输入平面组成的量化1D数据。

conv2d

对该二维输入进行二维卷积运算,该输入由多个输入平面组成并已量化。

conv3d

对该三维输入进行三维卷积操作,该输入由多个输入平面组成并已量化。

interpolate

将输入下采样或上采样为指定的 size 或指定的 scale_factor

linear

对输入的量化数据进行线性变换:$y = xA^T + b$

max_pool1d

对由多个量化输入平面组成的量化输入信号进行一维最大池化操作。

max_pool2d

对由多个量化输入平面组成的量化输入信号进行二维最大池化操作。

celu

元素-wise 应用量化的 CELU 函数。

leaky_relu

该内容的量化版本。

hardtanh

这是hardtanh()的量化版本。

hardswish

这是hardswish()的量化版本。

threshold

按元素应用量化阈值函数:

elu

这是elu()的量化版本。

hardsigmoid

这是hardsigmoid()的量化版本。

clamp

float(input, min_, max_) -> Tensor

upsample

将输入上采样至给定的 size 或者给定的 scale_factor

upsample_bilinear

对输入采用双线性上采样进行放大。

upsample_nearest

使用最近邻的像素值对输入进行上采样处理。

torch.ao.nn.quantizable

此模块实现了某些nn层的可量化版本。可以使用custom_module_config参数,将这些模块与自定义模块机制结合,在prepare和convert过程中进行配置。

LSTM

可量化的时间长短记忆网络(LSTM)。

MultiheadAttention

torch.ao.nn.quantized.dynamic

动态量化后的 LinearLSTMLSTMCellGRUCellRNNCell

Linear

一个具有浮点张量输入和输出的动态量化线性模块。

LSTM

一个具有浮点张量输入和输出的动态量化LSTM模块。

GRU

对输入序列应用多层门控循环单元(GRU)RNN。

RNNCell

带有 tanh 或 ReLU 激活函数的 Elman RNN 单元。

LSTMCell

LSTM(长短期记忆)单元。

GRUCell

门控循环单元(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下的相应文件中,并在这里添加相应的导入语句。

本页目录