Hasło słownika · · 2 min czytania
Mixed Precision Training
Trening wymaga ogromnej liczby działań na liczbach. Mniej dokładny format może być szybszy i zajmować mniej pamięci, ale drobne poprawki mogą w nim znikać. Chcesz oszczędzać tam, gdzie to możliwe, zachowując dokładność w wrażliwych miejscach.
Mixed Precision Training używa różnych formatów liczb w różnych częściach treningu. Nie sprowadza się do zamiany całego modelu na jeden krótki format.
W klasycznym wariancie część działań odbywa się w FP16, czyli formacie 16-bitowym, a niektóre sumy i kopia aktualizowanych wag korzystają z FP32, formatu 32-bitowego. Drobna zmiana może zostać zachowana w dokładniejszej kopii, nawet gdy znikałaby w zaokrąglonym zapisie.
Różne receptury stosują inne formaty i zakres operacji. Loss Scaling pomaga chronić małe gradienty w FP16, a bfloat16 ma inny kompromis zakresu i precyzji. Oszczędność wymaga zgodnego sprzętu i kontroli błędów numerycznych.
Mechanizm i szczegóły

Micikevicius et al., Mixed Precision Training, §3.1–3.3 opisują wariant z FP16, kopią wag aktualizowaną w FP32, sumowaniem iloczynów w FP32 oraz Loss Scaling. To konkretna receptura z pracy z 2017 roku, a nie obowiązkowy układ każdego współczesnego treningu.
Mała zmiana może nie ruszyć dużej liczby
W FP16 liczby nie są rozmieszczone równomiernie. Tuż poniżej 1 sąsiednie wartości dzieli . Własny przykład: odejmujemy od wagi 1 aktualizację . Aktualizacja sama mieści się w FP16, lecz wynik odejmowania, zapisany w FP16, zaokrągla się z powrotem do 1. Powtarzanie operacji niczego nie zbiera.
Kopia w FP32 zachowuje kolejne drobne zmiany. Po czterech takich aktualizacjach wynosi ; robocza kopia FP16 również pokazuje już tę zmianę. To inny problem niż gradient zbyt mały, żeby w ogóle dało się go zapisać.
W PyTorch 2.11 autocast dobiera format według operacji. Przykładowo kwalifikujące się mnożenia macierzy na CUDA mogą używać FP16, a Cross-entropy i Layer Normalization są na liście operacji wykonywanych w FP32. Oficjalna dokumentacja AMP, Autocasting i CUDA Op-Specific Behavior odradza ręczne wywoływanie half() na modelu przy użyciu autocast.
Oszczędność zależy od sprzętu, operacji i przechowywanych tensorów; nie wynika z tego automatycznie dwukrotnie szybszy cały trening. Activation Checkpointing ogranicza pamięć inną metodą: odtwarza aktywacje zamiast zmniejszać liczbę bitów ich reprezentacji.