Float16 Bfloat16 w8a8数据类型以及E4M3的计算
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两种类型,不同类型的取值特征因位宽分配、量化规则不同有明显差异,具体如下:
- 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,对应整数映射后的离散数值台阶。
- 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位浮点数是如何工作的
更多推荐


所有评论(0)