|
|
Опубліковано 2025-3-10 14:22:34
|
|
|
|

Навчання та міркування великих моделей часто пов'язані з поняттям точності, існує багато типів, які також поділяються на різні формати з однаковим рівнем точності. Крім того, існують також концепції багатоточної та змішаної точності у практичних сценаріях.
Поширена точність
Точність з плаваючою комою: подвійна точність (FP64), одинарна точність (FP32, TF32), половина точності (FP16, BF16), 8-бітна точність (FP8), 4-бітна точність (FP4, NF4) Точність кількісної оцінки: INT8, INT4 (також INT3/INT5/INT6)
Число з плаваючою комою складається з трьох частин: знакового, експоненціального та бітів мантиси. Чим більший експоненціальний біт, тим ширший діапазон чисел, які можна представити. Чим більша цифра богомола, тим вища точність числа.
Таблиця підсумовує це наступним чином
| Формат | Біт символу | Експоненціальний біт | Десятковий знак | Загальна кількість цифр | | 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-бітне число з плаваючою комою, 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. Легкі у розгортанні периферійні пристрої Багато великих моделей спочатку навчалися та розгорталися в хмарі, але з розвитком периферійних обчислень все більше сценаріїв застосувань вимагають розгортання моделей на периферійних пристроях. З обмеженою обчислювальною потужністю та ресурсами зберігання на периферійних пристроях квантування може допомогти цим моделям ефективніше працювати на периферійних пристроях.
5. Зменшити вимоги до пропускної здатності У процесі розподіленого висновку або оновлення моделі квантування може зменшити пропускну здатність, необхідну для передачі моделі. Це корисно для середовищ із обмеженою пропускною здатністю мережі, наприклад, IoT-пристрої у віддалених районах.
6. Підтримувати продуктивність моделі Хоча квантування призводить до певної втрати точності, початкову продуктивність моделі можна значною мірою зберегти за допомогою відповідних методів квантування (таких як квантування змішаної точності, квантування після навчання, тренування кількісного сприйняття тощо). Тому на практиці кількісна оцінка може досягти хорошого балансу між продуктивністю та ефективністю.
Референс пам'яті
| тип | Кожен мільярд параметрів повинен займати пам'ять | | float32 | 4G | | FP16/BF16 | 2G | | int8 | 1G | | int4 | 0,5G |
FP64 (Подвійна точність)
64-бітний формат з плаваючою комою, зазвичай подвійний формат з плаваючою комою, визначений IEEE 754, має:
Однозначний символ 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). Останні необмежені GPU з підтримкою 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, з однією точністю з плаваючою комою, має:
Однозначний символ 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, формат з плаваючою краєю з напівточністю має:
Однозначний символ 5-значний індекс 10 знаків після десятки Номер FP16 має значно менший числовий діапазон, ніж FP32. Отже, FP16 має ризик переповнення (коли використовується для позначення дуже великих чисел) і недоповнення (коли використовується для позначення дуже малих чисел). Наприклад, коли ви робите 10k * 10k, кінцевий результат має бути 100M, що FP16 не може представляти, оскільки максимальна кількість FP16 становить 64k. Отже, у нейронних мережах у розрахунках отримуєш NaN (Not a Number), бо обчислення виконуються у шаровому та пакетному порядку, і коли з'являється NaN, всі попередні розрахунки знищуються. Загалом, це можна пом'якшити за допомогою масштабування втрат, але цей підхід не завжди працює.
Дальність: ~5.96e−8 (6.10e−5) ... 65504, з точністю 4 значущі десяткові цифри.
Використання:
Глибоке навчання зазвичай використовує FP16 замість FP32, оскільки обчислення з нижчою точністю не мають значення для нейронних мереж. Додаткова точність нічого не робить, і водночас вона повільніша, вимагає більше пам'яті і сповільнює комунікацію. Може використовуватися для тренувань, зазвичай за допомогою тренування змішаної точності (TensorFlow/PyTorch). Може використовуватися для квантування після тренування з метою прискорення висновку (TensorFlow Lite). Інші формати, що використовуються для квантування після навчання, включають цілі числа INT8 (8-бітні цілі числа), INT4 (4-бітні) і навіть INT1 (бінарні значення). Підтримка програмного забезпечення: Наразі це не входить до стандарту C/C++ (але є коротка пропозиція щодо float). Деякі системи C/C++ підтримують __fp16 типи. Інакше його можна використовувати зі спеціальними бібліотеками. Підтримується у TensorFlow (наприклад, tf.float16) / PyTorch (наприклад, torch.float16 або torch.half). Підтримка апаратного забезпечення: Процесори x86 не підтримуються (як унікальний тип). Підтримка старих ігрових відеокарт слабка (продуктивність 32/1 для FP64, дивіться допис про відеокарти для детальнішої інформації). Наразі він добре підтримується на сучасних GPU, таких як серія NVIDIA RTX.
BFLOAT16 (Напівточна)
Ще один 16-бітний формат, спочатку розроблений Google, називається «Brain Floating Point Format» або скорочено «bfloat16». Назва походить від Google Brain.
Оригінальний IEEE FP16 був розроблений без урахування застосувань глибокого навчання, а його динамічний діапазон був надто вузьким. BFLOAT16 вирішує цю проблему, забезпечуючи той самий динамічний діапазон, що й FP32.
Отже, BFLOAT16 маємо:
Однозначний символ 8-значний індекс 7 десяткових знаків
Формат bfloat16 скорочений до IEEE 754 FP32, що дозволяє швидко конвертувати IEEE 754 FP32 і назад. При конвертації у формат bfloat16 експоненціальні біти зберігаються, тоді як поля мантиси можна зменшити за допомогою усічання.
Діапазон: ~1.18e-38 ... ~3.40e38 з трьома значущими десятковими знаками. Використання:
Зараз, здається, він замінює FP16. На відміну від FP16, яка часто потребує спеціальної обробки за допомогою таких методів, як масштабування втрат, BF16 майже є прямою заміною FP32 при навчанні та запуску глибоких нейронних мереж. Підтримка програмного забезпечення: Не в стандарті C/C++. Може використовуватися зі спеціальними бібліотеками. Підтримується в TensorFlow (наприклад, tf.bfloat16) / PyTorch (наприклад, torch.bfloat16).
TF32
TensorFloat-32 або TF32 — це новий математичний режим у відеокартах NVIDIA A100.
Використовуючи ті ж 10-бітні мантиси, що й напівточна (FP16) математика, TF32 доводить, що має достатній запас для забезпечення точності завдань ШІ. І TF32 використовує той самий 8-бітний індекс, що й FP32, тому може підтримувати той самий числовий діапазон.
Технічно це 19-бітний формат. Уявіть це як розширену точність BFLOAT16, наприклад «BFLOAT19», або знижену точність, як FP32.
Отже, TF32 має:
Однозначний символ 8-значний індекс 10 знаків після десятки Перевага TF32 полягає в тому, що він має той самий формат, що й FP32. При обчисленні внутрішнього добутку з TF32 мантисса вхідного операнда округляється від 23 до 10 біт. Операнди округлення множаться точно і накопичуються у нормальному FP32.
Тензорне ядро TF32 працює на входах 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
Впроваджений GPU H100, він дозволяє краще множити матриці та згортку, але з меншою точністю.
Типи даних 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
|