## TensorQuantizationConfig(Tensor 量化控制结构体) PPQ 使用量化控制结构体描述量化行为,该结构体被定义在 ppq.core.quant 中。截止 PPQ 0.6.6 版本,该结构体由 15 项不同的属性组成。我们将向你介绍这一核心数据结构体的设计构想。 ### 1. QuantizationPolicy 量化策略 在 TensorQuantizationConfig 当中,首当其冲地内容是 TQC.policy,这是一个 QuantizationPolicy 对象。 policy 属性用于描述量化的规则,一个完整的量化策略是由多个量化属性(Quant
| 365 | |
| 366 | |
| 367 | class TensorQuantizationConfig(Serializable): |
| 368 | """ |
| 369 | ## TensorQuantizationConfig(Tensor 量化控制结构体) |
| 370 | PPQ 使用量化控制结构体描述量化行为,该结构体被定义在 ppq.core.quant 中。截止 PPQ 0.6.6 版本,该结构体由 15 项不同的属性组成。我们将向你介绍这一核心数据结构体的设计构想。 |
| 371 | |
| 372 | ### 1. QuantizationPolicy 量化策略 |
| 373 | 在 TensorQuantizationConfig 当中,首当其冲地内容是 TQC.policy,这是一个 QuantizationPolicy 对象。 |
| 374 | policy 属性用于描述量化的规则,一个完整的量化策略是由多个量化属性(QuantizationProperty)组合完成的;在 PPQ 中目前我们支持 8 种不同的量化属性,你可以使用以下属性来组合形成自定义的量化规则: |
| 375 | |
| 376 | 1. PER_TENSOR: 以 Tensor 为单位完成量化,每个 Tensor 使用一个 scale 和 offset 信息。 |
| 377 | |
| 378 | 2. PER_CHANNEL: 以 Channel 为单位完成量化,每个 Channel 使用一个 scale 和 offset 信息。 |
| 379 | |
| 380 | 3. LINEAR: 线性量化,通常的 INT8, INT16 皆属于线性量化,在线性量化的表示中不存在指数位。 |
| 381 | |
| 382 | 4. FLOATING: 浮点量化,包括 FP8 E4M3, FP8 E5M2, FP16, BF16 等格式,在浮点量化中数据由底数和指数两部分组成。 |
| 383 | |
| 384 | 5. SYMMETRICAL: 对称量化,在量化计算中不启用 offset。 |
| 385 | |
| 386 | 6. ASYMMETRICAL: 非对称量化,在量化计算中启用 offset 完成量化偏移。 |
| 387 | |
| 388 | 7. POWER_OF_2: 限制 scale 取值必须为 2 的整数次幂,这一量化行为多见于端侧以及浮点量化。 |
| 389 | |
| 390 | 8. DYNAMIC: 启用动态量化策略,对于每一批次的数据,scale 与 offset 都将被动态地计算更新。 |
| 391 | |
| 392 | 下图解释了浮点量化与线性量化的区别: |
| 393 | |
| 394 |  |
| 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 | |
| 417 | quant_min, quant_max 分别由 TQC.quant_min, TQC.quant_max 属性确定,对于线性量化而言他们是整数,通常为[-128, 127]。部分框架使用 [-127, 127] 作为截断值,在部分场景下如此定义将有优势,但在 Onnx 的 Q/DQ 算子定义中不允许使用 [-127, 127] 作为截断。 |
| 418 | |
| 419 | PPQ 可以模拟 1-32 bit 的任意位宽量化,但若以部署为目的,不建议使用 8 bit 之外的配置。用户须知高位宽量化可能造成 Scale 过小,以至于浮点下溢出。 |
| 420 | |
| 421 | ### 3. 浮点量化与相关属性 |
| 422 | |
| 423 | 浮点量化允许与下列属性进行组合: |
| 424 |
no outgoing calls
no test coverage detected