Как превратить обычный скрипт Pytorch в масштабируемую DAG d6tflow для ускорения исследований и разработок

Введение: Зачем беспокоиться?

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

В разделе 4 причины, почему ваш код машинного обучения плохой мы рассмотрели, как организовать код машинного обучения как рабочие процессы DAG для решения этой проблемы. В этом руководстве мы рассмотрим практический пример превращения существующего скрипта pytorch в масштабируемый конвейер глубокого обучения с помощью d6tflow. Отправной точкой является модель глубоких рекомендаций pytorch от Facebook, и мы пройдем 5 шагов по переносу кода в масштабируемый конвейер глубокого обучения. Шаги ниже написаны в частичном псевдокоде для иллюстрации концепций, полный код также доступен, смотрите инструкции в конце статьи.

Давайте начнем!

Шаг 1. Спланируйте свою группу обеспечения доступности баз данных

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

Ниже представлена ​​модель Pytorch, обучающая DAG для модели рекомендации глубокого обучения Facebook (DLRM). Он показывает обучающую задачу TaskModelTrain со всеми ее зависимостями и тем, как зависимости связаны друг с другом. Если вы пишете функциональный код, трудно увидеть, как ваш рабочий процесс совмещается вот так.

Шаг 2: Пишите задачи вместо функций

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

  • связывать задачи в DAG, чтобы необходимые зависимости запускались автоматически
  • легко загружать входные данные задачи из зависимостей
  • легко сохранять выходные данные задачи, такие как предварительно обработанные данные и обученные модели. Таким образом, вы случайно не перезапустите длительные обучающие задачи.
  • параметризовать задачи, чтобы ими можно было разумно управлять (см. следующий шаг)
  • сохранять выходные данные в d6tpipe, чтобы отделить данные от кода и легко обмениваться данными, см. 10 основных ошибок кодирования, совершаемых специалистами по данным

Вот как выглядит код «до/после» для кода Facebook DLRM после преобразования функционального кода в задачи d6tflow.

Типичный функциональный код Pytorch, который плохо масштабируется:

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

Шаг 3. Параметризация задач

Чтобы улучшить производительность модели, вы попробуете разные модели, параметры и настройки предварительной обработки. Чтобы все это отслеживать, вы можете добавлять параметры к задачам. Таким образом вы можете:

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

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

Сравните обученные модели

Теперь вы можете использовать этот параметр для простого сравнения выходных данных разных моделей. Перед загрузкой выходных данных задачи убедитесь, что вы запускаете рабочий процесс с этим параметром (см. Шаг 4).

Наследовать параметры

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

В рабочем процессе Facebook DLRM TaskModelTrain наследует параметры от TaskGetTrainDataset. Таким образом, вы можете запустить TaskModelTrain(mini_batch_size=2), и он передаст параметр вышестоящим задачам, т.е. TaskGetTrainDataset и всем другим задачам, которые от него зависят. В реальном коде обратите внимание на использование self.clone(TaskName) и @d6tflow.clone_parent.

Шаг 4. Запустите DAG для обработки данных и обучения модели

Чтобы начать обработку данных и обучение модели, вы запускаете DAG. Вам нужно только запустить терминальную задачу, которая автоматически запускает все зависимости. Прежде чем запустить DAG, вы можете просмотреть, что будет запущено. Это особенно полезно, если вы внесли какие-либо изменения в код или данные, поскольку будут выполняться только измененные задачи, а не весь рабочий процесс.

Шаг 5. Оцените производительность модели

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

Сравнить модели

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

Продолжайте повторять

По мере повторения, изменения параметров, кода и данных вам потребуется повторно запускать задачи. d6tflow интеллектуально определяет, какие задачи необходимо перезапустить, что делает итерацию очень эффективной. Если вы изменили параметры, вам ничего не нужно делать, он будет знать, что запускать автоматически. Если вы изменили код или данные, вы должны пометить задачу как незавершенную с помощью .invalidate(), а d6tflow сделает все остальное.

Например, в рабочем процессе Facebook DLRM вы изменили данные обучения или внесли изменения в предварительную обработку обучения.

Полный исходный код

Весь код предоставлен на https://github.com/d6tdev/dlrm. Это то же самое, что и https://github.com/facebook/dlrm с добавлением файлов d6tflow:

  • flow_run.py: запустить поток => запустить этот файл
  • flow_task.py: код задачи
  • flow_viz.py: показать вывод модели
  • flow_cfg.py: параметры по умолчанию
  • dlrm_d6t_pytorch.py: dlrm_data_pytorch.py ​​адаптирован для d6tflow

Попробуйте себя!

Для вашего следующего проекта

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

Для новых проектов вы можете начать с масштабируемого шаблона проекта с https://github.com/d6t/d6tflow-template. Структура очень похожа:

  • run.py: запустить рабочий процесс
  • task.py: код задачи
  • cfg.py: управлять параметрами