什麼是模型量化(Quantization)?解析FP32、FP16、BF16、int8、int4與GGUF的關聯

更新於 發佈於 閱讀時間約 10 分鐘

在當今人工智慧(AI)和大型語言模型(LLM)的快速發展中,模型的規模和計算需求不斷增長,這些模型的參數量動輒數十億,佔用數十GB的儲存空間,並需要高階GPU或TPU進行推論。然而,對於邊緣裝置、消費級硬體或成本敏感的應用來說,這些龐大的模型並不實際。這時,量化(Quantization)作為一種模型壓縮技術應運而生,幫助開發者縮減模型大小、降低記憶體需求並加速推論速度,同時盡可能保留模型效能。

raw-image




Quantization (量化)

Quantization(量化)是一種模型壓縮技術,其主要目的是降低模型中數值(主要是權重)的精度,從而減少模型的體積、記憶體佔用(RAM/VRAM)和計算量,並可能加速模型的推論速度。

運作方式:

大型語言模型在訓練時,其參數(權重)通常使用高精度的浮點數來表示,最常見的是 FP32 (32位元單精度浮點數)。量化技術會將這些高精度的數值,透過特定的映射演算法,轉換為較低精度的數值格式,例如:

  • BF16 (16位元浮點數)
  • FP16 (16位元半精度浮點數)
  • int8 (8位元整數)
  • int4 (4位元整數)
  • 甚至更低的精度 (如 int3, int2)

目的與優點:

  • 減少模型大小: 低精度數值佔用的儲存空間更少。例如,int8 模型大小約為 FP32 的 1/4,int4 約為 1/8。這使得模型更容易儲存和分發。
  • 降低記憶體需求: 在推論時,模型需要載入到記憶體(CPU 的 RAM 或 GPU 的 VRAM)中。較小的模型佔用更少的記憶體,使得在記憶體有限的裝置(如手機、邊緣裝置、消費級 GPU)上運行大型模型成為可能。
  • 加速推論:減少記憶體頻寬瓶頸: 載入模型權重和讀寫活化值時,傳輸的數據量減少,降低了記憶體頻寬的壓力。
  • 更快的計算: 某些硬體(如特定的 CPU 指令集、GPU 的 Tensor Cores)對低精度(尤其是整數)運算有特別優化,執行速度比高精度浮點運算更快。
  • 降低功耗: 計算和數據搬移量的減少通常伴隨著功耗的降低。

挑戰與權衡:

主要的挑戰是 精度損失。降低數值的表示精度必然會損失一部分資訊,這可能導致模型效能(例如,生成文本的品質、回答問題的準確性)下降。因此,量化技術的關鍵在於找到最小化精度損失的映射方法。常見的技術包括:

  • 校準 (Calibration): 使用一小部分代表性數據來確定最佳的量化參數,如縮放因子 (Scale Factor) 和零點 (Zero-Point)。
  • 量化感知訓練 (Quantization-Aware Training, QAT): 在模型訓練過程中就模擬量化的影響,讓模型學習適應低精度表示。
  • 後訓練量化 (Post-Training Quantization, PTQ): 在模型訓練完成後進行量化,通常速度較快,但可能精度損失較大。有許多改進的 PTQ 方法(如 GPTQ, AWQ)試圖在不重新訓練的情況下達到更好的精度。

數據格式FP32、FP16、BF16、int8、int4

這些都是在電腦科學和深度學習中用來表示數值的數據格式,主要區別在於它們使用的位元數 (bits) 以及它們如何編碼數值(浮點數 vs 整數)。位元數越少,佔用的儲存空間和記憶體就越少,計算通常也越快,但表示數值的精度就越低。

FP32 (Single-Precision Floating-Point / 單精度浮點數):

    • 意思: 使用 32 個位元來表示一個浮點數。
    • 結構: 遵循 IEEE 754 標準,通常包含:
      • 1 位符號位 (Sign bit)。
      • 8 位指數位 (Exponent bits): 決定數值的範圍大小。
      • 23 位尾數位 (Mantissa/Fraction bits): 決定數值的精度。
    • 差別:
      • 高精度和寬動態範圍: 能表示非常大和非常小的數值,且精度相對較高。
      • 基準: 是絕大多數科學計算和深度學習模型訓練時的標準格式。
    • 技術差異: 作為標準,硬體(CPU/GPU)對其支援最廣泛且成熟。但每個數值需要 4 個位元組 (Bytes) 儲存,計算相對較慢。

FP16 (Half-Precision Floating-Point / 半精度浮點數):

    • 意思: 使用 16 個位元來表示一個浮點數。
    • 結構: 遵循 IEEE 754 標準,通常包含:
      • 1 位符號位。
      • 5 位指數位。
      • 10 位尾數位。
    • 差別:
      • 大小減半: 模型大小和記憶體占用是 FP32 的一半。
      • 計算加速: 在支援 FP16 的硬體(如 NVIDIA GPU 的 Tensor Cores)上計算速度可以顯著提升。
      • 動態範圍顯著縮小: 由於只有 5 位指數位,能表示的數值範圍遠小於 FP32。這使得在訓練過程中容易出現梯度下溢 (Underflow) 或溢位 (Overflow) 的問題,常需要使用混合精度訓練 (Mixed Precision Training) 和損失縮放 (Loss Scaling) 等技術來克服。
      • 精度降低: 尾數位減少,精度低於 FP32。
    • 技術差異: 是一種直接縮減位元數的浮點數格式。主要挑戰在於其有限的動態範圍。

BF16 (BFloat16 - Brain Floating Point / 腦浮點數):

    • 意思: 使用 16 個位元表示的浮點數,是 Google 為其 TPU 設計的一種格式。
    • 結構:
      • 1 位符號位。
      • 8 位指數位。
      • 7 位尾數位。
    • 差別:
      • 大小減半: 與 FP16 相同,模型大小和記憶體占用是 FP32 的一半。
      • 保持動態範圍: 關鍵區別在於它保留了與 FP32 相同的 8 位指數位,因此具有與 FP32 相同的動態範圍,不易發生溢位/下溢。
      • 精度更低: 為了保持動態範圍,其尾數位比 FP16 更少 (7 vs 10),因此數值精度比 FP16 和 FP32 都低。
    • 技術差異: 是一種權衡下的浮點數格式,犧牲了部分精度來維持寬廣的動態範圍,這對深度學習中的梯度和活化值範圍變化大的情況特別有利。越來越多的現代 GPU (NVIDIA Ampere 架構及之後, AMD CDNA 架構等) 也開始支援 BF16。

int8 (8-bit Integer / 8位元整數):

    • 意思: 使用 8 個位元來表示一個整數。
    • 結構: 8 位元,可以表示 2^8 = 256 個不同的整數值。通常是有符號的 (-128 到 127) 或無符號的 (0 到 255)。
    • 差別:
      • 極大壓縮: 模型大小和記憶體占用是 FP32 的 1/4。
      • 潛在高速計算: 許多 CPU 和 GPU 對 int8 整數運算有特別優化(如 NVIDIA Tensor Cores 的 INT8 模式),速度可能非常快。
      • 類型轉換: 從浮點數變為整數,這是根本性的變化。
      • 動態範圍和精度嚴重受限: 只能表示有限的整數。
    • 技術差異:
      • 需要量化 (Quantization): 必須將原始 FP32 的數值範圍映射 (map) 到 int8 的有限範圍內。這通常需要:
      1. 縮放因子 (Scale Factor): 一個浮點數,用於縮放 int8 值以近似原始 FP32 值。
      2. 零點 (Zero-Point): 一個 int8 值,對應原始 FP32 值中的 0。
      • 精度損失較大: 這個映射過程必然會損失信息。需要校準 (Calibration)(使用少量代表性數據確定最佳 Scale 和 Zero-Point)或量化感知訓練 (QAT) 來最小化精度下降。

int4 (4-bit Integer / 4位元整數):

    • 意思: 使用 4 個位元來表示一個整數。
    • 結構: 4 位元,只能表示 2^4 = 16 個不同的整數值 (例如 -8 到 7 或 0 到 15)。
    • 差別:
      • 極致壓縮: 模型大小和記憶體占用是 FP32 的 1/8。
      • 潛在更高加速: 理論上比 int8 更快,記憶體頻寬需求更低。
      • 表示能力極其有限: 精度損失非常顯著。
    • 技術差異:
      • 量化挑戰極高: 將 FP32 映射到僅 16 個值的挑戰巨大。簡單的線性量化(如 int8 常用的)通常效果很差。
      • 需要複雜量化技術: 常見技術包括:
      1. 分組量化 (Group-wise Quantization): 將權重分成小組,每組有自己的 Scale 和 Zero-Point (例如 GPTQ, AWQ, GGUF 中的 Q4_K_M 等方法)。
      2. 非對稱/非線性量化: 更精確地設置零點和映射關係。使用更複雜的數據結構: 例如 GGUF 中的 _K_ 量化方法,會額外儲存一些高精度的縮放因子或最小值/最大值信息來輔助反量化。
      • 硬體支援: 直接支援 int4 不如 int8 普遍,但可透過軟體或特定硬體加速器實現。

Quantization 跟 GGUF 的關聯性

本質不同:

GGUF 是一種用於儲存量化模型的檔案格式。 Quantization (量化) 是一種技術或過程,用於降低模型的數值精度。GGUF 則是這種技術的成果 (即量化後的模型) 的一種載體或容器格式。

範疇不同:

Quantization 是一個廣泛的概念,可以用在各種模型 (不限於 LLM) 和各種部署場景中。實現量化的方法有很多種 (如上所述的 PTQ, QAT, GPTQ, AWQ 等)。GGUF 是一個特定的檔案格式,主要圍繞 llama.cpp 生態系統使用,雖然設計上具有擴展性,但目前最常與 llama.cpp 支持的量化方法(主要是基於 int8, int4 的各種變體)緊密相關。

簡單類比:

GGUF 就像是一個設計精良的標準化快遞箱,箱子上有標籤說明裡面裝的是什麼(模型架構)、用了哪種填充技術(Quantization)、物品的特性(元數據),以及如何安全地取出和使用物品(載入和運行)。這個箱子(GGUF 檔案)使得快遞員(llama.cpp)能夠方便地處理和遞送這個包裹(量化後的模型)。


Quantization將高精度數值(如FP32)轉換為低精度格式(如FP16、BF16、int8、int4),實現模型壓縮和推論加速。不同數據格式在動態範圍、精度和硬體支援上各有優劣,需根據應用場景選擇。GGUF作為量化模型的標準化檔案格式,與Quantization相輔相成,確保模型在llama.cpp等推論框架中的高效運行。

我是TN科技筆記,如果喜歡這篇文章,歡迎留言、點選愛心、轉發給我支持鼓勵~

也歡迎每個月請我喝杯咖啡,鼓勵我撰寫更多科技文章,一起跟著科技浪潮前進!!

>>>請我喝一杯咖啡

留言
avatar-img
留言分享你的想法!
avatar-img
TN科技筆記(TechNotes)的沙龍
25會員
90內容數
大家好,我是TN,喜歡分享科技領域相關資訊,希望各位不吝支持與交流!
你可能也想看
Thumbnail
「欸!這是在哪裡買的?求連結 🥺」 誰叫你太有品味,一發就讓大家跟著剁手手? 讓你回購再回購的生活好物,是時候該介紹出場了吧! 「開箱你的美好生活」現正召喚各路好物的開箱使者 🤩
Thumbnail
「欸!這是在哪裡買的?求連結 🥺」 誰叫你太有品味,一發就讓大家跟著剁手手? 讓你回購再回購的生活好物,是時候該介紹出場了吧! 「開箱你的美好生活」現正召喚各路好物的開箱使者 🤩
Thumbnail
我想要一天分享一點「LLM從底層堆疊的技術」,並且每篇文章長度控制在三分鐘以內,讓大家不會壓力太大,但是又能夠每天成長一點。 回顧 AI說書 - 從0開始 - 129 中說,Bidirectional Encoder Representations from Transformers (BER
Thumbnail
我想要一天分享一點「LLM從底層堆疊的技術」,並且每篇文章長度控制在三分鐘以內,讓大家不會壓力太大,但是又能夠每天成長一點。 回顧 AI說書 - 從0開始 - 129 中說,Bidirectional Encoder Representations from Transformers (BER
Thumbnail
我想要一天分享一點「LLM從底層堆疊的技術」,並且每篇文章長度控制在三分鐘以內,讓大家不會壓力太大,但是又能夠每天成長一點。 在 AI說書 - 從0開始 - 127 中提及: Transformer 的關鍵參數為: 原始 Transformer 模型中,左圖的 N = 6 原始 Tran
Thumbnail
我想要一天分享一點「LLM從底層堆疊的技術」,並且每篇文章長度控制在三分鐘以內,讓大家不會壓力太大,但是又能夠每天成長一點。 在 AI說書 - 從0開始 - 127 中提及: Transformer 的關鍵參數為: 原始 Transformer 模型中,左圖的 N = 6 原始 Tran
Thumbnail
我想要一天分享一點「LLM從底層堆疊的技術」,並且每篇文章長度控制在三分鐘以內,讓大家不會壓力太大,但是又能夠每天成長一點。 從 AI說書 - 從0開始 - 82 到 AI說書 - 從0開始 - 85 的說明,有一個很重要的結論:最適合您的模型不一定是排行榜上最好的模型,您需要學習 NLP 評
Thumbnail
我想要一天分享一點「LLM從底層堆疊的技術」,並且每篇文章長度控制在三分鐘以內,讓大家不會壓力太大,但是又能夠每天成長一點。 從 AI說書 - 從0開始 - 82 到 AI說書 - 從0開始 - 85 的說明,有一個很重要的結論:最適合您的模型不一定是排行榜上最好的模型,您需要學習 NLP 評
Thumbnail
我想要一天分享一點「LLM從底層堆疊的技術」,並且每篇文章長度控制在三分鐘以內,讓大家不會壓力太大,但是又能夠每天成長一點。 繼 AI說書 - 從0開始 - 82 與 xxx ,我們談論了衡量 AI 模型的方式,那當你訓練的模型比 State-of-the-Art 還要好並想要進行宣稱時,需要
Thumbnail
我想要一天分享一點「LLM從底層堆疊的技術」,並且每篇文章長度控制在三分鐘以內,讓大家不會壓力太大,但是又能夠每天成長一點。 繼 AI說書 - 從0開始 - 82 與 xxx ,我們談論了衡量 AI 模型的方式,那當你訓練的模型比 State-of-the-Art 還要好並想要進行宣稱時,需要
Thumbnail
我想要一天分享一點「LLM從底層堆疊的技術」,並且每篇文章長度控制在三分鐘以內,讓大家不會壓力太大,但是又能夠每天成長一點。 我們已經在AI說書 - 從0開始 - 17中,介紹了大型語言模型 (LLM)世界裡面常用到的Token,現在我們來談談OpenAI的GPT模型如何利用Inference
Thumbnail
我想要一天分享一點「LLM從底層堆疊的技術」,並且每篇文章長度控制在三分鐘以內,讓大家不會壓力太大,但是又能夠每天成長一點。 我們已經在AI說書 - 從0開始 - 17中,介紹了大型語言模型 (LLM)世界裡面常用到的Token,現在我們來談談OpenAI的GPT模型如何利用Inference
Thumbnail
我想要一天分享一點「LLM從底層堆疊的技術」,並且每篇文章長度控制在三分鐘以內,讓大家不會壓力太大,但是又能夠每天成長一點。 已經在AI說書 - 從0開始 - 12以及AI說書 - 從0開始 - 13中見識到TPU的威力了,現在我們把參數放大到真實大型語言模型的規模,看看運算時間的等級。
Thumbnail
我想要一天分享一點「LLM從底層堆疊的技術」,並且每篇文章長度控制在三分鐘以內,讓大家不會壓力太大,但是又能夠每天成長一點。 已經在AI說書 - 從0開始 - 12以及AI說書 - 從0開始 - 13中見識到TPU的威力了,現在我們把參數放大到真實大型語言模型的規模,看看運算時間的等級。
Thumbnail
大型語言模型(Large Language Model,LLM)是一項人工智慧技術,其目的在於理解和生成人類語言,可將其想像成一種高階的「文字預測機器」,然而,它們並非真正理解語言。除了在上篇介紹的技巧可以協助我們在使用 LLM 時給予指示之外,今天我們會介紹使用 LLM 的框架。
Thumbnail
大型語言模型(Large Language Model,LLM)是一項人工智慧技術,其目的在於理解和生成人類語言,可將其想像成一種高階的「文字預測機器」,然而,它們並非真正理解語言。除了在上篇介紹的技巧可以協助我們在使用 LLM 時給予指示之外,今天我們會介紹使用 LLM 的框架。
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News