Acest articol este un articol oglindă al traducerii automate, vă rugăm să faceți clic aici pentru a sări la articolul original.

Vedere: 3298|Răspunde: 0

Precizie dublă (FP64), Precizie simplă (P32, TF32), Precizie Jumătate (FP16, BF16)

[Copiază linkul]
Postat la 2025-3-10 14:22:34 | | | |
Antrenamentul și raționamentul modelelor mari implică adesea conceptul de acuratețe, există multe tipuri, fiind de asemenea împărțite în formate diferite la același nivel de acuratețe. În plus, există și conceptele de multi-precizie și precizie mixtă în scenarii practice.

Precizie comună

Precizie în virgulă mobilă: precizie dublă (FP64), precizie simplă (FP32, TF32), precizie pe jumătate (FP16, BF16), acuratețe pe 8 biți (FP8), acuratețe pe 4 biți (FP4, NF4)
Acuratețea cuantificării: INT8, INT4 (de asemenea INT3/INT5/INT6)

Un număr în virgulă mobilă este format din trei părți: biți semn, exponențial și mantissă. Cu cât bitul exponențial este mai mare, cu atât intervalul de numere care pot fi reprezentate este mai mare. Cu cât cifra mantisei este mai mare, cu atât acuratețea numărului este mai mare.



Tabelul o rezumă astfel:

formatbit de simbolBitul exponențialZecimalăCifre totale
FP641115264
FP32182332
TF32181019
BF1618716
FP16151016
FP8 E4M31438
FP8 E5M21528
FP41214


FP32: Număr de virgulă mobilă pe 32 de biți, 4 octeți pe dată
TF32: Număr de virgulă mobilă pe 19 biți, fiecare dată are 2 octeți
FP16: Număr de virgulă mobilă pe 16 biți, 2 octeți pe dată
BF16: Număr în virgulă mobilă pe 16 biți, fiecare dată are 2 octeți
Int8: întreg pe 8 biți, fiecare dată reprezintă 1 octet
Int4: întregi pe 4 biți, fiecare dată are 0,5 octeți

De ce atâta precizie

Din cauza costului și acurateței. Știm cu toții că acuratețea ridicată este cu siguranță mai precisă, dar va aduce și costuri mai mari de calcul și stocare. Precizia mai scăzută reduce acuratețea calculelor, dar poate îmbunătăți eficiența și performanța computațională. Așadar, o varietate de precizii diferite îți permit să alegi cea mai potrivită în situații diferite.
Precizia dublă este mai precisă decât expresia cu precizie simplă, dar consumă de două ori mai mult spațiu de stocare și necesită mai mult timp pentru a fi calculată.

De ce trebuie cuantificate modelele mari?

1. Reducerea consumului de memorie
Modelele mari folosesc de obicei numere în virgulă mobilă pe 32 de biți (FP32) sau numere în virgulă mobilă pe 16 biți (FP16) pentru a reprezenta greutățile și valorile de activare. Prin cuantificare, aceste valori de înaltă precizie pot fi convertite în reprezentări cu precizie mai mică (de exemplu, întregi pe 8 biți, INT8), reducând semnificativ spațiul de stocare al modelului. Acest lucru este important pentru implementarea pe dispozitive cu resurse limitate, cum ar fi dispozitive mobile, sisteme embedded etc.

2. Accelerarea vitezei raționamentului
Modelele cuantificate pot rula mai eficient pe hardware. Multe hardware modern (cum ar fi GPU-urile, TPU-urile, NPU-urile etc.) au suport specializat pentru optimizare pentru calcul de precizie scăzută, permițând operații de cuantizare mai rapide. În plus, calculele cu precizie redusă implică adesea mai puține operații pe biți, reducând complexitatea computațională și accelerând astfel inferența.

3. Reducerea consumului de energie
Modelul cuantificat nu doar reduce nevoia de resurse de calcul, ci și consumul de energie. Acest lucru este deosebit de important pentru dispozitivele alimentate cu baterii, cum ar fi smartphone-urile, dispozitivele IoT etc., unde consumul redus de energie înseamnă o durată de viață mai lungă a bateriei.

4. Dispozitive de margine ușor de implementat
Multe modele mari au fost inițial antrenate și implementate în cloud, dar odată cu dezvoltarea edge computing-ului, tot mai multe scenarii de aplicație necesită implementarea modelelor pe dispozitive edge. Cu puterea de calcul și resursele de stocare limitate pe dispozitivele edge, cuantizarea poate ajuta aceste modele să ruleze mai eficient pe dispozitivele edge.

5. Reducerea cerințelor de lățime de bandă
În procesul de inferență distribuită sau actualizări a modelului, cuantificarea poate reduce lățimea de bandă necesară pentru transferul modelului. Acest lucru este util pentru medii cu lățime de bandă limitată a rețelei, cum ar fi dispozitivele IoT din zone izolate.

6. Menținerea performanței modelului
Deși cuantificarea introduce o anumită pierdere de precizie, performanța originală a modelului poate fi în mare parte păstrată prin metode adecvate de cuantificare (cum ar fi cuantificarea cu precizie mixtă, cuantificarea post-antrenament, antrenamentul de percepție cantitativă etc.). Prin urmare, în aplicații practice, cuantificarea poate găsi un echilibru bun între performanță și eficiență.

Referință memorie

tipFiecare miliard de parametri trebuie să ocupe memorie
float324G
FP16/BF162G
int81G
INT40,5G


FP64 (Precizie dublă)

Virgulă mobilă pe 64 de biți, de obicei un format binar de virgulă mobilă cu dublă precizie definit de IEEE 754, are:

Simbol de 1 cifră
Index de 11 cifre
52 de zecimale



Interval: ~2.23e-308... ~1.80e308 cu precizie zecimală completă 15-17.

Obicei:

Acest format este folosit pentru calcule științifice care necesită o precizie ridicată.
Nu este folosită de obicei pentru calcule de învățare profundă.
Suport software:
Reprezintă tipul dublu pe majoritatea sistemelor C/C++.
Suportat în TensorFlow (de exemplu tf.float64) / PyTorch (de exemplu torch.float64 sau torch.double).
Suport hardware:
De obicei suportat în procesoare x86.
Majoritatea plăcilor video, în special cele de gaming, inclusiv seria RTX, sunt sever limitate la performanță FP64 (de obicei 1/32 din performanța FP32 în loc de 1/2).
GPU-urile recente nelimitate suportate pentru FP64 includ GP100/100/102/104 în Tesla P40/P4 și Quadro GP100, GV100 în Tesla V100/Quadro GV100/Titan V și recentul anunțat GA100 în A100 (interesant este că noua arhitectură Ampere are o a treia generație) comparativ cu nucleele Tensor compatibile FP64 Acum este inclus noul procesare FP64 conform IEEE, care oferă de 2,5 ori performanța FP64 a V100.

FP32 (Acuratețe totală)

Acest format a fost mult timp un cal de povară pentru învățarea profundă. Un alt format IEEE 754, virgulă mobilă cu precizie simplă, are:

Simbol de 1 cifră
Index de 8 cifre
23 zecimale
Ideal, atât antrenamentul, cât și inferența ar trebui făcute în FP32, dar FP32 este de două ori mai lent decât FP16/BF16, așa că metodele de precizie mixtă sunt adesea folosite în practică, unde greutățile FP32 sunt folosite ca "greutate principală" exactă, greutățile FP16/BF16 sunt folosite pentru calcule de propagare înainte și înapoi pentru a îmbunătăți viteza de antrenament, iar în final greutățile suverane FP32 sunt actualizate cu gradientele FP16/BF16 în faza de actualizare a gradientului.

În timpul antrenamentului, greutatea suverană este întotdeauna FP32. În practică, greutățile cu precizie de jumătate oferă adesea o acuratețe similară cu FP32 la inferență – deoarece greutățile exacte FP32 sunt necesare doar când gradientul modelului este actualizat. Asta înseamnă că putem folosi ponderi de precizie pe jumătate la inferență, astfel încât să obținem același rezultat doar cu jumătate din memoria GPU-ului.



Interval: ~1.18e-38 ... ~3.40e38 cu o precizie de 6-9 zecimale semnificative.

Obicei:

Tipul standard de calcul în rețea neuronală pentru mult timp. Greutățile, activările și alte valori din rețelele neuronale au fost mult timp implicite la FP32.
Pentru multe calcule științifice, în special cele iterative, acuratețea nu este suficientă, ceea ce duce la acumularea de erori.
Suport software:
Reprezintă tipul float pe majoritatea sistemelor C/C++.
Suportat în TensorFlow (de exemplu tf.float32) / PyTorch (de exemplu torch.float32 sau torch.float).
Suport hardware:
De obicei suportat în procesoare x86.
De obicei este suportat de GPU NVIDIA/AMD.

FP16 (Jumătate de acuratețe)

În mod similar, în formatul standard IEEE 754, formatul de virgulă mobilă cu jumătate de precizie, are:

Simbol de 1 cifră
Index de 5 cifre
10 zecimale
Numărul FP16 are un interval numeric mult mai mic decât FP32. Prin urmare, FP16 este expus riscului de revărsare (când este folosit pentru a reprezenta numere foarte mari) și de subflux (când este folosit pentru a reprezenta numere foarte mici). De exemplu, când faci 10k * 10k, rezultatul final ar trebui să fie 100M, pe care FP16 nu îl poate reprezenta deoarece numărul maxim pe care FP16 îl poate reprezenta este 64k. Astfel, ajungi să ai NaN (Nu un Număr) în calculele rețelelor neuronale, pentru că calculele se fac în ordine stratificată și în lot, astfel încât odată ce NaN apare, toate calculele anterioare sunt distruse. În general, acest lucru poate fi atenuat prin scalarea pierderii, dar această abordare nu funcționează întotdeauna.



Raza de acțiune: ~5.96e−8 (6.10e−5) ... 65504, cu o precizie de 4 cifre zecimale semnificative.

Obicei:

Deep learning tinde să folosească FP16 în loc de FP32, deoarece calculele cu precizie mai mică nu par să conteze pentru rețelele neuronale. Precizia suplimentară nu face nimic, dar în același timp este mai lentă, necesitând mai multă memorie și încetinind comunicarea.
Poate fi folosit pentru antrenament, de obicei cu antrenament cu precizie mixtă (TensorFlow/PyTorch).
Poate fi folosit pentru cuantificarea post-antrenament pentru a accelera inferența (TensorFlow Lite). Alte formate folosite pentru cuantificarea post-antrenament includ numerele întregi INT8 (întregi pe 8 biți), INT4 (pe 4 biți) și chiar INT1 (valori binare).
Suport software:
În prezent nu este în standardul C/C++ (dar există o propunere scurtă de float). Unele sisteme C/C++ suportă __fp16 tipuri. În rest, poate fi folosit cu biblioteci speciale.
Suportat în TensorFlow (de exemplu tf.float16) / PyTorch (de exemplu torch.float16 sau torch.half).
Suport hardware:
Procesoarele x86 nu sunt suportate (ca tip unic).
Suportul pentru plăcile video de gaming mai vechi este slab (performanță 32/1 pentru FP64, vezi postarea despre plăci video pentru mai multe detalii). În prezent, este bine suportat pe plăcile video moderne, cum ar fi seria NVIDIA RTX.

BFLOAT16 (Precizie pe jumătate)

Un alt format pe 16 biți dezvoltat inițial de Google se numește "Brain Floating Point Format" sau pe scurt "bfloat16". Numele provine de la Google Brain.

IEEE FP16 original a fost proiectat fără a ține cont de aplicații de deep learning, iar gama sa dinamică era prea îngustă. BFLOAT16 rezolvă această problemă, oferind aceeași gamă dinamică ca FP32.

Prin urmare, BFLOAT16 are:

Simbol de 1 cifră
Index de 8 cifre
7 zecimale



Formatul bfloat16 este prescurtat la IEEE 754 FP32, permițând conversia rapidă către și dinspre IEEE 754 FP32. La conversia în formatul bfloat16, biții exponențiali sunt păstrați, în timp ce câmpurile mantisei pot fi reduse prin trunchiere.



Interval: ~1.18e-38 ... ~3.40e38 cu 3 zecimale semnificative.
Obicei:

Acum pare că înlocuiește FP16. Spre deosebire de FP16, care necesită adesea procesare specială prin tehnici precum scalarea pierderii, BF16 este aproape un înlocuitor direct pentru FP32 atunci când se antrenează și rulează rețele neuronale profunde.
Suport software:
Nu în standardul C/C++. Poate fi folosit cu biblioteci speciale.
Suportat în TensorFlow (de exemplu tf.bfloat16) / PyTorch (de exemplu torch.bfloat16).

TF32

TensorFloat-32 sau TF32 este noul mod de matematică în GPU-urile NVIDIA A100.

Folosind aceleași mantise pe 10 biți ca matematica de precizie semi-precisă (FP16), TF32 se dovedește a avea suficient spațiu pentru a satisface cerințele de precizie ale sarcinilor de lucru AI. Iar TF32 folosește același indice pe 8 biți ca FP32, deci poate suporta același interval numeric.

Din punct de vedere tehnic, este un format pe 19 biți. Gândește-te la el ca la o BFLOAT16 de precizie extinsă, cum ar fi "BFLOAT19" sau o precizie scăzută, cum ar fi FP32.

Așadar, TF32 are:

Simbol de 1 cifră
Index de 8 cifre
10 zecimale
Avantajul TF32 este că are același format ca FP32. La calcularea produsului scalar cu TF32, mantisa operandului de intrare este rotunjită de la 23 la 10 biți. Operanzii rotunjiți sunt înmulțiți exact și acumulați în FP32 normal.

TF32 Tensor Core rulează pe intrări FP32 și generează rezultate în FP32 fără modificări de cod. Operațiile non-matrix continuă să folosească FP32. Aceasta oferă o modalitate simplă de a accelera datele de intrare/ieșire FP32 în cadrul de deep learning și HPC.

Rază: ~1.18e-38 ... ~3.40e38 cu o precizie de 4 zecimale semnificative.
Obicei:

Unul dintre lucrurile grozave la TF32 este că are nevoie doar de suport pentru compilator la cel mai profund nivel, adică în interiorul compilatorului CUDA. Restul codului vede FP32 cu mai puțină precizie, dar cu aceeași gamă dinamică. Folosirea TF32 este în principal pentru a face apeluri către bibliotecă pentru a arăta dacă funcționează corect. Prezența TF32 permite plug-in-uri rapide, profitând de viteza nucleelor tensoriale fără prea mult efort.
Formate precum FP16 și BFLOAT16 necesită mai multe ajustări deoarece implică diferite layout-uri de biți. Dar folosirea acestor formate reduce lățimea de bandă a memoriei, permițând o execuție mai rapidă.
Pentru comparație, performanța maximă a A100 este:

FP32 fără nuclee tensoriale: 19,5 TFLOPS
Nuclee tensoriale TF32: 156 TFLOPS (deci folosirea TF32 în loc de FP32 face ușoară creșterea vitezei).
Nuclee tensoriale FP16/BF16: 312 TFLOPS (prin urmare, o trecere rezonabilă la FP16/BF16 poate aduce mai multe câștiguri de viteză, dar la un cost mai mare).
Suport software:
Nu în standardul C/C++.
CUDA 11 susținut.
Suport hardware:
GPU: NVIDIA A100 este primul model suportat

FP8

Introdusă de GPU-ul H100, permite o multiplicare și convoluție mai mare a matricilor, dar cu o precizie mai mică.

Tipurile de date FP100 suportate de H8 sunt de fapt două tipuri diferite de date care pot fi folosite pentru diferite părți ale antrenamentului rețelelor neuronale:

E4M3 - constă din 1 bit simbolic, 4 biți exponențiali și 3 zecimale. Poate stoca până la +/-448 și nan.
E5M2 - constă din 1 bit de semn, 5 biți exponențiali și 2 zecimale. Poate stoca valori de până la +/-57344, +/-inf și nan. Compromisul creșterii intervalului dinamic este că valorile stocate sunt mai puțin precise.



Structura tipurilor de date în virgulă mobilă. Toate valorile afișate (în FP16, BF16, FP8 E4M3 și FP8 E5M2) sunt cea mai apropiată reprezentare a valorii 0,3952.

Ambele tipuri pot fi folosite în timpul antrenamentului unei rețele neuronale. În general, activarea înainte și greutățile necesită o precizie mai mare, așa că este cel mai bine să se folosească tipul de date E4M3 în timpul trecerii înainte. Totuși, în retropropagare, gradientul care curge prin rețea este în general mai puțin susceptibil la pierderea preciziei, dar necesită un interval dinamic mai mare. Prin urmare, este cel mai bine să le stocați folosind formatul de date E5M2. H100 TensorCore suportă orice combinație a acestor tipuri ca intrare, permițându-ne să stocăm fiecare tensor cu precizia sa preferată.

Referință:

Autentificarea cu hyperlink este vizibilă.
Autentificarea cu hyperlink este vizibilă.




Precedent:Rețea - Dispozitivele aflate sub ruta principală și subrută sunt interconectate
Următor:[AI] (10) LLM estimarea memoriei GPU cu inferență de modele mari
Disclaimer:
Tot software-ul, materialele de programare sau articolele publicate de Code Farmer Network sunt destinate exclusiv scopurilor de învățare și cercetare; Conținutul de mai sus nu va fi folosit în scopuri comerciale sau ilegale, altfel utilizatorii vor suporta toate consecințele. Informațiile de pe acest site provin de pe Internet, iar disputele privind drepturile de autor nu au legătură cu acest site. Trebuie să ștergi complet conținutul de mai sus de pe calculatorul tău în termen de 24 de ore de la descărcare. Dacă îți place programul, te rugăm să susții software-ul autentic, să cumperi înregistrarea și să primești servicii autentice mai bune. Dacă există vreo încălcare, vă rugăm să ne contactați prin e-mail.

Mail To:help@itsvse.com