LLM kuantizasyonu için görsel rehber
(newsletter.maartengrootendorst.com)- Büyük dil modelleri (LLM), genel amaçlı donanımda çalıştırılamayacak kadar büyüktür; genellikle milyarlarca parametre içerir ve yüksek miktarda VRAM’e sahip GPU’lar gerektirir
- Bu nedenle, geliştirilmiş eğitim, adaptörler vb. yöntemlerle bu modelleri küçültmeye yönelik araştırmalar giderek artıyor; bu alandaki temel tekniklerden biri de kuantizasyon
Part 1: Büyük dil modellerinin "sorunu"
- LLM (Large Language Model), içerdiği parametre sayısına göre adlandırılır
- Bu tür modeller genellikle milyarlarca parametre (çoğunlukla ağırlıklar) içerir; bu da depolama maliyetini oldukça yükseltebilir
- Çıkarım sırasında aktivasyonlar, girdiler ile ağırlıkların çarpımından üretilir ve bunlar da benzer şekilde oldukça büyük olabilir
- Bu yüzden, verilen bir değeri depolamak için gereken alanı en aza indirirken milyarlarca değeri mümkün olan en verimli şekilde temsil etmeye çalışırız
Sayısal değerler nasıl temsil edilir
- Verilen bir değer çoğu zaman kayan noktalı sayı (gerçel sayı) olarak temsil edilir
- Bu değerler "bit"lerle ifade edilir ve IEEE-754 standardı, bitlerin bir değeri temsil etmek için işaret, üs ve mantis/fraction işlevlerinden hangisini taşıdığını açıklar
- Bir değeri temsil etmek için kullanılan bit sayısı arttıkça, genel olarak hassasiyet de artar
- Kullanılabilir bit sayısı arttıkça, temsil edilebilen değer aralığı da genişler
Bellek kısıtları
- 70 milyar parametreye sahip bir model varsayarsak, FP32 (full-precision) kullanıldığında yalnızca modeli yüklemek için 280 GB bellek gerekir
- Bu nedenle, model parametrelerini temsil eden bit sayısını azaltmak çok önemlidir; ancak hassasiyet düştükçe model doğruluğu da genellikle düşer
- Amaç, doğruluğu korurken değerleri temsil etmek için gereken bit sayısını azaltmaktır; kuantizasyon tam da burada devreye girer
Part 2: Kuantizasyona giriş
- Kuantizasyon, model parametrelerinin hassasiyetini yüksek bit genişliğinden (ör. 32 bit kayan nokta) daha düşük bit genişliğine (ör. 8 bit tamsayı) indirmeyi amaçlar
- Bit sayısı her azaltıldığında, orijinal parametreleri düşük bitli gösterime "sıkıştırmak" için bir eşleme yapılır
Yaygın veri türleri
FP16
- FP32’den FP16’ya (half precision) geçildiğinde, FP16’nın alabileceği değer aralığı FP32’ye göre belirgin şekilde küçülür
BF16
- FP32’ye benzer bir değer aralığı elde etmek için, bir tür "budanmış FP32" olan bfloat16 tanıtıldı
- BF16, FP16 ile aynı sayıda bit kullanır ancak daha geniş bir değer aralığına sahiptir ve derin öğrenme uygulamalarında sık kullanılır
INT8
- Bit sayısı daha da azaltıldığında, kayan noktalı gösterim yerine tamsayı tabanlı gösterime yaklaşılır
Simetrik kuantizasyon
- Orijinal kayan noktalı değer aralığı, kuantize edilmiş uzayda 0 merkezli simetrik bir aralığa eşlenir
- Kayan noktalı uzaydaki 0 değeri, kuantize edilmiş uzayda tam olarak 0’a karşılık gelir
Asimetrik kuantizasyon
- Simetrik kuantizasyondan farklı olarak 0 etrafında simetrik değildir
- Minimum değer (β) ve maksimum değer (α), kayan noktalı aralıktan kuantize edilmiş aralığın minimum ve maksimum değerlerine eşlenir
- Buna zero-point kuantizasyon adı verilen yöntemlerden biri denir
Aralık eşleme ve clipping
- Bir vektörün tüm aralığını eşlemek, aykırı değerler nedeniyle tüm küçük değerlerin aynı düşük bitli gösterime eşlenmesine ve ayırt ediciliğin kaybolmasına yol açar
- Bunun yerine, belirli değerleri clipping ile kırpmayı seçebiliriz
- Clipping, tüm aykırı değerlerin aynı değere sahip olacağı farklı bir orijinal dinamik aralık tanımlamaktır
- Aykırı olmayan değerlerin kuantizasyon hatası ciddi biçimde azalırken, aykırı değerlerin kuantizasyon hatası artar
Kalibrasyon (Calibration)
Ağırlıklar (ve bias)
- Ağırlıklar ve bias, modeli çalıştırmadan önce bilinen statik değerler olarak düşünülebilir
- Bias sayısı ağırlıklardan çok daha az olduğu için daha yüksek hassasiyette (ör. INT16) tutulur; kuantizasyondaki asıl çaba ağırlıklara yöneliktir
- Statik ve bilinen ağırlıklar için kalibrasyon teknikleri arasında, girdi aralığının yüzdelik dilimini elle seçmek, orijinal ve kuantize edilmiş ağırlıklar arasındaki ortalama kare hatayı (MSE) optimize etmek veya orijinal ve kuantize edilmiş değerler arasındaki entropiyi (KL divergence) en aza indirmek bulunur
Aktivasyonlar
- Girdiler, LLM boyunca sürekli güncellenir ve genellikle "aktivasyon" olarak adlandırılır
- Bu değerler, her giriş verisi çıkarım sırasında modele verildiğinde değiştiği için doğru biçimde kuantize edilmeleri zordur
- Bu değerler her gizli katmandan sonra güncellendiğinden, girdinin model içinde ilerleyişi sırasında ancak çıkarım anında ne olacağı bilinebilir
Part 3: Eğitim sonrası kuantizasyon (PTQ - Post-Training Quantization)
Dinamik kuantizasyon
- Veri gizli katmanlardan geçtikten sonra aktivasyonlar toplanır
- Bu aktivasyon dağılımı, çıktıyı kuantize etmek için gereken zero-point (z) ve scale factor (s) değerlerini hesaplamakta kullanılır
- Veri her yeni katmandan geçtiğinde süreç tekrarlanır. Bu nedenle her katmanın kendine özgü z ve s değerleri vardır ve farklı bir kuantizasyon şeması kullanır
Statik kuantizasyon
- Zero-point (z) ve scale factor (s) değerleri çıkarım sırasında değil, önceden hesaplanır
- Bu değerleri bulmak için bir kalibrasyon veri kümesi modele verilerek olası dağılımlar toplanır
- Gerçek çıkarım yapıldığında s ve z değerleri yeniden hesaplanmaz; bunun yerine tüm aktivasyonlar için küresel olarak kullanılarak kuantizasyon yapılır
- Genel olarak dinamik kuantizasyon, her gizli katman için s ve z değerlerini hesaplamaya çalıştığı için biraz daha doğrudur; ancak hesaplama süresini artırabilir
- Buna karşılık statik kuantizasyon daha az doğrudur ama s ve z değerleri zaten bilindiği için daha hızlıdır
4 bit kuantizasyon alanı
- 8 bitin altına inmek, her bit kaybında kuantizasyon hatası arttığı için zor bir iş olduğunu gösterdi
- HuggingFace’te yaygın olarak paylaşılan iki yöntem olan GPTQ ve GGUF inceleniyor
GPTQ
- 4 bit kuantizasyon için fiilen en iyi bilinen yöntemlerden biri
- Asimetrik kuantizasyon kullanır ve her katman bağımsız olarak işlenip ardından sonrakine geçilecek şekilde katman bazında uygulanır
- Katman bazlı kuantizasyon sürecinde önce katmanın ağırlıkları ters Hessian ile dönüştürülür; bu, model kayıp fonksiyonunun ikinci türevidir ve model çıktısının her ağırlıktaki değişime ne kadar duyarlı olduğunu gösterir
- Basitçe söylemek gerekirse, bir katmandaki her ağırlığın (ters) önemini gösterir
- Hessian matrisinde değeri küçük olan ağırlıklar daha önemlidir; çünkü bu ağırlıklardaki küçük değişimler model performansında büyük değişikliklere yol açabilir
GGUF
- GPTQ, tüm LLM’yi GPU üzerinde çalıştırmak için iyi bir kuantizasyon yöntemidir, ancak her zaman bu kapasiteye sahip olunmayabilir
- Bunun yerine, LLM’nin tüm katmanlarını CPU’ya offload etmek için GGUF kullanılabilir
- Yeterli VRAM olmadığında hem CPU hem GPU kullanımına olanak tanır
Part 4: Kuantizasyon farkındalıklı eğitim (QAT - Quantization Aware Training)
-
- bölümde modeli eğitimden sonra nasıl kuantize edebileceğimize baktık; ancak bu yaklaşımın dezavantajı, gerçek eğitim sürecini hesaba katmamasıdır
- Kuantizasyon farkındalıklı eğitim (QAT) tam da burada devreye girer. PTQ’dan farklı olarak QAT, eğitim sırasında kuantizasyon prosedürünü öğrenmeyi amaçlar
- QAT, kuantizasyon eğitim sırasında zaten dikkate alındığı için PTQ’ya kıyasla daha doğru olma eğilimindedir
1 bit LLM dönemi: BitNet
- BitNet, model ağırlıklarını tek bir 1 bit ile, yani -1 veya 1 olarak temsil eder
- Bunu, kuantizasyon sürecini doğrudan transformer mimarisine enjekte ederek yapar
- Transformer mimarisi, çoğu LLM’nin temelini oluşturur ve lineer katmanlar içeren hesaplamalardan oluşur
- BitNet, bu lineer katmanları BitLinear adı verilen yapıyla değiştirir
Ağırlık kuantizasyonu
- Eğitim sırasında ağırlıklar INT8’de saklanır, ardından temel strateji olan sign fonksiyonu kullanılarak 1 bite kuantize edilir
- Özünde, ağırlık dağılımı 0 etrafına kaydırılır; ardından 0’ın solundaki her şey -1, sağındaki her şey 1 olarak atanır
Aktivasyon kuantizasyonu
- Aktivasyonları kuantize etmek için BitLinear, matris çarpımı (×) daha yüksek hassasiyet gerektirdiğinden, aktivasyonları FP16’dan INT8’e dönüştürmek üzere absmax kuantizasyon kullanır
De-kuantizasyon
- α (aktivasyonların mutlak değerleri içindeki en büyük değer) ve β (ağırlıkların ortalama mutlak değeri) takip edildi; bu değerler daha sonra aktivasyonları FP16’ya de-kuantize etmeye yardımcı olur
- Çıktı aktivasyonları, orijinal hassasiyete de-kuantize edilmek üzere {α, γ} ile yeniden ölçeklendirilir
Tüm büyük dil modelleri 1.58 bittir
- BitNet 1.58b, daha önce söz edilen ölçekleme sorunlarını iyileştirmek için tanıtıldı
- Bu yeni yöntemde modeldeki her bir ağırlık artık yalnızca -1 veya 1 değil, 0 değerini de alabilir; böylece ternary hale gelir
- İlginç biçimde, sadece 0’ı eklemek bile BitNet’i büyük ölçüde iyileştirir ve hesaplamayı çok daha hızlı hale getirir
0’ın gücü
- 0 eklemek neden bu kadar büyük bir iyileştirme sağlıyor? Bunun tamamı matris çarpımıyla ilgilidir
- 1.58 bit olarak kuantize edilmiş ağırlıklar olduğunda, yalnızca çarpım yapmak gerektiği için hem hesaplama büyük ölçüde hızlanır hem de özellik filtreleme mümkün hale gelir
Kuantizasyon
- Ağırlık kuantizasyonu yapmak için BitNet 1.58b, daha önce gördüğümüz absmax kuantizasyonun bir varyantı olan absmean kuantizasyonu kullanır
- Basitçe ağırlık dağılımını sıkıştırır ve değerleri kuantize etmek için mutlak ortalamayı (α) kullanır; ardından bunlar -1, 0 veya 1’e yuvarlanır
- BitNet’e kıyasla, aktivasyon kuantizasyonu bir nokta dışında aynıdır. Aktivasyonları [0, 2ᵇ⁻¹] aralığına ölçeklemek yerine artık absmax kuantizasyon kullanılarak [-2ᵇ⁻¹, 2ᵇ⁻¹] aralığına ölçeklenir
- 1.58 bit kuantizasyon için (esas olarak) iki hile gerekti:
- Ternary gösterim [-1, 0, 1] oluşturmak için 0 eklemek
- Ağırlıklar için absmean kuantizasyonu
-
"13B BitNet b1.58, gecikme, bellek kullanımı ve enerji tüketimi açısından 3B FP16 LLM’den daha verimlidir"
- Bu nedenle, yalnızca hesaplama açısından verimli 1.58 bit kullanarak hafif bir model elde etmek mümkündür
Henüz yorum yok.