Прогрессивное развертывание моделей MLflow в сетевых конечных точках
В этой статье вы узнаете, как постепенно обновлять и развертывать модели MLflow в сетевых конечных точках без нарушения работы службы. Вы используете сине-зеленое развертывание, также называемое стратегией безопасного развертывания, чтобы ввести новую версию веб-службы в рабочую среду. Эта стратегия позволит развернуть новую версию веб-службы в небольшое подмножество пользователей или запросов, прежде чем полностью развернуть ее.
Сведения об этом примере
Сетевые конечные точки имеют концепцию конечной точки и развертывания. Конечная точка представляет API, который клиенты используют для использования модели, а развертывание указывает на конкретную реализацию этого API. Это различие позволяет пользователям отделить API от реализации и изменить базовую реализацию, не влияя на потребителя. В этом примере используются такие понятия для обновления развернутой модели в конечных точках без нарушения работы службы.
Развернутая модель основана на наборе данных болезни сердца UCI. База данных содержит 76 атрибутов, но мы используем подмножество из 14 из них. Модель пытается предсказать наличие сердечно-сосудистых заболеваний у пациента. Целочисленное значение от 0 (нет присутствия) до 1 (присутствие). Он был обучен с помощью XGBBoost
классификатора, и все необходимые предварительной обработки были упакованы в виде scikit-learn
конвейера, что делает эту модель сквозным конвейером, который переходит от необработанных данных к прогнозам.
Сведения в этой статье основаны на примерах кода, имеющихся в репозитории azureml-examples. Для локального выполнения команд без необходимости копирования и вставки файлов клонируйте репозиторий, а затем измените каталоги sdk/using-mlflow/deploy
на .
Следуйте инструкциям в Jupyter Notebooks
Вы можете следовать этому примеру в следующих записных книжках. В клонированного репозитория откройте записную книжку: mlflow_sdk_online_endpoints_progresive.ipynb.
Необходимые компоненты
Перед выполнением действий, описанных в этой статье, убедитесь, что выполнены следующие необходимые условия:
- Подписка Azure. Если у вас еще нет подписки Azure, создайте бесплатную учетную запись, прежде чем начинать работу. Попробуйте бесплатную или платную версию Машинного обучения Azure.
- Управление доступом на основе ролей Azure (Azure RBAC) используется для предоставления доступа к операциям в Машинном обучении Azure. Чтобы выполнить действия, описанные в этой статье, учетная запись пользователя должна быть назначена роль владельца или участника для рабочей области Машинное обучение Azure или настраиваемой роли, позволяющей Microsoft.MachineLearningServices/workspaces/onlineEndpoints/*. Дополнительные сведения см. в статье Управление доступом к рабочей области Машинного обучения Azure.
Кроме того, вам потребуется:
- Установите Azure CLI и расширение ml в Azure CLI. Дополнительные сведения см. в разделе Установка, настройка и использование CLI (версия 2).
Подключение к рабочей области
Во-первых, давайте подключимся к Машинное обучение Azure рабочей области, над которой мы будем работать.
az account set --subscription <subscription>
az configure --defaults workspace=<workspace> group=<resource-group> location=<location>
Регистрация модели в реестре
Убедитесь, что ваша модель зарегистрирована в реестре Машинного обучения Azure. Развертывание незарегистрированных моделей в Машинном обучении Azure не поддерживается. Вы можете зарегистрировать новую модель с помощью пакета SDK MLflow:
MODEL_NAME='heart-classifier'
az ml model create --name $MODEL_NAME --type "mlflow_model" --path "model"
Создание сетевой конечной точки
Сетевые конечные точки — это конечные точки, которые используются для вывода онлайн (в режиме реального времени). Подключенные конечные точки содержат развертывания, готовые к получению данных от клиентов, и могут отправлять ответы обратно в реальном времени.
Мы будем использовать эту функцию, развернув несколько версий одной модели в одной конечной точке. Однако новое развертывание получит 0% трафика при перепроигрывке. После того как мы уверены, что новая модель работает правильно, мы будем постепенно перемещать трафик из одного развертывания в другое.
Для конечных точек требуется имя, которое должно быть уникальным в одном регионе. Давайте создадим его, который не существует:
ENDPOINT_SUFIX=$(cat /dev/urandom | tr -dc 'a-zA-Z0-9' | fold -w ${1:-5} | head -n 1) ENDPOINT_NAME="heart-classifier-$ENDPOINT_SUFIX"
Настройка конечной точки
endpoint.yml
$schema: https://azuremlschemas.azureedge.net/latest/managedOnlineEndpoint.schema.json name: heart-classifier-edp auth_mode: key
Создание конечной точки:
az ml online-endpoint create -n $ENDPOINT_NAME -f endpoint.yml
Получение секрета проверки подлинности для конечной точки.
ENDPOINT_SECRET_KEY=$(az ml online-endpoint get-credentials -n $ENDPOINT_NAME | jq -r ".accessToken")
Создание синего развертывания
До сих пор конечная точка пуста. На нем нет развертываний. Давайте создадим первую, развернув ту же модель, над которыми мы работали раньше. Мы будем называть это развертывание "по умолчанию", представляющее наше "синее развертывание".
Настройка развертывания
blue-deployment.yml
$schema: https://azuremlschemas.azureedge.net/latest/managedOnlineDeployment.schema.json name: default endpoint_name: heart-classifier-edp model: azureml:heart-classifier@latest instance_type: Standard_DS2_v2 instance_count: 1
Создание развертывания
az ml online-deployment create --endpoint-name $ENDPOINT_NAME -f blue-deployment.yml --all-traffic
Если у конечной точки нет подключения к исходящего трафика, используйте упаковку модели (предварительную версию), включив флаг
--with-package
:az ml online-deployment create --with-package --endpoint-name $ENDPOINT_NAME -f blue-deployment.yml --all-traffic
Совет
Мы задали флаг
--all-traffic
в команде create, которая назначит весь трафик новому развертыванию.Назначение всего трафика развертыванию
До сих пор конечная точка имеет одно развертывание, но ни один из его трафика не назначается. Давайте назначим его.
Этот шаг не требуется в Azure CLI, так как мы использовали
--all-traffic
во время создания.Обновите конфигурацию конечной точки:
Этот шаг не требуется в Azure CLI, так как мы использовали
--all-traffic
во время создания.Создание примера входных данных для тестирования развертывания
sample.yml
{ "input_data": { "columns": [ "age", "sex", "cp", "trestbps", "chol", "fbs", "restecg", "thalach", "exang", "oldpeak", "slope", "ca", "thal" ], "data": [ [ 48, 0, 3, 130, 275, 0, 0, 139, 0, 0.2, 1, 0, "normal" ] ] } }
Тестирование развертывания
az ml online-endpoint invoke --name $ENDPOINT_NAME --request-file sample.json
Создание зеленого развертывания в конечной точке
Предположим, что существует новая версия модели, созданной командой разработчиков, и она готова к работе. Сначала мы можем попытаться запустить эту модель, и после того, как мы уверены, мы можем обновить конечную точку, чтобы маршрутизировать трафик к нему.
Регистрация новой версии модели
MODEL_NAME='heart-classifier' az ml model create --name $MODEL_NAME --type "mlflow_model" --path "model"
Давайте получим номер версии новой модели:
VERSION=$(az ml model show -n heart-classifier --label latest | jq -r ".version")
Настройка нового развертывания
green-deployment.yml
$schema: https://azuremlschemas.azureedge.net/latest/managedOnlineDeployment.schema.json name: xgboost-model endpoint_name: heart-classifier-edp model: azureml:heart-classifier@latest instance_type: Standard_DS2_v2 instance_count: 1
Мы назовем развертывание следующим образом:
GREEN_DEPLOYMENT_NAME="xgboost-model-$VERSION"
Создание нового развертывания
az ml online-deployment create -n $GREEN_DEPLOYMENT_NAME --endpoint-name $ENDPOINT_NAME -f green-deployment.yml
Если у конечной точки нет подключения к исходящего трафика, используйте упаковку модели (предварительную версию), включив флаг
--with-package
:az ml online-deployment create --with-package -n $GREEN_DEPLOYMENT_NAME --endpoint-name $ENDPOINT_NAME -f green-deployment.yml
Тестирование развертывания без изменения трафика
az ml online-endpoint invoke --name $ENDPOINT_NAME --deployment-name $GREEN_DEPLOYMENT_NAME --request-file sample.json
Совет
Обратите внимание, как теперь мы указываем имя развертывания, которое мы хотим вызвать.
Постепенно обновите трафик
Мы уверены в новом развертывании, мы можем обновить трафик, чтобы маршрутизировать некоторые из них в новое развертывание. Трафик настраивается на уровне конечной точки:
Настройте трафик:
Этот шаг не требуется в Azure CLI
Обновление конечной точки
az ml online-endpoint update --name $ENDPOINT_NAME --traffic "default=90 $GREEN_DEPLOYMENT_NAME=10"
Если вы решите переключить весь трафик на новое развертывание, обновите весь трафик:
Этот шаг не требуется в Azure CLI
Обновление конечной точки
az ml online-endpoint update --name $ENDPOINT_NAME --traffic "default=0 $GREEN_DEPLOYMENT_NAME=100"
Так как старое развертывание не получает никакого трафика, его можно безопасно удалить:
az ml online-deployment delete --endpoint-name $ENDPOINT_NAME --name default
Совет
Обратите внимание, что на этом этапе было удалено прежнее "синее развертывание", а новое "зеленое развертывание" заняло место "синего развертывания".
Очистка ресурсов
az ml online-endpoint delete --name $ENDPOINT_NAME --yes
Внимание
Обратите внимание, что удаление конечной точки также удаляет все развертывания в нем.