Почему китайские модели такие эффективные
Как экспортные ограничения на GPU привели к инженерным решениям DeepSeek — DualPipe, FP8, MLA, MoE — и что на самом деле стоит за «5.6 млн долларов» на обучение V3.
Зачем это нужно
Заголовок раздела «Зачем это нужно»В декабре 2024 года DeepSeek сообщила, что обучение V3 — модели уровня GPT-4o — заняло около 2.8 млн GPU-часов, то есть примерно 5.6 млн долларов по цене аренды. Для сравнения: Meta на Llama 3.1 405B потратила 30.8 млн GPU-часов. Эту цифру обсуждали месяцами. Одни объявили, что «американские лаборатории сжигают деньги». Другие — что DeepSeek «что-то скрывает».
Правда интереснее обеих версий. Эффективность DeepSeek — это сумма известных инженерных приёмов, доведённых до предела под давлением одного жёсткого ограничения: доступ к лучшим GPU для Китая закрыт. В этом уроке вы разложите стоимость обучения на множители, увидите, на какой множитель действует каждый приём, и научитесь отличать реальную экономию от маркетинга. Это навык инженера: в модулях 5.2–5.4 вы реализуете эти приёмы сами.
Ограничение: какие ускорители доступны Китаю
Заголовок раздела «Ограничение: какие ускорители доступны Китаю»экспортный контрольэкспортный контрольEN export controlsОграничения США на поставку в Китай передовых GPU и оборудования для их производства (с октября 2022 г.). США против китайской AI-индустрии вводили и ужесточали поэтапно.
| Когда | Что произошло |
|---|---|
| 10.2022 | США запрещают поставлять в Китай A100 и H100, а также оборудование для производства передовых чипов |
| 2022–2023 | NVIDIA выпускает для Китая A800 и H800: вычисления те же, но межчиповая связь урезана |
| 10.2023 | Правила ужесточают: под запрет попадают и A800/H800 |
| 2024 | Для Китая выходит H20 — много памяти, но вычислительная мощность в разы ниже |
| 2025 | Поставки H20 то запрещают, то снова разрешают. По сообщениям СМИ, китайские регуляторы сами начинают отговаривать компании от их покупки |
| 15.01.2026 | Бюро промышленности и безопасности США (BIS) переводит лицензирование H200 и AMD MI325X для Китая в режим рассмотрения в индивидуальном порядке, с пошлиной 25 % и лимитами объёма |
DeepSeek-V3 обучали на кластере из 2048 GPU H800. Ключевой факт про H800: считает он так же быстро, как H100, а вот обмениваться данными с соседями может гораздо медленнее. По открытым данным, скорость NVLink у H800 — около 400 ГБ/с против 900 ГБ/с у H100. Это пропускная способность межсоединенияпропускная способность межсоединенияEN interconnect bandwidthСкорость обмена данными между GPU — NVLink внутри узла, InfiniBand между узлами. У H800 урезана по сравнению с H100., и для больших моделей она критична: при распределённом обучении GPU постоянно пересылают друг другу активации, градиенты и — в MoE — сами токены.
Из этого следует главная мысль урока. Если GPU мало и они плохо связаны, нужно (1) меньше считать, (2) считать в более дешёвом формате и (3) ни секунды не ждать данных. Именно это DeepSeek и сделала.
Формула стоимости: на что можно влиять
Заголовок раздела «Формула стоимости: на что можно влиять»Обучение трансформера на токенах требует примерно операций с плавающей точкой (FLOPs), где — число параметров, участвующих в обработке токена. Двойка — прямой проход (умножение + сложение), ещё четвёрка — обратный. Это правило подробно выводится в уроке о законах масштабирования. Делим на скорость железа и получаем время:
- — активные параметрыактивные параметрыEN activated (active) parametersСколько параметров MoE-модели реально участвует в обработке одного токена. «A22B» в названии Qwen3-235B-A22B — 22 млрд активных из 235 млрд. на токен;
- — число токенов обучения;
- — пиковая производительность GPU в FLOP/s (зависит от формата чисел);
- утилизация FLOPs моделиутилизация FLOPs модели (MFU)EN model FLOPs utilization (MFU)Доля пиковой производительности железа, которая уходит на полезные вычисления модели. Для больших распределённых обучений типичны 30–50 %. — доля пика, которая реально уходит на полезную работу. Остальное съедают ожидание данных, коммуникации и «пузыри» конвейера.
Проверим формулу на V3. Числитель: FLOPs. Пик H800 в BF16 — FLOP/s. Если MFU равна 35 %, получаем млн GPU-часов — почти ровно 2.664 млн из отчёта DeepSeek. Откуда взялись 35 %, вы посчитаете сами в практике.
Каждый приём DeepSeek бьёт по одному из множителей:
flowchart LR L1["Мало GPU"] --> M["MoE<br/>↓ N акт в 18 раз"] L1 --> F["FP8<br/>↑ P пик в 2 раза"] L2["Урезанный NVLink<br/>у H800"] --> D["DualPipe, свои all-to-all,<br/>маршрутизация ≤ 4 узлов<br/>↑ MFU"] L3["Дорогие перезапуски"] --> S["Стабильность<br/>0 откатов"] L4["Дорогой инференс"] --> I["MLA: KV-кэш −93 %<br/>MTP: ×1.8 токенов/с"]
Рычаг 1. MoE: считать только нужное
Заголовок раздела «Рычаг 1. MoE: считать только нужное»У DeepSeek-V3 671 млрд параметров, но на каждый токен работает только 37 млрд (5.5 %). В каждом MoE-слое есть 256 маршрутизируемых экспертов и 1 общий. Роутер выбирает для токена 8 экспертов из 256. Плотная модель на 671B потребовала бы в раз больше вычислений на токен.
Почему бы тогда не сделать плотную модель на 37B? Потому что «места для знаний» у MoE намного больше: все 671B параметров обучаются, просто каждый токен использует свою небольшую часть. Число способов выбрать 8 экспертов из 256 — , и разные токены используют разные комбинации. Плотной модели на 671B такая MoE обычно уступает, но плотную модель на 37B заметно обходит. Подробно о мелкозернистых и общих экспертах — в модуле 5.3.
У MoE есть цена: эксперты лежат на разных GPU и даже разных узлах, поэтому токены приходится пересылать к ним и обратно (коммуникация all-to-all). На H800 со слабой межузловой связью это главный враг. Отсюда рычаг 3.
Рычаг 2. FP8: вдвое больше операций в секунду
Заголовок раздела «Рычаг 2. FP8: вдвое больше операций в секунду»Тензорные ядра Hopper (H100/H800) выполняют матричные умножения в 8-битном формате FP8 вдвое быстрее, чем в BF16, а памяти FP8 занимает вдвое меньше. Но у FP8 E4M3 всего 4 бита экспоненты и 3 бита мантиссы, а максимальное значение — 448. В LLM встречаются выбросы (outliers): отдельные активации в тысячи раз больше остальных. Если масштабировать весь тензор под самый большой элемент, маленькие числа проваливаются в ноль.
По словам авторов, V3 — первая модель такого масштаба, на которой FP8-обучение проверено на практике. Решение — смешанная точностьсмешанная точностьEN mixed precision с мелкими масштабами:
- активации масштабируются тайлами 1×128, веса — блоками 128×128, у каждого блока свой множитель;
- частичные суммы матричного умножения каждые 128 элементов переносятся в FP32 — иначе накапливается ошибка;
- чувствительные части остаются в BF16/FP32: эмбеддинги, выходной слой, роутер MoE, нормализации, внимание.
Итог по данным отчёта: относительное отклонение loss от BF16-обучения — меньше 0.25 %. В практике ниже вы сами увидите, почему блочный масштаб спасает от выбросов. Форматы чисел и смешанная точность подробно разобраны в модуле 5.4.
Рычаг 3. DualPipe и коммуникации: не давать GPU простаивать
Заголовок раздела «Рычаг 3. DualPipe и коммуникации: не давать GPU простаивать»Эксперты V3 разнесены по узлам кластера (экспертный параллелизм), и из-за пересылок токенов между узлами отношение времени вычислений к времени коммуникаций оказалось около 1 : 1. Если делать их по очереди, половину времени GPU просто ждут. DeepSeek ответила на трёх уровнях:
- DualPipe — двунаправленный конвейерконвейерный параллелизмEN pipeline parallelism. Микробатчи подаются с обоих концов конвейера, а прямой и обратный проходы соседних микробатчей перекрываются так, что пересылка одного идёт, пока считается другой. «Пузырей» простоя меньше, чем в классическом 1F1B.
- Свои ядра all-to-all. Коммуникацию ведут всего ~20 из 132 потоковых мультипроцессоров (SM) GPU, а остальные считают. Для этого авторы спустились ниже CUDA, до PTX — низкоуровневого набора инструкций GPU NVIDIA, близкого к ассемблеру.
- Маршрутизация с ограничением по узлам. Каждый токен отправляется не более чем на 4 узла. Внутри узла данные идут по NVLink (~160 ГБ/с), между узлами — по InfiniBand (~50 ГБ/с), в 3.2 раза медленнее. Чем меньше межузловых пересылок, тем лучше. Не путайте 160 ГБ/с с цифрой 400 ГБ/с выше: паспортная скорость NVLink считает обе стороны связи вместе, а в отчёте V3 приведены практические скорости, на которые авторы опирались в расчётах.
Схема параллелизма V3: 16-кратный конвейерный, 64-кратный экспертный (на 8 узлах) и ZeRO-1ZeRO (оптимизатор без избыточности)EN ZeRO (Zero Redundancy Optimizer)Вместо того чтобы хранить на каждом GPU полную копию, состояние оптимизатора (ZeRO-1), градиенты (ZeRO-2) и веса (ZeRO-3) делят между GPU параллелизма по данным. по данным (параллелизм по данным, где состояние оптимизатора поделено между GPU, урок 5.4.3). Тензорного параллелизма нет вовсе — он требует самой интенсивной связи между GPU. Подробно о видах параллелизма — в модуле 5.4, а как DualPipe и FP8 описаны в самом техотчёте (формула «пузырей», точность накопления) — в уроке 6 этого трека.
Рычаг 4. Стабильность: не терять прогоны
Заголовок раздела «Рычаг 4. Стабильность: не терять прогоны»Всплеск loss на прогоне длиной в триллионы токенов часто означает откат к чекпоинту и потерянные дни. В формуле этого множителя нет: она считает идеальный прогон, а каждый откат добавляет GPU-часы сверху. Сутки работы 2048 GPU — это 49 152 GPU-часыGPU-часыEN GPU hoursЧисло ускорителей × часы работы. 2048 GPU за сутки — 49 152 GPU-часа., около 100 тысяч долларов. Авторы V3 пишут, что за всё обучение не было ни одного необратимого всплеска loss и ни одного отката. Moonshot пошла дальше: Kimi K2 обучили на 15.5T токенов без единого всплеска благодаря MuonClip (модуль 5.4).
Инференс: MLA и MTP
Заголовок раздела «Инференс: MLA и MTP»Обучение — разовая трата, инференс — постоянная. Здесь работают два приёма.
многоголовое латентное вниманиемногоголовое латентное внимание (MLA)EN multi-head latent attention (MLA)Предложено DeepSeek в DeepSeek-V2 (2024). (из DeepSeek-V2) сжимает ключи и значения всех голов в один латентный вектор. Вместо чисел на слой в кэше лежат 512 + 64 = 576. В V2 это сократило KV-кэшKV-кэшEN KV cache на 93.3 % и подняло максимальную пропускную способность генерации в 5.76 раза по сравнению с DeepSeek 67B. Реализуете MLA в модуле 5.2.
предсказание нескольких токеновпредсказание нескольких токенов (MTP)EN multi-token prediction (MTP) — модель учится предсказывать не только следующий токен, но и токен после него. На инференсе этот дополнительный прогноз служит черновиком для спекулятивного декодированияспекулятивное декодированиеEN speculative decoding (урок 5.4.2): второй токен принимается в 85–90 % случаев, и генерация ускоряется примерно в 1.8 раза.
Сколько на самом деле стоил DeepSeek-V3
Заголовок раздела «Сколько на самом деле стоил DeepSeek-V3»Таблица из техотчёта (по цене аренды H800 2 долл. за GPU-час):
| Этап | GPU-часы H800 | Долл. |
|---|---|---|
| Претрейн (14.8T токенов) | 2 664 000 | 5.328 млн |
| Расширение контекста до 128K | 119 000 | 0.238 млн |
| Пост-трейнинг | 5 000 | 0.01 млн |
| Итого | 2 788 000 | 5.576 млн |
Претрейн — 180 тыс. GPU-часов на триллион токенов, то есть 3.7 дня на кластере из 2048 GPU. Весь претрейн занял меньше двух месяцев.
Чего в этой сумме нет — авторы прямо пишут, что учтён только финальный прогон:
- предварительные исследования и абляционные экспериментыабляционный эксперимент, абляцияEN ablation studyУбрать или заменить один компонент и сравнить с полной моделью, чтобы измерить вклад этого компонента. над архитектурой, алгоритмами и данными;
- неудачные прогоны и модели-предшественники (V2, DeepSeekMoE, DeepSeekMath — всё это годы работы);
- сбор и очистка данных, зарплаты исследователей;
- покупка и содержание собственного кластера: 2 долл. за час — цена аренды, а не реальная стоимость владения;
- обучение R1 поверх V3.
Сторонние аналитики оценивали полные затраты компании на железо и исследования во много раз выше 5.6 млн. Это оценки, а не данные DeepSeek. Честное сравнение — финальный прогон с финальным прогоном: 2.79 млн GPU-часов у V3 против 30.84 млн у Llama 3.1 405B. Разница в 11 раз. Её почти целиком объясняет MoE: у Llama все 405B параметров активны на каждом токене, у V3 — только 37B.
Проверим по формуле. Llama 3.1 405B обучали на 15.6T токенов: FLOPs. Это в 11.5 раза больше, чем у V3, то есть почти во столько же раз, во сколько различаются GPU-часы. Значит, в пересчёте на одну GPU обе команды выжали примерно одинаковую скорость — около 340 TFLOP/s по правилу . Грубый вывод: FP8, DualPipe и свои ядра не сделали каждую H800 вдвое быстрее H100 у Meta. Они позволили MoE-модели с тяжёлыми пересылками работать на урезанных H800 так же эффективно, как плотная модель работает на полноценных H100.
Курс на отечественные чипы
Заголовок раздела «Курс на отечественные чипы»Экспортные ограничения не только заставили экономить: они запустили программу импортозамещения — по-китайски «гочань тидай», «замена отечественным». Главный игрок — Huawei с ускорителями Ascend и программным стеком CANN вместо CUDA. Есть и другие: Cambricon, Hygon, Kunlunxin (Baidu), T-Head (Alibaba), Moore Threads, MetaX, Biren.
Как это видно по моделям:
- DeepSeek-V3.1 (август 2025) использует формат масштабов FP8 UE8M0. DeepSeek пояснила, что он рассчитан на готовящиеся отечественные чипы нового поколения.
- GLM-5 (февраль 2026) адаптировали под 7 китайских чиповых платформ.
- DeepSeek-V4 (апрель 2026) получила поддержку инференса на Huawei Ascend в день релиза. В репозиториях DeepSeek появился DeepGEMM-Ascend.
Важная оговорка: на отечественных чипах сейчас в основном запускают модели. Данные о том, на каком железе обучались фронтирные модели 2026 года, противоречивы. Самое сложное в замене NVIDIA — не сам кристалл, а программная экосистема: компиляторы, библиотеки ядер, отлаженные фреймворки. Поэтому для китайской индустрии отечественный (китайский) чипотечественный (китайский) чипEN domestic chipСвязано с курсом на импортозамещение («гочань тидай», буквально «замена отечественным»); главный пример — ускорители Huawei Ascend. — вопрос не одного поколения железа.
Практика: расчёты на салфетке
Заголовок раздела «Практика: расчёты на салфетке»Повторите расчёты урока сами. Первый скрипт не требует библиотек:
# Прикидка «на салфетке»: сколько стоит обучение и сколько памяти ест KV-кэш.# Числа DeepSeek-V3 — из техотчёта (arXiv:2412.19437); пиковая производительность H800 — как у H100 SXM.
N_ACTIVE = 37e9 # активных параметров на токенN_TOTAL = 671e9 # всего параметровTOKENS = 14.8e12 # токенов претрейнаGPU_HOURS = 2.664e6 # GPU-часов H800 на претрейн (без расширения контекста и пост-трейнинга)PEAK_BF16 = 989e12 # FLOP/s, плотная BF16 на H100/H800 (FP8 — вдвое больше)
flops = 6 * N_ACTIVE * TOKENS # правило 6·N·D (прямой + обратный проход)achieved = flops / (GPU_HOURS * 3600) # FLOP/s на одну GPU в среднемprint(f"Вычисления претрейна: {flops:.2e} FLOP")print(f"Плотная модель 671B потребовала бы в {N_TOTAL / N_ACTIVE:.1f} раза больше")print(f"Реальная скорость: {achieved / 1e12:.0f} TFLOP/s на GPU")print(f"MFU относительно BF16: {achieved / PEAK_BF16:.0%}")
def kv_bytes_per_token(layers, elems_per_layer, bytes_per_elem=2): """Сколько байт KV-кэша нужно на один токен контекста.""" return layers * elems_per_layer * bytes_per_elem
LAYERS, HEADS, D_HEAD = 61, 128, 128variants = { "MHA (128 голов)": 2 * HEADS * D_HEAD, # K и V для каждой головы "GQA (8 групп)": 2 * 8 * D_HEAD, "MLA (512 + 64)": 512 + 64, # латентный вектор + развязанный RoPE-ключ}ctx = 128 * 1024for name, elems in variants.items(): b = kv_bytes_per_token(LAYERS, elems) print(f"{name:16s} {b / 1024:8.1f} КиБ/токен {b * ctx / 2**30:7.1f} ГиБ на 128K токенов")Вычисления претрейна: 3.29e+24 FLOPПлотная модель 671B потребовала бы в 18.1 раза большеРеальная скорость: 343 TFLOP/s на GPUMFU относительно BF16: 35%MHA (128 голов) 3904.0 КиБ/токен 488.0 ГиБ на 128K токеновGQA (8 групп) 244.0 КиБ/токен 30.5 ГиБ на 128K токеновMLA (512 + 64) 68.6 КиБ/токен 8.6 ГиБ на 128K токеновДве оговорки. MFU здесь — грубая оценка: правило не учитывает FLOPs внимания, а часть умножений шла в FP8 с вдвое большим пиком. Варианты MHA и GQA — гипотетические: так выглядел бы кэш V3, если бы вместо MLA стояло обычное внимание. Но порядок виден ясно: кэш одного запроса на 128K токенов с MHA занял бы 488 ГиБ — больше, чем память шести GPU по 80 ГБ, и это ещё без весов модели. С MLA тот же запрос умещается в 8.6 ГиБ.
Второй скрипт показывает, зачем FP8 нужны блочные масштабы. Нужен PyTorch 2.1+ (работает на CPU):
import torch
E4M3_MAX = 448.0 # максимальное число в формате FP8 E4M3
def fp8_roundtrip(t, scale): """Делим на масштаб, округляем в FP8 E4M3 и возвращаем обратно во float32.""" return (t / scale).to(torch.float8_e4m3fn).to(torch.float32) * scale
def rel_error(a, b): return ((a - b).norm() / b.norm()).item()
torch.manual_seed(0)base = torch.randn(4, 1024) # «обычные» активацииmask = torch.ones_like(base, dtype=torch.bool)mask[0, :128] = False # блок, в котором будет выброс, не учитываем
print("выброс общий масштаб блоки по 128")for outlier in [10, 1e3, 1e4, 1e5, 1e6]: x = base.clone() x[0, 0] = outlier # один гигантский выброс, как бывает в LLM per_tensor = fp8_roundtrip(x, x.abs().max() / E4M3_MAX) blocks = x.view(-1, 128) # DeepSeek-V3: тайлы 1×128 для активаций per_block = fp8_roundtrip(blocks, blocks.abs().amax(1, keepdim=True) / E4M3_MAX).view_as(x) print(f"{outlier:7.0e} {rel_error(per_tensor[mask], x[mask]):13.3f} {rel_error(per_block[mask], x[mask]):12.3f}")выброс общий масштаб блоки по 128 1e+01 0.027 0.026 1e+03 0.025 0.026 1e+04 0.027 0.026 1e+05 0.126 0.026 1e+06 0.949 0.026Экспонента FP8 спасает от умеренных выбросов: при выбросе в 1000 раз ошибка не растёт. Но при выбросе в раз ошибка общего масштаба доходит до 95 %: обычные числа после деления на огромный масштаб меньше самого маленького числа FP8 и округляются в ноль. Поблочный масштаб держит ошибку на уровне 2.6 % при любом выбросе, потому что выброс портит только свой блок из 128 чисел.
Задание. Измените blocks = x.view(-1, 128) на блоки по 32 и по 1024. Как меняется ошибка? Почему блок не
делают совсем маленьким? Подсказка: каждый масштаб — это лишнее число в памяти и лишнее умножение.
Проверь себя
Заголовок раздела «Проверь себя»- Экспортные ограничения оставили Китаю урезанные по связи H800, а затем и их запретили. Поэтому в DeepSeek-V3 оптимизировано всё, что связано с коммуникациями и объёмом вычислений.
- Стоимость обучения ≈ . MoE уменьшает в 18 раз, FP8 удваивает , DualPipe и свои ядра поднимают MFU, стабильность избавляет от перезапусков.
- MLA (KV-кэш −93 %) и MoE сделали дешёвым инференс DeepSeek-V2 — отсюда ценовая война 2024 года. В V3 к ним добавился MTP: генерация быстрее примерно в 1.8 раза.
- 5.6 млн долл. — цена финального прогона по аренде, а не стоимость модели. Честное сравнение — GPU-часы с GPU-часами: у V3 их в 11 раз меньше, чем у Llama 3.1 405B, и почти весь выигрыш дало MoE.
- Второй ответ на «ця боцзы» — импортозамещение: Ascend и другие китайские чипы, пока в основном для инференса.
Дальше: почему китайские лаборатории отдают веса бесплатно — стратегия открытых весов.