FP8 和 FP16 指南:加速 AI – 将 FP16 转换为 FP8?

Avilas

从大规模语言模型到复杂图像生成器,构建更大、更强大的人工智能模型的竞赛已经遇到了一个根本限制:传统 32 位精度 (FP32) 的巨大计算成本。随着模型规模的扩大,对内存、带宽和能源的需求变得不可持续。解决方案在于彻底转向低精度格式。这场革命始于 FP16 和 BFloat16 等 16 位格式,现在正进入 8 位浮点 (FP8) 的新时代。

欢迎来到 GigXP.com,深入了解低精度人工智能的世界。本报告详细分析了精度和性能之间的复杂权衡,解释了实现这一目标的硬件和软件,并提供了实用指导,帮助您驾驭人工智能计算的未来。

FP8 和 FP16 深入探讨:人工智能效率的未来 – GigXP.com

GigXP.com

人工智能硬件
深度学习
白皮书
订阅

深度学习和硬件加速

作者:GigXP 研究团队 |发布日期:2025 年 9 月 1 日

人工智能模型的不断增长引发了计算效率的竞赛。 FP16 和 FP8 等低精度格式是这场革命的核心,有望大幅提升速度并节省内存。本报告揭示了这些格式的技术细节,探讨了使它们可行的权衡和复杂的生态系统。

浮点表示的基础

数字计算表示实数的能力是基础,由 IEEE 754 标准化。该标准形式化了科学记数法,其中数字由符号、有效数字(尾数)和小数位数(指数)组成。像 FP16 和 FP8 这样的低精度格式并不是新发明,而是对这些核心原理的改编,通过平衡精度、范围和效率专门针对现代人工智能的需求而设计。

浮子的剖析

每个浮点数都由三部分组成:

  • 符号位:指示数字是正数 (0) 还是负数 (1) 的单个位。
  • 指数:对数字的大小进行编码,确定二进制小数点的位置。
  • 尾数/有效数 (m):包含有效数字,指示数字的精度。

可视化浮点格式

FP16(16 位)

S
指数
尾数

FP8(E5M2 – 范围优化)

S
指数
中号

FP8(E4M3 – 精度优化)

S
指数
尾数

以 AI 为中心的格式(例如 FP8 的 E4M3)的设计揭示了一种哲学转变:从通用数字完整性转向特定于领域的应用程序感知优化。

FP16 半精度格式

16 位半精度格式 (FP16) 是远离 32 位单精度 (FP32) 的第一个重要步骤,可加速深度学习。它将内存使用量和数据传输成本减半,从而显着提高 NVIDIA Tensor Core 等专用硬件的速度。然而,其主要限制是动态范围较窄(由于其 5 位指数),这可能导致“下溢”,即小梯度值冲至零,从而导致模型训练停滞。这个问题需要“损失缩放”等技术,并直接激发了更强大格式的开发。

BFloat16 替代方案:不同的权衡

与 FP16 同期,Google 为其 TPU 开发了 BFloat16(大脑浮点格式)。 BFloat16 做出了不同的妥协:它保留了 FP32 的 8 位指数,赋予其相同的巨大动态范围,但将尾数大幅削减至仅 7 位。这种设计选择是基于这样的见解:对于神经网络来说,保留广泛的值通常比高精度更重要。

FP16 与 BFloat16:精度与范围

FP16

5指数位

10尾数位

更适合需要精细细节和精度但容易下溢/溢出的任务。

BFloat16

8指数位

7尾数位

由于其类似 FP32 的范围,训练深度模型更具弹性,但代价是精度。

BFloat16 的成功表明,AI 计算的不同阶段有不同的数值需求,为 FP8 更专业的双格式方法铺平了道路。

FP8 的崛起:突破效率界限

FP8 是下一个前沿领域,承诺将 FP16 的成本再次减半。包括 NVIDIA、Arm 和 Intel 在内的联盟提出了标准化双格式策略,以解决 AI 训练的不对称数值要求:

阅读更多:FP16 和 FP8 GPU 指南:深入探讨低精度 AI 加速

  • E4M3(4位指数,3位尾数):针对精度进行了优化。非常适合前向传递中的权重和激活。
  • E5M2(5位指数,2位尾数):针对动态范围进行了优化。非常适合后向传递中的梯度,其值可能会有很大的波动。

FP8 的一项关键创新是其对高精度缩放因子的严重依赖。在计算之前,张量会缩放到 FP8 的可表示范围,然后再缩小,这使得 FP8 的行为更像是一种量化格式,而不是独立的数值类型。

硬件和生态系统支持:使 FP8 可行

低精度格式只有在硬件和软件可以利用它们的情况下才有用。 FP8 的采用是由强大的生态系统推动的:

  • 专用硅:NVIDIA 的 Hopper 和 Blackwell 架构采用带有专用 FP8 处理单元的 Tensor Core,与 FP16 相比,吞吐量能够增加一倍。这些内核在 FP8 中执行矩阵乘法,并以更高的精度(FP16 或 FP32)累积结果以保持精度。
  • 软件库:PyTorch 和 TensorFlow 等框架通过 CUDA 和 cuDNN 等库提供高级 API,抽象出 FP8 转换和缩放的复杂性。这使得开发人员能够以最少的代码更改来启用 FP8。
  • 标准化工作:行业领导者联盟(包括 NVIDIA、Arm 和 Intel)提出的 E4M3 和 E5M2 格式可确保互操作性并鼓励跨不同硬件平台的广泛采用。

FP8 是硬件-软件协同设计的证明。芯片架构和软件堆栈明确补偿了格式的限制。

较低精度的训练:稳定性是关键

使用低精度数字进行训练是一种微妙的平衡。用于维持模型准确性的主要技术是混合精度训练。这种方法不会将整个模型转换为较低的格式;而是将整个模型转换为较低的格式。相反,它策略性地使用不同的格式来实现不同的目的。

混合精度训练工作流程

  1. 主重量:模型权重的主要副本始终以高精度 (FP32) 存储。这是权威的事实来源,可以防止在许多训练步骤中累积精度损失。
  2. 向前/向后传球:对于每个训练步骤,前向和后向传递的 FP32 权重都会降低为 FP16 或 FP8,充分利用低精度硬件的速度。
  3. 体重更新:在向后传递期间计算的梯度(可能在 FP8/FP16 中)用于更新主 FP32 权重。这确保了小梯度更新不会丢失。

损失缩放的作用

为了防止 FP16 或 FP8 中小梯度值变为零(下溢),一种称为动态损失缩放被使用。在向后传递之前,损失值乘以缩放因子,这有效地放大了所有梯度。在更新权重之前,梯度会按比例缩小。这个过程就像放大镜一样,将微小的梯度推入可表示的范围,而不改变权重更新的方向。

交互式比较:指数位与尾数位

该图表强调了基本的权衡:更多的指数位提供更宽的动态范围,而更多的尾数位提供更高的精度。单击图例中的标签可隐藏/显示数据。

格式对比分析

切换高级详细信息

特征 FP32 FP16 BF16 E5M2 (FP8) E4M3 (FP8)
总位数 32 16 16 8 8
指数位 8 5 8 5 4
尾数位 23 10 7 2 3
揭露偏见 127 15 127 15 7
最大正常值 ~3.40e38 65,504 ~3.40e38 57,344 第448章
小数位 〜7.22 ~3.31 ~2.11 ~0.90 〜1.20

FP16 到 FP8 转换算法

从 FP16 转换到 FP8 并不是简单的截断。这是一个多步骤的数值转换,涉及解构、处理特殊情况(如无穷大和 NaN)、重新偏置指数、舍入尾数以及管理潜在的上溢或下溢。 E4M3 和 E5M2 之间的逻辑存在显着差异,反映了它们的专门角色。

例如,FP16 无穷大映射到 E5M2 中的无穷大,但在 E4M3 中被限制为最大有限值,因为后者没有无穷大表示。

特殊值映射规则

特别价值 FP16 模式 E5M2图案 E4M3图案 转换规则
+零 0x0000 0x00 0x00 直接映射
-零 0x8000 0x80 0x80 直接映射
+无限 0x7C00 0x7C 0xFE E4M3 钳位至最大有限值
-无限 0xFC00 0xFC 0xFE E4M3 钳位至最大有限值
0x7C01+ 0x7D+ 0x7F 映射到规范 NaN

实用转换:JavaScript 示例

下面是一个详细的 JavaScript 函数,演示了将表示 FP16 数字的 16 位整数转换为表示 E4M3 FP8 数字的 8 位整数。这说明了特殊情况、指数重新偏置和尾数舍入的处理。

/**
 * Converts a 16-bit number (representing FP16) to an 8-bit E4M3 FP8 number.
 * @param {number} fp16_val - An integer from 0 to 65535.
 * @returns {number} An integer from 0 to 255 representing the E4M3 value.
 */
function convertFp16ToE4M3(fp16_val) {
    // FP16 constants
    const FP16_EXP_BIAS = 15;
    const FP16_MAX_EXP = 31;

    // E4M3 constants
    const E4M3_EXP_BIAS = 7;
    const E4M3_MAX_EXP = 15; // All 1s pattern
    const E4M3_MAX_NORMAL = 0x7E; // s=0, e=1110, m=111 -> 448

    // 1. Deconstruct the FP16 value
    const s16 = (fp16_val >> 15) & 0x1;
    let e16 = (fp16_val >> 10) & 0x1F;
    let m16 = fp16_val & 0x3FF;

    // 2. Handle special FP16 values
    if (e16 === FP16_MAX_EXP) { // Infinity or NaN
        if (m16 === 0) { // Infinity
            // E4M3 has no infinity, so we clamp to max normal value.
            return s16 ? 0xFE : E4M3_MAX_NORMAL; // 0xFE is max neg value
        } else { // NaN
            return 0x7F; // Canonical NaN for E4M3
        }
    }

    // Combine sign bit for the final FP8 value
    const s8 = s16  Zero
        // FP16 denormals are too small for E4M3, flush to zero.
        return s8;
    }

    // 3. Convert normal FP16 value
    // Re-bias the exponent
    let e8_unbiased = e16 - FP16_EXP_BIAS;
    
    // Check for overflow/underflow after re-biasing
    if (e8_unbiased > E4M3_EXP_BIAS) { // Overflow
        return s16 ? 0xFE : E4M3_MAX_NORMAL; // Clamp to max
    }
    if (e8_unbiased > bits_to_shift;
    
    // Implement Round-to-Nearest-Even
    const halfway = 1  halfway || (remainder === halfway && (m8 & 1) !== 0)) {
        m8 += 1;
    }

    // Handle case where mantissa rounding overflows into exponent
    if (m8 > 0b111) {
        m8 = 0;
        e8_unbiased += 1;
        if (e8_unbiased > E4M3_EXP_BIAS) {
            return s16 ? 0xFE : E4M3_MAX_NORMAL; // Overflow
        }
    }

    let e8 = e8_unbiased + E4M3_EXP_BIAS;

    // 5. Assemble the E4M3 FP8 value
    return s8 | (e8 

未来:超越 FP8

虽然 FP8 是当前低精度训练的最先进技术,但研究已经在进一步推进。目前正在探索一些有前景的途径:

  • 4 位格式 (FP4):对 4 位浮点和整数格式的早期研究显示了推理的潜力,尽管训练仍然存在重大的准确性挑战。
  • 自适应和对数格式:非标准数字系统,例如对数数字系统(LNS)和可以根据数据分布动态改变其精度/范围的自适应格式,是活跃的研究领域。
  • 硬件感知量化:将量化算法与特定的硬件架构紧密耦合,以找到网络中每一层甚至每个张量的最佳数值格式。

提高计算效率的旅程还远未结束。精度的每一步下降都会为更大、更复杂、更易于访问的人工智能模型带来新的可能性。

结论:人工智能计算的范式转变

从 FP32 到 FP8 的演变反映了一种深刻的转变,即数字格式是高度优化的人工智能系统的共同设计组件。 FP8 具有双格式特性和对扩展的依赖,这不仅是一种渐进式改进,而且是一项关键的支持技术。它加速了整个人工智能堆栈,减少了研究和部署的成本和时间障碍,并突破了人工智能的可能性界限。

GigXP.com

关于我们
接触
隐私政策

© 2025 GigXP.com。版权所有。