Learn (Almost) Anything
КаталогСкачать курс

Авторесёрч: автономные ML-эксперименты

Что именно прописано агенту в program.md. Сначала setup: завести ветку, прочитать README.md, prepare.py, train.py, убедиться, что данные закэшированы, инициализировать results.tsv. Ограничения: нельзя менять prepare.py, ставить пакеты или трогать логику оценки; VRAM держать в разумных пределах; предпочитать простые, элегантные решения, а не усложнять ради мелкого выигрыша. Экспериментальная петля: гипотеза → коммит → прогон и сбор логов → извлечение метрик → запись в TSV → оставить или сбросить. И директива автономности: агент не останавливается и работает до ручной остановки.

ruМини-курс6 уроков1 модуль9
автономные ML-экспериментыML-экспериментыавтономный цикл ML-экспериментовML-экспериментовавторесёрчавтономныеэкспериментыавтономныйциклэкспериментов

Правила агента и режим автономности

Что именно прописано агенту в program.md. Сначала setup: завести ветку, прочитать README.md, prepare.py, train.py, убедиться, что данные закэшированы, инициализировать results.tsv. Ограничения: нельзя менять prepare.py, ставить пакеты или трогать логику оценки; VRAM держать в разумных пределах; предпочитать простые, элегантные решения, а не усложнять ради мелкого выигрыша. Экспериментальная петля: гипотеза → коммит → прогон и сбор логов → извлечение метрик → запись в TSV → оставить или сбросить. И директива автономности: агент не останавливается и работает до ручной остановки.

Правила агента и режим автономности

Во втором подмодуле мы разобрали, что program.md — это текстовый файл, который человек пишет для агента, и что именно он задаёт направление. Сейчас — шаг глубже: посмотрим на сам текст этого файла изнутри. Что именно агент читает? Какие правила получает? Почему он работает без пауз и не задаёт вопросов?

Структура program.md: три блока

Файл устроен линейно — три блока, читаемых сверху вниз. Агент обрабатывает их в том же порядке, в котором они написаны.

flowchart TD A[program.md] --> B[Блок 1: Setup] A --> C[Блок 2: Ограничения] A --> D[Блок 3: Экспериментальная петля] B --> B1[Завести ветку autoresearch/tag] B --> B2[Прочитать README, prepare.py, train.py] B --> B3[Проверить кэш данных] B --> B4[Инициализировать results.tsv] C --> C1[❌ Нельзя менять prepare.py] C --> C2[❌ Нельзя ставить пакеты] C --> C3[❌ Нельзя трогать логику оценки] C --> C4[⚠️ VRAM в разумных пределах] C --> C5[💡 Простые, элегантные решения] D --> D1[1. git status] D1 --> D2[2. Гипотеза + правка train.py] D2 --> D3[3. git commit] D3 --> D4[4. uv run train.py → run.log] D4 --> D5[5. grep val_bpb + peak_vram_mb] D5 --> D6{val_bpb улучшился?} D6 -->|Да| D7[Коммит остаётся] D6 -->|Нет| D8[git reset] D7 --> D9[Запись в results.tsv] D8 --> D9 D9 --> D1
flowchart TD
    A[program.md] --> B[Блок 1: Setup]
    A --> C[Блок 2: Ограничения]
    A --> D[Блок 3: Экспериментальная петля]

    B --> B1[Завести ветку autoresearch/tag]
    B --> B2[Прочитать README, prepare.py, train.py]
    B --> B3[Проверить кэш данных]
    B --> B4[Инициализировать results.tsv]

    C --> C1[❌ Нельзя менять prepare.py]
    C --> C2[❌ Нельзя ставить пакеты]
    C --> C3[❌ Нельзя трогать логику оценки]
    C --> C4[⚠️ VRAM в разумных пределах]
    C --> C5[💡 Простые, элегантные решения]

    D --> D1[1. git status]
    D1 --> D2[2. Гипотеза + правка train.py]
    D2 --> D3[3. git commit]
    D3 --> D4[4. uv run train.py → run.log]
    D4 --> D5[5. grep val_bpb + peak_vram_mb]
    D5 --> D6{val_bpb улучшился?}
    D6 -->|Да| D7[Коммит остаётся]
    D6 -->|Нет| D8[git reset]
    D7 --> D9[Запись в results.tsv]
    D8 --> D9
    D9 --> D1
Структура program.md: три блока и их содержание

---

Блок 1. Setup — что делается один раз

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

Пять шагов в setup:

1. Завести датированную веткуautoresearch/<tag>, где тег обычно содержит дату. Это разбирали в предыдущем подмодуле: чтобы легко ориентироваться среди сессий.

2. Прочитать README.md — понять общий контекст репозитория.

3. Прочитать prepare.py и train.py — изучить текущее состояние кода перед тем, как что-то менять. Агент не импровизирует вслепую; он сначала разбирается, что уже есть.

4. Убедиться, что данные закэшированы — проверить, что prepare.py уже был запущен и шарды датасета на месте. Если нет — агент не может начать обучение.

5. Инициализировать results.tsv — создать файл с заголовком колонок, куда будут писаться результаты каждого эксперимента.

Только после всех пяти шагов агент переходит ко второму блоку.

Дерево файлов репозитория: ключевые файлы, которые агент читает в фазе Setup.

---

Блок 2. Ограничения — что запрещено и что предпочтительно

Это самая важная часть program.md с точки зрения безопасности и честности экспериментов. Несколько жёстких запретов и несколько принципов.

Жёсткие запреты:

  • Нельзя менять prepare.py. Причину мы разобрали в третьем подмодуле: именно там живёт логика вычисления val_bpb. Если агент изменит её — он сможет «улучшить» метрику, подправив формулу, а не модель. Это читерство, которое полностью обесценивает результаты.
  • Нельзя устанавливать новые пакеты. Агент работает с тем окружением, которое уже собрано через uv sync. Это ограничение удерживает эксперименты воспроизводимыми: если агент мог бы ставить произвольные библиотеки, повторить его результаты стало бы сложнее.
  • Нельзя трогать логику оценки. Шире, чем предыдущий пункт: любые изменения, которые влияют на то, как считается val_bpb, запрещены. Метрика должна оставаться стабильным референсом на протяжении всей сессии.

Принципы (не жёсткие правила, но предписания):

  • VRAM держать в разумных пределах. Агент видит peak_vram_mb в каждом прогоне и должен учитывать это при следующей гипотезе. Если архитектура резко растёт, следующий эксперимент рискует упасть с OOM. program.md явно это оговаривает.
  • Предпочитать простые, элегантные решения. Не усложнять ради мелкого прироста. Если изменение даёт минимальное улучшение val_bpb, но значительно усложняет архитектуру — принцип говорит воздержаться. Это не строгий критерий, а направляющий принцип для агентского суждения.
ИнтерактивПравила агента: разрешено или нет?
Проверьте, какие действия разрешены агенту по правилам program.md. Выберите правильный ответ для каждого случая.

---

Блок 3. Экспериментальная петля — семь шагов по кругу

Третий блок — это тело бесконечного цикла. После setup агент входит сюда и никогда не выходит сам.

Семь шагов каждой итерации:

1. Посмотреть git-статус. Агент проверяет текущее состояние репозитория — убеждается, что коммит предыдущей итерации сделан правильно и рабочее дерево чистое.

2. Сформулировать гипотезу и внести изменение в train.py. Агент решает, что попробовать: другой оптимизатор, иной размер батча, измененная архитектура слоя, новый learning rate schedule — всё это в рамках train.py.

3. Закоммитить изменение. До запуска обучения — коммит. Это важно: без коммита при откате нет к чему сбрасываться.

4. Запустить прогон и собрать логи:

```bash

uv run train.py > run.log 2>&1

```

Ровно 5 минут wall clock — тренировочный луп сам следит за бюджетом времени.

5. Извлечь метрики:

```bash

grep "^val_bpb:|^peak_vram_mb:" run.log

```

Никакой интерпретации — только два числа из двух строк лога.

Терминал: команда grep извлекает ровно два числа из run.log — val_bpb и peak_vram_mb.

6. Принять решение — оставить или сбросить:

- val_bpb снизился → коммит остаётся, ветка продвигается.

- val_bpb не снизился (равен или хуже) → git reset к предыдущему состоянию.

7. Записать результат в results.tsv. В обоих случаях — принято или отброшено. Запись фиксирует всё: что пробовалось, что получилось. Это позволяет человеку потом увидеть весь путь, а не только успешные шаги.

Пример results.tsv: каждая строка — один эксперимент с гипотезой, метриками и решением (kept / reset).

После седьмого шага — немедленно обратно на первый. Без паузы, без ожидания.

---

Директива автономности: агент не останавливается

Последняя строка program.md — самая короткая и самая принципиальная. Смысл: агент работает до ручной остановки и не задаёт вопросов.

Это не просто «продолжай работать» — это явная директива убрать любые остановки между итерациями. Агент не спрашивает «продолжать?» после каждого прогона. Он не ждёт подтверждения гипотезы. Он не просит уточнений, если что-то неоднозначно.

Для пользователя это означает: вы запустили агента и можете идти спать. Утром — открываете results.tsv и смотрите, что было найдено за ночь. Именно так набирается ~100 экспериментов за 8–9 часов.

Одна практическая оговорка: если агент натолкнулся на серьёзную ошибку (например, train.py перестал компилироваться из-за синтаксической ошибки в его же изменении, и run.log содержит traceback без val_bpb) — поведение зависит от того, насколько хорошо агент умеет читать логи и восстанавливаться. Директива автономности не отменяет здравый смысл: хорошо написанный program.md добавляет инструкции на случай ошибочного прогона — например, «если val_bpb не найден в логе, считать прогон неудачным и сбросить изменения».

---

Как это всё соединяется

program.md — небольшой документ, но он замыкает всю конструкцию. Три файла, разобранных во втором подмодуле, получают смысл через него: prepare.py защищён явным запретом, train.py становится единственной ареной, а человек управляет направлением через правку текста, а не Python-кода.

Что стоит понять: program.mdне скрипт и не конфиг. Это инструкция на естественном языке, которую LLM-агент читает и интерпретирует. Именно поэтому в нём есть принципы (не только правила) и нет жёсткой валидации их соблюдения — агент сам решает, когда архитектура «слишком усложнилась» ради «мелкого прироста». Это одновременно гибкость и ограничение: агент может проявлять суждение там, где жёсткий скрипт не справился бы, но и ошибиться там, где скрипт ошибиться не мог.

---

Мини-проверка

Три быстрых вопроса:

1. Агент закончил прогон, val_bpb стал хуже. Какой следующий шаг по program.md? *(git reset, запись в TSV, новая итерация)*

2. Человек хочет сказать агенту «сфокусируйся на снижении параметров». В какой файл он идёт? *(program.md, второй блок — ограничения или даже как явная задача)*

3. Почему агент читает prepare.py в setup, если не имеет права его менять? *(Чтобы понять текущую инфраструктуру и не изобретать то, что уже реализовано)*

---

В следующем и финальном подмодуле честно разберём рамки: где авторесёрч применим, а где нет — и почему задачи из вашего брифа (поиск источников, проверка фактов, академические обзоры) лежат за пределами того, что делает этот репозиторий.

Самопроверка

  1. После прогона с ухудшением val_bpb агент откатывает изменения через git reset, но всё равно записывает результат в results.tsv. Зачем записывать неудачный эксперимент?
  2. Программа запрещает менять prepare.py, но разрешает менять train.py. Это различие защищает что?
  3. Директива «агент работает до ручной остановки и не задаёт вопросов» нужна в первую очередь для:
  4. Что произойдёт, если в setup агент не убедится, что данные закэшированы?
  5. В блоке ограничений есть «жёсткие запреты» (нельзя менять prepare.py) и «принципы» (предпочитать простоту). В чём их различие?
  6. После эксперимента с использованием 85% доступного VRAM агент выбирает гипотезу на следующую итерацию. Как это должно повлиять на его выбор?

Домашние задания

Расшифровка program.md: три блока, семь уровнейdocument

В статье разобраны три блока program.md — ось всей конструкции авторесёрча. Создай таблицу (markdown, Google Sheets или просто текстовый файл), где каждый блок разложен по целям и компонентам. Для каждого из трёх блоков (Setup, Ограничения, Петля) заполни: • Название и смысл блока (одно предложение) • Конкретные шаги или элементы (перечень из статьи) • Почему это критично (почему именно так, а не иначе) Это не анализ «зачем нужен», а структурирование того, что там написано. Используй только информацию из статьи — ничего не выдумывай.

Таблица содержит ровно три строки для трёх блоков. Setup перечисляет все 5 шагов (завести ветку, README, prepare.py и train.py, кэширование данных, инициализация results.tsv). Ограничения называют минимум 3 жёстких запрета (prepare.py, пакеты, логика оценки) и минимум 2 принципа (VRAM, элегантность). Петля описывает все 7 шагов цикла (git status, гипотеза, коммит, прогон, метрики, keep/reset, запись в TSV). Для каждого блока есть объяснение «почему это важно», а не только перечисление. Таблица структурирована и читается без напряга.

Экспериментальная петля в коде: от гипотезы к results.tsvarchive

Напиши скрипт (Python или bash — не важно), который имитирует работу цикла из третьего блока program.md. Скрипт должен: 1. Взять гипотезу (можешь жёстко вбить в код или передать параметром) 2. Сгенерировать реалистичные значения val_bpb и peak_vram_mb (не обязательно настоящие числа, но разумные — VRAM в пределах 100–2000 MB, val_bpb как числа типа 1.23, 1.45) 3. Применить правило: если val_bpb снизился → запись keep, иначе → запись reset 4. Дописать результат в results.tsv (создаёт файл с заголовком при первом запуске) Запусти скрипт минимум 3 раза (или сделай его так, чтобы он сам прошёл 3 цикла). В results.tsv должно накопиться минимум 3 строки результатов. Упакуй скрипт и финальный results.tsv в архив .zip.

Скрипт корректно применяет keep/reset: если val_bpb улучшился (снизился), это видно как decision='keep', иначе decision='reset'. Results.tsv содержит минимум 3 записи с данными. Присутствуют колонки: hypothesis, val_bpb, peak_vram_mb, decision, timestamp (или эквивалентные). Значения реалистичные: peak_vram не выходит за пределы 100–2000 MB, val_bpb — это числа с одинаковой точностью (не одинаковые, но разумные). Скрипт работает (запущен, результаты видны в TSV). Архив содержит оба файла (скрипт и TSV).

Напиши program.md для своего авторесёрчаdocument

Сценарий: ты оптимизируешь нейросетевую модель, чтобы снизить расход памяти при сохранении качества. Твой train.py уже работает. Ты планируешь пробовать: 1) low-rank аппроксимация для слоёв, 2) размер батча (32 → 16), 3) функция активации (ReLU → GELU). Напиши program.md, который агент прочитает и поймёт, что ему делать. Три обязательных блока: **Setup** — что делать один раз перед циклом (завести датированную ветку, прочитать README и исходный код, убедиться, что данные на месте, подготовить results.tsv) **Ограничения** — что запрещено (не менять prepare.py, не ставить пакеты, не трогать логику оценки val_bpb) и что важно (VRAM в разумных пределах, простые решения) **Петля** — как агент циклится (какие гипотезы пробовать, как менять train.py, как запускать обучение, как извлекать val_bpb и peak_vram из лога, как применять keep/reset, как писать в results.tsv) В конце напиши одну фразу о том, что агент работает до ручной остановки. Текст на естественном языке, структурирован, но не скрипт.

Три блока явно отделены и озаглавлены (Setup, Ограничения, Петля). Setup содержит 5 шагов, переформулированных под сценарий. Ограничения называют минимум 3 конкретных запрета (с объяснением почему). Петля описывает реальный цикл: какие гипотезы пробовать, как менять train.py, как считывать логи, как применять keep/reset, как записывать в TSV. Гипотезы логичны и соответствуют цели (оптимизация памяти). Текст читаем: пронумерованные пункты, абзацы, нет одной сплошной простыни. Присутствует финальная директива про автономность (агент не останавливается).

Сдача и проверка заданий — в приложении Learn (Almost) Anything.

Источники

  1. karpathy/autoresearch — GitHub repository