English· Español· Deutsch· Nederlands· Français· 日本語· ქართული· 繁體中文· 简体中文· Português· Русский· العربية· हिन्दी· Italiano· 한국어· Polski· Svenska· Türkçe· Українська· Tiếng Việt· Bahasa Indonesia

un

гость
1 / ?
назад к урокам

Знак, Показатель степени, Мантисса

Формат с плавающей запятой IEEE 754

Каждое число с плавающей запятой хранит три поля:


- Бит знака (1 бит): положительное или отрицательное

- Экспонента (E бит): масштаб величины, целая степень двойки

- Мантисса (M бит): дробная точность, число между 1.0 и ~2.0


Общее количество бит = 1 + E + M. Значение примерно равно (-1)^sign (1 + mantissa) 2^(exponent - bias).


Для обучения важны два свойства:


Динамический диапазон = 2^(2^E) (примерно). Больше бит экспоненты означает представление более мелких и более огромных чисел без переполнения.


Точность = 2^M различных значений на каждую степень двойки. Больше бит мантиссы означает более детализированное представление между последовательными степенями двойки.


Три формата


ФорматВсего битЗнакЭкспМантДиапазон значенийТочность
FP32321823~10^-38 до ~10^38~7 цифр
FP16161510~10^-5 до ~10^5~3 цифры
FP8 E4M38143~2^-9 до ~448~2 цифры

FP8 E4M3 читается как «4 бита экспоненты, 3 бита мантиссы». Альтернативный FP8 E5M2 обменивает точность на диапазон; эксперименты ANDREA используют E4M3, потому что активации трансформера остаются в узких диапазонах величин, где дополнительная точность важнее дополнительного диапазона.

Байт на параметр

ANDREA-120M содержит примерно 120 000 000 параметров. Вычислите объем хранения только матриц весов в (a) FP32, (b) FP16, (c) FP8. Покажите вычисления в МБ. Затем вычислите (d) объем хранения с весами + первое момент Адама + второе момент Адама (3x количество весов) в FP16.

Почему меньшая точность работает быстрее

Пропускная способность памяти определяет скорость обучения

Современные 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 оставались редкими без сложных трюков масштабирования.


Сравнение точности: FP32 vs FP16 vs FP8

Выбор точности для нового запуска

Вы запускаете новый тренировочный процесс в стиле ANDREA на RTX 4090. У вас два конфликтующих приоритета: (1) максимизировать шаги/мин, (2) избежать отладки сбоев NaN посреди тренировки. ANDREA-120M v3 выбрала FP16 cuBLAS вместо FP8 E4M3, несмотря на то, что оба работают с ~6 шагами/мин. Обоснуйте, почему FP16 победила в этом решении. В ответе сослаться на динамический диапазон И поддержку тензорных ядер.

Размещение 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

ANDREA-480M (планируемый третий член семейства) содержит ~480 миллионов параметров. Оцените (a) только веса FP16 в MB, (b) веса FP16 + m + v в MB (предположим, что m и v также FP16 для простоты), и (c) общий объем на время обучения с учетом правила большого пальца 6-8x. Поместится ли ANDREA-480M на одной RTX 4090 (24 GB)?

Точность на практике

Предположим, вы обнаружили во время обучения, что ANDREA-120M периодически выдает NaN-потери примерно каждые ~5000 шагов при FP16, и каждый NaN требует перезапуска с чекпоинта. Какое **ОДНО** изменение вы бы попробовали первым, чтобы уменьшить частоту NaN, не выходя из FP16? Обоснуйте одним предложением о механизме.

Смежные активности

Три сестринских раздела связаны с точностью:


- Активность 1: Введение / бюджет VRAM. Точность умножает каждый член в арифметике бюджета памяти. Правило больших пальцев о 6-8-кратном множителе безразмерно; байты-на-параметр придает ему размерность.

- Активность 10: AdamW. Состояние оптимизатора (m и v) обычно остаётся в FP32, даже когда прямой/обратный проход вычисляется в FP16. Причина: точность аккумулятора для длинного хвоста важнее скорости выполнения для оптимизатора.

- Активность 12: Обрезка градиентов. Обрезка ограничивает magnitudes градиентов перед обновлением состояния оптимизатора. С FP16 для прямого/обратного прохода и FP32 для оптимизатора обрезка происходит на границе смены точности, где концентрируется риск переполнения.


Точность — это бесплатный регулятор: измените её, модель обучается быстрее и использует меньше памяти. Цена — численная осторожность: обработка NaN, масштабирование лосса, дисциплина смешанной точности. ANDREA-120M v3 демонстрирует выгоду: 120M параметров обучены на потребительском оборудовании за 23 дня, потому что FP16 сократило всё вдвое.