FP8 和 FP16 指南:加速 AI – 將 FP16 轉換為 FP8?

Avilas

從大規模語言模型到復雜圖像生成器,構建更大、更強大的人工智能模型的競賽已經遇到了一個根本限制:傳統 32 位精度 (FP32) 的巨大計算成本。隨著模型規模的擴大,對內存、帶寬和能源的需求變得不可持續。解決方案在於徹底轉向低精度格式。這場革命始於 FP16 和 BFloat16 等 16 位格式,現在正進入 8 位浮點 (FP8) 的新時代。

歡迎來到 GigXP.com,深入了解低精度人工智能的世界。本報告詳細分析了精度和性能之間的複雜權衡,解釋了實現這一目標的硬件和軟件,並提供了實用指導,幫助您駕馭人工智能計算的未來。

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

另請閱讀:如何在 iPhone 和 iPad 上將照片轉換為視頻

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 訓練的不對稱數值要求:

  • 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。版權所有。