Поделиться через


Сбор файлов журналов конвейера машинного обучения в Application Insights для отправки оповещений и отладки

ОБЛАСТЬ ПРИМЕНЕНИЯ: Пакет SDK для Python версии 1

Для маршрутизации журналов из ваших скриптов в Application Insights можно использовать библиотеку Python OpenCensus. Объединение журналов из выполняющихся конвейеров в одном месте позволяет создавать запросы и диагностировать проблемы. С помощью Application Insights вы можете отслеживать журналы с течением времени и сравнивать журналы конвейера во время выполнения.

Сбор журналов в одном месте, будет позволяет представлять историю исключений и сообщений об ошибках. Так как Application Insights интегрируется с оповещениями Azure, вы также можете создавать оповещения на основе запросов Application Insights.

Необходимые компоненты

Начало работы

В этом разделе представлены общие сведения об использовании библиотеки OpenCensus из конвейера Машинного обучения Azure. Подробное руководство см. в разделе Экспортеры Azure Monitor OpenCensus.

Добавьте PythonScriptStep в конвейер Машинное обучение Azure. Настройте в RunConfiguration зависимость от opencensus-ext-azure. Настройте переменную среды 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")

Создайте файл с именем sample_step.py. Импортируйте класс AzureLogHandler, чтобы направлять журналы в Application Insights. Также необходимо импортировать библиотеку ведения журнала Python.

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

Затем добавьте класс AzureLogHandler в средство ведения журнала 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")

Ведение журнала с пользовательскими измерениями

По умолчанию журналы, пересылаемые в Application Insights, не имеют достаточного контекста для отслеживания запуска или эксперимента. Чтобы журналы были доступны для диагностики проблем, требуются дополнительные поля.

Чтобы добавить эти поля, можно добавить пользовательские измерения, позволяющие предоставить контекст для сообщения журнала. Например, предположим, что кому-либо требуется просматривать журналы на протяжении нескольких шагов в одном и том же выполнении конвейера.

Пользовательские измерения составляют словарь пар "ключ-значение" (сохраненных в виде строковых значений). Затем словарь отправляется в Application Insights и отображается как столбец в результатах запроса. Его отдельные измерения можно использовать в качестве параметров запроса.

Полезный контекст для включения

Поле Причина/пример
parent_run_id Можно запрашивать журналы с одним и тем же значением parent_run_id, чтобы просматривать журналы с течением времени для всех шагов, вместо того чтобы углубляться в каждый отдельный шаг.
step_id Можно запрашивать журналы с одним и тем же step_id, чтобы узнать, где возникла проблема, сузив область до одного шага.
step_name Можно запрашивать журналы для просмотра производительности шага с течением времени. Также помогает найти step_id для последних запусков без перехода в пользовательский интерфейс портала.
experiment_name Можно выполнять запросы к журналам для просмотра производительности экспериментов с течением времени. Также помогает найти parent_run_id или step_id для последних запусков без перехода в пользовательский интерфейс портала.
run_url Можно напрямую получить ссылку на запуск для исследования.

Другие полезные поля

Эти поля могут требовать дополнительного инструментирования кода и не предоставляются контекстом выполнения.

Поле Причина/пример
build_url/build_version При использовании CI/CD для развертывания это поле может сопоставлять журналы с версией кода, что позволяет получить логику этапа и конвейера. Эта ссылка может быть полезна для диагностики проблем или обнаружения моделей с определенными признаками (значения журнала/метрик).
run_type Позволяет различать разные типы моделей, а также запуски для обучения и оценки.

Создание словаря пользовательских измерений

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

Аспекты ведения журнала OpenCensus Python

AzureLogHandler OpenCensus используется для перенаправления журналов Python в Application Insights. В результате следует учитывать особенности ведения журнала Python. При создании средства ведения журнала оно имеет уровень ведения журнала по умолчанию и отображает журналы не ниже этого уровня. Учебник по ведению журналов — отличный справочник по использованию функций ведения журналов Python.

Для библиотеки OpenCensus требуется переменная среды APPLICATIONINSIGHTS_CONNECTION_STRING. Рекомендуется задавать эту переменную среды, а не передавать ее в качестве параметра конвейера, чтобы избежать передачи строк соединения в виде открытого текста.

Запрос журналов в Application Insights

Журналы, направляемые в Application Insights, будут отображаться в разделе трассировок или исключений. Не забудьте настроить период времени, чтобы включить в него выполнение конвейера.

Результаты запросов Application Insights

Результат в Application Insights будет показывать сообщение журнала и уровень, путь к файлу и номер строки кода. Он также покажет все включенные пользовательские измерения. На этом рисунке в словаре customDimensions показаны пары "ключ-значение" из предыдущего примера кода.

Другие полезные запросы

В некоторых следующих запросах используется "customDimensions.Level". Эти уровни серьезности соответствуют уровню, с которым был первоначально отправлен журнал Python. Дополнительные сведения о запросах см. в статье Запросы журналов Azure Monitor.

Вариант использования Query
Регистрация в журнале результатов для конкретного пользовательского измерения, например, для parent_run_id
трассировки | 
where customDimensions.parent_run_id == '931024c2-3720-11ea-b247-c49deda841c1
Регистрация в журнале результатов всех обучающих запусков за последние семь дней
трассировки | 
where timestamp > ago(7d)
and customDimensions.run_type == 'training'
Регистрация в журнале результатов с ошибкой severityLevel за последние семь дней
трассировки | 
where timestamp > ago(7d)
и customDimensions.Level == 'ERROR'
Подсчет количества результатов с ошибкой severityLevel за последние семь дней
трассировки | 
where timestamp > ago(7d)
and customDimensions.Level == 'ERROR' |
summarize count()

Next Steps

После получения журналов в экземпляре Application Insights их можно использовать для настройки оповещений Azure Monitor на основе результатов запроса.

Вы также можете добавлять результаты из запросов в панель мониторинга Azure для получения дополнительных аналитических сведений.