Usar um contêiner personalizado para implantar um modelo em um ponto de extremidade online
APLICA-SE A:Azure CLI ml extension v2 (current)Python SDK azure-ai-ml v2 (current)
Saiba como usar um contêiner personalizado para implantar um modelo em um ponto de extremidade online no Aprendizado de Máquina do Azure.
As implantações de contêiner personalizadas 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, o dimensionamento, o alerta e a autenticação internos do Azure Machine Learning.
A tabela a seguir lista vários exemplos de implantação que usam contêineres personalizados, como TensorFlow Serving, TorchServe, Triton Inference Server, Plumber R package e Azure Machine Learning Inference Minimal image.
Exemplo | Script (CLI) | Description |
---|---|---|
mínimo/multimodelo | deploy-custom-container-minimal-multimodel | Implante vários modelos em uma única implantação estendendo a imagem mínima de inferência do Azure Machine Learning. |
mínimo/modelo único | deploy-custom-container-minimal-single-model | Implante um único 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 MLFlow com requisitos Python diferentes em duas implantações separadas atrás de um único ponto de extremidade usando a Imagem Mínima de Inferência do Azure Machine Learning. |
r/multimodelo-canalizador | deploy-custom-container-r-multimodel-encanador | Implantar três modelos de regressão em um ponto de extremidade usando o pacote Plumber R |
tfserving/meio-mais-dois | deploy-custom-container-tfserving-half-plus-two | Implante um modelo Half Plus Two usando um contêiner personalizado do TensorFlow Serving usando o processo de registro de modelo padrão. |
tfserving/meio mais dois integrados | deploy-custom-container-tfserving-half-plus-two-integrated | Implante um modelo Half Plus Two usando um contêiner personalizado do TensorFlow Serving com o modelo integrado à imagem. |
Tocha/densenet | deploy-custom-container-torchserve-densenet | Implante um único modelo usando um contêiner personalizado do TorchServe. |
Tritão/modelo único | deploy-custom-container-triton-single-model | Implantar um modelo Triton usando um contêiner personalizado |
Este artigo se concentra em servir 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 encontrar problemas, poderá ser-lhe pedido que utilize a imagem predefinida ou uma das imagens fornecidas pela Microsoft para ver se o problema é específico da sua imagem.
Pré-requisitos
Antes de seguir as etapas neste artigo, verifique se você tem os seguintes pré-requisitos:
Uma área de trabalho do Azure Machine Learning. Se você não tiver um, use as etapas no artigo Guia de início rápido: criar recursos do espaço de trabalho para criar um.
A CLI do Azure e a
ml
extensão ou o SDK do Python do Azure Machine Learning v2:Para instalar a CLI e a extensão do Azure, consulte Instalar, configurar e usar a CLI (v2).
Importante
Os exemplos de CLI neste artigo pressupõem que você esteja usando o shell Bash (ou compatível). Por exemplo, de um sistema Linux ou Subsistema Windows para Linux.
Para instalar o Python SDK v2, use o seguinte comando:
pip install azure-ai-ml azure-identity
Para atualizar uma instalação existente do SDK para a versão mais recente, use o seguinte comando:
pip install --upgrade azure-ai-ml azure-identity
Para obter mais informações, consulte Instalar o Python SDK v2 para Azure Machine Learning.
Você, ou a entidade de serviço usada, deve ter acesso de Colaborador ao grupo de recursos do Azure que contém seu espaço de trabalho. Você tem esse grupo de recursos se configurou seu espaço de trabalho usando o artigo de início rápido.
Para implantar localmente, você deve ter o mecanismo Docker em execução localmente. Este passo é altamente recomendado. Ele ajuda você a depurar problemas.
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
Definir 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
Baixar um modelo do TensorFlow
Baixe e descompacte um modelo que divide uma entrada por duas 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
Execute uma imagem TF Serving localmente para testar se ela funciona
Use o docker para executar sua 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
Verifique se você pode enviar solicitações de vivacidade e pontuação para a imagem
Primeiro, verifique se o contêiner está vivo, o que significa que o processo dentro do contêiner ainda está em execução. Você deve receber uma resposta 200 (OK).
curl -v http://localhost:8501/v1/models/$MODEL_NAME
Em seguida, verifique se você pode obter previsões sobre dados não rotulados:
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 seu ponto de extremidade online no Azure
Em seguida, implante seu ponto de extremidade online no Azure.
Criar um arquivo YAML para seu ponto de extremidade e implantação
Você pode configurar sua implantação na nuvem usando YAML. Dê uma olhada no exemplo de YAML para este 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
Há alguns conceitos importantes a serem observados neste parâmetro YAML/Python:
Imagem base
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 usa as variáveis de ambiente, como MODEL_BASE_PATH
e MODEL_NAME
, e expõe portas, como 8501
. Estes detalhes são todas informações específicas para este servidor escolhido. Você pode usar esse entendimento 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 estarem 8501
na definição de implantação, a solicitação do usuário para essas rotas será roteada corretamente para o servidor de serviço TF.
Observe que este exemplo específico é baseado no caso TF Serving , mas você pode usar qualquer contêiner que permanecerá ativo e responderá às solicitações que chegarem às rotas de animação, prontidã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: vivacidade, prontidão e rota de pontuação. A configuração de inferência é necessária se você quiser executar seu próprio contêiner com o endpoint online gerenciado.
Rota de prontidão vs rota de vivacidade
O servidor de API escolhido pode fornecer uma maneira de verificar o status do servidor. Existem dois tipos de rota que você pode especificar: vivacidade e prontidão. Uma rota de vivacidade é usada para verificar se o servidor está em execução. Uma rota de preparação é usada para verificar se o servidor está pronto para trabalhar. No contexto da inferência de aprendizado de máquina, um servidor pode responder 200 OK a uma solicitação de vivacidade antes de carregar um modelo, e o servidor pode responder 200 OK a uma solicitação de preparação somente depois que o modelo é carregado na memória.
Para obter mais informações sobre sondas de vivacidade e prontidão em geral, consulte a documentação do Kubernetes.
As rotas de animação e prontidã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 a implantação de exemplo neste artigo usa o mesmo caminho para vivacidade e prontidão, já que o TF Serving define apenas uma rota de vivacidade. Consulte outros exemplos de padrões diferentes para definir as rotas.
Rota de pontuação
O servidor de API escolhido forneceria uma maneira de receber a carga útil para trabalhar. No contexto da inferência de aprendizado de máquina, um servidor receberia os dados de entrada por meio de uma rota específica. Identifique essa rota para 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
.
Localizando o modelo montado
Quando você implanta um modelo como um ponto de extremidade online, o Aprendizado de Máquina do Azure 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 nova imagem do Docker. Por padrão, um modelo registrado com o nome foo e a versão 1 estaria localizado no seguinte caminho dentro do contêiner implantado: /var/azureml-app/azureml-models/foo/1
Por exemplo, se você tiver uma estrutura de diretórios de /azureml-examples/cli/endpoints/online/custom-container em sua máquina local, onde o modelo é nomeado half_plus_two:
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 em sua implantação:
Opcionalmente, você pode configurar o .model_mount_path
Ele permite alterar o caminho onde o modelo é montado.
Importante
O model_mount_path
deve ser um caminho absoluto válido no Linux (o sistema operacional da imagem do contêiner).
Por exemplo, você pode ter model_mount_path
parâmetro 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 está localizado em /var/tfserving-model-mount/tfserving-deployment/1 em sua implantação. Observe que ele não está mais em azureml-app/azureml-models, mas sob o caminho de montagem que você especificou:
Crie seu endpoint e implantação
Agora que você entende como o YAML foi construído, crie seu endpoint.
az ml online-endpoint create --name tfserving-endpoint -f endpoints/online/custom-container/tfserving-endpoint.yml
Criar 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
Invoque o ponto de extremidade
Quando a implantação for concluída, veja 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 endpoint, você pode excluí-lo:
az ml online-endpoint delete --name tfserving-endpoint