Solución de problemas con una implementación de modelo local

Pruebe una implementación de modelo local como primer paso para la solución de problemas de implementación en Azure Container Instances (ACI) o Azure Kubernetes Service (AKS). El uso de un servicio web local facilita la detección y corrección de errores comunes de implementación del servicio web de Docker para Azure Machine Learning.

Prerrequisitos

  • Una suscripción de Azure. Pruebe la versión gratuita o de pago de Azure Machine Learning.
  • Opción A (recomendada): depurar localmente en Instancia de proceso de Azure Machine Learning.
  • Opción B: depuración local en el proceso.
  • Opción C: habilitar la depuración local con el servidor HTTP de inferencia de Azure Machine Learning.
    • El servidor HTTP de inferencia de Azure Machine Learning (versión preliminar) es un paquete de Python que permite validar fácilmente el script de entrada (score.py) en un entorno de desarrollo local. Si hay un problema con el script de puntuación, el servidor devolverá un error. También devolverá la ubicación en la que se produjo el error.
    • El servidor también se puede usar al crear puertas de validación en una canalización de integración e implementación continuas. Puede, por ejemplo, iniciar el servidor con el script candidato y ejecutar el conjunto de pruebas en el punto de conexión local.

Servidor HTTP de inferencia de Azure Machine Learning

El servidor de inferencia local permite depurar rápidamente el script de entrada (score.py). En caso de que el script de puntuación subyacente tenga un error, el servidor no podrá inicializar ni atender el modelo. Se producirá una excepción con la ubicación donde se produjeron los problemas. Más información sobre el servidor HTTP de inferencia de Azure Machine Learning

  1. Instale el paquete azureml-inference-server-http desde la fuente pypi:

    python -m pip install azureml-inference-server-http
    
  2. Inicie el servidor y establezca score.py como script de entrada:

    azmlinfsrv --entry_script score.py
    
  3. Envíe una solicitud de puntuación al servidor mediante curl:

    curl -p 127.0.0.1:5001/score
    

Nota:

Obtenga información sobre las preguntas frecuentes sobre el servidor HTTP de inferencia de Azure Machine Learning.

Depuración local

Puede encontrar un ejemplo de cuaderno de implementación local en el repositorio de MachineLearningNotebooks para explorar un ejemplo ejecutable.

Advertencia

No se admiten las implementaciones de servicios web locales en escenarios de producción.

Para implementar de forma local, modifique el código para usar LocalWebservice.deploy_configuration() con el fin de crear una configuración de implementación. Luego use Model.deploy() para implementar el servicio. En el ejemplo siguiente se implementa un modelo (incluido en la variable de modelo) como un servicio web local:

SE APLICA A:Azure ML del SDK de Python 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)

Si va a definir su propio YAML de especificación de Conda, muestre azureml-defaults con la versión >= 1.0.45 como dependencia de PIP. Este paquete es necesario para hospedar el modelo como servicio web.

En este punto, se puede trabajar con el servicio de forma habitual. En el código siguiente se muestra cómo enviar datos al servicio:

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 obtener más información sobre cómo personalizar el entorno de Python, consulte el tema sobre la creación y administración de entornos de entrenamiento e implementación.

Actualizar el servicio

Durante las pruebas locales, es posible que deba actualizar el archivo score.py para agregar un registro o intentar resolver los problemas que haya descubierto. Para recargar los cambios realizados en el archivo score.py, use reload(). Por ejemplo, el código siguiente recarga el script para el servicio y luego envía datos. Los datos se puntúan con el archivo score.py actualizado:

Importante

El método reload solo está disponible para las implementaciones locales. Para información sobre cómo actualizar una implementación en otro destino de proceso, consulte cómo actualizar el servicio web.

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

Nota

El script se recarga desde la ubicación que especifica el objeto InferenceConfig que usa el servicio.

Para cambiar el modelo, las dependencias de Conda o la configuración de implementación, use update(). En el siguiente ejemplo se actualiza el modelo que usa el servicio:

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

Eliminación del servicio

Para eliminar el servicio, use delete().

Inspección del registro de Docker

Puede imprimir los mensajes detallados de registro del motor de Docker desde el objeto de servicio. Puede ver el registro para ACI, AKS y las implementaciones locales. En el ejemplo siguiente se muestra cómo imprimir los registros.

# 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())

Si ve que la línea Booting worker with pid: <pid> se produce varias veces en los registros, significa que no hay suficiente memoria para iniciar el trabajo. Puede solucionar el error aumentando el valor de memory_gb en deployment_config.

Pasos siguientes

Más información acerca de la implementación: