Развертывание зарегистрированной модели R в конечную точку в сети (в режиме реального времени)

ОБЛАСТЬ ПРИМЕНЕНИЯ:расширение Машинного обучения для Azure CLI версии 2 (текущая версия)

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

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

Создание папки с этой структурой

Создайте эту структуру папок для проекта:

📂 r-deploy-azureml
 ├─📂 docker-context
 │  ├─ Dockerfile
 │  └─ start_plumber.R
 ├─📂 src
 │  └─ plumber.R
 ├─ deployment.yml
 ├─ endpoint.yml

Содержимое каждого из этих файлов показано и описано в этой статье.

Dockerfile

Это файл, определяющий среду контейнера. Вы также определите установку дополнительных пакетов R здесь.

Пример Dockerfile будет выглядеть следующим образом:

# REQUIRED: Begin with the latest R container with plumber
FROM rstudio/plumber:latest

# REQUIRED: Install carrier package to be able to use the crated model (whether from a training job
# or uploaded)
RUN R -e "install.packages('carrier', dependencies = TRUE, repos = 'https://cloud.r-project.org/')"

# OPTIONAL: Install any additional R packages you may need for your model crate to run
RUN R -e "install.packages('<PACKAGE-NAME>', dependencies = TRUE, repos = 'https://cloud.r-project.org/')"
RUN R -e "install.packages('<PACKAGE-NAME>', dependencies = TRUE, repos = 'https://cloud.r-project.org/')"

# REQUIRED
ENTRYPOINT []

COPY ./start_plumber.R /tmp/start_plumber.R 

CMD ["Rscript", "/tmp/start_plumber.R"]

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

Водопроводчик. R

Важно!

В этом разделе показано, как структурировать сантехнику . Скрипт R . Подробные сведения о пакете plumber см plumber . в документации .

Файл сантехника. R — это сценарий R, в котором вы определите функцию для оценки. Этот скрипт также выполняет задачи, необходимые для работы конечной точки. Сценарий:

  • Возвращает путь, по которому модель подключена из переменной AZUREML_MODEL_DIR среды в контейнере.
  • Загружает объект модели, созданный с crate помощью функции из carrier пакета, который был сохранен как crate.bin при его упаковке.
  • Несериализирует объект модели
  • Определяет функцию оценки

Совет

Убедитесь, что независимо от того, какую функцию оценки можно преобразовать обратно в JSON. Некоторые объекты R не легко преобразуются.

# plumber.R
# This script will be deployed to a managed endpoint to do the model scoring

# REQUIRED
# When you deploy a model as an online endpoint, Azure Machine Learning mounts your model
# to your endpoint. Model mounting enables you to deploy new versions of the model without
# having to create a new Docker image.

model_dir <- Sys.getenv("AZUREML_MODEL_DIR")

# REQUIRED
# This reads the serialized model with its respecive predict/score method you 
# registered. The loaded load_model object is a raw binary object.
load_model <- readRDS(paste0(model_dir, "/models/crate.bin"))

# REQUIRED
# You have to unserialize the load_model object to make it its function
scoring_function <- unserialize(load_model)

# REQUIRED
# << Readiness route vs. liveness route >>
# An HTTP server defines paths for both liveness and readiness. A liveness route is used to
# check whether the server is running. A readiness route is used to check whether the 
# server's ready to do work. In machine learning inference, a server could respond 200 OK 
# to a liveness request before loading a model. The server could respond 200 OK to a
# readiness request only after the model has been loaded into memory.

#* Liveness check
#* @get /live
function() {
  "alive"
}

#* Readiness check
#* @get /ready
function() {
  "ready"
}

# << The scoring function >>
# This is the function that is deployed as a web API that will score the model
# Make sure that whatever you are producing as a score can be converted 
# to JSON to be sent back as the API response
# in the example here, forecast_horizon (the number of time units to forecast) is the input to scoring_function.  
# the output is a tibble
# we are converting some of the output types so they work in JSON


#* @param forecast_horizon 
#* @post /score
function(forecast_horizon) {
  scoring_function(as.numeric(forecast_horizon)) |> 
    tibble::as_tibble() |> 
    dplyr::transmute(period = as.character(yr_wk),
                     dist = as.character(logmove),
                     forecast = .mean) |> 
    jsonlite::toJSON()
}

start_plumber. R

Файл start_plumber. R — это скрипт R , который запускается при запуске контейнера, и вызывает ваш сантехник. Скрипт R . Используйте следующий скрипт как есть.

entry_script_path <- paste0(Sys.getenv('AML_APP_ROOT'),'/', Sys.getenv('AZUREML_ENTRY_SCRIPT'))

pr <- plumber::plumb(entry_script_path)

args <- list(host = '0.0.0.0', port = 8000); 

if (packageVersion('plumber') >= '1.0.0') {
  pr$setDocs(TRUE)
} else { 
  args$swagger <- TRUE 
} 

do.call(pr$run, args)

Контейнер сборки

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

  1. Войдите в Студию машинного обучения Azure.
  2. При необходимости выберите рабочую область.
  3. В области навигации слева выберите среды.
  4. В верхней части выберите настраиваемые среды.
  5. Если вы видите пользовательские среды, ничего больше не требуется.
  6. Если вы не видите пользовательские среды, создайте среду R или любую другую пользовательскую среду. (Вы не будете использовать эту среду для развертывания, но будете использовать реестр контейнеров, который также создан для вас.)

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

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

    az login --identity
    

    Если вы не находитесь в вычислительном экземпляре, опустите --identity и следуйте запросу, чтобы открыть окно браузера для проверки подлинности.

  2. Убедитесь, что у вас есть самые последние версии интерфейса командной строки и ml расширения:

    az upgrade
    
  3. Если у вас несколько подписок Azure, задайте активную подписку на ту, которую вы используете для рабочей области. (Этот шаг можно пропустить, только если у вас есть доступ только к одной подписке.) Замените <SUBSCRIPTION-NAME> именем подписки. Также удалите квадратные скобки <>.

    az account set --subscription "<SUBSCRIPTION-NAME>"
    
  4. Задайте рабочую область по умолчанию. Если вы делаете это из вычислительного экземпляра, можно использовать следующую команду, как показано ниже. Если вы находитесь на любом другом компьютере, замените вместо него имя группы ресурсов и рабочей области. (Эти значения можно найти в Студия машинного обучения Azure.)

    az configure --defaults group=$CI_RESOURCE_GROUP workspace=$CI_WORKSPACE
    
  5. Убедитесь, что вы находитесь в каталоге проекта.

    cd r-deploy-azureml
    
  6. Чтобы создать образ в облаке, выполните следующие команды bash в терминале. Замените <IMAGE-NAME> именем, которое вы хотите дать изображению.

    Если рабочая область находится в виртуальной сети, ознакомьтесь с дополнительными инструкциями по добавлению --image-build-computeaz acr build в команду в последней строке этого кода Реестр контейнеров Azure (ACR).

    WORKSPACE=$(az config get --query "defaults[?name == 'workspace'].value" -o tsv)
    ACR_NAME=$(az ml workspace show -n $WORKSPACE --query container_registry -o tsv | cut -d'/' -f9-)
    IMAGE_TAG=${ACR_NAME}.azurecr.io/<IMAGE-NAME>
    
    az acr build ./docker-context -t $IMAGE_TAG -r $ACR_NAME
    

Важно!

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

Команда az acr автоматически отправляет папку docker-context, содержащую артефакты для сборки образа, в облако, где будет создан образ и размещен в Реестр контейнеров Azure.

Развертывание модели

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

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

  • Проверка подлинности с помощью проверки подлинности на основе ключа и токена
  • Завершение SSL-запросов
  • Стабильный URI оценки (endpoint-name.region.inference.ml.Azure.com)

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

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

  1. В каталоге проекта добавьте файл endpoint.yml со следующим кодом. Замените <ENDPOINT-NAME> именем, которое вы хотите предоставить управляемой конечной точке.

    $schema: https://azuremlschemas.azureedge.net/latest/managedOnlineEndpoint.schema.json
    name: <ENDPOINT-NAME>
    auth_mode: aml_token
    
  2. Используя тот же терминал, где вы создали образ, выполните следующую команду CLI, чтобы создать конечную точку:

    az ml online-endpoint create -f endpoint.yml
    
  3. Оставьте терминал открытым, чтобы продолжить его использование в следующем разделе.

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

  1. Чтобы создать развертывание, добавьте следующий код в файл deployment.yml .

    • Замените <ENDPOINT-NAME> имя конечной точки, определенное в файле endpoint.yml

    • Замените <DEPLOYMENT-NAME> именем, которое вы хотите присвоить развертыванию

    • Замените <MODEL-URI> URI зарегистрированной модели в виде azureml:modelname@latest

    • Замените <IMAGE-TAG> значением из:

      echo $IMAGE_TAG
      
    $schema: https://azuremlschemas.azureedge.net/latest/managedOnlineDeployment.schema.json
    name: <DEPLOYMENT-NAME>
    endpoint_name: <ENDPOINT-NAME>
    code_configuration:
      code: ./src
      scoring_script: plumber.R
    model: <MODEL-URI>
    environment:
      image: <IMAGE-TAG>
      inference_config:
        liveness_route:
          port: 8000
          path: /live
        readiness_route:
          port: 8000
          path: /ready
        scoring_route:
          port: 8000
          path: /score
    instance_type: Standard_DS2_v2
    instance_count: 1
    
  2. Затем в терминале выполните следующую команду CLI, чтобы создать развертывание (обратите внимание, что для этой модели задано 100 % трафика):

    az ml online-deployment create -f deployment.yml --all-traffic --skip-script-validation
    

Примечание.

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

Тест

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

Перейдите к Студия машинного обучения Azure и выберите пункт "Конечные точки слева". Затем выберите созданный ранее r-endpoint-iris .

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

{
    "forecast_horizon" : [2]
}

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

Screenshot shows results from testing a model.

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

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

az ml online-endpoint delete --name r-endpoint-forecast

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

Дополнительные сведения об использовании R с Машинное обучение Azure см. в разделе "Обзор возможностей R" в Машинное обучение Azure