Развертывание моделей MLflow в пакетных развертываниях в Машинное обучение Azure
ОБЛАСТЬ ПРИМЕНЕНИЯ:Расширение машинного обучения Azure CLI версии 2 (current)
Python SDK azure-ai-ml версии 2 (current)
В этой статье описывается, как развернуть модели MLflow для Машинное обучение Azure для вывода пакетной службы с помощью конечных точек пакетной службы. При развертывании моделей MLflow в конечных точках пакетной службы Машинное обучение Azure выполняет следующие задачи:
- Предоставляет базовый образ MLflow или курированную среду, содержащую необходимые зависимости для запуска Машинное обучение пакетного задания.
- Создает конвейер пакетного задания с скриптом оценки, который можно использовать для обработки данных с помощью параллелизации.
Дополнительные сведения о поддерживаемых типах входных файлов и сведения о том, как работает модель MLflow, см . в рекомендациях по развертыванию в пакетном выводе.
Необходимые компоненты
Подписка Azure. Если у вас еще нет подписки Azure, создайте бесплатную учетную запись, прежде чем начинать работу.
Рабочая область Машинного обучения Azure. Сведения о создании рабочей области см. в разделе "Управление Машинное обучение Azure рабочих областей".
Следующие разрешения в рабочей области Машинное обучение Azure:
- Для создания конечных точек и развертываний пакетной службы или управления ими используйте роль владельца, участника или настраиваемую роль, назначаемую
Microsoft.MachineLearningServices/workspaces/batchEndpoints/*
разрешениями. - Для создания развертываний Azure Resource Manager в группе ресурсов рабочей области: используйте владельца, участника или настраиваемую роль,
Microsoft.Resources/deployments/write
назначаемую разрешением в группе ресурсов, в которой развернута рабочая область.
- Для создания конечных точек и развертываний пакетной службы или управления ими используйте роль владельца, участника или настраиваемую роль, назначаемую
Интерфейс командной строки Машинное обучение Azure или пакет SDK Машинное обучение Azure для Python:
Выполните следующую команду, чтобы установить Azure CLI и
ml
расширение для Машинное обучение Azure:az extension add -n ml
Развертывания компонентов конвейера для конечных точек пакетной службы представлены в версии 2.7
ml
расширения для Azure CLI.az extension update --name ml
Используйте команду, чтобы получить последнюю версию.
Подключение к рабочей области
Рабочая область — это ресурс верхнего уровня для Машинного обучения Azure. Он предоставляет централизованное место для работы со всеми артефактами, создаваемыми при использовании Машинное обучение Azure. В этом разделе описано, как подключиться к рабочей области, в которой выполняются задачи развертывания.
В следующей команде введите идентификатор подписки, имя рабочей области, имя группы ресурсов и расположение:
az account set --subscription <subscription>
az configure --defaults workspace=<workspace> group=<resource-group> location=<location>
Ознакомьтесь с примером
В примере в этой статье показано, как развернуть модель MLflow в пакетной конечной точке для выполнения прогнозирования пакетной службы. Модель MLflow основана на наборе данных болезни сердца UCI. База данных содержит 76 атрибутов, но в примере используется только подмножество 14. Модель пытается предсказать наличие сердечных заболеваний у пациента с целым числом от 0 (нет присутствия) до 1 (присутствие).
Модель обучена с помощью XGBBoost
классификатора. Все необходимые предварительные обработки упаковывается в виде scikit-learn
конвейера, что делает модель сквозным конвейером, который переходит от необработанных данных к прогнозам.
Пример в этой статье основан на примерах кода, содержащихся в репозитории azureml-examples . Чтобы выполнять команды локально, не копируя и вставляя YAML и другие файлы, используйте следующие команды, чтобы клонировать репозиторий и перейти в папку для языка программирования:
git clone https://github.com/Azure/azureml-examples --depth 1
cd azureml-examples/cli
Файлы для этого примера находятся в следующей папке:
cd endpoints/batch/deploy-models/heart-classifier-mlflow
Следуйте инструкциям в Jupyter Notebooks
Вы можете следовать этому примеру, используя общедоступную записную книжку Jupyter Notebook. В клонированного репозитория откройте записную книжку mlflow-for-batch-tabular.ipynb .
Развертывание модели MLflow
В этом разделе описано, как развернуть модель MLflow в конечной точке пакетной службы, чтобы выполнить пакетное вывод по новым данным. Прежде чем перейти к развертыванию, необходимо убедиться, что модель зарегистрирована и в рабочей области есть доступный вычислительный кластер.
Регистрация модели.
Конечные точки пакетной службы могут развертывать только зарегистрированные модели. В этой статье используется локальная копия модели в репозитории. В результате необходимо опубликовать модель только в реестре в рабочей области.
Примечание.
Если развернутая модель уже зарегистрирована, вы можете продолжить создание вычислительного кластера .
Зарегистрируйте модель, выполнив следующую команду:
MODEL_NAME='heart-classifier-mlflow'
az ml model create --name $MODEL_NAME --type "mlflow_model" --path "model"
Создание вычислительного кластера
Необходимо убедиться, что пакетные развертывания могут выполняться в некоторых доступных инфраструктурах (вычислениях). Пакетные развертывания могут выполняться на любом Машинное обучение вычислительных ресурсов, которые уже существуют в рабочей области. Несколько пакетных развертываний могут совместно использовать одну и ту же инфраструктуру вычислений.
В этой статье описано, как работать с Машинное обучение вычислительным кластером с именем cpu-cluster. В следующем примере проверяется наличие вычислительных ресурсов в рабочей области или создание нового вычисления.
Создание вычислительного кластера
az ml compute create -n batch-cluster --type amlcompute --min-instances 0 --max-instances 5
Создание пакетной конечной точки
Чтобы создать конечную точку, вам потребуется имя и описание. Имя конечной точки отображается в URI, связанном с конечной точкой, поэтому оно должно быть уникальным в регионе Azure. Например, в регионе WestUS2 может быть только одна конечная точка пакетной службы с именем mybatchendpoint
.
Поместите имя конечной точки в переменную для простой ссылки позже:
Создание конечной точки:
Чтобы создать новую конечную точку
YAML
, создайте конфигурацию, например следующий код:endpoint.yml
$schema: https://azuremlschemas.azureedge.net/latest/batchEndpoint.schema.json name: heart-classifier-batch description: A heart condition classifier for batch inference auth_mode: aad_token
Создайте конечную точку с помощью следующей команды:
az ml batch-endpoint create -n $ENDPOINT_NAME -f endpoint.yml
Создание пакетного развертывания
Модели MLflow не требуют указывать среду или скрипт оценки при создании развертывания. Среда или скрипт оценки создаются автоматически. Однако можно указать среду или скрипт оценки, если вы хотите настроить способ вывода развертывания.
Чтобы создать развертывание в созданной конечной точке, создайте
YAML
конфигурацию, как показано в следующем коде. Вы можете проверить схему YAML полной пакетной конечной точки для получения дополнительных свойств.deployment-simple/deployment.yml
$schema: https://azuremlschemas.azureedge.net/latest/modelBatchDeployment.schema.json endpoint_name: heart-classifier-batch name: classifier-xgboost-mlflow description: A heart condition classifier based on XGBoost type: model model: azureml:heart-classifier-mlflow@latest compute: azureml:batch-cluster resources: instance_count: 2 settings: max_concurrency_per_instance: 2 mini_batch_size: 2 output_action: append_row output_file_name: predictions.csv retry_settings: max_retries: 3 timeout: 300 error_threshold: -1 logging_level: info
Создайте развертывание с помощью следующей команды:
az ml batch-deployment create --file deployment-simple/deployment.yml --endpoint-name $ENDPOINT_NAME --set-default
Внимание
timeout
Настройте значение в развертывании в зависимости от того, сколько времени занимает модель для выполнения вывода в одном пакете. Чем больше размер пакета, тем больше timeout
значение. Имейте в виду, что mini_batch_size
значение указывает количество файлов в пакете, а не количество выборок. При работе с табличными данными каждый файл может содержать несколько строк, что увеличивает время, необходимое для обработки каждого файла пакетной конечной точки. В таких случаях используйте высокие timeout
значения, чтобы избежать ошибок времени ожидания.
Вызов конечной точки
Хотя вы можете вызвать определенное развертывание внутри конечной точки, обычно вызывает сам конечную точку и позволяет конечной точке решать, какое развертывание следует использовать. Этот тип развертывания называется развертыванием по умолчанию. Этот подход позволяет изменить развертывание по умолчанию, что позволяет изменять модель, обслуживающую развертывание, не изменяя контракт с пользователем, вызывающим конечную точку.
Чтобы обновить развертывание по умолчанию, используйте следующую инструкцию:
DEPLOYMENT_NAME="classifier-xgboost-mlflow"
az ml batch-endpoint update --name $ENDPOINT_NAME --set defaults.deployment_name=$DEPLOYMENT_NAME
Теперь конечная точка пакетной службы готова к использованию.
Тестирование развертывания
Чтобы протестировать конечную точку, используйте пример неназначенных данных, расположенных в этом репозитории, которые можно использовать с моделью. Конечные точки пакетной службы могут обрабатывать только данные, расположенные в облаке и доступные из рабочей области Машинное обучение. В этом примере вы отправляете пример в хранилище данных Машинное обучение. Вы создаете ресурс данных, который можно использовать для вызова конечной точки для оценки. Помните, что пакетные конечные точки принимают данные, которые можно поместить в различные расположения.
Сначала создайте ресурс данных. Ресурс данных состоит из папки с несколькими CSV-файлами, которые мы хотим обрабатывать параллельно с помощью конечных точек пакетной службы. Этот шаг можно пропустить, так как данные уже зарегистрированы в качестве ресурса данных или вы хотите использовать другой тип входных данных.
Создайте определение ресурса данных в YAML:
heart-dataset-unlabeled.yml
$schema: https://azuremlschemas.azureedge.net/latest/data.schema.json name: heart-dataset-unlabeled description: An unlabeled dataset for heart classification. type: uri_folder path: data
Создайте ресурс данных:
az ml data create -f heart-dataset-unlabeled.yml
После отправки данных вызовите конечную точку.
Совет
В следующих командах обратите внимание, что имя развертывания не указано в
invoke
операции. Конечная точка автоматически направляет задание в развертывание по умолчанию, так как конечная точка имеет только одно развертывание. Для конкретного развертывания можно указать аргумент или параметрdeployment_name
.Выполните следующую команду:
JOB_NAME = $(az ml batch-endpoint invoke --name $ENDPOINT_NAME --input azureml:heart-dataset-unlabeled@latest --query name -o tsv)
Примечание.
jq
Программа может не быть установлена во всех установках. Инструкции по установке см. в разделе "Скачать jq".Пакетное задание запускается сразу после возврата команды. Вы можете отслеживать состояние задания, пока оно не завершится:
Анализ выходных данных
Выходные прогнозы создаются в файле predictions.csv , как указано в конфигурации развертывания. Задание создает выходную оценку с именем, где помещается этот файл. Для каждого пакетного задания создается только один файл.
Файл структурирован следующим образом:
Одна строка на каждую точку данных, отправляемую в модель. Для табличных данных файл predictions.csv содержит одну строку для каждой строки, присутствующих в каждом обработанном файле. Для других типов данных (изображения, аудио, текст) существует одна строка для каждого обработанного файла.
Следующие столбцы находятся в файле (в указанном порядке):
row
(необязательно): соответствующий индекс строки в входном файле данных. Этот столбец применяется только в том случае, если входные данные являются табличными. Прогнозы возвращаются в том же порядке, что и в входном файле. Вы можете полагаться на номер строки, чтобы соответствовать соответствующему прогнозу.prediction
: прогноз, связанный с входными данными. Это значение возвращается "как есть", так как оно было предоставлено функцией моделиpredict().
.file_name
: имя файла, в котором считываются данные. В табличных данных используйте это поле для определения того, какой прогноз принадлежит каждому входному данным.
Результаты задания можно скачать с помощью имени задания.
Чтобы скачать прогнозы, используйте следующую команду:
az ml job download --name $JOB_NAME --output-name score --download-path ./
После скачивания файла можно открыть файл с помощью предпочтительного средства редактирования. В следующем примере прогнозы загружаются с помощью кадра Pandas
данных.
import pandas as pd
score = pd.read_csv(
"named-outputs/score/predictions.csv", names=["row", "prediction", "file"]
)
Выходные данные отображают таблицу:
Строка | Прогноз | Файлы |
---|---|---|
0 | 0 | heart-unlabeled-0.csv |
1 | 1 | heart-unlabeled-0.csv |
2 | 0 | heart-unlabeled-0.csv |
... | ... | ... |
307 | 0 | heart-unlabeled-3.csv |
Совет
Обратите внимание, что в этом примере входные данные содержат табличные данные в формате CSV. Существует четыре разных входных файла: heart-unlabeled-0.csv, heart-unlabeled-1.csv, heart-unlabeled-2.csv и heart-unlabeled-3.csv.
Ознакомьтесь с рекомендациями по выводу пакетной службы
Машинное обучение поддерживает развертывание моделей MLflow в пакетных конечных точках без указания скрипта оценки. Этот подход — удобный способ развертывания моделей, требующих обработки больших объемов данных, аналогичных пакетной обработке. Машинное обучение использует сведения в спецификации модели MLflow для оркестрации процесса вывода.
Изучение распределения работы над рабочими ролей
Пакетные конечные точки распределяют работу на уровне файла как для структурированных, так и неструктурированных данных. В результате для этой функции поддерживаются только URI-файлы и папки URI. Каждый рабочий процесс одновременно обрабатывает пакеты из Mini batch size
файлов. Для табличных данных конечные точки пакетной службы не учитывают количество строк внутри каждого файла при распределении работы.
Предупреждение
Вложенные структуры папок не рассматриваются во время вывода. Если вы секционируйте данные с помощью папок, перед продолжением не забудьте сравить структуру.
Пакетные развертывания вызывают predict
функцию модели MLflow один раз на файл. Для CSV-файлов с несколькими строками это действие может наложить давление на память в базовом вычислении. Поведение может увеличить время, необходимое для оценки одного файла, особенно для дорогостоящих моделей, таких как большие языковые модели. При возникновении нескольких исключений вне памяти или записей времени ожидания в журналах рекомендуется разделить данные в небольших файлах с меньшим количеством строк или реализовать пакетную обработку на уровне строк внутри скрипта оценки модели.
Проверка поддержки типов файлов
Следующие типы данных поддерживаются для пакетного вывода при развертывании моделей MLflow без среды или скрипта оценки. Чтобы обработать другой тип файла или выполнить вывод по-другому, можно создать развертывание, настроив развертывание модели MLflow с помощью скрипта оценки.
Расширение файла | Тип, возвращаемый в качестве входных данных модели | Требование к подписи |
---|---|---|
.csv , , .parquet .pqt |
pd.DataFrame |
ColSpec . Если он не указан, то ввод столбцов не применяется. |
.png , , .jpg .tiff .jpeg .bmp ,.gif |
np.ndarray |
TensorSpec . Входные данные изменены в соответствии с фигурой тензоров, если она доступна. Если подпись недоступна, выводятся тензоры типа np.uint8 . Дополнительные сведения см. в разделе "Рекомендации по обработке образов моделей MLflow". |
Предупреждение
Любой неподдерживаемый файл, который может присутствовать в входных данных, приводит к сбою задания. В таких случаях отображается ошибка, аналогичная error:azureml:Error processing input file: '/mnt/batch/tasks/.../a-given-file.avro'. Тип файла avro не поддерживается.
Общие сведения о применении подписи для моделей MLflow
Задания пакетного развертывания применяют типы данных входных данных при чтении данных с помощью доступной подписи модели MLflow. В результате входные данные соответствуют типам, указанным в сигнатуре модели. Если данные не могут быть проанализированы должным образом, задание завершается ошибкой, аналогичной error:azureml:Error processing input file: '/mnt/batch/tasks/.../a-given-file.csv'. Исключение: недопустимый литерал для int() с базовым 10: "value".
Совет
Подписи в моделях MLflow являются необязательными, но их настоятельно рекомендуется. Они предоставляют удобный способ раннего обнаружения проблем совместимости данных. Дополнительные сведения о том, как регистрировать модели с сигнатурами, см. в разделе "Модели ведения журнала" с помощью настраиваемой подписи, среды или примеров.
Сигнатуру модели можно проверить, открыв MLmodel
файл, связанный с моделью MLflow. Дополнительные сведения о том, как подписи работают в MLflow, см. в разделе "Подписи" в MLflow.
Проверка поддержки вкуса
Пакетные развертывания поддерживают развертывание моделей MLflow только с помощью вкуса pyfunc
. Сведения о развертывании другого варианта см. в статье "Настройка развертывания модели с помощью скрипта оценки".
Настройка развертывания модели с помощью скрипта оценки
Модели MLflow можно развертывать в пакетных конечных точках без указания скрипта оценки в определении развертывания. Однако вы можете указать этот файл (обычно называемый пакетным драйвером) для настройки выполнения вывода.
Обычно этот рабочий процесс выбирается для следующих сценариев:
- Обработка типов файлов, не поддерживаемых пакетными развертываниями развертываний MLflow.
- Настройте способ запуска модели, например использование определенного вкуса для загрузки ее с
mlflow.<flavor>.load()
помощью функции. - Завершение предварительной или последующей обработки в подпрограмме оценки, если она не завершена самой моделью.
- Настройте представление модели, которая не содержит табличных данных, например граф тензора, представляющего изображение.
- Разрешить модели считывать данные в блоках, так как он не может одновременно обрабатывать каждый файл из-за ограничений памяти.
Внимание
Чтобы указать скрипт оценки для развертывания модели MLflow, необходимо указать среду, в которой выполняется развертывание.
Использование скрипта оценки
Чтобы развернуть модель MLflow с помощью пользовательского скрипта оценки, выполните следующие действия.
Определите папку, в которой размещена модель MLflow.
На портале Машинное обучение Azure перейдите к моделям.
Выберите модель для развертывания и перейдите на вкладку "Артефакты ".
Запишите отображаемую папку. Эта папка была указана при регистрации модели.
Создайте скрипт оценки. Обратите внимание, что имя предыдущей папки
model
включено в функциюinit()
.deployment-custom/code/batch_driver.py
# Copyright (c) Microsoft. All rights reserved. # Licensed under the MIT license. import os import glob import mlflow import pandas as pd import logging def init(): global model global model_input_types global model_output_names # AZUREML_MODEL_DIR is an environment variable created during deployment # It is the path to the model folder # Please provide your model's folder name if there's one model_path = glob.glob(os.environ["AZUREML_MODEL_DIR"] + "/*/")[0] # Load the model, it's input types and output names model = mlflow.pyfunc.load(model_path) if model.metadata and model.metadata.signature: if model.metadata.signature.inputs: model_input_types = dict( zip( model.metadata.signature.inputs.input_names(), model.metadata.signature.inputs.pandas_types(), ) ) if model.metadata.signature.outputs: if model.metadata.signature.outputs.has_input_names(): model_output_names = model.metadata.signature.outputs.input_names() elif len(model.metadata.signature.outputs.input_names()) == 1: model_output_names = ["prediction"] else: logging.warning( "Model doesn't contain a signature. Input data types won't be enforced." ) def run(mini_batch): print(f"run method start: {__file__}, run({len(mini_batch)} files)") data = pd.concat( map( lambda fp: pd.read_csv(fp).assign(filename=os.path.basename(fp)), mini_batch ) ) if model_input_types: data = data.astype(model_input_types) # Predict over the input data, minus the column filename which is not part of the model. pred = model.predict(data.drop("filename", axis=1)) if pred is not pd.DataFrame: if not model_output_names: model_output_names = ["pred_col" + str(i) for i in range(pred.shape[1])] pred = pd.DataFrame(pred, columns=model_output_names) return pd.concat([data, pred], axis=1)
Создайте среду, в которой можно выполнить скрипт оценки. Так как модель в этом примере — MLflow, требования conda также указываются в пакете модели. Дополнительные сведения о моделях MLflow и включенных файлах см . в формате MLmodel.
На этом шаге вы создадите среду с помощью зависимостей conda из файла. Кроме того, необходимо включить пакет, необходимый
azureml-core
для пакетных развертываний.Совет
Если модель уже зарегистрирована в реестре моделей, можно скачать и скопировать файл, связанный
conda.yml
с моделью. Файл доступен в Студия машинного обучения Azure в разделе "Модели>выберите модель" из списка>артефактов. В корневойconda.yml
папке выберите файл, а затем нажмите кнопку "Скачать " или скопировать его содержимое.Внимание
В этом примере используется среда conda, указанная в
/heart-classifier-mlflow/environment/conda.yaml
. Этот файл был создан путем объединения исходного файла зависимостей conda MLflow и добавленияazureml-core
пакета. Файл нельзя использоватьconda.yml
непосредственно из модели.Настройка развертывания:
Чтобы создать новое развертывание в созданной конечной точке, создайте
YAML
конфигурацию, как показано в следующем фрагменте кода. Вы можете проверить схему YAML полной пакетной конечной точки для получения дополнительных свойств.deployment-custom/deployment.yml
$schema: https://azuremlschemas.azureedge.net/latest/modelBatchDeployment.schema.json endpoint_name: heart-classifier-batch name: classifier-xgboost-custom description: A heart condition classifier based on XGBoost type: model model: azureml:heart-classifier-mlflow@latest environment: name: batch-mlflow-xgboost image: mcr.microsoft.com/azureml/openmpi4.1.0-ubuntu20.04:latest conda_file: environment/conda.yaml code_configuration: code: code scoring_script: batch_driver.py compute: azureml:batch-cluster resources: instance_count: 2 settings: max_concurrency_per_instance: 2 mini_batch_size: 2 output_action: append_row output_file_name: predictions.csv retry_settings: max_retries: 3 timeout: 300 error_threshold: -1 logging_level: info
Создание развертывания:
Теперь конечная точка пакетной службы готова к использованию.
Очистка ресурсов
После завершения упражнения удалите ресурсы, которые больше не требуются.
Выполните следующий код, чтобы удалить конечную точку пакетной службы и все базовые развертывания:
az ml batch-endpoint delete --name $ENDPOINT_NAME --yes
Эта команда не удаляет задания пакетной оценки.