Разрыв между Jupyter Notebook и запуском моделей машинного обучения в производственной среде может быть… серьезным. На самом деле это одна из самых серьезных проблем, с которыми сегодня сталкиваются многие компании.

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

«Каждую неделю мы обучаем сотни моделей оценки недвижимости».

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

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

Какой стек использовать?

Есть много инструментов для развертывания конвейеров машинного обучения. Выбор, очевидно, будет зависеть от вашего приложения, но я обнаружил, что сочетание Spark, Luigi, Docker и Jenkins и Kubernetes очень хорошо работает в разнообразные сценарии.

  • Spark: отлично подходит для обработки данных, обучения моделей (с Spark ML) и легко интегрируется с H2O (SparklingWater) для обучения мощных моделей искусственного интеллекта - это то, что мы используем, например, для всех наших моделей оценки собственности.
  • Луиджи: модуль Python для построения сложных конвейеров пакетных заданий. Он поддерживает Hadoop, поэтому вы можете запускать запросы Hive, задания Spark или просто локальный файл. Еще один популярный инструмент - Airflow, разработанный Airbnb и поддерживаемый Apache.
  • Докер: инструмент для упаковки зависимостей и кода.
  • Jenkins: используется для непрерывной сборки и тестирования ваших программных проектов, что упрощает внесение изменений в проект. В нашем случае он используется для запуска обучения моделей, развертывания моделей, а также запуска краудсорсинговых заданий для мониторинга показателей качества.
  • Обучение. Google Compute Engine содержит несколько оптимизированных для контейнеров образов виртуальных машин. Amazon также предлагает AWS Batch, на котором вы можете запускать свои контейнеры.
  • Хранилище: все возможности Google Storage, Amazon S3 или Nexus. В нашем случае мы в основном используем Google Storage.
  • Kubernetes: идеален при запуске продакшн сервисов. На нем работает большинство наших сервисов.

Переучивайте свои модели - часто

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

В нашем случае мы разработали процесс Jenkins, который запускает обучение моделей. Необходимо изменить только файл спецификации Jenkins. Если обучение является повторяющимся процессом, то фактически нет необходимости изменять файл Jenkins.

  1. Обновите задание Jenkins (требует очень мало / совсем не требует ручной работы)
  2. Дженкинс создает образ докера
  3. Луиджи руководит процессом обучения, который включает:
  • Получение данных из Google Cloud Storage или S3
  • Обработка данных с помощью PySpark
  • Обучайте модели с помощью h2O, Tensorflow…
  • Создание показателей производительности (точность, ROC и т. Д.)

4. Храните модели, а также показатели производительности в S3 / Google Cloud Storage.

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

Примечания:

  • Docker помогает, потому что вы можете запустить его локально для отладки или на ранней стадии фазы обучения.
  • Луиджи поможет, если вам нужно выполнить сложные / трудоемкие задания.

Развертывайте свои модели - легко

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

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

Здесь снова при развертывании наших моделей будет использоваться Jenkins. Мы рассмотрим обычный случай создания нашей собственной службы Api с использованием Flask и Gunicorn для получения результатов прогнозирования.

Помните, что наши модели хранятся в Google Cloud Storage / S3, поэтому процесс прост:

  1. Изменение файла зависимости в нашем Git Repo вызовет нашу работу Jenkins
  2. Jenkins создает образ Docker с учетом зависимостей нашей новой модели, указанных в файле git.
  3. Проводите регулярные тесты
  4. Луиджи проводит тесты производительности:
  • Загрузите набор тестов из Google Cloud Storage / AWS SE
  • Обработайте набор данных с помощью PySpark
  • Протестируйте модели на этом наборе данных и создайте отчеты о производительности.

5. Если тесты достаточно хороши, разверните в Kubernetes

Примечания:

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

Следите за своими моделями

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

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

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

Резюме

Масштабное развертывание моделей машинного обучения не сильно отличается от обычных конвейеров обработки данных.

Я бы порекомендовал поработать над конвейером обучения вашей модели заранее с помощью Jenkins и Luigi / Airflow, чтобы ваш продукт соответствовал потребностям бизнеса. Вы оба сэкономите драгоценное время и улучшите свои модели машинного обучения в производственной среде, которая часто - очень - отличается от вашей обычной среды обучения.