Развертывание моделей машинного обучения в Azure

ОБЛАСТЬ ПРИМЕНЕНИЯ:Расширение Машинного обучения для Azure CLI версии 1пакет SDK для Python azureml версии 1

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

Примечание.

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

Рабочий процесс для развертывания модели

Последовательность действий всегда одна и та же, независимо от того, где развертывается модель:

  1. регистрация модели;
  2. Подготовка начального сценария.
  3. Подготовка конфигурации вывода.
  4. Локальное развертывание модели для проверки работы всех элементов.
  5. выбор целевого объекта вычислений;
  6. Развертывание модели в облаке.
  7. тестирование получившейся веб-службы.

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

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

ОБЛАСТЬ ПРИМЕНЕНИЯ: Расширение ML для Azure CLI версии 1

Важно!

Для использования некоторых команд Azure CLI, приведенных в этой статье, используйте расширение azure-cli-ml (версия 1) для Машинного обучения Azure. Поддержка расширения версии 1 будет прекращена 30 сентября 2025 г. Вы можете установить и использовать расширение версии 1 до этой даты.

Рекомендуется перейти на расширение ml (версия 2) до 30 сентября 2025 г. Дополнительные сведения о расширении версии 2 см. на странице расширения CLI для Azure ML и пакета SDK для Python версии 2.

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

ОБЛАСТЬ ПРИМЕНЕНИЯ: Расширение ML для Azure CLI версии 1

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

az login
az account set -s <subscription>
az ml workspace list --resource-group=<resource-group>

Регистрация модели.

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

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

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

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

В следующих примерах показано, как зарегистрировать модель.

Важно!

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

ОБЛАСТЬ ПРИМЕНЕНИЯ: Расширение ML для Azure CLI версии 1

Приведенные ниже команды загружают модель и регистрируют ее в рабочей области Машинного обучения Azure:

wget https://aka.ms/bidaf-9-model -O model.onnx --show-progress
az ml model register -n bidaf_onnx \
    -p ./model.onnx \
    -g <resource-group> \
    -w <workspace-name>

Задайте параметр -p в пути к папке или файлу, которые необходимо зарегистрировать.

Дополнительные сведения о az ml model register см. в справочной документации.

Регистрация модели из задания обучения Машинное обучение Azure

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

az ml model register -n bidaf_onnx --asset-path outputs/model.onnx --experiment-name myexperiment --run-id myrunid --tag area=qna

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

Дополнительные сведения о az ml model register см. в справочной документации.

Примечание.

Вы также можете зарегистрировать модель из локального файла с помощью портала пользовательского интерфейса рабочей области.

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

  • Из локальных файлов, которые будут регистрировать модель версии 2.
  • Из локальных файлов (на основе платформы), которая будет регистрировать модель версии 1.

Обратите внимание, что только модели, зарегистрированные через вход из локальных файлов (на основе платформы), которые называются моделями версии 1, можно развертывать как веб-службы с помощью SDKv1/CLIv1.

Определение фиктивного начального сценария

Скрипт входа принимает данные, отправляемые в развернутую веб-службу, и передает их в модель. Затем он возвращает ответ модели клиенту. Этот сценарий относится только к вашей модели. Начальный сценарий оптимизирован для работы с данными, которые получает и возвращает модель.

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

  1. Загрузка модели (с помощью функции init()).
  2. Запуск модели с входными данным (с помощью функции run()).

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

import json


def init():
    print("This is init")


def run(data):
    test = json.loads(data)
    print(f"received data {test}")
    return f"test is {test}"

Сохраните этот файл как echo_score.py в каталоге source_dir. Этот фиктивный сценарий возвращает данные, которые вы ему отправляете. Он не использует модель. Но так вы сможете убедиться, что сценарий оценки работает.

Определение конфигурации вывода

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

В конфигурации вывода ниже указано, что при развертывании машинного обучения файл echo_score.py в каталоге ./source_dir будет использоваться для обработки входящих запросов, а образ Docker будет использоваться с пакетами Python, указанными в среде project_environment.

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

Примечание.

При загрузке исходный каталог вывода машинного обучения Azure не учитываются .gitignore или .amlignore

ОБЛАСТЬ ПРИМЕНЕНИЯ: Расширение ML для Azure CLI версии 1

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

{
    "entryScript": "echo_score.py",
    "sourceDirectory": "./source_dir",
    "environment": {
        "docker": {
            "arguments": [],
            "baseDockerfile": null,
            "baseImage": "mcr.microsoft.com/azureml/openmpi3.1.2-ubuntu18.04",
            "enabled": false,
            "sharedVolumes": true,
            "shmSize": null
        },
        "environmentVariables": {
            "EXAMPLE_ENV_VAR": "EXAMPLE_VALUE"
        },
        "name": "my-deploy-env",
        "python": {
            "baseCondaEnvironment": null,
            "condaDependencies": {
                "channels": [],
                "dependencies": [
                    "python=3.6.2",
                    {
                        "pip": [
                            "azureml-defaults"
                        ]
                    }
                ],
                "name": "project_environment"
            },
            "condaDependenciesFile": null,
            "interpreterPath": "python",
            "userManagedDependencies": false
        },
        "version": "1"
    }
}

Сохраните файл под именем dummyinferenceconfig.json.

Более подробное обсуждение конфигураций вывода см. в этой статье.

Определение конфигурации развертывания

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

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

ОБЛАСТЬ ПРИМЕНЕНИЯ: Расширение ML для Azure CLI версии 1

Записи в документе deploymentconfig.json соответствуют параметрам для LocalWebservice.deploy_configuration. В следующей таблице описано сопоставление сущностей в документе JSON и параметров метода:

Сущность JSON Параметр метода Description
computeType Неприменимо Целевой объект вычислений. Для локальных целевых объектов нужно задать значение local.
port port Локальный порт, на который будет предоставляться конечная точка HTTP службы.

Код JSON — это пример конфигурации развертывания для использования с CLI:

{
    "computeType": "local",
    "port": 32267
}

Сохраните этот JSON как файл с именем deploymentconfig.json.

Дополнительные сведения см. в разделе со схемой развертывания.

Развертывание модели машинного обучения

Теперь все готово для развертывания модели.

ОБЛАСТЬ ПРИМЕНЕНИЯ: Расширение ML для Azure CLI версии 1

Замените bidaf_onnx:1 названием вашей модели и номером ее версии.

az ml model deploy -n myservice \
    -m bidaf_onnx:1 \
    --overwrite \
    --ic dummyinferenceconfig.json \
    --dc deploymentconfig.json \
    -g <resource-group> \
    -w <workspace-name>

Вызов модели

Проверим, успешно ли развернута модель echo. Следует выполнить простой запрос для проверки работоспособности, а также запрос оценки:

ОБЛАСТЬ ПРИМЕНЕНИЯ: Расширение ML для Azure CLI версии 1

curl -v http://localhost:32267
curl -v -X POST -H "content-type:application/json" \
    -d '{"query": "What color is the fox", "context": "The quick brown fox jumped over the lazy dog."}' \
    http://localhost:32267/score

Определение начального сценария

Теперь пора загрузить модель. Сначала изменим начальный сценарий:

import json
import numpy as np
import os
import onnxruntime
from nltk import word_tokenize
import nltk


def init():
    nltk.download("punkt")
    global sess
    sess = onnxruntime.InferenceSession(
        os.path.join(os.getenv("AZUREML_MODEL_DIR"), "model.onnx")
    )


def run(request):
    print(request)
    text = json.loads(request)
    qw, qc = preprocess(text["query"])
    cw, cc = preprocess(text["context"])

    # Run inference
    test = sess.run(
        None,
        {"query_word": qw, "query_char": qc, "context_word": cw, "context_char": cc},
    )
    start = np.asscalar(test[0])
    end = np.asscalar(test[1])
    ans = [w for w in cw[start : end + 1].reshape(-1)]
    print(ans)
    return ans


def preprocess(word):
    tokens = word_tokenize(word)

    # split into lower-case word tokens, in numpy array with shape of (seq, 1)
    words = np.asarray([w.lower() for w in tokens]).reshape(-1, 1)

    # split words into chars, in numpy array with shape of (seq, 1, 1, 16)
    chars = [[c for c in t][:16] for t in tokens]
    chars = [cs + [""] * (16 - len(cs)) for cs in chars]
    chars = np.asarray(chars).reshape(-1, 1, 1, 16)
    return words, chars

Сохраните этот файл под именем score.py в source_dir.

Обратите внимание на использование переменной среды AZUREML_MODEL_DIR для определения места зарегистрированной модели. Теперь мы добавили несколько пакетов pip.

ОБЛАСТЬ ПРИМЕНЕНИЯ: Расширение ML для Azure CLI версии 1

{
    "entryScript": "score.py",
    "sourceDirectory": "./source_dir",
    "environment": {
        "docker": {
            "arguments": [],
            "baseDockerfile": null,
            "baseImage": "mcr.microsoft.com/azureml/openmpi3.1.2-ubuntu18.04",
            "enabled": false,
            "sharedVolumes": true,
            "shmSize": null
        },
        "environmentVariables": {
            "EXAMPLE_ENV_VAR": "EXAMPLE_VALUE"
        },
        "name": "my-deploy-env",
        "python": {
            "baseCondaEnvironment": null,
            "condaDependencies": {
                "channels": [],
                "dependencies": [
                    "python=3.6.2",
                    {
                        "pip": [
                            "azureml-defaults",
                            "nltk",
                            "numpy",
                            "onnxruntime"
                        ]
                    }
                ],
                "name": "project_environment"
            },
            "condaDependenciesFile": null,
            "interpreterPath": "python",
            "userManagedDependencies": false
        },
        "version": "2"
    }
}

Сохраните этот файл как inferenceconfig.json.

Повторное развертывание и вызов службы

Снова развернем службу:

ОБЛАСТЬ ПРИМЕНЕНИЯ: Расширение ML для Azure CLI версии 1

Замените bidaf_onnx:1 названием вашей модели и номером ее версии.

az ml model deploy -n myservice \
    -m bidaf_onnx:1 \
    --overwrite \
    --ic inferenceconfig.json \
    --dc deploymentconfig.json \
    -g <resource-group> \
    -w <workspace-name>

Теперь проверим, что можем отправить в службу запрос POST:

ОБЛАСТЬ ПРИМЕНЕНИЯ: Расширение ML для Azure CLI версии 1

curl -v -X POST -H "content-type:application/json" \
    -d '{"query": "What color is the fox", "context": "The quick brown fox jumped over the lazy dog."}' \
    http://localhost:32267/score

Выбор целевого объекта вычислений

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

Целевой объект вычислений Используется для Поддержка GPU Description
Локальная веб-служба Тестирование и отладка   Используется для ограниченного тестирования и устранения неполадок. Аппаратное ускорение зависит от использования библиотек в локальной системе.
Kubernetes для Машинного обучения Azure Вывод в реальном времени Да Запустите рабочие нагрузки вывода в облаке.
Экземпляры контейнеров Azure Вывод в режиме реального времени

Рекомендуется только для разработки и тестирования.
  Используйте для небольших рабочих нагрузок на основе ЦП, которым требуется менее 48 ГБ ОЗУ. Не требует управления кластером.

Подходит только для моделей размером менее 1 ГБ.

Поддерживается в конструкторе.

Примечание.

При выборе SKU кластера сначала масштабируйте и масштабируйте. Начните с компьютера с 150% ОЗУ, который требуется для вашей модели, профилируйте результат и найдите компьютер с необходимой производительностью. После этого увеличьте количество компьютеров в соответствии с объемом параллельного вывода.

Примечание.

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

Развертывание в облаке

Теперь, убедившись, что служба работает локально и выбрав удаленный целевой объект вычислений, можно приступать к развертыванию в облаке.

Изменим конфигурацию развертывания таким образом, чтобы она соответствовала выбранному целевому объекту вычислений (в данном случае — Экземплярам контейнеров Azure):

ОБЛАСТЬ ПРИМЕНЕНИЯ: Расширение ML для Azure CLI версии 1

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

{
    "computeType": "aci",
    "containerResourceRequirements":
    {
        "cpu": 0.5,
        "memoryInGB": 1.0
    },
    "authEnabled": true,
    "sslEnabled": false,
    "appInsightsEnabled": false
}

Сохраните этот файл как re-deploymentconfig.json.

Дополнительные сведения см. в этом справочнике.

Снова развернем службу:

ОБЛАСТЬ ПРИМЕНЕНИЯ: Расширение ML для Azure CLI версии 1

Замените bidaf_onnx:1 названием вашей модели и номером ее версии.

az ml model deploy -n myservice \
    -m bidaf_onnx:1 \
    --overwrite \
    --ic inferenceconfig.json \
    --dc re-deploymentconfig.json \
    -g <resource-group> \
    -w <workspace-name>

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

az ml service get-logs -n myservice \
    -g <resource-group> \
    -w <workspace-name>

Вызов удаленной веб-службы

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

import requests
import json
from azureml.core import Webservice

service = Webservice(workspace=ws, name="myservice")
scoring_uri = service.scoring_uri

# If the service is authenticated, set the key or token
key, _ = service.get_keys()

# Set the appropriate headers
headers = {"Content-Type": "application/json"}
headers["Authorization"] = f"Bearer {key}"

# Make the request and display the response and logs
data = {
    "query": "What color is the fox",
    "context": "The quick brown fox jumped over the lazy dog.",
}
data = json.dumps(data)
resp = requests.post(scoring_uri, data=data, headers=headers)
print(resp.text)
print(service.get_logs())

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

Настройка сообщений электронной почты в студии

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

  1. В студии машинного обучения Azure перейдите к параметрам, выбрав значок шестеренки.
  2. Перейдите на вкладку Уведомления по электронной почте.
  3. Включите или отключите уведомления по электронной почте для конкретного события.

Screenshot of Azure ML studio's settings on the email notifications tab.

Основные сведения о состоянии службы

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

Возможные состояния обновления описаны в следующей таблице:

Состояние веб-службы Description Конечное состояние?
Переходное Служба находится в процессе развертывания. No
Unhealthy Служба была развернута, но сейчас недоступна. No
Невозможно запланировать В настоящее время служба не может быть развернута из-за нехватки ресурсов. No
Неудачно Не удалось выполнить развертывание службы из-за ошибки или сбоя. Да
Работоспособно Служба работоспособна, конечная точка доступна. Да

Совет

При развертывании образы Docker для целевых объектов вычислений создаются и загружаются из Реестра контейнеров Azure (ACR). По умолчанию служба Машинного обучения Azure создает реестр ACR, который использует уровень обслуживания Basic. Изменение ACR для рабочей области на уровень "Стандарт" или "Премиум" может сократить время, затрачиваемое на сборку и развертывание образов в целевые объекты вычислений. Дополнительные сведения см в статье Уровни службы Реестра контейнеров Azure.

Примечание.

При развертывании модели в Службе Azure Kubernetes (AKS) рекомендуется включить Azure Monitor для этого кластера. Это поможет определить общую работоспособность кластера и использование ресурсов. Могут также быть полезными следующие ресурсы.

Если вы пытаетесь развернуть модель в неработоспособном или перегруженном кластере, возникнут проблемы. Если вам нужна помощь в устранении неполадок кластера AKS, обратитесь в службу поддержки AKS.

Удаление ресурсов

ОБЛАСТЬ ПРИМЕНЕНИЯ: Расширение ML для Azure CLI версии 1

# Get the current model id
import os

stream = os.popen(
    'az ml model list --model-name=bidaf_onnx --latest --query "[0].id" -o tsv'
)
MODEL_ID = stream.read()[0:-1]
MODEL_ID
az ml service delete -n myservice
az ml service delete -n myaciservice
az ml model delete --model-id=<MODEL_ID>

Для удаления развернутой веб-службы используйте az ml service delete <name of webservice>.

Чтобы удалить зарегистрированную модель из рабочей области, используйте az ml model delete <model id>

Узнайте больше об удалении веб-службы и удалении модели.

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