Denne artikkelen er en speilartikkel om maskinoversettelse, vennligst klikk her for å hoppe til originalartikkelen.

Utsikt: 3298|Svare: 0

Dobbel presisjon (FP64), Enkel presisjon (P32, TF32), Halvpresisjon (FP16, BF16)

[Kopier lenke]
Publisert 10.03.2025 14:22:34 | | | |
Trening og resonnement i store modeller involverer ofte begrepet nøyaktighet, og det finnes mange typer, og de er også delt inn i ulike formater på samme nøyaktighetsnivå. I tillegg finnes det også konseptene multipresisjon og blandet presisjon i praktiske bruksscenarier.

Felles presisjon

Flyttallspresisjon: dobbel presisjon (FP64), enkel presisjon (FP32, TF32), halvpresisjon (FP16, BF16), 8-bits presisjon (FP8), 4-bits presisjon (FP4, NF4)
Kvantififikasjonsnøyaktighet: INT8, INT4 (også INT3/INT5/INT6)

Et flyttalltall består av tre deler: fortegn-, eksponential- og mantissabiter. Jo større den eksponentielle biten er, desto større tallrekkevidde kan representeres. Jo større mantissa-sifferet er, desto høyere nøyaktighet er tallet.



Tabellen oppsummerer det som følger

formatSymbolbitEksponentiell bitDesimalplassTotalt antall sifre
FP641115264
FP32182332
TF32181019
BF1618716
FP16151016
FP8 E4M31438
FP8 E5M21528
FP41214


FP32: 32-bits flyttall, 4 byte per data
TF32: 19-bits flyttall, hver data er 2 byte
FP16: 16-bits flyttall, 2 byte per data
BF16: 16-bits flyttall, hver data er 2 byte
Int8: 8-bits heltall, hver data utgjør 1 byte
Int4: 4-bits heltall, hver data er 0,5 byte

Hvorfor så mye presisjon

På grunn av kostnad og nøyaktighet. Vi vet alle at høy nøyaktighet definitivt er mer nøyaktig, men det vil også medføre høyere kostnader for databehandling og lagring. Lavere presisjon reduserer beregningsnøyaktigheten, men kan forbedre beregningseffektivitet og ytelse. Så en rekke forskjellige presisjoner lar deg velge den mest hensiktsmessige i ulike situasjoner.
Dobbel presisjon er mer nøyaktig enn uttrykk med enkel presisjon, men det tar dobbelt så mye lagringsplass og lengre tid å beregne.

Hvorfor må store modeller kvantifiseres?

1. Reduser minnebruket
Store modeller bruker vanligvis 32-bits flyttallstall (FP32) eller 16-bits flyttallstall (FP16) for å representere vekter og aktiveringsverdier. Ved kvantisering kan disse høypresisjonsverdiene konverteres til representasjoner med lavere presisjon (f.eks. 8-bits heltall, INT8), noe som betydelig reduserer modellens lagringsplass. Dette er viktig for distribusjon på ressursbegrensede enheter som mobile enheter, innebygde systemer osv.

2. Akselerer resonnementshastigheten
Kvantiserte modeller kan kjøre mer effektivt på maskinvare. Mye moderne maskinvare (som GPU-er, TPU-er, NPU-er osv.) har spesialisert optimaliseringsstøtte for lavpresisjonsdatabehandling, noe som muliggjør raskere kvantiseringsoperasjoner. I tillegg involverer lavpresisjonsberegninger ofte færre bitoperasjoner, noe som reduserer beregningskompleksiteten og dermed øker slutningen.

3. Reduser strømforbruket
Den kvantiserte modellen reduserer ikke bare behovet for datakraftressurser, men reduserer også strømforbruket. Dette er spesielt viktig for batteridrevne enheter som smarttelefoner, IoT-enheter osv., hvor lavt strømforbruk betyr lengre batterilevetid.

4. Enkle å distribuere edge-enheter
Mange store modeller ble opprinnelig trent og distribuert i skyen, men med utviklingen av edge computing krever stadig flere applikasjonsscenarier at modeller distribueres på edge-enheter. Med begrenset datakraft og lagringsressurser på edge-enheter kan kvantisering hjelpe disse modellene å kjøre mer effektivt på edge-enheter.

5. Reduser båndbreddekravene
I prosessen med distribuert inferens- eller modelloppdateringer kan kvantisering redusere båndbredden som kreves for modelloverføring. Dette er nyttig i miljøer med begrenset nettverksbåndbredde, som IoT-enheter i avsidesliggende områder.

6. Opprettholde modellens ytelse
Selv om kvantisering medfører et visst tap av presisjon, kan modellens opprinnelige ytelse i stor grad bevares gjennom passende kvantiseringsmetoder (som blandet presisjonskvantisering, kvantisering etter trening, kvantitativ persepsjonstrening osv.). Derfor kan kvantifisering i praktiske anvendelser finne en god balanse mellom ytelse og effektivitet.

Minnereferanse

typeHver milliard parametere må fylle minnet
float324G
FP16/BF162G
int81G
int40,5G


FP64 (Dobbel presisjon)

64-bits flyttall, vanligvis et dobbeltpresisjons binært flyttallsformat definert av IEEE 754, har:

1-sifret symbol
11-sifret indeks
52 desimaler



Rekkevidde: ~2,23e-308 ... ~1,80e308 med full 15-17 desimalpresisjon.

Bruk:

Dette formatet brukes for vitenskapelige beregninger som krever høy presisjon.
Det brukes vanligvis ikke til dyp læringsberegninger.
Programvarestøtte:
Representerer dobbelttypen på de fleste C/C++-systemer.
Støttes i TensorFlow (f.eks. tf.float64) / PyTorch (f.eks. torch.float64 eller torch.double).
Maskinvarestøtte:
Vanligvis støttet i x86-CPU-er.
De fleste GPU-er, spesielt gaming-GPU-er, inkludert RTX-serien, er sterkt begrenset i FP64-ytelse (vanligvis 1/32 av FP32-ytelsen i stedet for 1/2).
Nylige ubegrensede FP64-støttede GPU-er inkluderer GP100/100/102/104 i Tesla P40/P4 og Quadro GP100, GV100 i Tesla V100/Quadro GV100/Titan V, og den nylig annonserte GA100 i A100 (interessant nok har den nye Ampere-arkitekturen en tredje generasjon) sammenlignet med FP64-aktiverte Tensor-kjerner Den nye IEEE-kompatible FP64-prosesseringen er nå inkludert, som leverer 2,5 ganger FP64-ytelsen til V100.

FP32 (Full presisjon)

Dette formatet har lenge vært en arbeidshest for dyp læring. Et annet IEEE 754-format, enkeltpresisjons flyttall, har:

1-sifret symbol
8-sifret indeks
23 desimaler
Ideelt sett bør både trening og slutning gjøres i FP32, men FP32 er dobbelt så treg som FP16/BF16, så blandede presisjonsmetoder brukes ofte i praksis, hvor FP32-vekter brukes som eksakt "hovedvekt", FP16/BF16-vekter brukes til fremover- og bakoverpropagasjonsberegninger for å forbedre treningshastigheten, og til slutt oppdateres FP32-suverene vekter med FP16/BF16-gradienter i gradientoppdateringsfasen.

Under trening er den suverene vekten alltid FP32. I praksis gir halvpresisjonsvekter ofte lignende nøyaktighet som FP32 ved slutning – fordi nøyaktige FP32-vekter bare trengs når modellgradienten oppdateres. Dette betyr at vi kan bruke vekter med halv presisjon ved slutning, så vi får samme resultat med bare halvparten av GPU-minnet.



Rekkevidde: ~1,18e-38 ... ~3,40e38 med en nøyaktighet på 6–9 signifikante desimaler.

Bruk:

Standardtypen nevrale nettverksberegninger i lang tid. Vekter, aktiveringer og andre verdier i nevrale nettverk har lenge vært standard for FP32.
For mange vitenskapelige beregninger, spesielt iterative, er ikke nøyaktigheten tilstrekkelig, noe som fører til opphopning av feil.
Programvarestøtte:
Representerer flottørtypen på de fleste C/C++-systemer.
Støttes i TensorFlow (f.eks. tf.float32) / PyTorch (f.eks. torch.float32 eller torch.float).
Maskinvarestøtte:
Vanligvis støttet i x86-CPU-er.
Vanligvis støttes det av NVIDIA/AMD GPU.

FP16 (Halv presisjon)

På samme måte har IEEE 754-standardformatet, halvpresisjons flyttallsformatet:

1-sifret symbol
5-sifret indeks
10 desimaler
FP16-nummeret har et mye lavere numerisk område enn FP32. Derfor er FP16 utsatt for overløp (når det brukes til å representere svært store tall) og underløp (når det brukes til å representere svært små tall). For eksempel, når du gjør 10k * 10k, skal sluttresultatet være 100M, noe FP16 ikke kan representere fordi det maksimale antallet FP16 kan representere er 64k. Så du ender opp med NaN (ikke et tall) i nevrale nettverksberegninger, fordi beregningene gjøres i lagdelt og batch-rekkefølge, så når NaN dukker opp, blir alle tidligere beregninger ødelagt. Generelt kan dette dempes med tapskalering, men denne tilnærmingen fungerer ikke alltid.



Rekkevidde: ~5,96e−8 (6,10e−5) ... 65504, med en nøyaktighet på 4 signifikante desimaler.

Bruk:

Dyp læring bruker gjerne FP16 i stedet for FP32, siden lavere presisjonsberegninger ikke ser ut til å ha betydning for nevrale nettverk. Den ekstra presisjonen gjør ingenting, og samtidig er det tregere, krever mer minne og bremser kommunikasjonen.
Kan brukes til trening, vanligvis med blandet presisjonstrening (TensorFlow/PyTorch).
Kan brukes til kvantisering etter trening for å øke hastigheten på inferensen (TensorFlow Lite). Andre formater brukt for kvantisering etter trening inkluderer heltall INT8 (8-bits heltall), INT4 (4-bit) og til og med INT1 (binære verdier).
Programvarestøtte:
Ikke for øyeblikket i C/C++-standarden (men det finnes et forslag om kort flyt). Noen C/C++-systemer støtter __fp16 typer. Ellers kan den brukes med spesielle biblioteker.
Støttes i TensorFlow (f.eks. tf.float16) / PyTorch (f.eks. torch.float16 eller torch.half).
Maskinvarestøtte:
x86-CPU-er støttes ikke (som en unik type).
Støtten på eldre gaming-GPU-er er dårlig (32/1 ytelse for FP64, se innlegget om GPU-er for mer informasjon). Det støttes for øyeblikket godt på moderne GPU-er, som NVIDIA RTX-serien.

BFLOAT16 (Halvpresisjon)

Et annet 16-bits format opprinnelig utviklet av Google kalles "Brain Floating Point Format", eller "bfloat16" for kort. Navnet kommer fra Google Brain.

Den opprinnelige IEEE FP16 ble designet uten dyp læringsapplikasjoner i tankene, og dens dynamiske område var for smalt. BFLOAT16 løser dette problemet og gir samme dynamiske område som FP32.

Derfor har BFLOAT16:

1-sifret symbol
8-sifret indeks
7 desimaler



bfloat16-formatet er forkortet til IEEE 754 FP32, noe som tillater rask konvertering til og fra IEEE 754 FP32. Når man konverterer til bfloat16-formatet, bevares eksponentielle biter, mens mantissfeltene kan reduseres ved avkapning.



Rekkevidde: ~1,18e-38 ... ~3,40e38 med 3 signifikante desimaler.
Bruk:

Nå ser det ut til at den erstatter FP16. I motsetning til FP16, som ofte krever spesiell prosessering gjennom teknikker som tapskalering, er BF16 nesten en direkte erstatning for FP32 når man trener og kjører dype nevrale nettverk.
Programvarestøtte:
Ikke i C/C++-standarden. Kan brukes med spesielle biblioteker.
Støttes i TensorFlow (f.eks. tf.bfloat16) / PyTorch (f.eks. torch.bfloat16).

TF32

TensorFloat-32 eller TF32 er den nye matematikkmodusen i NVIDIA A100 GPU-er.

Ved å bruke de samme 10-bits mantissene som halvpresisjonsmatematikk (FP16), viser TF32 seg å ha nok kapasitet til å møte presisjonskravene til AI-arbeidsbelastninger. Og TF32 bruker samme 8-bits indeks som FP32, så den kan støtte samme numeriske område.

Teknisk sett er det et 19-bits format. Tenk på det som en utvidet presisjons BFLOAT16, som "BFLOAT19" eller en redusert presisjon som FP32.

Så, TF32 har:

1-sifret symbol
8-sifret indeks
10 desimaler
Fordelen med TF32 er at det har samme format som FP32. Når man beregner indre produkt med TF32, rundes mantissen til inngangsoperanden fra 23 til 10 biter. Avrundingsoperandene multipliseres nøyaktig og akkumuleres i vanlig FP32.

TF32 Tensor Core kjører på FP32-innganger og genererer resultater i FP32 uten kodeendringer. Ikke-matrise-operasjoner fortsetter å bruke FP32. Dette gir en enkel måte å akselerere FP32 inn-/utdatadata i dyp læringsrammeverk og HPC.

Rekkevidde: ~1,18e-38 ... ~3,40e38 med en nøyaktighet på 4 signifikante desimaler.
Bruk:

En av de flotte tingene med TF32 er at det bare trenger kompilatorstøtte på det dypeste nivået, altså inne i CUDA-kompilatoren. Resten av koden ser bare FP32 med mindre presisjon, men samme dynamiske område. Å bruke TF32 er hovedsakelig for å ringe biblioteket for å vise om det fungerer som det skal. Tilstedeværelsen av TF32 muliggjør raske plug-ins, og utnytter hastigheten til Tensor-kjernene uten mye arbeid.
Formater som FP16 og BFLOAT16 krever mer justering siden de involverer ulike bitoppsett. Men bruk av disse formatene reduserer minnebåndbredden, noe som gir raskere utførelse.
Til sammenligning er A100s toppytelse:

FP32 uten tensorkjerner: 19,5 TFLOPS
TF32 Tensor-kjerner: 156 TFLOPS (så å bruke TF32 i stedet for FP32 gjør det enkelt å øke hastigheten).
FP16/BF16 tensorkjerner: 312 TFLOPS (derfor kan et rimelig bytte til FP16/BF16 gi flere hastighetsgevinster, men til en høyere kostnad).
Programvarestøtte:
Ikke i C/C++-standarden.
CUDA 11 støttes.
Maskinvarestøtte:
GPU: NVIDIA A100 er den første modellen som støttes

FP8

Introdusert av H100 GPU, muliggjør den større matrisemultiplikasjon og konvolusjon, men med lavere presisjon.

FP100-datatypene som støttes av H8 er faktisk to forskjellige datatyper som kan brukes til ulike deler av treningen av nevrale nettverk:

E4M3 – består av 1 symbolsk bit, 4 eksponentielle biter og 3 desimaler. Den kan lagre opptil +/-448 og nan.
E5M2 - består av 1 fortegnbit, 5 eksponentielle biter og 2 desimaler. Den kan lagre verdier opp til +/-57344, +/-inf og nan. Ulempen med å øke dynamisk område er at de lagrede verdiene er mindre nøyaktige.



Struktur for flyttallsdatatyper. Alle viste verdier (i FP16, BF16, FP8 E4M3 og FP8 E5M2) er den nærmeste representasjonen av verdien 0,3952.

Begge typer kan brukes under trening av et nevralt nettverk. Generelt krever fremoveraktivering og vekter høyere presisjon, så det er best å bruke E4M3-datatypen under fremoverpassering. Men i backpropagation er gradienten som flyter gjennom nettverket generelt mindre utsatt for tap av presisjon, men krever et høyere dynamisk område. Derfor er det best å lagre dem i E5M2-dataformatet. H100 TensorCore støtter enhver kombinasjon av disse typene som input, slik at vi kan lagre hver tensor med dens foretrukne presisjon.

Referanse:

Innloggingen med hyperkoblingen er synlig.
Innloggingen med hyperkoblingen er synlig.




Foregående:Nettverk – Enheter under hovedruten og underruten er sammenkoblet
Neste:[AI] (10) LLM stor modell inferens, GPU-minne VRAM-estimering
Ansvarsfraskrivelse:
All programvare, programmeringsmateriell eller artikler publisert av Code Farmer Network er kun for lærings- og forskningsformål; Innholdet ovenfor skal ikke brukes til kommersielle eller ulovlige formål, ellers skal brukerne bære alle konsekvenser. Informasjonen på dette nettstedet kommer fra Internett, og opphavsrettstvister har ingenting med dette nettstedet å gjøre. Du må fullstendig slette innholdet ovenfor fra datamaskinen din innen 24 timer etter nedlasting. Hvis du liker programmet, vennligst støtt ekte programvare, kjøp registrering, og få bedre ekte tjenester. Hvis det foreligger noen krenkelse, vennligst kontakt oss på e-post.

Mail To:help@itsvse.com