Более быстрая замена для тренажерного зала с помощью cygym

Любой, кто хоть немного занимается обучением с подкреплением, скорее всего, скажет вам, что он использовал пакет OpenAI’s Gym (ссылка ниже), и не зря! Это простой в использовании, расширяемый и хорошо поддерживаемый пакет, который снижает значительную часть накладных расходов при настройке проекта RL.

Однако при выполнении крупномасштабного проекта с минимальными ресурсами важно, чтобы каждая капля производительности была выжата из кода, который запускается много раз. Работая над проектом RL, я просмотрел исходный код классических управляющих сред, которые часто используются для тестирования агентов RL, чтобы увидеть, можем ли мы получить небольшой прирост скорости.

Я заметил, что весь код тренажерного зала написан на чистом Python, поэтому часть производственного кода в моем мозгу сразу же спросила: «А как насчет цитонизации этих сред для увеличения скорости?»

Краткое знакомство с Cython

Cython - это надмножество Python, которое позволяет компилировать интерпретируемый код Python в чрезвычайно быстрые расширения C. Что хорошо в этом, так это то, что нам фактически не нужно писать какой-либо код на C, а только некоторые незначительные изменения в нашем скрипте Python! В зависимости от варианта использования иногда вы можете увидеть увеличение скорости в 1000 раз больше по сравнению с кодом Python. Метод .step() тренажерного зала казался хорошим кандидатом для этого, поскольку он вызывается один раз для каждого кадра игры, что может происходить миллионы раз при обучении агента RL.

Представляем cygym

Недавно я выпустил общедоступный репозиторий, содержащий пакет Python под названием cygym, который содержит цитонизированные версии классических управляющих сред из исходного пакета тренажерного зала. Вся заслуга в исходном коде среды принадлежит авторам этих скриптов, но я внес некоторые незначительные оптимизации, а также использовал магию Cython для увеличения скорости до 100% по сравнению с исходными реализациями. Надеюсь, это число будет только расти по мере расширения нашей кодовой базы и привлечения новых участников.

Установка и импорт

Установка и настройка cygym довольно просты, просто клонируйте общедоступный репозиторий пакетов и установите его с помощью pip!

git clone https://github.com/gursky1/cygym
cd cygym
pip install -e . 

Pip должен обрабатывать всю настройку, необходимую для пакета, но если у вас возникнут проблемы с установкой таким образом, вы можете вручную собрать пакет самостоятельно и установить альтернативным способом, используя setuptools:

python setup.py build_ext --inplace bdist_wheel
pip install dist/(wheel file here).whl

Если вы по-прежнему сталкиваетесь с проблемами, не стесняйтесь открыть вопрос или связаться со мной напрямую!

Быстрый старт

Cygym почти полностью подходит для тренажерного зала OpenAI, все, что вам нужно сделать, это импортировать классы среды и приступить к работе!

Cygym также должен быть совместим со всеми без исключения спортивными обертками OpenAI. Одна из функций, над которой мы сейчас работаем, - это обеспечение совместимости классов cythonized с реестром тренажерного зала OpenAI, но по причинам Cython это непросто.

Некоторые сравнения начальной скорости

Один из первых тестов на скорость, который мы можем выполнить, - это сравнение того, сколько времени требуется каждому из двух наиболее распространенных методов тренажерного зала, .reset() и .step(), в тренажерном зале и на велосипеде для наших классических задач управления.

.reset() вызывается, когда мы инициализируем среду, а .step() вызывается для применения действия и получения следующего кадра. Большая часть времени выполнения при взаимодействии со средой тратится на .step(), поэтому мы будем уделять больше внимания этому сравнению:

К сожалению, кажется, что цитонизация лишь незначительно увеличивает скорость инициализации сред с использованием .reset(), а иногда даже замедляет ее! Но не бойтесь, этот метод вызывается только один раз за серию, поэтому эти результаты вторичны по сравнению с нашим следующим сравнением:

Вау! Мы можем увидеть увеличение скорости до шести раз при итерации наших сред с использованием наших цитонизированных вариантов! Обратите внимание, что большая часть времени взаимодействия с окружающей средой находится здесь, а это означает, что общее время обучения нашей модели должно меньше зависеть от среды!

Тестировать два распространенных метода со случайными действиями - это хорошо, но как cygym действительно тренирует агентов? Давайте взглянем…

Обучение агента RL со стабильными базовыми показателями

Stable baselines - отличная ветвь исходного пакета OpenAI baselines, который содержит реализации многочисленных алгоритмов RL, таких как Deep-Q, TRPO, SAC, PPO и многие другие. Я не буду углубляться в этот пакет, но мы будем использовать векторизованные среды, доступные в Stable-Baseslines, с нашим тренажерным залом и средами cygym для обучения реальных агентов RL, и посмотрим, сколько времени займет обучение наших моделей для 100k кадров:

Теперь мы собираемся провести сравнение, аналогичное предыдущим разделам, посмотрев на все наши классические управляющие среды, чтобы увидеть, какое ускорение мы можем ожидать при использовании cygym:

Опять вау! Похоже, что cygym всегда был быстрее, чем тренажерный зал, с сокращением времени на тренировку до 50%! Это может быть огромной разницей при попытке создать прототип новой архитектуры модели или при поиске гиперпараметров.

Будущие релизы

В будущем мы планируем изучить дальнейшую совместимость с тренажерным залом OpenAI, например использовать gym.make() с нашими цитонизированными средами и, возможно, быстрый рендеринг (который в настоящее время не поддерживается).

Мы также планируем взглянуть на цитонизацию более сложных задач, таких как модули box2d и алгоритмов исходного пакета тренажерного зала.

Выводы

Мы показали, что простая цитонизация с помощью cygym может привести к значительному сокращению времени обучения агента RL, что означает меньшее время ожидания и больше времени на анализ результатов! Мы активно ищем участников и сопровождающих для cygym, поэтому, если у вас есть опыт разработки и оптимизации пакетов Cython, свяжитесь с нами!

Ресурсы

Cygym: быстрые тренажеры, совместимые с классическим контролем RL



OpenAI Gym: универсальный пакет для обучения с подкреплением



Cython: скомпилированный надмножество языка Python



Стабильные базовые показатели: ответвление базовых показателей OpenAI