Superviser et collecter des données à partir des points de terminaison de service web Machine Learning

S’APPLIQUE À :SDK Python azureml v1

Dans cet article, vous allez apprendre à collecter des données à partir de modèles déployés sur des points de terminaison de service web dans Azure Kubernetes Service (AKS) ou Azure Container Instances (ACI). Azure Application Insights permet de collecter les données suivantes à partir d’un point de terminaison :

  • Données de sortie
  • Réponses
  • Taux de demande, temps de réponse et taux d’échec
  • Taux de dépendance, temps de réponse et taux d’échec
  • Exceptions

Le notebook enable-app-insights-in-production-service.ipynb illustre les concepts présentés dans cet article.

Découvrez comment exécuter des notebooks dans l’article Utiliser des notebooks Jupyter pour explorer ce service.

Important

Les informations de cet article s’appuient sur l’instance Azure Application Insights qui a été créée avec votre espace de travail. Si vous avez supprimé cette instance Application Insights, il n’est pas possible de la recréer si ce n’est en supprimant et recréant l’espace de travail.

Conseil

Si vous utilisez plutôt des points de terminaison en ligne, utilisez les informations de l’article Analyser les points de terminaison en ligne à la place.

Prérequis

Configurer la journalisation avec le Kit de développement logiciel (SDK) Python

Dans cette section, vous allez apprendre à activer la journalisation d’Application Insights à l’aide du Kit de développement logiciel (SDK) Python.

Mettre à jour un service déployé

La procédure suivante permet de mettre à jour un service web existant :

  1. Recherchez le service dans votre espace de travail. La valeur de ws correspond au nom de votre espace de travail

    from azureml.core.webservice import Webservice
    aks_service= Webservice(ws, "my-service-name")
    
  2. Mettez à jour votre service et activez Azure Application Insights

    aks_service.update(enable_app_insights=True)
    

Journaliser des traces personnalisées dans votre service

Important

Azure Application Insights ne journalise que les charges utiles jusqu’à 64 Ko. Si cette limite est atteinte, vous risquez de voir des erreurs de type mémoire insuffisante, ou aucune information ne pourrait être enregistrée. Si les données que vous souhaitez consigner sont plus volumineuses, vous devez les stocker dans le stockage d’objets BLOB à l’aide des informations contenues dans Collecter des données pour des modèles en production.

Pour les situations plus complexes, comme le suivi de modèle dans un déploiement AKS, nous vous recommandons d’utiliser une bibliothèque tierce, telle que OpenCensus.

Pour journaliser des traces personnalisées, suivez le processus de déploiement standard pour AKS ou ACI dans le document Comment et où déployer. Puis, procédez comme suit :

  1. Mettez à jour le fichier de scoring en ajoutant des instructions print pour envoyer des données à Application Insights pendant l’inférence. Pour des informations plus complexes, telles que les données de requête et la réponse, utilisez une structure JSON.

    L’exemple de fichier score.py suivant enregistre l’heure à laquelle le modèle est initialisé, l’entrée et la sortie pendant l’inférence et l’heure à laquelle des erreurs se produisent.

    import pickle
    import json
    import numpy 
    from sklearn.externals import joblib
    from sklearn.linear_model import Ridge
    from azureml.core.model import Model
    import time
    
    def init():
        global model
        #Print statement for appinsights custom traces:
        print ("model initialized" + time.strftime("%H:%M:%S"))
    
        # note here "sklearn_regression_model.pkl" is the name of the model registered under the workspace
        # this call should return the path to the model.pkl file on the local disk.
        model_path = Model.get_model_path(model_name = 'sklearn_regression_model.pkl')
    
        # deserialize the model file back into a sklearn model
        model = joblib.load(model_path)
    
    
    # note you can pass in multiple rows for scoring
    def run(raw_data):
        try:
            data = json.loads(raw_data)['data']
            data = numpy.array(data)
            result = model.predict(data)
            # Log the input and output data to appinsights:
            info = {
                "input": raw_data,
                "output": result.tolist()
                }
            print(json.dumps(info))
            # you can return any datatype as long as it is JSON-serializable
            return result.tolist()
        except Exception as e:
            error = str(e)
            print (error + time.strftime("%H:%M:%S"))
            return error
    
  2. Mettez à jour la configuration du service et veillez à activer Application Insights.

    config = Webservice.deploy_configuration(enable_app_insights=True)
    
  3. Générez une image et déployez-la sur AKS ou ACI. Pour plus d’informations, consultez le document Comment et où déployer.

Désactiver le suivi dans Python

Pour désactiver Azure Application Insights, utilisez le code suivant :

## replace <service_name> with the name of the web service
<service_name>.update(enable_app_insights=False)

Configurer la journalisation avec le studio Azure Machine Learning

Vous pouvez également activer Application Insights à partir du studio Azure Machine Learning. Lorsque vous êtes prêt à déployer votre modèle en tant que service web, procédez comme suit pour activer Application Insights :

  1. Connectez-vous au studio à l’adresse https://ml.azure.com.

  2. Accédez à Modèles, puis sélectionnez le modèle que vous voulez déployer.

  3. Sélectionnez + Déployer.

  4. Renseignez le formulaire Déployer le modèle.

  5. Développez le menu Avancé.

    Formulaire de déploiement

  6. Sélectionnez Activer les diagnostics et la collecte de données Application Insights.

    Activer App Insights

Afficher les métriques et les journaux

Interroger les journaux pour les modèles déployés

Les journaux des points de terminaison en ligne sont des données client. La fonction get_logs() permet de récupérer les journaux d’un service web déjà déployé. Les journaux d’activité peuvent contenir des informations détaillées sur les éventuelles erreurs qui se seraient produites au cours du déploiement.

from azureml.core import Workspace
from azureml.core.webservice import Webservice

ws = Workspace.from_config()

# load existing web service
service = Webservice(name="service-name", workspace=ws)
logs = service.get_logs()

Si vous avez plusieurs locataires, vous devrez peut-être ajouter le code d’authentification suivant devant ws = Workspace.from_config()

from azureml.core.authentication import InteractiveLoginAuthentication
interactive_auth = InteractiveLoginAuthentication(tenant_id="the tenant_id in which your workspace resides")

Afficher les journaux dans le studio

Azure Application Insights stocke les journaux du service dans le même groupe de ressources que l’espace de travail Azure Machine Learning. Effectuez les étapes suivantes pour consulter vos données à l’aide du studio :

  1. Accédez à votre espace de travail Azure Machine Learning dans le studio.

  2. Sélectionnez Points de terminaison.

  3. Sélectionnez le service déployé.

  4. Sélectionnez le lien URL d’Application Insights.

    Locate Application Insights url

  5. Dans Application Insights, à partir de l’onglet Vue d’ensemble ou de la section Surveillance, sélectionnez Journaux.

    Onglet Vue d’ensemble de la surveillance

  6. Pour afficher les informations consignées dans le fichier score.py, examinez la table traces. La requête suivante recherche les journaux dans lesquels la valeur input a été consignée :

    traces
    | where customDimensions contains "input"
    | limit 10
    

    données de trace

Pour plus d’informations sur l’utilisation d’Azure Application Insights, voir Présentation d’Application Insights.

Métadonnées de service web et données de réponse

Important

Azure Application Insights ne journalise que les charges utiles jusqu’à 64 Ko. Si cette limite est atteinte, vous risquez de voir des erreurs de type mémoire insuffisante, ou aucune information ne pourrait être enregistrée.

Pour enregistrer les informations sur la demande du service web, ajoutez des instructions print à votre fichier score.py. Chaque instruction print génère une entrée dans la table de trace dans Application Insights, sous le message STDOUT. Application Insights stocke les sorties de l’instruction print dans customDimensions et dans la table de trace Contents. L’impression de chaînes JSON génère une structure de données hiérarchique dans la sortie de trace sous Contents.

Exporter des données pour la rétention et le traitement

Important

Azure Application Insights ne prend en charge que les exportations vers le Stockage Blob. Pour plus d’informations sur les limites de cette implémentation, voir Exporter la télémétrie depuis Application Insights.

L’exportation continue d’Application Insights permet d’exporter des données vers un compte de stockage d’objets Blob dans lequel vous pouvez définir des paramètres de rétention. Application Insights exporte les données au format JSON.

Exportation continue

Étapes suivantes

Dans cet article, vous avez appris à activer la journalisation et à consulter les journaux des points de terminaison de service web. Consultez les articles suivants pour les prochaines étapes :