透過登錄跨工作區共用模型、元件和環境

Azure Machine Learning 登錄可讓您在組織內跨工作區共同作業。 您可以使用登錄共用模型、元件和環境。

您想要在多個工作區中使用同一組模型、元件和環境的案例有兩個:

  • 跨工作區 MLOps:您在 dev 工作區中定型模型,且必須將其部署至 testprod 工作區。 在此情況下,您想要擁有端點至部署該模型的 testprod 工作區之間的端對端歷程,以及在 dev 工作區中用來定型模型的定型作業、計量、程式碼、資料和環境。
  • 在不同小組之間共用和重複使用模型和管線:共用和重複使用可以改善共同作業和生產力。 在此案例中,您可能想要將已定型的模型和用來定型模型的相關聯元件和環境發佈至中央目錄。 其他小組的同事可以從該處搜尋您共用的資產,然後在自己的實驗中重複使用。

在本文中,您將學會如何:

  • 在登錄中建立環境和元件。
  • 使用登錄中的元件,以在工作區中提交模型定型作業。
  • 在登錄中註冊定型模型。
  • 將模型從登錄部署至工作區中的線上端點,然後提交推斷要求。

必要條件

遵循本文中的步驟之前,請確定您已滿足下列必要條件:

  • Azure Machine Learning 登錄,以共用模型、元件和環境。 若要建立登錄,請參閱了解如何建立登錄

  • Azure Machine Learning 工作區。 如果您沒有工作區資源,請依快速入門:建立工作區資源一文中的步驟來建立工作區資源。

    重要

    建立工作區的 Azure 區域 (位置) 必須列於 Azure Machine Learning 登錄的支援區域清單中

  • Azure CLI 與 ml 延伸模組 Azure Machine Learning Python SDK v2:

    若要安裝 Azure CLI 和擴充功能,請參閱安裝、設定和使用 CLI (v2)

    重要

    • 本文中的 CLI 範例假設您使用 Bash (或相容的) 殼層。 例如,從 Linux 系統或 Windows 子系統 Linux 版

    • 這些範例也會假設您已設定 Azure CLI 的預設值,因此您不必指定訂用帳戶、工作區、資源群組或位置的參數。 若要設定預設設定,請使用下列命令。 將下列參數取代為您的設定值:

      • 使用您的 Azure 訂用帳戶識別碼來取代 <subscription>
      • 將您的 Azure Machine Learning 工作區名稱取代為 <workspace>
      • <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 Machine Learning 工作區和登錄的用戶端連線:

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 Machine Learning 工作室中瀏覽所有環境。 請務必導覽至全域 UI,並尋找 [登錄] 項目。

登錄中環境的螢幕快照。

在登錄中建立元件

元件是 Azure Machine Learning 中 Machine Learning 管線可重複使用的建置組塊。 您可以將個別管線步驟中的程式碼、命令、環境、輸入介面和輸出介面封裝至元件。 然後,您可以在多個管線之間重複使用元件,而不需要在每次撰寫不同的管線時擔心移植的相依性和程式碼。

在工作區中建立元件可讓您在該工作區內的任何管線作業中使用該元件。 在登錄中建立元件可讓您在組織內任何工作區的任何管線中使用該元件。 在登錄中建立元件是建置模組化可重複使用公用程式或共用定型工作的絕佳方式,可用於組織內不同小組的實驗。

如需元件的詳細資訊,請參閱下列文章:

請確定您已位於資料夾 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 Machine Learning 工作室中瀏覽所有元件。 請務必導覽至全域 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 Machine Learning 工作室中,選取作業輸出中的端點連結可以檢視作業。 您可以在此處分析定型計量、確認作業使用的是登錄的元件和環境,以及檢閱定型的模型。 請記下輸出中作業的 name,或在 Azure Machine Learning 工作室的作業概觀中尋找相同的資訊。 下一節,當您在登錄中建立模型時,將會需要此資訊以下載定型模型。

Azure Machine Learning 工作室 中管線的螢幕快照。

在登錄中建立模型

在本節中,您將了解如何在登錄中建立模型。 檢閱管理模型以深入了解 Azure Machine Learning 中的模型管理。 我們將探討兩種在登錄中建立模型的兩種不同方式。 第一個方法是從本機檔案。 第二個方法是將工作區中註冊的模型複製到登錄。

在這兩個選項中,您將使用 MLflow 格式建立模型,這會協助您部署此模型以進行推斷,而不需撰寫任何推斷程式碼

從本機檔案建立登錄中的模型

下載模型,將 <job-name> 取代為上一節中作業的名稱,做為 train_job 的輸出。 模型及 MLflow 中繼資料檔應該位於 ./artifacts/model/

# 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 殼層。 如果您是在 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

請記下模型名稱和版本。 您可以在 Studio 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 Machine Learning 工作室 UI 中的所有元件。 請務必導覽至全域 UI,並尋找 [登錄] 中樞。

下列螢幕擷取畫面顯示 Azure Machine Learning 工作室登錄中的模型。 如果您從作業輸出建立模型,然後將模型從工作區複製到登錄,您會看到模型具有定型該模型的作業連結。 您可以使用該連結導覽至定型作業,以檢閱用來定型模型的程式碼、環境和資料。

登錄中模型的螢幕快照。

將模型從登錄部署至工作區中的線上端點

在上一節中,您會將模型從登錄部署至工作區中的線上端點。 您可以選擇部署組織中您可以存取的任何工作區,前提是工作區的位置是登錄支援的位置之一。 如果您已在 dev 工作區中定型模型,而現在需要將模型部署至 testprod 工作區,同時保留用來定型模型的程式碼、環境和資料的歷程資訊,這項功能非常有用。

線上端點可以讓您透過 REST API 部署模型並提交推斷要求。 如需詳細資訊,請參閱如何使用線上端點來部署和評分機器學習模型

建立線上端點。

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

model: 行更新為位於 cli/jobs/pipelines-with-components/nyc_taxi_data_regression 資料夾的 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

下一步