A nagy modellek képzése és érvelése gyakran a pontosság fogalmát foglalja magában, és sokféle típus létezik, és ezek is különböző formátumokba vannak osztva, ugyanazon a pontossági szinten. Ezen felül a gyakorlati használati helyzetekben a többpontos és vegyes pontosságú fogalmak is jelen vannak.
Általános pontosság
Lebegőpontos pontosság: dupla pontosság (FP64), egy precizitás (FP32, TF32), fél pontosság (FP16, BF16), 8 bites pontosság (FP8), 4 bites pontosság (FP4, NF4) Számszerűsítési pontosság: INT8, INT4 (más néven INT3/INT5/INT6)
A lebegőpontos szám három részből áll: jel, exponenciális és mantissa bitek. Minél nagyobb az exponenciális bit, annál nagyobb a számok tartománya, amely reprezentálható. Minél nagyobb a mantissa számjegy, annál pontosabb a szám.
A táblázat a következőképpen foglalja össze
| formátum | szimbólumbit | Exponenciális bit | Tizedes szám | Összes számjegy | | 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 bites lebegőpontos szám, 4 bájt adatonként TF32: 19 bites lebegőpontos szám, minden adat 2 bájt FP16: 16 bites lebegőpontos szám, 2 bájt adatonként BF16: 16 bites lebegőpontos szám, minden adat 2 bájt Int8: 8 bites egész szám, minden adat 1 bájtot tesz Int4: 4 bites egész számok, minden adat 0,5 bájt
Miért ennyi precizitás
A költségek és a pontosság miatt. Mindannyian tudjuk, hogy a nagy pontosság kétségtelenül pontosabb, de magasabb számítási és tárolási költségeket is hoz. Az alacsonyabb pontosság csökkenti a számítási pontosságot, de javíthatja a számítási hatékonyságot és teljesítményt. Így a különböző precizitások lehetővé teszik, hogy különböző helyzetekben a legmegfelelőbbet válassza. A dupla precizitás pontosabb, mint az egyetlen precíziós kifejezés, de kétszer annyi tárhelyet foglal el, és több időt vesz igénybe a számítás.
Miért kell a nagy modelleket kvantifikálni?
1. Csökkentse a memóriahasználatot A nagy modellek általában 32 bites lebegőpontos számokat (FP32) vagy 16 bites lebegőpontos számokat (FP16) használnak a súlyok és aktivációs értékek ábrázolására. Kvantálásával ezek a nagy pontosságú értékek alacsonyabb pontosságú reprezentációkká alakíthatók (pl. 8 bites egész számok, INT8), ami jelentősen csökkenti a modell tárolóhelyét. Ez fontos az erőforrás-korlátozott eszközökön, például mobil eszközökön, beágyazott rendszereken stb. történő telepítéshez.
2. Gyorsítsd fel az érvelési sebességet A kvantizált modellek hatékonyabban működhetnek hardveren. Sok modern hardver (például GPU, TPU, NPU stb.) speciális optimalizálási támogatást nyújt alacsony pontosságú számításhoz, ami gyorsabb kvantálási műveleteket tesz lehetővé. Emellett az alacsony pontosságú számítások gyakran kevesebb bitműveletet igényelnek, ami csökkenti a számítási összetettséget és így felgyorsítja a következtetéseket.
3. Csökkentse az energiafogyasztást A kvantizált modell nemcsak csökkenti a számítási erőforrások igényét, hanem csökkenti az energiafogyasztást is. Ez különösen fontos akkumulátoros eszközöknél, mint az okostelefonok, IoT eszközök stb., ahol az alacsony energiafogyasztás hosszabb akkumulátor-élettartamot jelent.
4. Könnyen telepíthető edge eszközök Sok nagy modellt kezdetben felhőben képeztek és telepítettek, de az edge computing fejlődésével egyre több alkalmazási forgatókönyv követeli a modelleket edge eszközökön való telepítésre. Korlátozott számítási kapacitással és tárolási erőforrásokkal az edge eszközökön a kvantálás segíthet ezeknek a modelleknek a hatékonyabb futtatását az edge eszközökön.
5. Csökkentsék a sávszélesség-igényt Az elosztott következtetés vagy modellfrissítés során a kvantálás csökkentheti a modellátvitelhez szükséges sávszélességet. Ez hasznos korlátozott hálózati sávszélességű környezetekben, például távoli területeken működő IoT eszközökben.
6. A modell teljesítményének fenntartása Bár a kvantálás bizonyos pontosságvesztést okoz, a modell eredeti teljesítménye nagyrészt megőrizhető megfelelő kvantálási módszerekkel (például vegyes pontosságú kvantálás, utóképzés, kvantitatív észlelési képzés stb.). Ezért a gyakorlati alkalmazásokban a kvantifikáció jó egyensúlyt teremthet a teljesítmény és a hatékonyság között.
Memória hivatkozás
| típus | Minden milliárd paraméternek el kell foglalnia a memóriát | | float32 | 4G | | FP16/BF16 | 2G | | int8 | 1G | | int4 | 0,5G |
FP64 (Dupla Pontosság)
64 bites lebegőpont, amely általában az IEEE 754 által definiált dupla pontosságú bináris lebegőpontos formátum, a következőket tartalmazza:
1 jegyű szimbólum 11 jegyű index 52 tizedes szám
Hatótávolság: ~2,23e-308 ... ~1,80e308 teljes 15-17 tizedes pontossággal.
Használat:
Ezt a formátumot tudományos számításokhoz használják, amelyek nagy pontosságot igényelnek. Általában nem használják mélytanulási számításokhoz. Szoftvertámogatás: A legtöbb C/C++ rendszerben a kettős típust képviseli. Támogatott a TensorFlow (pl. tf.float64) / PyTorch (pl. torch.float64 vagy torch.double). Harver támogatás: Általában x86 CPU-kban támogatott. A legtöbb GPU, különösen a játék GPU-k, beleértve az RTX sorozatot is, erősen korlátozott az FP64 teljesítményben (általában az FP32 teljesítményének 1/32-e helyett 1/2). A legutóbbi korlátlan FP64-et támogató GPU-k közé tartozik a GP100/100/102/104 a Tesla P40/P4 és Quadro GP100 modellekben, a GV100 a Tesla V100/Quadro GV100/Titan V modellekben, valamint a nemrég bejelentett GA100 az A100-ban (érdekes módon az új Ampere architektúrának harmadik generációja van), szemben az FP64-tel rendelkező Tensor magokkal Az új, IEEE-kompatibilis FP64 feldolgozás is elérhető, amely 2,5-szerese az FP64 teljesítménynek a V100-hoz képest.
FP32 (Teljes pontosság)
Ez a formátum régóta a mélytanulás munkalója. Egy másik IEEE 754 formátum, egy pontosságú lebegőpontos lebegőslemez rendelkezik:
1 jegyű szimbólum 8 számjegyű index 23 tizedesjegy Ideális esetben mind a kiképzést, mind a következtetést az FP32-ben kellene végezni, de az FP32 kétszer olyan lassú, mint az FP16/BF16, ezért a gyakorlatban gyakran alkalmaznak vegyes pontosságú módszereket, ahol az FP32 súlyokat használják a pontos "mester súlyként", az FP16/BF16 súlyokat előre-hátra terjedési számításokhoz a kiképzési sebesség javítása érdekében, végül pedig az FP32 szuverén súlyait az FP16/BF16 gradiensekkel frissítik a gradiens frissítési fázisban.
Az edzés során a szuverén súly mindig FP32. A gyakorlatban a félprecíziós súlyok gyakran hasonló pontosságot biztosítanak az FP32-hez következtetéskor – mert a pontos FP32 súlyokra csak akkor van szükség, ha a modell gradiens frissül. Ez azt jelenti, hogy fél pontosságú súlyokat használhatunk következtetéskor, így ugyanazt az eredményt kapjuk csak a GPU memóriájának felével.
Távolság: ~1,18e-38 ... ~3,40e38, 6-9 jelentős tizedes pontossággal.
Használat:
Hosszú ideje a neurális hálózati számítástechnika szabványos típusa. A neurális hálózatokban a súlyok, aktivációk és egyéb értékek régóta alapértelmezetten FP32-re váltak. Sok tudományos számításnál, különösen az iteratív számításoknál, a pontosság nem elég, ami hibahalmozódáshoz vezet. Szoftvertámogatás: A legtöbb C/C++ rendszerben a lebegő típust képviseli. Támogatott a TensorFlow (pl. tf.float32) / PyTorch (pl. torch.float32 vagy torch.float). Harver támogatás: Általában x86 CPU-kban támogatott. Általában NVIDIA/AMD GPU által támogatott.
FP16 (Fél pontosság)
Hasonlóképpen, az IEEE 754 szabványos formátum, a félprecíziós lebegőpontos formátum a következőképpen tartalmaz:
1 jegyű szimbólum 5 jegyű index 10 tizedesjegy Az FP16 szám száma sokkal alacsonyabb a számtartományban, mint az FP32-é. Ezért az FP16 túlcsordulás (ha nagyon nagy számokat jelöl) és alulfolyás (ha nagyon kis számokat jelöl) veszélye van. Például, amikor 10k * 10k teljesítünk, az eredménynek 100M-nek kell lennie, amit az FP16 nem tud képviselni, mert az FP16 maximális száma 64k. Így a neurális hálózati számításokban NaN (Not a Number) lesz, mert a számítások rétegezett és tételes sorrendben végzik, így amint megjelenik a NaN, minden korábbi számítás megsemmisül. Általánosságban ezt csökkenthetjük veszteségskálázással, de ez a megközelítés nem mindig működik.
Tartomány: ~5,96e−8 (6,10e−5) ... 65504, 4 jelentős tizedes számjegy pontosságával.
Használat:
A mélytanulás általában az FP16-ot használja az FP32 helyett, mivel az alacsonyabb pontosságú számítások nem tűnnek fontosnak a neurális hálózatok számára. A extra precizitás semmit sem ér, ugyanakkor lassabb, több memóriát igényel és lassítja a kommunikációt. Használható képzésre, általában vegyes precíziós képzéssel (TensorFlow/PyTorch). Használható a tréning utáni kvantáláshoz, hogy felgyorsítsa a következtetést (TensorFlow Lite). Egyéb formátumok, amelyeket a tanítás utáni kvantáláshoz használnak, például az INT8 (8 bites egész számok), az INT4 (4 bites), sőt az INT1 (bináris értékek) is. Szoftvertámogatás: Jelenleg nincs a C/C++ szabványban (de van egy rövid float javaslat). Néhány C/C++ rendszer támogatja a __fp16 típusokat. Egyébként speciális könyvtáraknál is használható. Támogatott a TensorFlow (pl. tf.float16) / PyTorch (pl. torch.float16 vagy torch.half). Harver támogatás: az x86 CPU-k nem támogatottak (egyedi típusként). A régebbi gaming GPU-k támogatása gyenge (32/1 teljesítmény FP64-re, lásd a GPU-k posztját további részletekért). Jelenleg jól támogatott a modern GPU-kon, például az NVIDIA RTX sorozaton.
BFLOAT16 (Félprecízis)
Egy másik, a Google által eredetileg kifejlesztett 16 bites formátumot "Brain Floating Point Format", röviden "bfloat16" néven ismert. A név a Google Brain-ből származik.
Az eredeti IEEE FP16-ot mélytanulási alkalmazások előtt tervezték, és a dinamikai tartománya túl szűk volt. BFLOAT16 megoldja ezt a problémát, ugyanazt a dinamikatartományt biztosítja, mint az FP32.
Ezért BFLOAT16 rendelkeznek:
1 jegyű szimbólum 8 számjegyű index 7 tizedesjegy
A bfloat16 formátum lerövidítve van az IEEE 754 FP32-re, ami gyors átváltást tesz lehetővé az IEEE 754 FP32-re és között. A bfloat16 formátumra való átalakításkor exponenciális bitek megmaradnak, míg a mantissa mezők levágással csökkenthetők.
Tartomány: ~1,18e-38 ... ~3,40e38, három jelentős tizedesszámmal. Használat:
Most úgy tűnik, hogy ez helyettesíti az FP16-ot. Az FP16-tól ellentétben, amely gyakran speciális feldolgozást igényel olyan technikákkal, mint a veszteségskálázás, a BF16 szinte közvetlen helyettesítője az FP32-nek a mély neurális hálózatok képzése és futtatása során. Szoftvertámogatás: Nem a C/C++ szabványban. Használható speciális könyvtárakkal. Támogatott a TensorFlow (pl. tf.bfloat16) / PyTorch (pl. torch.bfloat16).
TF32
A TensorFloat-32 vagy TF32 az NVIDIA A100 GPU-k új matematikai módja.
Ugyanazokat a 10 bites mantisszákat használva, mint a fél precíziós (FP16) matematikát, a TF32 elegendő fejtérrel rendelkezik ahhoz, hogy megfeleljen az AI munkaterhelések pontossági követelményeinek. A TF32 ugyanazt a 8 bites indexet használja, mint az FP32, így ugyanazt a numerikus tartományt támogatja.
Technikailag ez egy 19 bites formátum. Gondolj rá egy kiterjesztett precíziós BFLOAT16-ként, mint a "BFLOAT19"-nek, vagy csökkentett pontosságnak, mint az FP32-re.
Tehát a TF32-nek van a következő elemei:
1 jegyű szimbólum 8 számjegyű index 10 tizedesjegy A TF32 előnye, hogy ugyanaz a formátum, mint az FP32-nek. A TF32-vel a belső szorzatot kiszámítva a bemeneti operánd mantisszáját 23-ról 10 bitre kerekítik. A kerekítő operandok pontosan szorozódnak és felhalmozódnak a normál FP32-ben.
A TF32 Tensor Core FP32 bemeneteken fut, és FP32-ben kódváltás nélkül generál eredményt. A nem mátrix műveletek továbbra is az FP32-t használják. Ez egyszerű módot kínál az FP32 bemeneti/kimeneti adatok gyorsítására mélytanulási keretrendszerekben és HPC-ben.
Távolság: ~1,18e-38 ... ~3,40e38, 4 jelentős tizedesjegy pontossággal. Használat:
A TF32 egyik nagyszerű tulajdonsága, hogy csak a legmélyebb szinten, azaz a CUDA fordítóján belül kell támogatni a fordítót. A kód többi része csak az FP32-t mutatja kevesebb pontossággal, de ugyanazzal a dinamikatartománysal. A TF32 használata főként arra szolgál, hogy hívásokat indítson a könyvtárba, hogy megmutasd, működik-e rendesen. A TF32 jelenléte gyors plug-in-eket tesz lehetővé, kihasználva a Tensor Cores sebességét anélkül, hogy sok munka nélkül kihasználják. Az FP16 és az BFLOAT16 formátumok több módosítást igényelnek, mivel különböző bitelrendezéseket igényelnek. Ezeknek a formátumoknak a használata azonban csökkenti a memória sávszélességét, így gyorsabb végrehajtást tesz lehetővé. Összehasonlításképpen: az A100 csúcsteljesítménye a következő:
FP32 tenzormag nélkül: 19,5 TFLOPS TF32 Tensor magok: 156 TFLOPS (így a TF32 használata az FP32 helyett megkönnyíti a sebességnövelést). FP16/BF16 Tenzor magok: 312 TFLOPS (ezért egy ésszerű váltás FP16/BF16-ra nagyobb sebességnövekedést hozhat, de magasabb költséggel). Szoftvertámogatás: Nem a C/C++ szabványban. CUDA 11 támogatott. Harver támogatás: GPU: Az NVIDIA A100 az első támogatott modell
FP8
A H100 GPU által bevezetett ez nagyobb mátrix szorzást és konvolutciót tesz lehetővé, de alacsonyabb pontossággal.
A H8 által támogatott FP100 adattípusok valójában két különböző adattípus, amelyeket a neurális hálózati képzés különböző részeihez lehet használni:
E4M3 - 1 szimbolikus bitből, 4 exponenciális bitből és 3 tizedesszámból áll. Akár +/-448 és nan-ig is tárolhat. E5M2 - 1 jelbitből, 5 exponenciális bitből és 2 tizedesből áll. Értékeket tárolhat +/-57344, +/-inf és nan értékekig. A dinamikatartomány növekedésének kompromisszumja, hogy a tárolt értékek kevésbé pontosak.
A lebegőpontos adattípusok szerkezete. Minden megjelenített érték (az FP16, BF16, FP8 E4M3 és FP8 E5M2 formátumokban) a 0,3952 érték legközelebbi ábrázolása.
Mindkét típus használható egy neurális hálózat képzése során. Általánosságban elmondható, hogy az előrehaladó aktiválás és súlyok nagyobb pontosságot igényelnek, ezért a legjobb az E4M3 adattípust használni előrehaladás során. Azonban visszaterjedésnél a hálózaton áthaladó gradiens általában kevésbé érzékeny a pontosságvesztésre, de nagyobb dinamikai tartományt igényel. Ezért a legjobb az E5M2 adatformátummal tárolni őket. A H100 TensorCore bármelyik kombinációt támogatja bemenetként, lehetővé téve az egyes tenzor tárolását a kívánt pontossággal.
Utalás:
A hiperlink bejelentkezés látható.
A hiperlink bejelentkezés látható. |