使用 MLflow 和 Azure 机器学习跟踪 Azure Databricks ML 试验

MLflow 是一个开放源代码库,用于管理机器学习试验的生命周期。 可以使用 MLflow 将 Azure Databricks 与 Azure 机器学习集成,以确保充分利用这两种产品。

在本文中,将学习以下内容:

先决条件

示例笔记本

在 Azure Databricks 中训练模型并在 Azure 机器学习上部署这些模型演示如何在 Azure Databricks 中训练模型并在 Azure 机器学习中部署这些模型。 它还包括对你还希望使用 Azure Databricks 中的 MLflow 实例跟踪试验和模型并利用 Azure 机器学习进行部署的情况的处理方式。

安装库

若要在群集上安装库,请导航到“库”选项卡,然后选择“安装新库”

mlflow with azure databricks

在“包”字段中,键入 azureml-mlflow,然后选择“安装”。 根据需要重复此步骤,以将其他包安装到用于试验的群集中。

Azure DB install mlflow library

使用 MLflow 跟踪 Azure Databricks 运行

可以通过两种方式将 Azure Databricks 配置为使用 MLflow 跟踪试验:

默认情况下,在链接 Azure Databricks 工作区时,系统会为你配置双重跟踪。

Azure Databricks 和 Azure 机器学习上的双重跟踪

通过将 ADB 工作区链接到 Azure 机器学习工作区,可以同时在 Azure 机器学习工作区和 Azure Databricks 工作区中跟踪试验数据。 这称为双重跟踪。

警告

目前,由世纪互联运营的 Azure 不支持双重跟踪。 改为使用 Azure 机器学习工作区配置独占跟踪

若要将 ADB 工作区链接到新的或现有的 Azure 机器学习工作区,

  1. 登录到 Azure 门户
  2. 导航到 ADB 工作区的“概述”页。
  3. 选择右下角的“链接 Azure 机器学习工作区”按钮。

Link Azure DB and Azure Machine Learning workspaces

将 Azure Databricks 工作区与 Azure 机器学习工作区链接后,MLflow 跟踪将自动设置为在以下所有位置进行跟踪:

  • 链接的 Azure 机器学习工作区。
  • 原始 ADB 工作区。

然后,可以像之前一样在 Azure Databricks 中使用 MLflow。 以下示例设置试验名称,如通常在 Azure Databricks 中的操作那样,并开始记录一些参数:

import mlflow 

experimentName = "/Users/{user_name}/{experiment_folder}/{experiment_name}" 
mlflow.set_experiment(experimentName) 

with mlflow.start_run():
   mlflow.log_param('epochs', 20)
   pass

注意

与跟踪相反,模型注册表不支持同时在 Azure 机器学习和 Azure Databricks 上注册模型。 必须使用其中一个或另一个。 请阅读使用 MLflow 在注册表中注册模型部分了解更多详细信息。

专门在 Azure 机器学习工作区上进行跟踪

如果你希望在一个集中位置管理跟踪的试验,则可以将 MLflow 跟踪设置为仅在 Azure 机器学习工作区中进行跟踪。 此配置具有使用 Azure 机器学习部署选项启用更轻松的部署路径的优势。

必须将 MLflow 跟踪 URI 配置为唯一指向 Azure 机器学习,如以下示例所示:

配置跟踪 URI

  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 机器学习。

    Configure the environment variables in an Azure Databricks cluster

    配置环境变量后,将在 Azure 机器学习中跟踪此类群集中运行的任何试验。

配置身份验证

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

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

警告

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

如果需要无人参与的执行,必须将服务主体配置为与 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 Key Vault 实例中将其作为机密进行管理。 例如,在 Azure Databricks 中,可以在群集配置的环境变量中使用机密,如下所示:AZURE_CLIENT_SECRET={{secrets/<scope-name>/<secret-name>}}。 请参阅引用环境变量中的机密或参考平台中的类似文档,了解如何在 Azure Databricks 中执行此操作。

Azure 机器学习中的试验名称

将 MLflow 配置为专门跟踪 Azure 机器学习工作区中的试验时,试验的命名约定必须遵循 Azure 机器学习使用的命名约定。 在 Azure Databricks 中,试验以保存试验的路径命名,如 /Users/alice@contoso.com/iris-classifier。 但是,在 Azure 机器学习中,必须直接提供试验名称。 与前面的示例一样,相同的试验将直接命名为 iris-classifier

mlflow.set_experiment(experiment_name="experiment-name")

跟踪参数、指标和项目

然后,可以像之前一样在 Azure Databricks 中使用 MLflow。 有关详细信息,请参阅记录并查看指标和日志文件

使用 MLflow 记录模型

训练模型后,可以使用 mlflow.<model_flavor>.log_model() 方法将其记录到跟踪服务器。 <model_flavor> 是指与模型关联的框架。 了解受支持的模型风格。 在下方示例中,正在注册使用 Spark 库 MLLib 创建的模型:

mlflow.spark.log_model(model, artifact_path = "model")

值得一提的是,风格 spark 并不对应于我们在 Spark 群集中训练模型的事实,而是因为使用了它的训练框架(可以使用带有 Spark 的 TensorFlow 完美训练模型,因此要使用的风格将是 tensorflow)。

模型记录在被跟踪的运行中。 这意味着模型在 Azure Databricks 和 Azure 机器学习(默认)中都可用,或者如果将跟踪 URI 配置为指向它,则仅在 Azure 机器学习中可用。

重要

请注意,此处未指定参数 registered_model_name。 阅读使用 MLflow 在注册表中注册模型部分,了解有关此类参数的含义以及注册表工作原理的更多详细信息。

使用 MLflow 在注册表中注册模型

与跟踪相反,模型注册表不能在 Azure Databricks 和 Azure 机器学习中同时运行。 必须使用其中一个或另一个。 默认情况下,Azure Databricks 工作区用于模型注册表;除非选择将 MLflow 跟踪设置为仅在 Azure 机器学习工作区中跟踪,否则模型注册表就是 Azure 机器学习工作区。

然后,考虑到使用的是默认配置,以下行将在 Azure Databricks 和 Azure 机器学习的相应运行中记录一个模型,但它只会在 Azure Databricks 上注册该模型:

mlflow.spark.log_model(model, artifact_path = "model", 
                       registered_model_name = 'model_name')  
  • 如果还没有模型注册为该名称,该方法将注册一个新模型,创建版本 1,并返回 ModelVersion MLflow 对象。

  • 如果已有模型注册为该名称,该方法将创建一个新的模型版本并返回版本对象。

将 Azure 机器学习注册表与 MLflow 配合使用

如果要使用 Azure 机器学习模型注册表而不是 Azure Databricks,建议将 MLflow 跟踪设置为仅在 Azure 机器学习工作区中跟踪。 这将消除模型注册位置的歧义并降低复杂性。

但是,如果要继续使用双重跟踪功能但要在 Azure 机器学习中注册模型,可以通过配置 MLflow 模型注册表 URI 来指示 MLflow 将 Azure 机器学习用于模型注册表。 此 URI 具有与 MLflow 跟踪 URI 完全相同的格式和值。

mlflow.set_registry_uri(azureml_mlflow_uri)

注意

azureml_mlflow_uri 值的获取方式与将 MLflow 跟踪设置为仅在 Azure 机器学习工作区中进行跟踪中演示的方式相同

有关此方案的完整示例,请查看示例在 Azure Databricks 中训练模型并在 Azure 机器学习上部署这些模型

部署和使用在 Azure 机器学习中注册的模型

使用 MLflow 在 Azure 机器学习服务中注册的模型可以用作:

  • Azure 机器学习终结点(实时和批处理):此部署允许在 Azure 容器实例 (ACI)、Azure Kubernetes (AKS) 或托管推理终结点中的实时和批量推理中利用 Azure 机器学习部署功能。

  • MLFlow 模型对象或 Pandas UDF,可在流式处理或批处理管道中的 Azure Databricks 笔记本中使用。

将模型部署到 Azure 机器学习终结点

可以利用 azureml-mlflow 插件将模型部署到 Azure 机器学习工作区。 有关如何将模型部署到不同目标的完整详细信息,请查看如何部署 MLflow 模型页面。

重要

模型需要在 Azure 机器学习注册表中注册才能进行部署。 如果模型恰好在 Azure Databricks 内的 MLflow 实例中注册,则必须在 Azure 机器学习中再次进行注册。 如果是这种情况,请查看示例在 Azure Databricks 中训练模型并在 Azure 机器学习上部署这些模型

将模型部署到 ADB 以使用 UDF 进行批量评分

可以选择 Azure Databricks 群集进行批量评分。 利用 Mlflow,可以从连接到的注册表中解析任何模型。 通常会使用以下两种方法之一:

  • 如果模型是使用 Spark 库(如 MLLib)训练和构建的,请使用 mlflow.pyfunc.spark_udf 加载模型并将其用作 Spark Pandas UDF 来对新数据进行评分。
  • 如果模型不是用 Spark 库训练和构建的,请使用 mlflow.pyfunc.load_modelmlflow.<flavor>.load_model 在群集驱动程序中加载模型。 请注意,通过这种方式,你希望在群集中进行的任何并行化或工作分配都需要由你自行安排。 另请注意,MLflow 不会安装模型运行所需的任何库。 在运行群集之前,需要在群集中安装这些库。

以下示例演示如何从名为 uci-heart-classifier 的注册表加载模型,并将其用作 Spark Pandas UDF 来对新数据进行评分。

from pyspark.sql.types import ArrayType, FloatType 

model_name = "uci-heart-classifier"
model_uri = "models:/"+model_name+"/latest"

#Create a Spark UDF for the MLFlow model 
pyfunc_udf = mlflow.pyfunc.spark_udf(spark, model_uri) 

提示

查看从注册表加载模型,了解从注册表引用模型的更多方法。

加载模型后,可以使用它对新数据进行评分:

#Load Scoring Data into Spark Dataframe 
scoreDf = spark.table({table_name}).where({required_conditions}) 

#Make Prediction 
preds = (scoreDf 
           .withColumn('target_column_name', pyfunc_udf('Input_column1', 'Input_column2', ' Input_column3', …)) 
        ) 

display(preds) 

清理资源

如果希望保留 Azure Databricks 工作区,但不再需要 Azure 机器学习工作区,则可以删除 Azure 机器学习工作区。 此操作会导致取消链接 Azure Databricks 工作区和 Azure 机器学习工作区。

如果不打算使用工作区中记录的指标和项目,目前尚未提供单独删除它们的功能。 可以改为删除包含存储帐户和工作区的资源组,这样就不会产生任何费用:

  1. 在 Azure 门户中,选择最左侧的“资源组”。

    Delete in the Azure portal

  2. 从列表中选择已创建的资源组。

  3. 选择“删除资源组”

  4. 输入资源组名称。 然后选择“删除”。

后续步骤