你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

使用 CLI v1 创建 Azure 机器学习计算群集

适用于:Azure CLI ml 扩展 v1Python SDK azureml v1

了解如何在 Azure 机器学习工作区中创建和管理计算群集

可以使用 Azure 机器学习计算群集在云中的 CPU 或 GPU 计算节点群集之间分配训练或批量推理过程。 有关包括 GPU 的 VM 大小的详细信息,请参阅 GPU 优化的虚拟机大小

在本文中,将学习以下内容:

  • 创建计算群集
  • 降低计算群集成本
  • 为群集设置托管标识

先决条件

什么是计算群集?

Azure 机器学习计算群集是一个托管的计算基础结构,可让你轻松创建单节点或多节点计算。 计算群集是可以与工作区中的其他用户共享的资源。 提交作业时,计算会自动扩展,并可以放入 Azure 虚拟网络。 计算群集也支持在虚拟网络中部署非公共 IP。 计算在容器化环境中执行,将模型的依赖项打包在 Docker 容器中。

计算群集可以在虚拟网络环境中安全地运行作业,无需企业打开 SSH 端口。 作业在容器化环境中执行,并将模型依赖项打包到 Docker 容器中。

限制

  • 可以在不包含你的工作区的其他区域和 VNet 中创建计算群集。 但是,此功能仅适用于 SDK v2、CLI v2 或工作室。 有关详细信息,请参阅安全训练环境的 v2 版本

  • 目前只支持通过 ARM 模板来创建(而非更新)群集。 对于更新计算,目前建议使用 SDK、Azure CLI 或 UX。

  • Azure 机器学习计算对可以分配的核心数等属性实施默认限制。 有关详细信息,请参阅管理和请求 Azure 资源的配额

  • Azure 允许你在资源上放置锁,这样这些资源就无法被删除,或者会处于只读状态。 请勿将资源锁应用于包含工作区的资源组。 将锁应用于包含工作区的资源组会阻止对 Azure 机器学习计算群集进行缩放操作。 若要详细了解如何锁定资源,请参阅锁定资源以防止意外更改

提示

一般情况下,只要所需核心数方面的配额足够,群集就可以扩展到多达 100 个节点。 默认情况下,设置群集时会启用群集节点之间的通信(例如,为了支持 MPI 作业)。 但是,可以将群集扩展到数千个节点,只需提交支持票证并请求将你的订阅、工作区或特定群集加入允许列表以禁用节点间通信即可。

创建

时间估计:大约 5 分钟。

可在不同的运行中重复使用 Azure 机器学习计算。 计算可与工作区中的其他用户共享,并在每次运行之后保留,它会根据提交的运行数以及群集上设置的 max_nodes 自动纵向扩展或缩减节点。 min_nodes 设置控制可用节点数的下限。

每个区域每个 VM 系列配额和创建计算群集时应用的区域总配额的专用内核是统一的,并与 Azure 机器学习训练计算实例配额共享。

重要

若要避免在没有作业运行时产生费用,请将最小节点数设置为 0。 此设置允许 Azure 机器学习在不使用节点时取消分配这些节点。 值大于 0 将使该数量的节点保持运行状态,即使它们未被使用也是如此。

计算在不使用时自动缩减为零个节点。 按需创建专用 VM 来运行作业。

若要在 Python 中创建持久性 Azure 机器学习计算资源,请指定 vm_sizemax_nodes 属性。 然后,Azure 机器学习将对其他属性使用智能默认值。

  • vm_size:Azure 机器学习计算创建的节点的 VM 系列。
  • max_nodes:在 Azure 机器学习计算中运行作业时自动扩展到的最大节点数。

适用于:Python SDK azureml v1

from azureml.core.compute import ComputeTarget, AmlCompute
from azureml.core.compute_target import ComputeTargetException

# Choose a name for your CPU cluster
cpu_cluster_name = "cpucluster"

# Verify that cluster does not exist already
try:
    cpu_cluster = ComputeTarget(workspace=ws, name=cpu_cluster_name)
    print('Found existing cluster, use it.')
except ComputeTargetException:
    # To use a different region for the compute, add a location='<region>' parameter
    compute_config = AmlCompute.provisioning_configuration(vm_size='STANDARD_D2_V2',
                                                           max_nodes=4)
    cpu_cluster = ComputeTarget.create(ws, cpu_cluster_name, compute_config)

cpu_cluster.wait_for_completion(show_output=True)

还可以在创建 Azure 机器学习计算时配置多个高级属性。 使用这些属性可以创建固定大小的持久性群集,或者在订阅中的现有 Azure 虚拟网络内创建持久性群集。 有关详细信息,请参阅 AmlCompute 类

警告

在设置 location 参数时,如果它是你的工作区或数据存储所在区域以外的区域,则可能会出现网络延迟加重和数据传输成本增加的情况。 在创建群集以及在该群集上运行作业时,可能会存在这样的延迟和成本。

降低计算群集成本

也可以选择使用低优先级 VM 来运行部分或全部工作负载。 这些 VM 的可用性未得到保证,在使用时可能会被占用。 必须重启已占用的作业。

适用于:Python SDK azureml v1

compute_config = AmlCompute.provisioning_configuration(vm_size='STANDARD_D2_V2',
                                                            vm_priority='lowpriority',
                                                            max_nodes=4)

设置托管标识

Azure 机器学习计算群集还支持使用托管标识来验证对 Azure 资源的访问,而不需要在代码中包含凭据。 托管标识分为两种类型:

  • 系统分配的托管标识会在 Azure 机器学习计算群集和计算实例上直接启用。 系统分配的标识的生命周期直接绑定到计算群集或实例。 如果计算群集或实例遭删除,Azure 会自动清理 Microsoft Entra ID 中的凭据和标识。
  • 用户分配的托管标识是通过 Azure 托管标识服务提供的独立 Azure 资源。 可以将一个用户分配的托管标识分配给多个资源,并根据需要将其保留任意长的时间。 此托管标识需要预先创建,然后作为必需参数 identity_id 传递。

适用于:Python SDK azureml v1

  • 在预配配置中配置托管标识:

    • 在名为 ws 的工作区中创建的系统分配的托管标识

      # configure cluster with a system-assigned managed identity
      compute_config = AmlCompute.provisioning_configuration(vm_size='STANDARD_D2_V2',
                                                              max_nodes=5,
                                                              identity_type="SystemAssigned",
                                                              )
      cpu_cluster_name = "cpu-cluster"
      cpu_cluster = ComputeTarget.create(ws, cpu_cluster_name, compute_config)
      
    • 在名为 ws 的工作区中创建的用户分配的托管标识

      # configure cluster with a user-assigned managed identity
      compute_config = AmlCompute.provisioning_configuration(vm_size='STANDARD_D2_V2',
                                                              max_nodes=5,
                                                              identity_type="UserAssigned",
                                                              identity_id=['/subscriptions/<subcription_id>/resourcegroups/<resource_group>/providers/Microsoft.ManagedIdentity/userAssignedIdentities/<user_assigned_identity>'])
      
      cpu_cluster_name = "cpu-cluster"
      cpu_cluster = ComputeTarget.create(ws, cpu_cluster_name, compute_config)
      
  • 将托管标识添加到名为 cpu_cluster 的现有计算群集

    • 系统分配的托管标识:

      # add a system-assigned managed identity
      cpu_cluster.add_identity(identity_type="SystemAssigned")
      
    • 用户分配的托管标识:

      # add a user-assigned managed identity
      cpu_cluster.add_identity(identity_type="UserAssigned", 
                                  identity_id=['/subscriptions/<subcription_id>/resourcegroups/<resource_group>/providers/Microsoft.ManagedIdentity/userAssignedIdentities/<user_assigned_identity>'])
      

注意

Azure 机器学习计算群集只支持一个系统分配的标识或支持多个用户分配的标识,而不能同时支持这二者。

托管标识用法

默认托管标识是系统分配的托管标识或第一个用户分配的托管标识。

在运行期间,一个标识有两种应用:

  1. 系统使用标识来设置用户的存储装载、容器注册表和数据存储。

    • 在这种情况下,系统将使用默认托管标识。
  2. 用户应用标识以便从已提交运行的代码中访问资源

    • 在这种情况下,请提供与要用于检索凭据的托管标识对应的 client_id。
    • 或者,通过 DEFAULT_IDENTITY_CLIENT_ID 环境变量获取用户分配的标识的客户端 ID。

    例如,若要使用默认托管标识检索数据存储的令牌,请执行以下操作:

    client_id = os.environ.get('DEFAULT_IDENTITY_CLIENT_ID')
    credential = ManagedIdentityCredential(client_id=client_id)
    token = credential.get_token('https://storage.azure.com/')
    

疑难解答

如果用户在 GA 发布之前已通过 Azure 门户创建了自己的 Azure 机器学习工作区,则他们可能无法在该工作区中创建 AmlCompute。 可对服务提出支持请求,也可通过门户或 SDK 创建新的工作区以立即解除锁定。

调整大小时停滞

如果 Azure 机器学习计算群集在根据节点状态重设大小时卡住 (0 -> 0),可能是由于 Azure 资源锁定而导致的。

Azure 允许你在资源上放置锁,这样这些资源就无法被删除,或者会处于只读状态。 锁定资源可能会导致意外结果。 某些操作看似不会修改资源,但实际上需要执行被锁阻止的操作。

借助 Azure 机器学习,将删除锁应用于工作区的资源组会阻止对 Azure ML 计算群集进行缩放操作。 若要解决此问题,我们建议删除资源组中的锁,并将锁应用于组中的各个项。

重要

不要将锁应用于以下资源:

资源名称 资源类型
<GUID>-azurebatch-cloudservicenetworksecurityggroup 网络安全组
<GUID>-azurebatch-cloudservicepublicip 公共 IP 地址
<GUID>-azurebatch-cloudserviceloadbalancer 负载均衡器

这些资源用于与计算群集进行通信,并在计算群集上执行缩放等操作。 删除这些资源中的资源锁便应该会允许对你的计算群集执行自动缩放。

若要详细了解资源锁定,请参阅锁定资源以防止意外更改

后续步骤

使用计算群集执行以下操作: