評價此頁

量化 API 參考#

創建於: 2020年7月25日 | 最後更新於: 2025年6月18日

torch.ao.quantization#

該模組包含 Eager 模式下的量化 API。

頂級 API#

quantize

使用訓練後靜態量化對輸入浮點模型進行量化。

quantize_dynamic

將浮點模型轉換為動態(即

quantize_qat

進行量化感知訓練並輸出量化模型

prepare

準備模型副本以進行量化校準或量化感知訓練。

prepare_qat

準備模型副本以進行量化校準或量化感知訓練,並將其轉換為量化版本。

convert

根據 mapping,透過呼叫目標模組類的 from_float 方法,將輸入模組中的子模組轉換為不同的模組。

準備模型以進行量化#

fuse_modules.fuse_modules

將模組列表融合成一個單一的模組。

QuantStub

量化存根模組,在校準之前,它與觀察器相同,將在 convert 中被替換為 nnq.Quantize

DeQuantStub

反量化存根模組,在校準之前,它與恆等函式相同,將在 convert 中被替換為 nnq.DeQuantize

QuantWrapper

一個包裝類,用於包裝輸入模組,新增 QuantStub 和 DeQuantStub,並將模組的呼叫圍繞量化和反量化模組的呼叫。

add_quant_dequant

如果葉子子模組具有有效的 qconfig,則將其包裝在 QuantWrapper 中。請注意,此函式將就地修改模組的子模組,並且還可以返回一個包裝輸入模組的新模組。

實用函式#

swap_module

如果模組具有量化對應項並且附加了 observer,則替換該模組。

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 等。模型必須處於 eval 模式。

torch.ao.quantization.qconfig_mapping#

該模組包含 QConfigMapping,用於配置 FX 圖模式量化。

QConfigMapping

模型操作到 torch.ao.quantization.QConfig 的對映。

get_default_qconfig_mapping

返回用於訓練後量化的預設 QConfigMapping。

get_default_qat_qconfig_mapping

返回用於量化感知訓練的預設 QConfigMapping。

torch.ao.quantization.backend_config#

該模組包含 BackendConfig,一個配置物件,用於定義量化在後端中如何被支援。目前僅由 FX 圖模式量化使用,但我們可能會擴充套件 Eager 模式量化以使其也能工作。

BackendConfig

定義給定後端可以量化的模式集,以及如何從這些模式生成參考量化模型的配置。

BackendPatternConfig

指定給定運算子模式的量化行為的配置物件。

DTypeConfig

指定參考模型規範中用於量化操作的啟用、權重和偏置的輸入和輸出資料的支援資料型別的配置物件。

DTypeWithConstraints

用於指定給定 dtype 的附加約束的配置,例如量化值範圍、比例值範圍和固定量化引數,用於 DTypeConfig

ObservationType

一個列舉,表示運算子/運算子模式應如何被觀察的各種方式。

torch.ao.quantization.fx.custom_config#

該模組包含一些 CustomConfig 類,它們同時用於 eager 模式和 FX 圖模式量化。

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(例如。

torch.ao.quantization.pt2e.lowering#

lower_pt2e_quantized_to_x86

將 PT2E 量化的模型降低到 x86 後端。

PT2 匯出 (pt2e) 數值偵錯程式#

generate_numeric_debug_handle

為給定 ExportedProgram 的圖模組中的所有節點(如 conv2d、squeeze、conv1d 等)附加 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

基於執行的 min 和 max 值計算量化引數的觀察器模組。

MovingAverageMinMaxObserver

基於 min 和 max 值的移動平均值計算量化引數的觀察器模組。

PerChannelMinMaxObserver

用於基於執行時的逐通道最小/最大值計算量化引數的觀察者模組。

MovingAveragePerChannelMinMaxObserver

用於基於執行時的逐通道最小/最大值計算量化引數的觀察者模組。

HistogramObserver

該模組記錄張量值的執行直方圖以及 min/max 值。

PlaceholderObserver

一個不執行任何操作的觀察器,僅將其配置傳遞給量化模組的 .from_float()

RecordingObserver

該模組主要用於除錯,並記錄執行時張量值。

NoopObserver

一個不執行任何操作的觀察器,僅將其配置傳遞給量化模組的 .from_float()

get_observer_state_dict

返回對應於觀察器統計資訊的 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

預設逐通道權重觀察器,通常用於支援逐通道權重量化的後端,例如 fbgemm

default_dynamic_quant_observer

動態量化的預設觀察器。

default_float_qparams_observer

浮點零點的預設觀察器。

AffineQuantizedObserverBase

仿射量化的觀察器模組(pytorch/ao)。

Granularity

表示量化粒度的基類。

MappingType

浮點數如何對映到整數

PerAxis

表示量化中的逐軸粒度。

PerBlock

表示量化中的逐塊粒度。

PerGroup

表示量化中的逐通道組粒度。

PerRow

表示量化中的逐行粒度。

PerTensor

表示量化中的逐張量粒度。

PerToken

表示量化中的逐 token 粒度。

TorchAODType

PyTorch 核心中尚不存在的資料型別的佔位符。

ZeroPointDomain

列舉,指示零點是在整數域還是浮點域

get_block_size

根據輸入形狀和粒度型別獲取塊大小。

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

使用直方圖的啟用的虛假量化。

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

權重量化為 torch.float16 的動態 qconfig。

float16_static_qconfig

啟用和權重都量化為 torch.float16 的動態 qconfig。

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

一個由 Linear 和 ReLU 模組融合的 LinearReLU 模組,附加了用於權重的 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#

該模組實現了融合操作(如 conv + relu)的量化版本。沒有 BatchNorm 變體,因為它們通常在推理時摺疊到卷積中。

BNReLU2d

BNReLU2d 模組是 BatchNorm2d 和 ReLU 的融合模組。

BNReLU3d

BNReLU3d 模組是 BatchNorm3d 和 ReLU 的融合模組。

ConvReLU1d

ConvReLU1d 模組是 Conv1d 和 ReLU 的融合模組。

ConvReLU2d

ConvReLU2d 模組是 Conv2d 和 ReLU 的融合模組。

ConvReLU3d

ConvReLU3d 模組是 Conv3d 和 ReLU 的融合模組。

LinearReLU

LinearReLU 模組由 Linear 和 ReLU 模組融合而成。

torch.ao.nn.intrinsic.quantized.dynamic#

該模組實現了融合操作(如 linear + 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.Conv2dtorch.nn.ReLU)的量化版本。

ReLU6

逐元素應用函式。

Hardswish

這是 Hardswish 的量化版本。

ELU

這是 ELU 的量化等效版本。

LeakyReLU

這是 LeakyReLU 的量化等效版本。

Sigmoid

這是 Sigmoid 的量化等效版本。

BatchNorm2d

這是 BatchNorm2d 的量化版本。

BatchNorm3d

這是 BatchNorm3d 的量化版本。

Conv1d

對由多個量化輸入平面組成的量化輸入訊號應用一維卷積。

Conv2d

對由多個量化輸入平面組成的量化輸入訊號應用二維卷積。

Conv3d

對由多個量化輸入平面組成的量化輸入訊號應用三維卷積。

ConvTranspose1d

對由多個輸入平面組成的輸入影像應用 1D 轉置卷積運算子。

ConvTranspose2d

對由多個輸入平面組成的輸入影像應用 2D 轉置卷積運算子。

ConvTranspose3d

對由多個輸入平面組成的輸入影像應用 3D 轉置卷積運算元。

Embedding

一個量化的 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.conv2dtorch.nn.functional.relu)的量化版本。注意: torch.nn.functional.relu~torch.nn.functional.relu 支援量化輸入。

avg_pool2d

kH×kWkH \times kW 區域上的二維平均池化操作,步長為 sH×sWsH \times sW

avg_pool3d

kD timeskH×kWkD \ times kH \times kW 區域上的三維平均池化操作,步長為 sD×sH×sWsD \times sH \times sW

adaptive_avg_pool2d

對由多個量化輸入平面組成的量化輸入訊號應用二維自適應平均池化。

adaptive_avg_pool3d

對由多個量化輸入平面組成的量化輸入訊號應用三維自適應平均池化。

conv1d

對量化一維輸入(由多個輸入平面組成)應用一維卷積。

conv2d

對量化二維輸入(由多個輸入平面組成)應用二維卷積。

conv3d

對量化三維輸入(由多個輸入平面組成)應用三維卷積。

interpolate

將輸入下/上取樣到給定的 size 或給定的 scale_factor

linear

對傳入的量化資料應用線性變換:y=xAT+by = xA^T + b

max_pool1d

對量化輸入訊號(由多個量化輸入平面組成)應用一維最大池化。

max_pool2d

對量化輸入訊號(由多個量化輸入平面組成)應用二維最大池化。

celu

逐元素應用量化的 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 層(如 LSTM)的可量化版本。這些模組可以與自定義模組機制結合使用,透過向 prepare 和 convert 引數提供 custom_module_config 來實現。

LSTM

可量化的長短期記憶(LSTM)。

MultiheadAttention

torch.ao.nn.quantized.dynamic#

動態量化的 LinearLSTMLSTMCellGRUCellRNNCell

Linear

具有浮點張量作為輸入和輸出的動態量化線性模組。

LSTM

具有浮點張量作為輸入和輸出的動態量化 LSTM 模組。

GRU

對輸入序列應用多層門控迴圈單元(GRU)RNN。

RNNCell

一個具有 tanh 或 ReLU 非線性的 Elman RNN 單元。

LSTMCell

一個長短期記憶 (LSTM) 單元。

GRUCell

門控迴圈單元(GRU)單元。

量化資料型別和量化方案#

請注意,運算子實現目前僅支援 **conv** 和 **linear** 運算子權重的逐通道量化。此外,輸入資料以線性方式對映到量化資料,反之亦然,如下所示:

Quantization:Qout=clamp(xinput/s+z,Qmin,Qmax)Dequantization:xout=(Qinputz)s\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}

其中 :math:clampclamp() 相同,而比例 ss 和零點 zz 的計算方法如 MinMaxObserver 中所述,具體為:

if Symmetric:s=2max(xmin,xmax)/(QmaxQmin)z={0if dtype is qint8128otherwiseOtherwise:s=(xmaxxmin)/(QmaxQmin)z=Qminround(xmin/s)\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}

其中 :math:[x_\text{min}, x_\text{max}] 表示輸入資料的範圍,而 :math:Q_\text{min} 和 :math:Q_\text{max} 分別是量化資料型別的最小值和最大值。

請注意,:math:s 和 :math:z 的選擇意味著,只要零點在輸入資料範圍內或使用對稱量化時,零點都不會產生量化誤差。

可以透過 自定義 運算子 機制 <https://pytorch.com.tw/tutorials/advanced/torch_script_custom_ops.html>_ 實現其他資料型別和量化方案。

  • torch.qscheme — 用於描述張量量化方案的型別。支援的型別:

    • torch.per_tensor_affine — 逐張量,非對稱。

    • torch.per_channel_affine — 逐通道,非對稱。

    • torch.per_tensor_symmetric — 逐張量,對稱。

    • torch.per_channel_symmetric — 逐通道,對稱。

  • torch.dtype — 用於描述資料的型別。支援的型別:

    • torch.quint8 — 8 位無符號整數。

    • torch.qint8 — 8 位有符號整數。

    • torch.qint32 — 32 位有符號整數。

QAT 模組。

該軟體包正在被棄用。請使用 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 下的相應檔案中,同時在此處新增匯入語句。