Метрики журналов, параметры и файлы с помощью MLflow
ОБЛАСТЬ ПРИМЕНЕНИЯ: Пакет SDK для Python azure-ai-ml версии 2 (current)
Машинное обучение Azure поддерживает ведение журналов и отслеживание экспериментов с помощью отслеживания MLflow. Вы можете записывать модели, метрики, параметры и артефакты с помощью MLflow, локально на компьютере или в облачной среде.
Внимание
В отличие от пакета SDK Машинное обучение Azure версии 1, в пакете SDK Машинное обучение Azure для Python (версия 2) нет функций ведения журнала. Если раньше вы использовали пакет SDK Машинное обучение Azure версии 1, рекомендуется использовать MLflow для отслеживания экспериментов. Дополнительные сведения см. в разделе Миграция ведения журналов из пакета SDK версии 1 в MLflow.
Журналы помогают вам диагностировать ошибки и предупреждения, а также отслеживать метрики производительности, например параметры и эффективность модели. В этой статье объясняется, как включить ведение журнала в следующих сценариях:
- Метрики журналов, параметры и модели при отправке заданий.
- Отслеживайте запуски при интерактивном обучении.
- Метрики журналов асинхронно.
- Просмотр диагностических сведений об обучении.
Совет
В этой статье демонстрируется, как обеспечить мониторинг для процесса обучения модели. Если вы заинтересованы в мониторинге использования ресурсов и событий из Машинное обучение Azure, таких как квоты, завершенные задания обучения или завершенные развертывания моделей, см. статью "Мониторинг Машинное обучение Azure".
Необходимые компоненты
У вас должна быть рабочая область Машинного обучения Azure. Если у вас нет ресурсов рабочей области, см. статью "Создание ресурсов рабочей области".
Необходимо установить
mlflow
иazureml-mlflow
установить пакеты. Если этого не сделать, используйте следующую команду, чтобы установить их в среде разработки:pip install mlflow azureml-mlflow
Примечание.
Для асинхронного ведения журнала метрик необходимо иметь
MLflow
версию 2.8.0+ иazureml-mlflow
версию 1.55+.Если вы выполняете удаленное отслеживание (отслеживание экспериментов, выполняемых за пределами Машинное обучение Azure), настройте MLflow для отслеживания экспериментов. Дополнительные сведения см. в разделе "Настройка MLflow для Машинное обучение Azure".
Чтобы регистрировать метрики, параметры, артефакты и модели в экспериментах в Машинное обучение Azure с помощью MLflow, просто импортируйте MLflow в скрипт:
import mlflow
Настройка экспериментов
MLflow упорядочивает сведения в экспериментах и запусках (в Машинное обучение Azure выполняются задания). Существуют некоторые различия в настройке в зависимости от способа запуска кода:
При интерактивном обучении, например в Jupyter Notebook, используйте следующий шаблон:
- Создайте или задайте активный эксперимент.
- Запустите задание.
- Используйте методы сбора данных для ведения журнала метрик и других сведений.
- Завершите задание.
Например, следующий фрагмент кода настраивает эксперимент, а затем регистрируется во время задания:
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 и помогает определить более быстрый запуск:
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 = истина, 1 = ложь |
Внимание
Рекомендации по производительности. Если необходимо регистрировать несколько метрик (или несколько значений для одной и той же метрики), не выполняйте вызовы mlflow.log_metric
в циклах. Повысить производительность можно с помощью асинхронного ведения журнала или mlflow.log_metric("metric1", 9.42, synchronous=False)
ведения журнала пакет метрик.
Метрики журналов асинхронно
MLflow также позволяет выполнять ведение журнала метрик асинхронным способом. Асинхронное ведение журнала метрик особенно полезно в случаях, когда большие задания обучения с десятками вычислительных узлов могут выполняться и пытаться одновременно записывать метрики. Это также полезно, если небольшое количество узлов пытается записать большое количество метрик.
Асинхронное ведение журнала метрик позволяет немедленно записывать метрики, избегая их материализации в серверной службе. Этот подход масштабируется до крупных подпрограмм обучения, которые регистрируют сотни тысяч значений метрик и рекомендуется.
Метрики MLflow синхронно по умолчанию можно изменить в любое время:
import mlflow
mlflow.config.enable_async_logging()
Одно и то же свойство можно задать с помощью переменной среды:
export MLFLOW_ENABLE_ASYNC_LOGGING=True
Чтобы регистрировать определенные метрики асинхронно, используйте API ведения журнала MLflow, как правило, но добавьте дополнительный параметр synchronous=False
.
import mlflow
with mlflow.start_run():
# (...)
mlflow.log_metric("metric1", 9.42, synchronous=False)
# (...)
При использовании log_metric(synchronous=False)
элемент управления автоматически возвращается вызывающему объекту после принятия операции, однако значение недоступно для чтения в немедиательном режиме. Асинхронное ведение журнала метрик гарантирует порядок и сохраняется с меткой времени при их регистрации.
Внимание
Даже если synchronous=False
Машинное обучение Azure гарантирует порядок метрик.
Если необходимо дождаться сохранения определенного значения в серверной части, можно использовать операцию метрик, возвращенную для ожидания, как показано в следующем примере:
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,
synchronous=False,
)
Операция wait()
также доступна при регистрации пакета метрик:
run_operation.wait()
Вам не нужно вызывать wait()
подпрограммы, если вам не нужен немедленный доступ к значениям метрик. Машинное обучение Azure автоматически ожидает завершения задания, чтобы узнать, существует ли какая-либо ожидающая метрика. По завершении задания в Машинное обучение Azure все метрики гарантированно сохраняются.
Кривые журнала или список значений
Кривые (или список числовых значений) можно регистрировать с помощью 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 — это имя артефакта, созданного внутри запуска. Он не обязательно должен быть существующим файлом. |
Регистрация графика matlotlib или файла изображения | 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 представляет концепцию моделей в качестве способа упаковки всех артефактов, необходимых для работы данной модели. Модели в 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 и 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 хранилище). Чтобы скачать любой из них, используйте метод download_artifact
:
file_path = client.download_artifacts("<RUN_ID>", path="feature_importance_weight.png")
Дополнительные сведения см. в разделе "Получение метрик", параметров, артефактов и моделей.
Просмотр сведений о заданиях или запусках в студии
В студии Машинного обучения Azure можно просматривать записи о завершенных заданиях, в том числе зарегистрированные метрики.
Перейдите на вкладку "Задания ". Чтобы просмотреть все задания в рабочей области в экспериментах, перейдите на вкладку "Все задания ". Вы можете детализировать задания для конкретных экспериментов, применяя фильтр "Эксперимент " в верхней строке меню. Выберите задание, интересующее вас, чтобы ввести представление сведений, а затем перейдите на вкладку "Метрики ".
Выберите зарегистрированные метрики для отрисовки диаграмм справа. Вы можете настроить диаграммы, применяя сглаживание, изменение цвета или отображение нескольких метрик на одном графе. Вы также сможете изменять размер и расположение макета по своему усмотрению. После создания нужного представления вы можете сохранить его для дальнейшего использования и поделиться им с коллегами с помощью прямой ссылки.
Просмотр и загрузка журналов диагностики
Файлы журналов — это важный ресурс для отладки рабочих нагрузок Машинное обучение Azure. Отправив задание обучения, задайте детализацию до уровня конкретного запуска, чтобы просмотреть его журналы и выходные данные:
- Перейдите на вкладку Задания.
- Выберите идентификатор конкретного запуска.
- Выберите Выходные данные и журналы вверху страницы.
- Выберите Скачать все, чтобы скачать все журналы в ZIP-папку.
- Можно также скачать отдельные файлы журнала, выбрав нужный файл и нажав кнопку Скачать.
Папка user_logs
Эта папка содержит сведения о журналах, созданных пользователем. По умолчанию эта папка открыта, и выбран журнал std_log.txt. В файле std_log.txt содержатся журналы вашего кода (например, инструкции печати). Этот файл содержит журналы stdout
и stderr
из скриптов управления и обучения (по одному на процесс). В большинстве случаев вы отслеживаете журналы здесь.
Папка system_logs
Эта папка содержит журналы, созданные Машинное обучение Azure, и по умолчанию она закрыта. Журналы, созданные системой, сгруппированы в разные папки в зависимости от стадии задания во время выполнения.
Другие папки
Для обучения заданий в кластерах с несколькими вычислительными ресурсами журналы представлены для каждого IP-узла. Структура для каждого узла такая же, как и в случае заданий с одним узлом. Предусмотрена еще одна дополнительная папка для журналов регистрации выполнения в целом, а также журналов stderr и stdout.
Во время машинного обучения Azure регистрируются данные из различных источников, например AutoML ML или контейнера Docker, выполняющего задание обучения. Многие такие журналы не документированы. Если возникают проблемы и обратитесь в службу поддержки Майкрософт, они могут использовать эти журналы во время устранения неполадок.