使用注册表跨工作区共享模型、组件和环境

使用 Azure 机器学习注册表可以跨组织中的工作区进行协作。 使用注册表可以共享模型、组件和环境。

对于以下两种方案,你希望在多个工作区中使用同一组模型、组件和环境:

  • 跨工作区 MLOps:你正在 dev 工作区中训练模型,并需要将其部署到 testprod 工作区。 在这种情况下,你希望在 testprod 工作区中部署模型的终结点与 dev 工作区中用于训练模型的训练作业、指标、代码、数据和环境之间建立端到端世系。
  • 在不同的团队之间共享和重用模型与管道:共享和重用可以改善协作和工作效率。 在此方案中,你可能希望将已训练的模型以及用于对其进行训练的相关组件和环境发布到中心目录。 从该目录中,其他团队的同事可以搜索和重用其自己的试验中共享的资产。

本文将指导如何进行以下操作:

  • 在注册表中创建环境和组件。
  • 使用注册表中的组件在工作区中提交模型训练作业。
  • 在注册表中注册已训练的模型。
  • 将注册表中的模型部署到工作区中的联机终结点,然后提交推理请求。

先决条件

在按照本文中的步骤操作之前,请确保满足以下先决条件:

  • Azure 订阅。 如果没有 Azure 订阅,请在开始前创建一个试用版订阅。 尝试试用版订阅
  • 用于共享模型、组件和环境的 Azure 机器学习注册表。 若要创建注册表,请参阅了解如何创建注册表

  • Azure 机器学习工作区。 如果没有,请按照快速入门:创建工作区资源一文中的步骤创建一个。

    重要

    要在其中创建工作区的 Azure 区域(位置)必须在 Azure 机器学习注册表支持的区域列表中

  • Azure CLI 和 ml 扩展或 Azure 机器学习 Python SDK v2:

    若要安装 Azure CLI 和扩展,请参阅安装、设置和使用 CLI (v2)

    重要

    • 本文中的 CLI 示例假定你使用的是 Bash(或兼容的)shell。 例如,从 Linux 系统或者适用于 Linux 的 Windows 子系统

    • 这些示例还假设你已配置 Azure CLI 的默认设置,因此不需要为订阅、工作区、资源组或位置指定参数。 若要配置默认设置,请使用以下命令。 将以下参数替换为你的配置值:

      • <subscription> 替换为你的 Azure 订阅 ID。
      • <workspace> 替换为 Azure 机器学习工作区名称。
      • <resource-group> 替换为包含你的工作区的 Azure 资源组。
      • <location> 替换为包含你的工作区的 Azure 区域。
      az account set --subscription <subscription>
      az configure --defaults workspace=<workspace> group=<resource-group> location=<location>
      

      可以使用 az configure -l 命令查看当前的默认值。

克隆示例存储库

本文中的代码示例基于示例存储库中的 nyc_taxi_data_regression 示例。 若要在开发环境中使用这些文件,请使用以下命令克隆存储库并将目录更改为示例:

git clone https://github.com/Azure/azureml-examples
cd azureml-examples

对于 CLI 示例,请将目录更改为示例存储库的本地克隆中的 cli/jobs/pipelines-with-components/nyc_taxi_data_regression

cd cli/jobs/pipelines-with-components/nyc_taxi_data_regression

创建 SDK 连接

提示

仅当使用 Python SDK 时才需要执行此步骤。

创建与 Azure 机器学习工作区和注册表的客户端连接:

ml_client_workspace = MLClient( credential=credential,
    subscription_id = "<workspace-subscription>",
    resource_group_name = "<workspace-resource-group",
    workspace_name = "<workspace-name>")
print(ml_client_workspace)

ml_client_registry = MLClient(credential=credential,
                        registry_name="<REGISTRY_NAME>",
                        registry_location="<REGISTRY_REGION>")
print(ml_client_registry)

在注册表中创建环境

环境定义了运行训练作业或部署模型所需的 docker 容器和 Python 依赖项。 有关环境的详细信息,请参阅以下文章:

提示

CLI 命令 az ml environment create 还可用于在工作区或注册表中创建环境。 结合 --workspace-name 命令运行该命令会在工作区中创建环境,而结合 --registry-name 运行该命令会在注册表中创建环境。

我们将创建一个使用 python:3.8 docker 映像的环境,并安装使用 SciKit Learn 框架运行训练作业所需的 Python 包。 如果你已克隆示例存储库并在文件夹 cli/jobs/pipelines-with-components/nyc_taxi_data_regression 中操作,应该可以看到引用了 docker 文件 env_train/Dockerfile 的环境定义文件 env_train.yml。 下面显示了 env_train.yml 供你参考:

$schema: https://azuremlschemas.azureedge.net/latest/environment.schema.json
name: SKLearnEnv
version: 1
build:
  path: ./env_train

如下所示使用 az ml environment create 创建环境

az ml environment create --file env_train.yml --registry-name <registry-name>

如果出现错误,指出注册表中已存在具有此名称和版本的环境,你可以编辑 env_train.yml 中的 version 字段,或者在 CLI 中指定不同的版本以便替代 env_train.yml 中的版本值。

# use shell epoch time as the version
version=$(date +%s)
az ml environment create --file env_train.yml --registry-name <registry-name> --set version=$version

提示

version=$(date +%s) 只能在 Linux 中运行。 如果不能正常运行,请将 $version 替换为随机数。

记下 az ml environment create 命令输出中环境的 nameversion,并将其与 az ml environment show 命令结合使用,如下所示。 按下一部分所述在注册表中创建组件时,需要用到 nameversion

az ml environment show --name SKLearnEnv --version 1 --registry-name <registry-name>

提示

如果你使用了不同的环境名称或版本,请相应地替换 --name--version 参数。

还可以使用 az ml environment list --registry-name <registry-name> 列出注册表中的所有环境。

可以在 Azure 机器学习工作室中浏览所有环境。 请务必导航到全局 UI 并查看“注册表”条目。

注册表中的环境的屏幕截图。

在注册表中创建组件

组件是 Azure 机器学习中的机器学习管道的可重用构建基块。 可将单个管道步骤的代码、命令、环境、输入接口和输出接口打包到一个组件中。 然后,可以跨多个管道重用该组件,而不必在每次编写不同的管道时移植依赖项和代码。

在工作区中创建组件后,可以在该工作区内的任何管道作业中使用该组件。 在注册表中创建组件后,可以在组织内的任何工作区的任何管道中使用该组件。 在注册表中创建组件可以十分方便地生成模块化的可重用实用工具或共享的训练任务,供组织中的不同团队在试验中使用。

有关组件的详细信息,请参阅以下文章:

确保在文件夹 cli/jobs/pipelines-with-components/nyc_taxi_data_regression 中操作。 你会找到将 Scikit Learn 训练脚本 train_src/train.py特选环境 AzureML-sklearn-0.24-ubuntu18.04-py37-cpu 打包的组件定义文件 train.yml。 我们将使用在上一步骤中创建的 Scikit Learn 环境,而不是特选环境。 可以编辑 train.yml 中的 environment 字段以引用 Scikit Learn 环境。 生成的组件定义文件 train.yml 如以下示例所示:

# <component>
$schema: https://azuremlschemas.azureedge.net/latest/commandComponent.schema.json
name: train_linear_regression_model
display_name: TrainLinearRegressionModel
version: 1
type: command
inputs:
  training_data: 
    type: uri_folder
  test_split_ratio:
    type: number
    min: 0
    max: 1
    default: 0.2
outputs:
  model_output:
    type: mlflow_model
  test_data:
    type: uri_folder
code: ./train_src
environment: azureml://registries/<registry-name>/environments/SKLearnEnv/versions/1`
command: >-
  python train.py 
  --training_data ${{inputs.training_data}} 
  --test_data ${{outputs.test_data}} 
  --model_output ${{outputs.model_output}}
  --test_split_ratio ${{inputs.test_split_ratio}}

如果你使用了不同的名称或版本,更通用的表示形式如下所示:environment: azureml://registries/<registry-name>/environments/<sklearn-environment-name>/versions/<sklearn-environment-version>,因此请务必相应地替换 <registry-name><sklearn-environment-name><sklearn-environment-version>。 然后运行 az ml component create 命令创建组件,如下所示。

az ml component create --file train.yml --registry-name <registry-name>

提示

CLI 命令 az ml component create 还可用于在工作区或注册表中创建组件。 结合 --workspace-name 命令运行该命令会在工作区中创建组件,而结合 --registry-name 运行该命令会在注册表中创建组件。

如果你不想要编辑 train.yml,可以在 CLI 中替代环境名称,如下所示:

az ml component create --file train.yml --registry-name <registry-name>` --set environment=azureml://registries/<registry-name>/environments/SKLearnEnv/versions/1
# or if you used a different name or version, replace `<sklearn-environment-name>` and `<sklearn-environment-version>` accordingly
az ml component create --file train.yml --registry-name <registry-name>` --set environment=azureml://registries/<registry-name>/environments/<sklearn-environment-name>/versions/<sklearn-environment-version>

提示

如果有错误指出注册表中已存在该组件名称,可以在 train.yml 中编辑版本,或者在 CLI 中使用随机版本来替代版本。

记下 az ml component create 命令输出中组件的 nameversion,并将其与 az ml component show 命令结合使用,如下所示。 按下一部分所述在工作区中创建和提交训练作业时,需要用到 nameversion

az ml component show --name <component_name> --version <component_version> --registry-name <registry-name>

还可以使用 az ml component list --registry-name <registry-name> 列出注册表中的所有组件。

可以在 Azure 机器学习工作室中浏览所有组件。 请务必导航到全局 UI 并查看“注册表”条目。

注册表中的组件的屏幕截图。

使用注册表中的组件在工作区中运行管道作业

在运行使用注册表中的组件的管道作业时,计算资源和训练数据位于工作区的本地。 有关运行作业的详细信息,请参阅以下文章:

我们将使用在上一部分创建的 Scikit Learn 训练组件来运行管道作业以训练某个模型。 检查你是否在文件夹 cli/jobs/pipelines-with-components/nyc_taxi_data_regression 中操作。 训练数据集位于 data_transformed 文件夹中。 编辑 single-job-pipeline.yml 文件中 train_job 节下的 component 节,以引用在上一部分创建的训练组件。 生成的 single-job-pipeline.yml 如下所示。

$schema: https://azuremlschemas.azureedge.net/latest/pipelineJob.schema.json
type: pipeline
display_name: nyc_taxi_data_regression_single_job
description: Single job pipeline to train regression model based on nyc taxi dataset

jobs:
  train_job:
    type: command
    component: azureml://registries/<registry-name>/component/train_linear_regression_model/versions/1
    compute: azureml:cpu-cluster
    inputs:
      training_data: 
        type: uri_folder
        path: ./data_transformed
    outputs:
      model_output: 
        type: mlflow_model
      test_data: 

一个要点是此管道将在工作区中使用不在特定工作区中的组件运行。 该组件位于可与组织中的任何工作区一起使用的注册表中。 你可以在你有权访问的任何工作区中运行此训练作业,而不必在该工作区中提供训练代码和环境。

警告

  • 在运行管道作业之前,请确认要在其中运行该作业的工作区位于创建组件的注册表所支持的 Azure 区域中。
  • 确认该工作区包含名为 cpu-cluster 的计算群集,或使用你的计算名称编辑 jobs.train_job.compute 下的 compute 字段。

使用 az ml job create 命令运行管道作业。

az ml job create --file single-job-pipeline.yml 

提示

如果你尚未按照先决条件部分中所述配置默认工作区和资源组,则需要指定 --workspace-name--resource-group 参数,这样才能正常运行 az ml job create

或者,可以不编辑 single-job-pipeline.yml,而是在 CLI 中替代 train_job 使用的组件名称。

az ml job create --file single-job-pipeline.yml --set jobs.train_job.component=azureml://registries/<registry-name>/component/train_linear_regression_model/versions/1

由于训练作业中使用的组件是通过注册表共享的,因此你可以将作业提交到你在组织中有权访问的任何工作区,甚至提交到不同的订阅。 例如,如果你有 dev-workspacetest-workspaceprod-workspace,在这三个工作区中运行训练作业就像运行三个 az ml job create 命令一样简单。

az ml job create --file single-job-pipeline.yml --workspace-name dev-workspace --resource-group <resource-group-of-dev-workspace>
az ml job create --file single-job-pipeline.yml --workspace-name test-workspace --resource-group <resource-group-of-test-workspace>
az ml job create --file single-job-pipeline.yml --workspace-name prod-workspace --resource-group <resource-group-of-prod-workspace>

在 Azure 机器学习工作室中,选择作业输出中的终结点链接以查看作业。 在此处,可以分析训练指标,验证作业是否使用注册表中的组件和环境,并查看已训练的模型。 记下输出中作业的 name,或者在 Azure 机器学习工作室的作业概述中找到相同的信息。 按下一部分所述在注册表中创建模型时,需要使用此信息来下载已训练的模型。

Azure 机器学习工作室中管道的屏幕截图。

在注册表中创建模型

本部分介绍如何在注册表中创建模型。 请查看管理模型,详细了解 Azure 机器学习中的模型管理。 我们将了解在注册表中创建模型的两种不同方法。 第一种方法是通过本地文件创建。 第二种方法是将工作区中注册的模型复制到注册表。

对于这两种方法,都要使用 MLflow 格式创建模型,这有助于部署此模型进行推理,而无需编写任何推理代码

通过本地文件在注册表中创建模型

下载模型。可以在 train_job 的输出中找到该模型(请将 <job-name> 替换为上一部分所述的作业中的名称)。 ./artifacts/model/ 中应会提供该模型以及 MLflow 元数据文件。

# fetch the name of the train_job by listing all child jobs of the pipeline job
train_job_name=$(az ml job list --parent-job-name <job-name> --query [0].name | sed 's/\"//g')
# download the default outputs of the train_job
az ml job download --name $train_job_name 
# review the model files
ls -l ./artifacts/model/

提示

如果你尚未按照先决条件部分中所述配置默认工作区和资源组,则需要指定 --workspace-name--resource-group 参数,这样才能正常运行 az ml model create

警告

az ml job list 的输出将传递给 sed。 这仅适用于 Linux shell。 如果你在 Windows 上操作,请运行 az ml job list --parent-job-name <job-name> --query [0].name 并去除训练作业名称中的所有引号。

如果无法下载模型,可以在 cli/jobs/pipelines-with-components/nyc_taxi_data_regression/artifacts/model/ 文件夹中找到上一部分所述的训练作业训练的示例 MLflow 模型。

在注册表中创建模型:

# create model in registry
az ml model create --name nyc-taxi-model --version 1 --type mlflow_model --path ./artifacts/model/ --registry-name <registry-name>

提示

  • 如果有错误指出模型名称和版本已存在,请为 version 参数使用随机数。
  • CLI 命令 az ml model create 还可用于在工作区或注册表中创建模型。 结合 --workspace-name 命令运行该命令会在工作区中创建模型,而结合 --registry-name 运行该命令会在注册表中创建模型。

将模型从工作区共享到注册表

在此工作流中,你首先需要在工作区中创建模型,然后将其共享到注册表。 如果你希望在共享模型之前先在工作区中对其进行测试,此工作流非常有用。 例如,将模型部署到终结点,尝试使用一些测试数据进行推理,并在一切正常的情况下将此模型复制到注册表。 当你使用不同的技术、框架或参数开发一系列模型,并希望仅将其中一个模型作为生产候选项提升到注册表时,此工作流也可能很有用。

确保使用上一部分所述管道作业的名称,并在命令中替换名称以提取以下训练作业名称。 然后,将训练作业的输出中的模型注册到工作区中。 请注意 --path 参数如何使用 azureml://jobs/$train_job_name/outputs/artifacts/paths/model 语法引用输出 train_job

# fetch the name of the train_job by listing all child jobs of the pipeline job
train_job_name=$(az ml job list --parent-job-name <job-name> --workspace-name <workspace-name> --resource-group <workspace-resource-group> --query [0].name | sed 's/\"//g')
# create model in workspace
az ml model create --name nyc-taxi-model --version 1 --type mlflow_model --path azureml://jobs/$train_job_name/outputs/artifacts/paths/model 

提示

  • 如果有错误指出模型名称和版本已存在,请为 version 参数使用随机数。
  • 如果你尚未按照先决条件部分中所述配置默认工作区和资源组,则需要指定 --workspace-name--resource-group 参数,这样才能正常运行 az ml model create

记下模型名称和版本。 可以通过在工作室 UI 中浏览模型或使用 az ml model show --name nyc-taxi-model --version $model_version 命令来验证该模型是否已注册到工作区。

接下来,将模型从工作区共享到注册表。

# share model registered in workspace to registry
az ml model share --name nyc-taxi-model --version 1 --registry-name <registry-name> --share-with-name <new-name> --share-with-version <new-version>

提示

  • 如果在 az ml model create 命令中更改了模型名称和版本,请确保使用正确的名称和版本。
  • 上述命令有两个可选参数“--share-with-name”和“--share-with-version”。 如果未提供它们,则新模型的名称和版本将与正在共享的模型相同。 记下 az ml model create 命令输出中模型的 nameversion,并将其与 az ml model show 命令结合使用,如下所示。 按下一部分所述将模型部署到联机终结点用于推理时,需要用到 nameversion
az ml model show --name <model_name> --version <model_version> --registry-name <registry-name>

还可以使用 az ml model list --registry-name <registry-name> 列出注册表中的所有模型,或者在 Azure 机器学习工作室 UI 中浏览所有组件。 请务必导航到全局 UI 并查看“注册表”中心。

以下屏幕截图显示了 Azure 机器学习工作室中注册表中的模型。 如果你从作业输出创建了一个模型,然后将该模型从工作区复制到了注册表,你将看到该模型带有一个指向训练了该模型的作业的链接。 可以使用该链接导航到训练作业,以查看用于训练模型的代码、环境和数据。

注册表中的模型的屏幕截图。

将模型从注册表部署到工作区中的联机终结点

最后一部分介绍如何将模型从注册表部署到工作区中的联机终结点。 你可以选择在组织中部署你有权访问的任何工作区,前提是该工作区的位置是注册表支持的位置之一。 如果你在 dev 工作区中训练了某个模型,现在需要将该模型部署到 testprod 工作区,同时保留用于训练该模型的代码、环境和数据的相关世系信息,则此功能很有帮助。

联机终结点允许通过 REST API 部署模型和提交推理请求。 有关详细信息,请参阅如何使用在线终结点部署机器学习模型并为其评分

创建联机终结点。

az ml online-endpoint create --name reg-ep-1234

更新 cli/jobs/pipelines-with-components/nyc_taxi_data_regression 文件夹中可用的 model:deploy.yml,以引用上一步骤中所述的模型名称和版本。 创建到联机终结点的联机部署。 下面显示了 deploy.yml 以供参考。

$schema: https://azuremlschemas.azureedge.net/latest/managedOnlineDeployment.schema.json
name: demo
endpoint_name: reg-ep-1234
model: azureml://registries/<registry-name>/models/nyc-taxi-model/versions/1
instance_type: Standard_DS2_v2
instance_count: 1

创建联机部署。 部署需要数分钟才能完成。

az ml online-deployment create --file deploy.yml --all-traffic

提取评分 URI 并提交示例评分请求。 评分请求的示例数据位于 cli/jobs/pipelines-with-components/nyc_taxi_data_regression 文件夹中的 scoring-data.json 内。

ENDPOINT_KEY=$(az ml online-endpoint get-credentials -n reg-ep-1234 -o tsv --query primaryKey)
SCORING_URI=$(az ml online-endpoint show -n reg-ep-1234 -o tsv --query scoring_uri)
curl --request POST "$SCORING_URI" --header "Authorization: Bearer $ENDPOINT_KEY" --header 'Content-Type: application/json' --data @./scoring-data.json

提示

  • curl 命令只能在 Linux 上运行。
  • 如果你尚未按照先决条件部分中所述配置默认工作区和资源组,则需要指定 --workspace-name--resource-group 参数,这样才能正常运行 az ml online-endpointaz ml online-deployment 命令。

清理资源

如果你今后不再使用该部署,应将其删除以降低成本。 以下示例删除终结点以及所有基础部署:

az ml online-endpoint delete --name reg-ep-1234 --yes --no-wait

后续步骤