2 puan yazan GN⁺ 2024-10-10 | 1 yorum | WhatsApp'ta paylaş
  • L-Mul, LLM'lerin yüksek enerji maliyetinin kayan noktalı çarpma işlemlerinden kaynaklandığına odaklanan ve çarpmayı tamsayı toplama ile yaklaşık hesaplamayı amaçlayan lineer karmaşıklıklı bir çarpma algoritmasıdır
  • fp32 çarpma, int32 toplamadan 37 kat daha fazla enerji tükettiği için, L-Mul tensor işleme donanımına uygulandığında eleman bazlı kayan noktalı tensor çarpım enerjisinin %95'ini, dot product enerjisinin ise %80'ini azaltma potansiyeline sahiptir
  • Hesaplama yöntemi, mantissa çarpımı ile yuvarlamayı atlar; işareti XOR ile işler ve kalan bitleri x[1:] + y[1:] - offset biçimindeki toplama ile kurar
  • Deneylerde 4-bit mantissalı L-Mul, float8 e4m3 çarpımıyla benzer hassasiyet gösterdi; 3-bit mantissalı L-Mul ise float8 e5m2'den daha iyi sonuç verdi
  • Önceden eğitilmiş LLM'lere ek eğitim olmadan L-Mul attention uygulandığında doğal dil çıkarımı görevlerinde ortalama kayıp %0.07 oldu; görsel görevlerde ise ortalama doğruluk %0.12 arttı

L-Mul'un hedeflediği darboğaz

  • Büyük sinir ağları hesaplamanın önemli bir bölümünü kayan noktalı tensor çarpımı için harcar ve bu işlem, toplamaya göre daha yüksek enerji maliyetine sahiptir
  • L-Mul, kayan noktalı sayıların çarpımını tamsayı toplama ile yaklaşık hesaplayan bir linear-complexity multiplication algoritmasıdır
  • Uygulama alanı birden fazla hesaplama adımını kapsar
    • attention mekanizması içindeki çarpımlar
    • matris çarpımı
    • eleman bazlı çarpım
  • Transformer tabanlı LLM'lerde attention, giriş bağlam uzunluğu N için O(N²) karmaşıklığa sahiptir ve yüksek boyutlu tensor çarpımlarıyla birlikte hesaplama verimliliğinin başlıca darboğazlarından biri haline gelir

Aritmetik işlemlere göre enerji maliyeti

  • Horowitz (2014) işlem maliyeti tablosu, toplama ile çarpma arasındaki enerji farkını doğrudan gösterir
    • int8 toplama: 0.03 pJ
    • int32 toplama: 0.1 pJ
    • fp16 toplama: 0.4 pJ
    • fp32 toplama: 0.9 pJ
    • int8 çarpma: 0.2 pJ
    • int32 çarpma: 3.1 pJ
    • fp16 çarpma: 1.1 pJ
    • fp32 çarpma: 3.7 pJ
  • fp32 çarpma, fp32 toplamadan 4 kat, int32 toplamadan ise 37 kat daha fazla enerji kullanır
  • PyTorch'ta tensor çarpımı sonuç biriktirmenin varsayılan hassasiyeti fp32 olarak ayarlanmıştır
  • I/O ve kontrol işlemleri hariç tutulduğunda, fp32 çarpmanın int32 toplama ile yaklaşık hesaplanması enerji kullanımını yaklaşık 1/37 ≈ 2.7% düzeyine indirir
  • Biriktirme hassasiyeti fp16'ya düşürüldüğünde bile tamsayı toplama, kayan noktalı çarpma enerjisinin yalnızca yaklaşık %4.7'sini kullanır

L-Mul'un hesaplama yöntemi

  • Genel kayan noktalı çarpma, iki sayı x, y için şu biçimdedir
    • (1 + xm) · 2^xe · (1 + ym) · 2^ye
    • sonuç (1 + xm + ym + xm · ym) · 2^(xe+ye) ve işaret XOR'undan oluşur
  • Hesaplamadaki darboğaz, m bitlik mantissa için O(m²) mantissa çarpımıdır
  • L-Mul, xm · ym terimini kaldırır ve şu biçimde yaklaşıklar
    • (1 + xm + ym + 2^-l(m)) · 2^(xe+ye)
  • l(m), mantissa bit sayısına göre değişir
    • m ≤ 3 ise m
    • m = 4 ise ayrı bir değer
    • m > 4 ise ayrı bir değer
  • Bit düzeyindeki uygulama daha basit bir ifadeye indirgenir
    • işaret biti: x[0] ⊕ y[0]
    • kalan bitler: x[1:] + y[1:] - offset
  • Kayan nokta biçimi 1 + xm ifadesini örtük olarak işlediğinden, L-Mul gerçek uygulamada tek bir adder ile kurulabilir
  • Mantissa toplamı 2'yi aşarsa carry otomatik olarak exponent'a aktarılır
  • Mevcut kayan noktalı çarpımın gerektirdiği mantissa çarpımı ve yuvarlama adımları atlanarak hesaplama miktarı azaltılır

Transformer attention'a uygulama

  • L-Mul tabanlı attention, Q, K, V oluşturduktan sonra attention hesaplamasındaki matris çarpımını L-matmul ile değiştirir
  • Hesaplama biçimi şöyledir
    • K = H · Wk
    • Q = H · Wq
    • V = H · Wv
    • A = softmax[L-matmul(Q, Kᵀ) / √d]
    • H′ = L-matmul(A, H)
  • L-matmul, standart kayan noktalı çarpımların tamamını L-Mul ile gerçekleştiren bir matris çarpımıdır
  • Bu yapı, kayan noktalı çarpımları tamsayı toplamaya çevirerek hesaplama kaynağı kullanımını düşürür

Hassasiyet·karmaşıklık analizi ve deney sonuçları

  • Hassasiyet analizi, L-Mul'un kayan noktalı sayıların fraction kısmını kaç bite kadar korumaya eşdeğer olduğunu değerlendirecek şekilde kurulmuştur
  • Uniform dağılımlı operand analizinde L-Mul, fp8 e5m2'den daha doğrudur
  • Önceden eğitilmiş 5 LLM'in birleşik weight dağılımlarına dayanan pratik analizde, 5-bit mantissalı operandlarda fp8 e4m3'ten daha yüksek hassasiyet elde edilebilir
  • Deney sonuçları teorik hata tahminleriyle uyumludur
    • 4-bit mantissalı L-Mul, float8 e4m3 çarpımıyla benzer hassasiyet
    • 3-bit mantissalı L-Mul, float8 e5m2'den daha yüksek hassasiyet
  • Önceden eğitilmiş LLM'lerde standart attention uygulaması doğrudan L-Mul attention ile değiştirildi ve ek eğitim kullanılmadı
    • commonsense, structured reasoning, language understanding görevlerinde ortalama performans kaybı: %0.07
    • visual question answering, object hallucination, free-form visual instruction görevlerinde ortalama doğruluk değişimi: %0.12 artış
  • Fine-tuning deneylerinde attention, linear transformation ve eleman bazlı çarpımdaki tüm çarpımları 3-bit mantissalı L-Mul ile değiştiren model, float8 e4m3 biriktirme hassasiyeti kullanan standart modelle benzer performans verdi
  • Kapı düzeyinde hesaplama miktarı tahmininde standart çarpım şu düzeydedir
    • fp16 çarpma: yaklaşık 584
    • fp8 e4m3 çarpma: yaklaşık 325
    • fp8 e5m2 çarpma: yaklaşık 296
  • L-Mul'un kapı düzeyindeki hesaplama miktarı tahmini daha düşüktür
    • fp16 L-Mul: yaklaşık 256
    • fp8 L-Mul: yaklaşık 157
  • GPU'larda L-Mul'un yerel bir uygulaması bulunmadığından verimliliğinden tam olarak yararlanmak zordur; L-Mul tabanlı modellerin, özel mimari tasarımın entegre edildiği cihazlarda eğitilmesi ve barındırılması önerilir
  • Bu teknoloji patent pending durumundadır

1 yorum

 
GN⁺ 2024-10-10
Hacker News yorumları
  • Eskiden Intel CPU'larda kayan nokta hesaplama pahalıyken, programcıların bunu tamsayı hileleriyle aştığı çeşitli yöntemler olduğunu hatırlıyorum.
    Forth ile tanınan Chuck Moore, ara hesaplamalarda 1.6 × 4.1 gibi değerleri 16 × 41 gibi tamsayı olarak işleyip, çıktıda ondalık noktayı tekrar “doğru konuma” koyma yöntemini göstermişti. Kayan nokta değerinin aralığı 10 ile çarpıldığında bile 65536'yı aşmıyorsa 16 bit tamsayılarla da iyi çalışıyordu ve 10 bit hassasiyetli analog değerleri saniyede birkaç kez hızlıca hesaplaması gereken gömülü çiplere çok uygundu.
    Microsoft Streets and Trips üzerinde çalışmış bir Microsoft mühendisiyle de uzun zaman önce konuşmuştum; onlar da normalde kayan nokta olacak sayıları ve hesaplamaları, yalnızca gerçekten gereken hassasiyeti içeren bir tür paketlenmiş tamsayı biçimine koyarak o dönemin CPU'larında daha hızlı çalıştırdıklarını ve CD-ROM'a sığacak şekilde daha kolay sıkıştırdıklarını söylemişti. Ekran görüntüleri https://archive.org/details/3135521376_qq_CD1 adresinde.

    • Buna sabit nokta aritmetiği denir; daha fazla programcının bilmesini istediğim harika bir yöntemdir.
      Düzgün yazılmış finansla ilgili kodların bunu kullanması gerekir, ama gördüğüm finans sektöründe ana bilgisayar çalıştıranlar dışında pek yaygın değildi. İlginç şekilde sabit nokta aritmetiğini FreeType, GDI, WPF, WARP (D3D11 referans rasterleştiricisi) gibi yazılım rasterleştiricilerinde çok daha fazla gördüm.
    • Kayan nokta yardımcı işlemcilerinin yaygın olmadığı dönemlerden bir fraktal üreticisi olan FRACTINT ile uğraştığımı hatırlıyorum. Fraktalları sabit nokta matematiğiyle hesaplayıp gösteriyordu; o zamanlar fraktalların inanılmaz havalı göründüğü bir dönemdi, herkes fraktal işine girmek istiyordu ve Nobel ödüllerinin hepsi fraktal araştırmacılarına gidiyordu.
    • Ozaki, int8 tensor core'larla fp64 matris çarpımı yapageldi.
      https://arxiv.org/html/2306.11975v4
      Gerçekten ilginç.
    • Bildiğim kadarıyla para veya finansal sayılarla uğraşmanın hâlâ en iyi yolu bu.
    • Bu özel hile sabit nokta aritmetiği olarak bilinir. Bir fonksiyonun sabit noktasıyla farklı bir kavramdır.
  • “Eleman bazlı kayan nokta tensör çarpımında enerji maliyetini potansiyel olarak %95, iç çarpımda %80 azaltabilir” türünden bir iddia; eğer konu evrişimli sinir ağları olsaydı hesaplama optimizasyonu çok daha anlamlı olurdu.
    Ama Transformer'lar hesaplama açısından hafif, bellek açısından ağır taraftadır. Darboğaz, model ağırlıklarını çekirdeklere getirme sürecidir; alıntılanan %95 ve %80 enerji tasarrufu da tüm çıkarım sürecine değil, yalnızca çarpma işlemlerine ayrı ayrı bakılan değerlerdir.

    • Prefill, tek batch'te de, çoklu batch decoding de hâlâ hesaplama ağırlıklıdır.
      “Yalnızca decoder'lı Transformer çıkarımında bellek bant genişliği darboğazdır” diye tekrarlanan söz, katı anlamda yalnızca batch boyutu 1 olan tekil batch decoding için geçerlidir. Çünkü o durumda çoğunlukla vektör-matris çarpımı yapılır.
    • Daha da kötüsü var. Enerji kazancı fp32 hesaplamayla karşılaştırılınca çıkan sonuç; oysa fp8'de çarpan gerçekten küçüktür, bu yüzden toplayıcı ve shifter enerji ve alan açısından işlem biriminin daha büyük kısmını oluşturur; bu makaledeki kazanç küçük olacaktır.
      fp8'de tahmini kapı sayısı normal bir fp8 çarpanı için 296, bu teknik için 157; yani çarpan gücündeki kazanç çok daha düşük olacaktır. Yaklaşık %50 daha makul bir tahmin ve tekrar edeyim, fp8'de iç çarpımda toplama işlemin büyük bir bölümünü oluşturur.
      Genel olarak %80 güç kazancı ve küçük doğruluk düşüşü iddia etmek epey dürüst olmayan bir izlenim veriyor. Çünkü güç kazancı yalnızca fp32 işlemler için geçerli, küçük doğruluk düşüşü ise yalnızca fp8 operatörleri için geçerli. fp32'deki doğruluk düşüşü analiz edilmemiş, fp8 iç çarpımda tasarruf edilen güç de sunulmamış.
    • fp8 yeterince küçük; çarpma, daha büyük kayan nokta biçimlerine göre çok daha basit devrelerle yapılabilir gibi görünüyor.
      fp4 gibi daha küçük biçimler için doğrudan lookup table bile kullanılabilir; bu da fiilen bir ölçüde standartlaşmış bir quantization yöntemine yaklaşır.
    • Transformer'lar için gerçekten iyi mimari, bellek ve hesaplamanın birlikte yerleştirilmesi gibi görünüyor.
    • Bu yalnızca tek kullanıcı veya hafif çıkarım için doğru bir hikâye. Eğitim ve batch çıkarımda hızla hesaplama darboğazına dönüşebilir.
  • [2023] GradIEEEnt half decent: The hidden power of imprecise lines
    http://tom7.org/grad/murphy2023grad.pdf
    Videosu da var: https://www.youtube.com/watch?v=Ae9EKCyI1xU

  • Okumadım ama bu, bir biçimde logaritma tablosu kullanmak gibi değil mi diye düşünüyorum.
    Küçümsemek için söylemiyorum; mantık kapıları gibi daha temel bir seviyede logaritmaları tam anlamadığımı hissettiğim için soruyorum. Çarpmayı tablo araması ve toplamaya çevirebiliyorsak, tersine zor toplama ve kolay çarpma sunan devreler ya da bu tür ödünleşimlerin kombinasyonları da olmalı gibi geliyor.

    • Log uzayı iyidir. Çünkü çarpmayı toplamayla değiştirebilirsiniz.
      Bu kısım kolaydır ve herkes donanımda uygulayabilir. Zor kısım birikim yaparken, özellikle geniş bir aralıkta birikim yapıp log uzayında kalmaya devam etmektir.
    • Evet, logaritmik sayı sistemi böyle çalışır.
  • Makalede hata teriminin düzgün bir türetimi ve tartışması yok gibi görünüyor, bu yüzden garip geldi. Hepsi çıkarım sonuçları üzerinden dolaylı olarak ele alınmış.

    • Ben de bu makaleyi biraz tuhaf buldum. Kapı tahminlerini şema olmadan yalnızca metin açıklamalarıyla yapmak, gereken parçaları kaçırmayı çok kolaylaştırır.
      Tam kapı seviyesi açıklama olmasa bile “toplayıcı” gibi blok etiketleri olan bir şekil gerekirdi. İlk paragrafta de Vries adını görmek de güven hissine yardımcı olmadı.
  • Yöntem bölümünün dipnotunda “L-Mul tabanlı modellerin, özel mimari tasarımla entegre edilmiş cihazlarda eğitilmesi ve barındırılması önerilir. Patent başvurusu sürüyor” deniyor.

  • Hesaplama miktarı azalacak gibi görünüyor ama değer başına hâlâ 8 bit kullandığı için çıkarım çalıştırmak için gereken bellek ihtiyacını azaltmıyor.
    Bu yüzden modeli çıkarım amaçları için daha erişilebilir hâle getirdiğini söylemek zor. Bu depolama biçimi eğitim için de uygunsa potansiyel olarak ilginç bir kullanım alanı olabilir.

    • Aslında hassasiyet ve aralık açısından ağırlık başına yaklaşık 0,5 bit daha az verimli, ama makale bunu hiç vurgulamıyor.
  • Baytları taşımak, hesaplamadan 10 kattan fazla enerji harcar. Hesaplama verimliliği insanların sandığı kadar büyük bir sorun değil.
    Şu anda hesaplama sadece yanlış yerde; en azından iç çarpımdaki ilk toplama aşamasında bellek veri yolunu baypas edip bellek hücresinin hemen yanında olmalı.

    • Yine de batarya kısıtı olan cihazlarda faydalı olabilir, değil mi?
  • Deneyimime göre sabit nokta matematiğinin gerçek sihirbazları 8 bit ve 16 bit video oyunu tasarımcılarıydı.
    Yaptıkları optimizasyonlar hayranlık vericiydi; örneğin ilk uçuş simülatörlerini ve birinci şahıs nişancı oyunlarını yapmak için 3B matris matematiğini gerçek zamanlı hesaplayabilir hâle getirdiler.

    • Açıları 2π = 256 olarak yeniden tanımlamak oldukça zekice bir hileydi.