GPU's voor je projecten · crypto-betaling zonder KYC Hoe huren
Nederlands
Console openen
Praktische gids / KERNODECK

Overstappen op gemengde precisie zonder de numerieke controle te verliezen

Stel een referentie op in de gebruikelijke precisie, activeer autocast op de berekening voorwaarts en de loss, en vergelijk vervolgens uitvoer, gradiënten en kwaliteit op dezelfde invoer. Bij FP16-training helpt GradScaler om gradiënten met kleine amplitude te beheren; het maakt niet elk model compatibel. BF16 heeft een ander numeriek gedrag. Behoud een expliciet criterium voor terugrollen voordat je een geheugen- of snelheidswinst nastreeft.

7 min leestijd · Gids voor ontwikkelaars

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.
Precisiebeslissingen om op het project te valideren
KeuzeRolNodige controle
FP32-referentieVergelijkingspunt van het projectEindige uitvoer en verwachte kwaliteit
Autocast FP16Sommige bewerkingen in verlaagde precisieNumeriek bereik en gradiënten
Autocast BF16Andere afweging bereik/precisieBeschikbare operatoren en kwaliteit
GradScalerBeheer van de schaal van de gradiëntenDaadwerkelijk 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.

Pedagogische AMP-sequentie op GPU, niet uitgevoerd
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.
Didactisch vergelijkingsblad, aan te vullen met metingen
CriteriumReferentieAMP-testBeslissing
Eindige uitvoerTe verifiërenTe verifiërenNiet-verklaarde niet-eindige waarden weigeren
Numeriek verschilBehouden waardenVerschil te berekenenTolerantie vóór de test vastgelegd
Beslissing voor de toepassingKlasse of actieKlasse of actieWijzigingen onderzoeken
Kwaliteit op de vaste setTe metenTe metenDe 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.

Jouw vragen

Betekent AMP dat alle tensors naar FP16 gaan?

Nee. autocast past een beleid per operatie toe. Sommige operaties blijven in een andere precisie. Het hele model handmatig naar half() converteren is niet gelijkwaardig aan autocast gebruiken en kan de stabiliteitsvoorwaarden wijzigen.

Vervangt BF16 FP16 altijd met voordeel?

Nee. Beide formaten hebben verschillende afwegingen, en hun ondersteuning hangt af van de operaties en de omgeving. Vergelijk kwaliteit en kost op je workload; het bredere bereik van BF16 garandeert op zichzelf niet de vereiste precisie.

Is GradScaler nodig voor een inferentie?

De scaler speelt een rol bij training met gradiënten, niet bij een inferentie zonder backward. Controleer voor die laatste eerder de uitvoer en de kwaliteit onder autocast, met behoud van de verwachte evaluatiemodus.

Volstaat een eindig verlies om AMP te accepteren?

Nee. Controleer ook de gradiënten, de updates, de kwaliteit en de beslissingen van de applicatie. Een klein numeriek verschil kan beslissend zijn dicht bij een drempel; een training die doorloopt kan ook bepaalde updates overslaan.