MCPcopy
hub / github.com/OpenPPL/ppq / TensorQuantizationConfig

Class TensorQuantizationConfig

ppq/core/quant.py:367–896  ·  view source on GitHub ↗

## TensorQuantizationConfig(Tensor 量化控制结构体) PPQ 使用量化控制结构体描述量化行为,该结构体被定义在 ppq.core.quant 中。截止 PPQ 0.6.6 版本,该结构体由 15 项不同的属性组成。我们将向你介绍这一核心数据结构体的设计构想。 ### 1. QuantizationPolicy 量化策略 在 TensorQuantizationConfig 当中,首当其冲地内容是 TQC.policy,这是一个 QuantizationPolicy 对象。 policy 属性用于描述量化的规则,一个完整的量化策略是由多个量化属性(Quant

Source from the content-addressed store, hash-verified

365
366
367class TensorQuantizationConfig(Serializable):
368 """
369## TensorQuantizationConfig(Tensor 量化控制结构体)
370PPQ 使用量化控制结构体描述量化行为,该结构体被定义在 ppq.core.quant 中。截止 PPQ 0.6.6 版本,该结构体由 15 项不同的属性组成。我们将向你介绍这一核心数据结构体的设计构想。
371
372### 1. QuantizationPolicy 量化策略
373在 TensorQuantizationConfig 当中,首当其冲地内容是 TQC.policy,这是一个 QuantizationPolicy 对象。
374policy 属性用于描述量化的规则,一个完整的量化策略是由多个量化属性(QuantizationProperty)组合完成的;在 PPQ 中目前我们支持 8 种不同的量化属性,你可以使用以下属性来组合形成自定义的量化规则:
375
3761. PER_TENSOR: 以 Tensor 为单位完成量化,每个 Tensor 使用一个 scale 和 offset 信息。
377
3782. PER_CHANNEL: 以 Channel 为单位完成量化,每个 Channel 使用一个 scale 和 offset 信息。
379
3803. LINEAR: 线性量化,通常的 INT8, INT16 皆属于线性量化,在线性量化的表示中不存在指数位。
381
3824. FLOATING: 浮点量化,包括 FP8 E4M3, FP8 E5M2, FP16, BF16 等格式,在浮点量化中数据由底数和指数两部分组成。
383
3845. SYMMETRICAL: 对称量化,在量化计算中不启用 offset。
385
3866. ASYMMETRICAL: 非对称量化,在量化计算中启用 offset 完成量化偏移。
387
3887. POWER_OF_2: 限制 scale 取值必须为 2 的整数次幂,这一量化行为多见于端侧以及浮点量化。
389
3908. DYNAMIC: 启用动态量化策略,对于每一批次的数据,scale 与 offset 都将被动态地计算更新。
391
392下图解释了浮点量化与线性量化的区别:
393
394![image](https://user-images.githubusercontent.com/43309460/199235366-1e83ed97-0731-4e1d-abeb-b7121e3d2a94.png)
395
396### 2. 线性量化与相关属性
397
398线性量化允许与下列属性进行组合:
399
400 QuantizationProperty.ASYMMETRICAL | QuantizationProperty.LINEAR | QuantizationProperty.PER_CHANNEL,
401 QuantizationProperty.ASYMMETRICAL | QuantizationProperty.LINEAR | QuantizationProperty.PER_TENSOR,
402 QuantizationProperty.SYMMETRICAL | QuantizationProperty.LINEAR | QuantizationProperty.PER_CHANNEL,
403 QuantizationProperty.SYMMETRICAL | QuantizationProperty.LINEAR | QuantizationProperty.PER_TENSOR,
404 QuantizationProperty.ASYMMETRICAL | QuantizationProperty.LINEAR | QuantizationProperty.PER_TENSOR | QuantizationProperty.POWER_OF_2,
405 QuantizationProperty.SYMMETRICAL | QuantizationProperty.LINEAR | QuantizationProperty.PER_TENSOR | QuantizationProperty.POWER_OF_2,
406 QuantizationProperty.ASYMMETRICAL | QuantizationProperty.LINEAR | QuantizationProperty.PER_CHANNEL | QuantizationProperty.POWER_OF_2,
407 QuantizationProperty.SYMMETRICAL | QuantizationProperty.LINEAR | QuantizationProperty.PER_CHANNEL | QuantizationProperty.POWER_OF_2,
408
409线性量化是最为常用的数值量化方法,有些时候我们也称其为均匀量化,在线性量化中,量化操作的计算方法为:
410
411- Unscaled FP32 = (FP32 / scale) - offset
412- INT8 = Clip(Round(Unscale FP32), quant_min, quant_max)
413- Dequantized FP32 = (INT8 + offset) * scale
414
415其中 Round 函数行为由 TQC.rounding(RoundingPolicy) 属性确定,PPQ 支持 7 种不同的取整策略,其中 ROUND_HALF_EVEN 是最常见的取整策略,关于取整策略的详细讨论可以参考 https://en.wikipedia.org/wiki/Rounding
416
417quant_min, quant_max 分别由 TQC.quant_min, TQC.quant_max 属性确定,对于线性量化而言他们是整数,通常为[-128, 127]。部分框架使用 [-127, 127] 作为截断值,在部分场景下如此定义将有优势,但在 Onnx 的 Q/DQ 算子定义中不允许使用 [-127, 127] 作为截断。
418
419PPQ 可以模拟 1-32 bit 的任意位宽量化,但若以部署为目的,不建议使用 8 bit 之外的配置。用户须知高位宽量化可能造成 Scale 过小,以至于浮点下溢出。
420
421### 3. 浮点量化与相关属性
422
423浮点量化允许与下列属性进行组合:
424

Callers 5

optimizeMethod · 0.90
LinearQuantizationConfigFunction · 0.90
copyMethod · 0.85

Calls

no outgoing calls

Tested by

no test coverage detected