QLORA - Efficient Finetuning of Quantized LLMs
- QLoRA: 4bit量化+LoRA训练=瞬间起飞 - 知乎
- LLMs之Guanaco:《QLoRA:Efficient Finetuning of Quantized LLMs》翻译与解读
- 【论文精读】QLORA: Efficient Finetuning of Quantized LLMs-CSDN博客
- QLoRA(Quantized LoRA)详解 - 知乎
- 揭秘QLoRA: 通过对权重矩阵量化的方法,来高效微调大语言模型 - YouTube
主要內容
原本的 LoRA 加載模型是利用 16ibt,而 QLoRA 讓模型本身用 4bit 加載,訓練時把數值反量化到 BF16 後進行訓練,利用 LoRA 鎖定原模型參數不參與訓練的特性,只訓練少量LoRA參數的特性使得訓練所需的顯存大大減少。
=> 例如33B的LLaMA模型經過這種方式可以在 24 GB的顯示卡上訓練,也就是說單卡4090、3090都可以實現,大大降低了微調的門檻
LoRA 痛點
引數空間小:LoRA中參與訓練的引數量較少,解空間較小,效果相比全量微調有一定的差距。
微調大模型成本高:對於上百億引數量的模型,LoRA微調的成本還是很高。
精度損失:針對第二點,可以採用int8或int4量化,進一步對模型基座的引數進行壓縮。但是又會引發精度損失的問題,降低模型效能。
大模型的 Foundation Model 還是佔用大量內存, 當中 Memory 也會被 Activation Gradients 佔用
4-bit NormalFloat
Block-wise Quantization
假設我們把float32的值量化到int8, 本質上我們是把數值從一個更大的範圍映射到一個較小的範圍。我們可以使用一個常數c來成比例的將數值縮小。這樣一來我們也可以很容易的使用這個常數c將量化後的數值反量化成原樣(近似的)。
但假如我們的資料中有一些outliner,這會影響我們選取c,而且會導致其他值坍縮在一個小的範圍內。Block-wise對此的解決方案是一批一批的量化,每一批(block)使用獨立的c。在本文中block的大小被設為64。
32-bit -> 8-bit => 2^8 = 256 => [-127, 127] ( 128 - 1 是為了對稱與包含0 )
Quantile Quantization
由於預訓練模型神經網路權重通常具有常態分佈特性,因此可以透過縮放σ將所有權重轉換為單一固定分佈,對於本文的資料類型,設定隨機區間為[-1, 1],因此,資料類型的分位數和神經網路權重都要標準化到這個區間內
分位數(Quantile)在數學上的定義指的是把順序排列的一組資料分割成若干個相等區塊的分割點的數值。
假設把參數量化到 4bit,則在這種情況下最多可以用的數字相比於 32bit 小很多,可能會讓差異或資訊在這個量化過程中丟掉了,更或是假設原始數據在 0 附近,可能量化為 0,那就沒意義了。
因此該怎麼充分利用這些數字?首先由小排到大,分成 16 等份,最小的一塊映射到量化後的第一個數,第二塊映射到後的第二個數,以此類推。
因此該怎麼充分利用這些數字?首先由小排到大,分成 16 等份,最小的一塊映射到量化後的第一個數,第二塊映射到後的第二個數,以此類推。
這樣做原始數據在量化後的數字上分佈就是均勻的。這樣的做法就是Quantile Quantization. 這裡的Quantile意思是分位,我們平常說的中位數,四分之一位數,都是一種分位。
- 估計理論N(0,1)分佈的
分位數,可以得到適用於常態分佈的k位分位數量化資料型態。 - 採用該資料類型並將其標準化。
- 將輸入權重張量標準化,從而進行量化。