Trenowanie z mieszaną precyzją za pomocą AMP
torch.cuda.amp.autocast(), GradScaler, FP16 a BF16, oszczędność pamięci, wzrost szybkości.
Trenowanie z mieszaną precyzją za pomocą AMP to bezpłatna lekcja Learn AI with Python na CoddyKit. To lekcja 3 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej Learn AI with Python, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs Learn AI with Python zawiera 4 lekcji w sumie.
Czym jest mixed precision
Trenowanie w trybie mixed precision wykonuje większość operacji na 16-bitowych liczbach zmiennoprzecinkowych (FP16) zamiast 32-bitowych (FP32). FP16 zajmuje o połowę mniej pamięci i działa szybciej na współczesnych rdzeniach tensorowych GPU, podczas gdy kilka wrażliwych operacji pozostaje w FP32 dla zachowania stabilności.
Korzyści
Mixed precision zapewnia:
- około 2 razy mniejsze zużycie pamięci, co umożliwia używanie większych batchy lub modeli
- Szybsze mnożenie macierzy na rdzeniach tensorowych
- Brak lub niewielki spadek końcowej dokładności modelu, jeśli rozwiązanie zostanie poprawnie zastosowane
Problem underflow w FP16
FP16 ma wąski zakres wartości. Małe wartości gradientów mogą ulec underflow i stać się zerem, niepostrzeżenie zatrzymując uczenie. To główne wyzwanie, które musi rozwiązać mixed precision, i powód, dla którego nie można po prostu przekonwertować wszystkiego do FP16.
torch.cuda.amp
PyTorch Automatic Mixed Precision (AMP) obsługuje te szczegóły za pomocą dwóch narzędzi: autocast dobiera precyzję dla poszczególnych operacji, a GradScaler zapobiega underflow gradientów.
import torch
from torch.cuda.amp import autocast, GradScalerKontekst autocast
Przebieg w przód należy umieścić w autocast(). W jego obrębie PyTorch automatycznie uruchamia każdą operację z użyciem najbezpieczniejszej precyzji: mnożenie macierzy w FP16, a redukcje, takie jak softmax i obliczanie funkcji straty, w FP32.
with autocast():
output = model(x)
loss = criterion(output, y)Wprowadzenie GradScaler
GradScaler przeciwdziała underflow, mnożąc funkcję straty przez duży współczynnik skalowania przed propagacją wsteczną. Przesuwa to małe gradienty do zakresu reprezentowalnego w FP16; współczynnik jest usuwany przed krokiem optymalizatora.
scaler = GradScaler()Skalowanie funkcji straty
scaler.scale(loss).backward() skaluje funkcję straty w górę, a następnie uruchamia propagację wsteczną. Wynikowe gradienty również są przeskalowane, dzięki czemu małe wartości nie zanikają.
scaler.scale(loss).backward()scaler.step
scaler.step(optimizer) najpierw przywraca gradientom ich rzeczywistą skalę, a następnie wywołuje optimizer.step(), ale tylko wtedy, gdy nie pojawiły się wartości inf ani NaN. Jeśli gradienty uległy przepełnieniu, krok zostaje pominięty.
scaler.step(optimizer)scaler.update
scaler.update() dostosowuje współczynnik skalowania na następną iterację: zwiększa go, gdy kroki kończą się powodzeniem, i zmniejsza po wystąpieniu przepełnienia. To adaptacyjne skalowanie automatycznie zapewnia stabilność trenowania.
scaler.update()Pełna pętla AMP
Po połączeniu wszystkich elementów otrzymują Państwo kompletny krok trenowania w trybie mixed precision.
scaler = GradScaler()
for x, y in loader:
x, y = x.cuda(), y.cuda()
optimizer.zero_grad()
with autocast():
out = model(x)
loss = criterion(out, y)
scaler.scale(loss).backward()
scaler.step(optimizer)
scaler.update()Praktyczne wskazówki
Warto pamiętać o następujących zasadach:
- Wywołują Państwo
backward()tylko dla przeskalowanej funkcji straty - autocast obejmuje wyłącznie przebieg w przód, a nie propagację wsteczną ani krok optymalizatora
- AMP najlepiej sprawdza się na GPU z rdzeniami tensorowymi; na starszym sprzęcie korzyści są mniejsze
Szybkie sprawdzenie
Proszę sprawdzić swoją wiedzę o AMP.
Podsumowanie
Poznali Państwo trenowanie w trybie mixed precision z użyciem AMP:
autocast()dobiera FP16 lub FP32 dla każdej operacji podczas przebiegu w przód- GradScaler skaluje funkcję straty, aby zapobiec underflow gradientów
- Cykl obejmuje
scaler.scale(loss).backward(),scaler.step(optimizer)orazscaler.update() - Rezultat: około 2 razy mniejsze zużycie pamięci i szybsze trenowanie
Często zadawane pytania
Czy lekcja „Trenowanie z mieszaną precyzją za pomocą AMP” jest bezpłatna?
Tak — pełny tekst „Trenowanie z mieszaną precyzją za pomocą AMP” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu Learn AI with Python, przejdź na CoddyKit PRO. Kurs Learn AI with Python zawiera 4 lekcji w sumie.
Co nauczysz się w „Trenowanie z mieszaną precyzją za pomocą AMP”?
torch.cuda.amp.autocast(), GradScaler, FP16 a BF16, oszczędność pamięci, wzrost szybkości. Ćwiczysz Learn AI with Python z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.
Czy potrzebuję doświadczenia, aby zacząć Learn AI with Python?
Nie wymagamy żadnego doświadczenia. Learn AI with Python w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 3 z 4.
Ile czasu zajmuje lekcja „Trenowanie z mieszaną precyzją za pomocą AMP”?
Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.
Czy mogę pisać i uruchamiać kod w tej lekcji Learn AI with Python?
Tak. Każda lekcja Learn AI with Python zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.
Wszystkie lekcje w tym kursie
- Trenowanie na wielu GPU za pomocą DataParallel
- DistributedDataParallel (DDP)
- Trenowanie z mieszaną precyzją za pomocą AMP
- Wydajne trenowanie za pomocą Hugging Face Accelerate