Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
ОБЛАСТЬ ПРИМЕНЕНИЯ:
расширение машинного обучения Azure CLI версии 2 (текущее)
В этой статье показано, как развернуть модель MLflow в сетевой конечной точке для вывода в режиме реального времени. При развертывании модели MLflow в сетевой конечной точке не требуется указывать скрипт оценки или среду. Эта функция называется развертыванием без кода.
Для развертывания без кода с Azure Machine Learning:
- Динамически устанавливает пакеты Python, перечисленные в файле conda.yaml. В результате во время выполнения контейнера устанавливаются зависимости.
- Предоставляет базовый образ MLflow или курированную среду, содержащую следующие элементы:
- Пакет
azureml-inference-server-http - Пакет
mlflow-skinny - Скрипт оценки для вывода
- Пакет
Prerequisites
Подписка Azure. Если у вас нет подписки на Azure, создайте бесплатную учетную запись перед началом.
Учетная запись пользователя, которая имеет по крайней мере одну из следующих ролей управления доступом на основе ролей Azure (Azure RBAC):
- Роль владельца рабочей области Машинного обучения Azure
- Роль участника для рабочей области Машинного обучения Azure
- Пользовательская роль с
Microsoft.MachineLearningServices/workspaces/onlineEndpoints/*разрешениями
Дополнительные сведения см. в статье "Управление доступом к рабочим областям Azure машинного обучения".
Доступ к Машинному обучению Azure:
Установите Azure CLI и
mlрасширение в Azure CLI. Инструкции по установке см. в разделе "Установка и настройка интерфейса командной строки( версия 2)".
О примерe
В этом примере показано, как развернуть модель MLflow в сетевой конечной точке для выполнения прогнозов. В примере используется модель MLflow, основанная на наборе данных диабета. Этот набор данных содержит 10 базовых переменных: возраст, пол, индекс массы тела, среднее кровяное давление и 6 измерений крови, полученных от 442 пациентов с диабетом. Он также содержит ответ на интерес, количественное измерение прогрессирования заболеваний в течение одного года после даты базовых данных.
Модель была обучена с использованием scikit-learn регрессора. Все необходимые предварительные обработки упаковывается в виде конвейера, поэтому эта модель является сквозным конвейером, который переходит от необработанных данных к прогнозам.
Сведения в этой статье основаны на примерах кода из репозитория azureml-examples . Если клонировать репозиторий, вы можете выполнять команды в этой статье локально, не копируя или вставляя файлы YAML и другие файлы. Используйте следующие команды, чтобы клонировать репозиторий и перейти в папку для языка программирования:
git clone https://github.com/Azure/azureml-examples --depth 1
cd azureml-examples/cli
Следуйте инструкциям в Jupyter Notebook
Чтобы выполнить инструкции, описанные в этой статье, см. статью "Развертывание модели MLflow в записной книжке для сетевых конечных точек " в репозитории примеров.
Подключение к рабочей области
Подключитесь к рабочей области Машинного обучения Azure:
az account set --subscription <subscription-ID>
az configure --defaults workspace=<workspace-name> group=<resource-group-name> 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 можно создать модель из выходных данных задания обучения. Следующий код использует материалы задания с идентификатором $RUN_ID для регистрации модели с именем $MODEL_NAME.
$MODEL_PATH — это путь, который задание использует для хранения модели.
az ml model create --name $MODEL_NAME --path azureml://jobs/$RUN_ID/outputs/artifacts/$MODEL_PATH
Развертывание модели MLflow в сетевой конечной точке
Используйте следующий код, чтобы настроить режим имени и проверки подлинности конечной точки, в которой требуется развернуть модель:
Задайте имя конечной точки, выполнив следующую команду. Сначала замените
YOUR_ENDPOINT_NAMEуникальным именем.export ENDPOINT_NAME="<YOUR_ENDPOINT_NAME>"Чтобы настроить конечную точку, создайте файл YAML с именем 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Настройте развертывание. Развертывание представляет собой набор ресурсов, необходимых для размещения модели, которая выполняет процесс вывода.
Создайте файл 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: 1Note
Автоматическое создание
scoring_scriptиenvironmentподдерживается только для варианта моделиPyFunc. Сведения об использовании другого варианта модели см. в статье "Настройка развертываний модели MLflow".Создайте развертывание:
az ml online-deployment create --name sklearn-deployment --endpoint $ENDPOINT_NAME -f endpoints/online/ncd/sklearn-deployment.yaml --all-trafficaz ml online-deployment create --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команду. Дополнительные сведения об обновлении трафика см. в разделе "Постепенное обновление трафика".
Вызов конечной точки
Когда развертывание будет готово, можно использовать его для обслуживания запросов. Одним из способов тестирования развертывания является использование встроенной функции вызова в клиенте развертывания. В репозитории примеров файл sample-request-sklearn.json содержит следующий код 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]
}}
Note
Этот файл использует ключ input_data вместо inputs, который используется службой MLflow. Машинное обучение Azure требует другого формата ввода, чтобы автоматически создавать контракты Swagger для конечных точек. Для получения дополнительной информации об ожидаемых форматах входных данных см. Развертывание на встроенном сервере MLflow и развертывание на сервере для инференса в Azure Machine Learning.
Отправьте запрос в конечную точку:
az ml online-endpoint invoke --name $ENDPOINT_NAME --request-file endpoints/online/ncd/sample-request-sklearn.json
Ответ должен быть похож на следующий текст:
[
11633.100167144921,
8522.117402884991
]
Important
Для MLflow no-code-deployment тестирование с помощью локальных конечных точек в настоящее время не поддерживается.
Настройка развертываний модели MLflow
Вам не нужно указывать скрипт оценки в определении развертывания модели MLflow в сетевой конечной точке. Но можно указать скрипт оценки, если вы хотите настроить процесс вывода.
Обычно требуется настроить развертывание модели MLflow в следующих случаях:
- Модель не имеет вкуса
PyFunc. - Необходимо настроить способ запуска модели. Например, необходимо использовать
mlflow.<flavor>.load_model()для загрузки модели определённой версии. - У вас необходимо выполнять предварительную или последующую обработку в процессе оценки, поскольку модель не делает эту обработку.
- Выходные данные модели не могут быть хорошо представлены в табличных данных. Например, выходные данные — это тензор, представляющий изображение.
Important
Если указать скрипт оценки для развертывания модели MLflow, необходимо также указать среду, в которой выполняется развертывание.
Развертывание пользовательского скрипта оценки
Чтобы развернуть модель MLflow, использующую пользовательский скрипт оценки, выполните действия, описанные в следующих разделах.
Определение папки модели
Определите папку, содержащую модель MLflow, выполнив следующие действия:
Перейдите к Студия машинного обучения Azure.
Перейдите в раздел "Модели".
Выберите модель, которую вы хотите развернуть, и перейдите на вкладку "Артефакты ".
Запишите отображаемую папку. При регистрации модели укажите эту папку.
Создайте сценарий оценки
В следующем скрипте оценки score.py приведен пример выполнения вывода с моделью MLflow. Этот скрипт можно адаптировать к вашим потребностям или изменить любую из его частей, чтобы отразить ваш сценарий. Обратите внимание, что имя папки, которое вы ранее определили, modelвключается в функцию init() .
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()
Warning
Рекомендации 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.yaml, содержащий следующие строки:
channels:
- conda-forge
dependencies:
- python=3.12
- pip
- pip:
- mlflow
- scikit-learn==1.7.0
- cloudpickle==3.1.1
- psutil==7.0.0
- pandas==2.3.0
- azureml-inference-server-http
name: mlflow-env
Note
В разделе dependencies этого файла conda содержится пакет azureml-inference-server-http.
Используйте этот файл зависимостей conda для создания среды:
В конфигурации развертывания создается встроенная среда.
Создайте развертывание
В папке endpoints/online/ncd создайте файл конфигурации развертывания 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.yaml
code_configuration:
code: sklearn-diabetes/src
scoring_script: score.py
instance_type: Standard_F2s_v2
instance_count: 1
Создайте развертывание:
az ml online-deployment create -f endpoints/online/ncd/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": [
1095.2797413413252,
1134.585328803727
]
}
Warning
Рекомендации по MLflow 2.0: в MLflow 1.X ответ не содержит ключа predictions.
Очистка ресурсов
Если конечная точка больше не нужна, удалите связанные с ней ресурсы:
az ml online-endpoint delete --name $ENDPOINT_NAME --yes