FP16
Jak działa
FP16 koduje wartość jako znak x 1,mantysa x 2^(wykładnik − 15), z 5-bitowym wykładnikiem (bias 15) i 10-bitową mantysą plus bitem ukrytym (11 bitów precyzji). W treningu mixed-precision wagi, aktywacje i gradienty przechowuje się w FP16, mnożenie macierzy wykonują rdzenie Tensor Core, a akumulacja iloczynów odbywa się w FP32; utrzymuje się też master copy wag w FP32. Aby małe gradienty nie zanikały w wąskim zakresie FP16, funkcję straty mnoży się przez współczynnik skalujący przed backpropagacją i dzieli po niej (loss scaling). W inferencji FP16 służy jako lekki format wag i aktywacji redukujący zużycie pamięci VRAM.
Rozwiązany problem
Trening i inferencja w FP32 zużywają dużo pamięci i przepustowości, a rdzenie Tensor Core osiągają najwyższą przepustowość dopiero w obniżonej precyzji. FP16 zmniejsza rozmiar tensorów o połowę i przyspiesza mnożenie macierzy, ale jego wąski 5-bitowy wykładnik (maks. ~65504) powoduje przepełnienia i zaniki gradientów, dlatego trening w FP16 wymaga skalowania strat (loss scaling) i akumulacji w FP32.
Kluczowe mechanizmy
Mocne strony i ograniczenia
Komponenty
1 bit określający znak liczby: 0 = wartość dodatnia, 1 = ujemna.
5 bitów z biasem 15 (zakres wykładnika -14 do +15), co daje maksymalną wartość ~65504 i wąski zakres dynamiczny względem FP32 i BF16.
10 bitów jawnie przechowywanych plus 1 bit ukryty (11 bitów precyzji) — więcej niż 8 bitów w BF16, więc FP16 ma wyższą precyzję względną przy porównywalnym rozmiarze.
Implementacja
Wąski 5-bitowy wykładnik (maks. ~65504, min. normalny ~6e-5) powoduje, że duże aktywacje przepełniają się do inf, a małe gradienty zanikają do zera.
Oba formaty mają 16 bitów, ale FP16 ma więcej mantysy i mniej wykładnika niż BF16; kod zakładający zakres BF16 zawiedzie w FP16 i odwrotnie.
Ewolucja
Format półprecyzji zostaje sformalizowany w standardzie IEEE 754 jako typ przechowywania.
Pierwsza generacja Tensor Core wykonuje mnożenie macierzy FP16 z akumulacją FP32, dramatycznie przyspieszając trening.
Praca NVIDIA i Baidu formalizuje trening mixed-precision z FP16, master copy wag w FP32 i loss scaling.
Hiperparametry (konfigurowalne osie)
Współczynnik mnożący stratę przed backpropagacją, chroniący małe gradienty przed zanikiem.
Precyzja sum częściowych w mnożeniu macierzy; zwykle FP32 dla stabilności.
Złożoność obliczeniowa
Złożoność czasowa: O(1) na operację elementarną (stały koszt na wartość). Złożoność przestrzenna: 2 bajty / wartość.
Na GPU NVIDIA A100 mnożenie macierzy FP16 z akumulacją FP32 osiąga 312 TFLOPS (tyle samo co BF16), wobec 19,5 TFLOPS w FP32 bez Tensor Core. Trening mixed-precision FP16 zwykle utrzymuje dokładność na poziomie FP32 przy zastosowaniu loss scalingu i skraca czas oraz zużycie pamięci o około połowę.
Wąskie gardło obliczeniowe
Wydajność FP16 zależy od przepustowości jednostek mixed-precision oraz pamięci; sam format nie narzuca kosztu obliczeń poza rzutowaniami i akumulacją FP32.
Paradygmat wykonania
Wszystkie ścieżki obliczeń są aktywne; FP16 zmienia jedynie precyzję reprezentacji.
FP16 nie wprowadza routingu ani warunkowego wykonania; to format gęstych obliczeń.
Równoległość
FP16 to format danych; operacje elementarne i mnożenia macierzy są w pełni równoległe na jednostkach SIMD/Tensor Core.
Wymagania sprzętowe
Natywnie wspierany przez rdzenie Tensor Core NVIDIA od architektury Volta (V100, 2017); mnożenie macierzy FP16 z akumulacją FP32 osiąga wielokrotnie wyższą przepustowość niż FP32.
Wspierany również przez GPU AMD (RDNA/CDNA) oraz Apple Metal (half); szeroko dostępny w konsumenckich i serwerowych akceleratorach.