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

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

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

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

Принимая во внимание эти факты, многие предприятия создали свои собственные платформы для поддержки полного жизненного цикла разработки аналитических моделей, но, опять же, поддержание эффективной и преданной команды разработчиков и разработчиков платформы требует значительных затрат. Примерами таких платформ являются Tensorflow от Google, FBLearner от Facebook и Michaelangelo от Uber. Но и для этих платформ существует несколько проблем в виде

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

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

MLflow

Согласно документации MLflow

MLflow - это платформа с открытым исходным кодом для управления непрерывным жизненным циклом машинного обучения.

Философия дизайна MLflow - модульная и основанная на API. Его функционал разделен на 4 части.

  1. Отслеживание
  2. Проекты
  3. Модели
  4. Реестр

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

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

Отслеживание MLflow - это мета-хранилище MLflow и централизованное место для получения деталей модели. Он использует протокол HTTP для установления соединения между клиентским приложением и сервером отслеживания. Сервер отслеживания фиксирует приведенные ниже сведения о модели и использует внутренние хранилища для регистрации сущностей и артефактов.

  • Параметры регистрации
  • Версии кода
  • Метрики
  • Артефакты (модели и файлы данных)
  • Время начала и окончания пробега
  • Теги и примечания как дополнительная информация

По умолчанию серверные хранилища отслеживания MLflow используют локальную файловую систему и создают каталог mlruns для захвата объектов и артефактов.

файловая структура папки mlruns

Для производственного варианта использования MLflow предоставляет различные варианты хранения для хранения артефактов и метаданных.

Артефакты - › Amazon S3, Azure Blob, Google Cloud Storage, Databricks DBFS

Метаданные- › хранилище SQL (PostgresSQL, MySQL, SQL Lite, SQL Server и т. д.), схема плагинов MLflow для настраиваемого хранилища метаданных объектов и т. д.

2. Проекты

MLflow Project - это не что иное, как организованный и упакованный код для поддержки воспроизводимости модели. Чтобы организовать файл и папку проекта, MLflow предлагает файл с именем MLproject (файл YAML), который можно настроить в соответствии с требованиями проекта по науке о данных. В MLproject мы также можем настроить контейнер докеров и Kubernetes для выполнения проекта.

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

Типичный пример MLproject будет таким:

name: sklearn-demo
conda_env: conda.yaml
entry_points:
  model_run:
    parameters:
      max_depth: int
      max_leaf_nodes: {type: int, default: 32}
      model_name: {type: string, default: "tree-classification"}
      run_origin: {type: string, default: "default" }
    command: "python model_run.py -r {max_depth} {max_leaf_nodes}   {model_name}"

В приведенном выше примере среда conda определяется как conda.yaml, которая отвечает за установку зависимостей для проекта.

Шаги по созданию проекта MLflow

1- Создайте файл MLproject [определите точку входа в проект]

2- Создайте файл conda.yaml для всех зависимостей Python.

3- Создайте проект python и сохраните файл MLproject и conda.yaml в корневом каталоге (или в любом другом месте, где хранится основной исполнитель)

4- Отправьте проект python на GitHub

5- Протестируйте локальный проект, а также git hub

локальный тест → запуск mlflow. -P ‹param›

github test → mlflow run git: // ‹project-url› ‹param›

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

3. Модели

Модели определяют соглашение о сохранении модели машинного обучения в различных «вариантах».

Согласно документации

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

Другими словами, цели аромата -

  • Чтобы использовать один и тот же формат памяти для разных систем
  • Чтобы избежать накладных расходов на межсистемное взаимодействие (сериализация и десериализация)
  • Для обеспечения общих общих функций

Ароматизаторы обычно бывают двух типов -

  1. Встроенные варианты (доступны для всех популярных алгоритмов и библиотек машинного обучения)
  2. Индивидуальные вкусы

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

  • H2O
  • Керас
  • MLeap
  • PyTorch
  • Scikit-Learn
  • MLlib
  • Tensorflow
  • ONNX (обмен открытой нейронной сетью)
  • MXNET глюон
  • XGBoost
  • LightGBM

Собственный вкус

Возможно создание индивидуальной изюминки для модели.

Документация по созданию собственного вкуса Python.

После выполнения проекта mlflow в папке артефактов создается файл MLmodel. Ниже приведен пример того же для вкуса python_function.

artifact_path: decision-tree-classifier
flavors:
  python_function:
    data: model.pkl
    env: conda.yaml
    loader_module: mlflow.sklearn
    python_version: 3.6.5
  sklearn:
    pickled_model: model.pkl
    serialization_format: cloudpickle
    sklearn_version: 0.23.1
run_id: 10c75a05fb124eddbf2b13b458e9a26e
utc_time_created: '2020-06-19 11:53:55.328301'

4. Типовой реестр

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

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

  • Централизованное хранилище моделей: хранилище для зарегистрированной модели.
  • Происхождение модели: подробные сведения об эксперименте и запуске
  • Управление версиями модели. Следите за версиями зарегистрированной модели.
  • Этап модели. Каждой версии модели назначаются предварительно заданные или настраиваемые этапы, такие как Подготовка и Производство для представления жизненного цикла модели. Перед развертыванием модели в производственном приложении часто рекомендуется протестировать ее в промежуточной среде. Эта ссылка полезна для понимания рабочего процесса перехода между стадиями модели.
  • Операции CRUD с зарегистрированными моделями: создание, обновление, удаление, архивирование, перечисление, операции с моделями.

Создание проекта MLflow с нуля

Полный код можно найти на моем гитхабе. В GitHub я добавил демонстрационный проект mlflow, демонстрирующий scikit-learn и модель Keras . Однако в этом пошаговом руководстве я продемонстрирую проект scikit-learn и его выполнение.

Демонстрационный проект sklearn-demo имеет следующую структуру. Структура проекта может быть перестроена и реконфигурирована в соответствии с требованиями варианта использования. Это всего лишь пример.

Предварительное условие- Для воспроизведения примера ниже необходимы предварительные условия. Однако, если установлена ​​среда conda и указаны зависимости, она автоматически создает среду для выполнения проекта mlflow.

  • Требуемая версия python должна быть 3.5+
  • установите mlflow, numpy, pandas, scikit-learn, scikit-plot, matplotlib, seaborn.

Шаг 1-

создайте файл conda.yaml и MLproject.yaml для настройки проекта. Эти два файла являются важным аспектом компонента mlflow's Project и состоят из выполнения рабочих процессов, таких как точки входа, команда для выполнения, зависимости и т. Д.

conda.yaml

name: sklearn-demo
channels:
  - defaults
dependencies:
  - python=3.7.6
  - pip:
    - mlflow==1.8.0
    - numpy=1.18.5
    - pandas=1.0.4
    - scikit-learn==0.23.1
    - scikit-plot==0.3.7
    - matplotlib==3.2.1
    - seaborn==0.10.1

Файл conda.yaml довольно прост для понимания. name - это имя проекта, dependencies - это версия python, а pip перечисляет все библиотеки, необходимые для выполнения проекта.

MLproject.yaml

name: sklearn-demo
conda_env: conda.yaml
entry_points:
  model_run:
    parameters:
      max_depth: int
      max_leaf_nodes: {type: int, default: 32}
      model_name: {type: string, default: "tree-classification" }
      run_origin: {type: string, default: "default" }
    command: "python model_run.py -r {max_depth} {max_leaf_nodes} {model_name}"

MLproject также легко понять.

  • name: Любое название проекта
  • conda_env: это имя YAML-файла кондоминиума (у него должно быть то же самое имя файла conda, определенное выше).
  • entry_points: важный ключ в файле. Это точка выполнения кода. В разделе параметров мы можем определить все параметры командной строки, которые нам необходимо передать для выполнения основного скрипта. Мы можем установить значение по умолчанию, а также полагаться в этом на пользователей. Имя model_run может быть любым в соответствии с настройками проекта, по умолчанию - main.

Итак, наш проект готов двигаться дальше.

Шаг 2-

создать файл Python (prediction.py) внутри модуля моделей (его можно создать где угодно; просто чтобы сделать его модульным, я сохранил его внутри моделей).

Код довольно простой, давайте разберемся с ним шаг за шагом.

  • Создается класс TreeModel, который является классом-оболочкой для модели DecisionTreeClassifier. У класса есть один метод класса с именем create_instance, который принимает параметр для создания экземпляра DecisionTreeClassifier.
  • TreeModel также имеет 3 атрибута с именами данные, модель и параметры, которые предоставляют набор данных, модель и параметры загрузки для классификатора.
  • Итак, важным методом в классе TreeModel является mlflow_run. Этот метод делает многое для нас, чтобы фиксировать артефакты, показатели и графики. Использование контекста python также важно для получения всех необходимых показателей за один раз.

Эти методы важны для понимания и могут использоваться со всеми типами моделей.

mlflow.log_param (ключ, значение): регистрирует параметр в текущем запуске. Если нет активных прогонов, этот метод создаст новый активный прогон.

mlflow.log_params (params): регистрирует пакет параметров (словарь param_name) для текущего запуска. Если нет активных прогонов, этот метод создаст новый активный прогон.

mlflow.log_metric (key, value, step = None): регистрирует метрику модели для данного прогона. Если нет активных прогонов, этот метод создаст новый активный прогон.

mlflow.log_metrics (metrics, step = None): регистрирует несколько показателей для текущего запуска.

mlflow.log_artifact (local_path, artifacts_path = None): регистрирует локальный файл или каталог как артефакт текущего активного запуска. Если нет активных прогонов, этот метод создаст новый активный прогон.

mlflow.log_artifacts (local_path, artifacts_path = None): регистрирует локальный файл или каталог как артефакт текущего активного запуска. Если нет активных прогонов, этот метод создаст новый активный прогон.

Есть еще один модуль utils, который имеет некоторые общие функции (для построения матрицы путаницы и roc), используемые в проекте. Создайте файл utils.py с приведенным ниже содержимым.

Шаг 3-

На этом этапе мы создадим нашего главного исполнителя (model_run.py), который будет действовать как драйвер для записей mlflow.

model_run принимает гиперпараметры max_depth и выполняет TreeModel.

Вот и все. Все настроено, и мы готовы к работе !!!

Теперь, чтобы увидеть зарегистрированные сведения с помощью mlflow, мы можем выполнить нашу программу напрямую как python model_run.py или mlflow run. -P max_depth = 5 из командной строки.

Давайте посмотрим, как mlflow захватил все артефакты и метаданные. Есть много способов проверить зарегистрированные данные. Локально mlflow фиксирует все артефакты, происхождение и метрики внутри папки mlruns (я продемонстрировал и приложил скриншоты в начале учебника, объясняя теории). Но mlflow также поставляется с удобной командой пользовательского интерфейса, которая обогащает пользовательский интерфейс.

Перейдите в командную строку, перейдите в папку mlruns и введите

mlflow ui

локальный браузер http: //kubernetes.docker.internal: 5000 подскажет, и, щелкнув по нему, мы сможем изучить все полезные сведения о запуске машинного обучения.

Домашняя страница локального MLflow. Здесь регистрируется каждый запуск (индивидуальное выполнение кода, генерирующего папки и файлы) и эксперимент (название группы запусков).

Итак, давайте проверим первый запуск. Щелкните первый запуск, и появится страница ниже.

Если просто прокрутить немного вниз, мы увидим наши артефакты.

Кроме того, давайте проверим кривую ROC для этого эксперимента.

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

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

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

Некоторые особенности MLflow API

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

  • MLflow API касается не только Python, но на момент написания этого блога он также поддерживает языки программирования Java, и R. Скоро Scala также станет частью API. Также доступен REST API, который упрощает операции создания, списка и получения для экспериментов, запусков, регистрации параметров, показателей и артефактов.
  • Автоматическое ведение журнала стоит использовать для моделей глубокого обучения. Как мы знаем, модели глубокого обучения захватывают несколько параметров / гиперпараметров во время обучения модели, и каждое значение не всегда можно зарегистрировать с помощью mlflow.log_metric. Выполнение ручных захватов может привести к упущению некоторых важных показателей. Итак, чтобы упростить, MLflow поставляется с автоматическим ведением журнала. Он очень прост в использовании, и простое включение обеспечивает регистрацию и регистрацию всех возможных показателей. Функция Autolog доступна для Keras, Tensorflow, Gluon, LighGBM, XGBoost и Spark . Посетите документацию и мой github, чтобы увидеть, как он используется.
  • Отслеживание модели в локальной файловой системе хорошо для целей эксперимента. Чтобы отслеживать модель в производстве, рекомендуется сохранять все метаданные, данные, артефакты в облачном хранилище или базах данных SQL и использовать отдельный выделенный сервер для лучшего отслеживание и обслуживание.

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

Заключение

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

использованная литература

Https://papers.nips.cc/paper/5656-hidden-technical-debt-in-machine-learning-systems.pdf

Настоятельно рекомендуется 3 серии семинаров MLflow.

Https://www.youtube.com/playlist?list=PLTPXxbhUt-YWjDg318nmSxRqTgZFWQ2ZC

Www.mlflow.org

Https://databricks.com/product/managed-mlflow