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
| Formaat | sümboli bitt | Eksponentsiaalne bitt | kümnendtähe | Kogunumbrid | | 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-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
| liik | Iga miljardi parameetri järel peab mälu hõivama | | float32 | 4G | | FP16/BF16 | 2G | | int8 | 1G | | int4 | 0,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. |