Begin met een referentie die aan de behoefte voldoet
Kies een korte set met gewone invoer, randgevallen en beslissingsgrenzen. Zet model, gewichten, voorverwerking en de modus train of eval vast. Een vergelijking tussen twee modellen of twee batches maakt het niet mogelijk hun verschil aan de precisie toe te schrijven.
Registreer de uitvoer die nuttig is voor je toepassing, niet alleen de loss. Voor een classificator kan dat scores en beslissingen omvatten; voor een regressie de fout en extreme waarden. Controleer in de referentie al op de aanwezigheid van NaN of inf. Een onjuiste FP32-uitvoering wordt geen betrouwbare basis omdat ze meer bits heeft.
Stel tolerantie, minimale kwaliteit en de afwezigheid van niet-eindige waarden vast vóór de test. PyTorch herinnert eraan dat drijvende-kommarekening geen identieke resultaten garandeert tussen apparaten of uitvoeringspaden.
Onderscheid maken tussen autocast, numeriek formaat en GradScaler
autocast kiest het type van bepaalde bewerkingen op basis van hun rekenbeleid. Het zet niet het hele programma om naar één formaat. Vermijd bij dit gebruik om het hele model handmatig met half() te converteren. De huidige documentatie raadt torch.autocast of torch.amp.autocast aan; de oudere interfaces torch.cuda.amp zijn verouderd.
GradScaler beïnvloedt de schaal van de loss en de gradiënten tijdens het trainen. Het wordt niet gebruikt als een versneller voor inferentie, die geen backward uitvoert. FP16 heeft een kleiner numeriek bereik dan BF16; een model dat voor BF16 is ontworpen kan overflowen in FP16. Een herhaalde verlaging van de schaal bewijst dus niet dat het probleem is opgelost.
Kies het formaat op basis van de beperkingen van het model en de bewerkingen die daadwerkelijk worden gebruikt, en controleer vervolgens de ondersteuning van het doel. De commerciële naam van een kaart of een voorkeur bij het voorbereiden van PyTorch bewijst niet dat je aangepaste operator de gewenste kernel heeft.
Scroll door de tabel om alle kolommen te lezen.| Keuze | Rol | Nodige controle |
|---|---|---|
| FP32-referentie | Vergelijkingspunt van het project | Eindige uitvoer en verwachte kwaliteit |
| Autocast FP16 | Sommige bewerkingen in verlaagde precisie | Numeriek bereik en gradiënten |
| Autocast BF16 | Andere afweging bereik/precisie | Beschikbare operatoren en kwaliteit |
| GradScaler | Beheer van de schaal van de gradiënten | Daadwerkelijk uitgevoerde updates |
Zet de stappen van het trainen in de juiste volgorde
Het voorgestelde fragment veronderstelt een al gebouwd model en een al gebouwde optimizer, een input en een target op dezelfde GPU, en een scalaire loss. Het is niet uitgevoerd en vormt geen validatie van een aanbod. De autocast-context omvat de forward en de loss; de backward vindt plaats na het sluiten ervan. De scaler wordt één keer voor de trainingssessie aangemaakt, niet bij elke batch.
Om de gradiënten te inspecteren of te clippen, verwijder je eerst hun schaalfactor met unscale_. De officiële AMP-voorbeelden geven aan dit één keer per optimizer te doen en na het accumuleren van de gradiënten die voor zijn update bestemd zijn. De clipdrempel 1.0 hieronder is een illustratieve waarde die je voor je project kiest, geen universele aanbeveling.
De guards onderbreken hier de diagnose als loss, gradiënten of totale norm niet eindig zijn. Deze CPU-uitlezingen zijn intrusief: meet de timing van dit fragment niet. Accumulatie, meerdere optimizers en een scheduler vereisen hun eigen definitie van de update.
import torch
# Preconditions: model, optimizer, loss_fn, inputs and targets exist.
# The model and inputs are on the same CUDA/HIP device.
dtype = torch.float16 # Choice to validate; BF16 is another attempt.
scaler = torch.amp.GradScaler("cuda", enabled=(dtype == torch.float16))
# Place this in your loop, keeping scaler between batches.
optimizer.zero_grad(set_to_none=True)
with torch.autocast(device_type="cuda", dtype=dtype):
prediction = model(inputs)
loss = loss_fn(prediction, targets)
if not bool(torch.isfinite(loss).item()):
raise FloatingPointError("Loss not finite: stop the diagnosis")
scaler.scale(loss).backward()
scaler.unscale_(optimizer)
if any(p.grad is not None and
not bool(torch.isfinite(p.grad).all().item())
for p in model.parameters()):
raise FloatingPointError("Gradient not finite: stop the diagnosis")
torch.nn.utils.clip_grad_norm_(
model.parameters(), max_norm=1.0, error_if_nonfinite=True,
)
scaler.step(optimizer)
scaler.update()Uitgewerkt voorbeeld: twee nabije beslissingen zijn niet uitwisselbaar
Stel een service voor die de klasse met de hoogste score kiest. Op een pedagogische input levert de referentie twee zeer nabije scores op: 1,0000 en 1,0003. Een ander numeriek pad zou hun volgorde kunnen veranderen of een gelijkspel kunnen veroorzaken. Deze getallen illustreren een beslissingsgrens; het zijn geen gemeten uitvoerwaarden van FP16 of BF16.
De juiste verificatie kent twee niveaus. Vergelijk de scores met expliciete toleranties, en vergelijk vervolgens de beslissing en de regel die op gelijkspelen wordt toegepast. Een klein verschil in absolute waarde kan de gekozen actie veranderen. Omgekeerd kan een zichtbaar numeriek verschil zonder gevolgen blijven voor een taak waarvan de drempel ver van de waargenomen scores ligt.
Leg identificaties, referentie-uitvoer, AMP-test en impact op de beslissing vast. Stel de acceptatieregel vast voordat je de resultaten bekijkt. Verruim de tolerantie niet om een lastig geval te laten verdwijnen; uitvoer van verschillende schalen kan verschillende criteria vereisen.
Scroll door de tabel om alle kolommen te lezen.| Criterium | Referentie | AMP-test | Beslissing |
|---|---|---|---|
| Eindige uitvoer | Te verifiëren | Te verifiëren | Niet-verklaarde niet-eindige waarden weigeren |
| Numeriek verschil | Behouden waarden | Verschil te berekenen | Tolerantie vóór de test vastgelegd |
| Beslissing voor de toepassing | Klasse of actie | Klasse of actie | Wijzigingen onderzoeken |
| Kwaliteit op de vaste set | Te meten | Te meten | De drempel van het project respecteren |
NaN en overgeslagen updates interpreteren
Wanneer niet-eindige waarden opduiken, zoek dan de eerste stap die ze produceert: invoer, tussenliggende uitvoer, verlies of gradiënt. Speel hetzelfde geval opnieuw af als referentie en schakel autocast plaatselijk uit rond de verdachte operatie, waarbij je ook het type van de invoer controleert. Een hele training opnieuw in FP32 doorlopen kan als vergelijking dienen, maar lokaliseert het probleem niet automatisch.
De scaler kan een update overslaan wanneer de gradiënten inf of NaN bevatten. Een lus die doorgaat, heeft dus niet noodzakelijk evenveel updates uitgevoerd als iteraties. Leg dit gedrag vast tijdens de diagnose. Laat een leerbeleid dat verondersteld wordt de effectieve updates te volgen niet blind voortgang maken.
Een eindig verlies garandeert geen eindige gradiënten. Omgekeerd volstaat een eenmalig incident niet om een training als onbruikbaar te bestempelen: onderzoek de frequentie, de voortgang en de kwaliteit. Het AMP-recept biedt een methode om autocast en scaling afzonderlijk te isoleren wanneer een van beide verdacht is.
Een reproduceerbare terugkeer voorbereiden
Bewaar vóór de test de referentieconfiguratie, de gewichten, de toestand van de optimizer en een consistente checkpoint. Als je training een scaler gebruikt, maakt zijn toestand ook deel uit van het hervatten. Documenteer de dtype en de eventuele regio's die in FP32 blijven. Hervatten met een ander beleid is een experimentele wijziging om te identificeren, geen impliciet gelijkwaardige voortzetting.
Keer terug naar de vorige configuratie als de uitvoer niet-eindig wordt, als de kwaliteit buiten het vastgelegde criterium valt of als de updates niet meer bruikbaar vooruitgaan. Bewaar het geval dat deze terugkeer heeft veroorzaakt. Begin na een wijziging de vergelijking opnieuw op dezelfde set voordat je de duur verlengt.
De Kernodeck-oefening met checkpoints verifieert een CPU-hervatting zonder AMP. Hergebruik de vergelijkingsmethode en voeg de toestanden toe die je lus werkelijk verbruikt.
Winst pas meten na de numerieke validatie
Meet na de validatie geheugen en tijd zonder de gedetailleerde diagnose. Behoud vormen, batch, model en kwaliteit. Het uitlezen van scalairen, synchronisaties en profilers kunnen de tijden beïnvloeden; verwijder intrusieve controles uit de definitieve meting.
Op ROCm blijft de apparaatnaam van PyTorch cuda en worden de bijbehorende interfaces hergebruikt. Dat garandeert noch dezelfde kernels, noch identieke resultaten als NVIDIA. Verifieer de backend en de operatoren van het project op het doel. Deze gids kondigt geen vaste geheugenreductie, snelheidsvermenigvuldiging of compatibiliteit met Kernodeck-preparatie aan.