Развертывание модели машинного обучения в Функции Azure с помощью кэша Azure для Redis

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

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

Примечание

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

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

Важно!

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

  • ws — рабочая область Машинного обучения Azure;
  • model — зарегистрированная модель, которая должна быть развернута;
  • inference_config — конфигурация вывода для модели.

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

Создание экземпляра кэша Azure для Redis

Вы сможете развернуть модель машинного обучения в службе "функции Azure" с любым экземпляром кэша Basic, Standard или Premium. Чтобы создать управляемый экземпляр, сделайте следующее.

  1. Перейдите на домашнюю страницу портал Azure или откройте меню боковой панели, а затем выберите создать ресурс.

  2. На странице Создание выберите Базы данных, а затем Кэш Azure для Redis.

    Выберите

  3. На странице Новый кэш Redis настройте параметры для нового кэша.

    Параметр Рекомендуемое значение Description
    DNS-имя Введите глобально уникальное имя Имя кэша должно быть строкой длиной от 1 до 63 символов. Строка может содержать только цифры, буквы и дефисы. Имя должно начинаться и заканчиваться цифрой или буквой и не может содержать более одного дефиса подряд. Именем узла для экземпляра кэша будет <DNS-имя>.redis.cache.windows.net.
    Подписка Раскройте список и выберите нужную подписку. В этой подписке будет создан новый экземпляр кэша Redis для Azure.
    Группа ресурсов Раскройте список и выберите группу ресурсов или нажмите Создать и введите имя для новой группы ресурсов. Имя группы ресурсов, в которой будут созданы кэш и другие ресурсы. Поместив все ресурсы приложения в одну группу ресурсов, вы сможете легко управлять ими и/или удалить их вместе.
    Местоположение Откройте список и выберите расположение. Выберите оптимальный регион для других служб, которые будут использовать кэш.
    Ценовая категория Откройте список и выберите ценовую категорию. Ценовая категория определяет размер, производительность и функции, доступные для кэша. Дополнительные сведения см. в обзоре предложения "Кэш Redis для Azure".
  4. Выберите вкладку Сети или нажмите кнопку Сети в нижней части страницы.

  5. На вкладке Сети выберите способ подключения.

  6. Выберите вкладку Далее: дополнительно или нажмите в нижней части страницы кнопку Далее: дополнительно.

  7. На вкладке Дополнительно для экземпляра кэша уровня "Базовый" или "Стандартный" установите переключатель, чтобы включить порт, отличный от TLS.

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

  9. Выберите вкладку Далее: теги или нажмите в нижней части страницы кнопку Далее: теги.

  10. При необходимости на вкладке Теги введите имя и значение, чтобы классифицировать ресурс.

  11. Выберите Проверить и создать. Вы будете перенаправлены на вкладку "Просмотр и создание", где Azure проверит вашу конфигурацию.

  12. Когда отобразится сообщение "Проверка пройдена" зеленого цвета, выберите Создать.

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

Подготовка к развертыванию

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

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

    Важно!

    Сценарий входа зависит от модели. Он должен воспринимать формат данных входящего запроса, формат данных, ожидаемых моделью, и формат данных, возвращаемых клиентам.

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

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

Для функции запуска убедитесь, что она подключается к конечной точке Redis.

import json
import numpy as np
import os
import redis
from sklearn.externals import joblib

def init():
    global model
    global azrediscache
    azrediscache = redis.StrictRedis(host='<host_url>', port=6380, password="<access_key>", ssl=True)
    model_path = os.path.join(os.getenv('AZUREML_MODEL_DIR'), 'sklearn_mnist_model.pkl')
    model = joblib.load(model_path)

@input_schema('data', NumpyParameterType(input_sample))
@output_schema(NumpyParameterType(output_sample))
def run(data):
    try:
        input = azrediscache.get(data)
        result = model.predict(input)
        data = np.array(json.loads(data))
        result = model.predict(data)
        # You can return any data type, as long as it is JSON serializable.
        return result.tolist()
    except Exception as e:
        error = str(e)
        return error

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

  • Зависимости, например вспомогательные скрипты или пакеты Python и Conda, необходимые для выполнения скрипта входа или модели

Эти объекты инкапсулированы в конфигурации вывода. В конфигурации зависимостей указываются скрипт входа и другие зависимости.

Важно!

При создании конфигурации вывода для использования с Функциями Azure необходимо использовать объект Среда. Обратите внимание, что при определении настраиваемой среды необходимо составить список azureml-defaults с версией >= 1.0.45 в качестве зависимости pip. Этот пакет содержит функции, необходимые для размещения модели в качестве веб-службы. В следующем примере демонстрируется создание объекта среды и его использование с конфигурацией вывода:

from azureml.core.environment import Environment
from azureml.core.conda_dependencies import CondaDependencies

# Create an environment and add conda dependencies to it
myenv = Environment(name="myenv")
# Enable Docker based environment
myenv.docker.enabled = True
# Build conda dependencies
myenv.python.conda_dependencies = CondaDependencies.create(conda_packages=['scikit-learn'],
                                                           pip_packages=['azureml-defaults', 'redis'])
inference_config = InferenceConfig(entry_script="score.py", environment=myenv)

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

Дополнительные сведения о конфигурации вывода см. в статье Развертывание моделей с Машинным обучением Azure.

Важно!

При развертывании в функциях не требуется создавать конфигурацию развертывания.

Установка пакета SDK для поддержки функций

Чтобы создать пакеты для функций Azure, необходимо установить пакет SDK предварительной версии.

pip install azureml-contrib-functions

Создание образа

Чтобы создать образ Docker, развернутый в Функциях Azure, используйте пакет azureml.contrib.functions.package или специальный пакета для своего триггера. В следующем фрагменте кода показано, как создать новый пакет с триггером HTTP для конфигурации модели и вывода:

Примечание

Фрагмент кода предполагает model зарегистрированную модель и inference_configконфигурацию для среды вывода. Дополнительные сведения см. в статье Развертывание моделей в системе Машинного обучения Azure.

from azureml.contrib.functions import package
from azureml.contrib.functions import HTTP_TRIGGER
model_package = package(ws, [model], inference_config, functions_enabled=True, trigger=HTTP_TRIGGER)
model_package.wait_for_creation(show_output=True)
# Display the package location/ACR path
print(model_package.location)

Выходные данные процесса сборки DOCKER показаны при значении show_output=True. После завершения процесса создается образ в Реестре контейнеров Azure для рабочей области. После построения образа будет показано его местонахождение в Реестре контейнеров Azure. Возвращаемое расположение имеет формат <acrinstance>.azurecr.io/package@sha256:<imagename>.

Примечание

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

Важно!

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

Развертывание образа как веб-приложения

  1. Используйте следующую команду, чтобы получить учетные данные входа для Реестра контейнеров Azure, содержащего образ. Замените <myacr> значением, возвращенным ранее из package.location.

    az acr credential show --name <myacr>
    

    Вывод этой команды аналогичен следующему документу JSON:

    {
    "passwords": [
        {
        "name": "password",
        "value": "abcdefghijklmmopqrstuv1234567890"
        },
        {
        "name": "password2",
        "value": "1234567890abcdefghijklmmopqrstuv"
        }
    ],
    "username": "charlie.roy"
    }
    

    Скопируйте значение для имя пользователя и один из паролей.

  2. Если у вас еще нет группы ресурсов или плана службы приложений для развертывания службы, их можно создать с помощью следующих команд:

    az group create --name myresourcegroup --location "West Europe"
    az appservice plan create --name myplanname --resource-group myresourcegroup --sku B1 --is-linux
    

    В этом примере используется ценовая категория Базовая Linux уровня (--sku B1).

    Важно!

    Образы созданы системой Машинного обучения Azure с помощью Linux, поэтому необходимо использовать параметр --is-linux.

  3. Создайте учетную запись хранения, которая будет использоваться для хранения веб-заданий, и получите ее строку подключения. Замените <webjobStorage> именем, которое планируется использовать.

    az storage account create --name <webjobStorage> --location westeurope --resource-group myresourcegroup --sku Standard_LRS
    
    az storage account show-connection-string --resource-group myresourcegroup --name <webJobStorage> --query connectionString --output tsv
    
  4. Чтобы создать приложение функции, используйте следующую команду. Замените <app-name> именем, которое планируется использовать. Замените <acrinstance> и <imagename> значениями, возвращенными ранее из package.location. Замените <webjobStorage> именем учетной записи хранения из предыдущего шага:

    az functionapp create --resource-group myresourcegroup --plan myplanname --name <app-name> --deployment-container-image-name <acrinstance>.azurecr.io/package:<imagename> --storage-account <webjobStorage>
    

    Важно!

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

  5. Чтобы предоставить приложению функции учетные данные, необходимые для доступа к реестру контейнеров, используйте следующую команду. Замените <app-name> на имя функции-приложения. Замените <acrinstance> и <imagetag> значениями из вызова AZ CLI на предыдущем шаге. Замените <username> и <password> на сведения для входа записи контроля доступа, полученные ранее:

    az functionapp config container set --name <app-name> --resource-group myresourcegroup --docker-custom-image-name <acrinstance>.azurecr.io/package:<imagetag> --docker-registry-server-url https://<acrinstance>.azurecr.io --docker-registry-server-user <username> --docker-registry-server-password <password>
    

    Эта команда возвращает сведения аналогичные следующему JSON-документу:

    [
    {
        "name": "WEBSITES_ENABLE_APP_SERVICE_STORAGE",
        "slotSetting": false,
        "value": "false"
    },
    {
        "name": "DOCKER_REGISTRY_SERVER_URL",
        "slotSetting": false,
        "value": "[server-name].azurecr.io"
    },
    {
        "name": "DOCKER_REGISTRY_SERVER_USERNAME",
        "slotSetting": false,
        "value": "[username]"
    },
    {
        "name": "DOCKER_REGISTRY_SERVER_PASSWORD",
        "slotSetting": false,
        "value": null
    },
    {
        "name": "DOCKER_CUSTOM_IMAGE_NAME",
        "value": "DOCKER|[server-name].azurecr.io/package:20190827195524"
    }
    ]
    

На этом этапе приложение функции начинает загрузку образа.

Важно!

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

Триггер HTTP в Функциях Azure

Теперь мы выполним и протестируем триггер HTTP для Функций Azure.

  1. Откройте приложение-функцию на портале Azure.
  2. В разделе Разработчик выберите код + тест.
  3. Выберите вкладку Входные данные справа.
  4. Нажмите кнопку Выполнить, чтобы проверить триггер HTTP для Функций Azure.

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

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

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

В противном случае, если вы закончите работу с кратким руководством, вы можете удалить ресурсы Azure, созданные в рамках этого руководства, чтобы избежать ненужных расходов.

Важно!

Удаление группы ресурсов — процесс необратимый. Группа ресурсов и все содержащиеся в ней ресурсы удаляются без возможности восстановления. Будьте внимательны, чтобы случайно не удалить не ту группу ресурсов или не те ресурсы. Если ресурсы для размещения этого примера созданы в имеющейся группе ресурсов, которая содержит другие нужные ресурсы, каждый ресурс можно удалить отдельно в области слева, чтобы не удалять группу ресурсов.

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

  1. Войдите на портал Azure и щелкните Группы ресурсов.

  2. Введите имя группы ресурсов в поле Фильтровать по имени... В своей группе ресурсов в списке результатов щелкните ..., а затем выберите Удалить группу ресурсов.

Подтвердите операцию удаления группы ресурсов. Введите имя группы ресурсов, которую необходимо удалить, и щелкните Удалить.

Через некоторое время группа ресурсов и все ее ресурсы будут удалены.

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