将预留与批量推理搭配使用

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

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

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

  • 您可以立即使用预留的资源,并且这些资源会一直可用,直到您删除预留为止。
  • 系统会按照与运行中虚拟机相同的按需费率(包括任何适用的折扣)对预留的资源收费,直到您删除预留为止。使用预留的虚拟机不会产生单独的费用。您只需为预留之外的资源(例如磁盘或 IP 地址)支付相应费用。如需了解详情,请参阅预留价格

限制和要求

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

  • Vertex AI 只能使用 CPUGPU 虚拟机TPU预览版)的预留。
  • Vertex AI 无法使用手动挂接了本地 SSD 磁盘的虚拟机的预留。
  • 仅支持将 Compute Engine 预留与 Vertex AI 搭配使用来进行自定义训练和推理,以及用于 Vertex AI Workbench(预览版)。
  • 预留的虚拟机属性必须与 Vertex AI 工作负载完全匹配才能使用该预留。例如,如果预留指定了 a2-ultragpu-8g 机器类型,则 Vertex AI 工作负载只有在也使用 a2-ultragpu-8g 机器类型时才能使用该预留。请参阅要求
  • 如需使用 GPU 虚拟机或 TPU 的共享预留,您必须通过其所有者项目或与之共享该预留的使用方项目来使用该预留。请参阅共享预留的工作原理
  • 如需使用 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 批量推理管理费。请参阅预测价格

准备工作

允许使用预留

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

在创建预留时允许使用

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

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

允许在现有预留中使用

对于自动创建的 GPU 虚拟机或 TPU 预留,您只能在相应预留的开始时间之后为未来预留修改预留内容。

如需允许 Vertex AI 使用现有预留,请使用以下方法之一:

验证预留是否已被使用

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

使用预留获取批量推理结果

如需创建使用 GPU 虚拟机的 Compute Engine 预留的批量推理请求,您可以使用 REST API,并选择 Cloud Storage 或 BigQuery 作为来源和目标。

Cloud Storage

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

  • LOCATION_ID:存储模型和执行批量预测作业的区域。例如 us-central1

  • PROJECT_ID:创建预留的项目。如需使用其他项目的共享预留,您必须与该项目共享预留。如需了解详情,请参阅 修改共享预留中的使用方项目

  • BATCH_JOB_NAME:批量预测作业的显示名称。

  • MODEL_ID:用于执行预测的模型的 ID。

  • INPUT_FORMAT输入数据格式jsonlcsvtf-recordtf-record-gzipfile-list

  • INPUT_URI:输入数据的 Cloud Storage URI。可能包含通配符。

  • OUTPUT_DIRECTORY:您希望 Vertex AI 用于保存输出的目录的 Cloud Storage URI。

  • MACHINE_TYPE:要用于此批量预测作业的机器资源

  • ACCELERATOR_TYPE:要挂接到机器的加速器类型。如需详细了解每种机器类型支持的 GPU 类型,请参阅用于处理计算工作负载的 GPU

  • ACCELERATOR_COUNT:要连接到机器的加速器数量。

  • RESERVATION_AFFINITY_TYPE:必须为 ANYSPECIFIC_RESERVATIONNONE

    • ANY 表示 customJob 的虚拟机可以自动使用具有匹配属性的任何预留。
    • SPECIFIC_RESERVATION 表示您的 customJob 的虚拟机只能使用虚拟机通过名称明确指向的预留。
    • NONE 表示 customJob 的虚拟机无法使用任何预留。指定 NONE 的效果与省略预留亲和性规范的效果相同。
  • BATCH_SIZE:每个预测请求中发送的实例数;默认值为 64。增加批次大小可以产生更高的吞吐量,但也可能会导致请求超时。

  • STARTING_REPLICA_COUNT:此批量预测作业的节点数。

HTTP 方法和网址:

POST https://LOCATION_ID-aiplatform.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION_ID/batchPredictionJobs

请求 JSON 正文:

{
  "displayName": "BATCH_JOB_NAME",
  "model": "projects/PROJECT_ID/locations/LOCATION_ID/models/MODEL_ID",
  "inputConfig": {
    "instancesFormat": "INPUT_FORMAT",
    "gcsSource": {
      "uris": ["INPUT_URI"],
    },
  },
  "outputConfig": {
    "predictionsFormat": "jsonl",
    "gcsDestination": {
      "outputUriPrefix": "OUTPUT_DIRECTORY",
    },
  },
  "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"
        ]
      }
    },
    "startingReplicaCount": STARTING_REPLICA_COUNT
  },
  "manualBatchTuningParameters": {
    "batch_size": BATCH_SIZE,
  }
}

如需发送请求,请选择以下方式之一:

curl

将请求正文保存在名为 request.json 的文件中,然后执行以下命令:

curl -X POST \
-H "Authorization: Bearer $(gcloud auth print-access-token)" \
-H "Content-Type: application/json; charset=utf-8" \
-d @request.json \
"https://LOCATION_ID-aiplatform.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION_ID/batchPredictionJobs"

PowerShell

将请求正文保存在名为 request.json 的文件中,然后执行以下命令:

$cred = gcloud auth print-access-token
$headers = @{ "Authorization" = "Bearer $cred" }

Invoke-WebRequest `
-Method POST `
-Headers $headers `
-ContentType: "application/json; charset=utf-8" `
-InFile request.json `
-Uri "https://LOCATION_ID-aiplatform.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION_ID/batchPredictionJobs" | Select-Object -Expand Content

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

{
  "name": "projects/PROJECT_NUMBER/locations/LOCATION_ID/batchPredictionJobs/BATCH_JOB_ID",
  "displayName": "BATCH_JOB_NAME 202005291958",
  "model": "projects/PROJECT_ID/locations/LOCATION_ID/models/MODEL_ID",
  "inputConfig": {
    "instancesFormat": "jsonl",
    "gcsSource": {
      "uris": [
        "INPUT_URI"
      ]
    }
  },
  "outputConfig": {
    "predictionsFormat": "jsonl",
    "gcsDestination": {
      "outputUriPrefix": "OUTPUT_DIRECTORY"
    }
  },
  "state": "JOB_STATE_PENDING",
  "createTime": "2020-05-30T02:58:44.341643Z",
  "updateTime": "2020-05-30T02:58:44.341643Z",
}

BigQuery

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

  • LOCATION_ID:存储模型和执行批量预测作业的区域。例如 us-central1

  • PROJECT_ID:创建预留的项目。如需使用其他项目的共享预留,您必须与该项目共享预留。如需了解详情,请参阅 修改共享预留中的使用方项目

  • BATCH_JOB_NAME:批量预测作业的显示名称。

  • MODEL_ID:用于执行预测的模型的 ID。

  • INPUT_PROJECT_ID:您要从中获取数据的 Google Cloud 项目的 ID。

  • INPUT_DATASET_NAME:您要从中获取数据的 BigQuery 数据集的名称。

  • INPUT_TABLE_NAME:您要从中获取数据的 BigQuery 表的名称。

  • OUTPUT_PROJECT_ID:您要将输出保存到的 Google Cloud 项目的 ID。

  • OUTPUT_DATASET_NAME:您要将输出保存到的目标 BigQuery 数据集的名称。

  • OUTPUT_TABLE_NAME:您要将输出保存到的 BigQuery 目标表的名称。

  • MACHINE_TYPE:要用于此批量预测作业的机器资源

  • ACCELERATOR_TYPE:要挂接到机器的加速器类型。如需详细了解每种机器类型支持的 GPU 类型,请参阅用于处理计算工作负载的 GPU

  • ACCELERATOR_COUNT:要连接到机器的加速器数量。

  • RESERVATION_AFFINITY_TYPE:必须为 ANYSPECIFIC_RESERVATIONNONE

    • ANY 表示 customJob 的虚拟机可以自动使用具有匹配属性的任何预留。
    • SPECIFIC_RESERVATION 表示您的 customJob 的虚拟机只能使用虚拟机通过名称明确指向的预留。
    • NONE 表示 customJob 的虚拟机无法使用任何预留。指定 NONE 的效果与省略预留亲和性规范的效果相同。
  • BATCH_SIZE:每个预测请求中发送的实例数;默认值为 64。增加批次大小可以产生更高的吞吐量,但也可能会导致请求超时。

  • STARTING_REPLICA_COUNT:此批量预测作业的节点数。

HTTP 方法和网址:

POST https://LOCATION_ID-aiplatform.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION_ID/batchPredictionJobs

请求 JSON 正文:

{
  "displayName": "BATCH_JOB_NAME",
  "model": "projects/PROJECT_ID/locations/LOCATION_ID/models/MODEL_ID",
  "inputConfig": {
    "instancesFormat": "bigquery",
    "bigquerySource": {
      "inputUri": "bq://INPUT_PROJECT_ID.INPUT_DATASET_NAME.INPUT_TABLE_NAME"
    },
  },
  "outputConfig": {
    "predictionsFormat":"bigquery",
    "bigqueryDestination":{
      "outputUri": "bq://OUTPUT_PROJECT_ID.OUTPUT_DATASET_NAME.OUTPUT_TABLE_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"
        ]
      }
    },
    "startingReplicaCount": STARTING_REPLICA_COUNT
  },
  "manualBatchTuningParameters": {
    "batch_size": BATCH_SIZE,
  }
}

如需发送请求,请选择以下方式之一:

curl

将请求正文保存在名为 request.json 的文件中,然后执行以下命令:

curl -X POST \
-H "Authorization: Bearer $(gcloud auth print-access-token)" \
-H "Content-Type: application/json; charset=utf-8" \
-d @request.json \
"https://LOCATION_ID-aiplatform.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION_ID/batchPredictionJobs"

PowerShell

将请求正文保存在名为 request.json 的文件中,然后执行以下命令:

$cred = gcloud auth print-access-token
$headers = @{ "Authorization" = "Bearer $cred" }

Invoke-WebRequest `
-Method POST `
-Headers $headers `
-ContentType: "application/json; charset=utf-8" `
-InFile request.json `
-Uri "https://LOCATION_ID-aiplatform.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION_ID/batchPredictionJobs" | Select-Object -Expand Content

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

{
  "name": "projects/PROJECT_NUMBER/locations/LOCATION_ID/batchPredictionJobs/BATCH_JOB_ID",
  "displayName": "BATCH_JOB_NAME 202005291958",
  "model": "projects/PROJECT_ID/locations/LOCATION_ID/models/MODEL_ID",
  "inputConfig": {
    "instancesFormat": "jsonl",
    "bigquerySource": {
      "uris": [
        "INPUT_URI"
      ]
    }
  },
  "outputConfig": {
    "predictionsFormat": "jsonl",
    "bigqueryDestination": {
      "outputUri": "OUTPUT_URI"
    }
  },
  "state": "JOB_STATE_PENDING",
  "createTime": "2020-05-30T02:58:44.341643Z",
  "updateTime": "2020-05-30T02:58:44.341643Z",
}

检索批量推理结果

批量推理任务完成后,推理输出会存储在您在请求中指定的 Cloud Storage 存储桶或 BigQuery 位置中。

后续步骤