Dépannage avec un déploiement de modèle local

Essayez un déploiement de modèle local comme première étape de dépannage d’un déploiement sur Azure Container Instances (ACI) ou Azure Kubernetes service (AKS). L’utilisation d’un service web local facilite la localisation et la correction des erreurs courantes de déploiement Docker liées au service web Azure Machine Learning.

Prérequis

  • Un abonnement Azure. Essayez la version gratuite ou payante d’Azure Machine Learning.
  • Option A (recommandée) : déboguer localement sur une instance de calcul Azure Machine Learning
    • Un espace de travail Azure Machine Learning avec une instance de calcul en cours d’exécution
  • Option B : déboguer localement sur votre calcul
  • Option C : Activer le débogage local avec le serveur HTTP d’inférence Azure Machine Learning.
    • Le serveur HTTP d'inférence Azure Machine Learning est un package Python qui vous permet de valider facilement votre script d'entrée (score.py) dans un environnement de développement local. En cas de problème avec le script de scoring, le serveur retourne une erreur. Il retourne également l’emplacement où l’erreur s’est produite.
    • Le serveur peut également être utilisé lors de la création de portes de validation dans un pipeline d’intégration et de déploiement continus. Par exemple, démarrez le serveur avec le script candidat et exécutez la suite de tests sur le point de terminaison local.

Serveur HTTP d’inférence Azure Machine Learning

Le serveur d’inférence local vous permet de déboguer rapidement votre script d’entrée (score.py). Si un bogue affecte le script de scoring sous-jacent, le serveur ne pourra pas initialiser ou traiter le modèle. Au lieu de cela, il lèvera une exception là où les problèmes se sont produits. Apprenez-en davantage sur le serveur HTTP d’inférence Azure Machine Learning

  1. Installez le package azureml-inference-server-http à partir du flux pypi :

    python -m pip install azureml-inference-server-http
    
  2. Démarrez le serveur et définissez score.py comme script d’entrée :

    azmlinfsrv --entry_script score.py
    
  3. Envoyez une requête de scoring au serveur à l’aide de curl :

    curl -p 127.0.0.1:5001/score
    

Notes

Découvrez les questions fréquemment posées sur le serveur HTTP d’inférence Azure Machine Learning.

Déboguer en local

Vous trouverez un exemple exécutable de notebook de déploiement local dans le référentiel MachineLearningNotebooks.

Avertissement

Les déploiements de service web locaux ne sont pas pris en charge pour les scénarios de production.

Pour déployer en local, modifiez votre code pour utiliser LocalWebservice.deploy_configuration() afin de créer une configuration de déploiement. Puis, utilisez Model.deploy() pour déployer le service. L’exemple suivant déploie un modèle (contenu dans la variable model) en tant que service web local :

S’APPLIQUE À :Kit de développement logiciel (SDK) 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)

Si vous définissez votre propre YAML de spécification Conda, faites figurer une version supérieure ou égale à la version 1.0.45 d'azureml-defaults comme dépendance pip. Ce package est nécessaire pour héberger le modèle en tant que service web.

À ce stade, vous pouvez travailler avec le service comme d’habitude. Le code suivant illustre l'envoi des données au service :

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)

Pour plus d’informations sur la personnalisation de votre environnement Python, consultez Créer et gérer des environnements pour l’entraînement et le déploiement.

Mettre à jour le service

Pendant le test local, vous devrez peut-être mettre à jour le fichier score.py pour ajouter la journalisation ou tenter de résoudre les problèmes détectés. Pour recharger les modifications apportées au fichier score.py, utilisez reload(). Par exemple, le code suivant recharge le script pour le service et lui envoie des données. Les données sont calculées à l’aide du fichier score.py mis à jour :

Important

La méthode reload est disponible uniquement pour les déploiements locaux. Pour en savoir plus sur la mise à jour d’un déploiement vers une autre cible de calcul, consultez la procédure de mise à jour de vos services web.

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

Notes

Le script est rechargé à partir de l’emplacement spécifié par l’objet InferenceConfig utilisé par le service.

Pour modifier le modèle, les dépendances Conda ou la configuration de déploiement, utilisez update(). L’exemple suivant met à jour le modèle utilisé par le service :

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

Supprimer le service

Pour supprimer le service, utilisez delete().

Examiner le journal Docker

Vous pouvez afficher les messages détaillés du journal du moteur Docker à partir de l’objet de service. Vous pouvez afficher le journal pour les déploiements ACI, AKS et locaux. L’exemple suivant illustre l’impression des journaux.

# 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 la ligne Booting worker with pid: <pid> s’affiche plusieurs fois dans les journaux, cela signifie qu’il n’y a pas assez de mémoire pour démarrer le Worker. Vous pouvez résoudre l’erreur en augmentant la valeur de memory_gb dans deployment_config.

Étapes suivantes

Pour en savoir plus sur le déploiement :