# oneflow.nn.MovingAverageMinMaxObserver¶

class oneflow.nn.MovingAverageMinMaxObserver(stop_update_after_iters: int = 1, quantization_formula: str = 'google', quantization_bit: int = 8, quantization_scheme: str = 'symmetric', momentum: float = 0.95)

Compute the quantization parameters based on the moving average of the input tensor’s min and max values.

First compute the moving_max and moving_min value of input tensor:

if quantization_scheme == “symmetric”:

\begin{align}\begin{aligned}& moving\_max = moving\_max * momentum + |max(input)| * (1 - momentum)\\& moving\_min = moving\_max\end{aligned}\end{align}

elif quantization_scheme == “affine”:

\begin{align}\begin{aligned}& moving\_max = moving\_max * momentum + max(input) * (1 - momentum)\\& moving\_min = moving\_min * momentum + min(input) * (1 - momentum)\end{aligned}\end{align}

The moving average of min and max values are initialized as the first batch of input Blob’s min and max.

Then compute the scale and zero_point with the following equations:

if quantization_scheme == “symmetric”:

\begin{align}\begin{aligned}& denom = 2^{quantization\_to\_bit - 1} - 1\\& scale = moving\_max / denom\\& zero\_point = 0\end{aligned}\end{align}

elif quantization_scheme == “affine”:

\begin{align}\begin{aligned}& denom = 2^{quantization\_to\_bit} - 1\\& scale = (moving\_max - moving\_min) / denom\\& zero\_point = -moving\_min / scale\end{aligned}\end{align}

Note

current_train_step can be directly assigned to an optimizer(eg.SGD) step.

Parameters
• input (oneflow.Tensor) – the input value(s), in oneflow.float32.

• current_train_step_tensor (oneflow.Tensor) – record train step for quantionzation aware training.

• stop_update_after_iters (int) – stop record train step for quantionzation aware training when train iter greater than stop_update_after_iters.

• quantization_formula (str) – Support “google” or “cambricon”.

• quantization_bit (int) – Quantize input to uintX / intX, X can be in range [2, 8]. Defaults to 8.

• quantization_scheme (str) – “symmetric” or “affine”, quantize to signed / unsigned integer. Defaults to “symmetric”.

• momentum (float) – Smoothing parameter for exponential moving average operation. Defaults to 0.95.

Returns

The scale and zero_point of input tensor.

Return type

Tuple[oneflow.Tensor, oneflow.Tensor]

For example:

>>> import numpy as np
>>> import oneflow as flow

>>> weight = (np.random.random((2, 3, 4, 5)) - 0.5).astype(np.float32)

>>> input_tensor = flow.tensor(
...    weight, dtype=flow.float32
... )

>>> current_train_step_tensor = flow.tensor(
...   np.zeros((1,)).astype(np.float32),
...    dtype=flow.int64,
... )

>>> momentum = 0.95
>>> quantization_bit = 8
>>> quantization_scheme = "symmetric"

>>> moving_average_min_max_observer = flow.nn.MovingAverageMinMaxObserver(stop_update_after_iters=1,
...                                                                       quantization_formula=quantization_formula, quantization_bit=quantization_bit,
...                                                                       quantization_scheme=quantization_scheme, momentum=momentum,
...                                                                       )

>>> (scale, zero_point) = moving_average_min_max_observer(
...    input_tensor,
...    current_train_step_tensor,
... )

__init__(stop_update_after_iters: int = 1, quantization_formula: str = 'google', quantization_bit: int = 8, quantization_scheme: str = 'symmetric', momentum: float = 0.95)None

Calls super().__setattr__(‘a’, a) instead of the typical self.a = a to avoid Module.__setattr__ overhead. Module’s __setattr__ has special handling for parameters, submodules, and buffers but simply calls into super().__setattr__ for all other attributes.

Methods

 __call__(*args, **kwargs) Call self as a function. __delattr__(name) Implement delattr(self, name). __dir__() Default dir() implementation. __eq__(value, /) Return self==value. __format__(format_spec, /) Default object formatter. __ge__(value, /) Return self>=value. __getattr__(name) __getattribute__(name, /) Return getattr(self, name). __getstate__() __gt__(value, /) Return self>value. __hash__() Return hash(self). __init__([stop_update_after_iters, …]) Calls super().__setattr__(‘a’, a) instead of the typical self.a = a to avoid Module.__setattr__ overhead. __init_subclass__ This method is called when a class is subclassed. __le__(value, /) Return self<=value. __lt__(value, /) Return self

Attributes

 _grad_t alias of Union[Tuple[oneflow.Tensor, …], oneflow.Tensor]