Usar um contêiner personalizado para implantar um modelo em um ponto de extremidade online

APLICA-SE A:Extensão de ML da CLI do Azure v2 (atual)SDK do Python azure-ai-ml v2 (atual)

Saiba como usar um contêiner personalizado para implantar um modelo em um ponto de extremidade online no Azure Machine Learning.

As implantações de contêineres personalizados podem usar servidores Web diferentes do servidor Python Flask padrão usado pelo Azure Machine Learning. Os usuários dessas implantações ainda podem aproveitar o monitoramento, dimensionamento, alerta e autenticação integrados do Azure Machine Learning.

A tabela a seguir lista vários exemplos de implantação que usam contêineres personalizados, como o Serviço do TensorFlow, o TorchServe, o Triton Inference Server, o pacote Plumber do R e a imagem Mínima de Inferência do Azure Machine Learning.

Exemplo Script (CLI) Descrição
minimal/multimodel deploy-custom-container-minimal-multimodel Implante vários modelos em uma só implantação estendendo a imagem Mínima de Inferência do Azure Machine Learning.
minimal/single-model deploy-custom-container-minimal-single-model Implante um só modelo estendendo a imagem Mínima de Inferência do Azure Machine Learning.
mlflow/multideployment-scikit deploy-custom-container-mlflow-multideployment-scikit Implante dois modelos do MLFlow com requisitos diferentes do Python em duas implantações separadas com a proteção de um ponto de extremidade individual usando a imagem Mínima de Inferência do Azure Machine Learning.
r/multimodel-plumber deploy-custom-container-r-multimodel-plumber Implante três modelos de regressão em um ponto de extremidade usando o pacote Plumber R
tfserving/half-plus-two deploy-custom-container-tfserving-half-plus-two Implante um modelo do Half Plus Two usando um contêiner personalizado do TensorFlow Serving usando o processo de registro de modelo padrão.
tfserving/half-plus-two-integrated deploy-custom-container-tfserving-half-plus-two-integrated Implante um modelo do Half Plus Two usando um contêiner personalizado do TensorFlow Serving com o modelo integrado à imagem.
torchserve/densenet deploy-custom-container-torchserve-densenet Implante um único modelo usando um contêiner personalizado do TorchServe.
triton/single-model deploy-custom-container-triton-single-model Implante um modelo do Triton usando um contêiner personalizado

Este artigo se concentra no atendimento de um modelo do TensorFlow com o TensorFlow (TF) Serving.

Aviso

A Microsoft pode não conseguir ajudar a solucionar problemas causados por uma imagem personalizada. Se você encontrar problemas, pode ser solicitado a usar a imagem padrão ou uma das imagens que a Microsoft oferece para ver se o problema é específico da imagem.

Pré-requisitos

Antes de seguir as etapas neste artigo, verifique se você tem os seguintes pré-requisitos:

  • Você, ou a entidade de serviço que você usa, deve ter acesso de Colaborador ao grupo de recursos do Azure que contém seu workspace. Você tem esse grupo de recursos se tiver configurado o workspace de acordo com o artigo de início rápido.

  • Para fazer a implantação localmente, o mecanismo do Docker precisa ser executado localmente. Este passo é altamente recomendado. Ele ajuda você a depurar problemas.

Fazer download do código-fonte

Para acompanhar este tutorial, clone o código-fonte do GitHub.

git clone https://github.com/Azure/azureml-examples --depth 1
cd azureml-examples/cli

Inicializar variáveis de ambiente

Defina variáveis de ambiente:

BASE_PATH=endpoints/online/custom-container/tfserving/half-plus-two
AML_MODEL_NAME=tfserving-mounted
MODEL_NAME=half_plus_two
MODEL_BASE_PATH=/var/azureml-app/azureml-models/$AML_MODEL_NAME/1

Implantar um modelo do TensorFlow

Baixe e descompacte um modelo que divide uma entrada por dois e adiciona 2 ao resultado:

wget https://aka.ms/half_plus_two-model -O $BASE_PATH/half_plus_two.tar.gz
tar -xvf $BASE_PATH/half_plus_two.tar.gz -C $BASE_PATH

Executar uma imagem do TF Serving localmente para testar seu funcionamento

Use o docker para executar a imagem localmente para teste:

docker run --rm -d -v $PWD/$BASE_PATH:$MODEL_BASE_PATH -p 8501:8501 \
 -e MODEL_BASE_PATH=$MODEL_BASE_PATH -e MODEL_NAME=$MODEL_NAME \
 --name="tfserving-test" docker.io/tensorflow/serving:latest
sleep 10

Verificar se você pode enviar solicitações de investigação de atividade e pontuação para a imagem

Primeiro, verifique se o contêiner está em atividade, o que significa que o processo dentro do contêiner ainda está em execução. Você deve obter uma resposta 200 (OK).

curl -v http://localhost:8501/v1/models/$MODEL_NAME

Em seguida, verifique se você pode obter previsões sobre dados sem rótulo:

curl --header "Content-Type: application/json" \
  --request POST \
  --data @$BASE_PATH/sample_request.json \
  http://localhost:8501/v1/models/$MODEL_NAME:predict

Parar a imagem

Agora que você testou localmente, pare a imagem:

docker stop tfserving-test

Implantar o ponto de extremidade online no Azure

Depois, implante o ponto de extremidade online no Azure.

Criar um arquivo YAML para seu ponto de extremidade e implantação

Você pode configurar sua implantação de nuvem usando o YAML. Confira o exemplo de YAML para esse exemplo:

tfserving-endpoint.yml

$schema: https://azuremlsdk2.blob.core.windows.net/latest/managedOnlineEndpoint.schema.json
name: tfserving-endpoint
auth_mode: aml_token

tfserving-deployment.yml

$schema: https://azuremlschemas.azureedge.net/latest/managedOnlineDeployment.schema.json
name: tfserving-deployment
endpoint_name: tfserving-endpoint
model:
  name: tfserving-mounted
  version: {{MODEL_VERSION}}
  path: ./half_plus_two
environment_variables:
  MODEL_BASE_PATH: /var/azureml-app/azureml-models/tfserving-mounted/{{MODEL_VERSION}}
  MODEL_NAME: half_plus_two
environment:
  #name: tfserving
  #version: 1
  image: docker.io/tensorflow/serving:latest
  inference_config:
    liveness_route:
      port: 8501
      path: /v1/models/half_plus_two
    readiness_route:
      port: 8501
      path: /v1/models/half_plus_two
    scoring_route:
      port: 8501
      path: /v1/models/half_plus_two:predict
instance_type: Standard_DS3_v2
instance_count: 1

Existem alguns conceitos importantes a serem anotados nesse parâmetro YAML/Python:

Base image

A imagem base é especificada como um parâmetro no ambiente e docker.io/tensorflow/serving:latest é usada neste exemplo. Ao inspecionar o contêiner, você pode descobrir que esse servidor usa ENTRYPOINT para iniciar um script de ponto de entrada, que leva as variáveis de ambiente como MODEL_BASE_PATH e MODEL_NAME e expõe portas como 8501. Esses detalhes são todas informações específicas para esse servidor escolhido. Você pode usar esse reconhecimento do servidor para determinar como definir a implantação. Por exemplo, se você definir variáveis de ambiente para MODEL_BASE_PATH e MODEL_NAME na definição de implantação, o servidor (neste caso, TF Serving) usará os valores para iniciar o servidor. Da mesma forma, se você definir a porta para as rotas como 8501 na definição de implantação, a solicitação do usuário para tais rotas será corretamente direcionada para o servidor TF Serving.

Observe que esse exemplo específico é baseado no caso do TF Serving, mas você pode usar quaisquer contêineres que permanecerão ativos e responderão a solicitações que chegam às rotas de atividade, preparação e pontuação. Você pode consultar outros exemplos e ver como o dockerfile é formado (por exemplo, usando CMD em vez de ENTRYPOINT) para criar os contêineres.

Configuração de inferência

A configuração de inferência é um parâmetro no ambiente e especifica a porta e o caminho para 3 tipos de rota: rota de atividade, preparação e pontuação. A configuração de inferência é obrigatória se você quiser executar seu próprio contêiner com ponto de extremidade online gerenciado.

Rota de preparação vs rota de atividade

O servidor API que você escolher pode fornecer uma forma de verificar o status do servidor. Existem dois tipos de rota que você pode especificar: atividade e preparação. Uma rota de atividade é usada para verificar se o servidor está em execução. Uma rota de preparação é usada para verificar se o servidor está pronto para realizar um trabalho. No contexto de inferência de machine learning, um servidor pode responder 200 OK a uma solicitação de atividade antes de carregar um modelo, e o servidor pode responder 200 OK a uma solicitação de preparação somente após o modelo ser carregado na memória.

Para obter mais informações sobre investigações de atividade e preparação em geral, confira a documentação do Kubernetes.

As rotas de atividade e preparação serão determinadas pelo servidor de API de sua escolha, como você teria identificado ao testar o contêiner localmente na etapa anterior. Observe que o exemplo de implantação neste artigo usa o mesmo caminho para atividade e preparação, já que o TF Serving define apenas uma rota de atividade. Consulte outros exemplos para diferentes padrões para definir as rotas.

Rota de pontuação

O servidor de API que você escolher deve fornecer uma forma de receber o payload para trabalhar. No contexto de inferência de machine learning, um servidor deve receber os dados de entrada por meio de uma rota específica. Identifique essa rota para o seu servidor de API ao testar o contêiner localmente na etapa anterior, e especifique-a ao definir a implantação a ser criada. Observe que a criação bem-sucedida da implantação também atualizará o parâmetro scoring_uri do ponto de extremidade, que você pode verificar com az ml online-endpoint show -n <name> --query scoring_uri.

Localizar o modelo montado

Quando você implanta um modelo como um ponto de extremidade online, o Azure Machine Learning monta seu modelo em seu ponto de extremidade. A montagem do modelo permite que você implante novas versões do modelo sem ter que criar uma imagem do Docker. Por padrão, um modelo registrado com o nome foo e versão 1 estaria localizado no seguinte caminho dentro do seu contêiner implantado: /var/azureml-app/azureml-models/foo/1

Por exemplo, se você tiver uma estrutura de diretório de /azureml-examples/cli/endpoints/online/custom-container em seu computador local, onde o modelo é nomeado half_plus_two:

Diagrama mostrando um modo de exibição de árvore da estrutura do diretório local.

E tfserving-deployment.yml contém:

model:
    name: tfserving-mounted
    version: 1
    path: ./half_plus_two

Em seguida, seu modelo estará localizado em /var/azureml-app/azureml-models/tfserving-deployment/1 na sua implantação:

Diagrama mostrando um modo de exibição de árvore da estrutura do diretório de implantação.

Opcionalmente, você pode configurar seu model_mount_path. Ele permite que você altere o caminho onde o modelo está montado.

Importante

O model_mount_path deve ser um caminho absoluto válido no Linux (o sistema operacional da imagem de contêiner).

Por exemplo, você pode ter um parâmetro model_mount_path em seu tfserving-deployment.yml:

name: tfserving-deployment
endpoint_name: tfserving-endpoint
model:
  name: tfserving-mounted
  version: 1
  path: ./half_plus_two
model_mount_path: /var/tfserving-model-mount
.....

Em seguida, seu modelo estará localizado em /var/tfserving-model-mount/tfserving-deployment/1 na sua implantação. Observe que ele não está mais em azureml-app/azureml-models, mas no caminho de montagem especificado:

Diagrama mostrando uma exibição de árvore da estrutura do diretório de implantação ao usar mount_model_path.

Criar seu ponto de extremidade e implantação

Agora que você entende como o YAML foi construído, crie seu ponto de extremidade.

az ml online-endpoint create --name tfserving-endpoint -f endpoints/online/custom-container/tfserving-endpoint.yml

A criação de uma implantação pode levar alguns minutos.

az ml online-deployment create --name tfserving-deployment -f endpoints/online/custom-container/tfserving-deployment.yml --all-traffic

Invocar o ponto de extremidade

Assim que sua implantação for concluída, confira se você pode fazer uma solicitação de pontuação para o ponto de extremidade implantado.

RESPONSE=$(az ml online-endpoint invoke -n $ENDPOINT_NAME --request-file $BASE_PATH/sample_request.json)

Excluir o ponto de extremidade

Agora que você pontuou com sucesso com seu ponto de extremidade, você pode excluí-lo:

az ml online-endpoint delete --name tfserving-endpoint