Znak, Wykładnik, Mantysa
Format IEEE 754 zmiennoprzecinkowy
Każda liczba zmiennoprzecinkowa przechowuje trzy pola:
- Bit znaku (1 bit): dodatni lub ujemny
- Wykładnik (E bity): skala magnitudy, całkowita potęga 2
- Mantysa (M bitów): precyzja ułamkowa, liczba między 1.0 a ~2.0
Całkowita liczba bitów = 1 + E + M. Wartość wynosi w przybliżeniu (-1)^sign (1 + mantissa) 2^(exponent - bias).
Dwie właściwości są ważne dla treningu:
Zakres dynamiczny = 2^(2^E) (w przybliżeniu). Więcej bitów wykładnika oznacza reprezentowanie mniejszych i większych liczb bez przepełnienia.
Precyzja = 2^M różnych wartości na każdą potęgę 2. Więcej bitów mantysy oznacza drobniejsze rozróżnienie między kolejnymi potęgami 2.
Trzy formaty
| Format | Całkowita liczba bitów | Znak | Wykł | Mant | Zakres dynamiczny | Precyzja |
|---|---|---|---|---|---|---|
| FP32 | 32 | 1 | 8 | 23 | ~10^-38 do ~10^38 | ~7 cyfr |
| FP16 | 16 | 1 | 5 | 10 | ~10^-5 do ~10^5 | ~3 cyfry |
| FP8 E4M3 | 8 | 1 | 4 | 3 | ~2^-9 do ~448 | ~2 cyfry |
FP8 E4M3 oznacza „4 bity wykładnika, 3 bity mantysy”. Alternatywny FP8 E5M2 wymienia precyzję na zakres; eksperymenty ANDREA używają E4M3, ponieważ aktywacje transformera mieszczą się w wąskich pasmach wielkości, gdzie dodatkowa precyzja przewyższa dodatkowy zakres.
Bajty na parametr
Dlaczego Niższa Precyzja Działa Szybciej
Przepustowość Pamięci Dominuje nad Szybkością Treningu
Nowoczesne GPU spędzają więcej czasu na oczekiwaniu na pamięć niż na obliczeniach. RTX 4090 ma przepustowość pamięci 1008 GB/s i 165 TFLOPS obliczeń FP16. Typowa warstwa odczytuje wagi z VRAM, mnoży aktywacje, zapisuje wyniki z powrotem. To przepustowość, a nie obliczenia, decyduje o przepływie.
Zmniejszenie precyzji o połowę zmniejsza bajty na parametr o połowę, więc odczyt tych samych wag zużywa połowę przepustowości pamięci. Przepływ wzrasta mniej więcej dwukrotnie.
Tensor Cores: Sprzętowo Przyspieszane Mnożenie Macierzy
RTX 4090 zawiera dedykowane jednostki tensor core, które obliczają mnożenie macierzy w FP16 lub FP8 bezpośrednio. Pojedyncza operacja tensor core mnoży mały blok (np. 16x16) w jednym cyklu, dramatycznie szybciej niż skalarne mnożenia FP32.
Empiryczne dane z ANDREA-120M:
| Precyzja | Kroki/min | Uwagi |
|---|---|---|
| FP32 | ~3 | bazowa; brak przyspieszenia tensor core |
| FP16 | ~6 | rdzenie tensorowe cuBLAS; 2x przyspieszenie |
| FP8 E4M3 | ~6 | rdzenie tensorowe; porównywalne z FP16 |
FP8 nie pokonało FP16 pod względem przepustowości w tym obciążeniu, ponieważ przepustowość obliczeniowa przestała być wąskim gardłem; przepustowość pamięci i narzut uruchamiania stały się ograniczające. ANDREA-120M v3 jest dostarczany w FP16 cuBLAS przy 6 krokach/min dla komfortowego marginesu bezpieczeństwa bez utraty przepustowości.
Ryzyko NaN w FP8
FP8 E4M3 reprezentuje liczby od ~2^-9 do ~448. Aktywacje lub gradienty poza tym zakresem przepełniają się do NaN (not a number) lub spadają do zera. Pojedyncze NaN zatruwa każde downstream obliczenie: mnożenia macierzowe z NaN zwracają wszystkie-NaN; gradienty wszystkie-NaN psują stan AdamW; AdamW z NaN m & v generuje aktualizacje NaN; wagi stają się NaN; całe uruchomienie treningu umiera.
Eksperymenty FP8 ANDREI powodowały okazjonalne klify NaN wymagające skalowania strat, zaplanowanego przełączania precyzji lub ścieżek zapasowych. Zakres dynamiczny FP16 (~10^-5 do ~10^5) jest wystarczająco szeroki, że zdarzenia NaN pozostają rzadkie bez skomplikowanych sztuczek skalowania.
Wybór precyzji dla nowego uruchomienia
Zmieszczenie 120M na jednej 4090
Mnożnik 6-8x z lekcji wprowadzającej
Przypomnij sobie z grow_a_language_model_intro, że pamięć treningowa wynosi mniej więcej 6-8x surowej liczby wag, uwzględniając:
- Wagi (1x)
- Adam pierwszy moment m (1x)
- Adam drugi moment v (1x)
- Bufor gradientu (1x)
- Aktywacje & tymczasowe (~2-4x, zależy od batch & kontekstu)
ANDREA-120M w FP16 z batch_size=8, context=1024:
| Komponent | Rozmiar FP16 |
|---|---|
| Wagi | 240 MB |
| m (pierwsza chwila) | 240 MB |
| v (druga chwila) | 240 MB |
| Gradienty | 240 MB |
| Aktywacje | ~2-4 GB (batch, ctx) |
| Razem | ~3.5 GB |
RTX 4090 ma 24 GB VRAM. ANDREA-120M zużywa ~14% przy FP16. Wystarczy miejsca na większe rozmiary batcha lub dłuższe okna kontekstowe. ANDREA-12M zużyła tylko 1.4 GB łącznie.
Gdzie żyje mieszana precyzja
ANDREA NIE przechowuje wszystkiego w jednej precyzji. Trening o mieszanej precyzji przechowuje:
- Wagi główne: FP32 (zachowuje stabilność treningu)
- Obliczenia forward & backward: FP16 (używa tensor cores)
- Stan optymalizatora AdamW: FP32 (m & v potrzebują precyzji dla aktualizacji long-tail)
- Bufor gradientów: FP16 (strona obliczeniowa)
Ostateczny budżet pamięci łączy oba. Rzeczywisty ślad pamięciowy ANDREA mieści się pomiędzy czystym FP16 (720 MB stan optymalizatora) a czystym FP32 (1.44 GB stan optymalizatora), bliżej FP32, ponieważ m i v pozostają w FP32.
Dobór rozmiaru budżetu dla ANDREA-480M
Precyzja w praktyce
Pokrewne Aktywności
Trzy powiązane aktywności odnoszą się do precyzji:
- Aktywność 1: Wstęp / budżet VRAM. Precyzja mnoży każdy składnik w arytmetyce budżetu pamięci. Reguła kciuka 6-8x jest bezwymiarowa; bajty-na-param daje jej jednostki.
- Aktywność 10: AdamW. Stan optymalizatora (m & v) zazwyczaj pozostaje w FP32, nawet gdy obliczenia forward/backward działają w FP16. Powód: precyzja akumulatora long-tail ma większe znaczenie niż szybkość obliczeń dla optymalizatora.
- Aktywność 12: Klipowanie gradientów. Klipowanie ogranicza amplitudy gradientów przed aktualizacją stanu optymalizatora. Przy FP16 forward/backward & FP32 optymalizator, klipowanie następuje na granicy zmiany precyzji & tam, gdzie koncentruje się ryzyko przepełnienia.
Precyzja to darmowa pokrętło: zmień ją, model trenuje szybciej & zużywa mniej pamięci. Koszt to dbałość numeryczna: obsługa NaN, skalowanie strat, dyscyplina mieszanej precyzji. ANDREA-120M v3 demonstruje zysk: 120M parametrów wytrenowanych na konsumenckim sprzęcie w 23 dni, ponieważ FP16 zmniejszyło wszystko o połowę.