Solucionando problemas com a implantação de um modelo local

Experimente a implantação de um modelo local como uma primeira etapa para solucionar problemas de implantação em ACI (Instâncias de Contêiner do Azure) ou AKS (Serviço kubernetes do Azure). O uso de um serviço Web local torna mais fácil identificar e corrigir erros comuns de implantação do serviço Web para o Docker do Azure Machine Learning.

Pré-requisitos

  • Uma assinatura do Azure. Experimente a versão gratuita ou paga do Azure Machine Learning.
  • Opção A (recomendada) - depurar localmente na Instância de Computação do Azure Machine Learning
  • Opção B - depurar localmente em sua computação
  • Opção C – habilitar a depuração local com o servidor HTTP de inferência do Microsoft Azure Machine Learning.
    • O servidor HTTP de inferência de Azure Machine Learning é um pacote do Python que permite que você valide facilmente seu script de entrada (score.py) em um ambiente de desenvolvimento local. Se houver um problema com o script de pontuação, o servidor retornará um erro. Ele também retornará o local em que o erro ocorreu.
    • O servidor também pode ser usado ao criar portas de validação em um pipeline de implantação e integração contínua. Por exemplo, inicie o servidor com o script do candidato e execute o conjunto de testes no ponto de extremidade local.

Servidor HTTP de inferência do Azure Machine Learning

O servidor de inferência local permite que você depure rapidamente o script de entrada (score.py). Caso o script de pontuação subjacente tenha um bug, ocorre uma falha de inicialização do servidor ou de fornecimento do modelo. Em vez disso, ele gera uma exceção e o local em que ocorreram os problemas. Saiba mais sobre o servidor HTTP de inferência do Azure Machine Learning

  1. Instale o pacote azureml-inference-server-http do feed pypi:

    python -m pip install azureml-inference-server-http
    
  2. Inicie o servidor e defina score.py como o script de entrada:

    azmlinfsrv --entry_script score.py
    
  3. Envie uma solicitação de pontuação para o servidor usando curl:

    curl -p 127.0.0.1:5001/score
    

Observação

Saiba mais sobre o servidor HTTP de Inferência do Azure Machine Learning.

Depurar Localmente

Você pode encontrar uma amostra de notebook de implantação local no repositório MachineLearningNotebooks para explorar um exemplo executável.

Aviso

Não há suporte para implantações de serviço Web local para cenários de produção.

Para implantar localmente, modifique o código para usar LocalWebservice.deploy_configuration() para criar uma configuração de implantação. Em seguida, use Model.deploy() para implantar o serviço. O exemplo a seguir implanta um modelo (contido na variável de modelo) como serviço Web local:

APLICA-SE A:SDK do Python do Azure ML v1

from azureml.core.environment import Environment
from azureml.core.model import InferenceConfig, Model
from azureml.core.webservice import LocalWebservice


# Create inference configuration based on the environment definition and the entry script
myenv = Environment.from_conda_specification(name="env", file_path="myenv.yml")
inference_config = InferenceConfig(entry_script="score.py", environment=myenv)
# Create a local deployment, using port 8890 for the web service endpoint
deployment_config = LocalWebservice.deploy_configuration(port=8890)
# Deploy the service
service = Model.deploy(
    ws, "mymodel", [model], inference_config, deployment_config)
# Wait for the deployment to complete
service.wait_for_deployment(True)
# Display the port that the web service is available on
print(service.port)

Se você estiver definindo seu próprio Conda YAML de especificação, liste a versão azureml-defaults >= 1.0.45 como uma dependência pip. Esse pacote é necessário para hospedar o modelo como um serviço Web.

A essa altura, você pode trabalhar com o serviço normalmente. O código a seguir demonstra o envio de dados para o serviço:

import json

test_sample = json.dumps({'data': [
    [1, 2, 3, 4, 5, 6, 7, 8, 9, 10],
    [10, 9, 8, 7, 6, 5, 4, 3, 2, 1]
]})

test_sample = bytes(test_sample, encoding='utf8')

prediction = service.run(input_data=test_sample)
print(prediction)

Para obter mais informações sobre como personalizar o ambiente do Python, confira Criar e gerenciar ambientes para treinamento e implantação.

Atualizar o serviço

Durante os testes locais, talvez seja necessário atualizar o arquivo score.py para adicionar o log ou tentar resolver os problemas detectados. Para recarregar as alterações no arquivo score.py, use reload(). Por exemplo, o código a seguir recarrega o script para o serviço e depois envia dados a ele. Os dados são pontuados usando o arquivo score.py atualizado:

Importante

O método reload só está disponível para implantações locais. Para obter informações sobre como atualizar uma implantação para outro destino de computação, consulte como atualizar seu WebService.

service.reload()
print(service.run(input_data=test_sample))

Observação

O script é recarregado no local especificado pelo objeto InferenceConfig usado pelo serviço.

Para alterar o modelo, as dependências Conda ou a configuração de implantação, use update(). O exemplo a seguir atualiza o modelo usado pelo serviço:

service.update([different_model], inference_config, deployment_config)

Excluir o serviço

Para excluir o serviço, use delete().

Inspecionar o log do Docker

Você pode imprimir mensagens de log do mecanismo do Docker detalhadas do objeto de serviços. Você pode exibir o log para implantações de ACI, AKS e local. O exemplo a seguir demonstra como fazer imprimir os logs.

# if you already have the service object handy
print(service.get_logs())

# if you only know the name of the service (note there might be multiple services with the same name but different version number)
print(ws.webservices['mysvc'].get_logs())

Se você vir a linha Booting worker with pid: <pid> ocorrendo várias vezes nos logs, isso significa que não há memória suficiente para iniciar o trabalho. Você pode resolver o erro aumentando o valor de memory_gb em deployment_config

Próximas etapas

Saiba mais sobre a implantação: