使用 Azure Machine Learning CLI、SDK 和 REST API 將模型定型
本文內容
適用於: Azure CLI ml 延伸模組 v2 (目前) Python SDK azure-ai-ml v2 (目前)
Azure Machine Learning 提供多種方式來提交 ML 定型作業。 在本文中,您將了解如何使用下列方法來提交作業:
適用於機器學習的 Azure CLI 延伸模組:ml
延伸模組也稱為 CLI v2。
適用於 Azure Machine Learning 的 Python SDK v2
REST API:CLI 和 SDK 所依據的 API。
必要條件
若要使用 REST API 資訊,您需要下列項目:
工作區中的服務主體 。 管理 REST 規定使用服務主體驗證 。
服務主體驗證權杖 。 請依照擷取服務主體驗證權杖 中的步驟來擷取此語彙基元。
curl 公用程式。 Windows 子系統 Linux 版 或任何 UNIX 發行版本中都有 curl 程式。
提示
在 PowerShell 中,curl
是 Invoke-WebRequest
的別名,而 curl -d "key=val" -X POST uri
會變成 Invoke-WebRequest -Body "key=val" -Method POST -Uri uri
。
雖然您可以從 PowerShell 呼叫 REST API,但是本文中的範例會假設您使用 Bash。
處理 JSON 的 jq 公用程式。 此公用程式用於從 REST API 呼叫傳回的 JSON 文件中擷取值。
複製範例存放庫
本文中的程式碼片段是以 Azure Machine Learning 範例 GitHub 存放庫 中的範例為基礎。 若要將存放庫複製到您的開發環境,請使用下列命令:
git clone --depth 1 https://github.com/Azure/azureml-examples
提示
使用 --depth 1
僅複製存放庫的最新認可,如此可縮短完成作業的時間。
範例作業
本文中的範例會使用鳶尾花資料集來定型 MLFlow 模型。
在雲端中定型
在雲端中定型時,您必須連線至 Azure Machine Learning 工作區,然後選取將用來執行定型作業的計算資源。
1.連線到工作區
提示
使用以下索引標籤來選取您想要用來將模型定型的方法。 選取索引標籤會自動將本文中的所有索引標籤切換至相同索引標籤。您可以隨時選取另一個索引標籤。
若要連線到工作區,您需要識別碼參數 - 訂用帳戶、資源群組和工作區名稱。 您將使用來自 azure.ai.ml
命名空間 MLClient
中的這些資料,以取得所需的 Azure Machine Learning 工作區。 若要進行驗證,請使用預設的 Azure 驗證 。 如需如何設定認證並連線至工作區的詳細資料,請參閱此範例 (英文)。
#import required libraries
from azure.ai.ml import MLClient
from azure.identity import DefaultAzureCredential
#Enter details of your Azure Machine Learning workspace
subscription_id = '<SUBSCRIPTION_ID>'
resource_group = '<RESOURCE_GROUP>'
workspace = '<AZUREML_WORKSPACE_NAME>'
#connect to the workspace
ml_client = MLClient(DefaultAzureCredential(), subscription_id, resource_group, workspace)
使用 Azure CLI 時,您需要識別碼參數 - 訂用帳戶、資源群組和工作區名稱。 雖然您可以為每個命令指定這些參數,但是您也可以設定將用於所有命令的預設。 使用下列命令來設定預設值。 將 <subscription ID>
、<Azure Machine Learning workspace name>
和 <resource group>
取代為您設定的值:
az account set --subscription <subscription ID>
az configure --defaults workspace=<Azure Machine Learning workspace name> group=<resource group>
本文中的 REST API 範例使用 $SUBSCRIPTION_ID
、$RESOURCE_GROUP
、$LOCATION
和 $WORKSPACE
預留位置。 將預留位置取代為您自己的值,如下所示:
$SUBSCRIPTION_ID
= 您的 Azure 訂用帳戶識別碼。
$RESOURCE_GROUP
:包含您工作區的 Azure 資源群組。
$LOCATION
:您工作區所在的 Azure 區域。
$WORKSPACE
:您 Azure Machine Learning 工作區的名稱。
$COMPUTE_NAME
:您 Azure Machine Learning 計算叢集的名稱。
管理 REST 需要服務主體驗證權杖 。 您可以使用下列命令來擷取權杖。 權杖會儲存在 $TOKEN
環境變數中:
TOKEN=$(az account get-access-token --query accessToken -o tsv)
服務提供者使用 api-version
引數來確保相容性。 api-version
引數變數因服務而異。 將 API 版本設定為變數,以顧及未來版本:
API_VERSION="2022-05-01"
當您使用 REST API 定型時,必須將資料和定型指令碼上傳至工作區可以存取的儲存體帳戶。 下列範例會取得工作區的儲存體資訊,並將其儲存到變數中,以便稍後使用:
# Get values for storage account
response=$(curl --location --request GET "https://management.azure.com/subscriptions/$SUBSCRIPTION_ID/resourceGroups/$RESOURCE_GROUP/providers/Microsoft.MachineLearningServices/workspaces/$WORKSPACE/datastores?api-version=$API_VERSION&isDefault=true" \
--header "Authorization: Bearer $TOKEN")
AZUREML_DEFAULT_DATASTORE=$(echo $response | jq -r '.value[0].name')
AZUREML_DEFAULT_CONTAINER=$(echo $response | jq -r '.value[0].properties.containerName')
export AZURE_STORAGE_ACCOUNT=$(echo $response | jq -r '.value[0].properties.accountName')
2.建立用於定型的計算資源
Azure Machine Learning 計算叢集是完全受控的計算資源,可用來執行定型作業。 在下列範例中,會建立名為 cpu-compute
的計算叢集。
from azure.ai.ml.entities import AmlCompute
# specify aml compute name.
cpu_compute_target = "cpu-cluster"
try:
ml_client.compute.get(cpu_compute_target)
except Exception:
print("Creating a new cpu compute target...")
compute = AmlCompute(
name=cpu_compute_target, size="STANDARD_D2_V2", min_instances=0, max_instances=4
)
ml_client.compute.begin_create_or_update(compute).result()
az ml compute create -n cpu-cluster --type amlcompute --min-instances 0 --max-instances 4
curl -X PUT \
"https://management.azure.com/subscriptions/$SUBSCRIPTION_ID/resourceGroups/$RESOURCE_GROUP/providers/Microsoft.MachineLearningServices/workspaces/$WORKSPACE/computes/$COMPUTE_NAME?api-version=$API_VERSION" \
-H "Authorization:Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{
"location": "'$LOCATION'",
"properties": {
"computeType": "AmlCompute",
"properties": {
"vmSize": "Standard_D2_V2",
"vmPriority": "Dedicated",
"scaleSettings": {
"maxNodeCount": 4,
"minNodeCount": 0,
"nodeIdleTimeBeforeScaleDown": "PT30M"
}
}
}
}'
提示
在幾秒鐘後傳回回應時,這僅表示已接受建立要求。 可能需要幾分鐘的時間,才能完成叢集建立。
3.提交訓練作業
若要執行此指令碼,您將使用 command
,其會執行位於 ./sdk/python/jobs/single-step/lightgbm/iris/src/ 底下的 main.py Python 指令碼。 此命令會透過將其以 job
的形式提交給 Azure Machine Learning 來加以執行。
注意
若要使用無伺服器計算 ,請刪除此程式碼中的 compute="cpu-cluster"
。
from azure.ai.ml import command, Input
# define the command
command_job = command(
code="./src",
command="python main.py --iris-csv ${{inputs.iris_csv}} --learning-rate ${{inputs.learning_rate}} --boosting ${{inputs.boosting}}",
environment="AzureML-lightgbm-3.2-ubuntu18.04-py37-cpu@latest",
inputs={
"iris_csv": Input(
type="uri_file",
path="https://azuremlexamples.blob.core.windows.net/datasets/iris.csv",
),
"learning_rate": 0.9,
"boosting": "gbdt",
},
compute="cpu-cluster",
)
# submit the command
returned_job = ml_client.jobs.create_or_update(command_job)
# get a URL for the status of the job
returned_job.studio_url
在上面的範例中,您已設定:
code
:要執行命令的程式碼所在位置的路徑
command
:要執行的命令
environment
- 執行定型指令碼所需的環境。 在此範例中,我們使用 Azure Machine Learning 所提供名為 AzureML-lightgbm-3.2-ubuntu18.04-py37-cpu
的策展或現成環境。 我們透過使用 @latest
指示詞使用此環境的最新版本。 您也可以指定基礎映像 Docker 映像,並在其上方指定 conda yaml,以使用自訂環境。
inputs
:使用命令名稱值組之輸入的字典。 索引鍵是作業內容中的輸入名稱,值則是輸入值。 會使用 ${{inputs.<input_name>}}
運算式在 command
中參考輸入。 若要使用檔案或資料夾作為輸入,您可以使用 Input
類別。 如需詳細資訊,請參閱 SDK 和 CLI v2 運算式 。
如需詳細資訊,請參閱參考文件 。
提交作業時,URL 會傳回至 Azure Machine Learning 工作室中的作業狀態。 使用 Studio UI 來檢視作業進度。 您也可以使用 returned_job.status
來檢查作業的目前狀態。
此範例中使用的 az ml job create
命令需要 YAML 作業定義檔案。 此範例中使用的檔案內容如下:
注意
若要使用無伺服器計算 ,請刪除此程式碼中的 compute: azureml:cpu-cluster"
。
$schema: https://azuremlschemas.azureedge.net/latest/commandJob.schema.json
code: src
command: >-
python main.py
--iris-csv ${{inputs.iris_csv}}
inputs:
iris_csv:
type: uri_file
path: https://azuremlexamples.blob.core.windows.net/datasets/iris.csv
environment: azureml:AzureML-lightgbm-3.3@latest
compute: azureml:cpu-cluster
display_name: lightgbm-iris-example
experiment_name: lightgbm-iris-example
description: Train a LightGBM model on the Iris dataset.
在上面,您已設定:
code
:要執行命令的程式碼所在位置的路徑
command
:要執行的命令
inputs
:使用命令名稱值組之輸入的字典。 索引鍵是作業內容中的輸入名稱,值則是輸入值。 會使用 ${{inputs.<input_name>}}
運算式在 command
中參考輸入。 如需詳細資訊,請參閱 SDK 和 CLI v2 運算式 。
environment
- 執行定型指令碼所需的環境。 在此範例中,我們使用 Azure Machine Learning 所提供名為 AzureML-lightgbm-3.3
的策展或現成環境。 我們透過使用 @latest
指示詞使用此環境的最新版本。 您也可以指定基礎映像 Docker 映像,並在其上方指定 conda yaml,以使用自訂環境。
若要提交作業,請使用下列命令。 定型作業的執行識別碼 (名稱) 會儲存在 $run_id
變數中:
run_id=$(az ml job create -f jobs/single-step/lightgbm/iris/job.yml --query name -o tsv)
您可以使用預存的執行識別碼來傳回作業的相關資訊。 --web
參數會開啟 Azure Machine Learning 工作室 Web UI,您可以在此鑽研作業的詳細資料:
az ml job show -n $run_id --web
作為作業提交的一部分,定型指令碼和資料必須上傳至 Azure Machine Learning 工作區可以存取的雲端儲存位置。
使用下列 Azure CLI 命令來上傳定型指令碼。 命令會指定包含定型所需檔案的目錄 ,而不是個別檔案。 如果您想要改為使用 REST 來上傳資料,請參閱放置 Blob 參考:
az storage blob upload-batch -d $AZUREML_DEFAULT_CONTAINER/testjob -s cli/jobs/single-step/lightgbm/iris/src/ --account-name $AZURE_STORAGE_ACCOUNT
建立定型資料的已建立版本參考。 在此範例中,資料已在雲端中,位於 https://azuremlexamples.blob.core.windows.net/datasets/iris.csv
。 如需參考資料的詳細資訊,請參閱 Azure Machine Learning 中的資料 :
DATA_VERSION=$RANDOM
curl --location --request PUT "https://management.azure.com/subscriptions/$SUBSCRIPTION_ID/resourceGroups/$RESOURCE_GROUP/providers/Microsoft.MachineLearningServices/workspaces/$WORKSPACE/data/iris-data/versions/$DATA_VERSION?api-version=$API_VERSION" \
--header "Authorization: Bearer $TOKEN" \
--header "Content-Type: application/json" \
--data-raw "{
\"properties\": {
\"description\": \"Iris dataset\",
\"dataType\": \"uri_file\",
\"dataUri\": \"https://azuremlexamples.blob.core.windows.net/datasets/iris.csv\"
}
}"
註冊定型指令碼的已建立版本參考,以便與作業搭配使用。 在此範例中,指令碼位置是您在步驟 1 中上傳至的預設儲存體帳戶和容器。 已建立版本定型程式碼的識別碼會傳回並儲存在 $TRAIN_CODE
變數中:
TRAIN_CODE=$(curl --location --request PUT "https://management.azure.com/subscriptions/$SUBSCRIPTION_ID/resourceGroups/$RESOURCE_GROUP/providers/Microsoft.MachineLearningServices/workspaces/$WORKSPACE/codes/train-lightgbm/versions/1?api-version=$API_VERSION" \
--header "Authorization: Bearer $TOKEN" \
--header "Content-Type: application/json" \
--data-raw "{
\"properties\": {
\"description\": \"Train code\",
\"codeUri\": \"https://$AZURE_STORAGE_ACCOUNT.blob.core.windows.net/$AZUREML_DEFAULT_CONTAINER/testjob\"
}
}" | jq -r '.id')
建立叢集將用來執行定型指令碼的環境。 在此範例中,我們使用 Azure Machine Learning 所提供名為 AzureML-lightgbm-3.2-ubuntu18.04-py37-cpu
的策展或現成環境。 下列命令會擷取環境版本清單,最新版本位於集合頂端。 jq
用於擷取最新 ([0]
) 版本的識別碼,然後儲存到 $ENVIRONMENT
變數中。
ENVIRONMENT=$(curl --location --request GET "https://management.azure.com/subscriptions/$SUBSCRIPTION_ID/resourceGroups/$RESOURCE_GROUP/providers/Microsoft.MachineLearningServices/workspaces/$WORKSPACE/environments/AzureML-lightgbm-3.2-ubuntu18.04-py37-cpu?api-version=$API_VERSION" --header "Authorization: Bearer $TOKEN" | jq -r .id)
最後,提交作業。 下列範例示範如何提交作業、參考定型程式碼識別碼、環境識別碼、輸入資料的 URL,以及計算叢集的識別碼。 作業輸出位置將會儲存在 $JOB_OUTPUT
變數中:
提示
必須是唯一的作業名稱。 在此範例中,uuidgen
會用來產生名稱的唯一值。
注意
若要使用無伺服器計算 ,請刪除此程式碼中的 \"computeId\":
行。
run_id=$(uuidgen)
curl --location --request PUT "https://management.azure.com/subscriptions/$SUBSCRIPTION_ID/resourceGroups/$RESOURCE_GROUP/providers/Microsoft.MachineLearningServices/workspaces/$WORKSPACE/jobs/$run_id?api-version=$API_VERSION" \
--header "Authorization: Bearer $TOKEN" \
--header "Content-Type: application/json" \
--data-raw "{
\"properties\": {
\"jobType\": \"Command\",
\"codeId\": \"$TRAIN_CODE\",
\"command\": \"python main.py --iris-csv \$AZURE_ML_INPUT_iris\",
\"environmentId\": \"$ENVIRONMENT\",
\"inputs\": {
\"iris\": {
\"jobInputType\": \"uri_file\",
\"uri\": \"https://azuremlexamples.blob.core.windows.net/datasets/iris.csv\"
}
},
\"experimentName\": \"lightgbm-iris\",
\"computeId\": \"/subscriptions/$SUBSCRIPTION_ID/resourceGroups/$RESOURCE_GROUP/providers/Microsoft.MachineLearningServices/workspaces/$WORKSPACE/computes/$COMPUTE_NAME\"
}
}"
註冊定型的模型。
下列範例示範如何在 Azure Machine Learning 工作區中註冊模型。
提示
定型作業傳回的 name
屬性會作為模型路徑的一部分使用。
from azure.ai.ml.entities import Model
from azure.ai.ml.constants import AssetTypes
run_model = Model(
path="azureml://jobs/{}/outputs/artifacts/paths/model/".format(returned_job.name),
name="run-model-example",
description="Model created from run.",
type=AssetTypes.MLFLOW_MODEL
)
ml_client.models.create_or_update(run_model)
提示
(儲存在 $run_id
變數中) 的名稱會作為模型路徑的一部分使用。
az ml model create -n sklearn-iris-example -v 1 -p runs:/$run_id/model --type mlflow_model
提示
(儲存在 $run_id
變數中) 的名稱會作為模型路徑的一部分使用。
curl --location --request PUT "https://management.azure.com/subscriptions/$SUBSCRIPTION_ID/resourceGroups/$RESOURCE_GROUP/providers/Microsoft.MachineLearningServices/workspaces/$WORKSPACE/models/sklearn/versions/1?api-version=$API_VERSION" \
--header "Authorization: Bearer $TOKEN" \
--header "Content-Type: application/json" \
--data-raw "{
\"properties\": {
\"modelType\": \"mlflow_model\",
\"modelUri\":\"runs:/$run_id/model\"
}
}"
下一步
既然您已將模型定型,請了解如何使用線上端點進行部署 。
如需更多範例,請參閱 Azure Machine Learning 範例 GitHub 存放庫。
如需本文中使用的 Azure CLI 命令、Python SDK 類別或 REST API 詳細資訊,請參閱下列參考文件: