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

在 Azure 机器学习中跟踪试验和部署模型

本文介绍如何使用 MLflow API 将日志记录代码添加到训练脚本以及在 Azure 机器学习中跟踪试验。 可监视运行指标来增强模型创建过程。

此示意图显示使用 MLflow 跟踪在 Azure 机器学习工作区中跟踪试验的运行指标并存储模型项目。

显示 MLflow 操作概念的示意图。

先决条件

创建新的 Notebook

Data Science Virtual Machine (DSVM) 上预装有 Azure 机器学习和 MLFlow SDK。 可以在 azureml_py36_* conda 环境中访问这些资源。 在 JupyterLab 中,选择启动器并选择此内核:

显示选择 azureml_py36_pytorch 内核的屏幕截图。

设置工作区

转到 Azure 门户并选择作为先决条件的一部分预配的工作区。 记下“下载 config.json”配置文件,如下图所示。 下载此文件,并将其存储在 DSVM 上的工作目录中。

显示下载 config.json 文件的屏幕截图。

配置文件包含工作区名称、订阅等信息。 无需使用此文件硬编码这些参数。

跟踪 DSVM 运行

若要设置 Azure 机器学习工作区对象,请将以下代码添加到笔记本或脚本:

import mlflow
from azureml.core import Workspace

ws = Workspace.from_config()

mlflow.set_tracking_uri(ws.get_mlflow_tracking_uri())

注意

跟踪 URI 的有效期最长一小时。 如果在空闲一段时间后重启脚本,请使用 get_mlflow_tracking_uri API 获取新的 URI。

加载数据

此示例使用糖尿病数据集,这是 scikit-learn 中包含的一个著名的小型数据集。 此单元会加载数据集,并将其拆分为随机训练集和测试集。

from sklearn.datasets import load_diabetes
from sklearn.linear_model import Ridge
from sklearn.metrics import mean_squared_error
from sklearn.model_selection import train_test_split
import joblib

X, y = load_diabetes(return_X_y = True)
columns = ['age', 'gender', 'bmi', 'bp', 's1', 's2', 's3', 's4', 's5', 's6']
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=0)
data = {
    "train":{"X": X_train, "y": y_train},
    "test":{"X": X_test, "y": y_test}
}

print ("Data contains", len(data['train']['X']), "training samples and",len(data['test']['X']), "test samples")

添加跟踪

使用 Azure 机器学习 SDK 添加试验跟踪并将持久化模型上传到试验运行记录。 此代码示例会添加日志,并将模型文件上传到试验运行。 模型也在 Azure 机器学习模型注册表中进行了注册:

# Get an experiment object from Azure Machine Learning
from azureml.mlflow import register_model
experiment_name = 'experiment_with_mlflow'
mlflow.set_experiment(experiment_name)

with mlflow.start_run():
    # Log the algorithm parameter alpha to the run
    mlflow.log_param('alpha', 0.03)

    # Create, fit, and test the scikit-learn Ridge regression model
    regression_model = Ridge(alpha=0.03)
    regression_model.fit(data['train']['X'], data['train']['y'])
    preds = regression_model.predict(data['test']['X'])

    # Output the Mean Squared Error to the notebook and to the run
    print('Mean Squared Error is', mean_squared_error(data['test']['y'], preds))
    mlflow.log_metric('mse', mean_squared_error(data['test']['y'], preds))

    # Save the model
    model_file_name = 'model.pkl'
    joblib.dump(value = regression_model, filename = model_file_name)

    # upload the model file explicitly into artifacts
    mlflow.log_artifact(model_file_name)
    # register the model
    register_model(mlflow.active_run(), 'diabetes_model', 'model.pkl', model_framework="ScikitLearn")

在 Azure 机器学习中查看运行

你可以在 Azure 机器学习工作室中查看试验运行。 在左侧菜单中选择“试验”,然后选择“experiment_with_mlflow”。 如果决定在上述代码片段中以不同的方式命名试验,请选择你选定的名称:

显示选择试验运行的屏幕截图。

已记录的均方误差 (MSE) 应该是可见的:

显示试验运行已记录的均方误差的屏幕截图。

如果选择运行,可在“输出 + 日志”中查看其他详细信息和所选模型。

在 Azure 机器学习中部署模型

本部分介绍如何将 DSVM 上训练的模型部署到 Azure 机器学习。

步骤 1:创建推理计算

Azure 机器学习工作室的左侧菜单中,选择“计算”,如以下屏幕截图所示:

显示在 Azure 机器学习工作室中选择“计算”的屏幕截图。

在“新建推理群集”窗格中,填写以下内容的详细信息

  • 计算名称
  • Kubernetes 服务 - 选择“新建”
  • 选择区域
  • 选择虚拟机大小(就本教程而言,默认值 Standard_D3_v2 就足够了)
  • 群集目的 - 选择“开发测试”
  • 节点数应等于 1
  • 网络配置 - 基本

如以下屏幕截图所示:

显示选择“推理群集”窗格的屏幕截图。

选择“创建”

步骤 2:部署无代码推理服务

使用 register_model 在代码中注册模型时,我们将框架指定为 sklearn。 Azure 机器学习支持以下框架的无代码部署:

  • scikit-learn
  • TensorFlow SaveModel 格式
  • ONNX 模型格式

无代码部署意味着可以直接从模型项目进行部署。 无需指定任何特定的评分脚本。

若要部署糖尿病模型,请转到 Azure 机器学习工作室中的左侧菜单,并选择“模型”。 接下来,选择已注册的 diabetes_model:

显示选择糖尿病模型的屏幕截图。

接下来,选择“模型详细信息”窗格中的“部署”按钮:

显示选择“部署”按钮的屏幕截图。

该模型将部署到在步骤 1 中创建的推理群集(Azure Kubernetes 服务)。 提供服务的名称和 AKS 计算群集的名称(在步骤 1 中创建),填写以下详细信息。 还建议将 CPU 保留容量从 0.1 增加到 1,将内存保留容量从 0.5 增加到 1。 选择“高级”并填写详细信息以设置这种增加。 然后选择“部署”,如以下屏幕截图所示:

显示模型部署的详细信息的屏幕截图。

步骤 3:使用

成功部署模型后,从左侧菜单中选择“终结点”,然后选择已部署的服务的名称。 模型详细信息窗格应该会变为可见,如以下屏幕截图所示:

显示模型详细信息页的屏幕截图。

部署状态应该会从“正在转换”转为“正常运行”。 此外,此详细信息部分提供了 REST 终结点和 Swagger URL,应用程序开发人员可以使用它们将 ML 模型集成到其应用中。

可以使用 Azure 机器学习 SDK 测试终结点:

适用于:适用于 Python 的 Azure 机器学习 SDK v1

from azureml.core import Webservice
import json

# if you called your service differently then change the name below
service = Webservice(ws, name="diabetes-service")

input_payload = json.dumps({
    'data': X_test[0:2].tolist(),
    'method': 'predict'  # If you have a classification model, you can get probabilities by changing this to 'predict_proba'.
})

output = service.run(input_payload)

print(output)

步骤 4:清理

删除在步骤 1 中创建的推理计算,以免持续产生计算费用。 为此,请在 Azure 机器学习工作室的左侧菜单中,选择“计算”>“推理群集”>“选择特定推理计算资源”>“删除”。

后续步骤