megengine.quantization 模块

megengine.quantization.fake_quant

class megengine.quantization.fake_quant.FakeQuantize(dtype, narrow_range=False, enable=True, **kwargs)[源代码]

基类:megengine.quantization.fake_quant._FakeQuantize

可根据observer的scale和zero_point参数来进行量化(Quantization)和反量化(Dequantization)的模块。

fake_quant_forward(inp, q_dict=None)[源代码]
class megengine.quantization.fake_quant.TQT(q_dict, dtype, narrow_range=False, enable=True, **kwargs)[源代码]

基类:megengine.quantization.fake_quant._FakeQuantize

TQT: https://arxiv.org/abs/1903.08066 Trained Quantization Thresholds for Accurate and Efficient Fixed-Point Inference of Deep Neural Networks

fake_quant_forward(inp, q_dict=None)[源代码]
get_dtype()[源代码]
get_qparams()[源代码]

megengine.quantization.internal_fake_quant

megengine.quantization.observer

class megengine.quantization.observer.ExponentialMovingAverageObserver(momentum=0.9, mode=<QuantMode.SYMMERTIC: 1>, eps=1e-05, dtype='qint8', narrow_range=False, **kwargs)[源代码]

基类:megengine.quantization.observer.MinMaxObserver

forward(x_orig)[源代码]
set_momentum(momentum)[源代码]
class megengine.quantization.observer.HistogramObserver(bins=2048, upsample_rate=128, mode=<QuantMode.SYMMERTIC: 1>, eps=1e-05, dtype='qint8', narrow_range=False, **kwargs)[源代码]

基类:megengine.quantization.observer.MinMaxObserver

forward(x_orig)[源代码]
get_qparams()[源代码]
sideeffect_forward(x_orig)[源代码]
class megengine.quantization.observer.MinMaxObserver(mode=<QuantMode.SYMMERTIC: 1>, eps=1e-05, dtype='qint8', narrow_range=False, **kwargs)[源代码]

基类:megengine.quantization.observer.Observer

forward(x_orig)[源代码]
get_qparams()[源代码]
class megengine.quantization.observer.Observer(dtype, narrow_range=False, **kwargs)[源代码]

基类:megengine.module.module.Module

Observer模块的基类。

参数
  • dtype (str) – 字符串,表明按何种dtype来收集scale和zero_point。

  • narrow_range (bool) – qmin 的绝对值是否与 qmax 相同,或者比 qmax 的绝对值大1。通常对于权重而言是True,对于激活而言是False。

disable()[源代码]
enable()[源代码]
abstract forward(x)[源代码]
get_dtype()[源代码]
abstract get_qparams(**kwargs)[源代码]
train(mode=True, recursive=True)[源代码]

将该模块中的所有模块(包括它自身)的训练模式设置为 mode 。 可便捷地将这些模块的 training 属性设置为 mode ,但仅对某些模块有效(例如 BatchNorm2d, Dropout, Observer)

参数
  • mode (bool) – 为模块设置的训练模式。

  • recursive (bool) – 是否要递归调用子模块的 train()

返回类型

None

class megengine.quantization.observer.PassiveObserver(q_dict, dtype, narrow_range=False, **kwargs)[源代码]

基类:megengine.quantization.observer.Observer

这个类可以被直接设置 scale

forward(x)[源代码]

直接返回输入,不需要统计scale。

get_qparams()[源代码]
property scale
class megengine.quantization.observer.SyncExponentialMovingAverageObserver(momentum=0.9, mode=<QuantMode.SYMMERTIC: 1>, eps=1e-05, dtype='qint8', narrow_range=False, **kwargs)[源代码]

基类:megengine.quantization.observer.ExponentialMovingAverageObserver

forward(x_orig)[源代码]
class megengine.quantization.observer.SyncMinMaxObserver(mode=<QuantMode.SYMMERTIC: 1>, eps=1e-05, dtype='qint8', narrow_range=False, **kwargs)[源代码]

基类:megengine.quantization.observer.MinMaxObserver

forward(x_orig)[源代码]

megengine.quantization.qconfig

class megengine.quantization.qconfig.QConfig(weight_observer, act_observer, weight_fake_quant, act_fake_quant)[源代码]

基类:object

一个配置类,用来指示如何对 QATModuleactivation``weight``进行量化。详细用法参见 set_qconfig()

参数
  • weight_observer – 创建 Observer 实例的接口,指定获得权重(weight)的scale和zero_point的方法。

  • act_observer – 类似 weight_observer ,但该observer针对激活。

  • weight_fake_quant – 创建 FakeQuantize 实例来指明如何做 fake_quant 计算的接口。

  • act_observer – 类似 weight_fake_quant ,但针对激活。

例子:

# Default EMA QConfig for QAT.
ema_fakequant_qconfig = QConfig(
    weight_observer=partial(MinMaxObserver, dtype="qint8", narrow_range=True),
    act_observer=partial(ExponentialMovingAverageObserver, dtype="qint8", narrow_range=False),
    weight_fake_quant=partial(FakeQuantize, dtype="qint8", narrow_range=True),
    act_fake_quant=partial(FakeQuantize, dtype="qint8", narrow_range=False),
)

每个参数都是一个 class 而不是一个实例。 我们建议使用 functools.partial 来添加 class 的初始化参数,这样就不需要在 set_qconfig() 中提供参数。

通常我们将权重相关参数的 narrow_range 设置为 True ,并将与激活相关参数的该值设置为 False 。对于乘法和加法的结果,如 a * b + c * d ,如果四个变量的值都是 qint8 类型的 -128,那么结果会变成 2^15 然后溢出。权重涉及的计算方式通常是这种形式,所以需要将下界增加1。

megengine.quantization.quantize

megengine.quantization.quantize.apply_easy_quant(module, data, start=0.8, stop=1.2, num=40)[源代码]

Implementation of EasyQuant: https://arxiv.org/pdf/2006.16669. Search for optimal scales.

参数
  • module – 根模块。

  • data – 用于搜索scale的输入。

  • start – 搜索下界。

  • stop – 搜索上界。

  • num – 搜索区间的采样数量。

megengine.quantization.quantize.disable_fake_quant(module)[源代码]

使用 apply() 在QATModule中递归地禁用 module fake quantization。

参数

module (Module) – 根模块,以此开始递归地禁用 fake quantization。

megengine.quantization.quantize.disable_observer(module)[源代码]

使用 apply() 在QATModule中递归地禁用 module observer 。

参数

module (Module) – 根模块,以此开始递归地禁用 observer。

megengine.quantization.quantize.enable_fake_quant(module)[源代码]

使用 apply() 在QATModule中递归地启用 module fake quantization 。

参数

module (Module) – 根模块,以此开始递归地启用 fake quantization。

megengine.quantization.quantize.enable_observer(module)[源代码]

使用 apply() 在QATModule中递归地启用 module observer 。

参数

module (Module) – 根模块,以此开始递归地启用observer。

megengine.quantization.quantize.hook_qat_module(module, func)[源代码]

为所有的 QATModule 注册钩子。

megengine.quantization.quantize.is_qat(mod)[源代码]
megengine.quantization.quantize.propagate_qconfig(module, qconfig)[源代码]

使用 apply() 递归地设置 module 的qconfig。

参数
  • module (QATModule) – 根模块,以此开始递归地进行遍历。

  • qconfig (QConfig) – a instance of QConfig to be set as submodules’ qconfig.

megengine.quantization.quantize.quantize(module, inplace=True, mapping=None)[源代码]

使用 apply()QATModule 递归地转换为 QuantizedModule

参数
  • module (Module) – 根模块,以此开始递归地进行转换。

  • inplace (bool) – 是否对子模块进行原地转换。

  • mapping (Optional[dict]) – 一个用来指示如何把 QATModule 转换为 QuantizedModule 的字典。将会和内部的默认的转换映射字典合并。

megengine.quantization.quantize.quantize_qat(module, inplace=True, qconfig=<megengine.quantization.qconfig.QConfig object>, mapping=None)[源代码]

通过使用 apply() 并设置相应的qconfig,递归地将float Module 转换为 QATModule

参数
  • module (Module) – 根模块,以此开始递归地进行转换。

  • inplace (bool) – 是否对子模块进行原地转换。

  • qconfig (QConfig) – an instance of QConfig to be set as submodules’ qconfig. default is ema_fakequant_qconfig.

  • mapping (Optional[dict]) – 一个用来指示如何把 Module 转换为 QATModule 的字典。将会和内部的默认的转换映射字典合并。

megengine.quantization.quantize.reset_qconfig(module, qconfig, inplace=True)[源代码]

根据 qconfig 来替换模块中所有的 _FakeQuantizeObserver

参数
  • module (Module) – 根模块,以此开始递归地重置 qconfig

  • qconfig (QConfig) – an instance of QConfig to be set as submodules’ qconfig.

  • inplace (bool) – 是否对子模块进行原地重置。

megengine.quantization.utils

class megengine.quantization.utils.QuantMode(value)[源代码]

基类:enum.Enum

量化模式枚举类。

ASYMMERTIC = 2
SYMMERTIC = 1
class megengine.quantization.utils.Round[源代码]

基类:megengine.core.autodiff.grad.Function

这个四舍五入函数没有导数,不能用于量化感知训练。我们用 Function 和 STE(Straight-Through Estimator) 来实现反向传播。

backward(output_grads)[源代码]
forward(x)[源代码]
megengine.quantization.utils.apply()
megengine.quantization.utils.fake_quant_bias(bias, inp, w_qat)[源代码]

根据输入张量和权值张量的特殊的数值范围,对偏置张量进行假量化,并把量化类型设置为qint32。

参数
  • bias (Tensor) – 需要被假量化的偏置张量。

  • inp (Tensor) – 包含了量化参数的输入张量。

  • qmax – 包含了量化参数的权值张量。

警告

现在只对对称的量化方法有效。

返回类型

Tensor

megengine.quantization.utils.fake_quant_tensor(inp, qmin, qmax, q_dict)[源代码]

inp 张量做假量化。

参数
  • inp (Tensor) – 需要被假量化的输入张量。

  • qmin (int) – 限制的整数最小值。

  • qmax (int) – 限制的整数最大值。

  • q_dict (Dict) – 量化参数字典。

返回类型

Tensor

megengine.quantization.utils.get_qparam_dict(mode)[源代码]

根据模式返回一个量化参数字典。

megengine.quantization.utils.register_method_to_class(cls)[源代码]
megengine.quantization.utils.tqt_forward(qmin, qmax, inp, scale)[源代码]