Как обучить марсоход и отправить решение
Задача
Ваша задача — обучить марсоход проходить как можно дальше по незнакомой местности. Он использует показания датчиков, чтобы выбирать действия: двигаться, тормозить и управлять оборудованием. За действия робот получает награду. Во время обучения нейросеть подбирает поведение, которое помогает получать больше награды.
Маршрут проходит через разные биомы — участки со своими условиями движения. На одно испытание отводится 120 секунд модельного времени. Если робот перевернулся или больше не может продолжать путь, рельеф мира генерируется заново и робот начинает движение от начала маршрута. Свойства биомов при этом сохраняются. Нейросеть помнит предыдущие попытки и может использовать этот опыт. Все попытки входят в общие 120 секунд. Следующее испытание начинается в другом мире, с очищенной памятью сети.
Результат испытания — самая дальняя точка, до которой добрался робот, по координате X от 0 до 800 метров. Итоговый балл — среднее этих значений по всем испытаниям. Чем он выше, тем выше место команды в таблице.
Подготовьте решение
Нажмите «Войти в аккаунт», затем скачайте «Стартовый ZIP» и распакуйте его. В архиве находятся три основных файла:
| Файл | Для чего нужен |
|---|---|
train.py |
Обучение нейросети и сохранение её весов |
Dockerfile |
Установка библиотек и подготовка окружения |
README.md |
Описание вашего подхода и изменений |
В начальном решении используется PPO — алгоритм обучения с подкреплением.
Сеть GRU хранит сведения о предыдущих действиях и наблюдениях.
Изменения вносите в train.py; дополнительные модули можно положить рядом с ним.
Опишите в README.md, что вы изменили и какого результата ожидаете.
Сначала запустите исходное решение и запишите его результат. Затем выберите одну
идею для улучшения. Например, уменьшите скорость обучения: в ppo.Config(...)
добавьте learning_rate=1e-4. Сравните результат с исходным запуском.
Можно менять алгоритм обучения, награду, число параллельных сред и другие параметры. Архитектура сети остаётся GRU-128. Формат входных данных и весов описан в требованиях к нейросети.
Подготовьте архив
После изменений создайте ZIP с содержимым папки решения. Файлы должны лежать непосредственно в архиве, без дополнительной внешней папки:
solution.zip
├── Dockerfile
├── train.py
└── README.md
Добавьте в архив свои модули и необходимые данные. Размер ZIP — до 32 МиБ,
после распаковки — до 128 МиБ, количество файлов — до 512. Не включайте виртуальное
окружение .venv, папку .git, пароли, ключи доступа и готовые веса нейросети.
Начальная строка Dockerfile должна оставаться FROM arena-base. Python 3.12,
PyTorch и среда марсохода уже доступны. Если нужна другая библиотека, добавьте
команду её установки перед строкой USER 10000:10000, указав точную версию:
RUN python -m pip install название_пакета==версия
Во время обучения доступа к интернету нет, поэтому установите зависимости заранее через Dockerfile. Остальные требования к окружению приведены в описании формата решения.
Загрузите и запустите
В разделе «Мои решения» укажите название, выберите ZIP и нажмите «Сохранить версию». Если загрузить изменённый архив под тем же названием, он получит следующий номер: v2, v3 и так далее. Если архив не изменился, сохранится уже существующая версия. Исходники каждой версии можно скачать по ссылке «ZIP».
На команду можно сохранить до 100 версий общим размером до 256 МиБ. Сохранение архива не расходует попытку обучения.
Нажмите «Собрать и обучить». В разделе «Запуски» появится текущий этап:
- Сборка — установка библиотек и подготовка программы.
- Подготовка к обучению — сохранение собранного решения.
- Очередь обучения — ожидание свободного места; рядом указана позиция в очереди.
- Обучение — выполнение
train.py, не более двух часов. - Проверка и оценка — проверка весов и испытания марсохода.
- Готово — результат появится в таблице.
Кнопка «Журнал» открывает сообщения программы. Они обновляются каждые пять секунд.
Выводите через print(..., flush=True) число пройденных шагов, награду, значение
ошибки и другие показатели, по которым следите за обучением.
Сохраните веса
Программа должна записать веса в /output/policy.safetensors и завершиться
без ошибки в течение двух часов. В начальном решении сохранение уже выполняется
после каждого обновления сети. Пример вызова:
from arena.protocol import export
export("/output/policy.safetensors", model, rms)
Вместе с весами сохраняются параметры нормализации наблюдений. Размер файла —
до 4 МиБ. Подробные требования приведены в описании формата весов.
Для временных файлов используйте /tmp, для результата — /output.
Начальное решение проверяет время после обновлений сети и начинает завершение примерно на 110-й минуте. Если меняете цикл обучения, оставьте время на сохранение весов и завершение программы.
Попытки и отмена
У команды может быть один активный запуск и до пяти попыток за последние 24 часа. Доступное количество показано в кабинете. Новый запуск сразу занимает одну попытку.
Чтобы остановить его, нажмите «Отменить». Если обучение шло менее 15 минут, попытка вернётся после остановки. Начиная с 15:00 она считается использованной. Время в очереди, сборка и скачивание образа не учитываются. Важно время нажатия кнопки: ожидание остановки не увеличивает учитываемую длительность.
Пока показано «Останавливаем», дождитесь завершения отмены. После этого можно запустить решение снова. Архив и журнал сохранятся.
Завершённые запуски, в том числе с ошибкой, расходуют попытку независимо от длительности. Отменить их задним числом нельзя. Каждая использованная попытка освобождается через 24 часа после создания запуска.
Сравните результаты и выберите решение для финала
В таблице отображается лучший результат каждой команды. Ваша строка выделена; кнопка «Моя команда» помогает быстро её найти. Название команды можно изменить в кабинете.
Кнопка «Обучить снова» создаёт новый запуск той же версии. У него будут свои
веса, журнал и результат. Поле «Начальное число» задаёт начальное состояние
генераторов случайных чисел. Для сравнения двух изменений удобно оставить одинаковое
значение, а устойчивость результата проверить несколькими запусками с разными значениями.
В train.py это число доступно через переменную ARENA_SEED.
По умолчанию в финал отправляется запуск с лучшим баллом команды. Чтобы выбрать другой успешный запуск, нажмите «В финал». Кнопка «Выбирать лучший автоматически» возвращает выбор по максимальному баллу.
В финале сохранённые веса проверяются на отдельном наборе миров, одинаковом для всех команд. Повторное обучение не требуется. При равных итоговых баллах команды делят место.
Если возникла ошибка
Откройте журнал запуска и найдите первое сообщение об ошибке.
| Проблема | Что сделать |
|---|---|
| Архив не принимается | Проверьте размер и наличие Dockerfile, train.py и README.md в корне архива |
| Не устанавливается библиотека | Проверьте название, версию и поддержку Linux; подробности находятся в журнале сборки |
| Не хватает памяти | Уменьшите число параллельных сред, размер порции данных или объём сохраняемого опыта |
| Обучение прервалось | Найдите сообщение об ошибке в журнале обучения и проверьте ограничение в два часа |
| Файл весов не найден | Сохраняйте его под именем /output/policy.safetensors |
| Веса не прошли проверку | Проверьте структуру GRU-128, тип float32, параметры нормализации и отсутствие NaN/Inf |
| Новый запуск недоступен | Дождитесь завершения текущего запуска или освобождения попытки |
| Не удалось подготовить решение или провести оценку | Передайте организатору номер запуска из раздела «Ход запуска» |
Что попробовать в следующем эксперименте
- Скорость обучения (
learning_rate) определяет, насколько сильно меняются веса при обновлении. Слишком большой шаг может ухудшить уже найденное поведение. - Поощрение разнообразия действий помогает исследовать разные способы движения. Слишком сильное поощрение мешает закрепить удачный способ.
- Размер порции данных влияет на обновления сети и расход памяти.
- Награда помогает задать желательное поведение: например, поощрять продвижение вперёд и бережное использование энергии.
Записывайте изменения и результаты в README.md. Ориентируйтесь на балл в таблице: рост награды во время обучения сам по себе ещё не означает, что робот лучше справляется с новыми мирами.