1. W8A8 的定义

W8A8 代表 权重(Weights)和激活值(Activations)均被量化为 8 位(INT8 或 UINT8),常用于深度学习推理,以减少模型的存储、计算需求,并提升硬件执行效率。

W8(8-bit Weights):将神经网络的权重从 32 位浮点(FP32)转换为 8 位整数(INT8)。
A8(8-bit Activations):将神经网络的激活值从 32 位浮点(FP32)转换为 8 位整数(INT8)。
W8A8 量化主要用于 卷积神经网络(CNNs)和 Transformer 模型,适用于推理任务,如图像分类、目标检测和自然语言处理(NLP)。

FP8是一种8位浮点数格式,全称为Floating Point 8-bit。它使用8位来表示浮点数数据类型。w8a8的结构包括1位符号位、4位指数位和3位尾数位(E4M3变体),或者1位符号位、5位指数位和2位尾数位(E5M2变体)‌。这种格式适用于需要高效率和低精度的场景,如深度学习中的模型推理‌工作中。

华为的 W8A8 量化方案属于8 位整数(INT8) 类型,并非带小数的浮点类型FP8。

2. 典型数据格式的分布图
3. 典型八位数据格式的数据范围

W8A8是深度学习中常用的低精度量化方案,指权重(Weight)和激活值(Activation)均采用8位精度量化,常见INT8或FP8两种类型,不同类型的取值特征因位宽分配、量化规则不同有明显差异,具体如下:

  1. INT8类型的W8A8取值特征
    这是最主流的W8A8形式,也是华为晟腾系列产品支持的8位数据格式。权重和激活值均量化为8位整数,适配多数通用硬件的INT8运算优化,取值特征聚焦于整数映射特性:
    • 固定取值范围:普遍采用有符号INT8,取值范围固定为-128-127;若为无符号INT8则是0~255。该范围是8位整数的固有存储边界,量化时需通过裁剪操作将超界数值限制在这个区间内。
    • 依赖映射参数定具体取值:原始FP32浮点值需通过缩放因子(scale)和零点(zero_point)映射为INT8值。比如对称量化中,零点设为0,缩放因子按权重/激活值的最大绝对值计算(scale=max_value/127),最终每个浮点值会被映射为该范围内的某个离散整数,不存在整数之外的取值。
    • 取值离散且均匀分布:量化后仅保留256个离散取值,相邻取值的间隔由缩放因子决定,同一量化批次中间隔固定,属于均匀量化模式。例如若缩放因子为0.01,取值间隔就是0.01,对应整数映射后的离散数值台阶。
  2. FP8类型的W8A8取值特征
    该类型常见于N卡和A卡的GPU(如NVIDIA H100、AMD MI300x)的硬件加速场景,权重和激活值采用8位浮点数格式,又分E4M3和E5M2两个子类型,取值特征侧重浮点的范围与精度权衡:
    类型 取值范围 核心取值特征
    E4M3 ±448 1位符号位+4位指数位+3位尾数位,无无穷大取值,仅保留NaN特殊值;尾数位更多,取值精度较高(步长0.125左右),适合对精度敏感的激活值或权重场景,取值为连续的浮点型,但受尾数位限制仍存在精度量化误差。
    E5M2 ±57344 1位符号位+5位指数位+2位尾数位,支持无穷大、NaN等特殊值;指数位更多,取值范围远大于E4M3,但尾数位减少导致精度降低(步长0.25左右),适合对动态范围要求高、对精度容忍度高的权重存储场景。
4. E4M3的计算公式

E4M3 (8-bit Floating Point) 完整数值计算公式:给定 8 位二进制数:[S][E3 E2 E1 E0][M2 M1 M0]

设:

  • S:符号位(0 为正,1 为负)
  • E:4 位指数(0 到 15)
  • M:3 位尾数(0 到 7)

偏置 (bias) = 7
规格化数计算:value = (-1)s×(1 + M/8) × 2^(E - 7)
非规格化数计算:value = (-1)s×(M/8) × 2^(1 - 7) = M × 2⁻⁹


4.1 数学表达形式
在这里插入图片描述

4.2. 规格化数 (Normalized)与非规格化数 (Denormalized / Subnormal)
上文讨论中涉及的规格化数和非规格化数,也是有进一步延伸的,可以更好的表示小值。


规格化数 (Normalized)

  • 指数范围0001₂1110₂ (1 到 14)
  • 尾数表示隐含前导 1 (hidden leading 1)
  • 公式value = (1 + M/8) × 2^(E - 7)

示例0 1000 010₂

  • E=1000₂=8, M=010₂=2
  • value = (1 + 2/8) × 2^(8-7) = 1.25 × 2¹ = 2.5

非规格化数 (Denormalized / Subnormal)

  • 指数范围0000₂ (0)
  • 尾数表示无隐含前导 1 (explicit leading 0)
  • 公式value = (M/8) × 2^(1 - 7) = M × 2⁻⁹

示例0 0000 010₂

  • E=0, M=010₂=2
  • value = (2/8) × 2⁻⁶ = 0.25 × 0.0156 = 0.0039

对比表格

特性 规格化数 非规格化数
指数位 0001₂ ~ 1110₂ 0000₂
隐含位 有前导 1 无前导 1
指数偏移 E - 7 固定为 -6
尾数范围 1.0 ~ 1.875 0.0 ~ 0.875
数值范围 2⁻⁶ ~ 448 ~0 ~ 2⁻⁶
精度变化 随指数变化 固定 2⁻⁹ 步长

非规格化数带来的关键好处

填补"零间隙":如果没有非规格化数,最小规格化数是 2⁻⁶ ≈ 0.0156,那么 0 到 0.0156 之间的数都无法表示,形成断层。上文中形成的 2⁻⁹ 本质是M/8的分母直接和 2⁻⁶和并得到的。

平滑过渡:非规格化数让数值从 0 到 2⁻⁶ 逐渐过渡

最小规格化数: 1.000₂ × 2⁻⁶ = 0.0156
最大非规格化数: 0.111₂ × 2⁻⁶ = 0.0137  (7*2⁻⁹)
最小非规格化数: 0.001₂ × 2⁻⁶ ≈ 0.0002  (1*2⁻⁹)
零: 0.000₂ × 2⁻⁶ = 0

可以参考链接:16,8和4位浮点数是如何工作的

Logo

欢迎加入DeepSeek 技术社区。在这里,你可以找到志同道合的朋友,共同探索AI技术的奥秘。

更多推荐