Connect with us

Microsoft’un çıkarım çerçevesi, 1 bit büyük dil modellerini yerel cihazlara getiriyor

Yapay Zekâ

Microsoft’un çıkarım çerçevesi, 1 bit büyük dil modellerini yerel cihazlara getiriyor

mm
Understanding 1-bit LLMs and Microsoft's BitNet.cpp Framework

17 Ekim 2024’te, Microsoft, BitNet.cpp adlı bir çıkarım çerçevesi duyurdu. Bu, 1 bitlik büyük dil modellerini (LLM’ler) çalıştırmak için tasarlandı. BitNet.cpp, Gen AI’de önemli bir ilerleme olup, 1 bitlik LLM’lerin standart CPU’lar üzerinde verimli bir şekilde dağıtılmasını sağlar ve pahalı GPU’lere gerek kalmaz. Bu gelişme, LLM’lere erişimi demokratikleştirir ve geniş bir cihaz yelpazesinde kullanılmasını sağlar, böylece cihazda AI uygulamaları için yeni olanaklar sunar.

1 Bitlik Büyük Dil Modellerini Anlama

Büyük dil modelleri geleneksel olarak yüksek hassasiyetli kayan nokta sayıları (tipik olarak FP16 veya BF16) kullanmaları nedeniyle önemli hesaplama kaynaklarına ihtiyaç duyar. Bu necessity, LLM’leri dağıtmayı pahalı ve enerji yoğun hale getirdi.

Temelinde, 1 bitlik LLM’ler model ağırlıklarını yalnızca üç olası değer kullanarak temsil etmek için aşırı kuantizasyon tekniklerini kullanır: -1, 0 ve 1, yani “1.58 bit” (üç durumu kodlamak için biraz daha fazla bir bit gerektirir).

Üçlü Ağırlık Sistemi

Kavram

BitNet.cpp’deki 1 bitlik kuantizasyon, bir üçlü ağırlık sistemidir. BitNet, her parametre için yalnızca üç olası değerle çalışır:

  • -1 (negatif)
  • 0 (nötr)
  • 1 (pozitif)

Bu, her parametre için yaklaşık 1.58 bitlik bir depolama gereksinimine yol açar, bu nedenle BitNet b1.58 adı verilir. Parametre bit genişliğinin bu radikal azaltılması, çoğu kayan nokta çarpmanın basit toplama ve çıkarmalarla değiştirilmesiyle birlikte önemli bir bellek kullanımı ve hesaplama karmaşıklığı azaltmasına yol açar.

Matematiksel Temel

1 bitlik kuantizasyon, aşağıdaki adımlarla ağırlıkları ve aktivasyonları ternary temsiline dönüştürmeyi içerir:

1. Ağırlık Binarizasyonu

Ağırlıkları ikileştirmek, onları ortalama (α) etrafında merkezleme ve ternary bir temsil oluşturma anlamına gelir. Dönüşüm matematiksel olarak şöyle ifade edilir:

Wf=Sign(Wα)

Burada:

  • W orijinal ağırlık matrisidir.
  • α ağırlıkların ortalamasıdır.
  • Sign(x) x > 0 ise +1 ve aksi takdirde -1 döndürür.

2. Aktivasyon Kuantizasyonu

Aktivasyonları kuantize etmek, girişlerin belirli bir bit genişliğine sıkıştırılmasını sağlar:

Burada:

  • Qb = 2(b−1)2^{(b-1)} b bit genişliği için maksimum kuantizasyon seviyesidir.
  • γ x‘nin mutlak değerinin maksimumudur ( ∣∣x∣∣∞ olarak gösterilir).
  • ε hesaplamalar sırasında taşmayı önlemek için küçük bir sayıdır.

3. BitLinear Operasyon

BitLinear katmanı geleneksel matris çarpımlarını basitleştirilmiş bir işlemle değiştirir:

y=Wf×x^e×(Qbβγ)

Burada:

  • β yakınsama hatalarını en aza indirmek için kullanılan bir ölçekleme faktörüdür.
  • γ aktivasyonları ölçeklendirir.
  • Q_b kuantizasyon faktörüdür.

Bu dönüşüm, model performansını korurken verimli hesaplamaları sağlar.

Performans Sonuçları

Bellek Verimliliği

Üçlü ağırlık sistemi, bellek gereksinimlerini önemli ölçüde azaltır:

  • Geleneksel LLM’ler: Her ağırlık için 16 bit
  • BitNet.cpp: Her ağırlık için 1.58 bit

Bu azalma, geleneksel 16 bitlik modellere kıyasla yaklaşık %90 oranında bellek tasarrufuna yol açar, bu da daha büyük modellerin aynı donanım kısıtlamaları içinde sığmasını sağlar.

Enerji Verimliliği

Çıkarım Hızı, Enerji Verimliliği (Apple M2)

 

Çıkarım Hızı: Her İki CPU'da Daha Hızlı

Çıkarım Hızı, Enerji Verimliliği (i7-13700H)

1. Çıkarım Hızı: Her İki CPU’da Daha Hızlı

Çıkarım hızı, saniye başına işlenen token sayısı olarak temsil edilir. İşte gözlemlerin bir özeti:

  • Apple M2 Ultra’da: BitNet.cpp, 30B’lik daha büyük modeller için Llama.cpp’ye kıyasla %5.07’lik bir hız artışı sağlar ve 125M’lik bir model için saniyede 593.43 token gibi bir zirve hızı sağlar, bu da %1.37’lik bir hız artışıdır. 3.8B ve 7B gibi daha büyük modeller için, BitNet.cpp 84.77 token/saniye’nin üzerinde bir hızda kalır, bu da ölçek boyunca verimliliğini gösterir.
  • Intel i7-13700H’de: BitNet.cpp, daha da önemli hız iyileştirmeleri sağlar. 7B’lik model boyutunda, BitNet.cpp Llama.cpp’ye kıyasla %5.68’lik bir hız artışı sağlar. 125M’lik daha küçük modeller için, saniyede 389.08 token işler, bu da %2.37’lik bir hız artışıdır.

2. Enerji Verimliliği: Kenar Cihazlar için Oyun Değiştirici

Sağlanan grafikler ayrıca enerji maliyeti karşılaştırmalarını içerir, bu da token başına önemli bir enerji tüketimi azalması gösterir:

  • Apple M2 Ultra’da: BitNet.cpp’nin enerji tasarrufu önemli. 700M’lik model için, token başına %55.4 daha az enerji tüketir, bu da 0.314’ten 0.140’a düşer. Bu eğilim daha büyük modeller için devam eder, 70B’lik model %70.0’lik bir enerji tüketimi azalması gösterir.
  • Intel i7-13700H’de: BitNet.cpp, 700M’lik model için %71.9’luk bir enerji tasarrufu sağlar, tüketim 1.367’den 0.384’e düşer. Llama.cpp için 70B’lik modelin enerji verisi mevcut olmasa da, BitNet.cpp verimli kalır ve 70B’lik model için 17.33’lük bir enerji tüketimi gösterir.

3. İnsan Okuma Hızını Aşmak

Grafiklerden en ilginç çıkarımlardan biri, insan okuma hızı referans çizgisidir, bu da saniyede 5-7 token olarak işaretlenir. Bu kırmızı çizgi, her iki uygulamanın, özellikle BitNet.cpp’nin, en büyük modeller için bile insan okuma hızlarını rahatça aşabileceğini gösterir:

  • Apple M2 Ultra’da, BitNet.cpp tüm model boyutları için insan okuma hızını aşar, en düşük hız 70B’lik model için saniyede 8.67 token’dir.
  • Intel i7-13700H’de, 100B’lik model bile insan okuma hızının alt sınırına yakın bir hızda, saniyede 1.70 token’de çalışır, daha küçük modeller ise bu benchmark’u aşar.

Eğitim Düşünceleri

Düz Geçiş Tahmini (STE)

1 bitlik kuantizasyon, farklılıklı olmayan fonksiyonlar tanıtılmasına neden olduğundan, eğitim, Düz Geçiş Tahmini (STE) olarak bilinen özel bir tekniği içerir. Bu yaklaşım, farklılıklı olmayan noktaların üzerinden gradients akışını sağlar. İşte Python’da basitleştirilmiş bir uygulama:

class StraightThroughEstimator(Function):
@staticmethod
def forward(ctx, input):
return input.sign()

@staticmethod
def backward(ctx, grad_output):
return grad_output

Karışık Hassasiyetli Eğitim

Eğitim sırasında stabiliteyi korumak için karışık hassasiyet kullanılır:

  • Ağırlıklar ve Aktivasyonlar: 1 bitlik hassasiyete kuantize edilir.
  • Gradyan ve Optimizasyon Durumları: Daha yüksek bir hassasiyette depolanır.
  • Latent Ağırlıklar: Eğitim sırasında güncellemeleri doğru bir şekilde gerçekleştirmek için yüksek hassasiyette tutulur.

Büyük Öğrenme Oranı Stratejisi

1 bitlik modellerle ilgili benzersiz bir zorluk, küçük güncelleştirmelerin ikilileştirilmiş ağırlıkları etkilememesidir. Bunu telafi etmek için, öğrenme oranı artırılarak, geleneksel yaklaşımlara kıyasla daha hızlı yakınsama ve daha iyi optimizasyon sağlanır.

Grup Kuantizasyonu ve Normalizasyonu

BitNet.cpp, model paralelliliğini artırmak için Grup Kuantizasyonu ve Normalizasyonunu tanıtır. Ağırlıkları ve aktivasyonları tüm ağırlık matrisi için değil, birden fazla gruba (G) ayırır.
Bu gruplama, ek gruplar arası iletişim olmadan etkili paralel işleme olanak tanır, bu da büyük ölçekli model eğitimi ve çıkarımını ermöglichtir.

Uygulama Notları ve Optimizasyonlar

CPU Optimizasyonu

BitNet.cpp, zirve CPU performansını elde etmek için çeşitli düşük seviyeli optimizasyonları kullanır:

  • Vektörel Operasyonlar: Bit manipülasyonlarını verimli bir şekilde gerçekleştirmek için SIMD talimatlarını kullanır.
  • Önbellek Dostu Bellek Erişimi: Verileri önbellek kaçaklarını en aza indirmek için yapılandırır.
  • Paralel İşleme: İş yükünü etkili bir şekilde birden fazla CPU çekirdeği arasında dağıtır.

Aşağıda, BitNet.cpp’de kuantizasyon ve çıkarımın uygulanması için ana bir fonksiyonun örnek kodu verilmiştir:

def bitlinear_forward(input, weight, scale):
# Girişi absmax kuantizasyonu kullanarak kuantize edin
input_q = quantize(input)

# İkili matris çarpımı gerçekleştirin
output = binary_matmul(input_q, weight)

# Çıktıyı orijinal hassasiyete ölçekleyin
return output * scale

def quantize(x):
# Absmax kuantizasyonu gerçekleştirin
scale = torch.max(torch.abs(x))
return torch.clamp(x / scale, -1, 1) * scale

Desteklenen Modeller

BitNet.cpp’nin mevcut sürümü, Hugging Face’de bulunan aşağıdaki 1 bitlik LLM’leri destekler:

  • bitnet_b1_58-large (0.7B parametre)
  • bitnet_b1_58-3B (3.3B parametre)
  • Llama3-8B-1.58-100B-tokens (8.0B parametre)

Bu modeller, çerçevenin çıkarım yeteneklerini göstermek için halka açık olarak sunulur. Resmi olarak Microsoft tarafından eğitilmemiş veya yayınlanmamış olsalar da, çerçevenin esnekliğini gösterirler.

Kurulum Kılavuzu

BitNet.cpp ile çalışmaya başlamak için aşağıdaki adımları takip edin:

Ön Koşullar

  1. Python >= 3.9
  2. CMake >= 3.22
  3. Clang >= 18
  4. Conda (yüksek olarak önerilir)

Windows kullanıcıları için, Visual Studio aşağıdaki bileşenlerle birlikte kurulmalıdır:

  • Masaüstü Geliştirme ile C++
  • Windows için C++-CMake Araçları
  • Windows için Git
  • Windows için C++-Clang Derleyici
  • MS-Build Desteği için LLVM Araç Seti (Clang)

Debian/Ubuntu kullanıcıları için otomatik kurulum betiği mevcuttur:

bash -c "$(wget -O - https://apt.llvm.org/llvm.sh)"

Adım Adım Kurulum

  1. Depoyu Klonlayın:
    git clone --recursive https://github.com/microsoft/BitNet.git

    cd BitNet
  2. Bağımlılıkları Kurun:
    # Yeni bir Conda ortamı oluşturun (önerilir)
    conda create -n bitnet-cpp python=3.9
    conda activate bitnet-cpp


    pip install -r requirements.txt
  3. Proje Oluşturun ve Hazırlayın: Hugging Face’den doğrudan bir model indirebilir ve kuantize edilmiş formata dönüştürebilirsiniz:
    python setup_env.py --hf-repo HF1BitLLM/Llama3-8B-1.58-100B-tokens -q i2_s

    Alternatif olarak, modeli manuel olarak indirebilir ve dönüştürebilirsiniz:

    huggingface-cli download HF1BitLLM/Llama3-8B-1.58-100B-tokens --local-dir models/Llama3-8B-1.58-100B-tokens

    python setup_env.py -md models/Llama3-8B-1.58-100B-tokens -q i2_s

BitNet.cpp ile Çıkarım Çalıştırma

Çıkarım çalıştırmak için aşağıdaki komutu kullanın:

python run_inference.py -m models/Llama3-8B-1.58-100B-tokens/ggml-model-i2_s.gguf -p "Sandra mutfağa gitti. Sandra nerede?" -n 6 -temp 0.7

Açıklama:

  • -m model dosyasının yolunu belirtir.
  • -p girdi metnini tanımlar.
  • -n tahmin edilecek token sayısını ayarlar.
  • -temp çıkarım sırasında örnek alma rastgeleliğini (sıcaklık) ayarlar.

Çıktı Örneği

Sandra mutfağa gitti. Sandra nerede?

Cevap: Sandra mutfağındadır.

BitNet.cpp’nin Teknik Ayrıntıları

BitLinear Katmanı

BitNet.cpp, standart matris çarpımlarını BitLinear operasyonlarıyla değiştiren değiştirilmiş bir Transformer mimarisini uygular. Bu yaklaşım, ağırlıkları sıfıra merkezler ve hataları en aza indirmek için ölçekleme faktörünü kullanır. Ana dönüşüm fonksiyonu şöyle görünür:

# 1 bitlik ağırlıklar için ikileştirme fonksiyonu
def binarize_weights(W):
alpha = W.mean()
W_binarized = np.sign(W - alpha)
return W_binarized

Merkezlenmiş ağırlıkların ve ölçekleme faktörünün birleşimi, kuantizasyon hatasının minimumda kalmasını sağlar, bu da performansı korur.

Endüstri Etkisi

BitNet.cpp, LLM’lerin dağıtımı için önemli sonuçlar doğurabilir:

  • Erişilebilirlik: LLM’lerin standart cihazlarda çalışmasına olanak tanır, güçlü AI’ye erişimi demokratikleştirir.
  • Maliyet Etkinliği: Pahalı GPU’lere olan ihtiyacı azaltır, benimsemeyi daha erişilebilir hale getirir.
  • Enerji Verimliliği: CPU tabanlı çıkarım sayesinde enerji tasarrufu sağlar.
  • Yenilik: Bulut bağımlılığı olmadan gerçek zamanlı dil çevirisi, ses asistanları ve gizlilik odaklı uygulamalar gibi cihazda AI uygulamaları için yeni olanaklar sunar.

Zorluklar ve Gelecek Yönler

1 bitlik LLM’ler vaat edildiği halde, çeşitli zorluklar vẫn mevcuttur. Bu zorluklar arasında çeşitli görevler için güçlü 1 bitlik modeller geliştirmek, 1 bitlik hesaplama için donanımı optimize etmek ve geliştiricileri bu yeni paradigmayı benimsemeye teşvik etmek yer alır. Ayrıca, 1 bitlik kuantizasyonu görüntüleme veya ses görevleri için keşfetmek gelecekteki bir yönü temsil eder.

Sonuç

Microsoft’un BitNet.cpp’yi piyasaya sürmesi önemli bir adımdır. 1 bitlik LLM’lerin standart CPU’larda verimli bir şekilde çalışmasını sağlayarak, AI’nin erişilebilirliğini ve sürdürülebilirliğini sağlar. Bu çerçeve, daha taşınabilir ve maliyet etkin LLM’ler için sahneyi hazırlar, cihazda AI’nin sınırlarını genişletir.

Son beş yıldır Makine Öğrenimi ve Derin Öğrenme dünyasına kendimi daldırmış bulunuyorum. Tutkum ve uzmanlığım, özellikle AI/ML odaklı 50'den fazla çeşitli yazılım mühendisliği projesine katkıda bulunmama yol açtı. Süregelen meraklılığım ayrıca beni Doğal Dil İşleme'ye doğru çekti, bu alanda daha fazla keşfetmeye hevesliyim.