Freigeben über


Sammeln von Machine Learning-Pipelineprotokolldateien in Application Insights für Warnungen und Debuggen

GILT FÜR:Python SDK azureml v1

Die OpenCensus-Python-Bibliothek kann zum Weiterleiten von Protokollen an Application Insights in Ihren Skripts verwendet werden. Durch das Aggregieren der Protokolle von Pipelineausführungen an einem zentralen Ort können Sie Abfragen erstellen und Probleme diagnostizieren. Mithilfe von Application Insights können Sie Protokolle im Lauf der Zeit nachverfolgen und Pipelineprotokolle zwischen den Ausführungen vergleichen.

Dadurch, dass sich alle Ihre Protokolle am selben Speicherort befinden, erhalten Sie einen Verlauf der Ausnahmen und Fehlermeldungen. Da Application Insights in Azure-Warnungen integriert ist, können Sie auch Warnungen basierend auf Application Insights Abfragen erstellen.

Voraussetzungen

Erste Schritte

Dieser Abschnitt ist eine Einführung in die Verwendung von OpenCensus aus einer Azure Machine Learning-Pipeline. Ein ausführliches Tutorial finden Sie unter OpenCensus Azure Monitor Exporters.

Fügen Sie Ihrer Azure Machine Learning-Pipeline einen PythonScriptStep hinzu. Konfigurieren Sie Ihre RunConfiguration mit der Abhängigkeit von opencensus-ext-azure. Konfigurieren Sie die Umgebungsvariable 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")

Erstellen Sie eine Datei namens sample_step.py. Importieren Sie die AzureLogHandler-Klasse, um Protokolle an Application Insights weiterzuleiten. Sie müssen auch die Python-Protokollierungsbibliothek importieren.

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

Fügen Sie als Nächstes der Python-Protokollierung AzureLogHandler hinzu.

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

Protokollierung mit benutzerdefinierten Dimensionen

Standardmäßig haben an Application Insights weitergeleitete Protokolle keinen ausreichenden Kontext für die Rückverfolgung auf die Ausführung oder das Experiment. Damit die Protokolle für die Diagnose von Problemen verwendet werden können, sind zusätzliche Felder erforderlich.

Dazu können benutzerdefinierte Dimensionen als Felder hinzugefügt werden, um Kontext für eine Protokollnachricht bereitzustellen. Ein Beispiel hierfür ist, wenn ein Benutzer die Protokolle für mehrere Schritte in derselben Pipelineausführung anzeigen möchte.

Benutzerdefinierte Dimensionen bilden ein Wörterbuch von Schlüssel-Wert-Paaren (in der Form „Zeichenfolge, Zeichenfolge“ gespeichert). Das Wörterbuch wird dann an Application Insights gesendet und als Spalte in den Abfrageergebnissen angezeigt. Die einzelnen Dimensionen können als Abfrageparameter verwendet werden.

Hilfreicher Kontext zum Einschließen

Feld Begründung/Beispiel
parent_run_id Abfragen von Protokollen für andere mit derselben parent_run_id, um die Protokolle im Zeitverlauf für alle Schritte anzuzeigen, anstatt jeden Schritt einzeln zu untersuchen
step_id Abfragen von Protokollen mit derselben step_id, um zu sehen, wo ein Problem mit einem engen Bereich nur für den einzelnen Schritt aufgetreten ist
step_name Abfragen von Protokollen, um die Schrittleistung im Zeitverlauf anzuzeigen. Unterstützt auch das Auffinden einer step_id für kürzliche Ausführungen, ohne die Benutzeroberfläche des Portals anzuzeigen
experiment_name Abfragen über Protokolle hinweg, um die Leistung des Experiments im Zeitverlauf anzuzeigen. Unterstützt auch das Auffinden einer parent_run_id oder step_id für kürzliche Ausführungen, ohne die Benutzeroberfläche des Portals anzuzeigen
run_url Bereitstellen eines Links direkt zurück zur Runtime für die weitere Untersuchung

Weitere nützliche Felder

Diese Felder erfordern möglicherweise eine weitere Codeinstrumentierung und werden nicht vom Ausführungskontext bereitgestellt.

Feld Begründung/Beispiel
build_url/build_version Wenn Sie für die Bereitstellung CI/CD verwenden, kann dieses Feld Protokolle mit der Codeversion, die die Schritt- und Pipelinelogik bereitgestellt hat, korrelieren. Dieser Link kann weiter bei der Diagnose von Problemen oder beim Identifizieren von Modellen mit bestimmten Merkmalen (Protokoll-/Metrikwerte) helfen.
run_type Unterscheiden zwischen verschiedenen Modelltypen oder zwischen Trainings- und Bewertungsausführungen

Erstellen eines benutzerdefinierten Dimensionswörterbuchs

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

Überlegungen zur Python-Protokollierung mit OpenCensus

Der OpenCensus-AzureLogHandler wird zum Weiterleiten von Python-Protokollen an Application Insights verwendet. Daher sollten die Besonderheiten der Python-Protokollierung berücksichtigt werden. Wenn eine Protokollierung erstellt wird, weist sie eine Standardprotokollebene auf und zeigt Protokolle an, die sich auf oder über dieser Ebene befinden. Eine gute Referenz zur Verwendung der Python-Protokollierungsfunktionen stellt das Logging Cookbook dar.

Die Umgebungsvariable APPLICATIONINSIGHTS_CONNECTION_STRING ist für die OpenCensus-Bibliothek erforderlich. Es wird empfohlen, diese Umgebungsvariable festzulegen, anstatt sie als Pipelineparameter zu übergeben, um die Weitergabe von Textverbindungszeichenfolgen zu vermeiden.

Abfragen von Protokollen in Application Insights

Die an Application Insights weitergeleiteten Protokolle werden als „Ablaufverfolgungen“ oder „Ausnahmen“ aufgeführt. Passen Sie Ihr Zeitfenster unbedingt so an, dass die Pipelineausführung enthalten ist.

Abfrageergebnisse von Application Insights

Das Ergebnis in Application Insights enthält die Protokollmeldung und -ebene, den Dateipfad und die Nummer der Codezeile. Außerdem werden alle enthaltenen benutzerdefinierten Dimensionen angezeigt. In dieser Abbildung weist das Wörterbuch „customDimensions“ die Schlüssel-Wert-Paare aus dem vorherigen Codebeispiel auf.

Weitere hilfreiche Abfragen

Einige der nachstehenden Abfragen verwenden „customDimensions.Level“. Diese Schweregrade entsprechen der Ebene, mit der das Python-Protokoll ursprünglich gesendet wurde. Weitere Abfrageinformationen finden Sie unter Protokollabfragen in Azure Monitor.

Anwendungsfall Abfrage
Protokollergebnisse für eine bestimmte benutzerdefinierte Dimension, z. B. „parent_run_id“
traces | 
where customDimensions.parent_run_id == '931024c2-3720-11ea-b247-c49deda841c1
Protokollergebnisse für alle Trainingsausführungen in den letzten 7 Tagen
traces | 
where timestamp > ago(7d)
and customDimensions.run_type == 'training'
Protokollergebnisse mit severityLevel-Fehler in den letzten 7 Tagen
traces | 
where timestamp > ago(7d)
and customDimensions.Level == 'ERROR'
Anzahl der Protokollergebnisse mit severityLevel-Fehler in den letzten 7 Tagen
traces | 
where timestamp > ago(7d)
and customDimensions.Level == 'ERROR' |
summarize count()

Nächste Schritte

Nachdem Sie in Ihrer Application Insights-Instanz Protokolle verwendet haben, können Sie sie zum Festlegen von Azure Monitor-Warnungen basierend auf den Abfrageergebnissen verwenden.

Sie können Ergebnisse von Abfragen für mehr Einsicht auch einemAzure-Dashboard hinzufügen.