Büyük modellerin eğitimi ve akıl yürütmesi genellikle doğruluk kavramını içerir ve birçok tür vardır; ayrıca aynı doğruluk seviyesinde farklı formatlara ayrılırlar. Ayrıca, pratik kullanım senaryolarında çoklu hassasiyet ve karışık hassasiyet kavramları da vardır.
Yaygın hassasiyet
Kayan nokta doğruluğu: çift hassasiyet (FP64), tek kesinlik (FP32, TF32), yarım hassasiyet (FP16, BF16), 8 bit doğruluk (FP8), 4 bit doğruluk (FP4, NF4) Nicel doğruluğu: INT8, INT4 (aynı zamanda INT3/INT5/INT6)
Bir kayan nokta sayı üç bölümden oluşur: işaret, üstel ve mantissa bitleri. Üstel bit ne kadar büyükse, temsil edilebilecek sayılar aralığı da o kadar geniştir. Mantissa rakamı ne kadar büyükse, sayının doğruluğu o kadar yüksek olur.
Tablo bunu şu şekilde özetliyor
| biçim | sembol biti | Üstel bit | ondalık basamak | Toplam rakamlar | | FP64 | 1 | 11 | 52 | 64 | | FP32 | 1 | 8 | 23 | 32 | | TF32 | 1 | 8 | 10 | 19 | | BF16 | 1 | 8 | 7 | 16 | | FP16 | 1 | 5 | 10 | 16 | | FP8 E4M3 | 1 | 4 | 3 | 8 | | FP8 E5M2 | 1 | 5 | 2 | 8 | | FP4 | 1 | 2 | 1 | 4 |
FP32: 32 bitlik kayan nokta sayısı, veri başına 4 bayt TF32: 19 bitlik kayan nokta sayısı, her veri 2 bayttır FP16: 16 bitlik kayan nokta sayısı, veri başına 2 bayt BF16: 16 bitlik kayan nokta sayısı, her veri 2 bayttır Int8: 8 bitlik tam sayı, her veri 1 bayt tutar Int4: 4 bitlik tam sayılar, her veri 0.5 bayttır
Neden bu kadar hassas
Maliyet ve doğruluk nedeniyle. Hepimiz biliyoruz ki yüksek doğruluk kesinlikle daha doğrudur, ancak aynı zamanda daha yüksek hesaplama ve depolama maliyetleri de getirecektir. Daha düşük hassasiyet hesaplama doğruluğunu azaltır ancak hesaplama verimliliğini ve performansını artırabilir. Yani farklı durumlarda en uygun olanı seçmenize olanak tanır. Çift hassasiyet, tek hassasiyetli ifadeden daha doğrudur, ancak iki kat fazla depolama gerektirir ve hesaplaması daha fazla zaman alır.
Büyük modellerin neden nicel edilmesi gerekiyor?
1. Bellek kullanımını azaltmak Büyük modeller genellikle ağırlıkları ve aktivasyon değerlerini temsil etmek için 32 bitlik kayan nokta sayıları (FP32) veya 16 bitlik kayan nokta sayıları (FP16) kullanır. Kuantizasyon sayesinde, bu yüksek hassasiyetli değerler daha düşük hassasiyetli temsillere (örneğin, 8 bitlik tam sayılar, INT8) dönüştürülebilir ve modelin depolama alanını önemli ölçüde azaltır. Bu, mobil cihazlar, gömülü sistemler gibi kaynakları sınırlı cihazlarda dağıtım için önemlidir.
2. Akıl yürütme hızını hızlandırın Kuantize modeller donanım üzerinde daha verimli çalışabilir. Birçok modern donanım (GPU, TPU, NPU vb.) düşük hassasiyetli hesaplama için özel optimizasyon desteğine sahiptir ve bu da daha hızlı kuantizasyon işlemlerini sağlar. Ayrıca, düşük hassasiyetli hesaplamalar genellikle daha az bit işlemi gerektirir, bu da hesaplama karmaşıklığını azaltır ve böylece çıkarımı hızlandırır.
3. Güç tüketimini azaltın Kuantize model, sadece hesaplama kaynaklarına olan ihtiyacı azaltmakla kalmaz, aynı zamanda güç tüketimini de azaltır. Bu özellikle, düşük güç tüketiminin daha uzun pil ömrü anlamına geldiği akıllı telefonlar, IoT cihazları gibi pil ile çalışan cihazlar için önemlidir.
4. Kolay açılan kenar cihazlar Birçok büyük model başlangıçta bulutta eğitilip dağıtıldı, ancak kenar bilişimin gelişmesiyle birlikte, giderek daha fazla uygulama senaryosu modellerin kenar cihazlarda dağıtılmasını gerektiriyor. Sınırlı hesaplama gücü ve kenar cihazlarda depolama kaynakları nedeniyle, kuantizasyon bu modellerin kenar cihazlarda daha verimli çalışmasına yardımcı olabilir.
5. Bant genişliği gereksinimlerini azaltın Dağıtık çıkarım veya model güncellemeleri sürecinde, kuantizasyon model transferi için gereken bant genişliğini azaltabilir. Bu, sınırlı ağ bant genişliğine sahip ortamlar için, örneğin uzak bölgelerdeki IoT cihazları için faydalıdır.
6. Model performansını korumak Kuantizasyon belirli bir hassasiyet kaybı getirse de, modelin orijinal performansı uygun kuantizasyon yöntemleriyle (örneğin karışık hassasiyetli kuantizasyon, eğitim sonrası kuantizasyon, nicel algı eğitimi vb.) büyük ölçüde korunabilir. Bu nedenle, pratik uygulamalarda nicelendirme performans ile verimlilik arasında iyi bir denge sağlayabilir.
Hafıza referansı
| tür | Her milyar parametrenin hafızayı işgal etmesi gerekir | | float32 | 4G | | FP16/BF16 | 2G | | int8 | 1G | | int4 | 0.5G |
FP64 (Çift Hassasiyet)
64-bit kayan nokta, genellikle IEEE 754 tarafından tanımlanan çift hassasiyetli ikili kayan nokta formatıdır ve şunları içerir:
1 haneli sembol 11 haneli indeks 52 ondalık basamak
Menzil: ~2.23e-308 ... ~1.80e308, tam 15-17 ondalık hassasiyetle.
Kullanım:
Bu format, yüksek hassasiyet gerektiren bilimsel hesaplamalar için kullanılır. Genellikle derin öğrenme hesaplamaları için kullanılmaz. Yazılım desteği: Çoğu C/C++ sisteminde çift tipi temsil eder. TensorFlow (ör. tf.float64) / PyTorch (ör. torch.float64 veya torch.double) ile desteklenir. Donanım desteği: Genellikle x86 CPU'larda desteklenir. Çoğu GPU, özellikle oyun GPU'ları, RTX serisi dahil, FP64 performansında ciddi şekilde sınırlıdır (genellikle FP32 performansının 1/32'si yerine 1/2). Son zamanlarda sınırsız FP64 destekli GPU'lar arasında Tesla P40/P4 ve Quadro GP100'de GP100/100/102/104, Tesla V100/Quadro GV100/Titan V'de GV100 ve yakın zamanda açıklanan A100'de GA100 yer alıyor (ilginç bir şekilde, yeni Ampere mimarisi üçüncü nesil var) FP64 destekli Tensor Çekirdeklerine kıyasla Yeni IEEE uyumlu FP64 işleme sistemi artık dahil ediliyor ve V100'ün FP64 performansının 2,5 katı daha fazlasını sağlıyor.
FP32 (Tam Doğruluk)
Bu format uzun zamandır derin öğrenme için bir çalışma atı olmuştur. Başka bir IEEE 754 formatı olan tek hassasiyetli kayan nokta şunlardır:
1 haneli sembol 8 haneli indeks 23 ondalık basamak İdeal olarak, hem eğitim hem çıkarım FP32'de yapılmalıdır, ancak FP32 FP16/BF16'dan iki kat daha yavaştır, bu yüzden pratikte genellikle karma hassasiyet yöntemleri kullanılır; FP32 ağırlıkları tam olarak "ana ağırlık" olarak kullanılır, FP16/BF16 ağırlıkları ileri ve geri yayılma hesaplamalarında eğitim hızını artırmak için kullanılır ve son olarak FP32 egemen ağırlıkları gradyan güncelleme aşamasında FP16/BF16 gradyanlarıyla güncellenir.
Antrenman sırasında egemen ağırlık her zaman FP32'dir. Pratikte, yarı hassasiyetli ağırlıklar genellikle çıkarım sırasında FP32'ye benzer doğruluk sağlar - çünkü tam FP32 ağırlıkları ancak model gradyanı güncellendiğinde gereklidir. Bu, çıkarım yaparken yarı hassasiyetli ağırlıklar kullanabileceğimiz anlamına gelir, böylece sadece GPU belleğinin yarısı ile aynı sonucu elde edebiliriz.
Menzil: ~1.18e-38 ... ~3.40e38, 6-9 anlamlı onluk doğrulukla.
Kullanım:
Uzun süredir standart sinir ağı hesaplama türü. Sinir ağlarındaki ağırlıklar, aktivasyonlar ve diğer değerler uzun süredir varsayılan olarak FP32'ye yönelmiştir. Birçok bilimsel hesaplamada, özellikle yinelemeli olanlarda, doğruluk yeterli değildir ve hata birikimine yol açar. Yazılım desteği: Çoğu C/C++ sisteminde float tipini temsil eder. TensorFlow (ör. tf.float32) / PyTorch (ör. torch.float32 veya torch.float) desteklenir. Donanım desteği: Genellikle x86 CPU'larda desteklenir. Genellikle NVIDIA/AMD GPU tarafından desteklenir.
FP16 (Yarı Doğruluk)
Benzer şekilde, IEEE 754 standart formatı olan yarı hassasiyetli kayan nokta formatı şunlardır:
1 haneli sembol 5 haneli indeks 10 ondalık basamak FP16 numarası, FP32'ye göre çok daha düşük sayısal bir aralıktır. Bu nedenle, FP16 çok büyük sayıları temsil etmek için kullanıldığında taşma ve çok küçük sayıları temsil etmek için kullanılan alt taşma riski altındadır. Örneğin, 10k * 10k yaptığınızda sonuç 100M olmalı, ki FP16 bunu temsil edemez çünkü FP16'nın temsil edebileceği maksimum sayı 64k'dır. Böylece sinir ağı hesaplamalarında NaN (Sayı Değil) ile sonuçlanırsınız, çünkü hesaplamalar katmanlı ve toplu sırayla yapılır, yani NaN ortaya çıktığında önceki tüm hesaplamalar yok olur. Genel olarak, bu kayıp ölçeklendirme ile azaltılabilir, ancak bu yaklaşım her zaman işe yaramaz.
Menzil: ~5.96e−8 (6.10e−5) ... 65504, 4 anlamlı ondalık rakam doğruluğuyla.
Kullanım:
Derin öğrenme genellikle FP32 yerine FP16 kullanır, çünkü daha düşük hassasiyetli hesaplamalar sinir ağları için önemli görünmüyor. Ekstra hassasiyet hiçbir işe yaramıyor ve aynı zamanda daha yavaş, daha fazla bellek gerektiriyor ve iletişimi yavaşlatıyor. Eğitim için kullanılabilir, genellikle karma hassasiyetli eğitim (TensorFlow/PyTorch) kullanılır. Çıkarımı hızlandırmak için eğitim sonrası kuantizasyon için kullanılabilir (TensorFlow Lite). Eğitim sonrası kuantizasyon için kullanılan diğer formatlar arasında tam sayılar INT8 (8 bitlik tamsayılar), INT4 (4 bit) ve hatta INT1 (ikili değerler) bulunur. Yazılım desteği: Şu anda C/C++ standardında yok (ama kısa bir float önerisi var). Bazı C/C++ sistemleri __fp16 tipleri destekler. Aksi takdirde, özel kütüphanelerle kullanılabilir. TensorFlow (ör. tf.float16) / PyTorch (ör. torch.float16 veya torch.half) desteklenir. Donanım desteği: x86 CPU'lar desteklenmez (benzersiz bir tip olarak). Eski oyun GPU'larında destek zayıf (FP64 için 32/1 performans, daha fazla detay için GPU'lar gönderisine bakınız). Şu anda NVIDIA RTX serisi gibi modern GPU'larda iyi desteklenmektedir.
BFLOAT16 (Yarı Hassasiyet)
Google tarafından geliştirilen bir diğer 16-bit format ise "Brain Floating Point Format" veya kısaca "bfloat16" olarak adlandırılır. İsim Google Brain'den geliyor.
Orijinal IEEE FP16, derin öğrenme uygulamaları göz önünde bulundurulmadan tasarlanmıştı ve dinamik aralığı çok dardı. BFLOAT16 bu sorunu çözerek FP32 ile aynı dinamik aralığı sağlıyor.
Bu nedenle, BFLOAT16 şunları elde ederim:
1 haneli sembol 8 haneli indeks 7 ondalık basamak
bfloat16 formatı, IEEE 754 FP32'ye kısaltılmıştır ve böylece IEEE 754 FP32'ye hızlı dönüşüm yapılabilir. bfloat16 formatına dönüştürülürken, üstel bitler korunurken, mantissa alanları kesinti ile indirgenebilir.
Aralık: ~1.18e-38 ... ~3.40e38, 3 anlamlı ondalık basamayla. Kullanım:
Şimdi FP16'nın yerini alıyor gibi görünüyor. FP16'nın aksine, genellikle kayıp ölçeklendirme gibi tekniklerle özel işlem gerektiren bu şekilde, BF16 derin sinir ağlarını eğitip çalıştırırken neredeyse FP32'nin doğrudan yerine geçer. Yazılım desteği: C/C++ standardında değil. Özel kütüphanelerle kullanılabilir. TensorFlow (ör. tf.bfloat16) / PyTorch (ör. torch.bfloat16) ile desteklenir.
TF32
TensorFloat-32 veya TF32, NVIDIA A100 GPU'larındaki yeni matematik moddur.
Yarı hassasiyet (FP16) matematiği gibi aynı 10-bit mantissaları kullanarak, TF32 yapay zeka iş yüklerinin hassasiyet gereksinimlerini karşılayacak kadar boşluk barındırıyor. Ve TF32, FP32 ile aynı 8-bit indeksi kullanıyor, yani aynı sayısal aralığı destekleyebilir.
Teknik olarak, bu 19-bit formattır. Bunu "BFLOAT19" gibi genişletilmiş bir hassasiyet BFLOAT16 veya FP32 gibi azaltılmış bir hassasiyet olarak düşünün.
Yani, TF32'nin şunları var:
1 haneli sembol 8 haneli indeks 10 ondalık basamak TF32'nin avantajı, FP32 ile aynı formata sahip olmasıdır. TF32 ile iç çarpım hesaplanırken, giriş operandının mantissası 23 bitten 10 bite yuvarlanır. Yuvarlama operandları tam olarak katlanır ve normal FP32'de biriktirilir.
TF32 Tensor Core, FP32 girişleriyle çalışır ve kod değişikliği olmadan FP32'de sonuçlar üretir. Matris dışı işlemler FP32 kullanmaya devam etmektedir. Bu, derin öğrenme çerçevelerinde ve HPC'de FP32 giriş/çıkış verilerini hızlandırmanın kolay bir yolunu sunar.
Menzil: ~1.18e-38 ... ~3.40e38, 4 anlamlı ondalık doğrulukla. Kullanım:
TF32'nin harika yanlarından biri, derleyici desteğine sadece en derin seviyede, yani CUDA derleyicisinin içinde ihtiyaç duymasıdır. Kodun geri kalanı FP32'yi daha az hassasiyetle ama aynı dinamik aralıkla görüyor. TF32'yi kullanmak, esas olarak kütüphaneye arama yaparak düzgün çalışıp çalışmadığını göstermek içindir. TF32'nin varlığı, Tensor Çekirdeklerinin hızından çok fazla çaba harcamadan faydalanarak hızlı eklenti yapılmasına olanak tanıyor. FP16 ve BFLOAT16 gibi formatlar farklı bit düzenleri nedeniyle daha fazla ayarlama gerektiriyor. Ancak bu formatların kullanılması bellek bant genişliğini azaltır ve daha hızlı çalıştırma sağlar. Karşılaştırma için, A100'ün en yüksek performansı şudur:
Tensör çekirdekleri olmadan FP32: 19.5 TFLOPS TF32 Tensör Çekirdekleri: 156 TFLOPS (yani FP32 yerine TF32 kullanmak hızı artırmayı kolaylaştırıyor). FP16/BF16 Tensör Çekirdekleri: 312 TFLOPS (bu nedenle, FP16/BF16'ya makul bir geçiş daha fazla hız kazanımı sağlayabilir, ancak daha yüksek maliyetle). Yazılım desteği: C/C++ standardında değil. CUDA 11 destekleniyor. Donanım desteği: GPU: NVIDIA A100, desteklenen ilk model
FP8
H100 GPU tarafından sunulan bu cihaz, daha yüksek matris çarpımı ve konvolüsyonunu sağlar, ancak daha düşük hassasiyetle.
H8 tarafından desteklenen FP100 veri tipleri aslında sinir ağı eğitiminin farklı bölümleri için kullanılabilen iki farklı veri tipidir:
E4M3 - 1 sembolik bit, 4 üstel bit ve 3 ondalık basamaktan oluşur. +/-448 ve nan'a kadar depolayabilir. E5M2 - 1 işaret biti, 5 üstel bit ve 2 ondalık basamaktan oluşur. +/-57344, +/-inf ve nan'a kadar değerleri depolayabilir. Dinamik aralığın artmasının bir dengesi, depolanan değerlerin daha az doğru olmasıdır.
Kayan nokta veri türlerinin yapısı. Gösterilen tüm değerler (FP16, BF16, FP8 E4M3 ve FP8 E5M2) 0.3952 değerinin en yakın temsilidir.
Her iki tip de sinir ağı eğitimi sırasında kullanılabilir. Genel olarak, ileri aktivasyon ve ağırlıklar daha yüksek hassasiyet gerektirir, bu yüzden ileri geçiş sırasında E4M3 veri tipini kullanmak en iyisidir. Ancak, geri yayılımda, ağdan geçen gradyan genellikle hassasiyet kaybına daha az duyarlıdır ancak daha yüksek dinamik bir aralık gerektirir. Bu nedenle, bunları E5M2 veri formatında depolamak en iyisidir. H100 TensorCore, bu türlerin herhangi bir kombinasyonunu giriş olarak destekler ve her tensörü tercih ettiği hassasiyetle depolamamıza olanak tanır.
Referans:
Bağlantı girişi görünür.
Bağlantı girişi görünür. |