Запуск, мониторинг и отслеживание журнала выполнения

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

ОБЛАСТЬ ПРИМЕНЕНИЯ: Расширение ML для Azure CLI версии 1

Пакет SDK Машинного обучения Azure для Python (версия 1) и CLI Машинного обучения реализуют различные методы мониторинга, упорядочения и отслеживания выполнений для обучения и экспериментирования. Журнал выполнения машинного обучения является важной частью процедуры разработки объясняемого и повторяемого машинного обучения.

Совет

Сведения об использовании студии см. в разделе об отслеживании, мониторинги и анализе запусков с помощью студии.

Если вы используете пакет SDK версии 2 Машинного обучения Azure, ознакомьтесь со следующими статьями:

В этой статье показано, как выполнять следующие задачи:

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

Совет

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

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

Потребуется следующее:

Производительность мониторинга выполнения

  • Запуск выполнения и ведения журнала

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

    1. Настройте эксперимент, импортировав классы Workspace, Experiment, Run и ScriptRunConfig из пакета azureml.core.

      import azureml.core
      from azureml.core import Workspace, Experiment, Run
      from azureml.core import ScriptRunConfig
      
      ws = Workspace.from_config()
      exp = Experiment(workspace=ws, name="explore-runs")
      
    2. Запустите выполнение и ведение журнала с помощью метода start_logging().

      notebook_run = exp.start_logging()
      notebook_run.log(name="message", value="Hello from run!")
      
  • Мониторинг состояния выполнения

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

    • Получите состояние выполнения с помощью метода get_status().

      print(notebook_run.get_status())
      
    • Чтобы получить идентификатор выполнения, время выполнения и другие сведения о выполнении, используйте метод get_details().

      print(notebook_run.get_details())
      
    • Когда выполнение завершится успешно, вызовите метод complete(), чтобы пометить его как завершенное.

      notebook_run.complete()
      print(notebook_run.get_status())
      
    • Если используется конструктивный шаблон Python with...as, то выполнение автоматически помечается как завершенное, когда оно выходит за пределы области. Не нужно вручную помечать выполнение как завершенное.

      with exp.start_logging() as notebook_run:
          notebook_run.log(name="message", value="Hello from run!")
          print(notebook_run.get_status())
      
      print(notebook_run.get_status())
      

Пометка и поиск выполнений

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

  • Добавление свойств и тегов

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

    Чтобы добавить в выполнение метаданные для поиска, используйте метод add_properties(). Например, следующий код добавляет для выполнения свойство "author":

    local_run.add_properties({"author":"azureml-user"})
    print(local_run.get_properties())
    

    Свойства являются неизменяемыми, поэтому они создают постоянную запись для целей аудита. В следующем примере кода возникнет ошибка, так как мы уже добавили "azureml-user" в качестве значения свойства "author" в приведенном выше коде:

    try:
        local_run.add_properties({"author":"different-user"})
    except Exception as e:
        print(e)
    

    В отличие от свойств, теги являются изменяемыми. Чтобы добавить доступную для поиска и осмысленную информацию для потребителей вашего эксперимента, используйте метод tag().

    local_run.tag("quality", "great run")
    print(local_run.get_tags())
    
    local_run.tag("quality", "fantastic run")
    print(local_run.get_tags())
    

    Можно также добавлять простые строковые теги. Если эти теги отображаются в словаре тегов в качестве ключей, то они имеют значение None.

    local_run.tag("worth another look")
    print(local_run.get_tags())
    
  • Запрос свойств и тегов

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

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

    list(exp.get_runs(properties={"author":"azureml-user"},tags={"quality":"fantastic run"}))
    list(exp.get_runs(properties={"author":"azureml-user"},tags="worth another look"))
    

Отмена или сбой выполнения

Если вы заметили ошибку или выполнение занимает слишком много времени, можно отменить его.

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

Чтобы отменить выполнение с помощью пакета SDK, используйте метод cancel().

src = ScriptRunConfig(source_directory='.', script='hello_with_delay.py')
local_run = exp.submit(src)
print(local_run.get_status())

local_run.cancel()
print(local_run.get_status())

Если выполнение завершается, но содержит ошибку (например, был использован неверный сценарий обучения), то можно с помощью метода fail() пометить его как неуспешное.

local_run = exp.submit(src)
local_run.fail()
print(local_run.get_status())

Создание дочерних выполнений

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

Создание дочерних выполнений позволит объединить связанные выполнения, например для итераций с различными параметрами настройки.

Примечание.

Дочерние выполнения можно создать только с помощью пакета SDK.

В этом примере кода используется скрипт hello_with_children.py для создания пакета из пяти дочерних выполнений из отправленного выполнения с помощью метода child_run():

!more hello_with_children.py
src = ScriptRunConfig(source_directory='.', script='hello_with_children.py')

local_run = exp.submit(src)
local_run.wait_for_completion(show_output=True)
print(local_run.get_status())

with exp.start_logging() as parent_run:
    for c,count in enumerate(range(5)):
        with parent_run.child_run() as child:
            child.log(name="Hello from child run", value=c)

Примечание.

При выходе из области действия дочерние выполнения автоматически помечаются как завершенные.

Чтобы эффективно создать множество дочерних выполнений, используйте метод create_children(). Поскольку каждое создание приводит к сетевому вызову, создание выполнений пакетом является более эффективным, чем их поочередное создание.

Отправка дочерних выполнений

Дочерние выполнения также могут быть отправлены из родительского выполнения. Это позволяет создавать иерархии родительских и дочерних выполнений. Невозможно создать дочернее выполнение без родительского. Даже если родительское выполнение не производит никаких действий, но запускает дочернее, то создание иерархии все равно необходимо. Состояния всех выполнений независимы: родительское выполнение может находиться в успешном состоянии "Completed", даже если одно или несколько дочерних выполнений были отменены или завершились сбоем.

Может потребоваться, чтобы дочернее выполнение использовало конфигурацию, отличную от конфигурации родительского. Например, может использоваться менее мощная конфигурация на основе ЦП для родительского выполнения, а для дочерних — конфигурация на основе GPU. Часто также возникает необходимость передавать каждому дочернему выполнению разные аргументы и данные. Чтобы настроить дочернее выполнение, создайте для него объект ScriptRunConfig.

Важно!

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

Приведенный ниже код:

  • извлекает вычислительный ресурс с именем "gpu-cluster" из рабочей области ws;
  • выполняет перебор значений аргументов для передачи дочерним объектам ScriptRunConfig;
  • создает и отправляет новое дочернее выполнение с использованием пользовательского вычислительного ресурса и аргумента;
  • блокируется до завершения всех дочерних выполнений.
# parent.py
# This script controls the launching of child scripts
from azureml.core import Run, ScriptRunConfig

compute_target = ws.compute_targets["gpu-cluster"]

run = Run.get_context()

child_args = ['Apple', 'Banana', 'Orange']
for arg in child_args: 
    run.log('Status', f'Launching {arg}')
    child_config = ScriptRunConfig(source_directory=".", script='child.py', arguments=['--fruit', arg], compute_target=compute_target)
    # Starts the run asynchronously
    run.submit_child(child_config)

# Experiment will "complete" successfully at this point. 
# Instead of returning immediately, block until child runs complete

for child in run.get_children():
    child.wait_for_completion()

Чтобы создать множество дочерних выполнений с одинаковыми конфигурациями, аргументами и входными данными, используйте метод create_children(). Поскольку каждое создание приводит к сетевому вызову, создание выполнений пакетом является более эффективным, чем их поочередное создание.

В дочернем выполнении можно просмотреть идентификатор родительского выполнения:

## In child run script
child_run = Run.get_context()
child_run.parent.id

Запрос дочерних выполнений

Чтобы выполнить запрос к дочерним выполнениям определенного родительского, используйте метод get_children(). Аргумент recursive = True позволяет выполнять запросы к вложенному дереву дочерних выполнений.

print(parent_run.get_children())

Вход в родительское или корневое выполнение

Через поле Run.parent доступно выполнение, которым был запущено текущее дочернее выполнение. Распространенным вариантом использования Run.parent является объединение результатов журналов в одном месте. Дочерние выполнения запускаются асинхронно, и нет никакой гарантии, что их порядок или синхронизация не превысят способность родительского выполнения дождаться завершения всех дочерних выполнений.

# in child (or even grandchild) run

def root_run(self : Run) -> Run :
    if self.parent is None : 
        return self
    return root_run(self.parent)

current_child_run = Run.get_context()
root_run(current_child_run).log("MyMetric", f"Data from child run {current_child_run.id}")

Мониторинг состояния выполнения через уведомления по электронной почте.

  1. На портале Azure на панели навигации слева выберите вкладку Монитор.

  2. Выберите Параметры диагностики, а затем выберите + Добавить параметр диагностики.

    Screenshot of diagnostic settings for email notification.

  3. В поле "Параметр диагностики"

    1. в разделе Сведения о категории выберите AmlRunStatusChangedEvent.
    2. В разделе Сведения о назначении выберите Отправить в рабочую область Log Analytics, а затем заполните поля Подписка и Рабочая область Log Analytics.

    Примечание.

    Рабочая область Azure Log Analytics — это ресурс Azure типа, отличного от рабочей области службы машинного обучения Azure. Если в этом списке нет параметров, то можно создать рабочую область Log Analytics.

    Screenshot of configuring the email notification.

  4. На вкладке Журналы добавьте Новое правило генерации оповещений.

    Screeenshot of the new alert rule.

  5. См. раздел Создание и просмотр оповещений журнала, а также управление ими с помощью Azure Monitor

Примеры записных книжек

Основные понятия, описанные в этой статье, демонстрируют следующие заметки.

Следующие шаги