Træning og ræsonnement af store modeller involverer ofte begrebet nøjagtighed, og der findes mange typer, og de er også opdelt i forskellige formater på samme nøjagtighedsniveau. Derudover findes der også begreberne multi-præcision og blandet præcision i praktiske scenarier.
Fælles præcision
Flydende kommatal-nøjagtighed: dobbelt præcision (FP64), enkelt præcision (FP32, TF32), halv præcision (FP16, BF16), 8-bit nøjagtighed (FP8), 4-bit nøjagtighed (FP4, NF4) Kvantificeringsnøjagtighed: INT8, INT4 (også INT3/INT5/INT6)
Et flydende kommatal består af tre dele: fortegn, eksponentiel og mantissa-bits. Jo større den eksponentielle bit er, desto større er det talområde, der kan repræsenteres. Jo større mantissa-cifferet er, desto højere er tallets nøjagtighed.
Tabellen opsummerer det som følger
| format | Symbolbit | Eksponentielt bit | Decimalplads | Samlede cifre | | FP64 | 1 | 11 | 52 | 64 | | FP32 | 1 | 8 | 23 | 32 | | TF32 | 1 | 8 | 10 | 19 | | BF16 | 1 | 8 | 7 | 16 | | FP16 | 1 | 5 | 10 | 16 | | FP8 E4M3 | 1 | 4 | 3 | 8 | | FP8 E5M2 | 1 | 5 | 2 | 8 | | FP4 | 1 | 2 | 1 | 4 |
FP32: 32-bit flydende kommatal, 4 bytes pr. data TF32: 19-bit flydende kommatal, hver data er 2 bytes FP16: 16-bit flydende kommatal, 2 bytes pr. data BF16: 16-bit flydende kommatal, hver data er 2 bytes Int8: 8-bit heltal, hver data udgør 1 byte Int4: 4-bit heltal, hver data er 0,5 bytes
Hvorfor så meget præcision
På grund af omkostninger og nøjagtighed. Vi ved alle, at høj nøjagtighed bestemt er mere præcis, men det vil også medføre højere omkostninger til computere og lagring. Lavere præcision reducerer beregningsnøjagtigheden, men kan forbedre beregningseffektivitet og ydeevne. Så en række forskellige præcisioner gør det muligt at vælge den mest egnede i forskellige situationer. Dobbelt præcision er mere præcist end enkelt præcisionsudtryk, men det optager dobbelt så meget lagerplads og tager længere tid at beregne.
Hvorfor skal store modeller kvantificeres?
1. Reducer hukommelsesforbruget Store modeller bruger normalt 32-bit flydende kommatal-tal (FP32) eller 16-bit flydende komma-tal (FP16) til at repræsentere vægte og aktiveringsværdier. Ved kvantisering kan disse højpræcisionsværdier konverteres til lavere præcisionsrepræsentationer (f.eks. 8-bit heltal, INT8), hvilket markant reducerer modellens lagerplads. Dette er vigtigt for implementering på ressourcebegrænsede enheder som mobile enheder, indlejrede systemer osv.
2. Accelerer ræsonnementshastigheden Kvantiserede modeller kan køre mere effektivt på hardware. Mange moderne hardware (såsom GPU'er, TPU'er, NPU'er osv.) har specialiseret optimeringsunderstøttelse til lavpræcisionsdatabehandling, hvilket muliggør hurtigere kvantiseringsoperationer. Derudover involverer lavpræcisionsberegninger ofte færre bitoperationer, hvilket reducerer beregningskompleksiteten og dermed øger slutningen.
3. Reducer strømforbruget Den kvantiserede model reducerer ikke kun behovet for computerressourcer, men reducerer også strømforbruget. Dette er især vigtigt for batteridrevne enheder som smartphones, IoT-enheder osv., hvor lavt strømforbrug betyder længere batterilevetid.
4. Let at implementere edge-enheder Mange store modeller blev oprindeligt trænet og implementeret i skyen, men med udviklingen af edge computing kræver flere og flere applikationsscenarier, at modeller implementeres på edge-enheder. Med begrænset regnekraft og lagerressourcer på edge-enheder kan kvantisering hjælpe disse modeller med at køre mere effektivt på edge-enheder.
5. Reducer båndbreddekravene I processen med distribueret inferens eller modelopdateringer kan kvantisering reducere den båndbredde, der kræves til modeloverførsel. Dette er nyttigt i miljøer med begrænset netværksbåndbredde, såsom IoT-enheder i fjerntliggende områder.
6. Vedligehold modellens ydeevne Selvom kvantisering medfører et vist tab af præcision, kan modellens oprindelige ydeevne i vid udstrækning bevares gennem passende kvantiseringsmetoder (såsom blandet præcisionskvantisering, eftertræningskvantisering, kvantitativ perceptionstræning osv.). Derfor kan kvantificering i praktiske anvendelser skabe en god balance mellem ydeevne og effektivitet.
Hukommelsesreference
| slags | Hver milliard parametre skal optage hukommelsen | | float32 | 4G | | FP16/BF16 | 2G | | int8 | 1G | | int4 | 0,5G |
FP64 (Dobbelt Præcision)
64-bit flydende kommatal, typisk et dobbeltpræcisions binært flydende komma-format defineret af IEEE 754, har:
1-cifret symbol 11-cifret indeks 52 decimaler
Rækkevidde: ~2,23e-308 ... ~1,80e308 med fuld 15-17 decimal præcision.
Brug:
Dette format bruges til videnskabelige beregninger, der kræver høj præcision. Det bruges typisk ikke til deep learning-beregninger. Softwareunderstøttelse: Repræsenterer dobbelttypen på de fleste C/C++-systemer. Understøttet i TensorFlow (f.eks. tf.float64) / PyTorch (f.eks. torch.float64 eller torch.double). Hardwareunderstøttelse: Typisk understøttet i x86 CPU'er. De fleste GPU'er, især gaming-GPU'er, inklusive RTX-serien, er stærkt begrænsede i FP64-ydelse (normalt 1/32 af FP32-ydelsen i stedet for 1/2). Nylige ubegrænsede FP64-understø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 nyligt annoncerede GA100 i A100 (interessant nok har den nye Ampere-arkitektur en tredje generation) sammenlignet med de FP64-aktiverede Tensor-kerner Den nye IEEE-kompatible FP64-behandling er nu inkluderet, hvilket leverer 2,5 gange FP64-ydelsen i forhold til V100.
FP32 (Fuld nøjagtighed)
Dette format har længe været en arbejdshest for dyb læring. Et andet IEEE 754-format, enkeltpræcisions flydende komma, har:
1-cifret symbol 8-cifret indeks 23 decimaler Ideelt set bør både træning og inferens udføres i FP32, men FP32 er dobbelt så langsom som FP16/BF16, så blandede præcisionsmetoder anvendes ofte i praksis, hvor FP32-vægte bruges som den præcise "hovedvægt", FP16/BF16-vægte bruges til fremad- og bagudpropageringsberegninger for at forbedre træningshastigheden, og endelig opdateres FP32-suveræne vægte med FP16/BF16-gradienter i gradientopdateringsfasen.
Under træning er den suveræne vægt altid FP32. I praksis giver halvpræcisionsvægte ofte lignende nøjagtighed som FP32 ved inferensering – fordi nøjagtige FP32-vægte kun er nødvendige, når modelgradienten opdateres. Det betyder, at vi kan bruge vægte med halv præcision ved inferens, så vi kan opnå samme resultat med kun halvdelen af GPU-hukommelsen.
Rækkevidde: ~1,18e-38 ... ~3,40e38 med en nøjagtighed på 6-9 signifikante decimaler.
Brug:
Den standardtype neurale netværksberegning i lang tid. Vægte, aktiveringer og andre værdier i neurale netværk har længe været standard på FP32. For mange videnskabelige beregninger, især iterative, er nøjagtigheden ikke tilstrækkelig, hvilket fører til ophobning af fejl. Softwareunderstøttelse: Repræsenterer flydningstypen på de fleste C/C++-systemer. Understøttet i TensorFlow (f.eks. tf.float32) / PyTorch (f.eks. torch.float32 eller torch.float). Hardwareunderstøttelse: Typisk understøttet i x86 CPU'er. Typisk understøttet af NVIDIA/AMD GPU.
FP16 (Halvpræcision)
Tilsvarende har IEEE 754-standardformatet, halvpræcisions flydende kommatal-formatet:
1-cifret symbol 5-cifret indeks 10 decimaler FP16-nummeret har et meget lavere numerisk interval end FP32. Derfor er FP16 i risiko for overløb (når det bruges til at repræsentere meget store tal) og underløb (når det bruges til at repræsentere meget små tal). For eksempel, når du laver 10k * 10k, burde slutresultatet være 100M, hvilket FP16 ikke kan repræsentere, fordi det maksimale tal, FP16 kan repræsentere, er 64k. Så ender du med NaN (ikke et tal) i neurale netværksberegninger, fordi beregningerne udføres i lagdelt og batch-rækkefølge, så når NaN dukker op, bliver alle tidligere beregninger ødelagt. Generelt kan dette afbødes ved tabsskalering, men denne tilgang virker ikke altid.
Rækkevidde: ~5,96e−8 (6,10e−5) ... 65504, med en nøjagtighed på 4 betydelige decimalcifre.
Brug:
Deep learning bruger typisk FP16 i stedet for FP32, da lavere præcisioner ikke ser ud til at have betydning for neurale netværk. Den ekstra præcision gør ingenting, og samtidig er det langsommere, kræver mere hukommelse og sænker kommunikationen. Kan bruges til træning, normalt med blandet præcisionstræning (TensorFlow/PyTorch). Kan bruges til kvantisering efter træning for at fremskynde inferensen (TensorFlow Lite). Andre formater, der bruges til kvantisering efter træning, inkluderer heltal INT8 (8-bit heltal), INT4 (4-bit) og endda INT1 (binære værdier). Softwareunderstøttelse: Ikke i øjeblikket i C/C++-standarden (men der er et kort float-forslag). Nogle C/C++-systemer understøtter __fp16 typer. Ellers kan det bruges med specielle biblioteker. Understøttet i TensorFlow (f.eks. tf.float16) / PyTorch (f.eks. torch.float16 eller torch.half). Hardwareunderstøttelse: x86 CPU'er understøttes ikke (som en unik type). Understøttelsen på ældre gaming-GPU'er er dårlig (32/1 ydeevne for FP64, se opslaget om GPU'er for flere detaljer). Den understøttes i øjeblikket godt på moderne GPU'er, såsom NVIDIA RTX-serien.
BFLOAT16 (Halvpræcision)
Et andet 16-bit format, oprindeligt udviklet af Google, kaldes "Brain Floating Point Format", eller "bfloat16" for kort. Navnet stammer fra Google Brain.
Den oprindelige IEEE FP16 var designet uden deep learning-applikationer for øje, og dens dynamiske område var for snævert. BFLOAT16 løser dette problem og giver samme dynamiske område som FP32.
Derfor har BFLOAT16:
1-cifret symbol 8-cifret indeks 7 decimaler
bfloat16-formatet er forkortet til IEEE 754 FP32, hvilket muliggør hurtig konvertering til og fra IEEE 754 FP32. Ved konvertering til bfloat16-formatet bevares eksponentielle bits, mens mantissafelterne kan reduceres ved afskæring.
Rækkevidde: ~1,18e-38 ... ~3,40e38 med 3 signifikante decimaler. Brug:
Nu ser det ud til at erstatte FP16. I modsætning til FP16, som ofte kræver særlig behandling gennem teknikker som tabsskalering, er BF16 næsten en direkte erstatning for FP32, når man træner og driver dybe neurale netværk. Softwareunderstøttelse: Ikke i C/C++-standarden. Kan bruges med specielle biblioteker. Understøttet i TensorFlow (f.eks. tf.bfloat16) / PyTorch (f.eks. torch.bfloat16).
TF32
TensorFloat-32 eller TF32 er den nye matematiktilstand i NVIDIA A100 GPU'er.
Ved at bruge de samme 10-bit mantisser som halvpræcisionsmatematik (FP16) beviser TF32 at have nok headroom til at opfylde præcisionskravene til AI-arbejdsbelastninger. Og TF32 bruger det samme 8-bit indeks som FP32, så det kan understøtte det samme numeriske interval.
Teknisk set er det et 19-bit format. Tænk på det som en udvidet præcisions BFLOAT16, såsom "BFLOAT19" eller en nedsat præcision som FP32.
Så TF32 har:
1-cifret symbol 8-cifret indeks 10 decimaler Fordelen ved TF32 er, at det har samme format som FP32. Når indvendigt produkt beregnes med TF32, afrundes mantissen for inputoperanden fra 23 til 10 bit. Afrundingsoperanderne multipliceres nøjagtigt og akkumuleres i normal FP32.
TF32 Tensor Core kører på FP32-input og genererer resultater i FP32 uden kodeændringer. Ikke-matrixoperationer fortsætter med at bruge FP32. Dette giver en nem måde at accelerere FP32 input/output-data i deep learning-frameworks og HPC.
Rækkevidde: ~1,18e-38 ... ~3,40e38 med en nøjagtighed på 4 betydelige decimaler. Brug:
En af de gode ting ved TF32 er, at det kun behøver compiler-support på det dybeste niveau, altså inde i CUDA-compileren. Resten af koden viser bare FP32 med mindre præcision, men samme dynamiske område. At bruge TF32 er primært for at foretage kald til biblioteket for at vise, om det fungerer korrekt. Tilstedeværelsen af TF32 muliggør hurtige plug-ins, hvor man udnytter hastigheden fra Tensor Cores uden meget arbejde. Formater som FP16 og BFLOAT16 kræver mere justering, da de involverer forskellige bitlayouts. Men brugen af disse formater reducerer hukommelsesbåndbredden, hvilket muliggør hurtigere eksekvering. Til sammenligning er A100's topydelse:
FP32 uden tensorkerner: 19,5 TFLOPS TF32 Tensor-kerner: 156 TFLOPS (så at bruge TF32 i stedet for FP32 gør det nemt at øge hastigheden). FP16/BF16 Tensor-kerner: 312 TFLOPS (derfor kan et rimeligt skift til FP16/BF16 give flere hastighedsgevinster, men til en højere pris). Softwareunderstøttelse: Ikke i C/C++-standarden. CUDA 11 understøttet. Hardwareunderstøttelse: GPU: NVIDIA A100 er den første model, der understøttes
FP8
Indført af H100 GPU'en muliggør den større matrixmultiplikation og konvolution, men med lavere præcision.
De FP100-datatyper, som H8 understøtter, er faktisk to forskellige datatyper, der kan bruges til forskellige dele af neurale netværkstræning:
E4M3 - består af 1 symbolsk bit, 4 eksponentielle bits og 3 decimaler. Den kan gemme op til +/-448 og nan. E5M2 - består af 1 fortegnsbit, 5 eksponentielle bits og 2 decimaler. Den kan gemme værdier op til +/-57344, +/-inf og nan. Ulempen ved at øge det dynamiske område er, at de lagrede værdier er mindre nøjagtige.
Struktur af flydende-komma datatyper. Alle viste værdier (i FP16, BF16, FP8 E4M3 og FP8 E5M2) er den nærmeste repræsentation af værdien 0,3952.
Begge typer kan bruges under træning af et neuralt netværk. Generelt kræver fremadrettet aktivering og vægte højere præcision, så det er bedst at bruge E4M3-datatypen under fremadgående passage. Men i backpropagation er gradienten, der strømmer gennem netværket, generelt mindre modtagelig for tab af præcision, men kræver et højere dynamisk område. Derfor er det bedst at gemme dem i E5M2-dataformatet. H100 TensorCore understøtter enhver kombination af disse typer som input, hvilket gør det muligt for os at gemme hver tensor med dens foretrukne præcision.
Henvisning:
Hyperlink-login er synlig.
Hyperlink-login er synlig. |