diff --git a/doc/fluid/design/quantization/channel.png b/doc/fluid/design/quantization/channel.png new file mode 100644 index 0000000000000000000000000000000000000000..b68b5bb9b7e6c450ffbaa1add71bb91a8bc0ecf0 Binary files /dev/null and b/doc/fluid/design/quantization/channel.png differ diff --git a/doc/fluid/design/quantization/dequant_formula.png b/doc/fluid/design/quantization/dequant_formula.png new file mode 100644 index 0000000000000000000000000000000000000000..117770e29cdee78a4c40fee3736e1c49e0e74428 Binary files /dev/null and b/doc/fluid/design/quantization/dequant_formula.png differ diff --git a/doc/fluid/design/quantization/dynamic.png b/doc/fluid/design/quantization/dynamic.png new file mode 100644 index 0000000000000000000000000000000000000000..ee3c89043b29f4fde895160584c7d0106788a945 Binary files /dev/null and b/doc/fluid/design/quantization/dynamic.png differ diff --git a/doc/fluid/design/quantization/static.png b/doc/fluid/design/quantization/static.png new file mode 100644 index 0000000000000000000000000000000000000000..8d2faaf6e727944824aaa5e1363c0b596e58aeb0 Binary files /dev/null and b/doc/fluid/design/quantization/static.png differ diff --git a/doc/fluid/design/quantization/training_quantization_model_format.md b/doc/fluid/design/quantization/training_quantization_model_format.md new file mode 100644 index 0000000000000000000000000000000000000000..aba610eb40d1b1cdfa3472e0a737ec277319073c --- /dev/null +++ b/doc/fluid/design/quantization/training_quantization_model_format.md @@ -0,0 +1,143 @@ +# 量化训练模型格式说明 + +PaddlePaddle框架主要支持动态量化和静态量化两种量化训练模式。其中,动态量化会在每次推断过程中动态计算量化比例系数的值,而静态量化则对不同的输入采用相同的量化比例系数值。 对于权重而言,在训练过程中采用动态量化模式。换句话说,在每次迭代过程中量化比例系数均会被重新计算得到直至训练过程结束。 对于激活而言,可以选择动态量化模式也可以选择静态量化模式。若选择使用静态量化模式,则量化比例系数会在训练过程中被评估求得,且在推断过程中被使用(不同的输入均保持不变)。除此之外,卷积权重的动态量化亦包括两种形式:1)Tensor-wise量化,即直接求取整个权重Tensor的量化scale值(单一值);2)Channel-wise量化,即对权重Tensor按照channel维度进行分片,然后求取每个通道Tensor的scale值。 + +## 1. Tensor-wise量化 +### 1.1 动态量化 + +动态量化主要通过`fake_quantize_abs_max`op实现,该op对输入tensor进行量化并输出值域在-127~+127范围内的量化tensor。`fake_quantize_abs_max`op在对输入tensor进行量化时使用的量化scale是动态计算出来的,即取输入tensor元素的绝对值最大值。动态计算出的量化scale会作为反量化op的一个输入,用于求取反量化tensor。下面是对`fake_quantize_abs_max`op的整体描述: + +``` +fake_quantize_abs_max { + inputs { + X(Tensor): 激活tensor或权重tensor + } + + outputs { + Out(Tensor): 已量化tensor + OutScale(Tensor): 动态计算得到的量化scale,其元素个数为1(tensor-wise量化) + } + + attrs { + bit_length(int): 量化bit数,如8-bit + } +} +``` + +### 1.2 静态量化 + +与动态量化不同,静态量化的量化scale是在量化训练时通过**窗口滑动平均**或者**窗口绝对值最大值**等方法计算求得的。静态量化主要通过`fake_quantize_moving_average_abs_max`op或者`fake_quantize_range_abs_max`op实现,它们利用输入的量化scale将输入tensor量化到-127~127值域范围内。`fake_quantize_moving_average_abs_max`op和`fake_quantize_range_abs_max`op的输入和输出格式都是一样的,不同点在于op内部计算量化scale时使用的策略不同。`fake_quantize_moving_average_abs_max`op使用一个窗口内绝对值最大值的滑动平均值作为量化sacle,而`fake_quantize_range_abs_max`op使用一个窗口内绝对值最大值的最大值作为量化sacle。下面以`fake_quantize_moving_average_abs_max`op为例,对其进行整体描述: + +``` +fake_quantize_moving_average_abs_max { + inputs { + X(Tensor): 一般为激活tensor + InScale(Tensor): 量化训练中计算求得的scale + } + + outputs { + Out(Tensor): 已量化tensor + OutScale(Tensor): 量化训练中计算求得的scale,用于继续传递到反量化op + } + + attrs { + is_test(bool): 指明是量化训练过程还是预测推断过程 + bit_length(int): 量化bit数,如8-bit + moving_rate(float): 滑动平均衰减系数 + } +} +``` + +### 1.3 反量化 + +无论是静态量化还是动态量化,在量化计算完成后都需要进行反量化操作,该操作即是通过`fake_dequantize_abs_max`op实现的。具体来说,`fake_quantize_abs_max`op负责将fp32数值映射到int8值域(-127~127),而`fake_dequantize_abs_max` op是将int8数值映射到fp32值域。 + +
+
+
+
+图1: 动态量化,其中卷积权重已预先进行量化
+
+
+图2: 静态量化,其中卷积权重已预先进行量化
+
+
+图3: 分channel量化,其中卷积权重已预先进行分channel量化
+