你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

启动、监视和跟踪运行历史记录

适用于:适用于 Python 的 Azure 机器学习 SDK v1

适用于:Azure CLI ml 扩展 v1

重要说明

本文提供有关使用 Azure 机器学习 SDK v1 的信息。 SDK v1 自 2025 年 3 月 31 日起弃用。 对它的支持将于 2026 年 6 月 30 日结束。 可以在该日期之前安装和使用 SDK v1。 使用 SDK v1 的现有工作流将在支持结束日期后继续运行。 但是,当产品发生体系结构更改时,它们可能会面临安全风险或中断性变更。

建议在 2026 年 6 月 30 日之前过渡到 SDK v2。 有关 SDK v2 的详细信息,请参阅 什么是 Azure 机器学习 CLI 和 Python SDK v2? 以及 SDK v2 参考

适用于 Python v1 的 Azure 机器学习 SDK机器学习 CLI 提供多种方法用于监视、组织和跟踪训练运行与试验运行。 ML 运行历史记录是可解释和可重复的 ML 开发过程的重要部分。

提示

有关使用工作室的信息,请参阅使用工作室跟踪、监视和分析运行

如果使用 Azure 机器学习 SDK v2,请参阅以下文章:

本文演示如何完成以下任务:

  • 监视运行性能。
  • 标记和查找运行。
  • 对运行历史记录运行搜索。
  • 取消运行或使其失败。
  • 创建子运行。
  • 通过电子邮件通知监视运行状态。

提示

如果要了解如何监视 Azure 机器学习服务与关联的 Azure 服务,请参阅如何监视 Azure 机器学习。 如果要查找有关监视部署为 Web 服务的模型的信息,请参阅收集模型数据使用 Application Insights 进行监视

Prerequisites

需要准备好以下各项:

  • Azure 订阅。 如果没有 Azure 订阅,请在开始操作前先创建一个免费帐户。 立即试用免费版或付费版 Azure 机器学习

  • Azure 机器学习工作区

  • 适用于 Python 的 Azure 机器学习 SDK(1.0.21 或更高版本)。 若要安装或更新到最新版本的 SDK,请参阅安装或更新 SDK

    若要查看 Azure 机器学习 SDK 的版本,请使用以下代码:

    print(azureml.core.VERSION)
    
  • Azure CLIAzure 机器学习的 CLI 扩展

    重要说明

    本文中的一些 Azure CLI 命令使用适用于 Azure 机器学习的 azure-cli-ml 或 v1 扩展。 对 CLI v1 的支持于 2025 年 9 月 30 日结束。 Microsoft将不再为此服务提供技术支持或更新。 使用 CLI v1 的现有工作流将继续在支持终止日期后运行。 但是,当产品发生体系结构更改时,它们可能会面临安全风险或中断性变更。

    建议尽快过渡到 mlv2 扩展。 有关 v2 扩展的详细信息,请参阅 Azure 机器学习 CLI 扩展和 Python SDK v2

监视运行性能

  • 启动运行及其日志记录过程

    适用于:适用于 Python 的 Azure 机器学习 SDK v1

    1. 通过从 azureml.core 包导入 WorkspaceExperimentRunScriptRunConfig 类来设置试验。

      import azureml.core
      from azureml.core import Workspace, Experiment, Run
      from azureml.core import ScriptRunConfig
      
      ws = Workspace.from_config()
      exp = Experiment(workspace=ws, name="explore-runs")
      
    2. 使用 start_logging() 方法启动运行及其日志记录过程。

      notebook_run = exp.start_logging()
      notebook_run.log(name="message", value="Hello from run!")
      
  • 监视运行的状态

    适用于:适用于 Python 的 Azure 机器学习 SDK v1

    • 使用 get_status() 方法获取运行的状态。

      print(notebook_run.get_status())
      
    • 若要获取运行 ID、执行时间和有关运行的其他详细信息,请使用 get_details() 方法。

      print(notebook_run.get_details())
      
    • 成功完成运行后,使用 complete() 方法将其标记为已完成。

      notebook_run.complete()
      print(notebook_run.get_status())
      
    • 如果使用 Python 的 with...as 设计模式,则当运行超出范围时,该运行会自动将自身标记为已完成。 无需手动将运行标记为已完成。

      with exp.start_logging() as notebook_run:
          notebook_run.log(name="message", value="Hello from run!")
          print(notebook_run.get_status())
      
      print(notebook_run.get_status())
      

标记和查找运行

在 Azure 机器学习中,可以使用属性与标记来帮助组织你的运行,以及查询你的运行来获取重要信息。

  • 添加属性和标记

    适用于:适用于 Python 的 Azure 机器学习 SDK v1

    若要将可搜索的元数据添加到运行,请使用 add_properties() 方法。 例如,以下代码将 "author" 属性添加到运行:

    local_run.add_properties({"author":"azureml-user"})
    print(local_run.get_properties())
    

    属性是不可变的,因此它们会创建一条永久记录,用于审核目的。 以下代码示例会导致错误,因为我们已在前面的代码中添加了 "azureml-user" 作为 "author" 属性值:

    try:
        local_run.add_properties({"author":"different-user"})
    except Exception as e:
        print(e)
    

    与属性不同,标记是可变的。 若要为试验的使用者添加可搜索且有意义的信息,请使用 tag() 方法。

    local_run.tag("quality", "great run")
    print(local_run.get_tags())
    
    local_run.tag("quality", "fantastic run")
    print(local_run.get_tags())
    

    还可以添加简单的字符串标记。 当这些标记作为键出现在标记字典中时,它们的值为 None

    local_run.tag("worth another look")
    print(local_run.get_tags())
    
  • 查询属性和标记

    可以查询试验中的运行,以返回与特定属性和标记匹配的运行的列表。

    适用于:适用于 Python 的 Azure 机器学习 SDK v1

    list(exp.get_runs(properties={"author":"azureml-user"},tags={"quality":"fantastic run"}))
    list(exp.get_runs(properties={"author":"azureml-user"},tags="worth another look"))
    

取消运行或使其失败

如果发现错误,或者完成运行花费的时间太长,可以取消该运行。

适用于:适用于 Python 的 Azure 机器学习 SDK v1

若要使用 SDK 取消运行,请使用 cancel() 方法:

src = ScriptRunConfig(source_directory='.', script='hello_with_delay.py')
local_run = exp.submit(src)
print(local_run.get_status())

local_run.cancel()
print(local_run.get_status())

如果运行已完成但包含错误(例如,使用了错误的训练脚本),则可使用 fail() 方法将其标记为失败。

local_run = exp.submit(src)
local_run.fail()
print(local_run.get_status())

创建子运行

适用于:适用于 Python 的 Azure 机器学习 SDK v1

创建子运行可将相关的运行组合到一起,以实现特定目的(例如,实现不同的超参数优化迭代)。

注意

只能使用 SDK 创建子运行。

此代码示例使用 hello_with_children.py 脚本,通过 child_run() 方法从已提交的运行内部创建包含五个子运行的批:

!more hello_with_children.py
src = ScriptRunConfig(source_directory='.', script='hello_with_children.py')

local_run = exp.submit(src)
local_run.wait_for_completion(show_output=True)
print(local_run.get_status())

with exp.start_logging() as parent_run:
    for c,count in enumerate(range(5)):
        with parent_run.child_run() as child:
            child.log(name="Hello from child run", value=c)

注意

当子运行超出范围时,系统会自动将其标记为已完成。

若要高效地创建许多子运行,请使用 create_children() 方法。 由于每次创建操作都会造成网络调用,因此,创建一批运行比逐个创建运行更为高效。

提交子运行

也可以从父运行提交子运行。 这样就可以创建包含父运行和子运行的层次结构。 你无法创建没有父运行的子运行:即使父运行只启动子运行而不执行任何操作,仍需要创建层次结构。 所有运行的状态都是独立的:即使一个或多个子运行已取消或失败,父运行也可以处于 "Completed" 成功状态。

你可能希望子运行使用与父运行不同的运行配置。 例如,可以对父运行使用功能较弱的基于 CPU 的配置,而对子运行使用基于 GPU 的配置。 另一种常见的需求是向每个子运行传递不同的参数和数据。 若要自定义子运行,请为该子运行创建一个 ScriptRunConfig 对象。

重要说明

若要从远程计算上的父运行提交子运行,必须先登录到父运行代码中的工作区。 默认情况下,远程运行中的运行上下文对象没有用于提交子运行的凭据。 使用服务主体或托管标识凭据进行登录。 有关身份验证的详细信息,请参阅设置身份验证

以下代码:

  • 从工作区 "gpu-cluster" 中检索名为 ws 的计算资源
  • 循环访问要传递给子 ScriptRunConfig 对象的不同参数值
  • 使用自定义计算资源和参数创建并提交新的子运行
  • 阻止至所有子运行完成为止
# parent.py
# This script controls the launching of child scripts
from azureml.core import Run, ScriptRunConfig

compute_target = ws.compute_targets["gpu-cluster"]

run = Run.get_context()

child_args = ['Apple', 'Banana', 'Orange']
for arg in child_args: 
    run.log('Status', f'Launching {arg}')
    child_config = ScriptRunConfig(source_directory=".", script='child.py', arguments=['--fruit', arg], compute_target=compute_target)
    # Starts the run asynchronously
    run.submit_child(child_config)

# Experiment will "complete" successfully at this point. 
# Instead of returning immediately, block until child runs complete

for child in run.get_children():
    child.wait_for_completion()

若要高效创建多个具有相同配置、参数和输入内容的子运行,请使用 create_children() 方法。 由于每次创建操作都会造成网络调用,因此,创建一批运行比逐个创建运行更为高效。

在子运行内部,可以查看父运行 ID:

## In child run script
child_run = Run.get_context()
child_run.parent.id

查询子运行

若要查询特定父运行的子运行,请使用 get_children() 方法。 使用 recursive = True 参数可以查询包含子级和孙级的嵌套树。

print(parent_run.get_children())

记录到父运行或根运行

可以使用 Run.parent 字段访问已启动当前子运行的运行。 使用 Run.parent 的一个常见用例是将日志结果合并到一个位置。 子运行以异步方式执行,而且只能保证父运行等待其子运行完成,无法保证它们顺序一致且保持同步。

# in child (or even grandchild) run

def root_run(self : Run) -> Run :
    if self.parent is None : 
        return self
    return root_run(self.parent)

current_child_run = Run.get_context()
root_run(current_child_run).log("MyMetric", f"Data from child run {current_child_run.id}")

通过电子邮件通知监视运行状态

  1. Azure 门户的左窗格中,选择“ 监视 ”选项卡。

  2. 选择“诊断设置”,然后选择“+ 添加诊断设置

    电子邮件通知的诊断设置的屏幕截图。

  3. 在“诊断设置”的

    1. “类别详细信息”下,选择“AmlRunStatusChangedEvent”
    2. 在“目标详细信息”中,选择“发送到 Log Analytics 工作区”,并指定“订阅”和“Log Analytics 工作区”

    注意

    Azure Log Analytics 工作区是一种不同于 Azure 机器学习服务工作区的 Azure 资源类型。 如果该列表中没有选项,则可以创建 Log Analytics 工作区

    屏幕截图显示如何配置电子邮件通知。

  4. 在“日志”选项卡中,添加“新的警报规则”

    新预警规则的屏幕截图。

  5. 请参阅如何使用 Azure Monitor 创建和管理日志警报

示例笔记本

以下笔记本演示了本文中的概念:

后续步骤