使用 MLflow 和 Azure 机器学习跟踪 ML 模型

本文介绍如何启用 MLflow 的跟踪 URI 和记录 API(统称为 MLflow 跟踪),以将 Azure 机器学习作为 MLflow 试验的后端进行连接。

支持的功能包括:

MLflow 是一个开放源代码库,用于管理机器学习试验的生命周期。 MLFlow 跟踪是 MLflow 的一个组件,可以记录和跟踪训练运行指标和模型项目,而不管试验环境是位于本地计算机、远程计算目标、虚拟机还是 Azure Databricks 群集上。

有关其他的 MLflow 和 Azure 机器学习功能集成,请参阅 MLflow 和 Azure 机器学习

下图说明使用 MLflow 跟踪,你可以跟踪试验的运行指标,并将模型项目存储在 Azure 机器学习工作区中。

mlflow with azure machine learning diagram

提示

本文档中的信息主要面向需要监视模型训练过程的数据科学家与开发人员。 如果你是一名管理员并想要了解如何监视 Azure 机器学习的资源使用情况和事件(例如配额、已完成的训练运行或已完成的模型部署),请参阅监视 Azure 机器学习

注意

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

先决条件

跟踪本地运行

借助 Azure 机器学习跟踪 MLflow,可将在本地计算机上执行的记录的指标和项目运行存储到 Azure 机器学习工作区中。

设置跟踪环境

若要跟踪本地运行,需要将本地计算机指向 Azure 机器学习 MLflow 跟踪 URI。

导入 mlflowWorkspace 类以访问 MLflow 的跟踪 URI 并配置工作区。

在下面的代码中,get_mlflow_tracking_uri() 方法会向工作区 ws 分配唯一的跟踪 URI 地址,并且 set_tracking_uri() 会将 MLflow 跟踪 URI 指向该地址。

import mlflow
from azureml.core import Workspace

ws = Workspace.from_config()

mlflow.set_tracking_uri(ws.get_mlflow_tracking_uri())

设置试验名称

所有 MLflow 运行都记录到活动试验中,你可使用 MLflow SDK 或 Azure CLI 对其进行设置。

使用 set_experiment() 命令设置 MLflow 试验名称。

experiment_name = 'experiment_with_mlflow'
mlflow.set_experiment(experiment_name)

启动训练运行

设置 MLflow 试验名称后,可以使用 start_run() 启动训练运行。 然后使用 log_metric() 激活 MLflow 记录 API 并开始记录训练运行指标。

import os
from random import random

with mlflow.start_run() as mlflow_run:
    mlflow.log_param("hello_param", "world")
    mlflow.log_metric("hello_metric", random())
    os.system(f"echo 'hello world' > helloworld.txt")
    mlflow.log_artifact("helloworld.txt")

跟踪远程运行

远程运行可以让你通过更强大的计算(例如启用 GPU 的虚拟机或机器学习计算群集)训练模型。 请参阅使用计算目标进行模型训练,了解不同的计算选项。

使用 Azure 机器学习进行 MLflow 跟踪,你可以将远程运行中记录的指标和项目存储在 Azure 机器学习工作区中。 任何包含 MLflow 跟踪代码的运行都会自动将指标记录到工作区。

首先,你应创建一个 src 子目录,并在 src 子目录的 train.py 文件中创建一个包含训练代码的文件。 所有训练代码(包括 train.py)都将进入 src 子目录。

训练代码取自 Azure 机器学习示例存储库中的这个 MLflow 示例

将以下代码复制到文件中:

# imports
import os
import mlflow

from random import random

# define functions
def main():
    mlflow.log_param("hello_param", "world")
    mlflow.log_metric("hello_metric", random())
    os.system(f"echo 'hello world' > helloworld.txt")
    mlflow.log_artifact("helloworld.txt")

# run functions
if __name__ == "__main__":
    # run main function
    main()

加载训练脚本以提交试验。

script_dir = "src"
training_script = 'train.py'
with open("{}/{}".format(script_dir,training_script), 'r') as f:
    print(f.read())

在脚本中,使用 Environment 类配置计算和训练运行环境。

from azureml.core import Environment
from azureml.core.conda_dependencies import CondaDependencies

env = Environment(name="mlflow-env")

# Specify conda dependencies with scikit-learn and temporary pointers to mlflow extensions
cd = CondaDependencies.create(
    conda_packages=["scikit-learn", "matplotlib"],
    pip_packages=["azureml-mlflow", "pandas", "numpy"]
    )

env.python.conda_dependencies = cd

然后,将远程计算作为计算目标构造 ScriptRunConfig

from azureml.core import ScriptRunConfig

src = ScriptRunConfig(source_directory="src",
                      script=training_script,
                      compute_target="<COMPUTE_NAME>",
                      environment=env)

在具有此计算和训练运行配置的情况下,使用 Experiment.submit() 方法提交运行。 此方法会自动设置 MLflow 跟踪 URI 并将记录从 MLflow 定向到工作区。

from azureml.core import Experiment
from azureml.core import Workspace
ws = Workspace.from_config()

experiment_name = "experiment_with_mlflow"
exp = Experiment(workspace=ws, name=experiment_name)

run = exp.submit(src)

查看工作区中的指标和项目

在工作区中跟踪 MLflow 日志记录中的指标和项目。 若要随时查看它们,请在 Azure 机器学习工作室中导航到你的工作区,并在该工作区中按名称找到试验。 或运行以下代码。

使用 MLflow get_run() 检索运行指标。

from mlflow.entities import ViewType
from mlflow.tracking import MlflowClient

# Retrieve run ID for the last run experiement
current_experiment=mlflow.get_experiment_by_name(experiment_name)
runs = mlflow.search_runs(experiment_ids=current_experiment.experiment_id, run_view_type=ViewType.ALL)
run_id = runs.tail(1)["run_id"].tolist()[0]

# Use MlFlow to retrieve the run that was just completed
client = MlflowClient()
finished_mlflow_run = MlflowClient().get_run(run_id)

metrics = finished_mlflow_run.data.metrics
tags = finished_mlflow_run.data.tags
params = finished_mlflow_run.data.params

print(metrics,tags,params)

使用 MLFLow 检索项目

若要查看运行的项目,可以使用 MlFlowClient.list_artifacts()

client.list_artifacts(run_id)

要将项目下载到当前目录,可以使用 MLFlowClient.download_artifacts()

client.download_artifacts(run_id, "helloworld.txt", ".")

比较和查询

使用以下代码比较和查询 Azure 机器学习工作区中的所有 MLflow 运行。 详细了解如何使用 MLflow 查询运行

from mlflow.entities import ViewType

all_experiments = [exp.experiment_id for exp in MlflowClient().list_experiments()]
query = "metrics.hello_metric > 0"
runs = mlflow.search_runs(experiment_ids=all_experiments, filter_string=query, run_view_type=ViewType.ALL)

runs.head(10)

自动日志记录

使用 Azure 机器学习和 MLFlow,用户可以在训练模型时自动记录指标、模型参数和模型项目。 支持多种常见的机器学习库

若要启用自动日志记录,请在训练代码之前插入以下代码:

mlflow.autolog()

了解有关使用 MLflow 实现自动日志记录的详细信息

管理模型

使用支持 MLflow 模型注册表的 Azure 机器学习模型注册表注册和跟踪模型。 Azure 机器学习模型与 MLflow 模型架构一致,从而可以轻松地在不同的工作流之间导出和导入这些模型。 与 MLflow 相关的元数据(如运行 ID)还使用注册的模型进行标记,以进行跟踪。 用户可以提交训练运行、注册和部署 MLflow 运行生成的模型。

如果要一步部署和注册生产就绪模型,请参阅部署和注册 MLflow 模型

若要注册并查看运行中的模型,请执行以下步骤:

  1. 运行完成后,调用 register_model() 方法。

    # the model folder produced from a run is registered. This includes the MLmodel file, model.pkl and the conda.yaml.
    model_path = "model"
    model_uri = 'runs:/{}/{}'.format(run_id, model_path) 
    mlflow.register_model(model_uri,"registered_model_name")
    
  2. 使用 Azure 机器学习工作室查看工作区中的已注册模型。

    在以下示例中,已注册的模型 my-model 标记了 MLflow 跟踪元数据。

    register-mlflow-model

  3. 选择“项目”选项卡以查看与 MLflow 模型架构(conda.yaml、MLmodel 和 model.pkl)一致的所有模型文件。

    model-schema

  4. 选择 MLmodel 以查看运行生成的 MLmodel 文件。

    MLmodel-schema

清理资源

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

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

    Delete in the Azure portal

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

  3. 选择“删除资源组”

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

示例笔记本

将 MLflow 与 Azure ML 笔记本配合使用演示了本文中所述的概念,并在这些概念的基础上有所延伸。 另请参阅由社区主导的存储库 AzureML - 示例

后续步骤