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

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.
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:
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
- Python >= 3.9
- CMake >= 3.22
- Clang >= 18
- 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:
Adım Adım Kurulum
- Depoyu Klonlayın:
- Bağımlılıkları Kurun:
- Proje Oluşturun ve Hazırlayın: Hugging Face’den doğrudan bir model indirebilir ve kuantize edilmiş formata dönüştürebilirsiniz:
Alternatif olarak, modeli manuel olarak indirebilir ve dönüştürebilirsiniz:
BitNet.cpp ile Çıkarım Çalıştırma
Çıkarım çalıştırmak için aşağıdaki komutu kullanın:
Açıklama:
-mmodel dosyasının yolunu belirtir.-pgirdi metnini tanımlar.-ntahmin edilecek token sayısını ayarlar.-tempçıkarım sırasında örnek alma rastgeleliğini (sıcaklık) ayarlar.
Çıktı Örneği
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.














