Karpathy выпустил nanochat: обучите ChatGPT-подобную модель за ~4 часа и ~$100
Что такое nanochat
Andrej Karpathy выложил в открытый доступ nanochat — компактный и малозависимый репозиторий, реализующий полный стек, похожий на ChatGPT. Проект охватывает обучение токенизатора, предобучение, mid-training на диалогах/множественном выборе/использовании инструментов, Supervised Finetuning (SFT), опциональный RL на GSM8K, оценку и сервис (CLI + простой веб-интерфейс в стиле ChatGPT).
Одна команда “speedrun” и стоимость
В репозитории есть единственный скрипт «speedrun», который прогоняет весь цикл: токенизация, предобучение, mid-training, SFT, опциональный RL, оценка и развёртывание. Рекомендуемая конфигурация — узел с 8×H100. При цене примерно $24/час за узел такой прогон занимает около 4 часов и даёт стоимость порядка $100. После прогонки генерируется report.md с метриками: CORE, ARC-E/C, MMLU, GSM8K, HumanEval и ChatCORE.
Токенизатор и данные
nanochat использует кастомный Rust BPE токенизатор (сборка через Maturin) с вокабуляром в 65 536 токенов. Тренировка токенизатора проводится на шардированных данных FineWeb-EDU, которые в репозитории перепаковиваются и перемешиваются для простого доступа. В walkthrough отмечается сжатие около 4.8 символов на токен и сравнение с токенизаторами GPT-2/4.
Поставляется бандл для оценки (в ~/.cache/nanochat/eval_bundle) с подборкой наборов для CORE (22 датасета автодополнения, включая HellaSwag, ARC, BoolQ и другие).
Модель, масштабирование и цель speedrun
Конфигурация speedrun обучает трансформер глубиной 20 слоёв (примерно 560M параметров, 1280 скрытых каналов, 10 attention heads по dim 128) на порядка 11.2B токенов, в духе Chinchilla-скейлинга (параметры × ~20 токенов). В реализации используются Muon для матмул-параметров и AdamW для эмбеддингов/унэмбеддингов; потери измеряются в bits-per-byte (bpb) чтобы быть независимыми от токенизатора. Автор оценивает способность модели примерно в ~4e19 FLOPs для настройки speedrun.
Mid-training, SFT и использование инструментов
После предобучения выполняется mid-training для адаптации модели к диалогам (SmolTalk), обучения поведению для задач множественного выбора (100K вспомогательных вопросов MMLU) и для применения инструментов через явные блоки <|python_start|>…<|python_end|>. Небольшой кусочек GSM8K включён, чтобы посеять навык калькулятора. Стандартная смесь для mid-training в speedrun: SmolTalk (460K строк), MMLU aux-train (100K), GSM8K main (8K) — всего 568K строк.
SFT затем дообучает на более качественных примерах диалогов и приводит форматирование к тестовым условиям (padding, раздельные строки), чтобы сократить рассинхрон между обучением и инференсом. Примерные метрики после SFT для speedrun-уровня: ARC-Easy 0.3876, ARC-Challenge 0.2807, MMLU 0.3151, GSM8K 0.0455, HumanEval 0.0854, ChatCORE 0.0884.
Использование инструментов реализовано целиком: кастомный Engine управляет KV-кешем, prefill/decode инференсом и предоставляет простой песочницу Python-интерпретатора, применяемую в обучении и оценке.
Опциональный RL на GSM8K (упрощённый GRPO)
Финальный опциональный этап — RL на GSM8K с упрощённой GRPO процедурой. В walkthrough подчёркивают намеренные упрощения относительно классического PPO/RLHF: нет trust-region через reference-модель, нет KL-пенализаций, on-policy обновления без PPO-коэффициентов/клиппинга, нормализация на уровне токенов в стиле GAPO и mean-shift advantage. На практике поведение близко к REINFORCE, но с групповым вычислением преимущества. Скрипты scripts.chat_rl и scripts.chat_eval -i rl -a GSM8K демонстрируют цикл.
Оценка и уровни масштабирования
Пример report.md для ~$100 / ~4 часа показывает: CORE 0.2219 (base); после mid-training и SFT ARC-Easy вырос до ~0.3876, ARC-Challenge ~0.2807, MMLU ~0.3151, GSM8K ~0.0455, HumanEval ~0.0854, ChatCORE ~0.0884. Полное время прогона — примерно 3ч51м.
README также обозначает более крупные цели: уровень ~$300 (d=26, ~12 часов) с небольшим превосходством над GPT-2 CORE и уровень ~$1,000 (~41.6 часов) для заметно лучшей когерентности и базовых навыков рассуждения/кодирования. В прошлых экспериментах модель d=30 за ~24 часа показывала более высокие результаты на MMLU и ARC-Easy и на GSM8K.
Зачем это важно
nanochat — полезный компромисс: единый, чистый и малозависимый репозиторий (~8k LOC), который делает полный путь от токенизатора до веб-UI воспроизводимым и легко изучаемым на одном multi-GPU узле. Он даёт прозрачный pipeline с отчётами по метрикам и понятными вариантами масштабирования.