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

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

Традиционный подход

Наиболее распространенная практика, которую я видел в различных проектах и ​​организациях, как правило, такова:

Для проведения всех экспериментов, необходимых для исследования данных, настройки модели, инструменты или платформы, такие как Jupyter Notebook, блокноты Databricks и другие, используются специалистами по обработке и анализу данных после того, как модель обучена, преобразована с правильными параметрами и сохранена в виде артефакта (например, pickle), код фиксируется в репозитории git, и начинается работа по обработке данных.

с этого момента инженер данных должен:

  • Создайте конвейер данных, создав сценарии обучения и автоматизации (train.py и predict.py).
  • Разработайте стратегию развертывания, например архитектуру микросервисов с различными сервисами: вывод, подготовка данных…
  • Создайте конвейер CI/CD с правильными тестами автоматизации на основе машинного обучения.
  • Мониторинг проектной модели для отслеживания изменений концепций
  • Подберите аппаратное обеспечение, необходимое для проведения логического вывода и обучения.

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

Новый подход

Идея этого поста — продемонстрировать пример упрощенного развертывания и обучения машинному обучению с использованием комбинации двух платформ машинного обучения: Kedro и cortex.dev с минимальным объемом кода.

Что такое Кедро? Kedro — это платформа Python с открытым исходным кодом для создания воспроизводимого, поддерживаемого и модульного кода для обработки данных. Он заимствует концепции из разработки программного обеспечения и применяет их к коду машинного обучения; прикладные концепции включают модульность, разделение задач и управление версиями.

Что такое Cortex? Cortex — это платформа с открытым исходным кодом для крупномасштабных рабочих нагрузок логического вывода. Она имеет следующие возможности: Поддерживает развертывание TensorFlow, PyTorch и других моделей в виде API-интерфейсов в реальном времени или пакетных операций.
Обеспечивает высокую доступность с зонами доступности и автоматическим перезапуском экземпляров.< br /> Выполняет вывод на инстансах по запросу или спотовых инстансах с резервными копиями по запросу.
Автоматическое масштабирование для обработки производственных рабочих нагрузок с поддержкой избыточного выделения ресурсов.

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

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

новая архитектура будет выглядеть примерно так:

Одной из особенностей Kedro является разбиение шагов ML на узлы и пайплайны, как правило, существует

Конвейер Data Engineering: для обработки данных, извлечения признаков, нормализации, кодирования…

Конвейер Data Science: разделение данных на обучающие и тестовые наборы, разработка моделей, оценка

Cortex, с другой стороны, заботится о создании и развертывании модели, созданной конвейером Kedro, с использованием оператора cortex. Он создает кластер kubernetes либо в AWS, либо в GCP, используя простой файл описания инфраструктуры:

region: us-east-1
instance_type: t2.medium
min_instances: 5
max_instances: 10
spot: true

он также создает балансировщик нагрузки для распределения выводов по всем узлам кластера и шлюз API для обслуживания ответов API.

Пример: продолжительность поездки на такси в Нью-Йорке.

Я буду использовать набор данных kaggle, который имеет следующую структуру данных:

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

Учитывая, что у нас есть значительный объем обучающих данных (1458645 строк), и в данных нет разреженности или уменьшения размера, я буду использовать lightgbm для этого доказательства концепции.

Создание узлов и конвейеров

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

в нашем случае узел будет представлять такие задачи, как:

  • извлечение признаков: час дня, день месяца, месяц года
  • Разделить данные: обучающие и тестовые наборы
  • train model: обучение с использованием lightgbm
  • оценка модели: расчет показателей

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

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

Вот код для обоих конвейеров, для запуска проекта вы можете изменить каталог на ny_cab_trip_duration_kedro_training и выполнить команду:

ny_cab_trip_duration_kedro_training$ Kedro run
2021-01-19 19:35:43,309 - kedro.io.data_catalog - INFO - Loading data from `trips_train` (CSVDataSet)...
2021-01-19 19:35:46,316 - kedro.pipeline.node - INFO - Running node: extract_features: extract_features([trips_train]) -> [extract_features]
2021-01-19 19:36:24,834 - numexpr.utils - INFO - Note: NumExpr detected 12 cores but "NUMEXPR_MAX_THREADS" not set, so enforcing safe limit of 8.
2021-01-19 19:36:24,834 - numexpr.utils - INFO - NumExpr defaulting to 8 threads.
2021-01-19 19:39:27,635 - kedro.io.data_catalog - INFO - Saving data

Это запустит все узлы, описанные выше, и сгенерирует файл модели:

Развертывание модели с помощью Cortex

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

  • Создайте кластер облачного развертывания
  • Разверните модель

Создайте облачный кластер Kubernetes:

$cortex cluster  up -c  basic-cluster.yaml --aws-key AKIA3KH6IPR6WOSYNHVU --aws-secret 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
○ creating a new s3 bucket: cortex-6a2d11117c ✓
○ creating a new cloudwatch log group: cortex ✓
○ creating cloudwatch dashboard: cortex ✓
○ creating api gateway: cortex ✓
○ spinning up the cluster (this will take about 15 minutes) ...

В конце выполнения:

[✔]  EKS cluster "cortex" in "us-east-1" region is ready
○ updating cluster configuration ✓
○ configuring networking (this might take a few minutes) ✓
○ configuring autoscaling ✓
○ configuring logging ✓
○ configuring metrics ✓
○ starting operator ✓
○ waiting for load balancers ............................................................................ ✓
○ downloading docker images ✓
cortex is ready!
operator:          a1bcbfeb26cef442e92bbcd0daffbf42-01a64d913ebbf7b6.elb.us-east-1.amazonaws.com
api load balancer: a8e87f75709de4e96bbc3871b8ef9ceb-a6ec41dfe22e0c12.elb.us-east-1.amazonaws.com
api gateway:       https://g06o0hssmj.execute-api.us-east-1.amazonaws.com

Развертывание модели

Примечание. Я скопировал модель, созданную конвейером Kedro, в S3 в s3://cortex-6a2d11117c/tmp/.

Сначала мы создаем описательный YAML модели:

- name: trip-estimator
  kind: RealtimeAPI
  predictor:
    type: python
    path: predictor.py
    config:
      model: s3://cortex-6a2d11117c/tmp/
  monitoring:
    model_type: regression

Развернуть его так же просто, как:

cortex-trip-estimator$ cortex deploy trip_estimator.yaml
using aws environment
updating trip-estimator (RealtimeAPI)
cortex get                  (show api statuses)
cortex get trip-estimator   (show api info)
cortex logs trip-estimator  (stream api logs)

Чтобы убедиться, что API развернут:

cortex get
env   realtime api     status   up-to-date   requested   last update   avg request   2XX
aws   trip-estimator   live     1            1           12m16s        -             -

Использование API

Я создал небольшой скрипт для тестирования API:

import requests
endpoint = "https://g06o0hssmj.execute-api.us-east-1.amazonaws.com/trip-estimator"
payload = {
    "input1":2.0,
    "input2":6.0,
    "input3":-73.96147155761719,
    "input5":40.774391174316406,
    "input6":-73.9537124633789,
    "input7":40.77536010742188,
    "input8":0.6621858468807331,
    "input9":0.007819358973817251,
    "input10":0.007788946222373263,
    "input11":6.0,
    "input12":23.0,
    "input13":33.0,
    "input14":0.0,
    "input15":3.0,
    "input16":0.0,
    "input17":0.0
}
prediction = requests.post(endpoint, payload)
trip_duration = str(prediction.content,'utf-8')
print("Trip duration is : ", trip_duration)

Запустите скрипт:

python consume.py

и вуаля!

cortex-trip-estimator$ python consume.py
Trip duration is :  5.252568735167378

Вывод

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

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