Поделиться через


Выполнение безопасного развертывания новых развертываний для вывода в режиме реального времени

ОБЛАСТЬ ПРИМЕНЕНИЯ:Расширение машинного обучения Azure CLI версии 2 (current)Python SDK azure-ai-ml версии 2 (current)

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

В этой статье предполагается, что вы используете онлайн-конечные точки или конечные точки, применяемые для онлайн-вывода в режиме реального времени. Существует два типа сетевых конечных точек: управляемые и Kubernetes. Дополнительные сведения о конечных точках и различиях между типами конечных точек см. в разделе Управляемые сетевые конечные точки и сетевые конечные точки Kubernetes.

В этой статье используются управляемые сетевые конечные точки для развертывания. Но она также содержит заметки, которые объясняют, как использовать конечные точки Kubernetes вместо управляемых сетевых конечных точек.

В этой статье показано, как:

  • Определите онлайн-конечную точку с развертыванием, называющимся blue, для обслуживания первой версии модели.
  • blue Масштабируйте развертывание, чтобы он смог обрабатывать дополнительные запросы.
  • Разверните вторую версию модели, которая называется green развертыванием, в конечную точку, но отправьте развертывание без динамического трафика.
  • Тестируйте развертывание green в изоляции.
  • Отразите процент живого трафика на развертывание green в целях его проверки.
  • Отправьте небольшой процент динамического трафика в green развертывание.
  • Перенаправьте весь текущий трафик на развертывание green.
  • Удалите неиспользуемое blue развертывание.

Необходимые компоненты

  • Учетная запись пользователя, которая имеет по крайней мере одну из следующих ролей управления доступом на основе ролей Azure (Azure RBAC):

    • Роль владельца рабочей области Машинного обучения Azure
    • Роль участника для рабочей области Машинного обучения Azure
    • Пользовательская роль с Microsoft.MachineLearningServices/workspaces/onlineEndpoints/* разрешениями

    Дополнительные сведения см. в статье "Управление доступом к рабочим областям Azure машинного обучения".

  • При необходимости подсистема Docker, установленная и запущенная локально. Это требование настоятельно рекомендуется. Вам нужно будет развернуть модель локально, а это полезно для отладки.

Подготовка системы

Настройка переменных среды

Значения по умолчанию можно настроить для использования с Azure CLI. Чтобы избежать передачи значений для подписки, рабочей области и группы ресурсов несколько раз, выполните следующий код:

az account set --subscription <subscription-ID>
az configure --defaults workspace=<Azure-Machine-Learning-workspace-name> group=<resource-group-name>

Клонирование репозитория примеров

Чтобы следовать этой статье, сначала клонируйте репозиторий примеров (azureml-examples). Затем перейдите в каталог репозитория cli/ :

git clone --depth 1 https://github.com/Azure/azureml-examples
cd azureml-examples
cd cli

Совет

Используйте --depth 1 для клонирования только последнего коммита в репозиторий, что сокращает время, необходимое для завершения операции.

Команды, приведенные в этом руководстве, находятся в файле deploy-safe-rollout-online-endpoints.sh в каталоге cli, а файлы конфигурации YAML находятся в подкаталоге endpoints/online/managed/sample/.

Примечание.

Файлы конфигурации YAML для конечных точек Kubernetes в сети находятся в подкаталоге endpoints/online/kubernetes/.

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

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

Определение конечной точки

В следующей таблице перечислены ключевые атрибуты, которые необходимо указать при определении конечной точки.

Атрибут Обязательно или необязательно Описание
Имя. Обязательно Имя конечной точки. Он должен быть уникальным в своем регионе Azure. Для получения дополнительной информации о правилах именования см. статью Конечные точки в реальном времени и пакетные конечные точки для Машинного обучения Azure.
Режим проверки подлинности Необязательно Способ проверки подлинности для конечной точки. Вы можете выбрать проверку подлинности на основе ключей и keyпроверку подлинности aml_tokenна основе маркеров машинного обучения Azure. Срок действия ключа не истекает, но срок действия маркера истекает. Дополнительные сведения о проверке подлинности см. в разделе "Проверка подлинности клиентов для сетевых конечных точек".
Описание Необязательно Описание конечной точки.
Теги Необязательно Словарь тегов для конечной точки.
Трафик Необязательно Правила маршрутизации трафика между развертываниями. Вы представляете трафик в виде словаря пар "ключ-значение", где ключ соответствует имени развертывания, а значение — процентная доля трафика для него. Настройка трафика возможна только после создания развертываний под конечной точкой. Вы также можете обновить трафик для сетевой конечной точки после создания развертываний. Дополнительные сведения об использовании зеркального трафика см. в статье "Выделение небольшого процента динамического трафика для нового развертывания".
Зеркальный трафик Необязательно Процент динамического трафика для зеркального отображения развертывания. Дополнительные сведения об использовании зеркального трафика см. в разделе "Тестирование развертывания с зеркальным трафиком".

Полный список атрибутов, которые можно указать при создании конечной точки, см. в схеме YAML веб-конечной точки CLI (версии 2). Сведения о версии 2 пакета SDK машинного обучения Azure для Python см. в классе ManagedOnlineEndpoint.

Определение развертывания

Развертывание — это набор ресурсов, необходимых для размещения модели, выполняющей выводы. В следующей таблице описываются ключевые атрибуты, которые необходимо указать при определении развертывания.

Атрибут Обязательно или необязательно Описание
Имя. Обязательно Название развертывания.
Имя конечной точки Обязательно Имя конечной точки для создания развертывания.
Модель Необязательно Модель, которая будет использоваться для развертывания. Это значение может быть ссылкой на существующую модель с управлением версиями в рабочей области или спецификацией встроенной модели. В примерах scikit-learn этой статьи модель выполняет регрессионный анализ.
Путь к коду Необязательно Путь к папке в локальной среде разработки, содержащей весь исходный код Python для оценки модели. Вы можете использовать вложенные каталоги и пакеты.
Scoring script (Скрипт оценки) Необязательно Код Python, который выполняет модель в заданном входном запросе. Это значение может быть относительным путем к файлу оценки в папке исходного кода.
Скрипт оценки получает данные, отправленные в развернутую веб-службу, и передает его модели. Затем скрипт выполняет модель и возвращает ответ клиенту. Скрипт оценки зависит от модели и должен понимать данные, которые модель ожидает в качестве входных данных и возвращает в качестве выходных данных.
В примерах этой статьи используется файл score.py. Этот код Python должен содержать функции init и run. Функция init вызывается после создания или обновления модели. Его можно использовать для кэширования модели в памяти, например. Функция run вызывается при каждом вызове конечной точки для фактического выполнения оценки и прогнозирования.
Среда Обязательно Среда для размещения модели и кода. Это значение может быть ссылкой на существующую среду с управлением версиями в рабочей области или спецификацией встроенной среды. Среда может быть образом Docker с зависимостями Conda, Dockerfile или зарегистрированной средой.
Тип экземпляра Обязательно Размер виртуальной машины, используемой для развертывания. Список поддерживаемых размеров см. в списке SKU управляемых сетевых конечных точек.
Число экземпляров Обязательно Число экземпляров, которые будут использоваться для развертывания. Это значение зависит от ожидаемой рабочей нагрузки. Для обеспечения высокой доступности рекомендуется использовать по крайней мере три экземпляра. Машинное обучение Azure резервирует дополнительные 20 процентов для выполнения обновлений. Дополнительные сведения см. в онлайн конечных точках машинного обучения Azure и пакетных конечных точках.

Полный список атрибутов, которые можно указать при создании развертывания, см. в схеме YAML управляемого веб-развертывания CLI (2). Сведения о версии 2 пакета SDK для Python см. в разделе "Класс ManagedOnlineDeployment".

Создание сетевой конечной точки

Сначала необходимо задать имя конечной точки, а затем настроить ее. В этой статье вы используете файл endpoints/online/managed/sample/endpoint.yml для настройки конечной точки. Этот файл содержит следующие строки:

$schema: https://azuremlschemas.azureedge.net/latest/managedOnlineEndpoint.schema.json
name: my-endpoint
auth_mode: key

В следующей таблице описываются ключи, которые использует формат YAML конечной точки. Чтобы узнать, как указать эти атрибуты, см. схему YAML веб-конечной точки CLI (версии 2). Сведения об ограничениях, связанных с управляемыми онлайн конечными точками, см. в статье "Онлайн конечные точки и пакетные конечные точки в Azure Machine Learning".

Ключ. Описание
$schema (Необязательно) Схема YAML. Чтобы просмотреть все доступные параметры в YAML-файле, можно просмотреть схему в предыдущем блоке кода в браузере.
name Имя конечной точки.
auth_mode Режим проверки подлинности. Используйте key для аутентификации на основе ключей. Используйте aml_token для проверки подлинности в службе "Машинное обучение Azure" на основе маркеров. Чтобы получить последний маркер, используйте az ml online-endpoint get-credentials команду.

Чтобы создать конечную точку в Сети, выполните приведенные действия.

  1. Задайте имя конечной точки, выполнив следующую команду Unix. Замените YOUR_ENDPOINT_NAME уникальным именем.

    export ENDPOINT_NAME="<YOUR_ENDPOINT_NAME>"
    

    Внимание

    Имена конечных точек должны быть уникальными в рамках региона Azure. Например, в регионе westus2 Azure может быть только одна конечная точка с именем my-endpoint.

  2. Создайте конечную точку в облаке, выполнив следующий код. Этот код использует файл endpoint.yml для настройки конечной точки:

    az ml online-endpoint create --name $ENDPOINT_NAME -f endpoints/online/managed/sample/endpoint.yml
    

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

С помощью файла endpoints/online/managed/sample/blue-deployment.yml можно настроить ключевые аспекты развертывания с именем blue. Этот файл содержит следующие строки:

$schema: https://azuremlschemas.azureedge.net/latest/managedOnlineDeployment.schema.json
name: blue
endpoint_name: my-endpoint
model:
  path: ../../model-1/model/
code_configuration:
  code: ../../model-1/onlinescoring/
  scoring_script: score.py
environment: 
  conda_file: ../../model-1/environment/conda.yaml
  image: mcr.microsoft.com/azureml/openmpi4.1.0-ubuntu22.04:latest
instance_type: Standard_DS3_v2
instance_count: 1

Чтобы использовать файл blue-deployment.yml для создания blue развертывания для конечной точки, выполните следующую команду:

az ml online-deployment create --name blue --endpoint-name $ENDPOINT_NAME -f endpoints/online/managed/sample/blue-deployment.yml --all-traffic

Внимание

Флаг --all-traffic в команде az ml online-deployment create направляет 100% трафика конечной точки на только что созданное развертывание blue.

В файле blue-deployment.yaml строка path указывает, откуда загружаются файлы. Интерфейс командной строки машинного обучения Azure использует эти сведения для отправки файлов и регистрации модели и среды. В качестве наилучшей практики для производства рекомендуется зарегистрировать модель и настройки среды, а также указать зарегистрированное имя и версию отдельно в коде YAML. Используйте формат model: azureml:<model-name>:<model-version> модели, например model: azureml:my-model:1. Для среды используйте формат environment: azureml:<environment-name>:<environment-version>, например environment: azureml:my-env:1.

Для регистрации вы можете извлечь определения YAML model и environment в отдельные файлы YAML и использовать команды az ml model create и az ml environment create. Чтобы узнать больше об этих командах, выполните az ml model create -h и az ml environment create -h.

Дополнительные сведения о регистрации модели в качестве ресурса см. в статье "Регистрация модели" с помощью Azure CLI или пакета SDK для Python. Дополнительные сведения о создании среды см. в разделе "Создание настраиваемой среды".

Подтверждение существующего развертывания

Один из способов подтверждения существующего развертывания — вызвать конечную точку, чтобы оценить модель для заданного входного запроса. При вызове конечной точки с помощью Azure CLI или пакета SDK для Python можно указать имя развертывания для получения входящего трафика.

Примечание.

В отличие от Azure CLI или пакета SDK для Python, студии машинного обучения Azure требуется указать развертывание при вызове конечной точки.

Вызовите конечную точку с указанием имени развертывания

При вызове конечной точки можно указать имя развертывания, на которое вы хотите направлять трафик. В этом случае Машинное обучение Azure направляет трафик конечной точки непосредственно в указанное развертывание и возвращает выходные данные. Вы можете использовать --deployment-name параметр для интерфейса командной строки машинного обучения Azure версии 2 или deployment_name параметр пакета SDK для Python версии 2, чтобы указать развертывание.

Вызов конечной точки без указания развертывания

Если вы вызываете конечную точку без указания развертывания, которое должно получать трафик, Azure Machine Learning распределяет входящий трафик к конечной точке в развертывания в конечной точке на основе параметров управления трафиком.

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

Чтобы просмотреть состояние существующей конечной точки и развертывания, выполните следующие команды:

az ml online-endpoint show --name $ENDPOINT_NAME 

az ml online-deployment show --name blue --endpoint $ENDPOINT_NAME 

Выходные данные содержат сведения о конечной $ENDPOINT_NAME точке и развертывании blue .

Тестирование конечной точки с помощью примеров данных

Вы можете вызвать конечную точку с помощью invoke команды. Следующая команда используетsample-request.json JSON-файл для отправки примера запроса:

az ml online-endpoint invoke --name $ENDPOINT_NAME --request-file endpoints/online/model-1/sample-request.json

Масштабирование существующего развертывания для обслуживания большего трафика

В развертывании, описанном в разделе "Развертывание и оценка модели машинного обучения" с помощью сетевой конечной точки, необходимо задать instance_count значение 1 в файле YAML развертывания. Вы можете выполнить горизонтальное масштабирование с помощью update команды:

az ml online-deployment update --name blue --endpoint-name $ENDPOINT_NAME --set instance_count=2

Примечание.

В предыдущей команде --set параметр переопределяет конфигурацию развертывания. Кроме того, можно обновить YAML-файл и передать его в качестве входных данных команде update с помощью --file параметра.

Разверните новую модель, но не отправляйте ей трафик.

Создайте пакет развертывания с именем green:

az ml online-deployment create --name green --endpoint-name $ENDPOINT_NAME -f endpoints/online/managed/sample/green-deployment.yml

Так как вы явно не выделяете трафик для green развертывания, он имеет нулевой трафик, выделенный для него. Этот факт можно проверить с помощью следующей команды:

az ml online-endpoint show -n $ENDPOINT_NAME --query traffic

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

Несмотря на то, что green развертывание имеет 0 процентов трафика, выделенного для него, вы можете вызвать его непосредственно с помощью --deployment параметра:

az ml online-endpoint invoke --name $ENDPOINT_NAME --deployment-name green --request-file endpoints/online/model-2/sample-request.json

Если вы хотите с помощью клиента REST непосредственно вызвать развертывание без прохода по правилам трафика, задайте следующий заголовок HTTP: azureml-model-deployment: <deployment-name>. Следующий код использует клиент для URL-адреса (cURL) для вызова развертывания напрямую. Код можно запустить в среде Unix или Подсистемы Windows для Linux (WSL). Инструкции по получению значения $ENDPOINT_KEY см. в разделе Получение ключа или маркера для операций с плоскостью данных.

# get the scoring uri
SCORING_URI=$(az ml online-endpoint show -n $ENDPOINT_NAME -o tsv --query scoring_uri)
# use curl to invoke the endpoint
curl --request POST "$SCORING_URI" --header "Authorization: Bearer $ENDPOINT_KEY" --header 'Content-Type: application/json' --header "azureml-model-deployment: green" --data @endpoints/online/model-2/sample-request.json

Тестирование развертывания с зеркальным трафиком

После тестирования green развертывания можно зеркально отражать процент динамического трафика в конечную точку, копируя этот процент трафика и отправляя его в green развертывание. Зеркальное отображение трафика, которое также называется теневым, не изменяет результаты, возвращенные клиентам, — 100 процентов запросов по-прежнему выполняются в blue развертывание. Зеркальный процент трафика копируется и отправляется в развертывание green, чтобы можно было собирать метрики и журналирование, не влияя на ваших клиентов.

Зеркалирование удобно применить в том случае, когда требуется проверить новое развертывание без влияния на клиентов. Например, можно использовать зеркальное отображение, чтобы проверить, находится ли задержка в допустимых границах или проверить отсутствие ошибок HTTP. Использование зеркального отображения трафика или тени для тестирования нового развертывания также называется теневым тестированием. Развертывание, которое получает зеркальный трафик, в данном случае green развертывание также можно назвать теневым развертыванием.

Зеркалирование имеет следующие ограничения:

  • Зеркальное отображение поддерживается для версий 2.4.0 и более поздних версий интерфейса командной строки Машинного обучения Azure и версий 1.0.0 и более поздних версий пакета SDK для Python. Если вы используете старую версию интерфейса командной строки машинного обучения Azure или пакета SDK Python для обновления конечной точки, вы потеряете параметр зеркального трафика.
  • Зеркальное отображение в настоящее время не поддерживается для конечных точек Kubernetes online.
  • Трафик можно зеркально отражать только одному развертыванию в конечной точке.
  • Максимальный процент трафика, который можно зеркально отражать, составляет 50 процентов. Это ограничение ограничивает влияние квоты пропускной способности конечной точки, которая имеет значение по умолчанию 5 МБИТ/с. Пропускная способность конечной точки регулируется при превышении выделенной квоты. Дополнительные сведения о регулировании пропускной способности см. в разделе "Регулирование пропускной способности".

Также обратите внимание на следующее поведение:

  • Развертывание можно настроить для получения только динамического трафика или зеркального трафика, а не для обоих.
  • При вызове конечной точки можно указать имя любого из его развертываний (включая теневое развертывание) для получения предсказания.
  • При вызове конечной точки и указании имени развертывания для получения входящего трафика машинное обучение Azure не отражает трафик в теневое развертывание. Машинное обучение Azure отражает трафик в теневое развертывание от трафика, отправленного в конечную точку, если не указать развертывание.

Если вы настраиваете green развертывание, чтобы получать 10 процентов зеркального трафика, клиенты по-прежнему получают прогнозы только от blue развертывания.

Схема, показывющая поток трафика через конечную точку. Весь трафик переходит к синему развертыванию, и 10 процентов зеркально отражается на зеленом развертывании.

Используйте следующую команду для копирования 10 процентов трафика и затем отправки его на развертывание green.

az ml online-endpoint update --name $ENDPOINT_NAME --mirror-traffic "green=10"

Вы можете протестировать зеркальный трафик, вызвав конечную точку несколько раз, не указав развертывание для получения входящего трафика:

for i in {1..20} ; do
    az ml online-endpoint invoke --name $ENDPOINT_NAME --request-file endpoints/online/model-1/sample-request.json
done

Вы можете убедиться, что указанный процент трафика отправляется в развертывание green, проверив журналы из этого развертывания.

az ml online-deployment get-logs --name green --endpoint $ENDPOINT_NAME

После тестирования можно задать нулевое значение для зеркалирования трафика, чтобы отключить зеркалирование:

az ml online-endpoint update --name $ENDPOINT_NAME --mirror-traffic "green=0"

Выделение небольшого процента динамического трафика для нового развертывания

После того как вы протестируете green развертывание, выделите для него небольшой процент трафика.

az ml online-endpoint update --name $ENDPOINT_NAME --traffic "blue=90 green=10"

Совет

Процент трафика должен быть либо 0 %, чтобы отключить трафик, либо 100 %, чтобы включить трафик.

Ваше развертывание green теперь получает 10 процентов всего реального трафика. Клиенты получают прогнозы как от развертывания blue, так и от развертывания green.

Схема, показывющая поток трафика через конечную точку. Синее развертывание получает 90 процентов трафика, а зеленое развертывание — 10 процентов.

Отправка всего трафика в новое развертывание

Когда вы полностью удовлетворены развертыванием green, переключите на него весь трафик.

az ml online-endpoint update --name $ENDPOINT_NAME --traffic "blue=0 green=100"

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

Чтобы удалить отдельное развертывание из управляемой сетевой конечной точки, выполните указанные ниже действия. Удаление отдельного развертывания не влияет на другие развертывания в управляемой сетевой конечной точке:

az ml online-deployment delete --name blue --endpoint $ENDPOINT_NAME --yes --no-wait

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

Если вы не собираетесь использовать конечную точку и развертывание, удалите их. При удалении конечной точки все базовые развертывания также удаляются.

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