megengine.quantization package

megengine.quantization.fake_quant

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

基类:megengine.quantization.fake_quant._FakeQuantize

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

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

基类: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()[源代码]
normal_foward(inp, q_dict=None)[源代码]
class megengine.quantization.fake_quant.TQT_Function(lowerbound, upperbound)[源代码]

基类:megengine.core.tensor.function.Function

backward(grad_inp_flq)[源代码]

计算前向函数的梯度。必须在子类中被重写。

参数

output_grads – 返回 forward() 输出的梯度

注解

当一些输出张量和损失函数不相关时, output_grads 中对应的值应为 None

注解

此方法返回一个元组,其中包含的所有输入的梯度。梯度的顺序和 forward() 中的 inputs 参数顺序相同。如果仅有单个输入,则返回单个 Tensor 。若要停止某些梯度的传播,对应的返回值应设为 None

forward(inp, scale)[源代码]

inputs 应用操作并返回结果,必须在所有子类中被重写。

参数

input – 输入张量。

返回

张量的元组或单个张量。

注解

此方法返回一个张量元组或表示函数输出的单个张量。

save_for_backward(*tensors)[源代码]

保存需要被计算导数的张量。这个方法应该只会在 forward() 中调用一次,之后的调用将会覆盖之前保存的值。

保存的张量可以被 saved_tensors 参数访问。

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)[源代码]

基类: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)[源代码]

基类: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)[源代码]

基类:megengine.quantization.observer.Observer

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

基类: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

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.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.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.utils

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

基类:enum.Enum

量化模式枚举类。

ASYMMERTIC = 2
SYMMERTIC = 1
TQT = 3
class megengine.quantization.utils.Round(*args, **kwargs)[源代码]

基类:megengine.core.tensor.function.Function

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

backward(output_grads)[源代码]

计算前向函数的梯度。必须在子类中被重写。

参数

output_grads – 返回 forward() 输出的梯度

注解

当一些输出张量和损失函数不相关时, output_grads 中对应的值应为 None

注解

此方法返回一个元组,其中包含的所有输入的梯度。梯度的顺序和 forward() 中的 inputs 参数顺序相同。如果仅有单个输入,则返回单个 Tensor 。若要停止某些梯度的传播,对应的返回值应设为 None

forward(x)[源代码]

inputs 应用操作并返回结果,必须在所有子类中被重写。

参数

input – 输入张量。

返回

张量的元组或单个张量。

注解

此方法返回一个张量元组或表示函数输出的单个张量。

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)[源代码]