Ten artykuł jest lustrzanym artykułem tłumaczenia maszynowego, kliknij tutaj, aby przejść do oryginalnego artykułu.

Widok: 3298|Odpowiedź: 0

Podwójna precyzja (FP64), Pojedyncza precyzja (P32, TF32), Półprecyzja (FP16, BF16)

[Skopiuj link]
Opublikowano 2025-3-10 o 14:22:34 | | | |
Trening i rozumowanie dużych modeli często opierają się na koncepcji dokładności, istnieje wiele typów, które również dzielą się na różne formaty o tym samym poziomie dokładności. Ponadto w praktycznych scenariuszach stosuje się także koncepcje multi-precyzji i mieszanej precyzji.

Precyzja wspólna

Dokładność zmiennoprzecinkowa: podwójna precyzja (FP64), pojedyncza precyzja (FP32, TF32), półprecyzja (FP16, BF16), dokładność 8-bitowa (FP8), 4-bitowa dokładność (FP4, NF4)
Dokładność ilościowań: INT8, INT4 (znana także jako INT3/INT5/INT6)

Liczba zmiennoprzecinkowa składa się z trzech części: znaku, bitów wykładniczego i modliszkowego. Im większy bit wykładniczy, tym większy zakres liczb, które można przedstawić. Im większa cyfra mantysy, tym większa dokładność liczby.



Tabela podsumowuje to następująco

formatSymbol bitBit wykładniczyMiejsce dziesiętneŁączna liczba cyfr
FP641115264
FP32182332
TF32181019
BF1618716
FP16151016
FP8 E4M31438
FP8 E5M21528
FP41214


FP32: 32-bitowy numer zmiennoprzecinkowy, 4 bajty na dane
TF32: 19-bitowy numer zmiennoprzecinkowy, każdy dane ma 2 bajty
FP16: 16-bitowy numer zmiennoprzecinkowy, 2 bajty na dane
BF16: 16-bitowy numer zmiennoprzecinkowy, każda data ma 2 bajty
Int8: 8-bitowa liczba całkowita, każda data zajmuje 1 bajt
Int4: 4-bitowe liczby całkowite, każda data ma 0,5 bajtu

Dlaczego tyle precyzji

Ze względu na koszty i dokładność. Wszyscy wiemy, że wysoka dokładność jest zdecydowanie bardziej precyzyjna, ale wiąże się też z wyższymi kosztami obliczeniowymi i przechowywaniem. Niższa precyzja zmniejsza dokładność obliczeń, ale może poprawić efektywność obliczeniową i wydajność. Dlatego różnorodność precyzji pozwala wybrać najbardziej odpowiednią w różnych sytuacjach.
Podwójna precyzja jest dokładniejsza niż wyrażenie pojedynczej precyzji, ale zajmuje dwa razy więcej miejsca i wymaga więcej czasu na obliczenia.

Dlaczego duże modele muszą być ilościowo określane?

1. Zmniejszenie zużycia pamięci
Duże modele zazwyczaj używają 32-bitowych liczb zmiennoprzecinkowych (FP32) lub 16-bitowych liczb zmiennoprzecinkowych (FP16) do reprezentowania wag i wartości aktywacji. Dzięki kwantyzacji te wysokoprecyzyjne wartości można przekształcić w reprezentacje o niższej precyzji (np. 8-bitowe liczby całkowite, INT8), co znacząco zmniejsza przestrzeń pamięciową modelu. Jest to ważne przy wdrażaniu na urządzeniach o ograniczonych zasobach, takich jak urządzenia mobilne, systemy wbudowane itp.

2. Przyspiesz tempo rozumowania
Modele kwantyzowane mogą działać wydajniej na sprzęcie. Wiele nowoczesnych urządzeń (takich jak GPU, TPU, NPU itp.) posiada specjalistyczne wsparcie optymalizacyjne dla obliczeń o niskiej precyzji, umożliwiając szybsze operacje kwantyzacji. Dodatkowo, obliczenia o niskiej precyzji często wymagają mniejszej liczby operacji bitowych, co zmniejsza złożoność obliczeniową i przyspiesza wnioskowanie.

3. Zmniejszenie zużycia energii
Model kwantowany nie tylko zmniejsza zapotrzebowanie na zasoby obliczeniowe, ale także zmniejsza zużycie energii. Jest to szczególnie ważne w przypadku urządzeń zasilanych bateriami, takich jak smartfony, urządzenia IoT itp., gdzie niskie zużycie energii oznacza dłuższą żywotność baterii.

4. Łatwe do wdrożenia urządzenia brzegowe
Wiele dużych modeli początkowo było trenowanych i wdrażanych w chmurze, ale wraz z rozwojem edge computingu coraz więcej scenariuszy aplikacji wymaga wdrażania modeli na urządzeniach brzegowych. Przy ograniczonej mocy obliczeniowej i zasobach pamięci masowej na urządzeniach brzegowych, kwantyzacja może pomóc tym modelom działać wydajniej na urządzeniach brzegowych.

5. Zmniejszenie wymagań dotyczących przepustowości
W procesie wnioskowania rozproszonego lub aktualizacji modelu kwantyzacja może zmniejszyć przepustowość potrzebną do transferu modelu. Jest to przydatne w środowiskach o ograniczonej przepustowości sieci, takich jak urządzenia IoT w odległych rejonach.

6. Utrzymanie wydajności modelu
Chociaż kwantyzacja powoduje pewną utratę precyzji, oryginalna wydajność modelu może być w dużej mierze zachowana dzięki odpowiednim metodom kwantyzacji (takim jak kwantyzacja mieszana precyzji, kwantyzacja po treningu, trening percepcji ilościowej itd.). Dlatego w praktycznych zastosowaniach ilościowość może znaleźć dobrą równowagę między wydajnością a efektywnością.

Referencja pamięci

typKażdy miliard parametrów musi zajmować pamięć
float324G
FP16/BF162G
int81G
int40,5G


FP64 (Podwójna Precyzja)

64-bitowy format zmiennoprzecinkowy, zazwyczaj podwójnie precyzyjny binarny format zmiennoprzecinkowy definiowany przez IEEE 754, posiada:

Symbol jednocyfrowy
Indeks 11-cyfrowy
52 miejsca po przecinku



Zasięg: ~2,23e-308 ... ~1,80e308 z pełną precyzją 15-17 dziesiętną.

Zwyczaj:

Ten format jest stosowany do obliczeń naukowych wymagających wysokiej precyzji.
Zazwyczaj nie jest stosowany do obliczeń związanych z głębokim uczeniem.
Wsparcie oprogramowania:
Reprezentuje podwójny typ w większości systemów C/C++.
Obsługiwane w TensorFlow (np. tf.float64) / PyTorch (np. torch.float64 lub torch.double).
Wsparcie sprzętowe:
Zazwyczaj obsługiwane w procesorach x86.
Większość GPU, zwłaszcza gamingowych, w tym seria RTX, jest mocno ograniczona pod względem wydajności FP64 (zwykle 1/32 FP32 zamiast 1/2).
Najnowsze niekontrolowane karty GPU obsługujące FP64 to GP100/100/102/104 w Tesla P40/P4 i Quadro GP100, GV100 w Tesla V100/Quadro GV100/Titan V oraz niedawno ogłoszony GA100 w A100 (co ciekawe, nowa architektura Ampere ma trzecią generację) w porównaniu do rdzeni Tensor z FP64 Nowe przetwarzanie FP64 zgodne z IEEE jest teraz dołączone, które zapewnia 2,5x lepsze parametry niż FP64 w porównaniu z V100.

FP32 (pełna celność)

Ten format od dawna jest podstawą uczenia głębokiego. Inny format IEEE 754, pojedyncza precyzja zmiennoprzecinkowa, ma:

Symbol jednocyfrowy
8-cyfrowy indeks
23 miejsca po przecinku
Idealnie zarówno trenowanie, jak i wnioskowanie powinno być wykonywane w FP32, ale FP32 jest dwa razy wolniejsze niż FP16/BF16, dlatego w praktyce często stosuje się metody o mieszanej precyzji, gdzie wagi FP32 są używane jako dokładna "masa główna", wagi FP16/BF16 do obliczeń propagacji do przodu i do tyłu, aby poprawić szybkość treningu, a wreszcie wagi suwerenne FP32 są aktualizowane o gradienty FP16/BF16 w fazie aktualizacji gradientów.

Podczas treningu masa suwerenna zawsze wynosi FP32. W praktyce wagi o półprecyzji często zapewniają podobną dokładność do FP32 podczas wnioskowania – ponieważ dokładne wagi FP32 są potrzebne tylko przy aktualizacji gradientu modelu. Oznacza to, że możemy używać wag o półprecyzji podczas wnioskowania, więc uzyskamy ten sam wynik przy zaledwie połowie pamięci GPU.



Zakres: ~1,18e-38 ... ~3,40e38 z dokładnością 6-9 znaków po przecinku.

Zwyczaj:

Standardowy typ obliczeń sieci neuronowych przez długi czas. Wagi, aktywacje i inne wartości w sieciach neuronowych od dawna domyślnie przyjmują FP32.
W wielu obliczeniach naukowych, zwłaszcza iteracyjnych, dokładność nie jest wystarczająca, co prowadzi do nagromadzenia błędów.
Wsparcie oprogramowania:
Reprezentuje typ float w większości systemów C/C++.
Obsługiwane w TensorFlow (np. tf.float32) / PyTorch (np. torch.float32 lub torch.float).
Wsparcie sprzętowe:
Zazwyczaj obsługiwane w procesorach x86.
Zazwyczaj obsługiwane przez NVIDIA/AMD GPU.

FP16 (Półcelność)

Podobnie, format standardowy IEEE 754, format zmiennoprzecinkowy z półprecyzją, ma:

Symbol jednocyfrowy
5-cyfrowy indeks
10 miejsc po przecinku
Numer FP16 ma znacznie mniejszy zakres liczbowy niż FP32. Dlatego FP16 jest narażony na przepełnienie (gdy jest używane do reprezentowania bardzo dużych liczb) oraz przepełnienie (gdy jest używane do reprezentowania bardzo małych liczb). Na przykład, gdy robisz 10k * 10k, końcowy wynik powinien wynosić 100M, czego FP16 nie może oddać, ponieważ maksymalna liczba, jaką FP16 może reprezentować, to 64k. W wyniku tego w obliczeniach sieci neuronowych otrzymujesz NaN (nie liczbę), ponieważ obliczenia są wykonywane warstwowo i w kolejności wsadowej, więc gdy pojawia się NaN, wszystkie wcześniejsze obliczenia są niszczone. Ogólnie rzecz biorąc, można to ograniczyć skalowaniem strat, ale to podejście nie zawsze działa.



Zasięg: ~5,96e−8 (6,10e−5) ... 65504, z dokładnością 4 cyfr dziesiętnych znaczących.

Zwyczaj:

Głębokie uczenie zwykle korzysta z FP16 zamiast FP32, ponieważ obliczenia o niższej precyzji nie wydają się mieć znaczenia dla sieci neuronowych. Dodatkowa precyzja nic nie daje, a jednocześnie jest wolniej, wymaga więcej pamięci i spowalnia komunikację.
Można go używać do treningu, zwykle z użyciem treningu o mieszanej precyzji (TensorFlow/PyTorch).
Może być używany do kwantyzacji po treningu, aby przyspieszyć wnioskowanie (TensorFlow Lite). Inne formaty stosowane do kwantyzacji po treningu to liczby całkowite INT8 (8-bitowe liczby całkowite), INT4 (4-bitowe), a nawet INT1 (wartości binarne).
Wsparcie oprogramowania:
Obecnie nie jest to w standardzie C/C++ (ale jest krótka propozycja float). Niektóre systemy C/C++ obsługują __fp16 typy. W przeciwnym razie można go używać ze specjalnymi bibliotekami.
Obsługiwane w TensorFlow (np. tf.float16) / PyTorch (np. torch.float16 lub torch.half).
Wsparcie sprzętowe:
Procesory x86 nie są obsługiwane (jako unikalny typ).
Wsparcie starszych kart graficznych gamingowych jest słabe (wydajność 32/1 dla FP64, szczegóły znajdziesz w poście o GPU). Obecnie jest dobrze wspierany na nowoczesnych kartach graficznych, takich jak seria NVIDIA RTX.

BFLOAT16 (Pół-Precyzja)

Inny 16-bitowy format, pierwotnie opracowany przez Google, nosi nazwę "Brain Floating Point Format" lub w skrócie "bfloat16". Nazwa pochodzi od Google Brain.

Oryginalny IEEE FP16 został zaprojektowany bez myśli o zastosowaniach głębokiego uczenia, a jego zakres dynamiczny był zbyt wąski. BFLOAT16 rozwiązuje ten problem, zapewniając ten sam zakres dynamiczny co FP32.

Dlatego BFLOAT16 mieć:

Symbol jednocyfrowy
8-cyfrowy indeks
7 przecinków



Format bfloat16 został skrócony do IEEE 754 FP32, co umożliwia szybkie przejście na i z IEEE 754 FP32. Podczas konwersji do formatu bfloat16 zachowuje się wykładnicze bity, natomiast pola mantisy można zmniejszyć przez obcięcie.



Zakres: ~1,18e-38 ... ~3,40e38 z 3 znaczącymi miejscami po przecinku.
Zwyczaj:

Teraz wydaje się, że zastępuje FP16. W przeciwieństwie do FP16, który często wymaga specjalnego przetwarzania za pomocą technik takich jak skalowanie strat, BF16 jest niemal bezpośrednim zamiennikiem FP32 podczas trenowania i uruchamiania głębokich sieci neuronowych.
Wsparcie oprogramowania:
Nie w standardzie C/C++. Można go używać ze specjalnymi bibliotekami.
Wspierane w TensorFlow (np. tf.bfloat16) / PyTorch (np. torch.bfloat16).

TF32

TensorFloat-32, czyli TF32, to nowy tryb matematyczny w kartach graficznych NVIDIA A100.

Stosując te same 10-bitowe mantisy co matematykę półprecyzji (FP16), TF32 wykazuje wystarczający zapas, by sprostać wymaganiom precyzyjnym obciążeń AI. TF32 używa tego samego 8-bitowego indeksu co FP32, więc może obsłużyć ten sam zakres liczbowy.

Technicznie rzecz biorąc, jest to format 19-bitowy. Można to traktować jak wydłużony BFLOAT16 precyzyjny, np. "BFLOAT19" lub zmniejszoną precyzję, jak FP32.

TF32 ma:

Symbol jednocyfrowy
8-cyfrowy indeks
10 miejsc po przecinku
Zaletą TF32 jest to, że ma ten sam format co FP32. Podczas obliczania iloczynu skalnego za pomocą TF32, mantysa operandu wejściowego jest zaokrąglana z 23 do 10 bitów. Operandy zaokrąglenia są mnożone dokładnie i kumulowane w normalnym FP32.

TF32 Tensor Core działa na wejściach FP32 i generuje wyniki w FP32 bez zmian w kodzie. Operacje niemacierzowe nadal wykorzystują FP32. Zapewnia to łatwy sposób na przyspieszenie danych wejścia/wyjścia FP32 w frameworkach deep learning i HPC.

Zasięg: ~1,18e-38 ... ~3,40e38 z dokładnością 4 znaczących miejsc dziesiętnych.
Zwyczaj:

Jedną z zalet TF32 jest to, że potrzebuje wsparcia kompilatora tylko na najgłębszym poziomie, czyli wewnątrz kompilatora CUDA. Reszta kodu widzi FP32 z mniejszą precyzją, ale z tym samym zakresem dynamicznym. Używanie TF32 służy głównie do wykonywania wywołań do biblioteki, aby sprawdzić, czy działa poprawnie. Obecność TF32 pozwala na szybkie wtyczki, wykorzystując szybkość rdzeni Tensor bez większego wysiłku.
Formaty takie jak FP16 i BFLOAT16 wymagają dalszych regulacji, ponieważ wymagają różnych układów bitów. Jednak stosowanie tych formatów zmniejsza przepustowość pamięci, co pozwala na szybsze wykonywanie.
Dla porównania, szczytowe osiągi A100 to:

FP32 bez rdzeni tensorowych: 19,5 TFLOPS
Rdzenie tensorowe TF32: 156 TFLOPS (więc używanie TF32 zamiast FP32 ułatwia zwiększenie prędkości).
Rdzenie tensorowe FP16/BF16: 312 TFLOPS (dlatego rozsądna zmiana na FP16/BF16 może dać większe zyski prędkości, ale za wyższy koszt).
Wsparcie oprogramowania:
Nie w standardzie C/C++.
Obsługiwane CUDA 11.
Wsparcie sprzętowe:
GPU: NVIDIA A100 to pierwszy model obsługiwany

FP8

Wprowadzony przez procesor H100, umożliwia większe mnożenie macierzy i splot, ale z niższą precyzją.

Typy danych FP100 obsługiwane przez H8 to w rzeczywistości dwa różne typy danych, które mogą być wykorzystywane w różnych częściach treningu sieci neuronowych:

E4M3 – składa się z 1 bitu symbolicznego, 4 bitów wykładniczych i 3 miejsc po przecinku. Może przechowywać do +/-448 i nano.
E5M2 – składa się z 1 bitu znaku, 5 bitów wykładniczych oraz 2 miejsc po przecinku. Może przechowywać wartości do +/-57344, +/-inf i nan. Kosztem wzrostu zakresu dynamicznego jest to, że przechowywane wartości są mniej dokładne.



Struktura typów danych zmiennoprzecinkowych. Wszystkie wyświetlane wartości (w FP16, BF16, FP8 E4M3 i FP8 E5M2) są najbliższą reprezentacją wartości 0,3952.

Oba typy mogą być stosowane podczas trenowania sieci neuronowej. Ogólnie rzecz biorąc, aktywacja do przodu i obciążenia wymagają większej precyzji, dlatego najlepiej używać typu danych E4M3 podczas przejścia do przodu. Jednak w przypadku propagacji wstecznej gradient przepływający przez sieć jest zazwyczaj mniej podatny na utratę precyzji, ale wymaga większego zakresu dynamicznego. Dlatego najlepiej przechowywać je w formacie danych E5M2. H100 TensorCore obsługuje dowolną kombinację tych typów jako wejście, co pozwala nam przechowywać każdy tensor z preferowaną precyzją.

Odniesienie:

Logowanie do linku jest widoczne.
Logowanie do linku jest widoczne.




Poprzedni:Sieć - Urządzenia pod główną i podtrasą są połączone
Następny:[AI] (10) Estymacja pamięci pamięci VRAM LLM z wnioskowaniem dużych modeli GPU
Zrzeczenie się:
Całe oprogramowanie, materiały programistyczne lub artykuły publikowane przez Code Farmer Network służą wyłącznie celom edukacyjnym i badawczym; Powyższe treści nie mogą być wykorzystywane do celów komercyjnych ani nielegalnych, w przeciwnym razie użytkownicy ponoszą wszelkie konsekwencje. Informacje na tej stronie pochodzą z Internetu, a spory dotyczące praw autorskich nie mają z nią nic wspólnego. Musisz całkowicie usunąć powyższą zawartość z komputera w ciągu 24 godzin od pobrania. Jeśli spodoba Ci się program, wspieraj oryginalne oprogramowanie, kup rejestrację i korzystaj z lepszych, autentycznych usług. W przypadku naruszenia praw prosimy o kontakt mailowy.

Mail To:help@itsvse.com