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
- Um Workspace do Azure Machine Learning com instância de computação em execução
- Opção B - depurar localmente em sua computação
- O SDK do Azure Machine Learning.
- O CLI do Azure.
- A Extensão da CLI do Azure Machine Learning.
- Tenha uma instalação do Docker em funcionamento no sistema local.
- Para verificar a instalação do Docker, use o comando
docker run hello-world
em um terminal ou prompt de comando. Para obter informações sobre a instalação do Docker ou solução de erros do Docker, confira a Documentação do Docker.
- 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.
- O servidor HTTP de inferência de Azure Machine Learning é um pacote do Python que permite que você valide facilmente seu script de entrada (
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
Instale o pacote
azureml-inference-server-http
do feed pypi:python -m pip install azureml-inference-server-http
Inicie o servidor e defina
score.py
como o script de entrada:azmlinfsrv --entry_script score.py
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 azureml 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: