Solução de problemas com uma implantação de modelo local

Experimente uma implantação de modelo local como uma primeira etapa na solução de problemas de implantação para Instâncias de Contêiner do Azure (ACI) ou Serviço Kubernetes do Azure (AKS). O uso de um serviço Web local facilita a identificação e a correção de erros comuns de implantação do serviço Web do Azure Machine Learning Docker.

Pré-requisitos

  • Uma subscrição do Azure. Experimente a versão gratuita ou paga do Azure Machine Learning.
  • Opção A (Recomendado) - Depurar localmente na Instância de Computação do Azure Machine Learning
    • Um espaço de trabalho 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.
    • CLI do Azure.
    • A extensão da CLI para o Azure Machine Learning.
    • Tenha uma instalação do Docker em funcionamento no seu sistema local.
    • Para verificar a instalação do Docker, use o comando de um terminal ou prompt de comando docker run hello-world . Para obter informações sobre como instalar o Docker ou solucionar erros do Docker, consulte a Documentação do Docker.
  • Opção C - Habilite a depuração local com o servidor HTTP de inferência do Azure Machine Learning.
    • O servidor HTTP de inferência do Azure Machine Learning é um pacote Python que permite validar 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. Também devolverá a localização onde ocorreu o erro.
    • O servidor também pode ser usado ao criar portas de validação em um pipeline contínuo de integração e implantação. Por exemplo, inicie o servidor com o script 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 seu script de entrada (score.py). Caso o script de pontuação subjacente tenha um bug, o servidor não conseguirá inicializar ou servir o modelo. Em vez disso, ele lançará uma exceção e o local onde os problemas ocorreram. Saiba mais sobre o Servidor HTTP de inferência do Azure Machine Learning

  1. Instale o azureml-inference-server-http pacote a partir 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
    

Nota

Saiba mais sobre o servidor HTTP de inferência de aprendizado de máquina do Azure.

Depurar localmente

Você pode encontrar um bloco de anotações de implantação local de exemplo no repositório MachineLearningNotebooks para explorar um exemplo executável.

Aviso

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

Para implantar localmente, modifique seu 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 um serviço Web local:

APLICA-SE A:Python SDK 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 sua própria especificação de conda YAML, liste azureml-defaults version >= 1.0.45 como uma dependência pip. Este pacote é necessário para hospedar o modelo como um serviço Web.

Neste ponto, 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 seu ambiente Python, consulte Criar e gerenciar ambientes para treinamento e implantação.

Atualizar o serviço

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

Importante

O reload método 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 serviço Web.

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

Nota

O script é recarregado a partir do local especificado pelo objeto usado pelo InferenceConfig serviço.

Para alterar o modelo, as dependências do 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 detalhadas de log do mecanismo do Docker a partir do objeto de serviço. Você pode visualizar o log para implantações ACI, AKS e Local. O exemplo a seguir demonstra como 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 trabalhador. Você pode corrigir o erro aumentando o valor de memory_gb in deployment_config

Próximos passos

Saiba mais sobre a implementação: