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


Метрики журналов, параметры и файлы с помощью MLflow

ПРИМЕНИМО К: Python SDK azure-ai-ml v2 (current)

Azure Machine Learning поддерживает эксперименты по ведению журнала и отслеживанию с помощью MLflow Tracking. Вы можете записывать модели, метрики, параметры и artifacts с помощью MLflow, локально на компьютере или в облачной среде.

Внимание

В отличие от пакета SDK Azure Machine Learning версии 1, в пакете SDK Azure Machine Learning для Python (версия 2) нет функций ведения журнала. Если раньше вы использовали пакет SDK Azure Machine Learning версии 1, рекомендуется использовать MLflow для отслеживания экспериментов. Дополнительные сведения см. в разделе Миграция ведения журналов из пакета SDK версии 1 в MLflow.

Журналы помогают вам диагностировать ошибки и предупреждения, а также отслеживать метрики производительности, например параметры и эффективность модели. В этой статье объясняется, как активировать логирование в следующих сценариях:

  • Логируйте метрики, параметры и модели при отправке заданий.
  • Отслеживайте запуски при интерактивном обучении.
  • Асинхронно записывайте метрики.
  • Просмотр диагностической информации об обучении.

Совет

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

Предварительные требования

  • У вас должна быть Azure Machine Learning рабочая область. Если у вас нет ресурсов рабочей области, см. статью "Создание ресурсов рабочей области".

  • Необходимо установить Python 3.10 или более поздней версии.

  • Необходимо установить пакеты mlflow и azureml-mlflow. Если этого не сделать, используйте следующую команду, чтобы установить их в среде разработки:

    pip install mlflow azureml-mlflow
    

    Примечание.

    Для асинхронного ведения журнала метрик необходимо иметь MLflow версию 2.8.0+ и azureml-mlflow версию 1.55+.

  • Если вы выполняете удаленное отслеживание (отслеживание экспериментов, выполняемых за пределами Azure Machine Learning), настройте MLflow для отслеживания экспериментов. Дополнительные сведения см. в разделе Configure MLflow для Azure Machine Learning.

  • Чтобы регистрировать метрики, параметры, артефакты и модели в экспериментах в Azure Machine Learning с помощью MLflow, просто импортируйте MLflow в скрипт:

    import mlflow
    

Настройка экспериментов

MLflow упорядочивает информацию в экспериментах и запусках (в Azure Machine Learning запуски называются заданиями). Существуют некоторые различия в настройке в зависимости от способа запуска кода:

При интерактивном обучении, например в Jupyter Notebook, используйте следующий шаблон:

  1. Создайте или задайте активный эксперимент.
  2. Запустите задание.
  3. Используйте методы сбора данных для ведения журнала метрик и других сведений.
  4. Завершите задание.

Например, следующий фрагмент кода настраивает эксперимент, а затем регистрируется во время задания:

import mlflow
# Set the experiment
mlflow.set_experiment("mlflow-experiment")

# Start the run
mlflow_run = mlflow.start_run()
# Log metrics or other information
mlflow.log_metric('mymetric', 1)
# End run 
mlflow.end_run()

Совет

Технически вам не нужно start_run() вызывать, так как создается новый запуск, если он не существует, и вы вызываете API ведения журнала. В этом случае можно использовать mlflow.active_run() для получения используемого в данный момент выполнения. Дополнительные сведения см. в разделе mlflow.active_run().

Можно также использовать парадигму диспетчера контекста:

import mlflow
mlflow.set_experiment("mlflow-experiment")

# Start the run, log metrics, end the run
with mlflow.start_run() as run:
    # Run started when context manager is entered, and ended when context manager exits
    mlflow.log_metric('mymetric', 1)
    mlflow.log_metric('anothermetric',1)
    pass

При запуске нового запуска с помощью mlflow.start_run может быть полезно указать параметр run_name, который затем преобразуется в имя запуска в Azure Machine Learning пользовательском интерфейсе и помогает определить выполнение быстрее:

with mlflow.start_run(run_name="iris-classifier-random-forest") as run:
    mlflow.log_metric('mymetric', 1)
    mlflow.log_metric('anothermetric',1)

Дополнительные сведения об API ведения журнала MLflow см. в справочнике по MLflow.

Параметры журнала

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

mlflow.log_param("num_epochs", 20)

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

params = {
    "num_epochs": 20,
    "dropout_rate": .6,
    "objective": "binary_crossentropy"
}

mlflow.log_params(params)

Ведение журнала метрик

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

Зарегистрированное значение Пример кода Примечания.
Регистрация числового значения (int или float) mlflow.log_metric("my_metric", 1)
Регистрация числового значения (int или float) во времени mlflow.log_metric("my_metric", 1, step=1) Используйте параметр step , чтобы указать шаг, на котором регистрируется значение метрики. Это может быть любое целое число. По умолчанию используется нулевое значение.
Логирование булева значения mlflow.log_metric("my_metric", 0) 0 = False, 1 = True

Внимание

Рекомендации по производительности. Если необходимо регистрировать несколько метрик (или несколько значений для одной и той же метрики), не выполняйте вызовы mlflow.log_metric в циклах. Повысить производительность можно с помощью асинхронного ведения журнала или mlflow.log_metric("metric1", 9.42, synchronous=False).

Регистрация метрик асинхронно

MLflow также позволяет выполнять ведение журнала метрик асинхронным способом. Асинхронное ведение журнала метрик особенно полезно в тех случаях, когда большие задачи обучения с десятками вычислительных узлов выполняются параллельно и пытаются одновременно записывать метрики. Это также полезно, если небольшое количество узлов пытается записать большое количество метрик.

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

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

import mlflow

mlflow.config.enable_async_logging()

Рекомендуется использовать упомянутый выше глобальный флаг, если вы хотите включить асинхронное логирование метрик по всему вашему коду и/или вы используете какую-либо библиотеку оболочки, которая оборачивает mlflow для ведения журнала фактических метрик.

Одно и то же свойство можно задать с помощью переменной среды:

export MLFLOW_ENABLE_ASYNC_LOGGING=True

Чтобы регистрировать определенные метрики асинхронно, используйте API ведения журнала MLflow, как правило, но добавьте дополнительный параметр synchronous=False.

Настройка synchronous=False необязательна, если установлен глобальный флаг для выполнения входа асинхронным способом с использованием mlflow.config.enable_async_logging().

import mlflow

with mlflow.start_run():
    # (...)
    # when global async logging flag is not set using - mlflow.config.enable_async_logging()
    mlflow.log_metric("metric1", 9.42, synchronous=False)
    # (...)
import mlflow
# Set global async logging flag
mlflow.config.enable_async_logging()

with mlflow.start_run():
    # (...)
    # You can use all fluent syntax or MlflowClient APIs and all of them will log metrics in asynchronous fashion.
    mlflow.log_metric("metric1", 9.42)
    # (...)

При использовании log_metric(synchronous=False) управление автоматически возвращается вызывающему объекту после принятия операции. Однако значение недоступно для чтения немедленно. Асинхронное ведение журнала метрик не гарантирует порядка, и они сохраняются с отметкой времени их регистрации.

Внимание

Даже при использовании synchronous=False Azure Machine Learning гарантирует порядок метрик.

Если необходимо дождаться сохранения определенного значения на сервере, можно использовать возвращенную операцию метрики для ожидания, как показано в следующем примере:

import mlflow

with mlflow.start_run():
    # (...)
    run_operation = mlflow.log_metric("metric1", 9.42, synchronous=False)
    # (...)
    run_operation.wait()
    # (...)

Вы можете асинхронно записывать одну метрику в один раз или регистрить пакет метрик, как показано в следующем примере:

import mlflow
import time
from mlflow.entities import Metric

with mlflow.start_run() as current_run:
    mlflow_client = mlflow.tracking.MlflowClient()

    metrics = {"metric-0": 3.14, "metric-1": 6.28}
    timestamp = int(time.time() * 1000)
    metrics_arr = [Metric(key, value, timestamp, 0) for key, value in metrics.items()]

    run_operation = mlflow_client.log_batch(
        run_id=current_run.info.run_id,
        metrics=metrics_arr,
        #Optional when global async logging flag is set using - mlflow.enable_async_logging()
        synchronous=False,
    )

Операция wait() также доступна при регистрации пакета метрик:

run_operation.wait()

Вам не нужно вызывать wait() в ваших подпрограммах, если нет необходимости в немедленном доступе к значениям метрик. Azure Machine Learning автоматически ожидает завершения задачи, чтобы проверить, нет ли ожидающих сохранения метрик. По завершении задания в Azure Machine Learning все метрики гарантированно сохраняются.

Кривые лог-журнала или список значений

Кривые (или список числовых значений) можно регистрировать с помощью MLflow путем ведения журнала одной и той же метрики несколько раз. В следующем примере показано, как это сделать.

list_to_log = [1, 2, 3, 2, 1, 2, 3, 2, 1]
from mlflow.entities import Metric
from mlflow.tracking import MlflowClient
import time

client = MlflowClient()
client.log_batch(mlflow.active_run().info.run_id, 
                 metrics=[Metric(key="sample_list", value=val, timestamp=int(time.time() * 1000), step=0) for val in list_to_log])

Изображения логов

MLflow поддерживает два способа ведения журнала образов. Оба способа сохраняют заданный образ в качестве артефакта внутри выполнения.

Зарегистрированное значение Пример кода Примечания.
Фиксирование метрик NumPy или объектов изображений PIL mlflow.log_image(img, "figure.png") Объект img должен быть экземпляром numpy.ndarray или PIL.Image.Image. figure.png — это имя артефакта, созданного внутри выполнения. Он не обязательно должен быть существующим файлом.
Регистрировать диаграмму или файл изображения с помощью matplotlib mlflow.log_figure(fig, "figure.png") figure.png — это имя артефакта, созданного внутри выполнения. Он не обязательно должен быть существующим файлом.

Файлы журналов

Обычно файлы в MLflow называются артефактами. Вы можете регистрировать артефакты несколькими способами в Mlflow.

Зарегистрированное значение Пример кода Примечания.
Запись текста в текстовый файл mlflow.log_text("text string", "notes.txt") Текст сохраняется внутри запуска в текстовом файле с именем notes.txt.
Словари журналов в виде файлов JSON и YAML mlflow.log_dict(dictionary, "file.yaml") dictionary — это объект словаря, содержащий всю структуру, которую требуется сохранить в формате JSON или YAML-файла.
Зарегистрировать тривиальный файл, уже существующий mlflow.log_artifact("path/to/file.pkl") Файлы всегда записываются в корневой директории выполнения. Если указан параметр artifact_path, файл записывается в папку, заданную в этом параметре.
Вести журнал всех артефактов в существующей папке mlflow.log_artifacts("path/to/folder") Структура папок копируется в выполнение, но указанная корневая папка не включена.

Совет

При регистрации больших файлов с помощью log_artifact или log_model могут возникнуть ошибки времени ожидания до завершения их загрузки. Рекомендуется увеличить значение времени ожидания, изменив переменную AZUREML_ARTIFACTS_DEFAULT_TIMEOUTсреды. Значение по умолчанию — 300 (секунды).

Логарифмические модели

MLflow представляет концепцию models как способ упаковки всех необходимых артефактов для работы данной модели. Модели в MLflow всегда являются папкой с произвольным количеством файлов в зависимости от платформы, используемой для создания модели. Ведение журналов моделей имеет преимущество отслеживания всех элементов модели как единой сущности, которую можно зарегистрировать, а затем развернуть. Кроме того, модели MLflow обладают преимуществами развертывания без кода и могут использоваться с информационной панелью ответственного ИИ в студии. Дополнительные сведения см. в разделе От артефактов к моделям в MLflow.

Чтобы сохранить модель из обучающего выполнения, используйте log_model() API для платформы, с которой вы работаете. Например, mlflow.sklearn.log_model(). Дополнительные сведения см. в разделе "Ведение журнала моделей MLflow". Сведения о переносе существующих моделей в MLflow см. в разделе "Преобразование пользовательских моделей в MLflow".

Совет

При регистрации больших моделей может возникнуть ошибка Failed to flush the queue within 300 seconds. Обычно это означает, что время операции истекает до завершения отправки артефактов модели. Рекомендуется увеличить значение времени ожидания, изменив переменную AZUREML_ARTIFACTS_DEFAULT_TIMEOUTсреды.

Автоматическое ведение журнала

С помощью Azure Machine Learning и MLflow пользователи могут автоматически записывать метрики, параметры и артефакты модели при обучении модели. Каждая платформа решает, что нужно отслеживать автоматически. Поддерживается множество популярных библиотек машинного обучения. Дополнительные сведения об автоматическом ведении журнала с MLflow.

Чтобы включить автоматическое ведение журнала, вставьте следующий код перед учебным кодом:

mlflow.autolog()

Совет

Вы можете контролировать автоматически записываемые данные с помощью автолога. Например, если вы указываете mlflow.autolog(log_models=False), MLflow регистрирует все, кроме моделей для вас. Такой контроль полезен в тех случаях, когда вы хотите регистрировать модели вручную, но по-прежнему пользоваться автоматическим журналированием метрик и параметров. Кроме того, обратите внимание, что некоторые платформы могут отключить автоматическое ведение журнала моделей, если обученная модель выходит за пределы определенных границ. Такое поведение зависит от используемого вкуса, и мы рекомендуем просмотреть документацию, если это ваш вариант.

Просмотр сведений о заданиях или запусках с помощью MLflow

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

import mlflow

run = mlflow.get_run(run_id="<RUN_ID>")

Метрики, параметры и теги для выполнения можно просмотреть в поле данных объекта выполнения.

metrics = run.data.metrics
params = run.data.params
tags = run.data.tags

Примечание.

Словарь метрик в mlflow.get_run или mlflow.search_runs возвращает только последнее зарегистрированное значение для заданного имени метрики. Например, если вы регистрируете метрику iteration несколько раз с значениями, 1, 2, 3, 4, будет возвращено только 4 при вызове run.data.metrics['iteration'].

Чтобы получить все метрики, зарегистрированные для определенного имени метрики, можно использовать MlFlowClient.get_metric_history(), как описано в примере получения параметров и метрик из запуска.

Совет

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

MLflow может выполнять запрос на любой артефакт, записанный в журнал в процессе выполнения. Невозможно получить доступ к артефактам непосредственно с помощью объекта запуска; вместо этого следует использовать клиент MLflow.

client = mlflow.tracking.MlflowClient()
client.list_artifacts("<RUN_ID>")

Этот метод содержит список всех артефактов, зарегистрированных в ходе выполнения, но они остаются сохраненными в хранилище артефактов (хранилище Azure Machine Learning). Чтобы скачать любой из них, используйте download_artifacts метод:

file_path = mlflow.artifacts.download_artifacts(run_id="<RUN_ID>", artifact_path="feature_importance_weight.png")

Дополнительные сведения см. в разделе Получение метрик, параметров, артефактов и моделей.

Просмотр информации о задачах или выполнениях в студийной программе

В Azure Machine Learning studio можно просмотреть завершенные записи заданий, включая зарегистрированные метрики.

Перейдите на вкладку "Задания ". Чтобы просмотреть все задания в рабочей области в экспериментах, перейдите на вкладку "Все задания ". Вы можете детализировать задания для конкретных экспериментов, применяя фильтр "Эксперимент " в верхней строке меню. Выберите задание, интересующее вас, чтобы ввести представление сведений, а затем перейдите на вкладку "Метрики ".

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

Снимок экрана: представление метрик.

Просмотр и загрузка журналов диагностики

Файлы журналов — это важный ресурс для отладки рабочих нагрузок Azure Machine Learning. После отправки задания на обучение перейдите к конкретному запуску, чтобы просмотреть его журналы и данные о результатах.

  1. Перейдите на вкладку Задания.
  2. Выберите идентификатор конкретного запуска.
  3. Выберите Выходные данные и журналы вверху страницы.
  4. Выберите Скачать все, чтобы скачать все журналы в ZIP-папку.
  5. Можно также скачать отдельные файлы журнала, выбрав нужный файл и нажав кнопку Скачать.

Скриншот раздела результатов и журналов выполнения.

Папка user_logs

Эта папка содержит сведения о созданных пользователем журналах. По умолчанию эта папка открыта, и выбран журнал std_log.txt. В файле std_log.txt содержатся журналы вашего кода (например, инструкции печати). Этот файл содержит журналы stdout и stderr из скриптов управления и обучения (по одному на процесс). В большинстве случаев вы отслеживаете журналы здесь.

Папка system_logs

Эта папка содержит журналы, созданные Azure Machine Learning, и она закрыта по умолчанию. Журналы, созданные системой, сгруппированы в разные папки в зависимости от стадии задания во время выполнения.

Другие папки

Для обучения заданий на многокомпьютерных кластерах журналы доступны для каждого IP-узла. Структура для каждого узла такая же, как у заданий с одним узлом. Предусмотрена еще одна дополнительная папка для журналов регистрации выполнения в целом, а также журналов stderr и stdout.

Azure Machine Learning регистрирует информацию из различных источников во время обучения, таких как AutoML или контейнер Docker, выполняющий учебное задание. Многие такие журналы не документированы. Если у вас возникают проблемы и вы обращаетесь в службу поддержки Microsoft, они, возможно, смогут использовать эти журналы для устранения неполадок.