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

为 Azure 机器学习配置 MLflow

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

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

但是,如果你在 Azure 机器学习外部操作,则需将 MLflow 配置为指向工作区。 受影响的环境包括本地计算机、Azure Synapse Analytics 和 Azure Databricks。

重要

使用 Azure 计算基础结构时,不必配置跟踪 URI。 它将自动进行配置。 具有自动配置的环境包括 Azure 机器学习笔记本、托管在 Azure 机器学习计算实例上的 Jupyter 笔记本,以及在 Azure 机器学习计算群集上运行的作业。

先决条件

  • MLflow SDK mlflow 包和适用于 MLflow 的 Azure 机器学习 azureml-mlflow 插件。 可以使用以下命令安装该软件:

    pip install mlflow azureml-mlflow
    

    提示

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

  • 一个 Azure 机器学习工作区。 若要创建工作区,请参阅创建入门所需的资源

  • 在工作区中执行 MLflow 操作的访问权限。 有关操作和所需权限的列表,请参阅 MLflow 操作

配置 MLflow 跟踪 URI

若要执行远程跟踪,或者跟踪在 Azure 机器学习外部运行的试验,请将 MLflow 配置为指向 Azure 机器学习工作区的跟踪 URI。

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

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

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

    1. 登录并配置工作区:

      az account set --subscription <subscription-ID>
      az configure --defaults workspace=<workspace-name> group=<resource-group-name> 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 机器学习。

配置身份验证

设置跟踪后,还需要为关联的工作区配置身份验证方法。

默认情况下,适用于 MLflow 的 Azure 机器学习插件将通过打开默认浏览器提示输入凭据来执行交互式身份验证。 但是,该插件还支持其他几种身份验证机制。 azure-identity 包提供此支持。 此包作为 azureml-mlflow 插件的依赖项进行安装。

身份验证过程会依次尝试以下方法,直到其中一种方法成功为止:

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

对于有用户连接到会话的交互式作业,你可以依赖交互式身份验证。 无需进一步执行操作。

警告

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

对于需要无人参与执行的方案,你需要配置服务主体,以便与 Azure 机器学习通信。 若要了解如何创建服务主体,请参阅配置服务主体

请在以下代码中使用服务主体的租户 ID、客户端 ID 和客户端密码:

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 设置为某个文件的路径,该文件包含的证书和私钥对采用隐私增强邮件 (PEM) 或公钥加密标准 12 (PKCS #12) 格式。
  • 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 云的支持

MLflow 的 Azure 机器学习插件默认配置为与全局 Azure 云配合使用。 但是,可以通过设置 AZUREML_CURRENT_CLOUD 环境变量来配置正在使用的 Azure 云:

import os

os.environ["AZUREML_CURRENT_CLOUD"] = "AzureChinaCloud"

可以使用以下 Azure CLI 命令来标识正在使用的云:

az cloud list

当前云的值 IsActive 设置为 True

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