See artikkel on masintõlke peegelartikkel, palun klõpsake siia, et hüpata algse artikli juurde.

Vaade: 3298|Vastuse: 0

Topelttäpsus (FP64), Ühekordne täpsus (P32, TF32), Pooltäpne (FP16, BF16)

[Kopeeri link]
Postitatud 2025-3-10 14:22:34 | | | |
Suurte mudelite treenimine ja mõtlemine hõlmab sageli täpsuse kontseptsiooni, ning neid on palju ning need jagunevad erinevatesse formaatidesse samal täpsustasemel. Lisaks on praktilistes kasutusolukordades olemas ka mitme täpsuse ja segatäpsuse mõisted.

Tavaline täpsus

Ujukomaarvu täpsus: kahekordne täpsus (FP64), ühekordne täpsus (FP32, TF32), pooltäpne täpsus (FP16, BF16), 8-bitine täpsus (FP8), 4-bitine täpsus (FP4, NF4)
Kvantifitseerimise täpsus: INT8, INT4 (ka INT3/INT5/INT6)

Ujukomaarvud koosnevad kolmest osast: märgi-, eksponentsiaal- ja mantissabitid. Mida suurem on eksponentsiaalne bitt, seda suurem on esindatavate arvude vahemik. Mida suurem on mantissa number, seda täpsem on number.



Tabel võtab selle kokku järgmiselt

Formaatsümboli bittEksponentsiaalne bittkümnendtäheKogunumbrid
FP641115264
FP32182332
TF32181019
BF1618716
FP16151016
FP8 E4M31438
FP8 E5M21528
FP41214


FP32: 32-bitine ujukomaarv, 4 baiti iga andme kohta
TF32: 19-bitine ujukomaarv, iga andmestik on 2 baiti
FP16: 16-bitine ujukomaarv, 2 baiti iga andme kohta
BF16: 16-bitine ujukomaarv, iga andmestik on 2 baiti
Int8: 8-bitine täisarv, iga andmestik moodustab 1 baidi
Int4: 4-bitised täisarvud, iga andmestik on 0,5 baiti

Miks nii palju täpsust

Kulude ja täpsuse tõttu. Me kõik teame, et kõrge täpsus on kindlasti täpsem, kuid see toob kaasa ka suuremad arvutus- ja salvestuskulud. Madalam täpsus vähendab arvutuste täpsust, kuid võib parandada arvutustõhusust ja jõudlust. Seega võimaldavad erinevad täpsused valida kõige sobivama erinevates olukordades.
Topelttäpsus on täpsem kui ühe täpsusega avaldis, kuid võtab kaks korda rohkem salvestusruumi ja arvutamine võtab rohkem aega.

Miks tuleb suuri mudeleid kvantifitseerida?

1. Vähenda mälukasutust
Suured mudelid kasutavad tavaliselt 32-bitisi ujukomaarvu (FP32) või 16-bitisi ujukomaarvu (FP16), et esindada kaalusid ja aktiveerimisväärtusi. Kvantimise abil saab neid kõrge täpsusega väärtusi teisendada madalama täpsusega esitusteks (nt 8-bitised täisarvud, INT8), mis vähendab oluliselt mudeli salvestusruumi. See on oluline piiratud ressurssidega seadmetes, nagu mobiilseadmed, manussüsteemid jne, juurutamisel.

2. Kiirenda arutluskiirust
Kvantiseeritud mudelid saavad riistvaral töötada tõhusamalt. Paljud kaasaegsed riistvarad (näiteks GPU-d, TPU-d, NPU-d jne) toetavad spetsialiseeritud optimeerimissüsteemi madala täpsusega arvutusteks, võimaldades kiiremaid kvantimisoperatsioone. Lisaks hõlmavad madala täpsusega arvutused sageli vähem bittide operatsioone, mis vähendab arvutuslikku keerukust ja kiirendab järeldusi.

3. Vähenda energiatarbimist
Kvantiseeritud mudel vähendab mitte ainult arvutusressursside vajadust, vaid ka energiatarbimist. See on eriti oluline patareitoitel seadmete puhul, nagu nutitelefonid, IoT-seadmed jne, kus madal energiatarve tähendab pikemat aku kestvust.

4. Servaseadmed on lihtsasti paigaldatavad
Paljud suured mudelid treeniti ja juurutati algselt pilves, kuid servaarvutuse arenguga nõuab üha rohkem rakendusstsenaariume, et mudeleid paigaldataks servaseadmetele. Piiratud arvutusvõimsuse ja salvestusressursside tõttu servaseadmetel aitab kvantimine neid mudeleid edge-seadmetel tõhusamalt töötada.

5. Vähenda ribalaiuse nõudeid
Hajutatud järeldamise või mudeliuuenduste protsessis võib kvantimine vähendada mudeli edastamiseks vajalikku ribalaiust. See on kasulik piiratud võrgu ribalaiusega keskkondades, näiteks IoT-seadmetes kaugetes piirkondades.

6. Säilita mudeli jõudlus
Kuigi kvantimine põhjustab teatud täpsuse kaotuse, saab mudeli algset toimivust suuresti säilitada sobivate kvantimismeetoditega (näiteks segatäpsusega kvantimine, treeningujärgne kvantimine, kvantitatiivse tajumise treening jne). Seetõttu võib kvantifitseerimine praktilistes rakendustes leida hea tasakaalu jõudluse ja efektiivsuse vahel.

Mäluviide

liikIga miljardi parameetri järel peab mälu hõivama
float324G
FP16/BF162G
int81G
int40,5G


FP64 (Topelttäpsus)

64-bitine ujukoma, tavaliselt kahekordse täpsusega binaarne ujukomavorming, mis on määratletud IEEE 754-ga, sisaldab:

1-kohaline sümbol
11-kohaline indeks
52 kümnendkohta



Vahemik: ~2.23e-308 ... ~1.80e308 täistäpsusega 15-17 kümnendkohta.

Kasutus:

Seda vormingut kasutatakse teaduslike arvutuste jaoks, mis nõuavad suurt täpsust.
Seda ei kasutata tavaliselt süvaõppe arvutustes.
Tarkvaratugi:
Esindab topelttüüpi enamikus C/C++ süsteemides.
Toetatud TensorFlow's (nt tf.float64) / PyTorchis (nt torch.float64 või torch.double).
Riistvaraline tugi:
Tavaliselt toetatakse seda x86 protsessorites.
Enamik GPU-sid, eriti mängugraafikakaarte, sealhulgas RTX seeriat, on FP64 jõudluses tugevalt piiratud (tavaliselt 1/32 FP32 jõudlusest, mitte 1/2).
Hiljutised piiranguteta FP64-toega GPU-d hõlmavad GP100/100/102/104 Tesla P40/P4 ja Quadro GP100 mudelites, GV100 Tesla V100/Quadro GV100/Titan V mudelites ning hiljuti välja kuulutatud GA100 A100-s (huvitaval kombel on uuel Ampere arhitektuuril kolmas põlvkond) võrreldes FP64-toega Tensor Core'idega Nüüd on kaasas uus IEEE-nõuetele vastav FP64 protsessor, mis pakub 2,5x FP64 jõudlust võrreldes V100-ga.

FP32 (Täielik täpsus)

See formaat on juba pikka aega olnud süvaõppe tööhobune. Teine IEEE 754 formaat, ühe täpsusega ujukoma, sisaldab:

1-kohaline sümbol
8-kohaline indeks
23 kümnendkohta
Ideaalis tuleks nii treenimine kui ka järeldamine toimuda FP32-s, kuid FP32 on kaks korda aeglasem kui FP16/BF16, seega kasutatakse praktikas sageli segatäpsusega meetodeid, kus FP32 kaalud on täpne "põhikaal", FP16/BF16 raskused edasi- ja tagasiliikumise arvutusteks treeningkiiruse parandamiseks ning lõpuks FP32 suveräänsed kaalud uuendatakse FP16/BF16 gradientidega gradiendi uuenduse faasis.

Treeningu ajal on suveräänne kaal alati FP32. Praktikas annavad pooltäpsuskaalud sageli sarnase täpsuse FP32-ga järelduste tegemisel – sest täpseid FP32 kaalusid on vaja ainult mudeli gradiendi uuendamisel. See tähendab, et saame järeldamisel kasutada pooltäppiskaalusid, nii et saame sama tulemuse ainult poole GPU mäluga.



Vahemik: ~1.18e-38 ... ~3.40e38, täpsusega 6-9 olulist kümnendkohta.

Kasutus:

See on pikka aega olnud närvivõrgu standardne arvutamise tüüp. Närvivõrkudes on kaalud, aktiveerimised ja muud väärtused juba ammu vaikimisi FP32 peale viidud.
Paljude teaduslike arvutuste, eriti iteratiivsete, puhul ei ole täpsusest piisav, mis viib vigade kuhjumiseni.
Tarkvaratugi:
Esindab ujukitüüpi enamikus C/C++ süsteemides.
Toetatud TensorFlow's (nt tf.float32) / PyTorchis (nt torch.float32 või torch.float).
Riistvaraline tugi:
Tavaliselt toetatakse seda x86 protsessorites.
Tavaliselt toetab seda NVIDIA/AMD GPU.

FP16 (Pooltäpsus)

Sarnaselt on IEEE 754 standardformaat, pooltäppis-ujukoma-formaat:

1-kohaline sümbol
5-kohaline indeks
10 kümnendkohta
FP16 numbril on palju väiksem numbriline vahemik kui FP32-l. Seetõttu on FP16 ülevoolu ohus (kui seda kasutatakse väga suurte arvude esindamiseks) ja alavoolu (kui seda kasutatakse väga väikeste arvude esindamiseks). Näiteks, kui teed 10k * 10k, peaks lõpptulemus olema 100M, mida FP16 ei suuda esindada, sest FP16 maksimaalne arv on 64k. Nii et närvivõrgu arvutustes tekib NaN (Not a Number), sest arvutused tehakse kihilises ja partiijärjekorras, nii et kui NaN ilmub, hävitatakse kõik varasemad arvutused. Üldiselt saab seda vähendada kaotuste skaleerimisega, kuid see lähenemine ei tööta alati.



Vahemik: ~5.96e−8 (6.10e−5) ... 65504, täpsusega 4 olulist kümnendkohta.

Kasutus:

Süvaõpe kasutab tavaliselt FP16 FP32 asemel, kuna madalama täpsusega arvutused ei tundu närvivõrkude puhul olulised. Lisatäpsus ei aita midagi ja samal ajal on see aeglasem, nõudes rohkem mälu ja aeglustades suhtlust.
Saab kasutada treeninguks, tavaliselt segatäpsusega treeninguga (TensorFlow/PyTorch).
Saab kasutada pärast treeningut kvantimiseks, et kiirendada järeldamist (TensorFlow Lite). Teised post-treeningu kvantimiseks kasutatavad vormingud hõlmavad täisarvusid INT8 (8-bitised täisarvud), INT4 (4-bitised) ja isegi INT1 (binaarväärtused).
Tarkvaratugi:
Praegu ei ole see C/C++ standardis (aga on olemas lühike float-ettepanek). Mõned C/C++ süsteemid toetavad __fp16 tüüpe. Vastasel juhul saab seda kasutada spetsiaalsete teekidega.
Toetatud TensorFlow's (nt tf.float16) / PyTorchis (nt torch.float16 või torch.half).
Riistvaraline tugi:
x86 protsessoreid ei toetata (kui unikaalse tüübina).
Vanemate mängugraafikakaartide tugi on kehv (FP64 puhul 32/1 jõudlus, vaata postitust GPU-de kohta lisateabe saamiseks). Praegu on see hästi toetatud kaasaegsetel GPU-del, näiteks NVIDIA RTX seerial.

BFLOAT16 (pooltäpne)

Teine Google'i algselt välja töötatud 16-bitine formaat kannab nime "Brain Floating Point Format" ehk lühidalt "bfloat16". Nimi pärineb Google Brainist.

Algne IEEE FP16 oli loodud ilma süvaõppe rakendusteta ning selle dünaamiline ulatus oli liiga kitsas. BFLOAT16 lahendab selle probleemi, pakkudes sama dünaamilist ulatust nagu FP32.

Seetõttu on BFLOAT16:

1-kohaline sümbol
8-kohaline indeks
7 kümnendkohta



bfloat16 formaat on lühendatud IEEE 754 FP32-ks, võimaldades kiiret üleminekut IEEE 754 FP32-le ja sealt välja. Kui konverteerida bfloat16 formaati, säilivad eksponentsiaalsed bitid, samas kui mantissa välju saab kärpida.



Vahemik: ~1.18e-38 ... ~3.40e38, kolme olulise kümnendkohaga.
Kasutus:

Nüüd tundub, et see asendab FP16. Erinevalt FP16-st, mis sageli nõuab erilist töötlemist näiteks kaotuste skaleerimise kaudu, on BF16 peaaegu otsene FP32 asendaja sügavate närvivõrkude treenimisel ja käitamisel.
Tarkvaratugi:
Mitte C/C++ standardis. Saab kasutada spetsiaalsete teekidega.
Toetatud TensorFlow's (nt tf.bfloat16) / PyTorchis (nt torch.bfloat16).

TF32

TensorFloat-32 ehk TF32 on uus matemaatikarežiim NVIDIA A100 GPU-des.

Kasutades samu 10-bitiseid mantissasid pooltäppismatemaatikas (FP16), osutub TF32-l piisavalt ruumi, et täita AI töökoormuste täpsusnõudeid. Ja TF32 kasutab sama 8-bitist indeksit nagu FP32, seega toetab see sama numbrilist vahemikku.

Tehniliselt on see 19-bitine formaat. Mõtle sellele kui pikendatud täpsuse BFLOAT16-le, näiteks "BFLOAT19" või vähendatud täpsusele nagu FP32.

Nii et TF32-l on:

1-kohaline sümbol
8-kohaline indeks
10 kümnendkohta
TF32 eelis on see, et sellel on sama formaat mis FP32-l. TF32-ga sisemise korrutise arvutamisel ümardatakse sisendoperandi mantissa 23-st 10-ni. Ümardusoperandid korrutatakse täpselt ja kogunevad normaalses FP32-s.

TF32 Tensor Core töötab FP32 sisenditel ja genereerib tulemusi FP32-s ilma koodimuutusteta. Mitte-maatriksoperatsioonid kasutavad jätkuvalt FP32. See pakub lihtsat viisi FP32 sisend/väljundandmete kiirendamiseks süvaõppe raamistikus ja HPC-s.

Vahemik: ~1.18e-38 ... ~3.40e38, täpsusega 4 olulist kümnendkohta.
Kasutus:

Üks TF32 suurepäraseid omadusi on see, et see vajab kompilaatori tuge ainult kõige sügavamal tasemel, st CUDA kompilaatori sees. Ülejäänud kood näeb FP32 vähem täpselt, kuid sama dünaamilise ulatusega. TF32 kasutamine on peamiselt selleks, et teha kõnesid raamatukogule, et näidata, kas see töötab korralikult. TF32 olemasolu võimaldab kiireid plug-in'e, kasutades Tensor tuumade kiirust ilma suurema vaevata.
Formaadid nagu FP16 ja BFLOAT16 vajavad rohkem häälestamist, kuna need nõuavad erinevaid bittide paigutusi. Kuid nende formaatide kasutamine vähendab mäluribalaiust, võimaldades kiiremat täitmist.
Võrdluseks on A100 tippjõudlus järgmine:

FP32 ilma tensortuumadeta: 19,5 TFLOPS
TF32 Tensor tuumad: 156 TFLOPS (seega TF32 kasutamine FP32 asemel teeb kiiruse suurendamise lihtsaks).
FP16/BF16 Tensor-tuumad: 312 TFLOPS (seega võib mõistlik üleminek FP16/BF16-le tuua rohkem kiirusekasvu, kuid kõrgema hinnaga).
Tarkvaratugi:
Mitte C/C++ standardis.
CUDA 11 toetatud.
Riistvaraline tugi:
GPU: NVIDIA A100 on esimene mudel, mida toetatakse

FP8

H100 GPU poolt kasutusele võetud see võimaldab suuremat maatriksi korrutamist ja konvolutsiooni, kuid madalama täpsusega.

H8 poolt toetatud FP100 andmetüübid on tegelikult kaks erinevat andmetüüpi, mida saab kasutada erinevate närvivõrgu koolituse osade jaoks:

E4M3 - koosneb 1 sümboolsest bitist, 4 eksponentsiaalsest bitist ja 3 kümnendkohast. See suudab salvestada kuni +/-448 ja nan.
E5M2 – koosneb ühest märgibitist, 5 eksponentsiaalsest bitist ja 2 kümnendkohast. See suudab salvestada väärtusi kuni +/-57344, +/-inf ja nan. Dünaamilise ulatuse suurendamise kompromiss on see, et salvestatud väärtused on vähem täpsed.



Ujukoma-andmetüüpide struktuur. Kõik kuvatud väärtused (FP16, BF16, FP8 E4M3 ja FP8 E5M2) on lähim väärtus 0,3952.

Mõlemat tüüpi saab kasutada närvivõrgu treenimisel. Üldiselt nõuavad edasi aktiveerimine ja kaalud suuremat täpsust, seega on parim kasutada edasi liikumisel E4M3 andmetüüpi. Kuid tagasipropageerimisel on võrgus voolav gradient üldiselt vähem vastuvõtlik täpsuse kaotusele, kuid nõuab suuremat dünaamilist ulatust. Seetõttu on kõige parem neid salvestada E5M2 andmeformaadis. H100 TensorCore toetab sisendina kõiki nende tüüpide kombinatsiooni, võimaldades meil salvestada iga tensorit soovitud täpsusega.

Viide:

Hüperlingi sisselogimine on nähtav.
Hüperlingi sisselogimine on nähtav.




Eelmine:Võrk - Põhiliini ja alammarsruudi all olevad seadmed on omavahel ühendatud
Järgmine:[AI] (10) LLM suure mudeli järeldamine GPU mälu VRAM-i hinnang
Disclaimer:
Kõik Code Farmer Networki poolt avaldatud tarkvara, programmeerimismaterjalid või artiklid on mõeldud ainult õppimiseks ja uurimistööks; Ülaltoodud sisu ei tohi kasutada ärilistel ega ebaseaduslikel eesmärkidel, vastasel juhul kannavad kasutajad kõik tagajärjed. Selle saidi info pärineb internetist ning autoriõiguste vaidlused ei ole selle saidiga seotud. Ülaltoodud sisu tuleb oma arvutist täielikult kustutada 24 tunni jooksul pärast allalaadimist. Kui sulle programm meeldib, palun toeta originaaltarkvara, osta registreerimist ja saa paremaid ehtsaid teenuseid. Kui esineb rikkumist, palun võtke meiega ühendust e-posti teel.

Mail To:help@itsvse.com