将预留与预测结合使用

本文档介绍了如何使用 Compute Engine 预留来确保您的预测作业具有运行所需的虚拟机 (VM) 资源。

预留是 Compute Engine 的一项功能。它们有助于确保您随时可以使用资源来创建具有相同硬件(内存和 vCPU)和可选资源(GPU 和本地 SSD 磁盘)的虚拟机。

当您创建预留时,Compute Engine 会验证指定可用区中是否提供了请求的容量。如果提供,Compute Engine 会预留资源并创建预留,随后将发生以下情况:

  • 您可以立即使用预留的资源,并且这些资源会一直可用,直到您删除预留为止。
  • 系统会按照与运行中虚拟机相同的按需费率(包括任何适用的折扣)对预留的资源收费,直到您删除预留为止。使用预留的虚拟机不会产生单独的费用。如需了解详情,请参阅 Compute Engine 可用区级资源的预留

限制和要求

将 Compute Engine 预留用于 Vertex AI 时,请考虑以下限制和要求:

  • Vertex AI 只能使用挂接了 GPU 的虚拟机的预留。 具体而言,Vertex AI 支持指定以下机器类型的预留:
  • Vertex AI 无法使用手动挂接了本地 SSD 磁盘的虚拟机的预留。
  • 仅支持将 Compute Engine 预留与 Vertex AI 搭配使用来进行自定义训练和预测。
  • 预留的虚拟机属性必须与 Vertex AI 工作负载完全匹配才能使用该预留。例如,如果预留指定了 a2-ultragpu-8g 机器类型,则 Vertex AI 工作负载只有在也使用 a2-ultragpu-8g 机器类型时才能使用该预留。请参阅要求
  • 如需使用 GPU 虚拟机的共享预留,您必须通过其所有者项目或与之共享该预留的使用方项目来使用该预留。请参阅共享预留的工作原理
  • 为了支持定期更新 Vertex AI 部署,我们建议您根据 DeployedModel 所用的预留类型,按如下方式增加虚拟机数量,使其超出副本总数:
    • SPECIFIC_RESERVATION:必须指定至少 1 台额外虚拟机;我们建议增加 10%(至少 1 台)。使用 SPECIFIC_RESERVATION 部署的模型保证只会使用预留中的虚拟机。如果没有其他虚拟机,Vertex AI 无法执行更新。
    • ANY
      • 无需增加虚拟机,因为如果预留容量不足,使用 ANY 预留的已部署模型会使用按需虚拟机。不过,如果没有额外的虚拟机,您的预留资源在升级后可能无法完全利用。例如,假设您有一个包含 40 台虚拟机的预留,并使用该预留部署一个包含 40 个副本的模型。首次部署时,DeployedModel 会使用预留中的所有 40 台虚拟机。升级后,只有 36 台虚拟机来自预留,4 台虚拟机是按需的。
      • 如果您希望将用量控制在预留范围内,我们建议为每个使用预留的 DeployedModelDeploymentResourcePool 至少配置 1 台额外的虚拟机。如果您的 ANY 预留中的同一类型的虚拟机总数少于 50 台,我们建议您增加 10%(但至少 1 台)。如果超过 50 台,建议增加 25%。例如:
        • 如果您计划使用 40 台 A3 虚拟机部署模型,则可以使用 1 个包含 44 台虚拟机的 A3 预留,或者 2 个 A3 预留:包含 30 台虚拟机的预留 X 和包含 14 台虚拟机的预留 Y(总计 44 台)。其他数量的预留也适用此规则,前提是它们都与 Vertex AI 共享,并且这些预留中的虚拟机总数至少为 44 台。
        • 如果您计划使用 100 台 A3 虚拟机部署模型,则与 Vertex AI 共享的所有 A3 预留的虚拟机总数至少应为 125 台。
        • 如果您计划使用 10 台虚拟机部署 2 个模型,则与 Vertex AI 共享的所有 A3 预留的虚拟机总数至少应为 12 台。虚拟机数量少于 50 台,但额外虚拟机数量为 2 台(每个 DeployedModel 1 台)。
  • 如需使用 SPECIFIC_RESERVATION 预留,请向拥有预留的项目(service-${PROJECT_NUMBER}@gcp-sa-aiplatform.iam.gserviceaccount.com,其中 PROJECT_NUMBER 是使用预留的项目的项目编号)中的 Vertex AI 服务账号授予 Compute Viewer IAM 角色。
  • 将 Compute Engine 预留与 Vertex AI 预测结合使用时,不支持以下服务和功能:

    • 联邦风险和授权管理计划 (FedRAMP) 合规性

结算

使用 Compute Engine 预留时,您需要为以下各项支付费用:

  • Compute Engine 资源的 Compute Engine 价格,包括所有适用的承诺使用折扣 (CUD)。请参阅 Compute Engine 价格
  • 除基础设施使用费之外,还需支付 Vertex AI 预测管理费。请参阅预测价格

准备工作

允许使用预留

在使用 GPU 虚拟机的预留之前,您必须设置其共享政策,以允许 Vertex AI 使用该预留。为此,请使用以下方法之一:

在创建预留时允许使用

在创建 GPU 虚拟机的单项目预留共享预留时,您可以允许 Vertex AI 使用该预留,如下所示:

  • 如果您使用的是 Google Cloud 控制台,请在 Google Cloud 服务部分中选择共享预留
  • 如果您使用的是 Google Cloud CLI,请添加 --reservation-sharing-policy 标志并将其设置为 ALLOW_ALL
  • 如果您使用的是 REST API,请在请求正文中添加 serviceShareType 字段并将其设置为 ALLOW_ALL

允许在现有预留中使用

如需允许 Vertex AI 使用现有的 GPU 虚拟机预留,请参阅修改预留的共享政策

验证预留是否已被使用

如需验证预留是否已被使用,请参阅 Compute Engine 文档中的验证预留使用情况

使用预留获取预测结果

如需创建使用 GPU 虚拟机的 Compute Engine 预留的模型部署,请使用 REST API 或 Vertex AI SDK for Python。

REST

在使用任何请求数据之前,请先进行以下替换:

  • LOCATION_ID:您在其中使用 Vertex AI 的区域。
  • PROJECT_ID:在其中创建预留的项目。如需使用其他项目的共享预留,您必须与该项目共享预留。如需了解详情,请参阅修改共享预留中的使用方项目
  • ENDPOINT_ID:端点的 ID。
  • MODEL_ID:要部署的模型的 ID。
  • DEPLOYED_MODEL_NAMEDeployedModel 的名称。您还可以将 Model 的显示名用于 DeployedModel
  • MACHINE_TYPE:此部署中每个节点使用的机器类型。其默认设置为 n1-standard-2。如需详细了解支持的机器类型,请参阅为预测配置计算资源
  • ACCELERATOR_TYPE:要挂接到机器的加速器类型。如需详细了解每种机器类型支持的 GPU 类型,请参阅用于处理计算工作负载的 GPU
  • ACCELERATOR_COUNT:要挂接到机器的加速器类型。
  • RESERVATION_AFFINITY_TYPE:必须为 ANYSPECIFIC_RESERVATIONNONE
    • ANY 表示您的 customJob 的虚拟机可以自动使用具有匹配属性的任何预留。
    • SPECIFIC_RESERVATION 表示您的 customJob 的虚拟机只能使用虚拟机通过名称明确指向的预留。
    • NONE 表示 customJob 的虚拟机无法使用任何预留。指定 NONE 的效果与省略预留亲和性规范的效果相同。
  • ZONE:在其中创建预留的可用区。
  • RESERVATION_NAME:预留的名称。
  • MIN_REPLICA_COUNT:此部署的最小节点数。 节点数可根据预测负载的需要而增加或减少,直至达到节点数上限并且绝不会少于此节点数。此值必须大于或等于 1。
  • MAX_REPLICA_COUNT:此部署的节点数上限。 节点数可根据预测负载的需要而增加或减少,直至达到此节点数并且绝不会少于节点数下限。
  • TRAFFIC_SPLIT_THIS_MODEL:流向此端点的要路由到使用此操作部署的模型的预测流量百分比。默认值为 100。所有流量百分比之和必须为 100。详细了解流量拆分
  • DEPLOYED_MODEL_ID_N:可选。如果将其他模型部署到此端点,您必须更新其流量拆分百分比,以便所有百分比之和等于 100。
  • TRAFFIC_SPLIT_MODEL_N:已部署模型 ID 密钥的流量拆分百分比值。
  • PROJECT_NUMBER:自动生成的项目编号

HTTP 方法和网址:

POST https://LOCATION_ID-aiplatform.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION_ID/endpoints/ENDPOINT_ID:deployModel

请求 JSON 正文:

{
  "deployedModel": {
    "model": "projects/PROJECT/locations/LOCATION_ID/models/MODEL_ID",
    "displayName": "DEPLOYED_MODEL_NAME",
    "dedicatedResources": {
      "machineSpec": {
        "machineType": "MACHINE_TYPE",
        "acceleratorType": "ACCELERATOR_TYPE",
        "acceleratorCount": ACCELERATOR_COUNT,
        "reservationAffinity": {
          "reservationAffinityType": "RESERVATION_AFFINITY_TYPE",
          "key": "compute.googleapis.com/reservation-name",
          "values": [
            "projects/PROJECT_ID/zones/ZONE/reservations/RESERVATION_NAME"
          ]
        }
      },
      "minReplicaCount": MIN_REPLICA_COUNT,
      "maxReplicaCount": MAX_REPLICA_COUNT
    },
  },
  "trafficSplit": {
    "0": TRAFFIC_SPLIT_THIS_MODEL,
    "DEPLOYED_MODEL_ID_1": TRAFFIC_SPLIT_MODEL_1,
    "DEPLOYED_MODEL_ID_2": TRAFFIC_SPLIT_MODEL_2
  },
}

如需发送您的请求,请展开以下选项之一:

您应该收到类似以下内容的 JSON 响应:

{
  "name": "projects/PROJECT_ID/locations/LOCATION_ID/endpoints/ENDPOINT_ID/operations/OPERATION_ID",
  "metadata": {
    "@type": "type.googleapis.com/google.cloud.aiplatform.v1beta1.DeployModelOperationMetadata",
    "genericMetadata": {
      "createTime": "2020-10-19T17:53:16.502088Z",
      "updateTime": "2020-10-19T17:53:16.502088Z"
    }
  }
}

Python

如需了解如何安装或更新 Vertex AI SDK for Python,请参阅安装 Vertex AI SDK for Python。如需了解详情,请参阅 Vertex AI SDK for Python API 参考文档

在运行以下任意脚本之前,请先进行以下替换:

  • DEPLOYED_NAME:已部署模型的名称。
  • TRAFFIC_SPLIT:已部署模型 ID 密钥的流量拆分百分比值。
  • MACHINE_TYPE:用于此部署的每个节点的机器资源。其默认设置为 n1-standard-2。 详细了解机器类型
  • ACCELERATOR_TYPE:要挂接到机器的加速器类型。如需详细了解每种机器类型支持的 GPU 类型,请参阅用于处理计算工作负载的 GPU
  • ACCELERATOR_COUNT:要挂接到机器的加速器类型。
  • PROJECT_ID:在其中创建预留的项目。 如需使用其他项目的共享预留,您必须与该项目共享预留。如需了解详情,请参阅修改共享预留中的使用方项目
  • ZONE:预留所在的可用区。
  • RESERVATION_NAME:预留的名称。
  • MIN_REPLICA_COUNT:此部署的最小节点数。 节点数可根据预测负载的需要而增加或减少,直至达到节点数上限并且绝不会少于此节点数。此值必须大于或等于 1。
  • MAX_REPLICA_COUNT:此部署的节点数上限。 节点数可根据预测负载的需要而增加或减少,直至达到此节点数并且绝不会少于节点数下限。

根据您要使用的预留类型,执行以下操作之一:

  • 如需使用特定预留,请执行以下操作:
    endpoint5.deploy(
        model = model,
        deployed_model_display_name=DEPLOYED_NAME,
        traffic_split=TRAFFIC_SPLIT,
        machine_type="MACHINE_TYPE",
        accelerator_type="ACCELERATOR_TYPE",
        accelerator_count=ACCELERATOR_COUNT,
        reservation_affinity_type="SPECIFIC_RESERVATION",
        reservation_affinity_key="compute.googleapis.com/reservation-name",
        reservation_affinity_values=["projects/PROJECT_ID/zones/ZONE/reservations/RESERVATION_NAME"],
        min_replica_count=MIN_REPLICA_COUNT,
        max_replica_count=MAX_REPLICA_COUNT,
        sync=True
    )
  • 如需使用自动使用的预留,请执行以下操作:
    endpoint5.deploy(
        model = model,
        deployed_model_display_name=DEPLOYED_NAME,
        traffic_split=TRAFFIC_SPLIT,
        machine_type="MACHINE_TYPE",
        accelerator_type="ACCELERATOR_TYPE",
        accelerator_count=ACCELERATOR_COUNT,
        reservation_affinity_type="ANY_RESERVATION",
        min_replica_count=MIN_REPLICA_COUNT,
        max_replica_count=MAX_REPLICA_COUNT,
        sync=True
    )

后续步骤