Addestramento a precisione mista con AMP
torch.cuda.amp.autocast(), GradScaler, FP16 e BF16 a confronto, risparmio di memoria, aumento della velocità
Addestramento a precisione mista con AMP è una lezione Learn AI with Python gratuita su CoddyKit. Questa è la lezione 3 di 4. Puoi leggere la lezione completa qui gratuitamente — poi esercitati direttamente nel browser con un editor di codice integrato e un tutor IA disponibile 24/7. Fa parte del percorso di apprendimento Learn AI with Python, e i tuoi progressi si sincronizzano tra il web e l'app CoddyKit. Il corso Learn AI with Python include 4 lezioni in totale.
Che cos'è la precisione mista
L'addestramento in precisione mista esegue la maggior parte delle operazioni utilizzando numeri in virgola mobile a 16 bit (FP16) anziché a 32 bit (FP32). FP16 utilizza metà della memoria e funziona più velocemente sui moderni tensor core delle GPU, mentre alcune operazioni sensibili rimangono in FP32 per garantire la stabilità.
I vantaggi
La precisione mista offre:
- un risparmio di memoria di circa 2x, che consente batch o modelli più grandi
- Moltiplicazioni tra matrici più veloci sui tensor core
- Poca o nessuna perdita di accuratezza del modello finale, se utilizzata correttamente
Il problema dell'underflow in FP16
FP16 ha un intervallo limitato. I valori piccoli dei gradienti possono ridursi a zero per underflow, interrompendo silenziosamente l'apprendimento. Questa è la sfida centrale che la precisione mista deve risolvere e il motivo per cui non possiamo semplicemente convertire tutto in FP16.
torch.cuda.amp
La Automatic Mixed Precision (AMP) di PyTorch gestisce questi dettagli con due strumenti: autocast sceglie la precisione per ogni operazione e GradScaler previene l'underflow dei gradienti.
import torch
from torch.cuda.amp import autocast, GradScalerIl contesto autocast
Avvolga il passaggio forward in autocast(). Al suo interno, PyTorch esegue automaticamente ogni operazione con la precisione più sicura: i prodotti tra matrici in FP16, le riduzioni come softmax e la loss in FP32.
with autocast():
output = model(x)
loss = criterion(output, y)Introduzione a GradScaler
GradScaler contrasta l'underflow moltiplicando la loss per un fattore di scala elevato prima della propagazione all'indietro. In questo modo sposta i gradienti molto piccoli nell'intervallo rappresentabile da FP16; la scala viene rimossa prima del passaggio dell'ottimizzatore.
scaler = GradScaler()Ridimensionamento della loss
scaler.scale(loss).backward() aumenta la scala della loss, quindi esegue la propagazione all'indietro. Anche i gradienti risultanti vengono ridimensionati, evitando che i valori piccoli scompaiano.
scaler.scale(loss).backward()scaler.step
scaler.step(optimizer) prima riporta i gradienti alla loro magnitudine reale rimuovendo la scala, quindi chiama optimizer.step(), ma solo se non sono comparsi inf o NaN. Se i gradienti sono andati in overflow, il passaggio viene saltato.
scaler.step(optimizer)scaler.update
scaler.update() modifica il fattore di scala per l'iterazione successiva: lo aumenta quando i passaggi hanno successo e lo riduce dopo un overflow. Questo ridimensionamento adattivo mantiene automaticamente stabile l'addestramento.
scaler.update()Il ciclo AMP completo
Unendo tutti gli elementi si ottiene un passaggio completo di addestramento a precisione mista.
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()Consigli pratici
Tenga presenti questi aspetti:
- Chiami
backward()solo sulla loss ridimensionata - autocast avvolge solo il passaggio forward, non la propagazione all'indietro né il passaggio dell'ottimizzatore
- AMP offre i maggiori vantaggi sulle GPU dotate di tensor core; i miglioramenti sono più contenuti sull'hardware meno recente
Verifica rapida
Metta alla prova le Sue conoscenze di AMP.
Riepilogo
Ha appreso l'addestramento a precisione mista con AMP:
autocast()sceglie FP16 o FP32 per ogni operazione nel passaggio forward- GradScaler ridimensiona la loss per evitare l'underflow dei gradienti
- Il ciclo è
scaler.scale(loss).backward(),scaler.step(optimizer),scaler.update() - Risultato: un risparmio di memoria di circa 2x e un addestramento più veloce
Domande Frequenti
La lezione «Addestramento a precisione mista con AMP» è gratuita?
Sì — il testo completo di «Addestramento a precisione mista con AMP» è gratuito qui sul web. Per esercitarvi in modo interattivo (un editor di codice integrato e un tutor IA 24/7) e sbloccare il resto del corso Learn AI with Python, passa a CoddyKit PRO. Il corso Learn AI with Python include 4 lezioni in totale.
Cosa imparerò in «Addestramento a precisione mista con AMP»?
torch.cuda.amp.autocast(), GradScaler, FP16 e BF16 a confronto, risparmio di memoria, aumento della velocità Eserciti Learn AI with Python con codice pratico che esegui direttamente nel browser, e un tutor IA 24/7 risponde alle tue domande mentre lavori sulla lezione.
Ho bisogno di esperienza per iniziare Learn AI with Python?
Non è richiesta alcuna esperienza precedente. Learn AI with Python su CoddyKit è strutturato per principianti e studenti avanzati, quindi puoi iniziare da qui o dall'inizio e procedere al tuo ritmo. Questa è la lezione 3 di 4.
Quanto tempo richiede la lezione «Addestramento a precisione mista con AMP»?
La maggior parte delle lezioni CoddyKit richiede circa 5–10 minuti. Ogni lezione è breve e interattiva, quindi fai progressi costanti e riprendi esattamente da dove hai lasciato su web e app.
Posso scrivere ed eseguire codice in questa lezione Learn AI with Python?
Sì. Ogni lezione Learn AI with Python include un editor di codice integrato, quindi scrivi ed esegui codice reale direttamente nel tuo browser e ricevi feedback istantaneo dall'IA — nessuna configurazione locale necessaria.
Tutte le lezioni di questo corso
- Addestramento multi-GPU con DataParallel
- DistributedDataParallel (DDP)
- Addestramento a precisione mista con AMP
- Addestramento efficiente con Hugging Face Accelerate