🔥 FP8 mixed precision — где и как DeepSeek снизили точность вычислений?
В прошлом посте мы разобрали, как использование FP8 для матричных операций (GEMM) ускоряет обучение моделей. Теперь давайте посмотрим, какие методы и оптимизации FP8 применялись при разработке
DeepSeek-V3 — одной из лучших моделей на данный момент.
⚡️ Особенности FP8 GEMM от DeepSeek
Просто перевести все вычисления в FP8 недостаточно. В обучении встречаются выбросы (outliers) в активациях, весах и градиентах — редкие, но экстремальные значения, которые сильно искажают точность при квантовании. Если их не учитывать, модель может потерять качество.
Вот какие техники использовались в DeepSeek-V3 для FP8-обучения:
🔹 Точечное (fine-grained) квантование
Вместо квантования тензоров целиком они разбиваются на небольшие группы:
▪️ Активации — на «плитки» (tile-wise) 1×128
▪️ Веса — на блоки (block-wise) 128×128
Активации более подвержены выбросам, поэтому требуют более аккуратного квантования. Этот метод снижает влияние выбросов, так как масштабирование подгоняется под меньшие группы элементов.
🔹 FP32-аккумуляция
FP8 ограничен по точности из-за небольшого количества бит для мантиссы. Чтобы минимизировать ошибки округления, промежуточные результаты GEMM копируются в FP32-регистры CUDA Cores и только потом суммируются.
Использование FP32 для аккумуляции выходов тензорных ядер позволяет значительно снизить ошибки, которые возникают при суммировании большого числа результатов умножения маленьких матриц в FP8.
🔥 Другие важные оптимизации
🔹 Использование E4M3 вместо гибридных форматов
Ранее в FP8-обучении использовали гибридные форматы:
▪️ E4M3 для Fprop (прямой проход)
▪️ E5M2 для Dgrad / Wgrad (обратный проход)
В DeepSeek-V3 все операции перевели на E4M3, так как он имеет большую мантиссу → выше точность. Ограниченный динамический диапазон компенсируется tile/block-wise масштабированием.
🔹 Экономия памяти и ускорение коммуникации
▪️ Low-precision оптимизатор — моменты AdamW хранятся в BF16, а мастер-веса и градиенты — в FP32.
▪️ FP8-кеширование активаций — активации сохраняются в FP8 после Fprop, что значительно экономит память.
▪️ Сжатие коммуникации — в распределённом обучении передача данных между узлами — узкое место. В DeepSeek-V3 для части коммуникаций активации перед отправкой сжимаются в FP8, что по заявлениям авторов уменьшает накладные расходы на передачу данных. Однако часть коммуникаций все же сохраняется в BF16 в критических местах.
И главное: качество модели практически не страдает. Ошибка по сравнению с BF16-обучением остаётся в пределах 0.25%, что укладывается в статистическую погрешность.
Авторы не только подробно описали свою методику, но и выложили в open-source реализацию FP8 GEMM с fine-grained scaling —
DeepGEMM.Более маленькие типы данных вроде FP8 и bf16 — это не только про ускорение матричных вычислений, но и про эффективное управление памятью и оптимизацию коммуникаций. И как показали DeepSeek, правильная интеграция этих техник позволяет обучать очень большие модели без потери качества!🚀