От артефактов к моделям в MLflow

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

В чем разница между артефактом и моделью?

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

Артефакт

Артефакт — это любой файл, созданный (и захваченный) из запуска или задания эксперимента. Артефакт может представлять модель, сериализованную как файл выбора, весы модели PyTorch или TensorFlow или даже текстовый файл, содержащий коэффициенты линейной регрессии. Некоторые артефакты также не могут иметь ничего общего с самой моделью; скорее, они могут содержать конфигурации для запуска модели или предварительной обработки сведений, а также примеров данных и т. д. Артефакты могут поступать в различных форматах.

Возможно, вы уже выполнили ведение журнала артефактов:

filename = 'model.pkl'
with open(filename, 'wb') as f:
  pickle.dump(model, f)

mlflow.log_artifact(filename)

Модель

Модель в MLflow также является артефактом. Однако мы делаем более сильные предположения об этом типе артефакта. Такие предположения обеспечивают четкий контракт между сохраненными файлами и их значением. При регистрации моделей в виде артефактов (простых файлов) необходимо знать, какой построитель моделей предназначен для каждого из этих файлов, чтобы узнать, как загрузить модель для вывода. Напротив, модели MLflow можно загрузить с помощью контракта, указанного в формате MLmodel.

В Машинном обучении Azure регистрация моделей обеспечивает следующие преимущества.

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

Вы можете записывать модели с помощью пакета SDK для MLflow:

import mlflow
mlflow.sklearn.log_model(sklearn_estimator, "classifier")

Формат MLmodel

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

На следующем снимке экрана показана папка модели MLflow в Студия машинного обучения Azure. Модель помещается в папку с именем credit_defaults_model. Для именования этой папки нет конкретных требований. Папка содержит MLmodel файл среди других артефактов модели.

A screenshot showing assets of a sample MLflow model, including the MLmodel file.

Следующий код — это пример того, как MLmodel выглядит файл для обученной fastai модели компьютерного зрения:

MLmodel

artifact_path: classifier
flavors:
  fastai:
    data: model.fastai
    fastai_version: 2.4.1
  python_function:
    data: model.fastai
    env: conda.yaml
    loader_module: mlflow.fastai
    python_version: 3.8.12
model_uuid: e694c68eba484299976b06ab9058f636
run_id: e13da8ac-b1e6-45d4-a9b2-6a0a5cfac537
signature:
  inputs: '[{"type": "tensor",
             "tensor-spec": 
                 {"dtype": "uint8", "shape": [-1, 300, 300, 3]}
           }]'
  outputs: '[{"type": "tensor", 
              "tensor-spec": 
                 {"dtype": "float32", "shape": [-1,2]}
            }]'

Вкусы модели

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

Следующий код является примером flavors раздела для fastai модели.

flavors:
  fastai:
    data: model.fastai
    fastai_version: 2.4.1
  python_function:
    data: model.fastai
    env: conda.yaml
    loader_module: mlflow.fastai
    python_version: 3.8.12

Подпись модели

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

Подписи указываются при регистрации моделей и сохраняются в signature разделе MLmodel файла. Функция автолога в MLflow автоматически заполняет подписи лучшим способом. Однако, возможно, вам придется вручную регистрировать модели, если выводимые сигнатуры не нужны. Дополнительные сведения см. в разделе "Как регистрировать модели с сигнатурами".

Есть два типа сигнатур:

  • Подпись на основе столбцов: эта сигнатура работает с табличными данными. Для моделей с этим типом подписи MLflow предоставляет pandas.DataFrame объекты в качестве входных данных.
  • Сигнатура на основе Tensor: эта сигнатура работает с многомерными массивами или тензорами. Для моделей с этой сигнатурой MLflow предоставляет numpy.ndarray в качестве входных данных (или словарь numpy.ndarray, если используются именованные тензоры).

Следующий пример соответствует модели компьютерного зрения, обученной с помощью fastai. Эта модель получает пакет изображений, представленных в виде тензоров формы (300, 300, 3) с их RGB-представлением (целые числа без знака). Модель выводит пакеты прогнозов (вероятностей) для двух классов.

MLmodel

signature:
  inputs: '[{"type": "tensor",
             "tensor-spec": 
                 {"dtype": "uint8", "shape": [-1, 300, 300, 3]}
           }]'
  outputs: '[{"type": "tensor", 
              "tensor-spec": 
                 {"dtype": "float32", "shape": [-1,2]}
            }]'

Совет

Машинное обучение Azure создает swagger-файл для развертывания модели MLflow с доступной подписью. Это упрощает тестирование развертываний с помощью Студия машинного обучения Azure.

Среда модели

Требования к запуску модели указываются в файле conda.yaml. MLflow может автоматически обнаруживать зависимости или вручную указывать их, вызывая mlflow.<flavor>.log_model() метод. Последний может быть полезен, если библиотеки, включенные в вашу среду, не являются теми, которые вы хотите использовать.

Следующий код является примером среды, используемой для модели, созданной с fastai помощью платформы:

conda.yaml

channels:
- conda-forge
dependencies:
- python=3.8.5
- pip
- pip:
  - mlflow
  - astunparse==1.6.3
  - cffi==1.15.0
  - configparser==3.7.4
  - defusedxml==0.7.1
  - fastai==2.4.1
  - google-api-core==2.7.1
  - ipython==8.2.0
  - psutil==5.9.0
name: mlflow-env

Примечание.

Какова разница между средой MLflow и средой Машинное обучение Azure?

Хотя среда MLflow работает на уровне модели, среда Машинное обучение Azure работает на уровне рабочей области (для зарегистрированных сред) или заданий или развертываний (для анонимных сред). При развертывании моделей MLflow в Машинном обучении Azure среда модели создается и используется для развертывания. Кроме того, можно переопределить это поведение с помощью интерфейса командной строки Машинное обучение Azure версии 2 и развернуть модели MLflow с помощью конкретной среды Машинное обучение Azure.

Прогнозная функция

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

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

Рабочие процессы для загрузки моделей MLflow

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

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

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

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

  • Загрузите те же объекты и типы, которые были зарегистрированы в журнале: вы можете загрузить модели с помощью пакета SDK MLflow и получить экземпляр модели с типами, принадлежащими библиотеке обучения. Например, модель ONNX возвращает ModelProto некоторое время, когда модель дерева принятия решений, обученная с помощью scikit-learn, возвращает DecisionTreeClassifier объект. Используется mlflow.<flavor>.load_model() для загрузки одного и того же объекта модели и типов, которые были зарегистрированы.

  • Загрузите модель для выполнения вывода: вы можете загрузить модели с помощью пакета SDK MLflow и получить оболочку, где MLflow гарантирует, что будет функция predict . Это не имеет значения, какой вкус вы используете, каждая модель MLflow имеет predict функцию. Кроме того, MLflow гарантирует, что эта функция может вызываться с помощью аргументов типа pandas.DataFrame, numpy.ndarrayили dict[string, numpyndarray] (в зависимости от сигнатуры модели). MLflow обрабатывает преобразование типов в тип ввода, который ожидает модель. Используется mlflow.pyfunc.load_model() для загрузки модели для выполнения вывода.