使用 MLflow 记录指标、参数和文件

适用于:Python SDK azure-ai-ml v2(当前版本)

Azure 机器学习支持使用 MLflow 跟踪进行试验记录和跟踪。 你可以使用 MLflow 在计算机本地或云环境中记录模型、指标、参数和项目。

重要

不同于 Azure 机器学习 SDK v1,Azure 机器学习 SDK for Python (v2) 中没有记录功能。 如果之前使用了 Azure 机器学习 SDK v1,建议利用 MLflow 来跟踪试验。 有关特定指南,请参阅将记录从 SDK v1 迁移到 MLflow

日志可帮助你诊断错误和警告,或跟踪参数和模型性能等性能指标。 本文介绍如何在以下场景中启用日志记录功能:

  • 提交作业时记录指标、参数和模型。
  • 以交互方式训练时跟踪运行。
  • 查看有关训练的诊断信息。

提示

本文说明如何监视模型训练过程。 如果你希望监视 Azure 机器学习的资源使用情况和事件,例如配额、已完成的训练作业或已完成的模型部署,请参阅监视 Azure 机器学习

先决条件

  • 必须有一个 Azure 机器学习工作区。 如果还未拥有工作区,请参阅创建工作区资源

  • 必须安装 mlflowazureml-mlflow 包。 如果还未安装,请使用以下命令将其安装到开发环境中:

    pip install mlflow azureml-mlflow
    
  • 如果要进行远程跟踪(跟踪在 Azure 机器学习之外运行的试验),请配置 MLflow 以跟踪试验。 有关详细信息,请参阅为 Azure 机器学习配置 MLflow

  • 若要使用 MLflow 在 Azure 机器学习试验中记录指标、参数、项目和模型,只需在脚本中导入 MLflow:

    import mlflow
    

配置试验

MLflow 在试验和运行中组织信息(在 Azure 机器学习中,运行称为作业)。 它们的配置方式存在一些差异,具体取决于你如何运行代码:

以交互方式训练时(例如在 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 机器学习用户界面中转换为运行的名称,并帮助你更快地识别运行:

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

有关 MLflow 日志记录 API 的详细信息,请参阅 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 = True,1 = False

重要

性能注意事项:如果需要记录多个指标(或同一指标的多个值),请避免在循环中调用 mlflow.log_metric。 通过记录一批指标可以实现更好的性能。 使用方法 mlflow.log_metrics,它接受一个带有你希望一次记录的所有指标的字典;或使用 MLflowClient.log_batch,它接受多种类型的元素以进行记录。 有关示例,请参阅记录曲线或值列表

记录曲线或值列表

通过多次记录相同的指标,可以使用 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.ndarrayPIL.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_artifactlog_model 来记录大型文件时,可能会在完成文件上传之前遇到超时错误。 考虑通过调整环境变量 AZUREML_ARTIFACTS_DEFAULT_TIMEOUT 来增加超时值。 它的默认值为 300(秒)。

记录模型

MLflow 引入了“模型”概念,作为打包给定模型正常运行所需的所有项目的方法。 MLflow 中的模型始终是包含任意数量的文件的文件夹,具体取决于用于生成模型的框架。 记录模型具有将模型的所有元素作为一个实体进行跟踪的优势,该实体可以注册,然后部署。 此外,MLflow 模型享有无代码部署的优势,并且可以在工作室中与负责任 AI 仪表板一起使用。 有关详细信息,请参阅 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.entities.Run 对象使用 MLflow 查看记录的信息:

import mlflow

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

可以在运行对象的数据字段中查看该运行的指标、参数和标记。

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

注意

mlflow.get_runmlflow.search_runs 返回的指标字典只返回某个给定指标名称的最近记录的值。 例如,如果依次使用值 1、2、3、4 来记录名为 iteration 的指标,则在调用 run.data.metrics['iteration'] 时只返回 4

若要获取为特定指标名称记录的所有指标,可以使用 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 机器学习工作室中浏览已完成的作业记录,包括记录的指标。

导航到“作业”选项卡。若要查看工作区中各个试验的所有作业,请选择“所有作业”选项卡。可应用顶部菜单栏中的“试验”筛选器来深入了解特定试验的作业。 选择感兴趣的作业以进入详细信息视图,然后选择“指标”选项卡。

选择记录的指标以在右侧呈现图表。 可以通过应用平滑处理、更改颜色或在单个图形上绘制多个指标来自定义图表。 还可以根据需要调整布局的大小和重新排列布局。 创建所需视图后,可以将其保存以备将来使用,并使用直接链接与队友共享。

Screenshot of the metrics view.

查看和下载诊断日志

日志文件是用于调试 Azure 机器学习工作负载的重要资源。 提交训练作业后,向下钻取到特定运行以查看其日志和输出:

  1. 导航到“作业”选项卡。
  2. 选择特定运行的 runID。
  3. 选择页面顶部的“输出和日志”。
  4. 选择“全部下载”,将所有日志下载到 zip 文件夹中。
  5. 还可以通过选择日志文件并选择“下载”来下载单个日志文件

Screenshot of Output and logs section of a run.

user_logs 文件夹

此文件夹包含有关用户生成的日志的信息。 此文件夹默认打开,并选择 std_log.txt 日志。 std_log.txt 是代码日志(例如,打印语句)出现的位置。 此文件包含来自控制脚本和训练脚本的 stdout 日志和 stderr 日志,每个进程一个日志。 大多数情况下,请监视此处的日志。

system_logs 文件夹

此文件夹包含 Azure 机器学习生成的日志,默认情况下会关闭。 系统生成的日志会根据运行时作业的阶段分组到不同的文件夹中。

其他文件夹

对于多个计算群集上的作业训练,将会针对每个 IP 节点提供日志。 每个节点的结构都与单节点作业相同。 对于总体执行、stderr 和 stdout 日志,还有一个额外的日志文件夹。

Azure 机器学习会在训练期间记录来自各种源的信息,例如运行训练作业的 AutoML 或 Docker 容器。 其中的许多日志没有详细的阐述。 如果遇到问题且联系了 Azure 支持部门,他们可能会在排除故障时使用这些日志。

后续步骤