Тази статия е огледална статия за машинен превод, моля, кликнете тук, за да преминете към оригиналната статия.

Изглед: 3298|Отговор: 0

Двойна прецизност (FP64), Единична прецизност (P32, TF32), Половин прецизност (FP16, BF16)

[Копирай линк]
Публикувано на 2025-3-10 14:22:34 | | | |
Обучението и разсъждаването на големите модели често включват концепцията за точност, има много типове, които също са разделени на различни формати с еднакво ниво на точност. Освен това съществуват и концепциите за мулти-прецизност и смесена прецизност в практически сценарии.

Обща прецизност

Точност с плаваща запетая: двойна прецизност (FP64), единична прецизност (FP32, TF32), половин прецизност (FP16, BF16), 8-битова точност (FP8), 4-битова точност (FP4, NF4)
Точност на количествената оценка: INT8, INT4 (също INT3/INT5/INT6)

Число с плаваща запетая се състои от три части: знаков, експоненциален и битове за мантиса. Колкото по-голям е експоненциалният бит, толкова по-голям е диапазонът от числа, които могат да бъдат представени. Колкото по-голяма е цифрата на мантисата, толкова по-висока е точността на числото.



Таблицата го обобщава по следния начин

форматБит за символЕкспоненциален битДесетичнатаОбщо цифри
FP641115264
FP32182332
TF32181019
BF1618716
FP16151016
FP8 E4M31438
FP8 E5M21528
FP41214


FP32: 32-битово число с плаваща запетая, 4 байта на данни
TF32: 19-битово число с плаваща запетая, всяка дата е 2 байта
FP16: 16-битово число с плаваща запетая, 2 байта на данни
BF16: 16-битово число с плаваща запетая, всяко число е 2 байта
Int8: 8-битово цяло число, всяко число отчита 1 байт
Int4: 4-битови цели числа, всяко количество данни е 0.5 байта

Защо толкова прецизна

Поради цената и точността. Всички знаем, че високата точност определено е по-точна, но тя също така води до по-високи разходи за изчисления и съхранение. По-ниската прецизност намалява точността на изчисленията, но може да подобри изчислителната ефективност и производителността. Затова разнообразието от прецизност ви позволява да изберете най-подходящия в различни ситуации.
Двойната прецизност е по-точна от израза с една прецизност, но заема два пъти повече място за съхранение и повече време за изчисляване.

Защо големите модели трябва да бъдат количествено измервани?

1. Намаляване на използването на памет
Големите модели обикновено използват 32-битови числа с плаваща запетая (FP32) или 16-битови числа с плаваща запетая (FP16), за да представят тегла и стойности на активация. Чрез квантизиране тези високопрецизни стойности могат да бъдат преобразувани в представяния с по-ниска точност (например 8-битови цели числа, INT8), което значително намалява пространството за съхранение на модела. Това е важно при внедряване на устройства с ограничени ресурси като мобилни устройства, вградени системи и др.

2. Ускорете скоростта на разсъждение
Квантуваните модели могат да работят по-ефективно на хардуер. Много съвременни хардуери (като GPU, TPU, NPU и др.) имат специализирана оптимизационна поддръжка за нископрецизни изчисления, което позволява по-бързи операции по квантуване. Освен това, изчисленията с ниска прецизност често включват по-малко битови операции, което намалява изчислителната сложност и по този начин ускорява изводите.

3. Намалете консумацията на енергия
Квантизираният модел не само намалява нуждата от изчислителни ресурси, но и намалява консумацията на енергия. Това е особено важно за устройства с батерии като смартфони, IoT устройства и др., където ниска консумация на енергия означава по-дълъг живот на батерията.

4. Лесни за внедряване крайни устройства
Много големи модели първоначално бяха обучавани и внедрени в облака, но с развитието на edge computing, все повече и повече сценарии на приложения изискват моделите да бъдат внедрени на крайни устройства. С ограничена изчислителна мощ и ресурси за съхранение на edge устройства, квантизацията може да помогне на тези модели да работят по-ефективно на edge устройства.

5. Намаляване на изискванията за пропускателна способност
В процеса на разпределени изводи или актуализации на модела, квантизацията може да намали необходимата пропускателна способност за трансфер на модела. Това е полезно за среди с ограничена мрежова пропускателна способност, като IoT устройства в отдалечени райони.

6. Поддържане на производителността на модела
Въпреки че квантизацията въвежда известна загуба на прецизност, оригиналната производителност на модела може до голяма степен да бъде запазена чрез подходящи методи за квантуване (като смесена прецизна квантизация, квантизация след обучение, обучение по количествено възприятие и др.). Следователно, в практическите приложения, количественото определяне може да постигне добър баланс между производителност и ефективност.

Референция за паметта

видВсеки милиард параметър трябва да заема паметта
float324G
FP16/BF162G
int81G
int40.5G


FP64 (Двойна прецизност)

64-битов формат с плаваща запетая, обикновено двоичен формат с плаваща запетая с двойна прецизност, дефиниран от IEEE 754, има:

Символ с 1 цифра
11-цифрен индекс
52 десетични знака



Обхват: ~2.23e-308 ... ~1.80e308 с пълна десетична точност 15-17.

Използване:

Този формат се използва за научни изчисления, които изискват висока прецизност.
Обикновено не се използва за изчисления за дълбоко обучение.
Софтуерна поддръжка:
Представлява двойния тип в повечето C/C++ системи.
Поддържани в TensorFlow (например tf.float64) / PyTorch (например torch.float64 или torch.double).
Хардуерна поддръжка:
Обикновено се поддържа в x86 процесори.
Повечето GPU-та, особено геймърските, включително серията RTX, са силно ограничени по отношение на производителността на FP64 (обикновено 1/32 от производителността на FP32 вместо 1/2).
Последните неограничени графични процесори, поддържани от FP64, включват GP100/100/102/104 в Tesla P40/P4 и Quadro GP100, GV100 в Tesla V100/Quadro GV100/Titan V, както и наскоро обявения GA100 в A100 (интересно е, че новата архитектура Ampere има трето поколение) в сравнение с Tensor Core, поддържащи FP64 Новата FP64 процесорна система, съвместима с IEEE, вече е включена, която осигурява 2.5 пъти по-висока производителност от FP64 спрямо V100.

FP32 (Пълна точност)

Този формат отдавна е работен кон за дълбоко обучение. Друг формат на IEEE 754, с една прецизност с плаваща запетая, има:

Символ с 1 цифра
8-цифрен индекс
23 десетични знака
Идеално би било както обучението, така и изводът да се извършват във FP32, но FP32 е два пъти по-бавен от FP16/BF16, затова често се използват смесени прецизни методи на практика, при които FP32 тегла се използват като точна "главна тежест", тегла FP16/BF16 се използват за изчисляване на напред и назад разпространение с цел подобряване на скоростта на тренировка, а накрая суверенните тегла на FP32 се обновяват с градиенти FP16/BF16 във фазата на обновяване на градиента.

По време на тренировки суверенното тегло винаги е FP32. На практика полу-прецизните тегла често осигуряват сходна точност като FP32 при извеждане – защото точните FP32 тегла са необходими само при обновяване на градиента на модела. Това означава, че можем да използваме полу-прецизни тегла при извод, така че можем да получим същия резултат само с половината от GPU паметта.



Обхват: ~1.18e-38 ... ~3.40e38 с точност 6-9 значими десетични знака.

Използване:

Стандартният тип невронни мрежови изчисления дълго време. Тегла, активации и други стойности в невронните мрежи отдавна са по подразбиране FP32.
За много научни изчисления, особено итеративни, точността не е достатъчна, което води до натрупване на грешки.
Софтуерна поддръжка:
Представлява типа float в повечето C/C++ системи.
Поддържани в TensorFlow (например tf.float32) / PyTorch (например torch.float32 или torch.float).
Хардуерна поддръжка:
Обикновено се поддържа в x86 процесори.
Обикновено се поддържа от NVIDIA/AMD GPU.

FP16 (Половин точност)

По подобен начин, стандартният формат на IEEE 754, форматът с плаваща запетая с половин прецизност, има:

Символ с 1 цифра
5-цифрен индекс
10 десетични знака
Номерът FP16 има много по-нисък числов обхват от FP32. Затова FP16 е изложен на риск от препълване (когато се използва за представяне на много големи числа) и недопълване (когато се използва за представяне на много малки числа). Например, когато направите 10k * 10k, крайният резултат трябва да е 100M, което FP16 не може да представи, защото максималният брой, който FP16 може да представи, е 64k. Така в невронните мрежи се получава NaN (Не число), защото изчисленията се правят в пластов и пакетен ред, така че щом се появи NaN, всички предишни изчисления се унищожават. Обикновено това може да се смекчи чрез скалиране на загубите, но този подход не винаги работи.



Обхват: ~5.96e−8 (6.10e−5) ... 65504, с точност от 4 значими десетични цифри.

Използване:

Дълбокото обучение обикновено използва FP16 вместо FP32, тъй като изчисленията с по-ниска точност изглежда нямат значение за невронните мрежи. Допълнителната прецизност не прави нищо, а в същото време е по-бавна, изисква повече памет и забавя комуникацията.
Може да се използва за тренировки, обикновено чрез смесена прецизност (TensorFlow/PyTorch).
Може да се използва за квантуване след обучението с цел ускоряване на изводите (TensorFlow Lite). Други формати, използвани за квантуване след обучение, включват цели числа INT8 (8-битови цели числа), INT4 (4-битови) и дори INT1 (двоични стойности).
Софтуерна поддръжка:
В момента не е в стандарта C/C++ (но има кратко предложение за плаване). Някои C/C++ системи поддържат __fp16 типове. В противен случай може да се използва със специални библиотеки.
Поддържан в TensorFlow (например tf.float16) / PyTorch (например torch.float16 или torch.half).
Хардуерна поддръжка:
x86 процесори не се поддържат (като уникален тип).
Поддръжката на по-стари геймърски видеокарти е слаба (производителност 32/1 за FP64, вижте публикацията за видеокарти за повече подробности). В момента е добре поддържан на съвременни графични процесори, като серията NVIDIA RTX.

BFLOAT16 (Полу-прецизност)

Друг 16-битов формат, първоначално разработен от Google, се нарича "Brain Floating Point Format" или накратко "bfloat16". Името идва от Google Brain.

Оригиналният IEEE FP16 беше проектиран без да има предвид приложения за дълбоко обучение, а динамичният му обхват беше твърде тесен. BFLOAT16 решава този проблем, осигурявайки същия динамичен обхват като FP32.

Следователно BFLOAT16 имам:

Символ с 1 цифра
8-цифрен индекс
7 десетични числа



Форматът bfloat16 е съкратен до IEEE 754 FP32, което позволява бързо преобразуване към и от IEEE 754 FP32. При преобразуване в bfloat16 формат експоненциалните битове се запазват, докато полетата на мантиса могат да бъдат намалени чрез отсичане.



Обхват: ~1.18e-38 ... ~3.40e38 с 3 значими десетични знака.
Използване:

Сега изглежда, че замества FP16. За разлика от FP16, който често изисква специална обработка чрез техники като мащабиране на загуби, BF16 е почти директен заместител на FP32 при обучение и изпълнение на дълбоки невронни мрежи.
Софтуерна поддръжка:
Не и в стандарта C/C++. Може да се използва със специални библиотеки.
Поддържани в TensorFlow (например tf.bfloat16) / PyTorch (например torch.bfloat16).

TF32

TensorFloat-32 или TF32 е новият математически режим в NVIDIA A100 GPU-тата.

Използвайки същите 10-битови мантиси като математиката с половин прецизност (FP16), TF32 доказва, че има достатъчно капацитет, за да отговори на изискванията за прецизност на AI работните натоварвания. А TF32 използва същия 8-битов индекс като FP32, така че може да поддържа същия числов диапазон.

Технически, това е 19-битов формат. Мислете за това като удължена прецизна BFLOAT16, като "BFLOAT19", или намалена прецизност като FP32.

Така че, TF32 има:

Символ с 1 цифра
8-цифрен индекс
10 десетични знака
Предимството на TF32 е, че има същия формат като FP32. При изчисляване на вътрешното произведение с TF32, мантисата на входния операнд се закръгля от 23 на 10 бита. Операндите за закръгляне се умножават точно и се натрупват в нормален FP32.

TF32 Tensor Core работи на FP32 входове и генерира резултати във FP32 без промени в кода. Нематричните операции продължават да използват FP32. Това осигурява лесен начин за ускоряване на входно-изходящите данни от FP32 в рамките за дълбоко обучение и HPC.

Обхват: ~1.18e-38 ... ~3.40e38 с точност от 4 значими десетични числа.
Използване:

Едно от страхотните неща при TF32 е, че се нуждае от поддръжка на компилатор само на най-дълбоко ниво, т.е. вътре в компилатора на CUDA. Останалата част от кода просто вижда FP32 с по-малка прецизност, но със същия динамичен обхват. Използването на TF32 е основно за обаждания към библиотеката, за да се покаже дали работи правилно. Присъствието на TF32 позволява бързи плъгини, като се възползва от скоростта на Tensor ядра без много усилия.
Формати като FP16 и BFLOAT16 изискват повече корекции, тъй като включват различни битови разположения. Но използването на тези формати намалява пропускателната способност на паметта, позволявайки по-бързо изпълнение.
За сравнение, максималната производителност на A100 е:

FP32 без тензорни ядра: 19.5 TFLOPS
TF32 тензорни ядра: 156 TFLOPS (така че използването на TF32 вместо FP32 улеснява увеличаването на скоростта).
FP16/BF16 тензорни ядра: 312 TFLOPS (следователно, разумен преход към FP16/BF16 може да донесе повече увеличения на скоростта, но на по-висока цена).
Софтуерна поддръжка:
Не и в стандарта C/C++.
CUDA 11 се поддържа.
Хардуерна поддръжка:
GPU: NVIDIA A100 е първият модел, който се поддържа

FP8

Въведен от H100 GPU, той позволява по-голямо умножение и конволюция на матрици, но с по-ниска точност.

FP100 типовете данни, поддържани от H8, всъщност са два различни типа данни, които могат да се използват за различни части на обучението на невронни мрежи:

E4M3 - състои се от 1 символен бит, 4 експоненциални бита и 3 десетични числа. Може да съхранява до +/-448 и NAN.
E5M2 - състои се от 1 знаков бит, 5 експоненциални бита и 2 десетични числа. Може да съхранява стойности до +/-57344, +/-inf и nan. Компромисът при увеличаване на динамичния обхват е, че съхранените стойности са по-малко точни.



Структура на типовете данни с плаваща запетая. Всички показани стойности (във FP16, BF16, FP8 E4M3 и FP8 E5M2) са най-близкото представяне на стойността 0.3952.

И двата типа могат да се използват при обучение на невронна мрежа. Общо взето, директната активация и тегла изискват по-висока прецизност, затова е най-добре да се използва тип данни E4M3 при напредно преминаване. Въпреки това, при обратното разпространение градиентът, който тече през мрежата, обикновено е по-малко податлив на загуба на прецизност, но изисква по-висок динамичен обхват. Затова е най-добре да ги съхранявате чрез формат E5M2. H100 TensorCore поддържа всяка комбинация от тези типове като вход, което ни позволява да съхраняваме всеки тензор с предпочитаната от него прецизност.

Препратка:

Входът към хиперлинк е видим.
Входът към хиперлинк е видим.




Предишен:Мрежа - Устройствата под основния маршрут и подмаршрута са взаимосвързани
Следващ:[AI] (10) LLM голям модел инференция, GPU памет, оценка на VRAM
Отричане:
Целият софтуер, програмни материали или статии, публикувани от Code Farmer Network, са само за учебни и изследователски цели; Горното съдържание не трябва да се използва за търговски или незаконни цели, в противен случай потребителите ще понесат всички последствия. Информацията на този сайт идва от интернет, а споровете за авторски права нямат нищо общо с този сайт. Трябва напълно да изтриете горното съдържание от компютъра си в рамките на 24 часа след изтеглянето. Ако ви харесва програмата, моля, подкрепете оригинален софтуер, купете регистрация и получете по-добри услуги. Ако има нарушение, моля, свържете се с нас по имейл.

Mail To:help@itsvse.com