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

CS336, задание 3 (scaling): законы масштабирования — путеводитель и перевод условия

Третье задание Stanford CS336 (весна 2026) почти целиком в переводе: метод IsoFLOP на синтетических данных, API обучения на B200 с бюджетом 12 часов и прогноз оптимальной модели на 48 часов B200. Плюс замена для тех, у кого нет доступа к API Стэнфорда: свой мини-эксперимент с законами масштабирования на 4 × RTX 4080.

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

  • Когда: после урока 5.1.1 «Законы масштабирования» и лекций 9 и 11 (особенно разделы о методах Chinchilla, IsoFLOP и μP).
  • Важное ограничение: вторая, главная часть задания (50 из 55 баллов) использует API обучения на серверах Стэнфорда, доступный только из сети Стэнфорда по студенческому номеру. Без него можно сделать первую часть полностью и вторую — в виде собственного эксперимента (см. раздел ниже).
РазделЧто делаетеБаллыУрок курса
2. Обзор законов масштабированияМетод IsoFLOP на готовых синтетических данных55.1.1
3. Построение закона масштабированияЭксперименты через API (бюджет 12 часов B200), прогноз на 48 часов B200, отчёт50лекция 11, 5.4.4

В этом задании вы получите практический опыт работы с законами масштабирования языковых моделей.

Постановка. Вы отвечаете за обучение языковой модели нового поколения в компании ClosedAI. Её обучение будет стоить ВВП небольшой страны и растопит шельфовый ледник в Антарктиде, так что ошибиться нельзя. Конкретно: вам дан фиксированный бюджет вычислений (в реальном времени работы). Цель — получить модель с наименьшими потерями на обучении (то есть вычислительно-оптимальную). Для этого нужно понять, как лучше распределить бюджет между (1) обучением модели побольше и (2) обучением на большем числе токенов.

Законы масштабирования, эмпирически связывающие потери модели с её размером и затраченными вычислениями, часто используют для прогноза этого баланса [Kaplan et al., 2020; Hoffmann et al., 2022]. В этом задании вы построите законы масштабирования, чтобы оценить вычислительно-оптимальный размер модели и её гиперпараметры для обучения на 48 часах B200. Вместо того чтобы обучать модели самим, вы будете обращаться к API обучения, передавая (1) гиперпараметры модели (число слоёв, размер эмбеддинга, число голов, размер батча, learning rate, число токенов обучения…) и (2) максимальное время эксперимента; API вернёт потери на валидации для этих гиперпараметров. Бюджет на подгонку законов — ещё 12 часов B200 (25% бюджета FLOPs большого запуска). API принимает широкий диапазон гиперпараметров, и часть вашей работы — решить, какие области пространства поиска исследовать, чтобы эффективно потратить бюджет.

Код. Условие доступно на GitHub: github.com/stanford-cs336/assignment3-scaling.

Как сдают. В Gradescope: writeup.pdf — полное описание методики подгонки закона масштабирования и его использования для прогноза оптимального размера модели при данном бюджете FLOPs; описание должно позволять воспроизвести результаты; code.zip — весь код подгонки и расчёта оценок. Кроме того, предсказанные оптимальные гиперпараметры и предсказанные итоговые потери на валидации отправляются в API. Часть оценки зависит от качества вашей предсказанной оптимальной модели.

ИИ-инструменты — те же правила, что во всех заданиях: можно для понятийных вопросов и как справочник по API; нельзя для реализации любой части задания (ни агенты, ни ИИ-автодополнение); агент должен использовать AGENTS.md, а промпт — прикладываться при работе с чат-ботами.

Разберём один из подходов к подгонке законов масштабирования из статьи Chinchilla [Hoffmann et al., 2022]. Центральный вопрос: при бюджете вычислений CC на обучение большой языковой модели какой выбор гиперпараметров (размера модели, числа токенов обучения и т. д.) даст наименьшие потери? Главная трудность — экстраполировать с экспериментов малого масштаба на большой. Во второй части задания можно использовать идеи и из других работ, например Kaplan et al. и Yang et al. (μP).

2.1. Законы масштабирования по профилям IsoFLOP

Заголовок раздела «2.1. Законы масштабирования по профилям IsoFLOP»

Бюджет вычислений на обучение трансформера с NN параметрами на датасете из DD токенов — примерно C=6NDC = 6ND. Подход IsoFLOP из статьи Hoffmann et al. таков: для каждого бюджета CC обучить модели разных размеров NN на D=C6ND = \frac{C}{6N} токенах и получить итоговые потери LL.

Получается набор запусков с одинаковыми FLOPs CiC_i, но разными размерами NijN_{ij}. Hoffmann et al. эмпирически наблюдают квадратичную зависимость итоговых потерь LijL_{ij} от размера модели NijN_{ij} при фиксированном бюджете CiC_i. Интуиция: когда NiN_i очень мало, модель не может описать данные, сколько бы мы ни считали, и потери высоки. С ростом модели потери плавно падают — до точки, где модель становится слишком большой и в бюджет CC не помещается достаточно шагов градиента (в пределе при Ni→∞N_i \to \infty даже один шаг превысит бюджет, и обучение остановится при очень высоких потерях). Метод состоит в том, чтобы найти оптимальные размеры модели и датасета для каждого CiC_i, а затем подогнать степенной закон, предсказывающий NN и DD для целевого CC — обычно большего, чем в прежних запусках.

Для подгонки берутся точки: для каждого бюджета CiC_i — размер Nopt(Ci)N_{opt}(C_i), минимизирующий потери среди запусков этого бюджета (его «профиль IsoFLOP»). Получаем пары ⟨Ci,Nopt(Ci)⟩\langle C_i, N_{opt}(C_i) \rangle (и аналогично для DoptD_{opt}), по ним подгоняем Nopt∝CaN_{opt} \propto C^a и Dopt∝CbD_{opt} \propto C^b и экстраполируем на целевой бюджет.

Problem (chinchilla_isoflops): законы масштабирования IsoFLOP (5 баллов)

Заголовок раздела «Problem (chinchilla_isoflops): законы масштабирования IsoFLOP (5 баллов)»

Напишите скрипт, воспроизводящий метод IsoFLOP по итоговым потерям набора запусков. Используйте (синтетические) данные из файла data/isoflops_curves.json — массив JSON, где каждый элемент описывает запуск. Первые два запуска для примера формата:

[
{
"parameters": 49999999,
"compute_budget": 6e+18,
"final_loss": 7.192784500319437
},
{
"parameters": 78730505,
"compute_budget": 6e+18,
"final_loss": 6.750171320661809
},
...
]

Для подгонки может пригодиться пакет scipy (в частности, scipy.optimize.curve_fit), но можно использовать любой метод. Hoffmann et al. подгоняют к каждому профилю IsoFLOP квадратичную функцию, чтобы найти минимум; мы же советуем просто взять запуск с наименьшими потерями для каждого бюджета как минимум.

(a) Покажите экстраполированный вычислительно-оптимальный размер модели вместе с полученными точками ⟨Ci,Nopt(Ci)⟩\langle C_i, N_{opt}(C_i) \rangle. Каков прогноз оптимального размера модели при бюджете 102310^{23} FLOPs? А при 102410^{24}? Сдать: график закона масштабирования размера модели от бюджета с точками, по которым он подогнан, и экстраполяцией как минимум до 102410^{24} FLOPs; затем одно предложение с прогнозом.

(b) Покажите экстраполированный вычислительно-оптимальный размер датасета вместе с точками ⟨Ci,Dopt(Ci)⟩\langle C_i, D_{opt}(C_i) \rangle. Каков прогноз оптимального размера датасета для бюджетов 102310^{23} и 102410^{24} FLOPs? Сдать: аналогичный график для размера датасета и одно предложение с прогнозом.

В этом разделе вы используете запуски через API обучения (раздел 3.2) в рамках фиксированного бюджета, чтобы подогнать закон масштабирования. Главная цель — выбрать размер модели и гиперпараметры, дающие наименьшие потери на валидации за 48 часов B200; кроме того, нужно предсказать эти потери. Чтобы задать гиперпараметры для предсказанного оптимального размера, советуем изучить, как гиперпараметры влияют на потери в малых масштабах. Тщательно планируйте запуски: как только бюджет в 12 часов B200 исчерпан, API перестаёт принимать запросы.

  • API запускает настоящие задания обучения на GPU B200. Эксперимент встаёт в общую очередь; стоящие в очереди и выполняющиеся эксперименты резервируют весь свой max_runtime_seconds из вашего бюджета в 12 часов. Когда эксперимент завершается или падает, бюджет пересчитывается по фактическому времени (не меньше 1 секунды и не больше max_runtime_seconds): если вы зарезервировали 30 минут, а запуск закончился за 12, неиспользованные 18 минут возвращаются. Запуск, превысивший лимит, списывается целиком.
  • Каждое задание выполняется n_evals кусками: на каждом куске обучается total_train_tokens / n_evals токенов, после чего считаются потери на валидации; последовательность потерь возвращается в status.val_losses. Для завершённого эксперимента итоговые потери — последний элемент списка. Для упавших по таймауту API может вернуть частичные потери, но это не завершённые запуски.
  • Порядок данных фиксирован: обучающие данные — токенизированный DCLM объёмом до 500 млрд токенов, без повторения эпох; каждая конфигурация потребляет одну и ту же детерминированную последовательность токенов. Валидация — 2182^{18} токенов (итоговая проверка в лидерборде использует больше). Поле model_seed управляет только инициализацией модели, а не порядком данных.
  • Архитектура в основном совпадает с заданием 1, с небольшими отличиями; код модели есть в репозитории только для справки — обучать модели нужно только через API.
  • Модели обучаются на токенизированном DCLM со словарём 32K и контекстом 512. API поддерживает AdamW и SGD, оба — с расписанием «прогрев + косинус». Пример ниже использует AdamW с weight decay 0,01, обрезкой градиента 1,0, долей прогрева 0,05 и итоговым learning rate 0,1 от пикового. Потери — средняя cross-entropy следующего токена по последовательностям из 512 токенов. Dropout нет.

Ключ API — восьмизначный студенческий номер Стэнфорда; запросы возможны только из сети Стэнфорда (может понадобиться VPN). Все запросы передают ключ в заголовке X-API-Key. Эндпоинты:

  • POST /submit — поставить в очередь запуск и получить experiment_id. Тело: architecture_config (поля attention_bias, head_dim, hidden_size, intermediate_size, num_attention_heads, num_hidden_layers, num_key_value_heads, rms_norm_eps, rope_theta, tie_word_embeddings, dtype — "float32" или "bfloat16", vocab_size), optimizer_config (расписание learning rate, weight decay, β1\beta_1, β2\beta_2, ε\varepsilon, обрезка градиента), train_batch_size, val_batch_size, n_evals, total_train_tokens, max_runtime_seconds (от 1 секунды до 12 часов), model_seed. Проверки: hidden_size = num_attention_heads * head_dim, num_attention_heads делится на num_key_value_heads, total_train_tokens делится на 512 * train_batch_size. Повторная отправка той же конфигурации — ответ 409 без резервирования; если max_runtime_seconds больше остатка бюджета — ответ 400.
  • GET /budget — использованные, оставшиеся и всего секунды бюджета.
  • GET /experiments и GET /experiment/{id} — список и состояние экспериментов: queued, running (с текущими val_losses; сюда входят запуск и вытеснения, поэтому «running» может длиться дольше лимита), completed (с used_runtime_seconds, val_losses, completed_at), failed (упал или превысил время; при таймауте — partial_val_losses).
  • POST /final_submission — отправить предсказанную оптимальную конфигурацию (training_config) и предсказанные итоговые потери (predicted_final_loss); можно отправлять повторно, засчитывается последняя. GET /final_submission — текущая отправка.

Пример конфигурации из условия: head_dim 64, hidden_size 448, intermediate_size 1280, 7 голов, 9 слоёв, 7 KV-голов, rope_theta 1 000 000, BF16, словарь 32 000; AdamW с пиковым learning rate 3e-4, final_lr_frac 0,1, warmup_frac 0,05, weight decay 1e-2, β=(0,9; 0,95)\beta = (0{,}9;\ 0{,}95); батч 128, валидационный батч 32, n_evals 16, total_train_tokens 1 048 576, max_runtime_seconds 30.

Теперь с помощью API выберите конфигурацию для запуска на 48 часов B200. Цель — минимизировать потери на валидации этой итоговой модели.

Problem (scaling_laws): лидерборд законов масштабирования (50 баллов)

Заголовок раздела «Problem (scaling_laws): лидерборд законов масштабирования (50 баллов)»

Постройте закон масштабирования и с его помощью выберите размер модели и гиперпараметры, которые, по-вашему, дадут наименьшие потери на валидации за 48 часов B200. Предскажите также потери этой модели. Для построения закона используйте API, получая итоговые потери на валидации для разных конфигураций (раздел 3.2); на подгонку можно потратить не больше 12 часов B200 — это жёсткий предел, его соблюдает сам API.

Сдать: набранный отчёт с полным описанием подхода и методики подгонки закона масштабирования. В нём должно быть описано, как закон используется для прогноза оптимального размера модели при данном бюджете FLOPs, и ваши предсказанные значения. Отчёт должен объяснять, почему вы приняли те или иные решения, и быть достаточно подробным, чтобы ваш подход и результаты можно было воспроизвести.

Ограничений на гиперпараметры запуска в 48 часов B200 почти нет. Все запуски — на одной B200.

Для начала советуем подумать как минимум над вопросами ниже; в отчёте прокомментируйте, как принималось решение по каждому:

  • При фиксированном бюджете на законы масштабирования в 12 часов B200 — как вы решали, какие запуски делать?
  • Как вы подгоняли закон масштабирования? Опишите конкретный метод (или методы). Вероятно, полезно познакомиться с подходами Kaplan et al. и Hoffmann et al.
  • Насколько хорошо закон описывает экспериментальные данные?
  • Какой оптимальный размер модели предсказывает ваш закон для бюджета 48 часов B200? Какие предсказанные потери?
  • Если бы вы обучали модель с предсказанным оптимальным числом параметров, какие гиперпараметры вы бы взяли? Для оценки числа параметров без эмбеддингов используйте 12nlayerdmodel212 n_{layer} d_{model}^2.

Кроме отчёта, отправьте в API (1) предсказанные оптимальные гиперпараметры и (2) предсказанные потери модели на валидации. Часть оценки зависит от качества вашей предсказанной оптимальной модели.


Если у вас нет доступа к API: свой эксперимент на 4 × RTX 4080

Заголовок раздела «Если у вас нет доступа к API: свой эксперимент на 4 × RTX 4080»

Бюджет задания удобно переложить на вашу машину. У RTX 4080 пик около 97,5 TFLOPS в BF16 (урок 5.7.1), реально получается порядка 30–40 TFLOPS на маленьких моделях. Значит, один час работы четырёх карт ≈ 4⋅3600⋅3,5⋅1013≈5⋅10174 \cdot 3600 \cdot 3{,}5 \cdot 10^{13} \approx 5 \cdot 10^{17} FLOPs.

  1. Задача 2 — без изменений. Сделайте chinchilla_isoflops на файле data/isoflops_curves.json: это всё, что нужно для первых 5 баллов.

  2. Модель и данные. Возьмите свою модель из задания 1 (или модель MiniMind из урока 5.6.2) и данные OpenWebText из задания 1 (или русский FineWeb-2 из урока 5.1.2). Контекст 512, словарь вашего токенизатора.

  3. Целевой бюджет «большого запуска» — например, 8 часов на 4 картах (≈4⋅1018\approx 4 \cdot 10^{18} FLOPs), а бюджет на законы — 25% от него, 2 часа (≈1018\approx 10^{18} FLOPs), как в условии.

  4. Сетка IsoFLOP. 3–4 бюджета (например, 3⋅10163 \cdot 10^{16}, 101710^{17}, 3⋅10173 \cdot 10^{17} FLOPs) × 4–6 размеров модели. Запускайте четыре эксперимента параллельно — по одному на карту (CUDA_VISIBLE_DEVICES), DDP для таких моделей не нужен. Для каждого запуска расписание (прогрев + косинус) должно заканчиваться ровно на последнем шаге — это главный урок лекции 9 о расхождении Kaplan и Chinchilla.

  5. Гиперпараметры. Сначала на самом маленьком бюджете переберите learning rate и батч; если хотите масштабировать learning rate по ширине, попробуйте правило μP из лекции 11.

  6. Прогноз и проверка. Подгоните Nopt(C)N_{opt}(C), выберите модель для целевого бюджета, предскажите потери — и реально обучите её за 8 часов. Сравнение прогноза с фактом — самая ценная часть вашего отчёта.

  • Не тратьте бюджет на большие модели раньше времени. Сначала маленькие запуски для отладки скрипта и подбора learning rate; самые дорогие запуски — в конце, когда ясно, где минимум.
  • Логарифмы. Степенной закон Nopt=kCaN_{opt} = k C^a — это прямая в осях (log⁡C,log⁡N)(\log C, \log N); подгоняйте линейную регрессию в логарифмах, а не curve_fit по исходным числам.
  • Минимум профиля. Если на каком-то бюджете лучшая модель — крайняя в сетке (самая маленькая или самая большая), минимум не найден: добавьте точку с другой стороны.
  • Предсказание потерь. Кроме Nopt(C)N_{opt}(C) подгоните и Lopt(C)L_{opt}(C) — потери лучших моделей тоже ложатся на степенной закон (с неустранимым слагаемым).
  • Эмбеддинги. Как напоминает условие, параметры без эмбеддингов оцениваются как 12nlayerdmodel212 n_{layer} d_{model}^2; у маленьких моделей эмбеддинги могут быть сравнимы с остальной моделью — решите и обоснуйте, что вы считаете за NN.