为 Azure 机器学习配置 MLflow

本文介绍如何配置 MLflow 以连接到 Azure 机器学习工作区进行跟踪、注册和部署。

Azure 机器学习工作区与 MLflow 兼容,这意味着它们无需任何额外配置即可充当 MLflow 服务器。 每个工作区都有一个 MLflow 跟踪 URI,MLflow 可使用该 URI 连接到工作区。 Azure 机器学习工作区已配置为使用 MLflow,因此无需额外的配置。

但是,如果在 Azure 机器学习外部工作(如本地计算机、Azure Synapse Analytics 或 Azure Databricks),则需要将 MLflow 配置为指向该工作区。

重要

在 Azure 计算(Azure 机器学习笔记本、托管在 Azure 机器学习计算实例上的 Jupyter 笔记本或在 Azure 机器学习计算群集上运行的作业)上运行时,无需配置跟踪 URI。 它将自动进行配置

先决条件

若要按照本教程操作,需要具备以下先决条件:

  • 安装 Mlflow SDK 包 mlflow 和适用于 MLflow 的 Azure 机器学习插件 azureml-mlflow

    pip install mlflow azureml-mlflow
    

    提示

    可以使用 mlflow-skinny 包,它是一个不带 SQL 存储、服务器、UI 或数据科学依赖项的轻型 MLflow 包。 对于主要需要 MLflow 的跟踪和记录功能但不需要导入整个功能套件(包括部署)的用户,建议使用 mlflow-skinny

  • 一个 Azure 机器学习工作区。 若要创建工作区,请参阅创建机器学习资源教程。 查看在工作区中执行 MLflow 操作所需的访问权限

  • 如果要执行远程跟踪(即跟踪在 Azure 机器学习外部运行的试验),请将 MLflow 配置为指向 Azure 机器学习工作区的跟踪 URI。 有关如何将 MLflow 连接到工作区的详细信息,请参阅为 Azure 机器学习配置 MLflow

配置 MLflow 跟踪 URI

若要将 MLflow 连接到 Azure 机器学习工作区,需要工作区的跟踪 URI。 每个工作区都有自己的跟踪 URI,并且具有协议 azureml://

  1. 获取工作区的跟踪 URI:

    适用于:Azure CLI ml 扩展 v2(当前)

    1. 登录并配置工作区:

      az account set --subscription <subscription>
      az configure --defaults workspace=<workspace> group=<resource-group> location=<location> 
      
    2. 可以使用 az ml workspace 命令获取跟踪 URI:

      az ml workspace show --query mlflow_tracking_uri
      
  2. 配置跟踪 URI:

    然后,set_tracking_uri() 方法将 MLflow 跟踪 URI 指向该 URI。

    import mlflow
    
    mlflow.set_tracking_uri(mlflow_tracking_uri)
    

    提示

    使用共享环境(如 Azure Databricks 群集、Azure Synapse Analytics 群集或类似环境)时,可以在群集级别设置环境变量 MLFLOW_TRACKING_URI 以自动配置 MLflow 跟踪 URI,以指向群集中运行的基于所有会话的 Azure 机器学习,而不是指向群集中运行的基于每会话的 Azure 机器学习。

配置身份验证

设置跟踪后,还需要配置关联工作区的身份验证方式。 默认情况下,适用于 MLflow 的 Azure 机器学习插件将通过打开默认浏览器提示输入凭据来执行交互式身份验证。

适用于 MLflow 的 Azure 机器学习插件通过包 azure-identity 支持多种身份验证机制,该包作为插件 azureml-mlflow 的依赖项安装。 将逐一尝试以下身份验证方法,直到其中一种方法成功:

  1. 环境:通过环境变量读取指定的帐户信息,并使用该信息进行身份验证
  2. 托管标识:如果将应用程序部署到了已启用托管标识的 Azure 主机,则它会使用该标识进行身份验证。
  3. Azure CLI:如果用户通过 Azure CLI az login 命令登录,它会以该用户的身份进行身份验证
  4. Azure PowerShell:如果用户通过 Azure PowerShell 的 Connect-AzAccount -Environment AzureChinaCloud 命令登录,它会以该用户的身份进行身份验证
  5. 交互式浏览器:通过默认浏览器以交互方式对用户进行身份验证

如果交互式作业有用户连接到会话,你可以依赖交互式身份验证,因此无需进一步操作。

警告

在系统提示输入凭据时,交互式浏览器身份验证将阻止代码执行。 此方法不适用于无人参与的环境(如训练作业)中的身份验证。 建议配置不同的身份验证模式。

对于需要无人参与执行的方案,则必须配置服务主体,以便与 Azure 机器学习通信。

import os

os.environ["AZURE_TENANT_ID"] = "<AZURE_TENANT_ID>"
os.environ["AZURE_CLIENT_ID"] = "<AZURE_CLIENT_ID>"
os.environ["AZURE_CLIENT_SECRET"] = "<AZURE_CLIENT_SECRET>"

提示

使用共享环境时,建议在计算中配置这些环境变量。 最佳做法是在 Azure 密钥保管库实例中将这些环境变量作为机密进行管理。

例如,在 Azure Databricks 中,可以在群集配置的环境变量中使用机密,如下所示:AZURE_CLIENT_SECRET={{secrets/<scope-name>/<secret-name>}}。 有关在 Azure Databricks 中实现此方法的详细信息,请参阅引用环境变量中的机密或参考适用于你平台的文档。

如果希望使用证书而不是机密,可将环境变量 AZURE_CLIENT_CERTIFICATE_PATH 配置为指向 PEMPKCS12 证书文件(包括私钥)的路径,并将 AZURE_CLIENT_CERTIFICATE_PASSWORD 配置为证书文件的密码(如果有)。

配置授权和权限级别

某些默认角色(如 AzureML 数据科学家或参与者)已配置为在 Azure 机器学习工作区中执行 MLflow 操作。 如果使用自定义角色,则需要以下权限:

  • 若要使用 MLflow 跟踪:

    • Microsoft.MachineLearningServices/workspaces/experiments/*
    • Microsoft.MachineLearningServices/workspaces/jobs/*
  • 若要使用 MLflow 模型注册表:

    • Microsoft.MachineLearningServices/workspaces/models/*/*

要了解如何为创建的服务主体或用户帐户授予对工作区的访问权限,请参阅授予访问权限

排查身份验证问题

MLflow 在执行与服务进行交互的第一个操作(如 mlflow.set_experiment()mlflow.start_run())时,尝试向 Azure 机器学习进行身份验证。 如果在此过程中发现问题或意外的身份验证提示,则可以提高日志记录级别以获取有关该错误的更多详细信息:

import logging

logging.getLogger("azure").setLevel(logging.DEBUG)

设置试验名称(可选)

所有 MLflow 运行都会记录到活动试验中。 默认情况下,运行将记录到系统自动创建的名为 Default 的试验中。 可以配置进行跟踪的试验。

提示

使用 Azure 机器学习 CLI v2 提交作业时,可以使用作业 YAML 定义中的属性 experiment_name 设置试验名称。 不必在训练脚本上进行配置。 有关详细信息,请参阅 YAML:显示名称、试验名称、说明和标记

使用 MLflow 命令 mlflow.set_experiment() 配置试验。

experiment_name = 'experiment_with_mlflow'
mlflow.set_experiment(experiment_name)

后续步骤

现在环境已连接到 Azure 机器学习中的工作区,可以开始使用它了。