От артефактов к моделям в 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
файл среди других артефактов модели.
Следующий код — это пример того, как 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()
для загрузки модели для выполнения вывода.