Компания, в которой работает Том, хочет разбогатеть, поэтому его босс просит его использовать свои недавно приобретенные знания (3-дневный семинар) о машинном обучении (ML), чтобы спрогнозировать курс акций Apple в следующие 2 года (это невозможно », Не пытайтесь это сделать!). Но позвоните мне, если у вас все получится ...

Он начинает свой амбициозный проект и делает следующее:

  1. Он создает веб-скребок для сбора всех необходимых данных и сохраняет их локально на своей машине.
  2. Он слышал много хорошего о XGBoost, поэтому решил использовать его.
  3. Он запускает несколько экспериментов, чтобы найти наилучшие параметры для своей модели.
  4. Том и его босс довольны результатами, и они решают запустить торгового бота (с бюджетом 200 тыс.) В производство.

Через несколько недель New York Times публикует отчет, в котором показано, что Apple шпионила за всеми своими пользователями, и стоимость акций Apple резко упала. Торговый бот теряет все свои деньги, и босс Тома возмущается. «Как ты мог этого не предсказать?», - спрашивает он Тома. Поскольку Том не может ответить на этот вопрос, его заменяет Дэвид. Дэвид - опытный инженер по машинному обучению и шокирован состоянием проекта.

Том, не использовал git для версии своего кода. Все данные находятся на его локальном жестком диске, и он никогда раньше не слышал о CI / CD, поэтому Дэвиду нужно начинать с нуля. Как мы можем сделать это лучше для всех на этот раз?

Почему MLOps?

Основная цель MLOps - сделать жизнь всех инженеров ML в проекте максимально приятной. Коммуникация должна быть ясной (кто, что и когда делал?), А пробовать новые вещи и выпускать их должны быть как можно проще. В следующей части мы поговорим о том, как этого добиться.

1. Отслеживание всего

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

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

Данные

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

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

Git + DVC

Каждый разработчик знает Git. Однако вы, вероятно, не слышали о DVC (Data Version Control). Он построен на основе git и является идеальной комбинацией для управления версиями вашего кода и данных. Вы можете сохранить свои данные где угодно в облаке. Поддерживаются Amazon S3, Microsoft Azure Blob Storage, Google Drive и другие. Я настоятельно рекомендую их страницу Начало работы, если вы хотите непосредственно погрузиться в код.

Git + DVC - это все, что вам нужно для управления версиями вашего кода и данных!

Эксперименты

После написания кода, получения данных и их версии, мы можем начать с забавных вещей, связанных с машинным обучением. Теперь нам нужно выбрать алгоритм машинного обучения и начать обучение. Чтобы избежать повторения одного и того же эксперимента и сделать его прозрачным для всех в команде, нам понадобится хороший способ документировать наши эксперименты. Именно здесь на помощь приходит mlflow Tracking.

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

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

2. Конвейер сборки и развертывания

Это также называется CI / CD и означает «непрерывная интеграция / непрерывная доставка».

Целью CI / CD является автоматическая сборка, тестирование и безопасное развертывание вашего приложения, чтобы вы могли быстро выполнять итерацию при разработке нового программного обеспечения.

Здесь я хочу сосредоточиться на CI / CD в контексте машинного обучения. Если вы хотите прочитать об этом в более общем смысле, я очень рекомендую эту статью.

ML - это микросервис, а Docker - потрясающий

Микросервис - это программный компонент, обладающий следующими свойствами:

  • Он делает ровно одну вещь, и делает это хорошо.
  • Он не имеет гражданства.
  • Имеет REST API для связи.

Если вы хотите легко создать микросервис, вам следует использовать Docker. Это позволяет вам поместить ваше приложение в контейнер. Это означает, что вы можете быть уверены, что он работает одинаково в любой среде (есть некоторые исключения). Это похоже на маленькую виртуальную машину для вашего приложения.

Ваша обученная модель будет в центре контейнера. Вы получите входные данные модели через REST API, а выходными данными будет прогноз модели.

Когда вы довольны своим микросервисом, вы можете создать его и отправить в реестр образов Docker. Это в основном похоже на GitHub для ваших микросервисов.

Непрерывная интеграция

При создании микросервиса вы создаете образ Docker. Это шаблон, который сообщает Docker, как именно построить микросервис из вашего кода. Здесь вы можете запустить часть CI (непрерывная интеграция) парадигмы CI / CD.

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

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

Непрерывное развертывание

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

Запуск нескольких микросервисов

Часто в производстве у вас есть несколько микросервисов (контейнеров), работающих вместе, которые также должны взаимодействовать друг с другом. Здесь вам понадобится оркестратор контейнеров. Kubernetes - отличный инструмент для этого. За несколько минут вы можете создать работающий кластер Kubernetes на Google Cloud Platform или Azure.

Мониторинг

Чтобы следить за своим приложением, вам нужна хорошая система мониторинга. В производственной среде вы хотите убедиться, что ваша модель предсказывает вещи, которые имеют смысл. Ваша система регистрации должна включать информацию о входных данных модели и прогнозируемых выходных данных. Есть общие решения, которые можно использовать для мониторинга. Мне особенно понравился инструмент ELK stack от Elastic. Он имеет несколько очень хороших инструментов визуализации и хорошо масштабируется. (Вероятно, это перебор, если у вас небольшая система микросервисов).

Переобучение нашей модели

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

Заключение

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

Если у вас есть вопросы, вы можете найти меня здесь: