透過登錄跨工作區共用模型、元件和環境
Azure Machine Learning 登錄可讓您在組織內跨工作區共同作業。 您可以使用登錄共用模型、元件和環境。
您想要在多個工作區中使用同一組模型、元件和環境的案例有兩個:
- 跨工作區 MLOps:您在
dev
工作區中定型模型,且必須將其部署至test
和prod
工作區。 在此情況下,您想要擁有端點至部署該模型的test
或prod
工作區之間的端對端歷程,以及在dev
工作區中用來定型模型的定型作業、計量、程式碼、資料和環境。 - 在不同小組之間共用和重複使用模型和管線:共用和重複使用可以改善共同作業和生產力。 在此案例中,您可能想要將已定型的模型和用來定型模型的相關聯元件和環境發佈至中央目錄。 其他小組的同事可以從該處搜尋您共用的資產,然後在自己的實驗中重複使用。
在本文中,您將學會如何:
- 在登錄中建立環境和元件。
- 使用登錄中的元件,以在工作區中提交模型定型作業。
- 在登錄中註冊定型模型。
- 將模型從登錄部署至工作區中的線上端點,然後提交推斷要求。
必要條件
遵循本文中的步驟之前,請確定您已滿足下列必要條件:
- Azure 訂用帳戶。 如果您沒有 Azure 訂用帳戶,請在開始前建立免費帳戶。 試用免費或付費版本的 Azure Machine Learning。
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
命令來查看目前的預設值。- 使用您的 Azure 訂用帳戶識別碼來取代
複製範例存放庫
本文中的程式碼範例以範例存放庫中的 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) 等文章。
提示
相同的 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
命令的輸出中環境的 name
和 version
,然後將其與 az ml environment show
命令搭配使用,如下所示。 下一節,您在登錄中建立元件時,將會需要 name
和 version
。
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 管線可重複使用的建置組塊。 您可以將個別管線步驟中的程式碼、命令、環境、輸入介面和輸出介面封裝至元件。 然後,您可以在多個管線之間重複使用元件,而不需要在每次撰寫不同的管線時擔心移植的相依性和程式碼。
在工作區中建立元件可讓您在該工作區內的任何管線作業中使用該元件。 在登錄中建立元件可讓您在組織內任何工作區的任何管線中使用該元件。 在登錄中建立元件是建置模組化可重複使用公用程式或共用定型工作的絕佳方式,可用於組織內不同小組的實驗。
如需元件的詳細資訊,請參閱下列文章:
-
重要
登錄僅支援具名資產 (data/model/component/environment)。 若要參考登錄中的資產,您必須先在登錄中建立它。 特別是針對管線元件案例,如果您想要在管線元件中參考元件或環境,您必須先在登錄中建立元件或環境。
請確定您已位於資料夾 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
命令的輸出中元件的 name
和 version
,然後將其與 az ml component show
命令搭配使用,如下所示。 下一節,當您在工作區中建立提交定型作業時,將會需要 name
和 version
。
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-workspace
、test-workspace
和 prod-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 中的模型管理。 我們將探討兩種在登錄中建立模型的兩種不同方式。 第一個方法是從本機檔案。 第二個方法是將工作區中註冊的模型複製到登錄。
在這兩個選項中,您將使用 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
命令的輸出中模型的name
和version
,然後將其與az ml model show
命令搭配使用,如下所示。 下一節,當您將模型部署至線上端點以進行推斷時,將會需要name
和version
。
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
工作區中定型模型,而現在需要將模型部署至 test
或 prod
工作區,同時保留用來定型模型的程式碼、環境和資料的歷程資訊,這項功能非常有用。
線上端點可以讓您透過 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-endpoint
和az ml online-deployment
命令。
清除資源
如果您不打算使用此部署,請將其刪除以降低成本。 下列範例會刪除端點和所有基礎部署:
az ml online-endpoint delete --name reg-ep-1234 --yes --no-wait