Развертывание модели в кластере Службы Azure Kubernetes с помощью версии 1

Важно!

В этой статье приводятся сведения об использовании CLI и пакета SDK версии 1 для развертывания модели. Рекомендуемый подход для версии 2 см. в статье Развертывание и оценка модели машинного обучения с помощью сетевой конечной точки.

Узнайте, как использовать Машинное обучение Azure для развертывания модели в качестве веб-службы в Службе Azure Kubernetes (AKS). Служба Azure Kubernetes прекрасно подходит для крупномасштабных развертываний в рабочей среде. Используйте Службу Kubernetes Azure, если требуется одна или несколько из следующих возможностей:

  • быстрое время отклика;
  • автомасштабирование развернутой службы;
  • Logging
  • Сбор данных модели
  • Аутентификация
  • завершение сеанса TLS;
  • такие параметры аппаратного ускорения, как GPU и программируемые пользователем вентильные матрицы (ППВМ).

При развертывании в Службе Azure Kubernetes развертывание выполняется в кластере AKS, подключенном к вашей рабочей области. Сведения о подключении кластера AKS к рабочей области см. в разделе Создание и подключение кластера Службы Azure Kubernetes.

Важно!

Рекомендуется выполнить отладку локально перед развертыванием в веб-службе. Дополнительные сведения см. в разделе Локальная отладка.

Вы также можете ознакомиться со статьей о Машинном обучении Azure: Развертывание в локальный Notebook

Примечание

Конечные точки Машинного обучения Azure (версия 2) предоставляют улучшенные и простые возможности развертывания. Они поддерживают сценарии развертывания как в режиме реального времени, так и при использовании пакетного вывода. Конечные точки служат единым интерфейсом для вызова развертывания моделей и управления ими в вычислительных ресурсах разных типов. См. статью Что такое конечные точки Машинного обучения Azure?

Предварительные требования

Объяснение процессов развертывания

Слово "развертывание" используется как в Kubernetes, так и в Машинном обучении Azure. В этих двух контекстах слово "развертывание" имеет разный смысл. В Kubernetes Deployment — конкретная сущность, указанная с помощью декларативного файла YAML. Deployment Kubernetes имеет определенный жизненный цикл и конкретные связи с другими сущностями Kubernetes, такими как Pods и ReplicaSets. Вы можете узнать о Kubernetes из документации и видеороликов по ссылке Что такое Kubernetes?.

В Машинном обучении Azure "развертывание" используется в более общем смысле и означает предоставление доступа и очистку ресурсов проекта. Следующие этапы Машинное обучение Azure считает частью развертывания.

  1. Упаковка файлов в папку проекта с игнорированием тех, которые указаны в файле с расширением AMPLIGNORE или GITIGNORE.
  2. Масштабирование вычислительного кластера (относится к Kubernetes).
  3. Сборка или скачивание dockerfile на вычислительный узел (относится к Kubernetes).
    1. Система вычисляет хэш:
    2. Система использует этот хэш в качестве ключа при поиске в Реестре контейнеров Azure (ACR) рабочей области.
    3. Если ничего не найдено, выполняется поиск в глобальном ACR.
    4. Если опять ничего не найдено, система создает новый образ (который будет кэширован и отправлен в ACR рабочей области).
  4. Загрузка упакованного файла проекта во временное хранилище в вычислительном узле.
  5. Распаковка файла проекта.
  6. Выполнение python <entry script> <arguments> вычислительным узлом.
  7. Сохранение журналов, файлов моделей и других файлов, записанных в ./outputs в учетной записи хранения, связанной с рабочей областью.
  8. Уменьшение масштаба вычислений, включая удаление временного хранилища (относится к Kubernetes).

Маршрутизатор Машинного обучения Azure

Интерфейсный компонент (azureml-fe), который направляет входящие запросы вывода в развернутые службы, автоматически масштабируется по мере необходимости. Масштабирование azureml-fe зависит от назначения и размера кластера AKS (числа узлов). Назначение и узлы кластера настраиваются при создании или подключении кластера AKS. Предусмотрено по одной службе azureml-fe на кластер, которая может выполняться в нескольких модулях pod.

Важно!

При использовании кластера, настроенного как dev-test, автоматическое масштабирование отключено. Даже для кластеров FastProd/DenseProd, автоматическое масштабирование включается, только когда телеметрии показывает, что оно требуется.

Примечание

Максимальный объем полезных данных запроса составляет 100 МБ.

Azureml-fe масштабируется как вертикально, чтобы использовать больше ядер, так и горизонтально, чтобы использовать больше pod. При принятии решения о вертикальном увеличении масштаба используется время, необходимое для маршрутизации входящих запросов вывода. Если это время превышает пороговое значение, происходит вертикальное масштабирование. Если время для маршрутизации входящих запросов по-прежнему превышает пороговое значение, происходит горизонтальное масштабирование.

При уменьшении масштаба используется потребление ресурсов ЦП. Если пороговое значение потребления ЦП не превышается, сначала будет уменьшаться масштаб интерфейсного компонента. Если загрузка ЦП падает до порогового значения горизонтального масштабирования, выполняется операция горизонтального снижения масштаба. Увеличение и уменьшение масштаба выполняется только при наличии достаточных ресурсов кластера.

При горизонтальном масштабировании или уменьшении масштаба для применения изменений ЦП и памяти будут перезапущены модули pod azureml-Fe. Перезагрузка не влияет на запросы, связанные с выводом.

Общие сведения о требованиях к подключению для кластера вывода AKS

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

  • Сеть kubenet — ресурсы обычно создаются и настраиваются при развертывании кластера AKS.
  • Сеть Azure CNI — кластер AKS подключен к имеющимся ресурсу и конфигурациям виртуальной сети.

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

На приведенной ниже схеме показаны все требования к подключениям функции создания выводов AKS. Черные стрелки представляют фактический обмен данными, а синие — доменные имена. Вам может потребоваться добавить записи для этих узлов в брандмауэр или пользовательский DNS-сервер.

Требования к подключению для вывода AKS

Общие требования к подключениям AKS см. в статье Управление исходящим трафиком для узлов кластера в службе Azure Kubernetes (AKS).

Сведения о доступе к службам Машинного обучения Azure за брандмауэром см. в статье Как получить доступ к azureml за брандмауэром.

Общие требования к разрешению DNS

Вы можете контролировать разрешение DNS в существующей виртуальной сети. Пример: брандмауэр или пользовательский DNS-сервер. Должны быть доступны указанные ниже узлы.

Имя узла Где используется
<cluster>.hcp.<region>.azmk8s.io Сервер API AKS
mcr.microsoft.com Microsoft Container Registry (MCR)
<ACR name>.azurecr.io Ваш Реестр контейнеров Azure (ACR)
<account>.table.core.windows.net Учетная запись службы хранилища Azure (хранилище таблиц)
<account>.blob.core.windows.net Учетная запись службы хранилища Azure (хранилище больших двоичных объектов)
api.azureml.ms Проверка подлинности через Azure Active Directory (Azure AD)
ingest-vienna<region>.kusto.windows.net Конечная точка Kusto для отправки данных телеметрии
<leaf-domain-label + auto-generated suffix>.<region>.cloudapp.azure.com Доменное имя конечной точки, если оно автоматически создано Службой машинного обучения Azure. Если вы использовали имя личного домена, эта запись не требуется.

Требования к подключению в хронологическом порядке: от создания кластера до развертывания модели

В процессе создания или подключения AKS маршрутизатор Машинного обучения Azure (azureml-fe) развертывается в кластере AKS. Чтобы развернуть маршрутизатор Машинного обучения Azure, узел AKS должен иметь следующие возможности:

  • разрешить DNS для сервера API AKS;
  • Разрешение DNS для MCR для скачивания образов Docker для маршрутизатора Машинного обучения Azure
  • загрузить образы из MCR, где требуется исходящее подключение.

Сразу после развертывания azureml-fe будет предпринята попытка запуска, и для этого потребуется:

  • разрешить DNS для сервера API AKS;
  • запросить сервер API AKS для обнаружения других своих экземпляров (это служба с несколькими pod);
  • подключиться к другим своим экземплярам.

После запуска azureml-fe для его правильной работы требуются следующие подключения:

  • подключения к службе хранилища Azure для скачивания динамической конфигурации;
  • разрешения DNS для сервера проверки подлинности Azure AD api.azureml.ms и взаимодействия с ним, когда развернутая служба использует проверку подлинности Azure AD;
  • запроса сервера API AKS для обнаружения развернутых моделей;
  • взаимодействия с развернутыми pod модели.

Во время развертывания модели для успешного развертывания модели AKS узел должен иметь возможность:

  • разрешить DNS для ACR заказчика;
  • загружать образы из ACR заказчика;
  • разрешать DNS для BLOB-объектов Azure, где хранится модель;
  • загружать модели из BLOB-объект.ов Azure

После развертывания модели и запуска службы azureml-fe автоматически обнаружит ее с помощью API AKS и будет готов к маршрутизации запроса. Он должен иметь возможность взаимодействовать с pod модели.

Примечание

Если для развернутой модели требуется подключение (например, для запросов внешней базы данных или другой службы REST, загрузки BLOB-объекта и т. п.), то необходимо включить оба разрешения DNS и исходящий трафик для этих служб.

Развертывание в AKS

Чтобы развернуть модель в службе Azure Kubernetes, создайте конфигурацию развертывания, которая описывает требуемые вычислительные ресурсы. Например, количество ядер и объем памяти. Вам также потребуется конфигурация вывода, описывающая среду, необходимую для размещения модели и веб-службы. Дополнительные сведения о создании конфигурации вывода см. в разделе Как и где развертываются модели.

Примечание

Число развертываемых моделей должно быть не более 1000 на развертывание (для каждого контейнера).

ОБЛАСТЬ ПРИМЕНЕНИЯ:Пакет SDK для Python azureml версии 1

from azureml.core.webservice import AksWebservice, Webservice
from azureml.core.model import Model
from azureml.core.compute import AksCompute

aks_target = AksCompute(ws,"myaks")
# If deploying to a cluster configured for dev/test, ensure that it was created with enough
# cores and memory to handle this deployment configuration. Note that memory is also used by
# things such as dependencies and AML components.
deployment_config = AksWebservice.deploy_configuration(cpu_cores = 1, memory_gb = 1)
service = Model.deploy(ws, "myservice", [model], inference_config, deployment_config, aks_target)
service.wait_for_deployment(show_output = True)
print(service.state)
print(service.get_logs())

Дополнительные сведения о классах, методах и параметрах, используемых в этом примере, см. в следующих справочных документах:

Автомасштабирование

ОБЛАСТЬ ПРИМЕНЕНИЯ:Пакет SDK для Python azureml версии 1

Компонентом, который обрабатывает автомасштабирование для развертываний моделей Машинного обучения Azure, является azureml-fe, который представляет собой маршрутизатор смарт-запросов. Так как все запросы вывода проходят через него, у него есть все необходимые данные для автоматического масштабирования развернутых моделей.

Важно!

  • Не включайте горизонтальное автомасштабирование pod (HPA) Kubernetes для развертываний моделей. Иначе два компонента автомасштабирования будут конкурировать друг с другом. Azureml-fe предназначен для автоматического масштабирования моделей, развернутых Машинным обучением Azure, где HPA необходимо угадать или приблизить использование модели на основе универсальной метрики, такой как загрузка ЦП или настраиваемая конфигурация метрики.

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

Чтобы управлять автомасштабированием, можно настроить autoscale_target_utilization, autoscale_min_replicas и autoscale_max_replicas для веб-службы AKS. В следующем примере показано, как включить автомасштабирование.

aks_config = AksWebservice.deploy_configuration(autoscale_enabled=True, 
                                                autoscale_target_utilization=30,
                                                autoscale_min_replicas=1,
                                                autoscale_max_replicas=4)

Решения для увеличения или уменьшения масштаба основываются на использовании текущих реплик контейнеров. Количество занятых (обрабатывающих запросы) реплик, деленное на общее число текущих реплик, и является показателем текущего использования. Если это число превышает autoscale_target_utilization, то создаются дополнительные реплики. Если оно меньше, то реплики сокращаются. По умолчанию целевой показатель использования составляет 70 %.

Решения по добавлению реплик принимаются быстро (около 1 секунды). Решения по удалению реплик более консервативны и принимаются около 1 минуты.

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

from math import ceil
# target requests per second
targetRps = 20
# time to process the request (in seconds)
reqTime = 10
# Maximum requests per container
maxReqPerContainer = 1
# target_utilization. 70% in this example
targetUtilization = .7

concurrentRequests = targetRps * reqTime / targetUtilization

# Number of container replicas
replicas = ceil(concurrentRequests / maxReqPerContainer)

Дополнительные сведения о настройке autoscale_target_utilization, autoscale_max_replicas и autoscale_min_replicas см. в справочнике модуля AksWebservice.

Проверка подлинности веб-службы

При развертывании в службе Azure Kubernetes проверка подлинности на основе ключей включена по умолчанию. Вы также можете включить проверку подлинности на основе маркеров. Для проверки подлинности на основе маркеров клиенты должны использовать учетную запись Azure Active Directory для запроса маркера проверки подлинности, который используется для выполнения запросов к развернутой службе.

Чтобы отключить проверку подлинности, задайте параметр auth_enabled=False при создании конфигурации развертывания. В следующем примере пакет SDK используется для отключения проверки подлинности:

deployment_config = AksWebservice.deploy_configuration(cpu_cores=1, memory_gb=1, auth_enabled=False)

Сведения о проверке подлинности из клиентского приложения см. в разделе Использование модели Машинного обучения Azure, развернутой в качестве веб-службы.

Проверка подлинности на основе ключей

Если включена проверка подлинности на основе ключей, можно использовать метод get_keys для извлечения первичного и вторичного ключей проверки подлинности:

primary, secondary = service.get_keys()
print(primary)

Важно!

Если нужно повторно создать ключ, используйте service.regen_key.

Проверка подлинности на основе маркеров

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

deployment_config = AksWebservice.deploy_configuration(cpu_cores=1, memory_gb=1, token_auth_enabled=True)

Если включена проверка подлинности на основе маркеров, можно использовать метод get_token для получения JWT-маркера и его срока действия:

token, refresh_by = service.get_token()
print(token)

Важно!

Вам потребуется запросить новый маркер после истечения его времени refresh_by.

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

Чтобы получить маркер, необходимо использовать пакет SDK для Машинного обучения Azure или команду az ml service get-access-token.

Сканирование уязвимостей

Microsoft Defender для облака предоставляет единое управление безопасностью и расширенную защиту от угроз для рабочих нагрузок гибридного облака. Вы должны разрешить Microsoft Defender для облака проверять ваши ресурсы и следовать его рекомендациям. Подробнее см. в разделе "Интеграция служб Azure Kubernetes с Defender для облака".

Дальнейшие действия