记录并查看指标和日志数据

使用默认的 Python 日志记录包和 Azure 机器学习 Python SDK 特有的功能来记录实时信息。 你可以在本地进行记录,并将日志发送到门户中的工作区。

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

  • 记录运行指标
  • 交互式训练会话
  • 使用 ScriptRunConfig 提交训练作业
  • Python 的原生 logging 设置
  • 来自其他源的日志记录

提示

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

数据类型

可以记录多个数据类型,包括标量值、列表、表、图像、目录等。 有关不同数据类型的详细信息和 Python 代码示例,请查看 Run 类参考页

运行指标日志记录

使用日志记录 API 中的以下方法可影响指标可视化效果。 请注意这些记录的指标的服务限制

记录的值 示例代码 门户中的格式
记录一组数值 run.log_list(name='Fibonacci', value=[0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89]) 单变量折线图
使用重复使用的相同指标名称记录单个数值(例如在 for 循环中) for i in tqdm(range(-10, 10)): run.log(name='Sigmoid', value=1 / (1 + np.exp(-i))) angle = i / 2.0 单变量折线图
重复记录包含 2 个数字列的行 run.log_row(name='Cosine Wave', angle=angle, cos=np.cos(angle)) sines['angle'].append(angle) sines['sine'].append(np.sin(angle)) 双变量折线图
记录包含 2 个数字列的表 run.log_table(name='Sine Wave', value=sines) 双变量折线图
日志图像 run.log_image(name='food', path='./breadpudding.jpg', plot=None, description='desert') 使用此方法在运行中记录图像文件或 matplotlib 图。 运行记录中可显示和比较这些图像

用 MLflow 进行日志记录

建议使用 MLflow 来记录模型、指标和项目,因为它是开源的,并且支持从本地移植到云。 下表和代码示例演示了如何使用 MLflow 来记录训练运行中的指标和项目。 详细了解 MLflow 的日志记录方法和设计模式

请确保将 mlflowazureml-mlflow pip 包安装到工作区。

pip install mlflow
pip install azureml-mlflow

将 MLflow 跟踪 URI 设置为指向 Azure 机器学习后端,以确保将指标和项目记录到工作区。

from azureml.core import Workspace
import mlflow
from mlflow.tracking import MlflowClient

ws = Workspace.from_config()
mlflow.set_tracking_uri(ws.get_mlflow_tracking_uri())

mlflow.create_experiment("mlflow-experiment")
mlflow.set_experiment("mlflow-experiment")
mlflow_run = mlflow.start_run()
记录的值 示例代码 说明
记录数值(int 或 float) mlfow.log_metric('my_metric', 1)
记录布尔值 mlfow.log_metric('my_metric', 0) 0 = True,1 = False
记录字符串 mlfow.log_text('foo', 'my_string') 记录为项目
记录 numpy 指标或 PIL 图像对象 mlflow.log_image(img, 'figure.png')
记录 matplotlib 绘图或图像文件 mlflow.log_figure(fig, "figure.png")

通过 SDK 查看运行指标

可以使用 run.get_metrics() 查看训练的模型的指标。

from azureml.core import Run
run = Run.get_context()
run.log('metric-name', metric_value)

metrics = run.get_metrics()
# metrics is of type Dict[str, List[float]] mapping metric names
# to a list of the values for that metric in the given run.

metrics.get('metric-name')
# list of metrics in the order they were recorded

还可以通过运行对象的数据和信息属性,使用 MLflow 来访问运行信息。 有关详细信息,请参阅 MLflow.entities.Run 对象文档。

在该运行完成后,可以使用 MlFlowClient () 来检索它。

from mlflow.tracking import MlflowClient

# Use MlFlow to retrieve the run that was just completed
client = MlflowClient()
finished_mlflow_run = MlflowClient().get_run(mlflow_run.info.run_id)

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

metrics = finished_mlflow_run.data.metrics
tags = finished_mlflow_run.data.tags
params = finished_mlflow_run.data.params

备注

mlflow.entities.Run.data.metrics 下的指标字典只返回某个给定指标名称的最近记录的值。 例如,如果按顺序依次将 1、2、3、4 记录到名为 sample_metric 的指标,则在 sample_metric 的指标字典中只会存在 4。

若要获取为某个特定指标名称记录的所有指标,可以使用 MlFlowClient.get_metric_history()

在工作室 UI 中查看运行指标

可以在 Azure 机器学习工作室中浏览已完成的运行记录,包括记录的指标。

导航到“试验”选项卡。若要查看工作区中各个试验的所有运行,请选择“所有运行”选项卡。可应用顶部菜单栏中的“试验”筛选器来深入了解特定试验的运行。

对于各个试验视图,请选择“所有试验”选项卡。在“试验运行”仪表板中,可以看到为每次运行跟踪的指标和日志。

还可以编辑“运行列表”表,以选择多个运行并显示运行的最新记录值、最小记录值或最大记录值。 自定义自己的图表,以比较多个运行上的已记录指标值和聚合。 你可以在图表的 y 轴上绘制多个指标,并自定义 x 轴以绘制记录的指标。

查看并下载运行用的日志文件

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

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

运行用“输出和日志”部分的屏幕截图。

下面的各表显示了此部分显示的文件夹中的日志文件的内容。

备注

每次运行不一定会看到每个文件。 例如,仅当生成新映像时(例如更改环境时),才会出现 20_image_build_log*.txt。

azureml-logs 文件夹

文件 说明
20_image_build_log.txt 训练环境的 Docker 映像生成日志(可选),每次运行都有一个这样的文件。 仅当更新环境时适用。 其他情况下,AML 会重用缓存的映像。 如果成功,则包含相应映像的映像注册表详细信息。
55_azureml-execution-<node_id>.txt 主机工具的 stdout/stderr 日志,每个节点一个。 将映像拉取到计算目标。 请注意,只有在保护计算资源后,此日志才会出现。
65_job_prep-<node_id>.txt 作业准备脚本的 stdout/stderr 日志,每个节点一个。 将代码下载到计算目标和数据存储(如果已请求)。
70_driver_log(_x).txt AML 控制脚本和客户训练脚本的 stdout/stderr 日志,每个进程一个。 来自脚本的标准输出。此文件为代码日志(如 print 语句)的显示位置。 大多数情况下,你都将在此处监视日志。
70_mpi_log.txt MPI 框架日志(可选),每个运行一个。 仅适用于 MPI 运行。
75_job_post-<node_id>.txt 作业释放脚本的 stdout/stderr 日志,每个节点一个。 发送日志,将计算资源释放回 Azure。
process_info.json 显示哪个进程在哪个节点上运行。
process_status.json 显示进程状态,如进程未启动、正在运行还是已完成。

logs > azureml 文件夹

文件 说明
110_azureml.log
job_prep_azureml.log 有关作业准备情况的系统日志
job_release_azureml.log 有关作业释放的系统日志

logs > azureml > sidecar > node_id 文件夹

当启用了挎斗时,作业准备和作业释放脚本会在挎斗容器中运行。 每个节点都有一个文件夹。

文件 说明
start_cms.txt 挎斗容器启动时启动的进程的日志
prep_cmd.txt 运行 job_prep.py 时进入的 ContextManagers 的日志(其中一些内容会流式传输到 azureml-logs/65-job_prep
release_cmd.txt 运行 job_release.py 时退出的 ComtextManagers 的日志

其他文件夹

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

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

交互式日志记录会话

交互式日志记录会话通常用在笔记本环境中。 方法 Experiment.start_logging() 启动交互式日志记录会话。 试验中会话期间记录的任何指标都会添加到运行记录中。 方法 run.complete() 结束会话并将运行标记为已完成。

ScriptRun 日志

本部分介绍使用了 ScriptRunConfig 进行配置时,如何在创建的各次运行之内添加记录代码。 可以使用 ScriptRunConfig 类来封装用于可重复运行的脚本和环境。 还可以使用此选项来显示一个用于监视的 Jupyter Notebooks 视觉小组件。

此示例使用 run.log() 方法对 alpha 值执行参数扫描并捕获结果。

  1. 创建包含日志记录逻辑的训练脚本 train.py

    # Copyright (c) Microsoft. All rights reserved.
    # Licensed under the MIT license.
    
    from sklearn.datasets import load_diabetes
    from sklearn.linear_model import Ridge
    from sklearn.metrics import mean_squared_error
    from sklearn.model_selection import train_test_split
    from azureml.core.run import Run
    import os
    import numpy as np
    import mylib
    # sklearn.externals.joblib is removed in 0.23
    try:
       from sklearn.externals import joblib
    except ImportError:
       import joblib
    
    os.makedirs('./outputs', exist_ok=True)
    
    X, y = load_diabetes(return_X_y=True)
    
    run = Run.get_context()
    
    X_train, X_test, y_train, y_test = train_test_split(X, y,
                                                       test_size=0.2,
                                                       random_state=0)
    data = {"train": {"X": X_train, "y": y_train},
          "test": {"X": X_test, "y": y_test}}
    
    # list of numbers from 0.0 to 1.0 with a 0.05 interval
    alphas = mylib.get_alphas()
    
    for alpha in alphas:
       # Use Ridge algorithm to create a regression model
       reg = Ridge(alpha=alpha)
       reg.fit(data["train"]["X"], data["train"]["y"])
    
       preds = reg.predict(data["test"]["X"])
       mse = mean_squared_error(preds, data["test"]["y"])
       run.log('alpha', alpha)
       run.log('mse', mse)
    
       model_file_name = 'ridge_{0:.2f}.pkl'.format(alpha)
       # save model in the outputs folder so it automatically get uploaded
       with open(model_file_name, "wb") as file:
          joblib.dump(value=reg, filename=os.path.join('./outputs/',
                                                       model_file_name))
    
       print('alpha is {0:.2f}, and mse is {1:0.2f}'.format(alpha, mse))
    
  2. 提交要在用户管理的环境中运行的 train.py 脚本。 整个脚本文件夹都要提交,以便进行训练。

    from azureml.core import ScriptRunConfig
    
    src = ScriptRunConfig(source_directory='./', script='train.py', environment=user_managed_env)
    
    run = exp.submit(src)
    

    show_output 参数会启用详细日志记录,让你可以查看训练过程的详细信息,以及有关任何远程资源或计算目标的信息。 请使用以下代码在提交试验时启用详细日志记录。

run = exp.submit(src, show_output=True)

还可以在生成的运行上的 wait_for_completion 函数中使用相同的参数。

run.wait_for_completion(show_output=True)

原生 Python 日志记录

SDK 中的某些日志可能包含一个错误,指示你将日志记录级别设置为“调试”。 若要设置日志记录级别,请在脚本中添加以下代码。

import logging
logging.basicConfig(level=logging.DEBUG)

其他日志记录源

Azure 机器学习还可以在训练期间记录其他来源的信息,例如自动化机器学习运行或运行作业的 Docker 容器。 这些日志未进行记录,但如果你遇到问题并联系了 Microsoft 支持部门,他们可以在排除故障时使用这些日志。

有关在 Azure 机器学习设计器中记录指标的信息,请参阅如何在设计器中记录指标

示例笔记本

下面的笔记本展示了本文中的概念:

阅读使用 Jupyter 笔记本探索此服务一文,了解如何运行笔记本。

后续步骤

请参阅以下文章,详细了解如何使用 Azure 机器学习: