В течение последнего десятилетия прогресс в области глубокого обучения привел к появлению различных проектов и фреймворков. Одним из самых известных среди исследователей стал PyTorch. Благодаря своему чисто питоническому способу выполнения и отличному низкоуровневому дизайну он привлек много внимания исследовательского сообщества. Тем не менее, большая сила влечет за собой большую ответственность: из-за таких низкоуровневых функций пользователи могут вносить ошибки в свои исследования и разработки. Между тем, методы глубокого обучения сейчас используются практически повсюду: от рекомендаций по электронной коммерции на месте до лечения или банковского скоринга, а это означает, что такие… ошибки могут иметь серьезные последствия.

Последние три года команда Catalyst и сотрудники работали над Catalyst - высокоуровневым фреймворком PyTorch для исследований и разработок в области глубокого обучения. Он ориентирован на воспроизводимость, быстрое экспериментирование и повторное использование кодовой базы, поэтому вы можете создать что-то новое, а не писать еще один цикл поезда. Вы получаете метрики, контрольные точки модели, расширенное ведение журнала и поддержку распределенного обучения без шаблонного кода и низкоуровневых ошибок.

В этом посте я хотел бы поделиться нашим видением высокоуровневого API фреймворка глубокого обучения и показать текущий прогресс разработки на нескольких примерах. Вся эта работа выполняется исключительно с открытым исходным кодом, без каких-либо дополнительных вложений. Если вы заинтересованы в разработке такой экосистемы с открытым исходным кодом, вы можете поддержать нашу инициативу или написать напрямую на [email protected] для сотрудничества.

Давайте посмотрим на типичный процесс НИОКР в области глубокого обучения и попытаемся понять, как мы могли бы его улучшить. С моей точки зрения, глубокое обучение - это создание некоторого артефакта (например, модели NN), который будет эффективно переносить ваши данные в некоторое машиночитаемое векторное пространство. Это пространство должно дать вам удобную возможность сгруппировать или разделить ваши точки данных и измерить разницу с вашим целевым распределением с помощью некоторых предопределенных показателей. Хотя мы заархивировали огромный прогресс в создании различных архитектур и сложных конвейеров для передачи данных в векторные пространства, некоторые вещи обычно остаются неизменными - общая логика конвейера, метрики и оболочки аппаратного ускорителя.

Говоря о первом, я имею в виду поездную петлю SGD, которая обычно выглядит так:

В таком случае у вас есть некоторый эксперимент по глубокому обучению, который определяет количество этапов и эпох в вашем прогоне, ваши данные / компоненты для каждого этапа и некоторую логику того, как вы хотите обрабатывать один пакет для обучения модели. И обычно вы могли быстро написать что-то вроде:

Этот пример показывает, насколько хорош PyTorch: код очень прост и понятен. Тем не менее, это усложняется, когда ваш проект разрастается: большой-проект-1 или большой-проект-2. Та же самая прямая, которая дает вам возможность для низкоуровневой настройки и удобочитаемого кода, наносит удар вам в спину, когда существует слишком много удобочитаемого кода.

Нет проблем, если вы работаете в одиночку только над одним проектом. Тем не менее, становится довольно болезненно работать в команде, работающей с полностью настраиваемым конвейером - вы должны понимать и точно тестировать большой объем кода. Другой случай - когда вы работаете над несколькими проектами одновременно - становится еще интереснее, если у них много общего (несколько соревнований по классификации / сегментации Kaggle одновременно). После нескольких месяцев такой работы вы определенно захотите создать набор инструментов, который поможет вам в вашей карьере.

С исторической точки зрения прогресс разработки подпитывается созданием новых абстракций для инкапсуляции сложных вещей в простые интерфейсы, что позволяет их повторно использовать намного быстрее и проще. А вот и высокоуровневые фреймворки: даже PyTorch - это высокоуровневый фреймворк поверх умножения матриц.

Но прежде чем мы углубимся в дизайн и принципы Catalyst, я хотел бы добавить краткие заметки еще о двух вещах, которые одинаковы для любого исследования глубокого обучения: метрики и помощники по инфраструктуре.

С моей точки зрения, метрики являются важной основой для исследования глубокого обучения - мы не смогли бы создать никаких новых методов, если бы не смогли правильно измерить их эффективность. Таким образом, создание единого API метрик с тестами, документами и примерами может внести значительный вклад в развитие сообщества.

Наконец, с появлением новых аппаратных ускорителей для экспериментов по глубокому обучению стало также критически важно иметь простые API-интерфейсы, позволяющие исследователям работать со сложными распределенными настройками и обучающими конвейерами. Что еще более важно, мы должны следить за вычислением наших метрик во время распределенного обучения и проверять их правильность.

Катализатор

Чтобы решить все вышеперечисленные проблемы, мы создали Catalyst - среду PyTorch для исследований и разработок в области глубокого обучения, ориентированную на быстрое экспериментирование, воспроизводимость и повторное использование кодовой базы. Он состоит из нескольких полезных абстракций:

Бегун

Начиная с самого начала Runner представляет собой абстракцию, которая берет на себя всю логику вашего эксперимента по глубокому обучению: данные, которые вы используете, модель, которую вы обучаете, логику пакетной обработки и все, что касается используемых метрик и систем мониторинга.

Runner играет важнейшую роль в соединении всех остальных абстракций и определении всей логики эксперимента в одном месте. Самое главное, это не заставляет вас использовать примитивы только для Catalyst. Это дает вам гибкий способ определения уровня высокоуровневого API, который вы хотите получить от фреймворка.

Например, вы можете:

Наконец, Runner архитектура не зависит от PyTorch, предоставляя указания по внедрению Tensorflow2 или JAX.
Поддерживаемые бегуны перечислены в разделе Runner API.

Двигатель

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

Благодаря дизайну движков легко адаптировать конвейер для различных аппаратных ускорителей. Например, вы можете легко поддерживать Распределенную установку PyTorch, Установку Nvidia-Apex или Распределенную установку AMP. Мы также работаем над поддержкой других аппаратных ускорителей, таких как DeepSpeed, Horovod или TPU.
За ходом разработки движков можно следить в разделе Engine API.

Перезвоните

Callback - это абстракция, которая помогает вам настраивать логику во время выполнения. Опять же, вы можете делать все что угодно с PyTorch и Catalyst в качестве оболочки для цикла. Однако благодаря обратным вызовам намного проще повторно использовать типичные расширения глубокого обучения, такие как метрики или уловки дополнения. Например, с ними гораздо удобнее определять нужные метрики: примеры ML - мультиклассовая классификация и ML - RecSys.

API обратного вызова повторяет основные циклы for в нашей абстракции цикла поезда:

Вы можете найти все поддерживаемые обратные вызовы в разделе Callback API.

Метрическая

Говоря о повторно используемых компонентах глубокого обучения, Catalyst также предоставляет Metric абстракцию для удобного вычисления показателей во время проведения эксперимента. Его API довольно прост:

Вы можете найти все поддерживаемые метрики в разделе Metric API.

Catalyst Metric API имеет методы update и compute по умолчанию для поддержки накопления статистики по каждому пакету и окончательного вычисления во время обучения. Все метрики также поддерживают update и compute расширения "ключ-значение" для удобного использования во время выполнения - это дает вам гибкость для хранения любого количества метрик или агрегатов, которые вы хотите, с помощью простого протокола связи для использования для их регистрации.

Регистратор

Наконец, говоря о ведении журнала, в последней версии Catalyst, 21.xx, мы объединили поддержку API системы мониторинга в одну абстракцию:

С таким простым API мы уже обеспечиваем интеграцию для систем мониторинга Tensorboard и MLFlow. Более продвинутые логгеры для Neptune и Wandb с хранением артефактов и гиперпараметров находятся в разработке благодаря совместному сотрудничеству наших команд.
Все поддерживаемые в настоящее время регистраторы можно найти в разделе Logger API.

Примеры

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

PyTorch way - декомпозиция цикла с помощью Catalyst

Перед примерами Python API я хотел бы упомянуть, что все абстракции Catalyst полностью совместимы с собственным PyTorch и могут использоваться как простая оболочка для цикла для лучшей структурирования вашего кода.

Python API - удобные для пользователя исследования и разработки в области глубокого обучения

Все приведенные выше примеры помогут вам написать полностью совместимый код PyTorch без каких-либо внешних примесей. Никаких специальных модулей или наборов данных не требуется - все работает изначально с кодовой базой PyTorch, а Catalyst связывает их вместе более читаемым и воспроизводимым способом.

Для более сложных примеров, таких как GAN, VAE или многоступенчатый запуск (еще одна уникальная особенность Catalyst), пожалуйста, следуйте нашему разделу с минимальными примерами.

Catalyst Python API поддерживает различные удобные для пользователя уловки, такие как overfit, fp16, ddp и другие, чтобы упростить вам отладку и ускорить ваши исследования и разработки. Чтобы узнать больше обо всех этих функциях, следуйте нашей .train документации. Небольшой пример для вашего интереса:

Config API - от исследования к производству

И последнее, но не менее важное: Catalyst поддерживает два расширенных API-интерфейса для удобных и удобных в эксплуатации НИОКР по глубокому обучению. С Config API и Hydra API исследования и разработки в области глубокого обучения становятся полностью воспроизводимыми благодаря использованию хранилища гиперпараметров YAML.

Примеры конфигурационных API можно найти здесь. Как видите, Config API полностью повторяет спецификацию Runner на основе YAML, что позволяет изменять любую часть эксперимента без каких-либо изменений кода.

Благодаря такому хранилищу гиперпараметров, также очень легко запустить оптимизацию гиперпараметров с catalyst-dl tune. Вы можете найти пример для catalyst-dl tune в разделе минимальных примеров Config API. И снова вы можете настроить любую часть эксперимента, изменив всего несколько строк в вашем YAML-файле. Вот и все, так просто.

За последние 3 года мы проделали огромную работу по ускорению исследований и разработок в области глубокого обучения в рамках экосистемы с исключительно открытым исходным кодом благодаря нашей команде и вкладу. В этом посте мы рассмотрели основные принципы разработки фреймворка и несколько минимальных примеров, чтобы вы могли ускорить глубокое обучение с помощью Catalyst и сделать его полностью воспроизводимым.

Если вас интересуют варианты использования Catalyst:

Если вас интересует разработка Catalyst:

Если вас мотивирует наше видение экосистемы Catalyst с открытым исходным кодом, вы можете поддержать нашу инициативу или написать напрямую на [email protected] для сотрудничества.