Знак, Показатель степени, Мантисса
Формат с плавающей запятой IEEE 754
Каждое число с плавающей запятой хранит три поля:
- Бит знака (1 бит): положительное или отрицательное
- Экспонента (E бит): масштаб величины, целая степень двойки
- Мантисса (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 ГБ/с и 165 TFLOPS вычислений FP16. Типичный слой читает веса из VRAM, умножает активации, записывает результаты обратно. Пропускная способность, а не вычисления, определяет пропускную способность.
Удвоение точности вдвое уменьшает байты на параметр, поэтому чтение тех же весов использует вдвое меньше пропускной способности памяти. Пропускная способность примерно удваивается.
Tensor Cores: Аппаратно-ускоренное умножение матриц
RTX 4090 поставляется с выделенными тензорными ядрами, которые вычисляют умножение матриц в FP16 или FP8 напрямую. Одна операция тензорного ядра умножает небольшой блок (например, 16x16) за один цикл, что значительно быстрее скалярного умножения FP32.
Эмпирические данные из ANDREA-120M:
| Точность | Шагов/мин | Примечания |
|---|---|---|
| FP32 | ~3 | базовый уровень; без ускорения тензорными ядрами |
| 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, зависит от размера батча и контекста)
ANDREA-120M в FP16 с batch_size=8, context=1024:
| Компонент | Размер FP16 |
|---|---|
| Веса | 240 МБ |
| m (первый момент) | 240 MB |
| v (второй момент) | 240 MB |
| Градиенты | 240 MB |
| Активации | ~2-4 ГБ (batch, ctx) |
| Итого | ~3.5 ГБ |
RTX 4090 имеет 24 ГБ VRAM. ANDREA-120M использует ~14% при FP16. Много места для больших размеров батча или более длинных окон контекста. ANDREA-12M использовала только 1.4 ГБ всего.
Где живёт смешенная точность
ANDREA НЕ хранит всё в одной точности. Смешенное обучение с точностью хранит:
- Мастер-веса: FP32 (сохраняет стабильность обучения)
- Прямой и обратный расчёт: FP16 (использует тензорные ядра)
- Состояние оптимизатора AdamW: FP32 (m и v требуют точности для обновлений длинного хвоста)
- Буфер градиентов: FP16 (сторона вычислений)
Итоговый бюджет памяти сочетает оба подхода. Фактический объем ANDREA находится между чистым FP16 (720 MB optimizer state) и чистым FP32 (1.44 GB optimizer state), ближе к FP32, поскольку m и v остаются в FP32.
Размер бюджета для ANDREA-480M
Точность на практике
Смежные активности
Три сестринских раздела связаны с точностью:
- Активность 1: Введение / бюджет VRAM. Точность умножает каждый член в арифметике бюджета памяти. Правило больших пальцев о 6-8-кратном множителе безразмерно; байты-на-параметр придает ему размерность.
- Активность 10: AdamW. Состояние оптимизатора (m и v) обычно остаётся в FP32, даже когда прямой/обратный проход вычисляется в FP16. Причина: точность аккумулятора для длинного хвоста важнее скорости выполнения для оптимизатора.
- Активность 12: Обрезка градиентов. Обрезка ограничивает magnitudes градиентов перед обновлением состояния оптимизатора. С FP16 для прямого/обратного прохода и FP32 для оптимизатора обрезка происходит на границе смены точности, где концентрируется риск переполнения.
Точность — это бесплатный регулятор: измените её, модель обучается быстрее и использует меньше памяти. Цена — численная осторожность: обработка NaN, масштабирование лосса, дисциплина смешанной точности. ANDREA-120M v3 демонстрирует выгоду: 120M параметров обучены на потребительском оборудовании за 23 дня, потому что FP16 сократило всё вдвое.