latent state // журнал
17 октября 2026 // NLP · ML // 3 мин

Обучаем GPT с нуля

Собираем и обучаем GPT с нуля

В этой статье я собираю данные, строю языковую модель и обучаю её предсказывать следующее слово в последовательности. После fine-tuning это может выглядеть как {in: системный промпт} + {in: диалог оборвавшийся на каком то слове} + {out: прогноз следующего слова}

1. Скачиваем данные

Скачивание может занять дня 3 и не зависит от скорости вашего провайдера. Архив потребует 27Гб места на диске. Так что можно запустить скачивание заранее. В качестве датасета возьмем Проект Гутенберг содержащий более 50 000 книг и более чем 3*10**9 слов-токенов. Токены будут читаться случайными окнами и для HDD это может стать узким местом - так что лучше разместить датасет на NVME или в кеше RAM.

git clone https://github.com/pgcorpus/gutenberg.git
cd gutenberg
pip install -r requirements.txt
python get_data.py

Железо и параметры

  • GPU: NVIDIA GeForce RTX 4090, 24 ГБ GDDR6X, лимит мощности 450 Вт, пиковая bf16 около 165 TFLOP/s, пропускная способность памяти около 1 ТБ/с
  • CPU: Intel Core i7-6700K, 4 ядра / 8 потоков, 4,0–4,2 ГГц, Skylake 2015 года
  • RAM: 50,4 ГБ
  • Диски: 2 × NVMe WD Blue SN550 по 1 ТБ, HDD WD Purple 6 ТБ, на нём лежит датасет
  • Материнская плата: ASUS PRIME H270-PRO, PCIe 3.0
  • ОС и софт: Ubuntu 22.04.5, ядро 6.8, Python 3.11.7, PyTorch 2.10.0 с CUDA 12.8, драйвер 580.178, tiktoken 0.9.0, numpy 2.4.2

Выбор модели

Вместо gpt 3 я выбираю gpt 2 small, потому что отличаются они лишь объемом обучающих данных и размером модели. Архитектура та же. gpt 2 small можно обучить за пару суток на одной пользовательской видео карте. Качество будет конечно ниже, но после fine-tuning с ней уже можно будет вести разговор.

  • GPT-3: 175 млрд параметров, 300 млрд токенов, 1.7 токенов на параметр
  • Chinchilla: 70 млрд параметров, 1,4 трлн токенов, 20 токенов на параметр
  • Llama 3 8B: 8 млрд параметров, 15 трлн токенов, 1 900 токенов на параметр
  • Наша GPT-2 small: 124 млн параметров, 6,4 млрд токенов, 52 токенов на параметр

Chinchilla

  • 2020, Январь - Openai, Каплан и др. Scaling Laws for Neural Language Models. Выгоднее растить модель, а не данные.
  • 2020, Май - GPT-3 Построена ровно по этому рецепту: 175 млрд параметров, всего 300 млрд токенов.
  • 2022, Март - DeepMind, Хоффманн и др., Training Compute-Optimal Large Language Models. Нашли ошибку у Каплана: он не подстраивал длину расписания learning rate под длину обучения, и из-за этого недооценивал пользу данных. Правильный ответ: Модель и данные надо растить одинаково, и оптимум около 20 токенов на параметр. Взяли бюджет вычислений своей модели Gopher, 280 млрд параметров на 300 млрд токенов, и на тот же бюджет обучили модель вчетверо меньше, 70 млрд параметров, но на 1,4 трлн токенов. Назвали Chinchilla, и она обошла Gopher на широком наборе задач. Отсюда “правило 20” и слово “Chinchilla-optimal”.
Каплан 2020Хоффманн 2022
модельN∝C0.73N \propto C^{0.73}, в 100.73≈5,410^{0.73} \approx 5{,}4 раза большеN∝C0.5N \propto C^{0.5}, в 3,23{,}2 раза
данныеD∝C0.27D \propto C^{0.27}, в 100.27≈1,910^{0.27} \approx 1{,}9 раза большеD∝C0.5D \propto C^{0.5}, в 3,23{,}2 раза

Где C это бюджет вычислений в FLOPs, а размер модели по Каплану растёт как бюджет в степени 0,73

При претрейне модели, число токенов задается заранее, под него строится расписание learning rate, модель обучается согласно заданному бюджету.

2. Чистка данных