使用 MLflow 和 Azure 机器学习跟踪 Azure Databricks 机器学习试验
MLflow 是一个开放源代码库,用于管理机器学习试验的生命周期。 可以使用 MLflow 将 Azure Databricks 与 Azure 机器学习集成,以确保充分利用这两种产品。
本文内容:
- 将 MLflow 与 Azure Databricks 和 Azure 机器学习配合使用所需的库。
- 如何在 Azure 机器学习中使用 MLflow 跟踪 Azure Databricks 运行。
- 如何使用 MLflow 记录模型以在 Azure 机器学习中注册它们。
- 如何部署和使用在 Azure 机器学习中注册的模型。
先决条件
azureml-mlflow
包,用于处理与 Azure 机器学习的连接,包括身份验证。- Azure Databricks 工作区和群集。
- 一个 Azure 机器学习工作区。
示例笔记本
在 Azure Databricks 中训练模型并在 Azure 机器学习上部署这些模型存储库演示如何在 Azure Databricks 中训练模型并在 Azure 机器学习中部署这些模型。 它还介绍如何使用 Azure Databricks 中的 MLflow 实例跟踪试验和模型。 本文介绍如何使用 Azure 机器学习进行部署。
安装库
在群集上安装库:
导航到“库”选项卡,然后选择“安装新库”。
在“包”字段中,键入 azureml-mlflow,然后选择“安装”。 根据需要重复此步骤,以将其他包安装到用于试验的群集中。
使用 MLflow 跟踪 Azure Databricks 运行
可以通过两种方式将 Azure Databricks 配置为使用 MLflow 跟踪试验:
默认情况下,在链接 Azure Databricks 工作区时,系统会为你配置双重跟踪。
Azure Databricks 和 Azure 机器学习上的双重跟踪
通过将 Azure Databricks 工作区链接到 Azure 机器学习工作区,可以同时在 Azure 机器学习工作区和 Azure Databricks 工作区中跟踪试验数据。 此配置称为“双重跟踪”。
启用专用链接的 Azure 机器学习工作区中目前不支持双重跟踪。 改为使用 Azure 机器学习工作区配置独占跟踪。
由世纪互联运营的 Azure 目前不支持双重跟踪。 改为使用 Azure 机器学习工作区配置独占跟踪。
若要将 Azure Databricks 工作区链接到新的或现有的 Azure 机器学习工作区:
登录到 Azure 门户。
导航到 Azure Databricks 工作区“概述”页面。
选择“链接 Azure 机器学习工作区”。
将 Azure Databricks 工作区与 Azure 机器学习工作区链接后,MLflow 跟踪将自动在以下位置进行跟踪:
- 链接的 Azure 机器学习工作区。
- 原始 Azure Databricks 工作区。
然后,可以像之前一样在 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 机器学习部署选项启用更轻松的部署路径的优势。
警告
对于启用专用链接的 Azure 机器学习工作区,必须在你自己的网络(VNet 注入)中部署 Azure Databricks,以确保正确的连接。
将 MLflow 跟踪 URI 配置为唯一指向 Azure 机器学习,如以下示例所示:
配置跟踪 URI
获取工作区的跟踪 URI。
登录并配置工作区。
az account set --subscription <subscription> az configure --defaults workspace=<workspace> group=<resource-group> location=<location>
可以使用
az ml workspace
命令获取跟踪 URI。az ml workspace show --query mlflow_tracking_uri
配置跟踪 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 机器学习插件会打开浏览器,以交互方式提示输入凭据。 有关在 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 密钥保管库实例中将这些环境变量作为机密进行管理。
例如,在 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 群集中训练模型的事实无关。 而是遵循所使用的训练框架。 可以将 TensorFlow 与 Spark 配合使用来训练模型。 要使用的风格将是 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 具有与跟踪 URI 的 MLflow 相同的格式和值。
mlflow.set_registry_uri(azureml_mlflow_uri)
注意
azureml_mlflow_uri
值的获取方式与将 MLflow 跟踪设置为仅在 Azure 机器学习工作区中进行跟踪中所述的方式相同。
有关此方案的完整示例,请参阅在 Azure Databricks 中训练模型并在 Azure 机器学习上部署这些模型。
部署和使用在 Azure 机器学习中注册的模型
使用 MLflow 在 Azure 机器学习服务中注册的模型可以用作:
- Azure 机器学习终结点(实时和批量)。 此部署允许在 Azure 容器实例、Azure Kubernetes 或托管推理终结点中的实时和批量推理中使用 Azure 机器学习部署功能。
- MLFlow 模型对象或 Pandas 用户定义的函数 (UDF),可在流式处理或批处理管道中的 Azure Databricks 笔记本中使用。
将模型部署到 Azure 机器学习终结点
可以使用 azureml-mlflow
插件将模型部署到 Azure 机器学习工作区。 有关如何将模型部署到不同目标的详细信息,请查看如何部署 MLflow 模型。
重要
模型需要在 Azure 机器学习注册表中注册才能进行部署。 如果模型在 Azure Databricks 内的 MLflow 实例中注册,则必须在 Azure 机器学习中再次进行注册。 有关详细信息,请参阅在 Azure Databricks 中训练模型并在 Azure 机器学习上部署这些模型
将模型部署到 Azure Databricks 以使用 UDF 进行批量评分
可以选择 Azure Databricks 群集进行批量评分。 使用 Mlflow,可以从连接到的注册表中解析任何模型。 通常使用下列方法之一:
- 如果模型是使用 Spark 库(如
MLLib
)训练和构建的,请使用mlflow.pyfunc.spark_udf
加载模型并将其用作 Spark Pandas UDF 来对新数据进行评分。 - 如果模型不是用 Spark 库训练和构建的,请使用
mlflow.pyfunc.load_model
或mlflow.<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 机器学习工作区。
如果不打算在工作区中使用记录的指标和项目,请删除包含存储帐户和工作区的资源组。
- 在 Azure 门户中,搜索“资源组”。 在“服务”下,选择“资源组”。
- 在“资源组”列表中,找到并选择创建的资源组以打开它。
- 在“概述”页面上,选择“删除资源组”。
- 若要验证删除,请输入资源组的名称。