Lielu modeļu apmācība un argumentācija bieži ietver precizitātes jēdzienu, un ir daudz veidu, un tie ir arī sadalīti dažādos formātos vienā precizitātes līmenī. Turklāt praktiskās izmantošanas scenārijos ir arī daudzprecizitātes un jauktas precizitātes jēdzieni.
Kopēja precizitāte
Peldošā komata precizitāte: dubultā precizitāte (FP64), viena precizitāte (FP32, TF32), pusprecizitāte (FP16, BF16), 8 bitu precizitāte (FP8), 4 bitu precizitāte (FP4, NF4) Kvantitatīvas noteikšanas precizitāte: INT8, INT4 (arī INT3 / INT5 / INT6)
Peldošā komata skaitlis sastāv no trim daļām: zīmes, eksponenciālas un mantijas bitiem. Jo lielāks eksponenciālais bits, jo lielāks ir attēlojamo skaitļu diapazons. Jo lielāks ir mantisas cipars, jo lielāka ir skaitļa precizitāte.
Tabulā tas apkopots šādi
| Formātā | simbola bits | Eksponenciāls bits | Decimālvietai | Kopējais ciparu skaits | | FP64 | 1 | 11 | 52 | 64 | | 32. PP | 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 bitu peldošā komata skaitlis, 4 baiti uz datiem TF32: 19 bitu peldošā komata skaitlis, katrs datums ir 2 baiti FP16: 16 bitu peldošā komata skaitlis, 2 baiti uz datiem BF16: 16 bitu peldošā komata skaitlis, katrs datums ir 2 baiti Int8: 8 bitu vesels skaitlis, katrs datums veido 1 baitu Int4: 4 bitu veseli skaitļi, katrs datums ir 0,5 baiti
Kāpēc tik daudz precizitātes
Izmaksu un precizitātes dēļ. Mēs visi zinām, ka augsta precizitāte noteikti ir precīzāka, taču tā radīs arī augstākas skaitļošanas un uzglabāšanas izmaksas. Zemāka precizitāte samazina aprēķinu precizitāti, bet var uzlabot skaitļošanas efektivitāti un veiktspēju. Tātad dažādas precizitātes ļauj izvēlēties piemērotāko dažādās situācijās. Dubultā precizitāte ir precīzāka nekā vienas precizitātes izteiksme, taču tā aizņem divreiz vairāk krātuves un aizņem vairāk laika.
Kāpēc lielie modeļi ir kvantitatīvi jānosaka?
1. Samaziniet atmiņas lietojumu Lielos modeļos parasti tiek izmantoti 32 bitu peldošā komata skaitļi (FP32) vai 16 bitu peldošā komata skaitļi (FP16), lai attēlotu svarus un aktivizācijas vērtības. Kvantizējot, šīs augstas precizitātes vērtības var pārvērst zemākas precizitātes attēlojumos (piemēram, 8 bitu veselos skaitļos, INT8), ievērojami samazinot modeļa atmiņas vietu. Tas ir svarīgi izvietošanai ierīcēs ar ierobežotiem resursiem, piemēram, mobilajās ierīcēs, iegultās sistēmās utt.
2. Paātriniet spriešanas ātrumu Kvantizētie modeļi var darboties efektīvāk aparatūrā. Daudzām mūsdienu aparatūrām (piemēram, GPU, TPU, NPU utt.) ir specializēts optimizācijas atbalsts zemas precizitātes skaitļošanai, kas ļauj ātrāk veikt kvantēšanas operācijas. Turklāt zemas precizitātes aprēķini bieži ietver mazāk bitu operāciju, samazinot skaitļošanas sarežģītību un tādējādi paātrinot secinājumus.
3. Samaziniet enerģijas patēriņu Kvantizētais modelis ne tikai samazina nepieciešamību pēc skaitļošanas resursiem, bet arī samazina enerģijas patēriņu. Tas ir īpaši svarīgi ar akumulatoru darbināmām ierīcēm, piemēram, viedtālruņiem, IoT ierīcēm utt., kur zems enerģijas patēriņš nozīmē ilgāku akumulatora darbības laiku.
4. Viegli izvietojamas malas ierīces Daudzi lieli modeļi sākotnēji tika apmācīti un izvietoti mākonī, taču, attīstoties malas skaitļošanai, arvien vairāk lietojumprogrammu scenāriju prasa modeļu izvietošanu perifērajās ierīcēs. Ar ierobežotu skaitļošanas jaudu un krātuves resursiem perifērajās ierīcēs, kvantēšana var palīdzēt šiem modeļiem efektīvāk darboties malas ierīcēs.
5. Samaziniet joslas platuma prasības Izkliedēto secinājumu vai modeļu atjaunināšanas procesā kvantēšana var samazināt modeļa pārsūtīšanai nepieciešamo joslas platumu. Tas ir noderīgi vidēs ar ierobežotu tīkla joslas platumu, piemēram, IoT ierīcēm attālos apgabalos.
6. Saglabājiet modeļa veiktspēju Lai gan kvantēšana rada zināmu precizitātes zudumu, modeļa sākotnējo veiktspēju lielā mērā var saglabāt, izmantojot atbilstošas kvantēšanas metodes (piemēram, jauktas precizitātes kvantēšanu, pēcapmācības kvantēšanu, kvantitatīvo uztveres apmācību utt.). Tāpēc praktiskos pielietojumos kvantitatīva noteikšana var panākt labu līdzsvaru starp veiktspēju un efektivitāti.
Atmiņas atsauce
| tips | Katram miljardam parametru ir jāaizņem atmiņa | | pludiņš32 | 4G | | FP16/BF16 | 2G | | int8 | 1G | | int4 | 0,5 g |
FP64 (dubultā precizitāte)
64 bitu peldošā komata, kas parasti ir divkāršas precizitātes binārā peldošā komata formāts, kas definēts IEEE 754, ir:
1 ciparu simbols 11 ciparu indekss 52 zīmes aiz komata
Diapazons: ~2.23e-308 ... ~1.80e308 ar pilnu precizitāti 15-17 decimāldaļā.
Lietošanas:
Šis formāts tiek izmantots zinātniskiem aprēķiniem, kuriem nepieciešama augsta precizitāte. To parasti neizmanto dziļās mācīšanās aprēķiniem. Programmatūras atbalsts: Attēlo dubulto tipu lielākajā daļā C/C++ sistēmu. Tiek atbalstīts TensorFlow (piemēram, tf.float64) / PyTorch (piemēram, torch.float64 vai torch.double). Aparatūras atbalsts: Parasti tiek atbalstīts x86 procesoros. Lielākajai daļai GPU, īpaši spēļu GPU, ieskaitot RTX sēriju, FP64 veiktspēja ir stipri ierobežota (parasti 1/32 no FP32 veiktspējas, nevis 1/2). Jaunākie neierobežotie FP64 atbalstītie GPU ietver GP100/100/102/104 Tesla P40/P4 un Quadro GP100, GV100 Tesla V100/Quadro GV100/Titan V un nesen izziņoto GA100 A100 (interesanti, ka jaunajai Ampere arhitektūrai ir trešā paaudze), salīdzinot ar FP64 iespējotajiem Tensor kodoliem Tagad ir iekļauta jaunā IEEE saderīgā FP64 apstrāde, kas nodrošina 2,5 reizes lielāku FP64 veiktspēju nekā V100.
FP32 (pilnīga precizitāte)
Šis formāts jau sen ir bijis dziļās mācīšanās darba zirgs. Vēl viens IEEE 754 formāts, vienas precizitātes peldošā komata ir:
1 ciparu simbols 8 ciparu indekss 23 zīmes aiz komata Ideālā gadījumā gan treniņi, gan secinājumi būtu jāveic FP32, bet FP32 ir divreiz lēnāks nekā FP16/BF16, tāpēc praksē bieži tiek izmantotas jauktas precizitātes metodes, kur FP32 svari tiek izmantoti kā precīzs "galvenais svars", FP16/BF16 svari tiek izmantoti uz priekšu un atpakaļ izplatīšanās aprēķiniem, lai uzlabotu treniņu ātrumu, un visbeidzot FP32 suverēnie svari tiek atjaunināti ar FP16/BF16 gradientiem gradienta atjaunināšanas fāzē.
Apmācības laikā suverēnais svars vienmēr ir FP32. Praksē pusprecizitātes svari bieži nodrošina līdzīgu precizitāti kā FP32, kad tiek izdarīti secinājumi, jo precīzi FP32 svari ir nepieciešami tikai tad, kad tiek atjaunināts modeļa gradients. Tas nozīmē, ka, veicot secinājumus, mēs varam izmantot pusprecizitātes svarus, lai mēs varētu iegūt tādu pašu rezultātu tikai ar pusi GPU atmiņas.
Diapazons: ~1.18e-38 ... ~3.40e38 ar precizitāti 6-9 nozīmīgas decimāldaļas.
Lietošanas:
Standarta neironu tīkla skaitļošanas veids ilgu laiku. Svari, aktivizācijas un citas vērtības neironu tīklos jau sen ir noklusētas uz FP32. Daudziem zinātniskiem aprēķiniem, īpaši iteratīviem, precizitāte nav pietiekama, izraisot kļūdu uzkrāšanos. Programmatūras atbalsts: Attēlo pludiņa tipu lielākajā daļā C/C++ sistēmu. Tiek atbalstīts TensorFlow (piemēram, tf.float32) / PyTorch (piemēram, torch.float32 vai torch.float). Aparatūras atbalsts: Parasti tiek atbalstīts x86 procesoros. Parasti atbalsta NVIDIA / AMD GPU.
FP16 (pusprecizitāte)
Līdzīgi IEEE 754 standarta formātā, pusprecizitātes peldošā komata formātā ir:
1 ciparu simbols 5 ciparu indekss 10 zīmes aiz komata FP16 skaitliskajam diapazonam ir daudz mazāks skaitliskais diapazons nekā FP32. Tādēļ FP16 ir pakļauts pārplūdes riskam (ja to izmanto, lai attēlotu ļoti lielus skaitļus) un nepietiekamu pieplūdi (ja to izmanto, lai attēlotu ļoti mazus skaitļus). Piemēram, veicot 10k * 10k, gala rezultātam jābūt 100M, ko FP16 nevar attēlot, jo maksimālais skaits, ko FP16 var attēlot, ir 64k. Tātad jūs nonākat pie NaN (nevis skaitlis) neironu tīkla aprēķinos, jo aprēķini tiek veikti slāņainā un partijas secībā, tāpēc, tiklīdz parādās NaN, visi iepriekšējie aprēķini tiek iznīcināti. Kopumā to var mazināt ar zaudējumu mērogu, taču šī pieeja ne vienmēr darbojas.
Diapazons: ~5.96e−8 (6.10e−5) ... 65504, ar precizitāti 4 nozīmīgi decimālcipari.
Lietošanas:
Dziļā mācīšanās mēdz izmantot FP16, nevis FP32, jo zemākas precizitātes aprēķini, šķiet, nav svarīgi neironu tīkliem. Papildu precizitāte neko nedara, un tajā pašā laikā tā ir lēnāka, prasa vairāk atmiņas un palēnina komunikāciju. Var izmantot apmācībai, parasti izmantojot jauktas precizitātes treniņus (TensorFlow/PyTorch). Var izmantot pēcapmācības kvantēšanai, lai paātrinātu secinājumus (TensorFlow Lite). Citi formāti, ko izmanto pēcapmācības kvantēšanai, ir veseli skaitļi INT8 (8 bitu veseli skaitļi), INT4 (4 bitu) un pat INT1 (binārās vērtības). Programmatūras atbalsts: Pašlaik nav C / C ++ standartā (bet ir īss peldošs priekšlikums). Dažas C/C++ sistēmas atbalsta __fp16 tipus. Pretējā gadījumā to var izmantot ar īpašām bibliotēkām. Tiek atbalstīts TensorFlow (piemēram, tf.float16) / PyTorch (piemēram, torch.float16 vai torch.half). Aparatūras atbalsts: x86 procesori netiek atbalstīti (kā unikāls tips). Vecāku spēļu GPU atbalsts ir slikts (FP64 veiktspēja 32/1, sīkāku informāciju skatiet rakstā par GPU). Pašlaik tas ir labi atbalstīts mūsdienu GPU, piemēram, NVIDIA RTX sērijā.
BFLOAT16 (pusprecizitāte)
Vēl viens 16 bitu formāts, ko sākotnēji izstrādāja Google, tiek saukts par "Brain Floating Point Format" vai saīsināti "bfloat16". Nosaukums nāk no Google Brain.
Oriģinālais IEEE FP16 tika izstrādāts, nedomājot par dziļās mācīšanās lietojumprogrammām, un tā dinamiskais diapazons bija pārāk šaurs. BFLOAT16 atrisina šo problēmu, nodrošinot tādu pašu dinamisko diapazonu kā FP32.
Tāpēc BFLOAT16 ir:
1 ciparu simbols 8 ciparu indekss 7 zīmes aiz komata
bfloat16 formāts ir saīsināts uz IEEE 754 FP32, ļaujot ātri konvertēt uz un no IEEE 754 FP32. Pārvēršot uz bfloat16 formātu, eksponenciālie biti tiek saglabāti, bet mantisas laukus var samazināt ar saīsināšanu.
Diapazons: ~1.18e-38 ... ~3.40e38 ar 3 nozīmīgām zīmēm aiz komata. Lietošanas:
Tagad šķiet, ka tas aizstāj FP16. Atšķirībā no FP16, kas bieži prasa īpašu apstrādi, izmantojot tādas metodes kā zudumu mērogošana, BF16 ir gandrīz tiešs FP32 aizstājējs, apmācot un darbojoties dziļajiem neironu tīkliem. Programmatūras atbalsts: Nav C / C ++ standartā. Var izmantot ar īpašām bibliotēkām. Tiek atbalstīts TensorFlow (piemēram, tf.bfloat16) / PyTorch (piemēram, torch.bfloat16).
TF32
TensorFloat-32 vai TF32 ir jaunais matemātikas režīms NVIDIA A100 GPU.
Izmantojot tās pašas 10 bitu mantisas kā pusprecizitātes (FP16) matemātiku, TF32 izrādās, ka tam ir pietiekami daudz vietas, lai apmierinātu AI darba slodzes precizitātes prasības. Un TF32 izmanto to pašu 8 bitu indeksu kā FP32, tāpēc tas var atbalstīt to pašu skaitlisko diapazonu.
Tehniski tas ir 19 bitu formāts. Padomājiet par to kā paplašinātu precizitātes BFLOAT16, piemēram, "BFLOAT19" vai samazinātu precizitāti, piemēram, FP32.
Tātad, TF32 ir:
1 ciparu simbols 8 ciparu indekss 10 zīmes aiz komata TF32 priekšrocība ir tā, ka tam ir tāds pats formāts kā FP32. Aprēķinot iekšējo reizinājumu ar TF32, ievades operanda mantisa tiek noapaļota no 23 līdz 10 bitiem. Noapaļošanas operandi tiek precīzi reizināti un uzkrāti normālā FP32.
TF32 Tensor Core darbojas ar FP32 ieejām un ģenerē rezultātus FP32 bez koda izmaiņām. Operācijās, kas nav matricas, turpina izmantot FP32. Tas nodrošina vienkāršu veidu, kā paātrināt FP32 ievades/izvades datus dziļās mācīšanās sistēmās un HPC.
Diapazons: ~1.18e-38 ... ~3.40e38 ar precizitāti 4 nozīmīgas zīmes aiz komata. Lietošanas:
Viena no lieliskajām lietām par TF32 ir tā, ka tam ir nepieciešams kompilatora atbalsts tikai dziļākajā līmenī, t.i., CUDA kompilatora iekšienē. Pārējais kods vienkārši redz FP32 ar mazāku precizitāti, bet tādu pašu dinamisko diapazonu. TF32 izmantošana galvenokārt ir zvanu veikšana bibliotēkai, lai parādītu, vai tā darbojas pareizi. TF32 klātbūtne ļauj ātri pieslēgties, izmantojot Tensor kodolu ātrumu bez liela darba. Tādiem formātiem kā FP16 un BFLOAT16 ir nepieciešama lielāka pielāgošana, jo tie ietver dažādus bitu izkārtojumus. Bet šo formātu izmantošana samazina atmiņas joslas platumu, ļaujot ātrāk izpildīt. Salīdzinājumam, A100 maksimālā veiktspēja ir:
FP32 bez tenzora serdeņiem: 19,5 TFLOPS TF32 Tensor kodoli: 156 TFLOPS (tāpēc, izmantojot TF32 FP32 vietā, ir viegli palielināt ātrumu). FP16 / BF16 tenzora kodoli: 312 TFLOPS (tāpēc saprātīga pāreja uz FP16 / BF16 var dot lielāku ātruma pieaugumu, bet par augstākām izmaksām). Programmatūras atbalsts: Nav C / C ++ standartā. CUDA 11 atbalstīts. Aparatūras atbalsts: GPU: NVIDIA A100 ir pirmais atbalstītais modelis
FP8
Ieviests ar H100 GPU, tas nodrošina lielāku matricas reizināšanu un konvolūciju, bet ar zemāku precizitāti.
H8 atbalstītie FP100 datu tipi faktiski ir 2 dažādi datu tipi, kurus var izmantot dažādām neironu tīkla apmācības daļām:
E4M3 - sastāv no 1 simboliska bita, 4 eksponenciāliem bitiem un 3 zīmēm aiz komata. Tas var uzglabāt līdz +/-448 un nan. E5M2 - sastāv no 1 zīmes bita, 5 eksponenciāliem bitiem un 2 zīmēm aiz komata. Tas var saglabāt vērtības līdz +/-57344, +/-inf un nan. Dinamiskā diapazona palielināšanas kompromiss ir tāds, ka saglabātās vērtības ir mazāk precīzas.
Peldošā komata datu tipu struktūra. Visas parādītās vērtības (FP16, BF16, FP8 E4M3 un FP8 E5M2) ir vērtības 0,3952 tuvākais attēlojums.
Abus veidus var izmantot neironu tīkla apmācības laikā. Kopumā priekšējā aktivizācija un svari prasa lielāku precizitāti, tāpēc vislabāk ir izmantot E4M3 datu tipu pārejas laikā uz priekšu. Tomēr atpakaļizplatīšanā gradients, kas plūst caur tīklu, parasti ir mazāk jutīgs pret precizitātes zudumu, bet prasa lielāku dinamisko diapazonu. Tāpēc vislabāk tos uzglabāt, izmantojot E5M2 datu formātu. H100 TensorCore atbalsta jebkuru šo veidu kombināciju kā ievadi, ļaujot mums saglabāt katru tenzoru ar vēlamo precizitāti.
Atsauce:
Hipersaites pieteikšanās ir redzama.
Hipersaites pieteikšanās ir redzama. |