Quantized layers module¶
This module provides drop-in quantized layer replacements for PyTorch models to support both floating-point and integer quantization-aware training (QAT).
All classes follow the same API as their original torch.nn counterparts.
When a Pychop quantizer (with STE) is provided, weights and activations are
fake-quantized during the forward pass while gradients flow through unchanged
(Straight-Through Estimator).
Three STE-enabled quantizers are provided:
ChopSTE— floating-point (exponent + significand)ChopfSTE— fixed-point (integer + fractional bits)ChopiSTE— integer (uniform or symmetric)
STE quantizers (core)¶
- class pychop.layers.ChopSTE(*args, **kwargs)[source]¶
Bases:
Create a ChopSTE instance for the current backend.
Raises¶
- ImportError
If the current backend’s dependencies are not installed.
Utility Functions¶
- pychop.layers.post_quantization(model, chop, eval_mode: bool = True, verbose: bool = False)[source]¶
Post-training quantization (PTQ) wrapper.
Dispatches to backend-specific implementation.
Parameters¶
- modeltorch.nn.Module or flax.linen.Module
Neural network model.
- chopChop, Chopf, or Chopi
Quantizer instance.
- eval_modebool, default=True
Whether to set model to evaluation mode (PyTorch only).
- verbosebool, default=False
Whether to print quantization details.
Returns¶
- model
Quantized model.
Raises¶
- ImportError
If the current backend’s dependencies are not installed.
Floating-point / Fixed-point quantized layers¶
These layers use ChopSTE (or Chop) for floating-point QAT.
- class pychop.layers.QuantizedLinear(*args, **kwargs)¶
Bases:
Create a QuantizedLinear for the current backend.
- class pychop.layers.QuantizedConv1d(*args, **kwargs)¶
Create a QuantizedConv1d for the current backend.
- class pychop.layers.QuantizedConv2d(*args, **kwargs)¶
Create a QuantizedConv2d for the current backend.
- class pychop.layers.QuantizedConv3d(*args, **kwargs)¶
Create a QuantizedConv3d for the current backend.
- class pychop.layers.QuantizedConvTranspose1d(*args, **kwargs)¶
Create a QuantizedConvTranspose1d for the current backend.
- class pychop.layers.QuantizedConvTranspose2d(*args, **kwargs)¶
Create a QuantizedConvTranspose2d for the current backend.
- class pychop.layers.QuantizedConvTranspose3d(*args, **kwargs)¶
Create a QuantizedConvTranspose3d for the current backend.
- class pychop.layers.QuantizedRNN(*args, **kwargs)¶
Create a QuantizedRNN for the current backend.
- class pychop.layers.QuantizedLSTM(*args, **kwargs)¶
Create a QuantizedLSTM for the current backend.
- class pychop.layers.QuantizedGRU(*args, **kwargs)¶
Create a QuantizedGRU for the current backend.
- class pychop.layers.QuantizedMaxPool1d(*args, **kwargs)¶
Create a QuantizedMaxPool1d for the current backend.
- class pychop.layers.QuantizedMaxPool2d(*args, **kwargs)¶
Create a QuantizedMaxPool2d for the current backend.
- class pychop.layers.QuantizedMaxPool3d(*args, **kwargs)¶
Create a QuantizedMaxPool3d for the current backend.
- class pychop.layers.QuantizedAvgPool1d(*args, **kwargs)¶
Create a QuantizedAvgPool1d for the current backend.
- class pychop.layers.QuantizedAvgPool2d(*args, **kwargs)¶
Create a QuantizedAvgPool2d for the current backend.
- class pychop.layers.QuantizedAvgPool3d(*args, **kwargs)¶
Create a QuantizedAvgPool3d for the current backend.
- class pychop.layers.QuantizedAdaptiveAvgPool2d(*args, **kwargs)¶
Create a QuantizedAdaptiveAvgPool2d for the current backend.
- class pychop.layers.QuantizedBatchNorm1d(*args, **kwargs)¶
Create a QuantizedBatchNorm1d for the current backend.
- class pychop.layers.QuantizedBatchNorm2d(*args, **kwargs)¶
Create a QuantizedBatchNorm2d for the current backend.
- class pychop.layers.QuantizedBatchNorm3d(*args, **kwargs)¶
Create a QuantizedBatchNorm3d for the current backend.
- class pychop.layers.QuantizedLayerNorm(*args, **kwargs)¶
Create a QuantizedLayerNorm for the current backend.
- class pychop.layers.QuantizedInstanceNorm1d(*args, **kwargs)¶
Create a QuantizedInstanceNorm1d for the current backend.
- class pychop.layers.QuantizedInstanceNorm2d(*args, **kwargs)¶
Create a QuantizedInstanceNorm2d for the current backend.
- class pychop.layers.QuantizedInstanceNorm3d(*args, **kwargs)¶
Create a QuantizedInstanceNorm3d for the current backend.
- class pychop.layers.QuantizedGroupNorm(*args, **kwargs)¶
Create a QuantizedGroupNorm for the current backend.
- class pychop.layers.QuantizedMultiheadAttention(*args, **kwargs)¶
Create a QuantizedMultiheadAttention for the current backend.
- class pychop.layers.QuantizedEmbedding(*args, **kwargs)¶
Create a QuantizedEmbedding for the current backend.
Convenience aliases
- pychop.layers.QuantizedAttention = <function _create_layer_factory.<locals>.factory>¶
Create a QuantizedMultiheadAttention for the current backend.
- pychop.layers.QuantizedAvgPool = <function _create_layer_factory.<locals>.factory>¶
Create a QuantizedAvgPool2d for the current backend.
Activation & Regularization Layers (Floating-Point)¶
- class pychop.layers.QuantizedReLU(*args, **kwargs)¶
Create a QuantizedReLU for the current backend.
- class pychop.layers.QuantizedLeakyReLU(*args, **kwargs)¶
Create a QuantizedLeakyReLU for the current backend.
- class pychop.layers.QuantizedSigmoid(*args, **kwargs)¶
Create a QuantizedSigmoid for the current backend.
- class pychop.layers.QuantizedTanh(*args, **kwargs)¶
Create a QuantizedTanh for the current backend.
- class pychop.layers.QuantizedGELU(*args, **kwargs)¶
Create a QuantizedGELU for the current backend.
- class pychop.layers.QuantizedELU(*args, **kwargs)¶
Create a QuantizedELU for the current backend.
- class pychop.layers.QuantizedPReLU(*args, **kwargs)¶
Create a QuantizedPReLU for the current backend.
- class pychop.layers.QuantizedSoftmax(*args, **kwargs)¶
Create a QuantizedSoftmax for the current backend.
- class pychop.layers.QuantizedDropout(*args, **kwargs)¶
Create a QuantizedDropout for the current backend.
Integer quantized layers¶
These layers use ChopiSTE for integer QAT (uniform or symmetric).
- class pychop.layers.IQuantizedLinear(*args, **kwargs)¶
Create a IQuantizedLinear for the current backend.
- class pychop.layers.IQuantizedConv1d(*args, **kwargs)¶
Create a IQuantizedConv1d for the current backend.
- class pychop.layers.IQuantizedConv2d(*args, **kwargs)¶
Create a IQuantizedConv2d for the current backend.
- class pychop.layers.IQuantizedConv3d(*args, **kwargs)¶
Create a IQuantizedConv3d for the current backend.
- class pychop.layers.IQuantizedConvTranspose1d(*args, **kwargs)¶
Create a IQuantizedConvTranspose1d for the current backend.
- class pychop.layers.IQuantizedConvTranspose2d(*args, **kwargs)¶
Create a IQuantizedConvTranspose2d for the current backend.
- class pychop.layers.IQuantizedConvTranspose3d(*args, **kwargs)¶
Create a IQuantizedConvTranspose3d for the current backend.
- class pychop.layers.IQuantizedRNN(*args, **kwargs)¶
Create a IQuantizedRNN for the current backend.
- class pychop.layers.IQuantizedLSTM(*args, **kwargs)¶
Create a IQuantizedLSTM for the current backend.
- class pychop.layers.IQuantizedGRU(*args, **kwargs)¶
Create a IQuantizedGRU for the current backend.
- class pychop.layers.IQuantizedMaxPool1d(*args, **kwargs)¶
Create a IQuantizedMaxPool1d for the current backend.
- class pychop.layers.IQuantizedMaxPool2d(*args, **kwargs)¶
Create a IQuantizedMaxPool2d for the current backend.
- class pychop.layers.IQuantizedMaxPool3d(*args, **kwargs)¶
Create a IQuantizedMaxPool3d for the current backend.
- class pychop.layers.IQuantizedAvgPool1d(*args, **kwargs)¶
Create a IQuantizedAvgPool1d for the current backend.
- class pychop.layers.IQuantizedAvgPool2d(*args, **kwargs)¶
Create a IQuantizedAvgPool2d for the current backend.
- class pychop.layers.IQuantizedAvgPool3d(*args, **kwargs)¶
Create a IQuantizedAvgPool3d for the current backend.
- class pychop.layers.IQuantizedAdaptiveAvgPool1d(*args, **kwargs)¶
Create a IQuantizedAdaptiveAvgPool1d for the current backend.
- class pychop.layers.IQuantizedAdaptiveAvgPool2d(*args, **kwargs)¶
Create a IQuantizedAdaptiveAvgPool2d for the current backend.
- class pychop.layers.IQuantizedAdaptiveAvgPool3d(*args, **kwargs)¶
Create a IQuantizedAdaptiveAvgPool3d for the current backend.
- class pychop.layers.IQuantizedBatchNorm1d(*args, **kwargs)¶
Create a IQuantizedBatchNorm1d for the current backend.
- class pychop.layers.IQuantizedBatchNorm2d(*args, **kwargs)¶
Create a IQuantizedBatchNorm2d for the current backend.
- class pychop.layers.IQuantizedBatchNorm3d(*args, **kwargs)¶
Create a IQuantizedBatchNorm3d for the current backend.
- class pychop.layers.IQuantizedLayerNorm(*args, **kwargs)¶
Create a IQuantizedLayerNorm for the current backend.
- class pychop.layers.IQuantizedInstanceNorm1d(*args, **kwargs)¶
Create a IQuantizedInstanceNorm1d for the current backend.
- class pychop.layers.IQuantizedInstanceNorm2d(*args, **kwargs)¶
Create a IQuantizedInstanceNorm2d for the current backend.
- class pychop.layers.IQuantizedInstanceNorm3d(*args, **kwargs)¶
Create a IQuantizedInstanceNorm3d for the current backend.
- class pychop.layers.IQuantizedGroupNorm(*args, **kwargs)¶
Create a IQuantizedGroupNorm for the current backend.
- class pychop.layers.IQuantizedMultiheadAttention(*args, **kwargs)¶
Create a IQuantizedMultiheadAttention for the current backend.
- class pychop.layers.IQuantizedEmbedding(*args, **kwargs)¶
Create a IQuantizedEmbedding for the current backend.
Integer activation & regularization layers¶
- class pychop.layers.IQuantizedReLU(*args, **kwargs)¶
Create a IQuantizedReLU for the current backend.
- class pychop.layers.IQuantizedLeakyReLU(*args, **kwargs)¶
Create a IQuantizedLeakyReLU for the current backend.
- class pychop.layers.IQuantizedSigmoid(*args, **kwargs)¶
Create a IQuantizedSigmoid for the current backend.
- class pychop.layers.IQuantizedTanh(*args, **kwargs)¶
Create a IQuantizedTanh for the current backend.
- class pychop.layers.IQuantizedGELU(*args, **kwargs)¶
Create a IQuantizedGELU for the current backend.
- class pychop.layers.IQuantizedELU(*args, **kwargs)¶
Create a IQuantizedELU for the current backend.
- class pychop.layers.IQuantizedSiLU(*args, **kwargs)¶
Create a IQuantizedSiLU for the current backend.
- class pychop.layers.IQuantizedPReLU(*args, **kwargs)¶
Create a IQuantizedPReLU for the current backend.
- class pychop.layers.IQuantizedSoftmax(*args, **kwargs)¶
Create a IQuantizedSoftmax for the current backend.
- class pychop.layers.IQuantizedDropout(*args, **kwargs)¶
Create a IQuantizedDropout for the current backend.
Convenience aliases
- pychop.layers.IQuantizedAttention = <function _create_layer_factory.<locals>.factory>¶
Create a IQuantizedMultiheadAttention for the current backend.
- pychop.layers.IQuantizedAvgPool = <function _create_layer_factory.<locals>.factory>¶
Create a IQuantizedAvgPool2d for the current backend.
Usage Example¶
from pychop.layers import (
ChopSTE, ChopfSTE, ChopiSTE,
QuantizedConv2d, QuantizedReLU,
IQuantizedLinear, IQuantizedReLU
)
# Floating-point QAT
chop_fp = ChopSTE(exp_bits=5, sig_bits=10, rmode=3)
# Fixed-point QAT
chop_fixed = ChopfSTE(ibits=8, fbits=8, rmode=1)
# Integer QAT
chop_int = ChopiSTE(bits=8, symmetric=True)
class MyQuantizedNet(nn.Module):
def __init__(self):
super().__init__()
self.conv1 = QuantizedConv2d(3, 64, 3, chop=chop_fp)
self.relu = QuantizedReLU(chop=chop_fp)
self.fc = IQuantizedLinear(512, 10, chop=chop_int)
def forward(self, x):
x = self.relu(self.conv1(x))
x = x.view(x.size(0), -1)
return self.fc(x)
Post-training quantization (PTQ)¶
from pychop.layers import post_quantization, ChopSTE
chop = ChopSTE(exp_bits=8, sig_bits=23) # or any other chop
quantized_model = post_quantization(model, chop, eval_mode=True, verbose=True)