Генеративный AI

Обучение LLM: pre-training

Предварительные знания

  • Decoder-only архитектура GPT и задача next-token prediction
  • Градиентный спуск и понятие training loss
  • Архитектура GPT
  • Deep Learning: основы

GPT-4 видел 13 триллионов токенов. Энциклопедия Британника - 44 миллиона слов. Разрыв - 300 000 раз. 2020 год: OpenAI, тысяча A100, batch size 3.2 миллиона токенов, весь мировой веб в одном прогоне. Но 90% этого веба было выброшено до начала обучения - иначе модель была бы токсичной и галлюцинирующей. Pre-training - это не просто 'скармливаем данные в модель'. Это многомесячная инфраструктурная операция: pipeline очистки данных, балансировка числовой стабильности, распределённые вычисления на тысячах GPU и точная хореография порядка подачи данных.

  • GPT-4 pre-training: оценочно 25 000 A100 за 90 дней - стоимость около USD 100M только на compute
  • LLaMA-3 обучен на 15 трлн токенов - в 10 раз больше LLaMA-1 при сопоставимом числе параметров
  • Mistral 7B достиг того же perplexity что GPT-3-175B, в 25 раз меньше параметров - благодаря правильному data curation и Chinchilla-оптимальному обучению
  • Falcon-180B: 3.5 трлн токенов из RefinedWeb - 80% данных из Common Crawl, прошедшего через 5-ступенчатый quality pipeline

От законов масштабирования к compute-optimal обучению

Рецепт pre-training сложился в 2018 году, когда Alec Radford с коллегами из OpenAI показали: generative pre-training на неразмеченном тексте с последующим fine-tuning обгоняет модели под конкретную задачу. В 2020 году Jared Kaplan и соавторы из OpenAI опубликовали 'Scaling Laws for Neural Language Models', показав, что loss падает предсказуемо по степенному закону от размера модели, данных и вычислений. Эта работа подтолкнула область к всё более крупным моделям. В 2022 году Jordan Hoffmann и команда DeepMind скорректировали рецепт через Chinchilla: при фиксированном бюджете вычислений большинство крупных моделей были сильно недообучены. Модель на 70B, обученная на 1.4 триллиона токенов, обогнала 280B Gopher. Этот вывод изменил то, как каждая лаборатория тратит бюджет обучения: масштабировать данные вместе с параметрами, а не только параметры.

Data Curation: интернет как сырьё

**Качество данных решает больше, чем количество параметров.** Common Crawl - это 3 петабайта html-мусора, рекламных текстов, спама и дублей. Quality filtering убирает 90% - не 10%, именно 90%. То, что остаётся, определяет, будет ли модель галлюцинировать или рассуждать. Pipeline состоит из нескольких этапов: language detection (fastText), URL-level filtering (blacklists), perplexity-based filtering через KenLM (выбрасываем текст, который слишком хаотичен или слишком прост), и дедупликация через MinHash LSH - убираем near-duplicates, которые создают memorization вместо generalization. Domain mixing - финальный этап: code:text:papers:books пропорция задаётся вручную и сильно влияет на downstream capabilities.

**RedPajama и SlimPajama** - открытые воспроизведения данных LLaMA. SlimPajama убрал 49.6% дублей из RedPajama через дедупликацию на уровне документов - и модели, обученные на нём, показали лучший perplexity при том же объёме. **Bloom filter** используется для exact deduplication на уровне n-gram'ов: O(1) lookup при размере фильтра в несколько ГБ. MinHash LSH - для near-duplicate detection: два документа считаются дублями если Jaccard similarity > 0.8 по shingling.

**Почему perplexity-фильтр работает:** KenLM, обученный на Wikipedia, даёт низкий perplexity связным текстам и высокий - случайным символам, SEO-спаму, boilerplate. Порог 400 (Gopher) или 300 (C4) отсекает большую часть мусора, сохраняя диверсификацию языка. Слишком низкий порог - и останется только Wikipedia-стиль; слишком высокий - и галлюцинации гарантированы.

Почему дедупликация данных улучшает качество модели, а не просто экономит дисковое место?

Training Stability: когда loss взрывается

**На 50-м часу обучения LLaMA-2 loss вдруг прыгнул с 2.1 до 8.7.** Не баг в коде - loss spike. Это случается раз в несколько тысяч шагов при обучении больших моделей и без правильных инструментов убивает недели вычислений. Первая линия обороны - **gradient clipping**: если L2-норма всех градиентов превысила порог (обычно 1.0), масштабируем их до этого порога. Это предотвращает взрывной рост весов. Вторая - **learning rate warmup**: первые 2000 шагов LR растёт линейно от 0 до max, потом cosine decay до 10% от max. Резкий старт с высоким LR = нестабильные веса с первых шагов. **BF16 вместо FP16**: BFloat16 имеет тот же exponent range что FP32 (динамический диапазон 10^-38 до 10^38), тогда как FP16 обрезается уже на 65504 - любой активационный spike = Inf = NaN loss.

**Flash Attention** (Dao et al., 2022) - не только ускорение, но и точность: стандартная реализация накапливает ошибки округления при O(T^2) матричных операциях. Flash Attention вычисляет attention блоками в SRAM без материализации полной матрицы: memory O(T) вместо O(T^2), скорость 2-4x, и меньше numerical issues. Практически обязателен для обучения моделей > 7B.

**Rollback при spike**: при обнаружении spike крупные команды откатываются к checkpoint'у за 100-200 шагов до него и пропускают проблемный батч через blacklisting его hash'а. Альтернатива - снизить LR на 10% и продолжить. Meta при обучении LLaMA-2 столкнулась с несколькими спайками - они обрабатывали их именно rollback + skip проблемного батча.

Почему BF16 предпочтительнее FP16 для pre-training LLM?

Distributed Training: 1024 GPU как один

**GPT-3 не влез бы в один GPU никак.** 175B параметров в BF16 = 350GB только для весов. Плюс optimizer states (AdamW хранит momentum и variance - ещё x2-x3), плюс активации. Это тысячи GPU по любому сценарию. **Data Parallelism (DP)**: каждый GPU держит полную копию модели, обрабатывает разные батчи, синхронизирует градиенты через AllReduce - работает только если модель помещается в 1 GPU. **Tensor Parallelism (TP)**: разрезаем матрицы весов по столбцам/строкам между GPU - каждая голова attention на отдельном GPU. **Pipeline Parallelism (PP)**: разные слои на разных GPU, данные движутся как конвейер - но есть pipeline bubble (GPU простаивают). **ZeRO optimizer** (DeepSpeed): шардирует optimizer states, градиенты и веса между GPU без дублирования - ZeRO-3 держит только 1/N часть весов на каждом GPU.

**Megatron-LM** (NVIDIA) комбинирует все три подхода: TP внутри ноды (быстрый NVLink), PP между нодами (медленный InfiniBand), DP поверх всего. Для 70B+ это единственный практичный путь. **Gradient Checkpointing**: вместо хранения всех активаций для backward pass - пересчитываем их заново. Trade-off: +33% вычислений, -60-80% памяти на активации. Без него даже 7B не влезает в 80GB A100 при длинных контекстах.

Почему ZeRO-3 (DeepSpeed) позволяет обучать модель, которая не помещается на одном GPU, без Pipeline Parallelism?

Curriculum Learning: порядок имеет значение

**LLaMA-1 и LLaMA-3 обучены на принципиально разных данных** - не только по объёму, но по стратегии подачи. Curriculum learning - это не просто педагогическая метафора, а конкретная инженерная практика: сначала короткие последовательности (2K токенов), потом длинные (128K). Сначала больше веб-текста и Wikipedia, к концу обучения - больше кода и математики. Контекстное окно тоже расширяется постепенно: обучать сразу на 128K дорого и нестабильно - attention матрица растёт как T^2. **Прогрессия длины контекста LLaMA-3**: base pre-training на 8K, потом long-context pre-training на смеси длинных документов с постепенным расширением до 128K через interpolation/extrapolation RoPE. Это снижает compute cost при сохранении long-context capability.

**Domain weighting schedules**: к концу обучения Meta увеличивала долю кода и математики для LLaMA-3. Это явление называется 'late-stage curriculum' - знания, попавшие в конец обучения, имеют меньший forgetting effect, потому что последующих обновлений нет. Аналогично: при fine-tuning LLaMA-2 в чате Meta использовала 'replay' - периодически добавляла примеры из pre-training распределения, чтобы не забыть базовые знания.

**Chinchilla vs GPT-3**: Hoffmann et al. (2022) показали, что GPT-3 (175B параметров, 300B токенов) недообучен. Оптимально: для 175B нужно ~3.5 трлн токенов. Chinchilla-70B (70B параметров, 1.4 трлн токенов) превзошла GPT-3-175B на большинстве задач. LLaMA-13B с 1 трлн токенов также обошла GPT-3-175B. Вывод: scaling law Chinchilla требует пропорционального роста данных вместе с параметрами.

Больше параметров = лучше модель. GPT-3-175B превосходит любую 13B модель по определению

Chinchilla (Hoffmann 2022) опровергла это: LLaMA-13B с достаточным количеством токенов обошла GPT-3-175B. Качество определяется отношением параметров к токенам, не только числом параметров

GPT-3 был обучен на 300B токенов - по Chinchilla scaling law для 175B оптимально ~3.5 трлн токенов. Модель была принципиально недообучена. Правило: compute-optimal - удваивать и параметры, и токены пропорционально

Почему модели обучают сначала на коротких контекстах, а потом расширяют до длинных (128K), а не сразу на длинных?

Ключевые идеи

  • **Data Curation**: 90% Common Crawl выбрасывается через perplexity-фильтр (KenLM), MinHash дедупликацию и токсичность-фильтры; domain mixing (code:text:papers) задаётся вручную
  • **Training Stability**: BF16 вместо FP16 (шире диапазон), gradient clipping на норме 1.0, warmup 2000 шагов + cosine decay, rollback при loss spike
  • **Distributed Training**: DP для маленьких моделей, TP+PP+ZeRO-3 для 70B+; ZeRO-3 шардирует веса между GPU, gradient checkpointing экономит память активаций
  • **Curriculum Learning**: короткие контексты сначала, потом длинные; domain weighting shifts к концу обучения; Chinchilla law - compute-оптимально удваивать и параметры, и токены

Связанные темы

Pre-training - фундамент, на котором строится всё остальное в LLM pipeline:

  • Архитектура GPT — Pre-training обучает именно decoder-only трансформер из gai-04 - без понимания архитектуры непонятно что именно шардируется при TP/PP
  • Fine-tuning и RLHF — gai-06 и далее - всё что после pre-training; качество fine-tuning ограничено качеством pre-trained base
  • Deep Learning: оптимизация — AdamW, gradient clipping, LR schedules из dl-05 - фундамент training stability
  • Работа с LLM API — Понимание pre-training объясняет почему модели галлюцинируют, как работает context window и почему важен выбор базовой модели
  • Оценка ML-моделей — Train loss при pre-training слабо коррелирует с downstream quality - оценка нужна отдельно через бенчмарки

Вопросы для размышления

  • Chinchilla scaling law утверждает, что нужно пропорционально увеличивать и параметры, и данные. Но открытые модели типа LLaMA-3 тренируются на >15 трлн токенов при 8-70B параметрах - намного больше compute-optimal. Почему это может иметь смысл для inference efficiency?
  • ZeRO-3 собирает шарды весов через AllGather перед каждым forward pass слоя и снова разбрасывает после. При тысяче GPU это много коммуникации. Когда Pipeline Parallelism может быть эффективнее ZeRO-3 несмотря на pipeline bubble?
  • Quality filtering через perplexity (KenLM) отфильтровывает тексты с высокой перплексией - то есть непредсказуемые, нестандартные. Какие ценные данные могут быть случайно отброшены этим фильтром, и как это влияет на capabilities модели?

Связанные уроки

  • gai-04
  • dl-05
  • aie-05-api-integration
  • ml-05-evaluation
  • dl-01
Обучение LLM: pre-training

0

1

Войти