使用 Azure 资源管理器模板创建 Azure 机器学习的工作区

本文介绍几种使用 Azure 资源管理器模板创建 Azure 机器学习工作区的方法。 使用资源管理器模板可以轻松地通过单个协调操作创建资源。 模板是一个 JSON 文档,定义部署所需的资源。 它还可以指定部署参数。 使用模板时,参数用于提供输入值。

有关详细信息,请参阅使用 Azure Resource Manager 模板部署应用程序

先决条件

限制

  • 创建新的工作区时,可以自动创建工作区所需的服务或使用现有的服务。 如果要使用来自不同于工作区所在的 Azure 订阅的现有服务,则必须在包含这些服务的订阅中注册 Azure 机器学习命名空间。 例如,在订阅 A 中创建一个使用订阅 B 中的存储帐户的工作区时,必须在订阅 B 中注册 Azure 机器学习命名空间,然后才能将此存储帐户用于该工作区。

    Azure 机器学习的资源提供程序是 Microsoft.MachineLearningServices。 有关如何查看它是否已注册以及如何注册的信息,请参阅 Azure 资源提供程序和类型一文。

    重要

    这仅适用于工作区创建期间提供的资源:Azure 存储帐户、Azure 容器注册表、Azure Key Vault 和 Application Insights。

  • 示例模板可能不会一直使用 Azure 机器学习的最新 API 版本。 使用此模板之前,建议对其进行修改以使用最新的 API 版本。 有关 Azure 机器学习的最新 API 版本的信息,请参阅 Azure 机器学习 REST API

    提示

    每项 Azure 服务都有自己的 API 版本集。 有关特定服务的 API 的信息,请查看 Azure REST API 参考中的服务信息。

    若要更新 API 版本,请查找资源类型的 "apiVersion": "YYYY-MM-DD" 条目,并将其更新为最新版本。 下面是 Azure 机器学习的条目示例:

    "type": "Microsoft.MachineLearningServices/workspaces",
    "apiVersion": "2020-03-01",
    

同一 VNet 中有多个工作区

模板不支持在同一 VNet 中部署多个 Azure 机器学习工作区。 这是因为模板会在部署过程中创建新的 DNS 区域。

如果要创建一个在同一 VNet 中部署多个工作区的模板,请以手动方式对此进行设置(使用 Azure 门户或 CLI),然后使用 Azure 门户生成一个模板

工作区资源管理器模板

可以在 Azure 快速入门模板 GitHub 存储库的 microsoft.machineleaerningservices/machine-learning-workspace-vnet 目录中找到本文档中使用的 Azure 资源管理器模板。

此模板创建以下 Azure 服务:

  • Azure 存储帐户
  • Azure Key Vault
  • Azure Application Insights
  • Azure 容器注册表
  • Azure 机器学习工作区

资源组是保存服务的容器。 Azure 机器学习工作区需要多种服务。

示例模板具有两个必需参数:

  • 将在其中创建资源的位置

    模板将使用你为大多数资源选择的位置。 例外的情况是 Application Insights 服务,它不像其他所有服务一样在所有位置都可用。 如果选择该服务不可用的位置,将会在中国东部 2 位置创建该服务。

  • workspaceName 是 Azure 机器学习工作区的易记名称。

    注意

    工作区名称不区分大小写。

    其他服务的名称将随机生成。

提示

当与本文档关联的模板创建了新的 Azure 容器注册表时,你还可以在无需创建容器注册表的情况下创建新工作区。 当你执行需要容器注册表的操作时,会创建容器注册表。 例如,训练或部署模型。

还可以在 Azure 资源管理器模板中引用现有的容器注册表或存储帐户,而不是创建一个新的。 执行此操作时,必须使用托管标识(预览),或启用容器注册表的管理员帐户

警告

为工作区创建 Azure 容器注册表后,请不要将其删除。 删除该注册表将损坏 Azure 机器学习工作区。

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

部署模板

若要部署模板,你必须创建资源组。

如果你首选使用图形用户界面,请参阅 Azure 门户部分。

az group create --name "examplegroup" --location "chinaeast2"

成功创建资源组后,使用以下命令来部署模板:

az deployment group create \
    --name "exampledeployment" \
    --resource-group "examplegroup" \
    --template-uri "https://raw.githubusercontent.com/Azure/azure-quickstart-templates/master/quickstarts/microsoft.machinelearningservices/machine-learning-workspace-vnet/azuredeploy.json" \
    --parameters workspaceName="exampleworkspace" location="chinaeast2"

默认情况下,作为模板的一部分创建的所有资源都是新的。 不过,你也可以选择使用现有资源。 可以通过向模板提供其他参数来使用现有资源。 例如,如果你想要使用现有的存储帐户,请将 storageAccountOption 值设置为 existing,并在 storageAccountName 参数中提供存储帐户的名称。

重要

若要使用现有 Azure 存储帐户,则该帐户不能是高级帐户(Premium_LRS 和 Premium_GRS)。 它也不能具有分层命名空间(与 Azure Data Lake Storage Gen2 一起使用)。 工作区的默认存储帐户不支持高级存储和分层命名空间。 工作区的默认存储帐户不支持高级存储和分层命名空间。 可以将高级存储或分层命名空间用于非默认存储帐户。

az deployment group create \
    --name "exampledeployment" \
    --resource-group "examplegroup" \
    --template-uri "https://raw.githubusercontent.com/Azure/azure-quickstart-templates/master/quickstarts/microsoft.machinelearningservices/machine-learning-workspace-vnet/azuredeploy.json" \
    --parameters workspaceName="exampleworkspace" \
      location="chinaeast2" \
      storageAccountOption="existing" \
      storageAccountName="existingstorageaccountname"

部署加密的工作区

以下示例模板演示如何创建具有三项设置的工作区:

  • 为工作区启用高保密性设置。 这将创建新 Azure Cosmos DB 实例。
  • 为工作区启用加密。
  • 使用现有的 Azure Key Vault 检索客户管理的密钥。 使用客户管理的密钥为工作区创建新 Azure Cosmos DB 实例。

重要

创建工作区后,无法更改机密数据、加密、密钥保管库 ID 或密钥标识符的设置。 要更改这些值,必须使用新值创建新工作区。

有关详细信息,请参阅客户管理的密钥

重要

在使用此模板之前,订阅必须满足一些特定要求:

  • 你必须具有包含加密密钥的现有 Azure Key Vault。
  • Azure Key Vault 必须位于计划创建 Azure 机器学习工作区的同一区域。
  • 必须指定 Azure Key Vault 的 ID 和加密密钥的 URI。

有关创建保管库和密钥的步骤,请参阅配置客户管理的密钥

要获取此模板所需的 cmk_keyvault(Key Vault 的 ID)和 resource_cmk_uri(密钥 URI)参数的值,请执行以下操作:

  1. 要获取 Key Vault ID,请使用以下命令:

    az keyvault show --name <keyvault-name> --query 'id' --output tsv	
    

    此命令会返回类似于 /subscriptions/{subscription-guid}/resourceGroups/<resource-group-name>/providers/Microsoft.KeyVault/vaults/<keyvault-name> 的值。

  2. 要获取客户托管密钥的 URI 值,请使用以下命令:

    az keyvault key show --vault-name <keyvault-name> --name <key-name> --query 'key.kid' --output tsv	
    

此命令会返回类似于 https://mykeyvault.vault.azure.cn/keys/mykey/{guid} 的值。

重要

创建工作区后,无法更改机密数据、加密、密钥保管库 ID 或密钥标识符的设置。 要更改这些值,必须使用新值创建新工作区。

若要允许使用客户管理的密钥,请在部署该模板时设置以下参数:

  • encryption_status 设置为 Enabled
  • cmk_keyvault 设置为在前面的步骤中获取的 cmk_keyvault 值。
  • resource_cmk_uri 设置为在前面的步骤中获取的 resource_cmk_uri 值。
az deployment group create \
    --name "exampledeployment" \
    --resource-group "examplegroup" \
    --template-uri "https://raw.githubusercontent.com/Azure/azure-quickstart-templates/master/quickstarts/microsoft.machinelearningservices/machine-learning-workspace-vnet/azuredeploy.json" \
    --parameters workspaceName="exampleworkspace" \
      location="chinaeast2" \
      encryption_status="Enabled" \
      cmk_keyvault="/subscriptions/{subscription-guid}/resourceGroups/<resource-group-name>/providers/Microsoft.KeyVault/vaults/<keyvault-name>" \
      resource_cmk_uri="https://mykeyvault.vault.azure.cn/keys/mykey/{guid}" \

使用客户管理的密钥时,Azure 机器学习会创建包含 Azure Cosmos DB 实例的另一个资源组。 有关详细信息,请参阅 Azure Cosmos DB 中的静态加密

你可为数据提供的一个附加配置是将 confidential_data 参数设置为 true。 为此,请执行以下操作:

  • 开始加密 Azure 机器学习计算群集的本地暂存磁盘(如果以前未在该订阅中创建任何群集)。 如果你之前在订阅中创建了群集,请创建一个支持票证,为你的计算群集启用暂存磁盘加密。

  • 在两次作业之间清理本地暂存磁盘。

  • 利用密钥保管库,将存储帐户、容器注册表和 SSH 帐户的凭据从执行层安全地传递到计算群集。

  • 启用 IP 筛选,以确保基础批处理池不会由除 AzureMachineLearningService 以外的任何外部服务调用。

    重要

    创建工作区后,无法更改机密数据、加密、密钥保管库 ID 或密钥标识符的设置。 要更改这些值,必须使用新值创建新工作区。

    有关详细信息,请参阅静态加密

将工作区部署到虚拟网络后面

通过将 vnetOption 参数值设置为 newexisting,可以在虚拟网络后面创建工作区使用的资源。

重要

对于容器注册表,仅支持“高级”SKU。

重要

Application Insights 不支持部署到虚拟网络后面。

仅将工作区部署到专用终结点后面

如果关联的资源不在虚拟网络后面,则可以将 privateEndpointType 参数设置为 AutoAprovalManualApproval,以将工作区部署到专用终结点后面。 对于新的和现有的工作区,都可以这样做。 更新现有工作区时,请使用现有工作区中的信息填写模板参数。

az deployment group create \
    --name "exampledeployment" \
    --resource-group "examplegroup" \
    --template-uri "https://raw.githubusercontent.com/Azure/azure-quickstart-templates/master/quickstarts/microsoft.machinelearningservices/machine-learning-workspace-vnet/azuredeploy.json" \
    --parameters workspaceName="exampleworkspace" \
      location="chinaeast2" \
      privateEndpointType="AutoApproval"

使用新的虚拟网络

若要在新的虚拟网络后面部署资源,请将 vnetOption 设置为 new 并为相应的资源提供虚拟网络设置。 下面的部署展示了如何部署其中的存储帐户资源位于新的虚拟网络后面的工作区。

az deployment group create \
    --name "exampledeployment" \
    --resource-group "examplegroup" \
    --template-uri "https://raw.githubusercontent.com/Azure/azure-quickstart-templates/master/quickstarts/microsoft.machinelearningservices/machine-learning-workspace-vnet/azuredeploy.json" \
    --parameters workspaceName="exampleworkspace" \
      location="chinaeast2" \
      vnetOption="new" \
      vnetName="examplevnet" \
      storageAccountBehindVNet="true"
      privateEndpointType="AutoApproval"

另外,你可以在虚拟网络后面部署多个或所有从属资源。

az deployment group create \
    --name "exampledeployment" \
    --resource-group "examplegroup" \
    --template-uri "https://raw.githubusercontent.com/Azure/azure-quickstart-templates/master/quickstarts/microsoft.machinelearningservices/machine-learning-workspace-vnet/azuredeploy.json" \
    --parameters workspaceName="exampleworkspace" \
      location="chinaeast2" \
      vnetOption="new" \
      vnetName="examplevnet" \
      storageAccountBehindVNet="true" \
      keyVaultBehindVNet="true" \
      containerRegistryBehindVNet="true" \
      containerRegistryOption="new" \
      containerRegistrySku="Premium"
      privateEndpointType="AutoApproval"

使用现有虚拟网络和资源

若要使用现有的关联资源来部署工作区,你必须将 vnetOption 参数设置为 existing,并设置子网参数。 但是,在进行部署之前,你需要在虚拟网络中为每个资源创建服务终结点。 与使用新的虚拟网络部署类似,在虚拟网络后面可以有一个资源或全部资源。

重要

子网应具有 Microsoft.Storage 服务终结点

重要

子网不允许创建专用终结点。 禁用专用终结点以启用子网。

  1. 为资源启用服务终结点。

    az network vnet subnet update --resource-group "examplegroup" --vnet-name "examplevnet" --name "examplesubnet" --service-endpoints "Microsoft.Storage"
    az network vnet subnet update --resource-group "examplegroup" --vnet-name "examplevnet" --name "examplesubnet" --service-endpoints "Microsoft.KeyVault"
    az network vnet subnet update --resource-group "examplegroup" --vnet-name "examplevnet" --name "examplesubnet" --service-endpoints "Microsoft.ContainerRegistry"
    
  2. 部署工作区

    az deployment group create \
    --name "exampledeployment" \
    --resource-group "examplegroup" \
    --template-uri "https://raw.githubusercontent.com/Azure/azure-quickstart-templates/master/quickstarts/microsoft.machinelearningservices/machine-learning-workspace-vnet/azuredeploy.json" \
    --parameters workspaceName="exampleworkspace" \
      location="chinaeast2" \
      vnetOption="existing" \
      vnetName="examplevnet" \
      vnetResourceGroupName="examplegroup" \
      storageAccountBehindVNet="true" \
      keyVaultBehindVNet="true" \
      containerRegistryBehindVNet="true" \
      containerRegistryOption="new" \
      containerRegistrySku="Premium" \
      subnetName="examplesubnet" \
      subnetOption="existing"
      privateEndpointType="AutoApproval"
    

使用 Azure 门户

  1. 遵循从自定义模板部署资源中的步骤。 进入“选择模板”界面后,选择“快速入门”条目。 出现该条目时,请选择标记为“单击此处打开模板存储库”的链接。 利用此链接,你能快速找到 Azure 快速入门模板存储库中的 quickstarts 目录。

  2. 在快速入门模板列表中,选择 microsoft.machinelearningservices。 最后,选择 Deploy to Azure

  3. 出现此模板后,根据你的部署方案,提供以下必需信息和任何其他参数。

    • 订阅:选择用于这些资源的 Azure 订阅。
    • 资源组:选择或创建一个用于包含服务的资源组。
    • 地区:选择将在其中创建资源的 Azure 区域。
    • 工作区名称:要创建的 Azure 机器学习工作区所用的名称。 工作区名称的长度必须为 3 到 33 个字符。 只能包含字母数字字符和“-”。
    • 位置:选择要在其中创建资源的位置。
  4. 选择“查看 + 创建”。

  5. 在“查看 + 创建”屏幕中,同意列出的条款和条件,并选择“创建”。

有关详细信息,请参阅从自定义模板部署资源

疑难解答

资源提供程序错误

创建 Azure 机器学习工作区或工作区使用的资源时,可能会收到类似于以下消息的错误:

  • No registered resource provider found for location {location}
  • The subscription is not registered to use namespace {resource-provider-namespace}

大多数资源提供程序会自动注册,但并非全部。 如果收到此消息,则需要注册所提到的提供程序。

下表包含 Azure 机器学习所需的资源提供程序的列表:

资源提供程序 为什么需要它
Microsoft.MachineLearningServices 创建 Azure 机器学习工作区。
Microsoft.Storage Azure 存储帐户用作该工作区的默认存储。
Microsoft.ContainerRegistry Azure 容器注册表被工作区用来生成 Docker 映像。
Microsoft.KeyVault 该工作区使用 Azure Key Vault 来存储机密。
Microsoft.Notebooks Azure 机器学习计算实例上集成的笔记本。
Microsoft.ContainerService 如果计划将训练后的模型部署到 Azure Kubernetes 服务。

如果计划将客户管理的密钥与 Azure 机器学习一起使用,则必须注册以下服务提供程序:

资源提供程序 为什么需要它
Microsoft.DocumentDB 用于记录工作区元数据的 Azure CosmosDB 实例。
Microsoft.Search Azure 搜索为工作区提供索引编制功能。

如果打算将托管虚拟网络与 Azure 机器学习配合使用,必须注册 Microsoft.Network 资源提供程序。 为托管虚拟网络创建专用终结点时,工作区会使用此资源提供程序。

有关注册资源提供程序的信息,请参阅解决资源提供程序注册错误

Azure Key Vault 访问策略和 Azure 资源管理器模板

使用 Azure 资源管理器模板多次创建工作区和关联的资源(包括 Azure Key Vault)时。 例如,在持续集成和部署管道过程中,对同一参数多次使用模板。

大多数通过模板的资源创建操作都是幂等的,但 Key Vault 每次使用模板时都将清除访问策略。 清除访问策略会中断任何使用该访问的现有工作区对 Key Vault 的访问。 例如,Azure Notebooks VM 的停止/创建功能可能会失败。

若要避免此问题,我们建议运用以下方法之一:

  • 请不要对同一个参数多次部署模板。 或是在使用模板重新创建之前删除现有资源。

  • 检查 Key Vault 访问策略,然后使用这些策略设置模板的 accessPolicies 属性。 若要查看访问策略,请使用以下 Azure CLI 命令:

    az keyvault show --name mykeyvault --resource-group myresourcegroup --query properties.accessPolicies
    

    若要详细了解如何使用模板的 accessPolicies 部分,请参阅 AccessPolicyEntry 对象参考

  • 查看 Key Vault 资源是否已存在。 如果是这样,请不要通过模板重新创建它。 例如,若要使用现有 Key Vault 而不是创建一个新的,请对模板进行以下更改:

    • 添加一个参数,该参数接受现有 Key Vault 资源的 ID:

      "keyVaultId":{
        "type": "string",
        "metadata": {
          "description": "Specify the existing Key Vault ID."
        }
      }
      
    • 删除用于创建 Key Vault 资源的部分:

      {
        "type": "Microsoft.KeyVault/vaults",
        "apiVersion": "2018-02-14",
        "name": "[variables('keyVaultName')]",
        "location": "[parameters('location')]",
        "properties": {
          "tenantId": "[variables('tenantId')]",
          "sku": {
            "name": "standard",
            "family": "A"
          },
          "accessPolicies": [
          ]
        }
      },
      
    • 从工作区的 dependsOn 部分删除"[resourceId('Microsoft.KeyVault/vaults', variables('keyVaultName'))]", 行。 另请更改工作区的 properties 部分中的 keyVault 条目,使之引用 keyVaultId 参数:

      {
        "type": "Microsoft.MachineLearningServices/workspaces",
        "apiVersion": "2019-11-01",
        "name": "[parameters('workspaceName')]",
        "location": "[parameters('location')]",
        "dependsOn": [
          "[resourceId('Microsoft.Storage/storageAccounts', variables('storageAccountName'))]",
          "[resourceId('Microsoft.Insights/components', variables('applicationInsightsName'))]"
        ],
        "identity": {
          "type": "systemAssigned"
        },
        "sku": {
          "tier": "[parameters('sku')]",
          "name": "[parameters('sku')]"
        },
        "properties": {
          "friendlyName": "[parameters('workspaceName')]",
          "keyVault": "[parameters('keyVaultId')]",
          "applicationInsights": "[resourceId('Microsoft.Insights/components',variables('applicationInsightsName'))]",
          "storageAccount": "[resourceId('Microsoft.Storage/storageAccounts/',variables('storageAccountName'))]"
        }
      }
      

    完成这些更改后,可以在运行模板时指定现有 Key Vault 资源的 ID。 然后,模板会通过将工作区的 keyVault 属性设置为其 ID 来重用 Key Vault。

    若要获取 Key Vault 的 ID,可以引用原始模板作业的输出或使用 Azure CLI。 以下命令是使用 Azure CLI 获取 Key Vault 资源 ID 的示例:

    az keyvault show --name mykeyvault --resource-group myresourcegroup --query id
    

    此命令返回类似于以下文本的值:

    /subscriptions/{subscription-guid}/resourceGroups/myresourcegroup/providers/Microsoft.KeyVault/vaults/mykeyvault
    

后续步骤