Condividi tramite


Raccogliere i file di log della pipeline di Machine Learning in Application Insights per avvisi e debug

SI APPLICA A: SDK azureml per Python v1

La libreria di Python OpenCensus può essere usata per instradare i log ad Application Insights dai propri script. L'aggregazione dei log dalle esecuzioni della pipeline in un'unica posizione consente di generare query e diagnosticare problemi. L'uso di Application Insights consentirà di tenere traccia dei log nel tempo e confrontare i log della pipeline per le varie esecuzioni.

La disponibilità dei log in un’unica posizione fornirà una cronologia delle eccezioni e dei messaggi di errore. Poiché Application Insights si integra con Avvisi di Azure, è anche possibile creare avvisi basati su query di Application Insights.

Prerequisiti

Introduzione

Questa sezione è un'introduzione specifica all'uso di OpenCensus da una pipeline di Azure Machine Learning. Per un'esercitazione dettagliata, vedere Utilità di esportazione di Monitoraggio di Azure per OpenCensus

Aggiungere PythonScriptStep alla pipeline di Azure Machine Learning. Configurare RunConfiguration con la dipendenza da opencensus-ext-azure. Configurare la variabile di ambiente APPLICATIONINSIGHTS_CONNECTION_STRING.

from azureml.core.conda_dependencies import CondaDependencies
from azureml.core.runconfig import RunConfiguration
from azureml.pipeline.core import Pipeline
from azureml.pipeline.steps import PythonScriptStep

# Connecting to the workspace and compute target not shown

# Add pip dependency on OpenCensus
dependencies = CondaDependencies()
dependencies.add_pip_package("opencensus-ext-azure>=1.0.1")
run_config = RunConfiguration(conda_dependencies=dependencies)

# Add environment variable with Application Insights Connection String
# Replace the value with your own connection string
run_config.environment.environment_variables = {
    "APPLICATIONINSIGHTS_CONNECTION_STRING": 'InstrumentationKey=00000000-0000-0000-0000-000000000000'
}

# Configure step with runconfig
sample_step = PythonScriptStep(
        script_name="sample_step.py",
        compute_target=compute_target,
        runconfig=run_config
)

# Submit new pipeline run
pipeline = Pipeline(workspace=ws, steps=[sample_step])
pipeline.submit(experiment_name="Logging_Experiment")

Creare un file denominato sample_step.py. Importare la classe AzureLogHandler per instradare i log ad Application Insights. Sarà necessario anche importare la libreria di registrazione Python.

from opencensus.ext.azure.log_exporter import AzureLogHandler
import logging

Aggiungere, quindi, AzureLogHandler al logger Python.

logger = logging.getLogger(__name__)
logger.setLevel(logging.DEBUG)
logger.addHandler(logging.StreamHandler())

# Assumes the environment variable APPLICATIONINSIGHTS_CONNECTION_STRING is already set
logger.addHandler(AzureLogHandler())
logger.warning("I will be sent to Application Insights")

Registrazione con dimensioni personalizzate

Per impostazione predefinita, il contesto dei log inoltrati ad Application Insights non sarà sufficiente per risalire all'esecuzione o all'esperimento. Per rendere i log interattivi per la diagnosi dei problemi, sono necessari altri campi.

Per aggiungere questi campi, è possibile aggiungere dimensioni personalizzate per fornire il contesto per un messaggio di log. Un esempio è quando un utente desidera visualizzare i log per più passaggi nella stessa esecuzione della pipeline.

Le dimensioni personalizzate sono costituite da un dizionario di coppie chiave-valore (archiviate come stringa, stringa). Il dizionario, quindi, viene inviato ad Application Insights e visualizzato come colonna nei risultati della query. Le singole dimensioni possono essere usate come parametri di query.

Contesto utile da includere

Campo Ragionamento/esempio
parent_run_id Consente l’esecuzione di query sui log per quelli con lo stesso parent_run_id per visualizzare i log nel tempo per tutti i passaggi invece di dover approfondire ogni singolo passaggio
step_id Consente l’esecuzione di query sui log per quelli con lo stesso step_id per scoprire dove si è verificato un problema con un ambito ristretto al singolo passaggio
step_name Consente l’esecuzione di query sui log per visualizzare le prestazioni dei passaggi nel tempo. Facilita anche l’individuazione di uno step_id per le esecuzioni recenti senza dover cercare nell'interfaccia utente del portale
experiment_name Consente l’esecuzione di query tra i log per visualizzare le prestazioni dell'esperimento nel tempo. Facilita anche l’individuazione di un parent_run_id o uno step_id per le esecuzioni recenti senza dover cercare nell'interfaccia utente del portale
run_url Può fornire un collegamento diretto all'esecuzione a scopo di indagine.

Altri campi utili

Questi campi potrebbero richiedere una strumentazione di codice aggiuntiva e non viene fornita dal contesto di esecuzione.

Campo Ragionamento/esempio
build_url/build_version Se si usa CI/CD per la distribuzione, questo campo può correlare i log alla versione del codice che ha fornito la logica dei passaggi e della pipeline. Questo collegamento può facilitare ulteriormente la diagnosi di problemi o l’identificazione di modelli con tratti specifici (valori di log/metrica)
run_type Consente di distinguere tra tipi di modello diversi o tra esecuzioni di training ed esecuzioni di assegnazione dei punteggi

Creazione di un dizionario di dimensioni personalizzate

from azureml.core import Run

run = Run.get_context(allow_offline=False)

custom_dimensions = {
    "parent_run_id": run.parent.id,
    "step_id": run.id,
    "step_name": run.name,
    "experiment_name": run.experiment.name,
    "run_url": run.parent.get_portal_url(),
    "run_type": "training"
}

# Assumes AzureLogHandler was already registered above
logger.info("I will be sent to Application Insights with Custom Dimensions", extra= {"custom_dimensions":custom_dimensions})

Considerazioni sulla registrazione Python di OpenCensus

OpenCensus AzureLogHandler viene usato per instradare i log di Python ad Application Insights. Di conseguenza, è necessario tenere conto di tutte le peculiarità della registrazione Python. Al momento della creazione, un logger ha un livello di log predefinito e mostrerà i log con tale livello o un livello superiore. Un utile riferimento per l'uso delle funzionalità di registrazione di Python è Logging Cookbook (Guida di riferimento alla registrazione).

La variabile di ambiente APPLICATIONINSIGHTS_CONNECTION_STRING è necessaria per la libreria OpenCensus. È consigliabile impostare questa variabile di ambiente anziché passarla come parametro della pipeline, per evitare il passaggio di stringhe di connessione in testo non crittografato.

Esecuzione di query sui log in Application Insights

I log instradati ad Application Insights verranno visualizzati tra le tracce o le eccezioni. Assicurarsi di configurare l'intervallo di tempo in modo da includere l'esecuzione della pipeline.

Risultato della query di Application Insights

Il risultato in Application Insights mostrerà il messaggio e il livello del log, il percorso del file e il numero di riga del codice. Verranno visualizzate anche tutte le dimensioni personalizzate incluse. In questa immagine, il dizionario customDimensions mostra le coppie chiave/valore dell'esempio di codice precedente.

Altre query utili

Alcune delle query seguenti usano customDimensions.Level. Questi livelli di gravità corrispondono al livello con cui è stato inviato originariamente il log Python. Per altre informazioni sulle query, vedere Query di log di Monitoraggio di Azure.

Caso d'uso Query
Risultati del log per una dimensione personalizzata specifica, ad esempio parent_run_id
traces | 
where customDimensions.parent_run_id == '931024c2-3720-11ea-b247-c49deda841c1
Risultati dei log per tutte le esecuzioni di training negli ultimi sette giorni
traces | 
where timestamp > ago(7d)
and customDimensions.run_type == 'training'
Risultati dei log con severityLevel Errore degli ultimi sette giorni
traces | 
where timestamp > ago(7d)
and customDimensions.Level == 'ERROR'
Numero di risultati dei log con severityLevel Errore negli ultimi sette giorni
traces | 
where timestamp > ago(7d)
and customDimensions.Level == 'ERROR' |
summarize count()

Passaggi successivi

Dopo aver trasferito i log nell'istanza di Application Insights, è possibile usarli per impostare avvisi di Monitoraggio di Azure in base ai risultati della query.

È anche possibile aggiungere risultati da query a un dashboard di Azure per altre informazioni dettagliate.