Monitorare e raccogliere dati da endpoint servizio Web di ML

SI APPLICA A:Python SDK azureml v1

Questo articolo fornisce informazioni su come raccogliere dati da modelli distribuiti in endpoint servizio Web in servizio Azure Kubernetes o Istanze di Azure Container. Usare Azure Application Insights per raccogliere i dati seguenti da un endpoint:

  • Dati di output
  • Risposte
  • Frequenza delle richieste, tempi di risposta e percentuali di errore
  • Tassi di dipendenza, tempi di risposta e percentuali di errore
  • Eccezioni

Il notebook enable-app-insights-in-production-service.ipynb illustra i concetti descritti in questo articolo.

Per informazioni su come eseguire i notebook, vedere l'articolo Esplorare Azure Machine Learning con notebook Jupyter.

Importante

Le informazioni in questo articolo si basano sull'istanza di Azure Application Insights creata con l'area di lavoro. Se si elimina questa istanza di Application Insights, non sarà possibile ricrearla se non eliminando e ricreando l'area di lavoro.

Suggerimento

Se invece si usano endpoint online, usare le informazioni nell'articolo Monitorare gli endpoint online.

Prerequisiti

Configurare la registrazione con Python SDK

In questa sezione, si scoprirà come abilitare la registrazione di Application Insight usando Python SDK.

Aggiornare un servizio distribuito

Per aggiornare un servizio Web esistente, seguire questi passaggi:

  1. Identificare il servizio nell'area di lavoro. Il valore di ws è il nome dell'area di lavoro

    from azureml.core.webservice import Webservice
    aks_service= Webservice(ws, "my-service-name")
    
  2. Aggiornare il servizio e abilitare Azure Application Insights

    aks_service.update(enable_app_insights=True)
    

Registrare tracce personalizzate nel servizio

Importante

Azure Application Insights registra solo carichi di lavoro fino a 64 KB. Se viene raggiunto questo limite, potrebbero essere restituiti errori di memoria insufficiente o potrebbe non essere possibile registrare ulteriori informazioni. Se i dati da registrare superano 64 KB, sarebbe opportuno memorizzarli in una risorsa di archiviazione BLOB usando le informazioni in Raccogliere i dati per modelli in produzione.

Per situazioni più complesse, come il tracciamento di modelli in una distribuzione di servizio Azure Kubernetes, si consiglia di usare una libreria di terze parti come OpenCensus.

Per registrare tracce personalizzate, seguire il processo di distribuzione standard per il servizio Azure Kubernetes o il servizio Istanze di Azure Container, descritto nel documento Come e dove distribuire. Seguire quindi questa procedura:

  1. Aggiornare il file di punteggio aggiungendo istruzioni di stampa per inviare i dati ad Application Insights durante l'inferenza. Per informazioni più complesse, come i dati della richiesta e la risposta, usare una struttura JSON.

    Il file score.py di esempio seguente registra quando è stato inizializzato il modello, l'input e l'output durante l'inferenza e l'ora in cui si sono verificati eventuali errori.

    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. Aggiornare la configurazione del servizio e verificare di aver abilitato Application Insights.

    config = Webservice.deploy_configuration(enable_app_insights=True)
    
  3. Compilare un'immagine e distribuirla in Azure Kubernetes o Azure Container. Per altre informazioni, vedere Come distribuire e dove.

Disabilitare il rilevamento in Python

Per disabilitare Azure Application Insights, usare il codice seguente:

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

Configurare la registrazione con studio di Azure Machine Learning

È anche possibile abilitare Azure Application Insights da studio di Azure Machine Learning. Quando si è pronti per distribuire il modello come servizio Web, usare i passaggi seguenti per abilitare Application Insights:

  1. Accedere a Studio all'indirizzo https://ml.azure.com.

  2. Passare a Modelli e selezionare il modello da distribuire.

  3. Selezionare +Distribuisci.

  4. Compilare il modulo Distribuisci modello.

  5. Espandere il menu Avanzate.

    Deploy form

  6. Selezionare Abilita diagnostica e raccolta dati di Application Insights.

    Enable App Insights

Visualizzare metriche e log

Eseguire query nei log per i modelli distribuiti

I log degli endpoint online sono i dati del cliente. È possibile usare la funzione get_logs() per recuperare i log da un servizio Web distribuito in precedenza. Il log può contenere informazioni dettagliate sugli errori che si sono verificati durante la distribuzione.

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

Se si dispone di più tenant, potrebbe essere necessario aggiungere il codice di autenticazione seguente prima di ws = Workspace.from_config()

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

Visualizzare i log in Studio

Azure Application Insights archivia i log di servizio nello stesso gruppo di risorse dell'area di lavoro di Azure Machine Learning. Seguire questa procedura seguenti per visualizzare i dati usando Studio:

  1. Passare all'area di lavoro di Azure Machine Learning nello studio.

  2. Seleziona Endpoint.

  3. Selezionare il servizio distribuito.

  4. Selezionare il collegamento all'URL di Application Insights.

    Locate Application Insights url

  5. In Application Insights, dalla scheda Panoramica o nella sezione Monitoraggio, selezionare Log.

    Overview tab of monitoring

  6. Per visualizzare le informazioni registrate nel file score.py, consultare la tabella tracce. La query seguente cerca i log in cui è stato registrato il valore input:

    traces
    | where customDimensions contains "input"
    | limit 10
    

    trace data

Per altre informazioni su come usare Azure Application Insights, vedere Informazioni su Azure Application Insights.

Metadati del servizio Web e dati di risposta

Importante

Azure Application Insights registra solo carichi di lavoro fino a 64 KB. Se viene raggiunto questo limite, potrebbero essere restituiti errori di memoria insufficiente o potrebbe non essere registrata alcuna informazione.

Per registrare le informazioni sulla richiesta del servizio Web, aggiungere le istruzioni print al file score.py. Ogni istruzioneprint genera una voce nella tabella di traccia di Application Insights in corrispondenza del messaggio STDOUT. Application Insights archivia gli output dell'istruzione print in customDimensions e nella tabella di traccia Contents. La stampa di stringhe JSON produce una struttura di dati gerarchica nell'output di traccia in Contents.

Esportare i dati per la conservazione e l'elaborazione

Importante

Azure Application Insights supporta solo le esportazioni nella risorsa di archiviazione BLOB. Per altre informazioni sui limiti di questa implementazione, vedere Esportare i dati di telemetria da App Insights.

Usare l'esportazione continua di Application Insights per esportare i dati in un account di archiviazione BLOB in cui è possibile definire le impostazioni di conservazione. Application Insights esporta i dati in formato JSON.

Continuous export

Passaggi successivi

In questo articolo si è visto come abilitare la registrazione e visualizzare i log per gli endpoint servizio Web. Vedere questi articoli per i passaggi successivi: