QLoRA
QLoRA, LoRA adaptörlerini 4 bitlik NF4 biçiminde saklanan dondurulmuş bir temel model üzerinde eğiterek LLM'lere ince ayar yapar; böylece 65 milyar parametreli bir model tek bir 48 GB GPU'ya sığar.
QLoRA (Kuantize Düşük Sıralı Uyarlama), önceden eğitilmiş bir büyük dil modelini (LLM) 4 bit duyarlıkta dondurup üzerine küçük LoRA bağdaştırıcıları eğiten bir ince ayar yöntemidir; niceleştirilmiş ağırlıklar üzerinden gradyanları bağdaştırıcılara geri yayar. Dettmers ve diğerlerinin 2023 tarihli QLoRA makalesinde tanıtılan yöntem, 65 milyar parametreli bir modelin ince ayarı için gereken GPU belleğini 780 GB'ın üzerinden 48 GB'ın altına düşürdü; böylece tek bir iş istasyonu GPU'su yeterli oldu ve 16 bit ince ayarın görev performansı korundu. Makalede bu yöntemle ince ayarı yapılan Guanaco modelleri, tek bir GPU üzerinde 24 saat eğitimden sonra Vicuna kıyaslamasında ChatGPT puanının %99,3'üne ulaştı.
QLoRA Nasıl Çalışır#
QLoRA, donmuş ve sıkıştırılmış bir temel modeli üç bellek tasarrufu sağlayan teknikle birleştirir:
- 4 bit NormalFloat (NF4): Her ağırlık, normal dağılımın kantillerine yerleştirilmiş 16 düzeyden birine karşılık gelen 4 bitlik bir kod olarak saklanır; her 64 ağırlıklı blok için bir mutlak maksimum ölçek kullanılır. Önceden eğitilmiş model ağırlıkları kabaca normal dağılım gösterir; bu nedenle kantil düzeyleri çoğu ağırlığın bulunduğu sıfır çevresinde daha yüksek çözünürlük sağlar.
- Çifte niceleştirme: Blok başına ölçekler de 256'lık bloklar halinde 8 bite niceleştirilir; böylece ek yük parametre başına 0,5 bitten yaklaşık 0,127 bite düşer ve 65B modelde yaklaşık 3 GB tasarruf sağlanır.
- Sayfalanmış optimize ediciler: Optimize edici durumları NVIDIA birleşik belleğinde tutulur ve gradyan kontrol noktası kullanımı altındaki uzun diziler gibi bellek kullanımının arttığı durumlarda CPU RAM'e taşınır; böylece bellek yetersizliği hataları eğitimi çökertmez.
İleri geçişte, her donmuş katman matris çarpımından hemen önce NF4 ağırlıklarını bfloat16 biçimine geri açar ve LoRA yolunun çıktısını ekler. Geri yayılım, geri açılmış ağırlıklar üzerinden gradyanları hesaplar ancak yalnızca iki düşük sıralı LoRA matrisini günceller. Makale, tam ince ayarla eşleşmek için transformer bloğundaki her doğrusal katmanda bağdaştırıcı gerektiğini buldu:
Aşağıdaki kod parçacığı, bitsandbytes kitaplığının kullandığı şekilde NF4 düzeylerini oluşturur ve bunları normal dağılımlı ağırlık bloklarında eşit aralıklı 16 düzeyle karşılaştırır:
import torch
torch.manual_seed(0)
normal = torch.distributions.Normal(0.0, 1.0)
# NF4: 16 levels at quantiles of a normal distribution, with an exact zero (as built in bitsandbytes)
positive = normal.icdf(torch.linspace(0.9677083, 0.5, 9)[:-1])
negative = -normal.icdf(torch.linspace(0.9677083, 0.5, 8)[:-1])
nf4 = torch.cat([negative, torch.zeros(1), positive]).sort().values
nf4 = nf4 / nf4.max()
int4 = torch.linspace(-1, 1, 16) # evenly spaced 4-bit levels for comparison
weights = torch.randn(4096, 64) * 0.02 # pretrained weights are roughly normal, in blocks of 64
absmax = weights.abs().amax(dim=1, keepdim=True) # one scale per block
for name, levels in (("NF4", nf4), ("INT4", int4)):
codes = ((weights / absmax)[..., None] - levels).abs().argmin(dim=-1) # 4-bit index per weight
restored = levels[codes] * absmax
print(f"{name} mean squared error: {(restored - weights).pow(2).mean():.3e}")Kod, NF4 için 3.395e-06, eşit aralıklı düzeyler içinse 4.053e-06 ortalama karesel hata yazdırır: Aynı 16 düzey ve aynı blok ölçekleri kullanıldığında, NF4'ün kantil aralıklandırması normal dağılımlı ağırlıkların yeniden oluşturma hatasını yaklaşık %16 azaltır. Uygulamada Hugging Face Transformers, bitsandbytes üzerinden bir modeli NF4 biçiminde yükler; BitsAndBytesConfig, load_in_4bit=True, bnb_4bit_quant_type="nf4", bnb_4bit_use_double_quant=True ve bnb_4bit_compute_dtype=torch.bfloat16 değerlerini ayarlar; PEFT kitaplığı ise LoRA bağdaştırıcılarını ekler.
QLoRA ve İlgili Yöntemler#
- LoRA: Aynı tür bağdaştırıcıları, 16 bit duyarlıkta tutulan bir temel model üzerinde eğitir. 65B modelin yalnızca 16 bit ağırlıkları yaklaşık 130 GB yer kaplar; NF4 ile bu değer yaklaşık dörtte bire iner.
- Parametre açısından verimli ince ayar (PEFT): LoRA, QLoRA, bağdaştırıcılar ve istem ayarlama dahil, az sayıda parametreyi eğiten yöntemler ailesidir.
- Eğitim sonrası model niceleştirme: Tamamlanmış bir modeli çıkarım için sıkıştırır. QLoRA ile ince ayarı yapılan bir model genellikle 16 bit ağırlıklara birleştirilir ve ardından sunum için yeniden niceleştirilir.
- Niceleştirme farkındalıklı eğitim (QAT): Tüm ağırlıklar eğitilirken ileri geçişte düşük duyarlıklı yuvarlamayı taklit eder; böylece dağıtılan model düşük duyarlıkta doğruluğunu korur. Ultralytics YOLO26,
quantize=8ile eğitildiğinde INT8 QAT çalıştırır; NVIDIA ModelOpt aracılığıyla evrişim ve doğrusal katmanlarına sahte niceleştirme ekleyerek öğrenilen ağırlıkların INT8 dışa aktarımında korunmasını sağlar.
Ödünleşimler#
QLoRA, bellek karşılığında hızdan ödün verir: Her ileri ve geri geçişte donmuş ağırlıkların tümünü yeniden açmak, eğitim adımını 16 bit LoRA'ya kıyasla yavaşlatır. Bağdaştırıcılar görev başına saklanıp değiştirilebilecek kadar küçüktür; ancak temel modelle birleştirilmeleri için modelin önce 16 bite geri açılması gerekir. 65B modelde 4 bitlik ağırlıklar ve çifte niceleştirilmiş ölçekler yaklaşık 34 GB yer kaplar; böylece 48 GB GPU'da bağdaştırıcılar, etkinleştirmeler ve sayfalanmış optimize edici durumları için geri kalan alan kullanılabilir.










