Suurten mallien koulutus ja päättely sisältävät usein tarkkuuden käsitteen, ja niitä on monia tyyppejä, jotka on jaettu eri muotoihin samalla tarkkuustasolla. Lisäksi käytännön käyttötilanteissa on myös monitarkkuuden ja sekoitetun tarkkuuden käsitteet.
Yleinen tarkkuus
Liukulukutarkkuus: kaksoistarkkuus (FP64), yksitarkkuus (FP32, TF32), puolitarkkuus (FP16, BF16), 8-bittinen tarkkuus (FP8), 4-bittinen tarkkuus (FP4, NF4) Kvantifiointitarkkuus: INT8, INT4 (myös INT3/INT5/INT6)
Liukuluku koostuu kolmesta osasta: merkki-, eksponentiaalinen ja mantissan bitit. Mitä suurempi eksponentiaalinen bitti, sitä laajempi on lukujen vaihteluväli, joka voidaan esittää. Mitä suurempi mantissan numero, sitä tarkempi luku on.
Taulukko tiivistää asian seuraavasti
| formaatti | symbolibitti | Eksponentiaalinen bitti | Desimaali | Kokonaisnumerot | | 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-bittinen liukuluku, 4 tavua per data TF32: 19-bittinen liukulukuluku, jokainen data on 2 tavua FP16: 16-bittinen liukuluku, 2 tavua per data BF16: 16-bittinen liukulukunumero, jokainen data on 2 tavua Int8: 8-bittinen kokonaisluku, jokainen data kattaa yhden tavun Int4: 4-bittisiä kokonaislukuja, jokainen data on 0,5 tavua
Miksi niin paljon tarkkuutta
Kustannusten ja tarkkuuden vuoksi. Me kaikki tiedämme, että korkea tarkkuus on ehdottomasti tarkempi, mutta se tuo myös korkeampia laskenta- ja tallennuskustannuksia. Alhaisempi tarkkuus heikentää laskennan tarkkuutta, mutta voi parantaa laskennallista tehokkuutta ja suorituskykyä. Näin ollen erilaiset tarkkuudet antavat sinun valita sopivimman eri tilanteissa. Kaksoistarkkuus on tarkempi kuin yksittäinen tarkkuuslauseke, mutta se vie kaksinkertaisen määrän tallennustilaa ja laskeminen vie enemmän aikaa.
Miksi suuria malleja täytyy kvantifioida?
1. Vähennä muistinkulutusta Suuret mallit käyttävät yleensä 32-bittisiä liukulukuja (FP32) tai 16-bittisiä liukulukulukuja (FP16) painojen ja aktivointiarvojen kuvaamiseen. Kvantisoimalla nämä korkean tarkkuuden arvot voidaan muuntaa matalamman tarkkuuden esityksiksi (esim. 8-bittiset kokonaisluvut, INT8), mikä vähentää mallin tallennustilaa merkittävästi. Tämä on tärkeää, kun otetaan käyttöön resurssirajoitetuilla laitteilla, kuten mobiililaitteilla, sulautetuissa järjestelmissä jne.
2. Nopeuta päättelynopeutta Kvantisoidut mallit voivat toimia tehokkaammin laitteistolla. Monilla nykyaikaisilla laitteilla (kuten GPU:t, TPU:t, NPU:t jne.) on erikoistunut optimointituki matalan tarkkuuden laskentaan, mikä mahdollistaa nopeammat kvantisointitoiminnot. Lisäksi matalan tarkkuuden laskennat vaativat usein vähemmän bittioperaatioita, mikä vähentää laskennallista monimutkaisuutta ja nopeuttaa näin päättelyä.
3. Vähennä virrankulutusta Kvantisoitu malli ei ainoastaan vähennä laskentaresurssien tarvetta, vaan myös vähentää virrankulutusta. Tämä on erityisen tärkeää paristokäyttöisille laitteille, kuten älypuhelimille, IoT-laitteille jne., joissa alhainen virrankulutus tarkoittaa pidempää akun kestoa.
4. Helppokäyttöiset reunalaitteet Monet suuret mallit koulutettiin ja otettiin käyttöön aluksi pilvessä, mutta reunalaskennan kehittyessä yhä useammat sovellusskenaariot vaativat mallien käyttöönottoa reunalaitteilla. Rajallisen laskentatehon ja tallennusresurssien vuoksi reunalaitteilla kvantisointi voi auttaa näitä malleja toimimaan tehokkaammin reunalaitteilla.
5. Vähennä kaistanleveyden tarvetta Hajautetun päättelyn tai mallipäivitysten yhteydessä kvantisointi voi vähentää mallin siirtoon tarvittavaa kaistanleveyttä. Tämä on hyödyllistä ympäristöissä, joissa verkon kaistanleveys on rajallinen, kuten IoT-laitteissa syrjäisillä alueilla.
6. Mallin suorituskyvyn ylläpito Vaikka kvantisointi aiheuttaa tietyn tarkkuuden heikkenemisen, mallin alkuperäinen suorituskyky voidaan pitkälti säilyttää sopivilla kvantisointimenetelmillä (kuten sekoitetun tarkkuuden kvantisointi, koulutuksen jälkeinen kvantisointi, kvantitatiivinen havaintokoulutus jne.). Siksi käytännön sovelluksissa kvantifiointi voi löytää hyvän tasapainon suorituskyvyn ja tehokkuuden välillä.
Muistiviite
| tyyppi | Jokaisen miljardin parametrin täytyy täyttää muisti | | float32 | 4G | | FP16/BF16 | 2G | | int8 | 1G | | int4 | 0,5G |
FP64 (Kaksoistarkkuus)
64-bittinen liukuluku, tyypillisesti kaksinkertaisen tarkkuuden binäärinen liukulukumuoto, jonka IEEE 754 määrittelee, sisältää:
Yksinumeroinen symboli 11-numeroinen indeksi 52 desimaalia
Etäisyys: ~2,23e-308 ... ~1,80e308 täydellä 15-17 desimaalin tarkkuudella.
Käyttö:
Tätä muotoa käytetään tieteellisiin laskelmiin, jotka vaativat suurta tarkkuutta. Sitä ei tyypillisesti käytetä syväoppimislaskelmissa. Ohjelmistotuki: Edustaa kaksoistyyppiä useimmissa C/C++-järjestelmissä. Tuettu TensorFlow'ssa (esim. tf.float64) / PyTorchissa (esim. torch.float64 tai torch.double). Laitteistotuki: Tyypillisesti tuettu x86-prosessoreissa. Useimmat GPU:t, erityisesti pelien GPU:t, mukaan lukien RTX-sarja, ovat erittäin rajoittuneita FP64-suorituskyvyssä (yleensä 1/32 FP32:n suorituskyvystä 1/2 sijaan). Viimeaikaisia rajoittamattomia FP64-tukemia GPU:ita ovat GP100/100/102/104 Tesla P40/P4:ssä ja Quadro GP100:ssa, GV100 Tesla V100/Quadro GV100/Titan V:ssä sekä äskettäin julkistettu GA100 A100:ssa (mielenkiintoista kyllä, uudessa Ampere-arkkitehtuurissa on kolmas sukupolvi) verrattuna FP64-yhteensopiviin Tensor Coreihin Uusi IEEE-yhteensopiva FP64-prosessointi on nyt mukana, joka tarjoaa 2,5-kertaisen FP64-suorituskyvyn verrattuna V100:aan.
FP32 (Täysi tarkkuus)
Tämä formaatti on pitkään ollut syväoppimisen työjuhta. Toinen IEEE 754 -formaatti, yksitarkkuuden liukuluku, sisältää:
Yksinumeroinen symboli 8-numeroinen indeksi 23 desimaalia Ihanteellisesti sekä harjoittelu että päättely tulisi tehdä FP32:ssa, mutta FP32 on kaksinkertainen hitaampi kuin FP16/BF16, joten käytännössä käytetään usein sekoitetun tarkkuuden menetelmiä, joissa FP32-painoja käytetään tarkkana "pääpainona", FP16/BF16-painoja käytetään eteen- ja taaksepäin etenemislaskelmiin harjoitusnopeuden parantamiseksi, ja lopuksi FP32:n suvereenit painot päivitetään FP16/BF16-gradientteilla gradienttipäivitysvaiheessa.
Harjoituksissa suvereeni paino on aina FP32. Käytännössä puolitarkkuuspainot tarjoavat usein samanlaisen tarkkuuden kuin FP32 päättelyssä – koska tarkat FP32-painot ovat tarpeen vain, kun mallin gradientti päivitetään. Tämä tarkoittaa, että voimme käyttää puolitarkkoja painoja päättelyssä, joten voimme saada saman tuloksen vain puolella GPU-muistista.
Etäisyys: ~1.18e-38 ... ~3.40e38, tarkkuus 6-9 merkittävää desimaalia.
Käyttö:
Neuroverkkolaskenta on ollut pitkään standardimuoto. Painot, aktivaatiot ja muut arvot neuroverkoissa ovat pitkään oletuksena FP32. Monissa tieteellisissä laskelmissa, erityisesti iteratiivisissa laskelmissa, tarkkuus ei riitä, mikä johtaa virheiden kertymiseen. Ohjelmistotuki: Edustaa kelluntatyyppiä useimmissa C/C++-järjestelmissä. Tuettu TensorFlow'ssa (esim. tf.float32) / PyTorchissa (esim. torch.float32 tai torch.float). Laitteistotuki: Tyypillisesti tuettu x86-prosessoreissa. Tyypillisesti tukee NVIDIA/AMD-näytönohjain.
FP16 (Puolitarkkuus)
Samoin IEEE 754:n standardiformaatti, puolitarkkuuden liukulukumuoto, sisältää:
Yksinumeroinen symboli 5-numeroinen indeksi 10 desimaalia FP16-luvulla on paljon pienempi numeerinen alue kuin FP32:lla. Siksi FP16 on vaarassa ylivuotoon (kun sitä käytetään edustamaan hyvin suuria lukuja) ja alivuotoa (kun sitä käytetään hyvin pieniä lukuja). Esimerkiksi kun teet 10k * 10k, lopputuloksen pitäisi olla 100M, mitä FP16 ei voi edustaa, koska FP16:n maksimimäärä on 64k. Näin ollen neuroverkkolaskelmissa saadaan NaN (Not a Number), koska laskut tehdään kerroksittain ja eräjärjestyksessä, joten kun NaN ilmestyy, kaikki aiemmat laskelmat tuhotaan. Yleisesti ottaen tätä voidaan lieventää häviöiden skaalaamisella, mutta tämä ei aina toimi.
Kantama: ~5.96e−8 (6.10e−5) ... 65504, tarkkuudella 4 merkittävää desimaalinumeroa.
Käyttö:
Syväoppiminen käyttää yleensä FP16:ta FP32:n sijaan, koska matalan tarkkuuden laskennat eivät tunnu merkityksellisiltä neuroverkoissa. Lisätarkkuus ei tee mitään, ja samalla se on hitaampaa, vaatii enemmän muistia ja hidastaa viestintää. Sitä voidaan käyttää koulutukseen, yleensä sekoitetun tarkkuuden harjoituksella (TensorFlow/PyTorch). Voidaan käyttää harjoittelun jälkeiseen kvantisointiin päättelyjen nopeuttamiseksi (TensorFlow Lite). Muita jälkikoulutuksen kvantisointiin käytettyjä formaatteja ovat kokonaisluvut INT8 (8-bittiset kokonaisluvut), INT4 (4-bittiset) ja jopa INT1 (binääriarvot). Ohjelmistotuki: Ei tällä hetkellä C/C++-standardissa (mutta lyhyt kelluntaehdotus on olemassa). Jotkut C/C++-järjestelmät tukevat __fp16 tyyppejä. Muussa tapauksessa sitä voidaan käyttää erityiskirjastojen kanssa. Tuettu TensorFlow'ssa (esim. tf.float16) / PyTorchissa (esim. torch.float16 tai torch.half). Laitteistotuki: x86-suorittimia ei tueta (ainutlaatuisena tyyppinä). Tuki vanhemmille pelinäytönohjaimille on heikkoa (32/1 suorituskyky FP64:lle, katso lisätietoja näytönohjaimista). Se on tällä hetkellä hyvin tuettu nykyaikaisissa GPU:issa, kuten NVIDIA RTX -sarjassa.
BFLOAT16 (Puolitarkkuus)
Toinen Googlen alun perin kehittämä 16-bittinen formaatti on nimeltään "Brain Floating Point Format" eli lyhyesti "bfloat16". Nimi tulee Google Brainista.
Alkuperäinen IEEE FP16 suunniteltiin ilman syväoppimissovelluksia, ja sen dynaaminen alue oli liian kapea. BFLOAT16 ratkaisee tämän ongelman tarjoamalla saman dynaamisen alueen kuin FP32:ssa.
Siksi BFLOAT16 on:
Yksinumeroinen symboli 8-numeroinen indeksi 7 desimaalia
bfloat16-formaatti on lyhennetty IEEE 754 FP32:een, mikä mahdollistaa nopean muuntamisen IEEE 754 FP32:een ja välillä. Kun muunnetaan bfloat16-muotoon, eksponentiaaliset bitit säilyvät, kun taas mantissan kentät voidaan vähentää trunkaamalla.
Etäisyys: ~1,18e-38 ... ~3,40e38, 3 merkittävää desimaalia. Käyttö:
Nyt näyttää siltä, että se korvaa FP16:n. Toisin kuin FP16, joka usein vaatii erityistä käsittelyä menetelmien kuten häviöskaalauksen avulla, BF16 on lähes suora korvaaja FP32:lle syvien neuroverkkojen koulutuksessa ja ajamisessa. Ohjelmistotuki: Ei C/C++-standardissa. Sitä voi käyttää erityiskirjastojen kanssa. Tuettu TensorFlow'ssa (esim. tf.bfloat16) / PyTorchissa (esim. torch.bfloat16).
TF32
TensorFloat-32 eli TF32 on uusi matemaattinen tila NVIDIA A100 -näytönohjaimissa.
Käyttäen samoja 10-bittisiä mantissoja kuin puolitarkkaa (FP16) matematiikkaa, TF32:ssa on riittävästi tilaa täyttääkseen tekoälykuormien tarkkuusvaatimukset. TF32 käyttää samaa 8-bittistä indeksiä kuin FP32, joten se tukee samaa numeerista aluetta.
Teknisesti se on 19-bittinen formaatti. Ajattele sitä laajennettuna tarkkuus BFLOAT16, kuten "BFLOAT19", tai heikennettynä tarkkuutena kuten FP32.
Joten TF32:lla on:
Yksinumeroinen symboli 8-numeroinen indeksi 10 desimaalia TF32:n etuna on, että sillä on sama formaatti kuin FP32:lla. Kun lasketaan sisätulo TF32:lla, syöteoperandin mantissa pyöristetään 23:sta 10 bittiin. Pyöristysoperandit kerrotaan täsmälleen ja kertyvät normaalissa FP32:ssa.
TF32 Tensor Core toimii FP32-tuloilla ja tuottaa tuloksia FP32:ssa ilman koodin muutoksia. Ei-matriisitoiminnot käyttävät edelleen FP32:ta. Tämä tarjoaa helpon tavan nopeuttaa FP32-syöte/tulostusdataa syväoppimisen kehyksissä ja HPC:ssä.
Etäisyys: ~1.18e-38 ... ~3.40e38, tarkkuus 4 merkittävää desimaalia. Käyttö:
Yksi TF32:n hienoista puolista on, että se tarvitsee kääntäjätukea vain syvimmällä tasolla, eli CUDA-kääntäjän sisällä. Loput koodista näkee FP32:n vähemmän tarkasti, mutta samalla dynaamisella alueella. TF32:n käyttö on pääasiassa tarkoitettu soittamaan kirjastoon ja näyttämään, toimiiko se kunnolla. TF32:n olemassaolo mahdollistaa nopeat lisäoset, hyödyntäen Tensor Coresin nopeutta ilman suurta vaivaa. Formaatit kuten FP16 ja BFLOAT16 vaativat enemmän hienosäätöä, koska niissä on erilaisia bittiasetteluja. Mutta näiden formaattien käyttö vähentää muistin kaistanleveyttä, mikä mahdollistaa nopeamman suorituksen. Vertailun vuoksi A100:n huippusuorituskyky on:
FP32 ilman tensoriytimiä: 19,5 TFLOPS TF32 Tensor -ytimet: 156 TFLOPS (joten TF32:n käyttäminen FP32:n sijaan helpottaa nopeuden kasvattamista). FP16/BF16 Tensor-ytimet: 312 TFLOPS (siksi järkevä vaihto FP16/BF16:een voi tuoda enemmän nopeutta, mutta korkeammalla kustannuksella). Ohjelmistotuki: Ei C/C++-standardissa. CUDA 11 tuettu. Laitteistotuki: GPU: NVIDIA A100 on ensimmäinen tuettu malli
FP8
H100-näytönohjaimen esittelemä se mahdollistaa suuremman matriisikertoistuksen ja konvoluution, mutta alhaisemmalla tarkkuudella.
H8:n tukemat FP100-tietotyypit ovat itse asiassa kaksi erilaista tietotyyppiä, joita voidaan käyttää neuroverkkokoulutuksen eri osissa:
E4M3 – koostuu yhdestä symbolisesta bitistä, 4 eksponentiaalisesta bitistä ja kolmesta desimaaliluvusta. Se voi tallentaa jopa +/-448 ja nan. E5M2 – koostuu yhdestä merkkibitistä, viidestä eksponentiaalisesta bitistä ja 2 desimaalista. Se voi tallentaa arvoja jopa +/-57344, +/-inf ja nan. Dynaamisen alueen kasvun kompromissi on, että tallennetut arvot ovat vähemmän tarkkoja.
Liukulukutietotyyppien rakenne. Kaikki näytetyt arvot (FP16, BF16, FP8 E4M3 ja FP8 E5M2) ovat lähin esitys arvosta 0,3952.
Molempia tyyppejä voidaan käyttää neuroverkon koulutuksessa. Yleisesti ottaen eteenpäin aktivointi ja painot vaativat suurempaa tarkkuutta, joten on parasta käyttää E4M3-datatyyppiä eteenpäin siirrettäessä. Kuitenkin takaisinpropagaatiossa verkon läpi kulkeva gradientti on yleensä vähemmän altis tarkkuuden menetykselle, mutta vaatii suuremman dynaamisen alueen. Siksi on parasta tallentaa ne E5M2-datamuodossa. H100 TensorCore tukee kaikkia näiden tyyppien yhdistelmää syötteenä, jolloin jokainen tensori voidaan tallentaa halutulla tarkkuudella.
Viittaus:
Hyperlinkin kirjautuminen on näkyvissä.
Hyperlinkin kirjautuminen on näkyvissä. |