搭配使用受控識別與 Azure Machine Learning CLI v1

適用於:Python SDK azureml v1

適用於:Azure CLI ml 延伸模組 v1

受控識別可讓您為工作區設定「存取資源所需的最低權限」。

以可靠方式設定 Azure Machine Learning 工作區時,請務必確定與工作區相關聯的不同服務具有正確的存取層級。 例如,在機器學習工作流程期間,工作區需要存取 Azure Container Registry (ACR) 中的 Docker 映像,以及用於定型資料的儲存體帳戶。

此外,受控識別可讓您精細控制權限,例如,您可以授與或撤銷從特定計算資源存取特定 ACR。

在本文中,您將了解受控識別的用途:

  • 針對 Azure Machine Learning 工作區設定和使用 ACR,而不需要讓管理使用者存取 ACR。
  • 存取工作區外部的私人 ACR,以提取基礎映像來定型或推斷。
  • 以使用者指派的受控識別來建立工作區,以存取相關聯的資源。

Prerequisites

設定受控識別

在某些情況下,必須禁止管理使用者存取 Azure Container Registry。 例如,ACR 可能共用,而您必須禁止其他使用者的管理員存取權。 或者,訂用帳戶等級原則不允許建立已啟用管理使用者的 ACR。

重要

使用 Azure Machine Learning 在 Azure 容器執行個體 (ACI) 上推斷時,ACR 上需要有管理使用者存取權。 如果您想要將模型部署至 ACI 以進行推斷,請勿停用該功能。

當您建立未啟用管理使用者存取權的 ACR 時,將會使用受控識別來存取 ACR,以建立和提取 Docker 映像。

當您建立工作區時,您可以自備已停用管理使用者的 ACR。 或者,讓 Azure Machine Learning 建立工作區 ACR,之後再停用管理使用者。

自備 ACR

如果訂用帳戶原則不允許 ACR 管理使用者,您應該先建立不具有管理使用者的 ACR,然後將 ACR 與工作區產生關聯。 此外,如果您現有的 ACR 已停用管理使用者,則可以將 ACR 附加至工作區。

從 Azure CLI 建立 ACR 而不設定 --admin-enabled 引數,或從 Azure 入口網站建立,而不啟用管理使用者。 然後,在建立 Azure Machine Learning 工作區時,指定 ACR 的 Azure 資源識別碼。 下列範例示範如何建立使用現有 ACR 的新 Azure Machine Learning 工作區:

提示

若要取得 --container-registry 參數的值,請使用 az acr show 命令來顯示 ACR 的資訊。 id 欄位 ACR 的資源識別碼。

az ml workspace create -w <workspace name> \
-g <workspace resource group> \
-l <region> \
--container-registry /subscriptions/<subscription id>/resourceGroups/<acr resource group>/providers/Microsoft.ContainerRegistry/registries/<acr name>

讓 Azure Machine Learning 服務建立工作區 ACR

如果您不自備 ACR,當您執行的作業需要 ACR 時,Azure Machine Learning 服務會為您建立 ACR。 例如,將定型執行提交至 Machine Learning Compute、建立環境,或部署 Web 服務端點。 工作區建立的 ACR 會啟用管理使用者,而您需要手動停用管理使用者。

  1. 建立新的工作區

    az ml workspace show -n <my workspace> -g <my resource group>
    
  2. 執行的動作需要 ACR。 例如,定型模型的教學課程

  3. 取得叢集建立的 ACR 名稱:

    az ml workspace show -w <my workspace> \
    -g <my resource group>
    --query containerRegistry
    

    此命令會傳回類似下列文字的值。 您只需要文字的最後部分,也就是 ACR 執行個體名稱:

    /subscriptions/<subscription id>/resourceGroups/<my resource group>/providers/MicrosoftContainerReggistry/registries/<ACR instance name>
    
  4. 更新 ACR 以停用管理使用者:

    az acr update --name <ACR instance name> --admin-enabled false
    

建立具有受控識別的計算,以存取 Docker 映像來定型

若要存取工作區 ACR,請建立機器學習計算叢集並啟用系統指派的受控識別。 在建立計算時,您可以從 Azure 入口網站或工作室啟用身分識別,或從 Azure CLI 使用下列命令來啟用。 如需詳細資訊,請參閱對計算叢集使用受控識別

使用 AmlComputeProvisioningConfiguration 建立計算叢集時,請使用 identity_type 參數來設定受控識別類型。

工作區 ACR 的 ACRPull 角色會自動授與受控識別,以允許提取 Docker 映像來定型。

注意

在建立工作區 ACR 之前,如果您先建立計算,則必須手動指派 ACRPull 角色。

從私人 ACR 存取基礎映像

Azure Machine Learning 使用的 Docker 基礎映像,預設來自 Microsoft 管理的公用存放庫。 然後會根據這些映像,建立定型或推斷環境。 如需詳細資訊,請參閱什麼是 ML 環境?

若要使用企業內部的自訂基礎映像,您可以使用受控識別來存取私人 ACR。 有兩個使用案例:

  • 使用基礎映像依原樣定型。
  • 以自訂映像為基礎,建立 Azure Machine Learning 受控映像。

將 Docker 基礎映像提取至機器學習計算叢集來依原樣定型

如先前所述,建立機器學習計算叢集並啟用系統指派的受控識別。 然後,決定受控識別的主體識別碼。

適用於:Azure CLI ml 延伸模組 v1

az ml computetarget amlcompute identity show --name <cluster name> -w <workspace> -g <resource group>

您可以選擇更新計算叢集,以指派使用者指派的受控識別:

適用於:Azure CLI ml 延伸模組 v1

az ml computetarget amlcompute identity assign --name <cluster name> \
-w $mlws -g $mlrg --identities <my-identity-id>

若要允許計算叢集提取基礎映像,請將私人 ACR 的 ACRPull 角色授與受控服務識別

az role assignment create --assignee <principal ID> \
--role acrpull \
--scope "/subscriptions/<subscription ID>/resourceGroups/<private ACR resource group>/providers/Microsoft.ContainerRegistry/registries/<private ACR name>"

最後,提交定型執行時,請在環境定義中指定基礎映像位置。

適用於:Python SDK azureml v1

from azureml.core import Environment
env = Environment(name="private-acr")
env.docker.base_image = "<ACR name>.azurecr.io/<base image repository>/<base image version>"
env.python.user_managed_dependencies = True

重要

若要確保基礎映像直接提取至計算資源,請設定 user_managed_dependencies = True,不要指定 Dockerfile。 否則,Azure Machine Learning 服務會嘗試建立新的 Docker 映像,而且失敗,因為只有計算叢集有存取權從 ACR 提取基礎映像。

將 Azure Machine Learning 受控環境加入私人 ACR 的基礎映像中來定型或推斷

適用於:Azure CLI ml 延伸模組 v1

在此情況下,Azure Machine Learning 服務根據您從私人 ACR 提供的基礎映像,建立定型或推斷環境。 因為是在工作區 ACR 上使用 ACR 工作進行映像組建工作,您必須執行更多步驟以允許存取。

  1. 建立使用者指派的受控識別,並將私人 ACR 的 ACRPull 存取權授與身分識別。

  2. 將上一個步驟中使用者指派的受控識別上的「受控識別操作員」角色,授與工作區系統指派的受控識別。 此角色允許工作區將使用者指派的受控識別指派給 ACR 工作,以建立受控環境。

    1. 針對工作區系統指派的受控識別,取得其主體識別碼:

      az ml workspace show -w <workspace name> -g <resource group> --query identityPrincipalId
      
    2. 授與受控識別操作員角色:

      az role assignment create --assignee <principal ID> --role managedidentityoperator --scope <user-assigned managed identity resource ID>
      

      使用者指派的受控識別資源識別碼是使用者所指派身分識別的 Azure 資源識別碼,格式為 /subscriptions/<subscription ID>/resourceGroups/<resource group>/providers/Microsoft.ManagedIdentity/userAssignedIdentities/<user-assigned managed identity name>

  3. 在工作區連線中,使用 Workspace.set_connection 方法指定使用者指派的受控識別的外部 ACR 和用戶端識別碼:

    適用於:Python SDK azureml v1

    workspace.set_connection(
        name="privateAcr", 
        category="ACR", 
        target = "<acr url>", 
        authType = "RegistryConnection", 
        value={"ResourceId": "<user-assigned managed identity resource id>", "ClientId": "<user-assigned managed identity client ID>"})
    
  4. 完成設定之後,您就可以在建立定型或推斷的環境時,使用私人 ACR 中的基礎映像。 下列程式碼片段示範如何在環境定義中指定基礎映像 ACR 和映像名稱:

    適用於:Python SDK azureml v1

    from azureml.core import Environment
    
    env = Environment(name="my-env")
    env.docker.base_image = "<acr url>/my-repo/my-image:latest"
    

    您可以選擇在環境定義本身,使用 RegistryIdentity 來指定受控識別資源 URL 和用戶端識別碼。 如果您明確使用登錄身分識別,則會覆寫先前指定的任何工作區連線:

    適用於:Python SDK azureml v1

    from azureml.core.container_registry import RegistryIdentity
    
    identity = RegistryIdentity()
    identity.resource_id= "<user-assigned managed identity resource ID>"
    identity.client_id="<user-assigned managed identity client ID>"
    env.docker.base_image_registry.registry_identity=identity
    env.docker.base_image = "my-acr.azurecr.io/my-repo/my-image:latest"
    

使用 Docker 映像來推斷

如先前所述設定不具有管理使用者的 ACR 之後,您不需要 Azure Kubernetes Service (AKS) 中的系統管理金鑰,就可以存取 Docker 映像來推斷。 當您建立 AKS 或將 AKS 附加至工作區時,工作區 ACR 的 ACRPull 存取權會自動指派給叢集的服務主體。

注意

如果您自備 AKS 叢集,叢集必須已啟用服務主體,而不是受控識別。

建立具有使用者所指派受控識別的工作區

建立工作區時,您可以帶入使用者指派的受控識別,以用來存取相關聯的資源:ACR、KeyVault、Storage 和 App Insights。

重要

使用使用者指派的受控識別建立工作區時,您必須自行建立相關聯的資源,並授與這些資源的受控識別角色。 使用角色指派 ARM 範本進行指派。

使用 Azure CLI 或 Python SDK 來建立工作區。 使用 CLI 時,請使用 --primary-user-assigned-identity 參數來指定識別碼。 使用 SDK 時,請使用 primary_user_assigned_identity。 以下是在 Azure CLI 和 Python 中使用這些參數來建立新工作區的範例:

Azure CLI

適用於:Azure CLI ml 延伸模組 v1

az ml workspace create -w <workspace name> -g <resource group> --primary-user-assigned-identity <managed identity ARM ID>

Python

適用於:Python SDK azureml v1

from azureml.core import Workspace

ws = Workspace.create(name="workspace name", 
    subscription_id="subscription id", 
    resource_group="resource group name",
    primary_user_assigned_identity="managed identity ARM ID")

您也可以使用 ARM 範本,建立具有使用者所指派受控識別的工作區。

如果工作區具有用於加密的客戶自控金鑰,您可以傳入使用者指派的受控識別,以從儲存體向 Key Vault 驗證。 使用 user-assigned-identity-for-cmk-encryption (CLI) 或 user_assigned_identity_for_cmk_encryption (SDK) 來傳入受控識別。 此受控識別與工作區主要使用者指派的受控識別可以相同或不同。

後續步驟