使用 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 机器学习工作区。 如果还未拥有工作区,请参阅创建工作区资源。
必须安装
mlflow
和azureml-mlflow
包。 如果还未安装,请使用以下命令将其安装到开发环境中:pip install mlflow azureml-mlflow
注意
要异步记录指标,需要
MLflow
版本 2.8.0+ 和azureml-mlflow
版本 1.55+。如果要进行远程跟踪(跟踪在 Azure 机器学习之外运行的试验),请配置 MLflow 以跟踪试验。 有关详细信息,请参阅为 Azure 机器学习配置 MLflow。
若要使用 MLflow 在 Azure 机器学习试验中记录指标、参数、项目和模型,只需在脚本中导入 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)
有关 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_metric("metric1", 9.42, synchronous=False)
配合使用或记录一批指标以实现更好的性能。
异步记录指标
MLflow 还允许以异步方式记录指标。 异步指标记录在以下情况下特别有用:具有数十个计算节点的大型训练作业可能正在运行并尝试同时记录指标。 当少量节点尝试记录大量指标时,它也很有用。
通过使用异步指标记录,你可以立即记录指标,无需等待系统在后端服务中具现化这些指标。 这种方法可扩展到记录数十万个指标值的大型训练程序,推荐使用。
默认情况下,MLflow 会同步记录指标,但可以随时更改此行为:
import mlflow
mlflow.config.enable_async_logging()
可以使用环境变量设置相同的属性:
export MLFLOW_ENABLE_ASYNC_LOGGING=True
要异步记录特定指标,请像平常一样使用 MLflow 日志记录 API,但添加额外的参数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 是在运行中生成的项目的名称。 它不一定是现有文件。 |
记录 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 引入了“模型”概念,作为打包给定模型正常运行所需的所有项目的方法。 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_run
或 mlflow.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 机器学习工作室中浏览已完成的作业记录,包括记录的指标。
导航到“作业”选项卡。若要查看工作区中各个试验的所有作业,请选择“所有作业”选项卡。可应用顶部菜单栏中的“试验”筛选器来深入了解特定试验的作业。 选择感兴趣的作业以进入详细信息视图,然后选择“指标”选项卡。
选择记录的指标以在右侧呈现图表。 可以通过应用平滑处理、更改颜色或在单个图形上绘制多个指标来自定义图表。 还可以根据需要调整布局的大小和重新排列布局。 创建所需视图后,可以将其保存以备将来使用,并使用直接链接与队友共享。
查看和下载诊断日志
日志文件是用于调试 Azure 机器学习工作负载的重要资源。 提交训练作业后,向下钻取到特定运行以查看其日志和输出:
- 导航到“作业”选项卡。
- 选择特定运行的 runID。
- 选择页面顶部的“输出和日志”。
- 选择“全部下载”,将所有日志下载到 zip 文件夹中。
- 还可以通过选择日志文件并选择“下载”来下载单个日志文件
user_logs 文件夹
此文件夹包含有关用户生成的日志的信息。 此文件夹默认打开,并选择 std_log.txt 日志。 std_log.txt 是代码日志(例如,打印语句)出现的位置。 此文件包含来自控制脚本和训练脚本的 stdout
日志和 stderr
日志,每个进程一个日志。 大多数情况下,请监视此处的日志。
system_logs 文件夹
此文件夹包含 Azure 机器学习生成的日志,默认情况下会关闭。 系统生成的日志会根据运行时作业的阶段分组到不同的文件夹中。
其他文件夹
对于多个计算群集上的作业训练,将会针对每个 IP 节点提供日志。 每个节点的结构都与单节点作业相同。 对于总体执行、stderr 和 stdout 日志,还有一个额外的日志文件夹。
Azure 机器学习会在训练期间记录来自各种源的信息,例如运行训练作业的 AutoML 或 Docker 容器。 其中的许多日志没有详细的阐述。 如果遇到问题且联系了 Azure 支持部门,他们可能会在排除故障时使用这些日志。