Прогрессивное развертывание моделей 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 рабочей области, над которой мы будем работать.

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% трафика при перепроигрывке. После того как мы уверены, что новая модель работает правильно, мы будем постепенно перемещать трафик из одного развертывания в другое.

  1. Для конечных точек требуется имя, которое должно быть уникальным в одном регионе. Давайте создадим его, который не существует:

    ENDPOINT_SUFIX=$(cat /dev/urandom | tr -dc 'a-zA-Z0-9' | fold -w ${1:-5} | head -n 1)
    ENDPOINT_NAME="heart-classifier-$ENDPOINT_SUFIX"
    
  2. Настройка конечной точки

    endpoint.yml

    $schema: https://azuremlschemas.azureedge.net/latest/managedOnlineEndpoint.schema.json
    name: heart-classifier-edp
    auth_mode: key
    
  3. Создание конечной точки:

    az ml online-endpoint create -n $ENDPOINT_NAME -f endpoint.yml
    
  4. Получение секрета проверки подлинности для конечной точки.

    ENDPOINT_SECRET_KEY=$(az ml online-endpoint get-credentials -n $ENDPOINT_NAME | jq -r ".accessToken")
    

Создание синего развертывания

До сих пор конечная точка пуста. На нем нет развертываний. Давайте создадим первую, развернув ту же модель, над которыми мы работали раньше. Мы будем называть это развертывание "по умолчанию", представляющее наше "синее развертывание".

  1. Настройка развертывания

    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
    
  2. Создание развертывания

    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, которая назначит весь трафик новому развертыванию.

  3. Назначение всего трафика развертыванию

    До сих пор конечная точка имеет одно развертывание, но ни один из его трафика не назначается. Давайте назначим его.

    Этот шаг не требуется в Azure CLI, так как мы использовали --all-traffic во время создания.

  4. Обновите конфигурацию конечной точки:

    Этот шаг не требуется в Azure CLI, так как мы использовали --all-traffic во время создания.

  5. Создание примера входных данных для тестирования развертывания

    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" ]
            ]
        }
    }
    
  6. Тестирование развертывания

    az ml online-endpoint invoke --name $ENDPOINT_NAME --request-file sample.json
    

Создание зеленого развертывания в конечной точке

Предположим, что существует новая версия модели, созданной командой разработчиков, и она готова к работе. Сначала мы можем попытаться запустить эту модель, и после того, как мы уверены, мы можем обновить конечную точку, чтобы маршрутизировать трафик к нему.

  1. Регистрация новой версии модели

    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")
    
  2. Настройка нового развертывания

    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"
    
  3. Создание нового развертывания

    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
    
  4. Тестирование развертывания без изменения трафика

    az ml online-endpoint invoke --name $ENDPOINT_NAME --deployment-name $GREEN_DEPLOYMENT_NAME --request-file sample.json
    

    Совет

    Обратите внимание, как теперь мы указываем имя развертывания, которое мы хотим вызвать.

Постепенно обновите трафик

Мы уверены в новом развертывании, мы можем обновить трафик, чтобы маршрутизировать некоторые из них в новое развертывание. Трафик настраивается на уровне конечной точки:

  1. Настройте трафик:

    Этот шаг не требуется в Azure CLI

  2. Обновление конечной точки

    az ml online-endpoint update --name $ENDPOINT_NAME --traffic "default=90 $GREEN_DEPLOYMENT_NAME=10"
    
  3. Если вы решите переключить весь трафик на новое развертывание, обновите весь трафик:

    Этот шаг не требуется в Azure CLI

  4. Обновление конечной точки

    az ml online-endpoint update --name $ENDPOINT_NAME --traffic "default=0 $GREEN_DEPLOYMENT_NAME=100"
    
  5. Так как старое развертывание не получает никакого трафика, его можно безопасно удалить:

    az ml online-deployment delete --endpoint-name $ENDPOINT_NAME --name default
    

    Совет

    Обратите внимание, что на этом этапе было удалено прежнее "синее развертывание", а новое "зеленое развертывание" заняло место "синего развертывания".

Очистка ресурсов

az ml online-endpoint delete --name $ENDPOINT_NAME --yes

Внимание

Обратите внимание, что удаление конечной точки также удаляет все развертывания в нем.

Следующие шаги