Bu blog yazısında, FP8 ölçekleme stratejilerini, yani tensor başına ölçekleme, gecikmeli ve mevcut ölçekleme ve blok başına ölçekleme (Blackwell destekli MXFP8 formatı dahil) detaylı bir şekilde inceleyeceğiz. Her birinin, düşük hassasiyetli eğitiminin sayısal kararlılığını ve doğruluğunu korumadaki önemini açıklayacağız. Bu yaklaşımları anlamak, FP8 iş akışlarınız için doğru tarifleri seçmenize yardımcı olacaktır.
Bu yazıda, FP8 eğitiminin pratik gerçeklerine ve NVIDIA Nemotron deneyleri üzerine odaklanacağız. Tensor başına ve gecikmeli ölçeklemenin neden gerekli olduğunu, nerelerde eksik kaldıklarını ve blok başına alt-kanal ölçekleme gibi gelişmiş tariflerin, büyük modeller için stabil ve verimli FP8 eğitimi nasıl açığa çıkarabileceğini keşfedeceğiz.
Önceki bir yazımızda, FP8 hassasiyetini tanıttık ve E4M3 ve E5M2 gibi iki ana formatını, daha yaygın kullanılan BF16 gibi türlerle karşıladık.
Tensor Başına Ölçekleme
Tensor başına ölçekleme, her tensor için (ağırlıklar, aktivasyonlar veya gradyanlar gibi) benzersiz bir ölçekleme faktörü atayarak düşük hassasiyetli FP8 eğitiminde kritik bir stratejidir. Bu yöntem, FP8’in dar dinamik aralığının, farklı tensorlerde bulunan çeşitli değer dağılımlarını yönetememesi nedeniyle son derece gereklidir. Her bir tensorun istatistiklerine uyum sağlayarak, tensor başına ölçekleme sayısal kararsızlığı önlemeye yardımcı olur ve daha doğru, stabil bir eğitim süreci sunar.
Gecikmeli ölçekleme ve mevcut ölçekleme, tensor başına ölçekleme yöntemleri arasında yer alır. Her iki yöntem de bireysel tensor düzeyinde ölçekleme faktörleri ayarlamak için farklı stratejiler sunar ve FP8’in kendine has gereksinimlerine cevap verir.
Gecikmeli Ölçekleme
Gecikmeli ölçekleme, her tensor için ölçekleme faktörünü, sadece mevcut batch’e değil, önceki iterasyonlar boyunca gözlemlenen maksimum mutlak değerlere (amax) göre hesaplayan pratik bir FP8 ölçekleme stratejisidir. Bu tarihsel temelli yaklaşım, uç değerleri düzleştirir ve ani ölçek değişikliklerinin eğitim sürecini destabilize etme riskini azaltır.
Gecikmeli ölçekleme, yeni bir ölçekleme faktörü belirlendiğinde tarihçeyi gözden geçirir ve bu geçmişe göre bir değer seçer. Bu, ani veri değerlerindeki ani değişimlerin önüne geçerek eğitim sürecini daha stabil ve model performansını iyileştirici bir hale getirir. Ancak, gecikmeli ölçeklemenin etkinliği, tensor değerlerinin istatistiksel dağılımının zamanla stabil kalacağı varsayımına bağlıdır; aksi takdirde, uç değerler amax tarihini domine ederek, alt-ya da üst- akışa sebep olur ve eğitim sürecini tehlikeye atabilir.
Mevcut Ölçekleme
Mevcut tensor ölçekleme ise, gecikmeli yöntemin aksine, anlık uygunluğu öncelikli kılan bir yöntemdir. Bu strateji, her tensor için ölçekleme faktörünü, geçerli ileri veya geri geçişteki istatistiksel özelliklere dayanarak belirler.
Mevcut ölçekleme, her batch içerisinde her tensorun en büyük mutlak değerini (amax) ölçer. Bu ölçüm, önceki batchlere dair bir tarih olmaksızın, gerçekle uyumlu olarak yapılır. Ölçekleme faktörü, bu amax’in FP8 aralığında kalması için ayarlanır; böylece her tensor, mevcut adımda FP8’in tam olarak sunabileceği doğruluğu kullanmış olur. Geçerli ölçeklemenin avantajları şunlardır:
- Anlık uyum: Mevcut ölçekleme, veri dağılımındaki, öğrenme oranındaki veya model mimarisindeki anlık değişikliklere uyum sağlar. Bu canlı yanıt verebilirlik, ölçeklemede bir gecikme veya uyumsuzluk olasılığını ortadan kaldırır.
- Basitlik ve verimlilik: Karmaşık tarihsel veriler veya izleme mekanizmalarının eksikliği, uygulamayı basitleştirir ve hesaplama ile bellek üstünde yükü azaltır. Böylece kaynaklar direkt olarak model eğitimine odaklanır.
- Dayanıklılık: Anlık ayarlamalar, mevcut batch içerisindeki uç değerlerden daha az etkilenerek, kararlı bir eğitim deneyimi sunar.
Blok Başına Ölçekleme
Tensor başına ölçekleme yöntemleri, FP8 eğitiminde temel bir yaklaşım sunarken, tek bir tensor içerisindeki blok seviyesi değişkenlik ile başa çıkarken sınırlamalarla karşılaşır. Farklı bölgelerde veya kesitlerde, farklı sayısal aralıklar ve istatistiksel davranışlar görülebilir. Örneğin, büyük transformer modellerinde, belirli dikkat başlıkları farklı büyüklükler sergileyebilir. Ayrıca, SwiGLU gibi gelişmiş katmanlardan gelen aktivasyonlar, yoğun küçük değer kümeleri ile nadir ama aşırı uç değerler arasında karışık bir dağılım üretir.
Tek bir ölçekleme faktörünün oldukça değişken bir tensore uygulanması, ya ince, daha düşük büyüklükteki bölgelerde hassasiyet kaybına ya da aşırı uç değerlerin kliplenmesine sebep olur. Her iki durum da eğitim stabilitesini ve model kalitesini olumsuz etkileyebilir.
Blok başına ölçekleme, her bir tensoru küçük, yönetilebilir bloklara ayırarak tam bu soruna güçlü bir çözüm sunar. Ölçekleme mekanizması, her bir bloğun yerel istatistiklerine uyum sağlarken, tek bir en uç değer yerine tüm blok için geçerli bir ölçekleme faktörü belirler. Bu sayede yüksek büyüklükteki bölgeler doğru şekilde temsil edilirken, aynı tensorde yer alan daha yaygın küçük değerlerin de kalitesi korunur.
Derin öğrenme modelleri büyüdükçe ve mimari karmaşıklıkları arttıkça, ince-granıljan, uyum sağlayan ölçekleme, FP8’in modern donanımlarda sunduğu hız ve verimliliği korumak için hayati bir hal alır.
Micro-Scaling FP8 Nedir?
Blok başına ölçekleme kavramını temel alarak, Micro-Scaling FP8 (MXFP8), NVIDIA Blackwell donanım seviyesinde, etkili ve stabil FP8 eğitimi sağlamak için bir çözüm sunar. MXFP8, belirli bir MX veri formatı standardı ile uyumlu olup, çeşitli düşük hassasiyetli formatlarda (FP8, FP6, FP4 ve Int8) paylaşılmış ince-granüljan blok ölçekleme için genel bir çerçeve tanımlar.
Bu, üç ana bileşen ile karakterize edilir:
- Ölçek (X) veri tipi/ kodlaması: Ölçekleme faktörünün nasıl temsil edileceğini tanımlar.
- Eleman (P_i) veri tipi/ kodlaması: Her blok içerisindeki sayısal elemanların veri tipini belirtir.
- Ölçekleme blok boyutu (k): Ortak bir ölçek faktörünü paylaşan skalar eleman sayısını belirler.
MXFP8 Nasıl Çalışır?
MXFP8, Blackwell mimarisi için optimize edilmiş belirli özelliklerle blok bazında ölçekleme uygulamaktadır:
- Blok bazında bölümleme: Tensors sistematik olarak 32 ardışık değer içeren bloklara ayrılır. Bu, NVIDIA Blackwell Tensor Cores’un tasarımıyla uyumludur.
- Yalnızca üstel ölçekleme faktörleri: Her 32 değerlikli blok, eksen olarak depolanan ve 8 bit üs, 0 bit mantisalı (E8M0 biçiminde) özel bir ölçekleme faktörüne atanır. Bu, donanım uygulamasını optimize eder ve derin öğrenme için faydalı sayısal özellikleri korur.
- Transpoze işlemleri için donanım tekrar miktarı: Ölçekleme belirli bir yönde (örneğin, satır veya sütun yönünde) gerçekleştiğinden, bir MXFP8 tensörü ile transpozu sayısal olarak eşdeğer değildir. İşlemler tensor ve transpozu gerektirdiğinde, Blackwell birimleri yüksek hassasiyetli girdi üzerinde otomatik yeniden kantitatif işlem gerçekleştirir. Bu, nitelikle çarptığında karşılaşılabilecek hata birikimini önler.
Bu yenilikçi blok bazında ölçekleme yöntemi, MXFP8’in tek bir tensor içerisindeki büyüklük değişkenliklerini ele almasına olanak tanır. Yüksek ve düşük büyüklükteki bölgeleri koruyarak, FP8’in dinamik aralığını en üst düzeye çıkartır ve kantitatif hataları en aza indirir. Böylece, büyük modeller için sadece hızlı bir eğitim sağlamakla kalmaz, aynı zamanda doğruluğu artırır.
Blok Ölçekleme
Tensor başına ölçekleme yöntemlerinden ve donanım spesifik blok ölçekleme tekniklerinden öte, genel FP8 blok ölçekleme değiştirilebilir ve esnek bir yaklaşım sunar. Bu teknik, geniş bir model mimarisi ve donanım gereksinimleri yelpazesine uyum gösterir.
Kullanıcılar, belirli şekiller (örneğin, 1×128 veya 128×128) belirleyerek farklı tensor yapılarına uygun ölçeklemeyi optimize edebilirler. Bu bloklara özgü ölçekleme faktörleri genellikle FP32 formatında depolanır ve sayısal özellikler sunar. Bu yapılandırılabilir granüljanlık, model bileşenlerinin benzersiz istatistiksel davranışlarına daha hassas bir uyum sağlamayı mümkün kılar. Böylece, FP8 eğitimi, çeşitli iş yükleri arasında optimize edilir.
Blok Ölçekleme Nasıl Çalışır?
FP8 blok ölçeklemenin temel prensibi, ölçekleme faktörünü yerel veri özelliklerine uyumlu hale getirerek hassasiyeti artırmaktır. Tek bir ölçekleme faktörünü tek bir tensore uygulamak yerine, blok ölçekleme her bir tensoru daha küçük, ayrık parçalar halinde bölerek işlemi gerçekleştirir. Bu tanımlı bloklar içerisindeki tüm değerler, ayrı ayrı depolanan bir ölçekleme faktörünü paylaşır.
Kantitatif dönüşüm, elemanları blok ölçeklemesinin faktörü ile çarparak FP8’e dönüştürür; de-kantitatif işlem ise FP8 değerlerini tekrar asıl değerlerine döndürerek aynı faktörle çarpar. Blok boyutunun seçimi oldukça önemlidir: daha küçük bloklar, ince granüljanlık sayesinde kantitatif hatayı azaltırken; daha büyük bloklar, depolama aşamasında yükü azaltır ancak gürültüyü artırabilir.
NVIDIA NeMo Çerçevesindeki Tarifler
Transformer Engine FP8 tarifleri, yüksek seviyeli yapılandırmalar aracılığıyla NVIDIA NeMo çerçevesinde kullanıma sunulmaktadır. Kullanıcılar, farklı fp8_recipe
bayrakları ile ölçekleme stratejilerini seçebilir, genellikle BF16 ile karışık hassasiyetli eğitim için bir arada kullanılırlar.
- Gecikmeli Ölçekleme:
fp8_recipe = "delayed"
- Tensor Başına Mevcut Ölçekleme:
fp8_recipe = "tensorwise"
- MXFP8:
fp8_recipe = "mxfp8"
- Genel Blok Ölçekleme:
fp8_recipe = "blockwise"
Sonuç
FP8 eğitimi, büyük ölçekli derin öğrenme için pratik ve verimli bir çözümdür. FP8’in tam potansiyelini açığa çıkarmak, seçilen ve uygulanan ölçekleme stratejilerine bağlıdır. FP8 tarifleri ile ilgili daha fazla bilgi edinmek için bu bağlantıyı ziyaret edin ve pratik FP8 eğitim yapılandırmaları ve kodlarınızla başlayın.