Перейти к содержимому
ПереводыDeepSeek

Техотчёт DeepSeek LLM (2024): свои законы масштабирования

Конспект первого техотчёта DeepSeek: как команда перемерила законы масштабирования, ввела меру размера модели в FLOPs на токен, показала зависимость оптимального распределения бюджета от качества данных и обучила модели 7B и 67B на 2 трлн токенов.

  • DeepSeek LLM — первая модель компании: плотный (не MoE) трансформер в двух размерах, 7B и 67B, обученный на 2 трлн токенов английского и китайского текста. Архитектура почти как у LLaMA 2, и это сделано нарочно: интересное в отчёте — не архитектура, а методика.
  • Главный вклад — свои законы масштабирования. Команда показала, почему у OpenAI (2020) и Chinchilla (2022) получились разные ответы на вопрос «куда вкладывать бюджет: в размер модели или в данные», и предложила более честную меру размера модели — FLOPs на токен без эмбеддингов MM вместо числа параметров NN.
  • Добавлены законы масштабирования для гиперпараметров: формулы, по которым из бюджета вычислений сразу считаются почти оптимальные learning rate и batch size. Это избавляет от перебора на каждом масштабе.
  • Неожиданный вывод: оптимальное распределение бюджета зависит от качества данных. Чем чище данные, тем больше добавленного бюджета стоит отдавать размеру модели, а не числу токенов.
  • Вместо косинусного расписания learning rate используется ступенчатое (multi-step): качество то же, зато первую ступень можно переиспользовать в следующих экспериментах.
  • Пост-трейнинг — обучение с учителем на инструкцияхобучение с учителем на инструкциях (SFT)EN supervised fine-tuning (SFT) на ~1,5 млн примеров и затем прямая оптимизация предпочтенийпрямая оптимизация предпочтений (DPO)EN direct preference optimization (DPO)Rafailov и др., 2023. Обучение на парах предпочтений без reward model и без RL-цикла.. Отдельно измеряли долю «зацикливания» ответов и заметили, что она растёт вместе с долей математики в SFT-данных.
Раздел отчётаО чёмКуда в курсе
§2.1 Dataдедупликация 91 дампа Common Crawl, фильтрация, ремикс5.1.2 «Данные для претрейна»
§2.2–2.3 Architecture, HyperparametersPre-Norm, RMSNorm, SwiGLU, RoPE, GQA только в 67B; ступенчатый LR4.6.3 «Цикл обучения»
§2.4 InfrastructuresHAI-LLM: DP + TP + SP + 1F1B, ZeRO-1, bf16 с накоплением в fp325.4.3 «Распределённое обучение»
§3 Scaling Lawsглавное в отчёте: MM, формулы для LR и batch size, зависимость от данных5.1.1 «Законы масштабирования»
§4 AlignmentSFT (4 эпохи для 7B, 2 для 67B), DPO, борьба с зацикливанием6.1.2 «SFT», 6.3.3 «DPO»
§5 Evaluationбенчмарки, оценка по перплексии против генерации7.3.1 «Бенчмарки»

Новичку хватит §3 и §4: §5 — длинные таблицы бенчмарков, которые сегодня устарели, а §2 полезен как пример того, что входит в «обычную» часть техотчёта.

Common Crawl выкладывается «дампами» — снимками веба за период. Обычно каждый дамп чистят от дубликатов отдельно. DeepSeek объединяет дампы и ищет дубликаты сразу по всем. Эффект сильный:

Сколько дампов чистим вместе1261216224191
Доля удалённых документов, %22,246,755,769,975,776,381,689,8

Чистка 91 дампа вместе убирает примерно вчетверо больше документов, чем чистка каждого по отдельности. Логика понятна: популярная страница попадает в десятки снимков, и внутри одного дампа она выглядит уникальной.

Токенизатор — байтовый BPEбайтовый BPE (byte-level BPE)EN byte-level BPE (BBPE)BPE, у которого базовый словарь — 256 байтов UTF-8. Любой текст кодируется без <unk>. Используется в GPT-2, GPT-4o, Llama 3, Qwen, DeepSeek. на библиотеке tokenizers, с предварительной разбивкой (чтобы перевод строки, пунктуация и иероглифы CJK не склеивались в один токен) и разбиением чисел на отдельные цифры. Обычных токенов 100 000, плюс 15 служебных; размер словаря в конфигурации обучения — 102 400 (с запасом).

7B67B
Слоёв3095
dmodeld_\text{model}40968192
Голов внимания3264
Голов ключей и значений32 (MHA)8 (внимание с группами запросоввнимание с группами запросов (GQA)EN grouped-query attention (GQA)Головы запросов делятся на G групп, у каждой группы своя пара K/V. G = H — это MHA, G = 1 — MQA. Стандарт Llama 3 и Qwen (Ainslie и др., 2023).)
Длина контекста40964096
Батч (последовательностей)23044608
Learning rate4,2e-43,2e-4
Токенов обучения2,0 трлн2,0 трлн

Микроуровень повторяет LLaMA: Pre-NormPre-Norm (нормализация на входе подслоя)EN pre-normalization (Pre-LN)x + F(Norm(x)): нормализуется только вход ветки, остаточный путь чистый. Стандарт с GPT-2 (2019); требует финальной нормализации перед LM-головой. с RMSNormRMSNorm (нормализация по среднеквадратичному)EN root mean square layer normalization (RMSNorm)x / sqrt(mean(x²) + ε) · g — LayerNorm без вычитания среднего и без сдвига β (Zhang, Sennrich, 2019). Стандарт Llama, Qwen, DeepSeek, MiniMind., SwiGLUSwiGLUEN SwiGLU (Swish-gated linear unit)FFN современных LLM: down(SiLU(gate(x)) · up(x)), три матрицы без смещений; скрытый размер обычно ≈ 8d/3 и больше (Shazeer, 2020). в FFN с промежуточной размерностью 83dmodel\frac{8}{3} d_\text{model}, ротационные позиционные эмбеддингиротационные позиционные эмбеддинги (RoPE)EN rotary position embedding (RoPE)RoPE предложен в Китае (Су Цзяньлинь и соавторы, компания Zhuiyi). Сейчас используется почти во всех LLM. для позиций. Отличие на макроуровне: модель на 67B растили в глубину (95 слоёв), а не в ширину FFN, как делают обычно. Авторы объясняют это двумя причинами: так получается лучше по качеству и удобнее резать модель на стадии конвейера.

Инфраструктура — собственный фреймворк HAI-LLM: параллелизм по данным, тензорный, по последовательности и конвейерный 1F1B, ZeRO-1 для состояний оптимизатора, FlashAttention, обучение в bf16 с накоплением градиентов в fp32, слияние операций (LayerNorm, GEMM, шаг Adam). Чекпойнты сохраняются асинхронно каждые 5 минут — потерять можно не больше пяти минут обучения.

Вместо привычного косинуса DeepSeek использует ступеньки: 2000 шагов разогрева до максимума, затем, после 80% токенов, LR падает до 31,6% от максимума, а после 90% — до 10%. Итоговое качество такое же, как у косинуса (это показано на модели 1,6B, обученной на 100 млрд токенов).

Зачем тогда менять? Косинус «привязан» к общей длине обучения: решили учить вдвое дольше — надо переобучать с начала. У ступенек первая, самая длинная стадия не зависит от того, где вы остановитесь, и её можно переиспользовать в следующем эксперименте. Для исследования законов масштабирования, где десятки прогонов с разным бюджетом, это экономит очень много вычислений.

Почему именно 31,6%? Это 10−1/2≈0,31610^{-1/2} \approx 0{,}316 — то есть две ступени по полпорядка каждая.

Законы масштабирования, часть 1: гиперпараметры

Заголовок раздела «Законы масштабирования, часть 1: гиперпараметры»

Сначала авторы ответили на вопрос, который обычно замалчивают: а были ли модели в их экспериментах вообще хорошо обучены? Если learning rate и batch size подобраны плохо, кривая масштабирования описывает не закон природы, а вашу небрежность.

Они прогнали сетку по batch size и learning rate при бюджетах от 101710^{17} до 2⋅10192\cdot10^{19} FLOPs, объявили «почти оптимальными» все точки, где ошибка на валидации не хуже минимума больше чем на 0,25%, и приблизили их степенными функциями бюджета CC:

ηopt=0,3118⋅C−0,1250,Bopt=0,2920⋅C 0,3271.\eta_\text{opt} = 0{,}3118 \cdot C^{-0{,}1250}, \qquad B_\text{opt} = 0{,}2920 \cdot C^{\,0{,}3271}.

Словами: с ростом бюджета оптимальный learning rate медленно падает, а оптимальный batch size растёт (примерно как корень третьей степени из бюджета). Обе зависимости — прямые на графике в логарифмических осях.

Проверим на числах. При C=1020C = 10^{20} FLOPs:

  • ηopt=0,3118⋅(1020)−0,125=0,3118⋅10−2,5≈9,9⋅10−4\eta_\text{opt} = 0{,}3118 \cdot (10^{20})^{-0{,}125} = 0{,}3118 \cdot 10^{-2{,}5} \approx 9{,}9\cdot10^{-4};
  • Bopt=0,2920⋅(1020)0,3271=0,2920⋅106,542≈1,0⋅106B_\text{opt} = 0{,}2920 \cdot (10^{20})^{0{,}3271} = 0{,}2920 \cdot 10^{6{,}542} \approx 1{,}0\cdot10^{6} токенов.

При бюджете в тысячу раз больше (102310^{23}) learning rate уменьшится в 103⋅0,125≈2,410^{3 \cdot 0{,}125} \approx 2{,}4 раза, а батч вырастет в 103⋅0,327≈9,810^{3\cdot0{,}327} \approx 9{,}8 раза. Важная оговорка авторов: в формулы входит только бюджет CC; влияние того, как бюджет разделён между моделью и данными, здесь не учтено, хотя небольшая разница заметна.

Законы масштабирования, часть 2: мера размера модели

Заголовок раздела «Законы масштабирования, часть 2: мера размера модели»

Обычная формула бюджета — C=6NDC = 6ND, где NN — число параметров, DD — число токенов. Шестёрка здесь — грубая оценка: по 2 FLOPs на умножение-сложение в прямом проходе и по 4 в обратном. Проблема в том, что эта формула не учитывает внимание (оно зависит от длины последовательности, а не только от числа параметров) и по-разному врёт для моделей разного размера. Если считать только параметры без эмбеддингов (N1N_1) или все параметры (N2N_2), ошибка на маленьких моделях доходит до 50%.

DeepSeek вводит меру MM — число FLOPs на токен без эмбеддингов:

6N1=72 nlayerdmodel2,6N2=72 nlayerdmodel2+6 nvocabdmodel,6N_1 = 72\, n_\text{layer} d_\text{model}^2, \qquad 6N_2 = 72\, n_\text{layer} d_\text{model}^2 + 6\, n_\text{vocab} d_\text{model}, M=72 nlayerdmodel2+12 nlayerdmodellseq.M = 72\, n_\text{layer} d_\text{model}^2 + 12\, n_\text{layer} d_\text{model} l_\text{seq}.

Первое слагаемое MM — те же линейные слои, второе — внимание (оно растёт с длиной последовательности lseql_\text{seq}). Вычисления словаря в MM не входят: они почти не добавляют модели «мозгов». С этой мерой бюджет записывается просто: C=MDC = MD.

Посчитаем для модели с nlayer=24n_\text{layer} = 24, dmodel=1024d_\text{model} = 1024, lseq=4096l_\text{seq} = 4096:

  • 72⋅24⋅10242≈1,81⋅10972 \cdot 24 \cdot 1024^2 \approx 1{,}81\cdot10^{9} FLOPs на токен — линейные слои;
  • 12⋅24⋅1024⋅4096≈1,21⋅10912 \cdot 24 \cdot 1024 \cdot 4096 \approx 1{,}21\cdot10^{9} — внимание;
  • вместе M≈3,0⋅109M \approx 3{,}0\cdot10^{9}.

То есть на такой конфигурации внимание даёт около 40% вычислений на токен — ровно та часть, которую формула 6N6N не видит вовсе.

Дальше — метод Chinchilla (IsoFLOP): для каждого из 8 бюджетов от 101710^{17} до 3⋅10203\cdot10^{20} обучаются примерно 10 моделей с разным разделением «размер против данных», и по минимуму кривой находится оптимум. Результат:

Mopt=0,1715⋅C 0,5243,Dopt=5,8316⋅C 0,4757.M_\text{opt} = 0{,}1715 \cdot C^{\,0{,}5243}, \qquad D_\text{opt} = 5{,}8316 \cdot C^{\,0{,}4757}.

Сумма показателей степени равна 1 — так и должно быть, ведь M⋅D=CM \cdot D = C. Оптимум почти посередине: при росте бюджета в 100 раз размер модели растёт примерно в 1000,52≈11100^{0{,}52} \approx 11 раз, а число токенов — в 1000,48≈9100^{0{,}48} \approx 9 раз.

Главная практическая проверка: законы, подогнанные на маленьких моделях, правильно предсказали ошибку моделей 7B и 67B — то есть работали при бюджете в 1000 раз больше того, на котором их подбирали.

Законы масштабирования, часть 3: качество данных меняет ответ

Заголовок раздела «Законы масштабирования, часть 3: качество данных меняет ответ»

Самый интересный результат отчёта. Те же эксперименты прогнали на трёх наборах данных: ранние внутренние данные, текущие внутренние данные (чище) и OpenWebText2 (ещё чище, потому что маленький и обработан тщательнее).

ДанныеПоказатель aa (Mopt∝CaM_\text{opt} \propto C^a)Показатель bb (Dopt∝CbD_\text{opt} \propto C^b)
OpenAI (OpenWebText2), 20200,730,27
Chinchilla (MassiveText), 20220,490,51
DeepSeek, ранние данные0,4500,550
DeepSeek, текущие данные0,5240,476
DeepSeek, OpenWebText20,5780,422

Закономерность: чем чище данные, тем больше aa — тем больше добавленного бюджета стоит вкладывать в размер модели, а не в число токенов. Авторы объясняют это так: качественный текст логичнее и предсказывать его после достаточного обучения проще, поэтому выгоднее увеличивать ёмкость модели.

Отсюда же — объяснение старого спора. OpenAI (2020) получила a=0,73a = 0{,}73, Chinchilla (2022) — a=0,49a = 0{,}49; это может быть не ошибкой кого-то из них, а разницей в данных и в учёте вычислений. И ещё один практический вывод, который авторы формулируют осторожно: показатель aa можно использовать как косвенную оценку качества датасета.

Собрано около 1,5 млн примеров инструкций на английском и китайском: 1,2 млн «полезных» (31,2% — общие задачи, 46,6% — математика, 22,2% — код) и 300 тыс. по безопасности.

  • SFT. Модель 7B дообучали 4 эпохи, 67B — только 2: большая модель быстрее переобучалась. Learning rate соответственно 1e-5 и 5e-6.
  • Зацикливание. Кроме метрик на бенчмарках, измеряли долю ответов, которые не заканчиваются и уходят в повтор одного и того же куска текста (на 3868 промптах). Доля росла вместе с количеством математики в данных: слабая модель хватается за повторяющиеся шаблоны рассуждения. Помогло двухстадийное дообучение и DPO.
  • DPO. Одна эпоха, learning rate 5e-6, батч 512, разогрев и косинусное расписание. Пары предпочтений строили по полезности и безопасности, ответы-кандидаты генерировали сами модели DeepSeek Chat. Эффект: открытая генерация стала заметно лучше, оценки на стандартных бенчмарках почти не изменились.

Базовые модели сравнивали с LLaMA 2 (тоже 2 трлн токенов, но почти только английский). Несколько чисел из главной таблицы отчёта (точность, %):

БенчмаркLLaMA 2 7BDeepSeek 7BLLaMA 2 70BDeepSeek 67B
MMLU (5-shot)45,848,269,071,3
GSM8K (8-shot)15,517,458,463,4
MATH (4-shot)2,56,013,518,7
HumanEval (0-shot)14,626,228,742,7
C-Eval (китайский, 5-shot)33,945,051,466,1
CMath (китайская математика)25,134,553,963,0

На английских задачах понимания текста модели примерно равны, а на коде, математике и китайском DeepSeek заметно впереди. Разрыв на китайских бенчмарках ожидаем: у LLaMA 2 китайского в данных мало.

Полезная методическая деталь: задачи с вариантами ответа оценивают по перплексии (выбирается вариант с наименьшей перплексией), задачи со свободным ответом — генерацией с жадным декодированием, а Pile-test — через бит на байтбит на байт (BPB)EN bits per byte (BPB)Loss, пересчитанный на байт исходного текста; в отличие от perplexity, его можно сравнивать между моделями с разными токенизаторами.. Это разные измерения, и сравнивать числа между разными способами оценки нельзя (урок 7.3.1).

  1. Посчитайте MM для своей модели. Возьмите конфигурацию из урока 4.6.2 и вычислите по формуле выше долю вычислений, которая приходится на внимание, при длине контекста 1024 и 8192. Убедитесь, что при длинном контексте формула 6N6N врёт сильнее.
  2. Примените формулы гиперпараметров. Для бюджета вашего учебного прогона (прикиньте C=MDC = M D) посчитайте ηopt\eta_\text{opt} и BoptB_\text{opt}. Сравните с тем, что вы ставили руками.
  3. Постройте ступенчатый LR. Реализуйте расписание 80% / 10% / 10% с коэффициентами 1 → 0,316 → 0,1 и сравните кривую обучения с косинусом на маленькой модели из ступени 4. Качество должно получиться близким.
  4. Проверьте предсказание. По формулам MoptM_\text{opt}, DoptD_\text{opt} посчитайте, какой размер модели «оптимален» для бюджета одной вашей RTX 4080 за сутки, и сравните с тем, что реально обучают на такой машине.
ENRU
scaling lawsзаконы масштабирования
compute budget CCбюджет вычислений
non-embedding FLOPs/token MMFLOPs на токен без эмбеддингов
IsoFLOP profileпрофиль при равном бюджете (IsoFLOP)
generalization errorошибка обобщения (на валидации)
multi-step learning rate schedulerступенчатое расписание learning rate
deduplication rateдоля удалённых дубликатов
repetition ratioдоля зацикленных ответов
supervised fine-tuning (SFT)дообучение с учителем
direct preference optimization (DPO)прямая оптимизация предпочтений
perplexity-based / generation-based evaluationоценка по перплексии / по генерации