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

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

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

В этой статье предполагается, что вы используете сетевые конечные точки, то есть конечные точки, используемые для вывода в сети (в режиме реального времени). Существует два типа сетевых конечных точек: управляемые и Kubernetes. Дополнительные сведения о конечных точках и различиях между управляемыми сетевыми конечными точками и сетевыми конечными точками Kubernetes см. в статье "Что такое Машинное обучение Azure конечных точек?".

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

Из этой статьи вы узнаете следующее.

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

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

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

  • Управление доступом на основе ролей 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>

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

Чтобы следовать этой статье, сначала клонируйте репозиторий примеров (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. Дополнительные сведения о правилах именования см. в разделе "Ограничения конечной точки".
Режим проверки подлинности Способ проверки подлинности для конечной точки. Выберите проверку подлинности на основе ключей и проверку подлинности keyaml_tokenна основе маркеров Машинное обучение Azure. Срок действия ключа не истекает, но срок действия маркера истекает. Дополнительные сведения о проверке подлинности см. в статье Проверка подлинности подключенной конечной точки.
Description Описание конечной точки.
Теги Словарь тегов для конечной точки.
Трафик Правила маршрутизации трафика между развертываниями. Представляет трафик в виде словаря пар "ключ-значение", где ключ представляет имя развертывания и значение, представляет процент трафика для этого развертывания. Трафик можно задать только при создании развертываний в конечной точке. Вы также можете обновить трафик для сетевой конечной точки после создания развертываний. Дополнительные сведения об использовании зеркало трафика см. в статье "Выделение небольшого процента динамического трафика для нового развертывания".
Зеркальный трафик Процент динамического трафика для зеркального отображения в развертывании. Дополнительные сведения об использовании зеркало трафика см. в статье "Тестирование развертывания с использованием зеркало трафика".

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

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

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

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

Полный список атрибутов, которые можно указать при создании развертывания, см. в статье CLI (версия 2) управляемого сетевого развертывания yaml schema or SDK (v2) ManagedOnlineDeployment Class.

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

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

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

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

Ключ. Description
$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 для настройки ключевых аспектов развертывания. В следующем фрагменте кода показано содержимое файла:

$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-ubuntu20.04:latest
instance_type: Standard_DS3_v2
instance_count: 1

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

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-deployment.yaml В файле мы укажем path (где отправлять файлы из) встраиваем. CLI автоматически отправляет файлы и регистрирует модель и среду. Для рабочей среды рекомендуется отдельно зарегистрировать модель и среду, а также указать зарегистрированное имя и версию в YAML. Используйте формат model: azureml:my-model:1 или 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 с помощью ИНТЕРФЕЙСА командной строки и пакета SDK (версия 2)".

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

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

Примечание.

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

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

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

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

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

Параметры управления трафиком выделяют указанные проценты входящего трафика для каждого развертывания в конечной точке. Например, если правила трафика указывают, что определенное развертывание в конечной точке получит входящие трафик 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 команды. Мы отправим пример запроса с помощью json-файла.

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

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

В развертывании, описанном в разделе Развертывание и оценка модели машинного обучения с помощью подключенной конечной точки, необходимо задать для параметра instance_count в файле развертывания yaml значение 1. Вы можете горизонтально увеличить масштаб с помощью команды 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>. В приведенном ниже фрагменте кода используется curl для прямого вызова развертывания. Фрагмент кода должен работать в средах Unix/WSL:

# 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 развертывания вы можете зеркало (или скопировать) процент динамического трафика. Трафик зеркало (также называемый тень) не изменяет результаты, возвращенные клиентам, — запросы по-прежнему потоком 100 % к развертываниюblue. Зеркало процент трафика копируется и отправляется в green развертывание, чтобы вы могли собирать метрики и ведение журнала, не влияя на ваши клиенты. Зеркалирование удобно применить в том случае, когда требуется проверить новое развертывание без влияния на клиентов. Например, можно использовать зеркало для проверка, если задержка находится в допустимых границах или проверка отсутствуют ошибки HTTP. Тестирование нового развертывания с помощью трафика зеркало/тени также называется теневым тестированием. Развертывание, green получающее зеркало зеркало трафик (в данном случае развертывание) также можно назвать теневым развертыванием.

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

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

Кроме того, обратите внимание на следующее поведение:

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

Теперь давайте задали зеленое развертывание для получения 10 % зеркало трафика. Клиенты по-прежнему получат прогнозы только из синего развертывания.

Diagram showing 10% traffic mirrored to one deployment.

Следующая команда зеркалирует 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 blue --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 от развертывания.

Diagram showing traffic split between deployments.

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

Когда вы полностью удовлетворены 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