Didelių modelių mokymas ir samprotavimas dažnai apima tikslumo sąvoką, yra daugybė tipų, jie taip pat skirstomi į skirtingus formatus tuo pačiu tikslumo lygiu. Be to, praktinio naudojimo scenarijuose taip pat yra daugiatikslio ir mišraus tikslumo sąvokų.
Bendras tikslumas
Slankiojo kablelio tikslumas: dvigubas tikslumas (FP64), vieno tikslumo (FP32, TF32), pusės tikslumo (FP16, BF16), 8 bitų tikslumas (FP8), 4 bitų tikslumas (FP4, NF4) Kiekybinio nustatymo tikslumas: INT8, INT4 (taip pat INT3/INT5/INT6)
Slankiojo kablelio skaičius susideda iš trijų dalių: ženklo, eksponentinio ir mantijos bitų. Kuo didesnis eksponentinis bitas, tuo didesnis skaičių diapazonas, kurį galima pavaizduoti. Kuo didesnis mantijos skaitmuo, tuo didesnis skaičiaus tikslumas.
Lentelėje tai apibendrinama taip
| Formatas | simbolio bitas | Eksponentinis antgalis | dešimtainė dalis | Iš viso skaitmenų | | FP64 | 1 | 11 | 52 | 64 | | BP32 | 1 | 8 | 23 | 32 | | TF32 | 1 | 8 | 10 | 19 | | BF16 | 1 | 8 | 7 | 16 | | BP16 | 1 | 5 | 10 | 16 | | FP8 E4M3 | 1 | 4 | 3 | 8 | | FP8 E5M2 | 1 | 5 | 2 | 8 | | 4BP | 1 | 2 | 1 | 4 |
FP32: 32 bitų slankiojo kablelio skaičius, 4 baitai duomenims TF32: 19 bitų slankiojo kablelio skaičius, kiekvienas duomenys yra 2 baitai FP16: 16 bitų slankiojo kablelio skaičius, 2 baitai duomenims BF16: 16 bitų slankiojo kablelio skaičius, kiekvienas duomenys yra 2 baitai Int8: 8 bitų sveikasis skaičius, kiekvienas duomenys sudaro 1 baitą Int4: 4 bitų sveikieji skaičiai, kiekvienas duomenys yra 0,5 baito
Kodėl tiek daug tikslumo
Dėl kainos ir tikslumo. Visi žinome, kad didelis tikslumas yra tikrai tikslesnis, tačiau jis taip pat atneš didesnes skaičiavimo ir saugojimo išlaidas. Mažesnis tikslumas sumažina skaičiavimo tikslumą, bet gali pagerinti skaičiavimo efektyvumą ir našumą. Taigi skirtingų tikslumų įvairovė leidžia pasirinkti tinkamiausią skirtingose situacijose. Dvigubas tikslumas yra tikslesnis nei vieno tikslumo išraiška, tačiau jis užima dvigubai daugiau vietos ir užima daugiau laiko apskaičiuoti.
Kodėl reikia kiekybiškai įvertinti didelius modelius?
1. Sumažinkite atminties naudojimą Dideliuose modeliuose paprastai naudojami 32 bitų slankiojo kablelio skaičiai (FP32) arba 16 bitų slankiojo kablelio skaičiai (FP16) svoriams ir aktyvinimo reikšmėms parodyti. Kvantizuojant šias didelio tikslumo reikšmes galima paversti mažesnio tikslumo vaizdais (pvz., 8 bitų sveikaisiais skaičiais, INT8), žymiai sumažinant modelio saugojimo vietą. Tai svarbu diegiant ribotų išteklių įrenginiuose, tokiuose kaip mobilieji įrenginiai, įterptosios sistemos ir kt.
2. Pagreitinkite samprotavimo greitį Kvantiniai modeliai gali efektyviau veikti aparatinėje įrangoje. Daugelis šiuolaikinės aparatinės įrangos (pvz., GPU, TPU, NPU ir kt.) turi specializuotą mažo tikslumo skaičiavimo optimizavimo palaikymą, leidžiantį greičiau atlikti kvantavimo operacijas. Be to, mažo tikslumo skaičiavimai dažnai apima mažiau bitų operacijų, todėl sumažėja skaičiavimo sudėtingumas ir taip pagreitėja išvados.
3. Sumažinkite energijos suvartojimą Kvantinis modelis ne tik sumažina skaičiavimo išteklių poreikį, bet ir sumažina energijos suvartojimą. Tai ypač svarbu baterijomis maitinamiems įrenginiams, tokiems kaip išmanieji telefonai, daiktų interneto įrenginiai ir kt., kur mažos energijos sąnaudos reiškia ilgesnį baterijos veikimo laiką.
4. Lengva įdiegti krašto įrenginius Daugelis didelių modelių iš pradžių buvo apmokyti ir įdiegti debesyje, tačiau tobulėjant krašto kompiuterijai, vis daugiau taikymo scenarijų reikalauja modelių diegimo krašto įrenginiuose. Esant ribotai skaičiavimo galiai ir saugojimo ištekliams krašto įrenginiuose, kvantavimas gali padėti šiems modeliams efektyviau veikti krašto įrenginiuose.
5. Sumažinkite pralaidumo reikalavimus Paskirstytos išvados ar modelio atnaujinimo procese kvantavimas gali sumažinti modelio perkėlimui reikalingą pralaidumą. Tai naudinga aplinkoms, kuriose tinklo pralaidumas yra ribotas, pvz., daiktų interneto įrenginiams atokiose vietovėse.
6. Išlaikykite modelio našumą Nors kvantizacija sukelia tam tikrą tikslumo praradimą, pradinį modelio veikimą galima iš esmės išsaugoti taikant atitinkamus kvantavimo metodus (pvz., mišraus tikslumo kvantizavimą, kvantavimą po treniruotės, kiekybinį suvokimo mokymą ir kt.). Todėl praktiniame pritaikyme kiekybinis įvertinimas gali pasiekti gerą našumo ir efektyvumo pusiausvyrą.
Atminties nuoroda
| rūšis | Kiekvienas milijardas parametrų turi užimti atmintį | | plūdė32 | 4G | | FP16/BF16 | 2G | | int8 | 1G | | int4 | 0,5 g |
FP64 (dvigubas tikslumas)
64 bitų slankusis kablelis, paprastai dvigubo tikslumo dvejetainis slankiojo kablelio formatas, apibrėžtas IEEE 754, turi:
1 skaitmens simbolis 11 skaitmenų rodyklė 52 skaitmenys po kablelio
Diapazonas: ~2.23e-308 ... ~1.80e308 su visu 15-17 dešimtainiu tikslumu.
Naudojimo:
Šis formatas naudojamas moksliniams skaičiavimams, kuriems reikalingas didelis tikslumas. Paprastai jis nenaudojamas gilaus mokymosi skaičiavimams. Programinės įrangos palaikymas: Daugumoje C/C++ sistemų atstovauja dvigubą tipą. Palaikoma "TensorFlow" (pvz., tf.float64) / "PyTorch" (pvz., torch.float64 arba torch.double). Techninės įrangos palaikymas: Paprastai palaikoma x86 procesoriuose. Daugumos GPU, ypač žaidimų GPU, įskaitant RTX seriją, FP64 našumas yra labai ribotas (paprastai 1/32 FP32 našumo, o ne 1/2). Naujausi neriboti FP64 palaikomi GPU yra GP100/100/102/104 Tesla P40/P4 ir Quadro GP100, GV100 Tesla V100/Quadro GV100/Titan V ir neseniai paskelbtas GA100 A100 (įdomu tai, kad naujoji Ampere architektūra turi trečią kartą), palyginti su FP64 palaikančiais Tensor branduoliais Dabar įtrauktas naujas IEEE suderinamas FP64 apdorojimas, kuris užtikrina 2,5 karto didesnį FP64 našumą nei V100.
FP32 (visiškas tikslumas)
Šis formatas jau seniai yra gilaus mokymosi darbinis arkliukas. Kitas IEEE 754 formatas, vieno tikslumo slankusis kablelis:
1 skaitmens simbolis 8 skaitmenų rodyklė 23 skaitmenys po kablelio Idealiu atveju tiek treniruotės, tiek išvados turėtų būti atliekamos FP32, tačiau FP32 yra dvigubai lėtesnis nei FP16/BF16, todėl praktikoje dažnai naudojami mišraus tikslumo metodai, kai FP32 svoriai naudojami kaip tikslus "pagrindinis svoris", FP16/BF16 svoriai naudojami sklidimo pirmyn ir atgal skaičiavimams, siekiant pagerinti treniruočių greitį, ir galiausiai FP32 suverenūs svoriai atnaujinami FP16/BF16 gradientais gradiento atnaujinimo fazėje.
Treniruočių metu suverenus svoris visada yra FP32. Praktiškai pusės tikslumo svoriai dažnai užtikrina panašų tikslumą kaip FP32, kai daroma išvada, nes tikslūs FP32 svoriai reikalingi tik atnaujinus modelio gradientą. Tai reiškia, kad darydami išvadas galime naudoti pusiau tikslumo svorius, todėl tą patį rezultatą galime gauti tik su puse GPU atminties.
Diapazonas: ~1.18e-38 ... ~3.40e38 su 6-9 reikšmingų dešimtainių tikslumu.
Naudojimo:
Standartinis neuroninių tinklų skaičiavimo tipas ilgą laiką. Svoriai, aktyvacijos ir kitos reikšmės neuroniniuose tinkluose jau seniai yra numatytosios FP32. Daugeliui mokslinių skaičiavimų, ypač kartotinių, tikslumo nepakanka, todėl kaupiasi klaidos. Programinės įrangos palaikymas: Nurodo plūdės tipą daugumoje C/C++ sistemų. Palaikoma "TensorFlow" (pvz., tf.float32) / "PyTorch" (pvz., torch.float32 arba torch.float). Techninės įrangos palaikymas: Paprastai palaikoma x86 procesoriuose. Paprastai palaiko NVIDIA / AMD GPU.
FP16 (pusės tikslumas)
Panašiai IEEE 754 standartinis formatas, pusiau tikslumo slankiojo kablelio formatas:
1 skaitmens simbolis 5 skaitmenų indeksas 10 skaitmenų po kablelio FP16 numerio skaitinis diapazonas yra daug mažesnis nei FP32. Todėl BP16 gresia perpildymas (kai naudojamas labai dideliems skaičiams pavaizduoti) ir per mažas (kai naudojamas labai mažiems skaičiams pavaizduoti). Pavyzdžiui, kai darote 10k * 10k, galutinis rezultatas turėtų būti 100M, kurio FP16 negali atspindėti, nes maksimalus FP16 skaičius yra 64k. Taigi neuroninių tinklų skaičiavimuose gausite NaN (ne skaičių), nes skaičiavimai atliekami sluoksniuota ir paketine tvarka, todėl pasirodžius NaN, visi ankstesni skaičiavimai sunaikinami. Apskritai tai galima sušvelninti nuostolių masteliu, tačiau šis metodas ne visada veikia.
Diapazonas: ~5.96e−8 (6.10e−5) ... 65504, 4 reikšmingų skaitmenų po kablelio tikslumu.
Naudojimo:
Gilusis mokymasis paprastai naudoja FP16, o ne FP32, nes mažesnio tikslumo skaičiavimai neuroniniams tinklams neatrodo svarbūs. Papildomas tikslumas nieko nedaro, o tuo pačiu yra lėtesnis, reikalaujantis daugiau atminties ir sulėtinantis bendravimą. Gali būti naudojamas treniruotėms, dažniausiai naudojant mišraus tikslumo treniruotes (TensorFlow/PyTorch). Gali būti naudojamas kvantavimui po treniruotės, siekiant pagreitinti išvadą (TensorFlow Lite). Kiti kvantavimui po treniruotės naudojami formatai yra sveikieji skaičiai INT8 (8 bitų sveikieji skaičiai), INT4 (4 bitų) ir net INT1 (dvejetainės reikšmės). Programinės įrangos palaikymas: Šiuo metu nėra C/C++ standarte (bet yra trumpas plūduriuojantis pasiūlymas). Kai kurios C/C++ sistemos palaiko __fp16 tipus. Priešingu atveju jis gali būti naudojamas su specialiomis bibliotekomis. Palaikoma TensorFlow (pvz., tf.float16) / PyTorch (pvz., torch.float16 arba torch.half). Techninės įrangos palaikymas: x86 procesoriai nepalaikomi (kaip unikalus tipas). Senesnių žaidimų GPU palaikymas yra prastas (32/1 FP64 našumas, daugiau informacijos rasite įraše apie GPU). Šiuo metu jis gerai palaikomas šiuolaikiniuose GPU, tokiuose kaip NVIDIA RTX serija.
BFLOAT16 (pusiau tikslus)
Kitas 16 bitų formatas, kurį iš pradžių sukūrė "Google", vadinamas "Brain Floating Point Format" arba trumpai "bfloat16". Pavadinimas kilęs iš "Google Brain".
Originalus IEEE FP16 buvo sukurtas neatsižvelgiant į gilaus mokymosi programas, o jo dinaminis diapazonas buvo per siauras. BFLOAT16 išsprendžia šią problemą, suteikdama tokį patį dinaminį diapazoną kaip ir FP32.
Todėl BFLOAT16 turi:
1 skaitmens simbolis 8 skaitmenų rodyklė 7 skaitmenys po kablelio
bfloat16 formatas sutrumpintas iki IEEE 754 FP32, leidžiantis greitai konvertuoti į IEEE 754 FP32 ir iš jo. Konvertuojant į bfloat16 formatą, eksponentiniai bitai išsaugomi, o mantijos laukus galima sumažinti sutrumpinant.
Diapazonas: ~1.18e-38 ... ~3.40e38 su 3 reikšmingais skaitmenimis po kablelio. Naudojimo:
Dabar atrodo, kad jis pakeičia FP16. Skirtingai nuo FP16, kuriam dažnai reikia specialaus apdorojimo naudojant tokius metodus kaip nuostolių mastelio keitimas, BF16 yra beveik tiesioginis FP32 pakaitalas treniruojant ir paleidžiant giliuosius neuroninius tinklus. Programinės įrangos palaikymas: Ne C / C ++ standartas. Galima naudoti su specialiomis bibliotekomis. Palaikoma "TensorFlow" (pvz., tf.bfloat16) / "PyTorch" (pvz., torch.bfloat16).
TF32
"TensorFloat-32" arba TF32 yra naujas matematinis režimas NVIDIA A100 GPU.
Naudojant tas pačias 10 bitų mantisas kaip ir pusiau tikslumo (FP16) matematiką, TF32 įrodo, kad turi pakankamai erdvės, kad atitiktų dirbtinio intelekto darbo krūvio tikslumo reikalavimus. O TF32 naudoja tą patį 8 bitų indeksą kaip ir FP32, todėl gali palaikyti tą patį skaitinį diapazoną.
Techniškai tai yra 19 bitų formatas. Pagalvokite apie tai kaip išplėstinio tikslumo BFLOAT16, pvz., "BFLOAT19" arba sumažintą tikslumą, pvz., FP32.
Taigi, TF32 turi:
1 skaitmens simbolis 8 skaitmenų rodyklė 10 skaitmenų po kablelio TF32 privalumas yra tas, kad jo formatas yra toks pat kaip FP32. Skaičiuojant vidinę sandaugą su TF32, įvesties operando mantisa suapvalinama nuo 23 iki 10 bitų. Apvalinimo operandai tiksliai padauginami ir kaupiami įprastoje FP32.
TF32 Tensor Core veikia FP32 įvestimis ir generuoja rezultatus FP32 be kodo pakeitimų. Ne matricos operacijoms ir toliau naudojama BP32. Tai suteikia paprastą būdą pagreitinti FP32 įvesties / išvesties duomenis gilaus mokymosi sistemose ir HPC.
Diapazonas: ~1.18e-38 ... ~3.40e38 su 4 reikšmingų skaitmenų po kablelio tikslumu. Naudojimo:
Vienas iš puikių dalykų apie TF32 yra tai, kad jam reikia tik kompiliatoriaus palaikymo giliausiame lygyje, ty CUDA kompiliatoriaus viduje. Likusi kodo dalis tiesiog mato FP32 su mažesniu tikslumu, bet tuo pačiu dinaminiu diapazonu. TF32 naudojimas daugiausia skirtas skambinti į biblioteką, kad parodytumėte, ar ji veikia tinkamai. TF32 buvimas leidžia greitai prijungti, be didelio darbo išnaudojant "Tensor" branduolių greitį. Tokius formatus kaip FP16 ir BFLOAT16 reikia labiau patobulinti, nes jie apima skirtingus bitų išdėstymus. Tačiau naudojant šiuos formatus sumažėja atminties pralaidumas, todėl galima greičiau vykdyti. Palyginimui, didžiausias A100 našumas yra:
FP32 be tenzorinių branduolių: 19,5 TFLOPS TF32 Tensor branduoliai: 156 TFLOPS (taigi naudojant TF32 vietoj FP32 lengva padidinti greitį). FP16 / BF16 tenzoriniai branduoliai: 312 TFLOPS (todėl protingas perėjimas prie FP16 / BF16 gali padidinti greitį, tačiau už didesnę kainą). Programinės įrangos palaikymas: Ne C / C ++ standartas. CUDA 11 palaikomas. Techninės įrangos palaikymas: GPU: NVIDIA A100 yra pirmasis palaikomas modelis
8BP
Pristatytas H100 GPU, jis leidžia didesnį matricos dauginimą ir konvoliuciją, tačiau mažesniu tikslumu.
FP100 duomenų tipai, kuriuos palaiko H8, iš tikrųjų yra 2 skirtingi duomenų tipai, kurie gali būti naudojami skirtingoms neuroninių tinklų mokymo dalims:
E4M3 - susideda iš 1 simbolinio bito, 4 eksponentinių bitų ir 3 skaitmenų po kablelio. Jame galima laikyti iki +/-448 ir nan. E5M2 - susideda iš 1 ženklo bito, 5 eksponentinių bitų ir 2 skaitmenų po kablelio. Jis gali saugoti reikšmes iki +/-57344, +/-inf ir nan. Didėjančio dinaminio diapazono kompromisas yra tas, kad saugomos reikšmės yra mažiau tikslios.
Slankiojo kablelio duomenų tipų struktūra. Visos rodomos reikšmės (FP16, BF16, FP8 E4M3 ir FP8 E5M2) yra artimiausias reikšmės 0,3952 atvaizdas.
Abu tipai gali būti naudojami treniruojant neuroninį tinklą. Apskritai, aktyvinimas į priekį ir svoriai reikalauja didesnio tikslumo, todėl pravažiavimo į priekį metu geriausia naudoti E4M3 duomenų tipą. Tačiau atgalinio sklidimo metu tinklu tekantis gradientas paprastai yra mažiau jautrus tikslumo praradimui, tačiau reikalauja didesnio dinaminio diapazono. Todėl geriausia juos saugoti naudojant E5M2 duomenų formatą. H100 TensorCore palaiko bet kokį šių tipų derinį kaip įvestį, todėl galime saugoti kiekvieną tenzorių pageidaujamu tikslumu.
Nuoroda:
Hipersaito prisijungimas matomas.
Hipersaito prisijungimas matomas. |