Знак, Показник, Мантіса
Формат чисел з плаваючою комою IEEE 754
Кожне число з плаваючою комою зберігає три поля:
- Біт знаку (1 біт): додатній чи від'ємний
- Показник степеня (E бітів): масштаб величини, ціле число у степені 2
- Мантиса (M бітів): дробова точність, число між 1.0 та ~2.0
Загальна кількість бітів = 1 + E + M. Значення приблизно дорівнює (-1)^sign (1 + mantissa) 2^(exponent - bias).
Для тренування важливі дві властивості:
Динамічний діапазон = 2^(2^E) (приблизно). Більше бітів показника степеня означає представлення менших та більших чисел без переповнення.
Точність = 2^M різних значень на кожну степінь двійки. Більше бітів мантиси означає детальніше представлення між послідовними степенями двійки.
Три формати
| Формат | Загальна кількість бітів | Знак | Експ | Мант | Динамічний діапазон | Точність |
|---|---|---|---|---|---|---|
| FP32 | 32 | 1 | 8 | 23 | ~10^-38 до ~10^38 | ~7 цифр |
| FP16 | 16 | 1 | 5 | 10 | ~10^-5 до ~10^5 | ~3 цифри |
| FP8 E4M3 | 8 | 1 | 4 | 3 | ~2^-9 до ~448 | ~2 цифри |
FP8 E4M3 читається як "4 біти експоненти, 3 біти мантиси". Альтернативний FP8 E5M2 обмінює точність на діапазон; експерименти ANDREA використовують E4M3, тому що активації трансформера залишаються у вузьких діапазонах величин, де додаткова точність переважає над додатковим діапазоном.
Байт на параметр
Чому нижча точність працює швидше
Пропускна здатність пам'яті домінує над швидкістю тренування
Сучасні GPU витрачають більше часу на очікування пам'яті, ніж на обчислення. RTX 4090 має пропускну здатність пам'яті 1008 GB/s та 165 TFLOPS обчислень FP16. Типовий шар читає ваги з VRAM, множить активації, записує результати назад. Пропускна здатність, а не обчислення, визначає пропускну здатність.
Подвоєння точності зменшує байти на параметр удвічі, тому читання тих самих ваг використовує половину пропускної здатності пам'яті. Пропускна здатність приблизно подвоюється.
Tensor Cores: Апаратно-прискорене множення матриць
RTX 4090 має спеціалізовані блоки tensor core, які обчислюють множення матриць у FP16 або FP8 безпосередньо. Одна операція tensor core множить малий блок (наприклад, 16x16) за один цикл, що значно швидше за скалярне множення FP32.
Емпіричні дані з ANDREA-120M:
| Точність | Кроки/хв | Примітки |
|---|---|---|
| FP32 | ~3 | базовий рівень; без прискорення tensor core |
| FP16 | ~6 | ядра tensor cuBLAS; прискорення у 2x |
| FP8 E4M3 | ~6 | ядра tensor; порівнянно з FP16 |
FP8 не перевершив FP16 за пропускною здатністю у цій задачі, тому що пропускна здатність обчислень перестала бути вузьким місцем; пропускна здатність пам'яті та накладні витрати на запуск стали обмежувальними. ANDREA-120M v3 постачається з FP16 cuBLAS на 6 кроках/хв для комфортного запасу безпеки без втрати пропускної здатності.
Ризик NaN у FP8
FP8 E4M3 представляє числа від ~2^-9 до ~448. Активації або градієнти поза цим діапазоном переповнюються до NaN (не число) або знецінюються до нуля. Один NaN отруює всі подальші обчислення: множення матриць з NaN повертає все-NaN; градієнти все-NaN псують стан AdamW; AdamW з NaN m та v видає оновлення NaN; ваги стають NaN; весь тренувальний запуск гине.
Експерименти ANDREA з FP8 давали періодичні NaN-обриви, що вимагали масштабування втрат, запланованого перемикання точності або резервних шляхів. Динамічний діапазон FP16 (~10^-5 до ~10^5) достатньо широкий, щоб NaN-події залишалися рідкісними без складних трюків масштабування.
Вибір точності для нового запуску
Розміщення 120M на одній 4090
Множник 6-8x з вступного уроку
Пригадайте з grow_a_language_model_intro, що пам'ять для тренування становить приблизно 6-8x від сирої кількості ваг, враховуючи:
- Вага (1x)
- Перший момент Adam m (1x)
- Другий момент Adam v (1x)
- Буфер градієнтів (1x)
- Активації та тимчасові (~2-4x, залежить від batch та context)
ANDREA-120M при FP16 з batch_size=8, context=1024:
| Компонент | Розмір FP16 |
|---|---|
| Вага | 240 MB |
| m (перший момент) | 240 MB |
| v (другий момент) | 240 MB |
| Градієнти | 240 MB |
| Активації | ~2-4 GB (batch, ctx) |
| Загалом | ~3.5 GB |
RTX 4090 має 24 GB VRAM. ANDREA-120M використовує ~14% на FP16. Багато місця для більших розмірів партій або довших контекстних вікон. ANDREA-12M використовувала лише 1.4 GB загалом.
Де живе змішана точність
ANDREA НЕ зберігає все в одній точності. Тренування зі змішаною точністю зберігає:
- Основні ваги: FP32 (зберігає стабільність тренування)
- Прямий та зворотний обчислення: FP16 (використовує тензорні ядра)
- Стан оптимізатора AdamW: FP32 (m та v потребують точності для оновлень довгого хвоста)
- Буфер градієнтів: FP16 (сторона обчислень)
Остаточний бюджет пам'яті комбінує обидва. Фактичний відбиток ANDREA перебуває між чистим FP16 (720 MB стан оптимізатора) та чистим FP32 (1.44 GB стан оптимізатора), ближче до FP32, оскільки m та v залишаються в FP32.
Розрахунок бюджету для ANDREA-480M
Точність на практиці
Суміжні активності
Три споріднені активності пов'язані з точністю:
- Активність 1: Вступ / бюджет VRAM. Точність множить кожен член у арифметиці бюджету пам'яті. Емпіричне правило 6-8x множника є безрозмірним; байти-на-параметр надають йому розмірність.
- Активність 10: AdamW. Стан оптимізатора (m & v) зазвичай залишається у FP32, навіть коли прямі/зворотні обчислення виконуються у FP16. Причина: точність акумулятора довгого хвоста важливіша за швидкість виконання для оптимізатора.
- Активність 12: Обрізання градієнтів. Обрізання обмежує магнітуди градієнтів перед оновленням стану оптимізатора. З FP16 для прямих/зворотних обчислень та FP32 для оптимізатора, обрізання відбувається на межі, де змінюється точність, та де концентрується ризик переповнення.
Точність — це безкоштовний регулятор: змініть її, модель тренується швидше та використовує менше пам'яті. Вартість — чисельна обережність: обробка NaN, масштабування втрат, дисципліна змішаної точності. ANDREA-120M v3 демонструє вигоду: 120M параметрів, натренованих на споживчому обладнанні за 23 дні, бо FP16 скоротило все вдвічі.