Развертывание моделей MLflow в подключенных конечных точках
ОБЛАСТЬ ПРИМЕНЕНИЯ: расширение машинного обучения Azure CLI версии 2 (текущее)
Из этой статьи вы узнаете, как развернуть модель MLflow в подключенной конечной точке для вывода в реальном времени. При развертывании модели MLflow в сетевой конечной точке не требуется указывать скрипт оценки или среду. Эта функция называется развертыванием без кода.
Для развертывания без кода Машинное обучение Azure:
- Динамически устанавливает пакеты Python, предоставляемые
conda.yaml
в файле. Поэтому зависимости устанавливаются во время выполнения контейнера. - Предоставляет базовый образ MLflow или курированную среду, содержащую следующие элементы:
azureml-inference-server-http
mlflow-skinny
- Скрипт оценки для вывода.
Совет
Рабочие области без доступа к общедоступной сети. Перед развертыванием моделей MLflow в сетевых конечных точках без подключения к исходящим данным необходимо упаковать модели (предварительная версия). Используя упаковку моделей, можно избежать необходимости подключения к Интернету, Машинное обучение Azure в противном случае потребуется динамически установить необходимые пакеты Python для моделей MLflow.
Пример
В этом примере показано, как развернуть модель MLflow в сетевой конечной точке для выполнения прогнозов. В примере используется модель MLflow, основанная на наборе данных диабета. Этот набор данных содержит 10 базовых переменных: возраст, секс, индекс массы тела, среднее кровяное давление и шесть измерений крови, полученных от 442 пациентов с диабетом. Он также содержит ответ на интерес, количественное измерение прогрессирования заболеваний в течение одного года после базового плана.
Модель была обучена с помощью scikit-learn
регрессии, и все необходимые предварительной обработки были упакованы в виде конвейера, что делает эту модель сквозным конвейером, который переходит от необработанных данных к прогнозам.
Сведения в этой статье основаны на примерах кода, имеющихся в репозитории azureml-examples. Чтобы выполнить команды локально без необходимости копирования и вставки YAML и других файлов, клонируйте репозиторий и измените каталоги cli
на , если вы используете Azure CLI. Если вы используете пакет SDK Машинное обучение Azure для Python, измените каталоги sdk/python/endpoints/online/mlflow
на .
git clone https://github.com/Azure/azureml-examples --depth 1
cd azureml-examples/cli
Следуйте инструкциям в Jupyter Notebook
Чтобы использовать пакет SDK для Python для Машинное обучение Azure, откройте модель Развертывания MLflow в записной книжке веб-конечных точек в клонированного репозитория.
Необходимые компоненты
Перед выполнением действий, описанных в этой статье, убедитесь, что выполнены следующие необходимые условия:
Подписка Azure. Если у вас еще нет подписки Azure, создайте бесплатную учетную запись, прежде чем начинать работу. Попробуйте бесплатную или платную версию Машинного обучения Azure.
Управление доступом на основе ролей Azure (Azure RBAC) используется для предоставления доступа к операциям в Машинном обучении Azure. Чтобы выполнить действия, описанные в этой статье, учетная запись пользователя должна быть назначена роль владельца или участника для рабочей области Машинное обучение Azure или настраиваемой роли
Microsoft.MachineLearningServices/workspaces/onlineEndpoints/*
. Дополнительные сведения о ролях см. в статье "Управление доступом к рабочей области Машинное обучение Azure".У вас должна быть модель MLflow, зарегистрированная в рабочей области. В этой статье регистрируется модель, обученная для набора данных диабета в рабочей области.
Кроме того, необходимо:
- Установите Azure CLI и
ml
расширение в Azure CLI. Дополнительные сведения об установке интерфейса командной строки см. в статье "Установка и настройка интерфейса командной строки( версия 2)".
- Установите Azure CLI и
Подключение к рабочей области
Сначала подключитесь к рабочей области Машинное обучение Azure, в которой вы будете работать.
az account set --subscription <subscription>
az configure --defaults workspace=<workspace> group=<resource-group> location=<location>
Регистрация модели.
Вы можете развернуть только зарегистрированные модели в сетевых конечных точках. В этом случае у вас уже есть локальная копия модели в репозитории, поэтому необходимо опубликовать модель только в реестре в рабочей области. Этот шаг можно пропустить, если модель, которую вы пытаетесь развернуть, уже зарегистрирована.
MODEL_NAME='sklearn-diabetes'
az ml model create --name $MODEL_NAME --type "mlflow_model" --path "endpoints/online/ncd/sklearn-diabetes/model"
Что делать, если модель была зарегистрирована внутри запуска?
Если модель была зарегистрирована внутри запуска, ее можно зарегистрировать напрямую.
Чтобы зарегистрировать модель, необходимо знать расположение, в котором он хранится. Если вы используете функцию MLflow autolog
, путь к модели зависит от типа и платформы модели. Необходимо проверить выходные данные заданий, чтобы определить имя папки модели. Эта папка содержит файл с именем MLModel
.
Если вы используете log_model
метод для ручной регистрации моделей, передайте путь к модели в качестве аргумента в метод. Например, если вы регистрируете модель, используя mlflow.sklearn.log_model(my_model, "classifier")
путь, в котором хранится classifier
модель.
Используйте интерфейс командной строки Машинное обучение Azure версии 2 для создания модели из выходных данных задания обучения. В следующем примере именованная $MODEL_NAME
модель регистрируется с помощью артефактов задания с идентификатором $RUN_ID
. Путем, где хранится модель, является $MODEL_PATH
.
az ml model create --name $MODEL_NAME --path azureml://jobs/$RUN_ID/outputs/artifacts/$MODEL_PATH
Примечание.
Путь $MODEL_PATH
— это расположение, где модель хранилась при выполнении.
Развертывание модели MLflow в сетевой конечной точке
Настройте конечную точку, в которой будет развернута модель. В следующем примере настраивается имя и режим проверки подлинности конечной точки:
Задайте имя конечной точки, выполнив следующую команду (замените
YOUR_ENDPOINT_NAME
уникальным именем):export ENDPOINT_NAME="<YOUR_ENDPOINT_NAME>"
Настройка конечной точки:
create-endpoint.yaml
$schema: https://azuremlschemas.azureedge.net/latest/managedOnlineEndpoint.schema.json name: my-endpoint auth_mode: key
Создание конечной точки:
az ml online-endpoint create --name $ENDPOINT_NAME -f endpoints/online/ncd/create-endpoint.yaml
Настройте развертывание. Развертывание представляет собой набор ресурсов, необходимых для размещения модели, которая выполняет процесс вывода.
sklearn-deployment.yaml
$schema: https://azuremlschemas.azureedge.net/latest/managedOnlineDeployment.schema.json name: sklearn-deployment endpoint_name: my-endpoint model: name: mir-sample-sklearn-ncd-model version: 2 path: sklearn-diabetes/model type: mlflow_model instance_type: Standard_DS3_v2 instance_count: 1
Примечание.
Автоматическое
scoring_script
создание иenvironment
поддерживается только дляpyfunc
вкуса модели. Сведения об использовании другого варианта модели см. в статье "Настройка развертываний модели MLflow".Создание развертывания:
az ml online-deployment create --name sklearn-deployment --endpoint $ENDPOINT_NAME -f endpoints/online/ncd/sklearn-deployment.yaml --all-traffic
Если у конечной точки нет подключения к исходящего трафика, используйте упаковку модели (предварительную версию), включив флаг
--with-package
:az ml online-deployment create --with-package --name sklearn-deployment --endpoint $ENDPOINT_NAME -f endpoints/online/ncd/sklearn-deployment.yaml --all-traffic
Назначьте весь трафик развертыванию. До сих пор конечная точка имеет одно развертывание, но ни один из его трафика не назначается.
Этот шаг не требуется в Azure CLI, так как вы использовали
--all-traffic
флаг во время создания. Если необходимо изменить трафик, можно использовать командуaz ml online-endpoint update --traffic
. Дополнительные сведения об обновлении трафика см. в статье о постепенном обновлении трафика.Обновите конфигурацию конечной точки:
Этот шаг не требуется в Azure CLI, так как вы использовали
--all-traffic
флаг во время создания. Если необходимо изменить трафик, можно использовать командуaz ml online-endpoint update --traffic
. Дополнительные сведения об обновлении трафика см. в статье о постепенном обновлении трафика.
Вызов конечной точки
Когда развертывание будет готово, его можно использовать для обслуживания запроса. Одним из способов тестирования развертывания является использование встроенной функции вызова в используемом клиенте развертывания. Следующий код JSON — это пример запроса для развертывания.
sample-request-sklearn.json
{"input_data": {
"columns": [
"age",
"sex",
"bmi",
"bp",
"s1",
"s2",
"s3",
"s4",
"s5",
"s6"
],
"data": [
[ 1.0,2.0,3.0,4.0,5.0,6.0,7.0,8.0,9.0,10.0 ],
[ 10.0,2.0,9.0,8.0,7.0,6.0,5.0,4.0,3.0,2.0]
],
"index": [0,1]
}}
Примечание.
input_data
используется в этом примере вместо inputs
этого в службе MLflow. Это связано с тем, что Машинное обучение Azure требует другого формата входных данных для автоматического создания контрактов swagger для конечных точек. Дополнительные сведения о ожидаемых форматах входных данных см. в разделе "Различия между моделями, развернутыми в Машинное обучение Azure и встроенном сервере MLflow".
Отправьте запрос в конечную точку следующим образом:
az ml online-endpoint invoke --name $ENDPOINT_NAME --request-file endpoints/online/ncd/sample-request-sklearn.json
Ответ будет выглядеть примерно, как следующий текст:
[
11633.100167144921,
8522.117402884991
]
Внимание
Для развертывания MLflow без кода тестирование через локальные конечные точки в настоящее время не поддерживается.
Настройка развертываний модели MLflow
Вам не нужно указывать скрипт оценки в определении развертывания модели MLflow в сетевой конечной точке. Однако вы можете сделать это и настроить способ выполнения вывода.
Обычно вам нужно настроить развертывание модели MLflow, когда:
- Модель не имеет на ней
PyFunc
вкус. - Необходимо настроить способ запуска модели, например, чтобы использовать конкретный вкус для загрузки модели с помощью
mlflow.<flavor>.load_model()
. - Необходимо выполнить предварительную или после обработки в подпрограмме оценки, когда она не выполняется самой моделью.
- Выходные данные модели не могут быть хорошо представлены в табличных данных. Например, это тензор, представляющий изображение.
Внимание
Если вы решили указать скрипт оценки для развертывания модели MLflow, вам также потребуется указать среду, в которой будет выполняться развертывание.
Шаги
Чтобы развернуть модель MLflow с помощью пользовательского скрипта оценки:
Определите папку, в которой находится модель MLflow.
a. Перейдите в Студию машинного обучения Azure.
b. Перейдите в раздел "Модели".
c. Выберите модель, которую вы пытаетесь развернуть и перейти на вкладку "Артефакты ".
d. Запишите отображаемую папку. Эта папка была указана при регистрации модели.
Создайте скрипт оценки. Обратите внимание, как имя
model
папки, которое вы ранее определили, входит в функциюinit()
.Совет
Следующий скрипт оценки представлен в качестве примера о том, как выполнять вывод с помощью модели MLflow. Этот скрипт можно адаптировать к вашим потребностям или изменить любую из его частей, чтобы отразить ваш сценарий.
score.py
import logging import os import json import mlflow from io import StringIO from mlflow.pyfunc.scoring_server import infer_and_parse_json_input, predictions_to_json def init(): global model global input_schema # "model" is the path of the mlflow artifacts when the model was registered. For automl # models, this is generally "mlflow-model". model_path = os.path.join(os.getenv("AZUREML_MODEL_DIR"), "model") model = mlflow.pyfunc.load_model(model_path) input_schema = model.metadata.get_input_schema() def run(raw_data): json_data = json.loads(raw_data) if "input_data" not in json_data.keys(): raise Exception("Request must contain a top level key named 'input_data'") serving_input = json.dumps(json_data["input_data"]) data = infer_and_parse_json_input(serving_input, input_schema) predictions = model.predict(data) result = StringIO() predictions_to_json(predictions, result) return result.getvalue()
Предупреждение
Рекомендации MLflow 2.0. Указанный сценарий оценки будет работать с MLflow 1.X и MLflow 2.X. Однако следует рекомендовать, что ожидаемые форматы входных и выходных данных в этих версиях могут отличаться. Проверьте определение среды, используемое для обеспечения использования ожидаемой версии MLflow. Обратите внимание, что MLflow 2.0 поддерживается только в Python 3.8+.
Создайте среду, в которой можно выполнить скрипт оценки. Так как модель является моделью MLflow, требования conda также указываются в пакете модели. Дополнительные сведения о файлах, включенных в модель MLflow, см . в формате MLmodel. Затем вы создадите среду с помощью зависимостей conda из файла. Однако необходимо также включить пакет
azureml-inference-server-http
, необходимый для сетевых развертываний в Машинное обучение Azure.Файл определения conda выглядит следующим образом:
conda.yml
channels: - conda-forge dependencies: - python=3.9 - pip - pip: - mlflow - scikit-learn==1.2.2 - cloudpickle==2.2.1 - psutil==5.9.4 - pandas==2.0.0 - azureml-inference-server-http name: mlflow-env
Примечание.
Пакет
azureml-inference-server-http
был добавлен в исходный файл зависимостей conda.Этот файл зависимостей conda будет использоваться для создания среды:
В конфигурации развертывания будет создана встроенная среда.
Создание развертывания:
Создайте файл конфигурации развертывания deployment.yml:
$schema: https://azuremlschemas.azureedge.net/latest/managedOnlineDeployment.schema.json name: sklearn-diabetes-custom endpoint_name: my-endpoint model: azureml:sklearn-diabetes@latest environment: image: mcr.microsoft.com/azureml/openmpi4.1.0-ubuntu22.04 conda_file: sklearn-diabetes/environment/conda.yml code_configuration: code: sklearn-diabetes/src scoring_script: score.py instance_type: Standard_F2s_v2 instance_count: 1
Создание развертывания:
az ml online-deployment create -f deployment.yml
После завершения развертывания он будет готов к выполнению запросов. Одним из способов тестирования развертывания является использование примера файла запроса вместе с методом
invoke
.sample-request-sklearn.json
{"input_data": { "columns": [ "age", "sex", "bmi", "bp", "s1", "s2", "s3", "s4", "s5", "s6" ], "data": [ [ 1.0,2.0,3.0,4.0,5.0,6.0,7.0,8.0,9.0,10.0 ], [ 10.0,2.0,9.0,8.0,7.0,6.0,5.0,4.0,3.0,2.0] ], "index": [0,1] }}
Отправьте запрос в конечную точку следующим образом:
az ml online-endpoint invoke --name $ENDPOINT_NAME --request-file endpoints/online/ncd/sample-request-sklearn.json
Ответ будет выглядеть примерно, как следующий текст:
{ "predictions": [ 11633.100167144921, 8522.117402884991 ] }
Предупреждение
Рекомендации MLflow 2.0: в MLflow 1.X
predictions
ключ будет отсутствует.
Очистка ресурсов
После завершения работы с конечной точкой удалите связанные с ней ресурсы:
az ml online-endpoint delete --name $ENDPOINT_NAME --yes