Развертывание зарегистрированной модели R в конечную точку в сети (в режиме реального времени)
ОБЛАСТЬ ПРИМЕНЕНИЯ: расширение машинного обучения Azure CLI версии 2 (текущее)
В этой статье вы узнаете, как развернуть модель R в управляемой конечной точке (веб-API), чтобы приложение смогла оценить новые данные в модели практически в режиме реального времени.
Необходимые компоненты
- Рабочая область Машинного обучения Azure.
- Установлено расширение Azure CLI и ml. Или используйте вычислительный экземпляр в рабочей области с предварительно установленным интерфейсом командной строки.
- По крайней мере одна настраиваемая среда, связанная с рабочей областью. Создайте среду R или любую другую пользовательскую среду, если ее нет.
- Понимание пакета R
plumber
- Модель, которую вы обучили и упаковали с
crate
помощью и зарегистрировали в рабочей области.
Создание папки с этой структурой
Создайте эту структуру папок для проекта:
📂 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, связанный с рабочей областью, которая создается при создании первой пользовательской среды. Чтобы узнать, есть ли у вас настраиваемая среда:
- Войдите в Студию машинного обучения Azure.
- При необходимости выберите рабочую область.
- В области навигации слева выберите среды.
- В верхней части выберите настраиваемые среды.
- Если вы видите пользовательские среды, ничего больше не требуется.
- Если вы не видите пользовательские среды, создайте среду R или любую другую пользовательскую среду. (Вы не будете использовать эту среду для развертывания, но будете использовать реестр контейнеров, который также создан для вас.)
Убедившись, что у вас есть по крайней мере одна настраиваемая среда, запустите терминал и настройте интерфейс командной строки:
Откройте окно терминала и войдите в Azure. Если вы используете Машинное обучение Azure вычислительный экземпляр, используйте следующее:
az login --identity
Если вы не находитесь в вычислительном экземпляре, опустите
--identity
и следуйте запросу, чтобы открыть окно браузера для проверки подлинности.Убедитесь, что у вас есть самые последние версии интерфейса командной строки и
ml
расширения:az upgrade
Если у вас несколько подписок Azure, задайте активную подписку на ту, которую вы используете для рабочей области. (Этот шаг можно пропустить, только если у вас есть доступ только к одной подписке.) Замените
<YOUR_SUBSCRIPTION_NAME_OR_ID>
имя подписки или идентификатор подписки. Также удалите квадратные скобки<>
.az account set -s "<YOUR_SUBSCRIPTION_NAME_OR_ID>"
Задайте рабочую область по умолчанию. Если вы используете вычислительный экземпляр, выполните следующую команду. Если вы находитесь на любом другом компьютере, замените вместо него имя группы ресурсов и рабочей области. (Эти значения можно найти в Студия машинного обучения Azure.)
az configure --defaults group=$CI_RESOURCE_GROUP workspace=$CI_WORKSPACE
После настройки интерфейса командной строки выполните следующие действия, чтобы создать контейнер.
Убедитесь, что вы находитесь в каталоге проекта.
cd r-deploy-azureml
Чтобы создать образ в облаке, выполните следующие команды bash в терминале. Замените
<IMAGE-NAME>
именем, которое вы хотите дать изображению.Если рабочая область находится в виртуальной сети, ознакомьтесь с дополнительными инструкциями по добавлению
--image-build-compute
az 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 управляемых конечных точек позволяют предоставлять любой процент трафика для каждого развертывания. Распределение трафика можно использовать для безопасного развертывания по "сине-зеленой" стратегии путем балансировки запросов между разными экземплярами.
Создание управляемой сетевой конечной точки
В каталоге проекта добавьте файл endpoint.yml со следующим кодом. Замените
<ENDPOINT-NAME>
именем, которое вы хотите предоставить управляемой конечной точке.$schema: https://azuremlschemas.azureedge.net/latest/managedOnlineEndpoint.schema.json name: <ENDPOINT-NAME> auth_mode: aml_token
Используя тот же терминал, где вы создали образ, выполните следующую команду CLI, чтобы создать конечную точку:
az ml online-endpoint create -f endpoint.yml
Оставьте терминал открытым, чтобы продолжить его использование в следующем разделе.
Создать развертывание
Чтобы создать развертывание, добавьте следующий код в файл 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
Затем в терминале выполните следующую команду CLI, чтобы создать развертывание (обратите внимание, что для этой модели задано 100 % трафика):
az ml online-deployment create -f deployment.yml --all-traffic --skip-script-validation
Примечание.
Развертывание службы может занять несколько минут. Дождитесь завершения развертывания, прежде чем перейти к следующему разделу.
Тест
После успешного создания развертывания можно протестировать конечную точку с помощью студии или интерфейса командной строки:
Перейдите к Студия машинного обучения Azure и выберите пункт "Конечные точки слева". Затем выберите созданный ранее r-endpoint-iris .
Введите следующий json в входные данные, чтобы сохранить текстовое поле конечной точки в режиме реального времени:
{
"forecast_horizon" : [2]
}
Выберите Тест. Должен появиться следующий результат:
Очистка ресурсов
Теперь, когда вы успешно забили конечную точку, ее можно удалить, чтобы не нести текущие затраты:
az ml online-endpoint delete --name r-endpoint-forecast
Следующие шаги
Дополнительные сведения об использовании R с Машинное обучение Azure см. в разделе "Обзор возможностей R" в Машинное обучение Azure