透過自訂訓練模型取得批次推論

本頁說明如何使用 Google Cloud 控制台或 Vertex AI API,從自訂訓練模型取得批次推論

如要提出批次推論要求,請指定輸入來源和輸出位置 (Cloud StorageBigQuery),Vertex AI 會將批次推論結果儲存在該位置。

限制與需求

取得批次推論結果時,請考量下列限制和需求:

  • 為盡量縮短處理時間,輸入和輸出位置必須位於相同區域或多區域。舉例來說,如果輸入內容為 us-central1,輸出內容可以是 us-central1US,但不能是 europe-west4。詳情請參閱「Cloud Storage 位置」和「BigQuery 位置」。
  • 輸入和輸出內容也必須與模型位於相同區域或多區域。
  • BigQuery ML 模型並非自訂訓練模型。不過,在下列情況下,您可以使用本頁的資訊,從 BigQuery ML 模型取得批次推論結果:
    • BigQuery ML 模型必須註冊至 Vertex AI Model Registry。
    • 如要使用 BigQuery 資料表做為輸入內容,請使用 Vertex AI API 將 InstanceConfig.instanceType 設為 "object"
  • 載入批次推論模型約 40 分鐘後會逾時。如果看到下列錯誤訊息,請使用較小的模型進行批次推論: Error: model server never became ready. Please validate that your model file or container configuration are valid.

輸入資料規定

提交批次要求時,應在輸入內容中指定要送交模型推論的項目。我們支援下列輸入格式:

JSON Lines

使用 JSON Lines 檔案指定輸入執行個體清單,以進行推論。將檔案儲存在 Cloud Storage 值區中。

範例 1

以下範例顯示 JSON Lines 檔案,其中每行都包含陣列:

[1, 2, 3, 4]
[5, 6, 7, 8]

以下是 HTTP 要求主體中傳送至容器的內容:

所有其他容器

{"instances": [ [1, 2, 3, 4], [5, 6, 7, 8] ]}

PyTorch 容器

{"instances": [
{ "data": [1, 2, 3, 4] },
{ "data": [5, 6, 7, 8] } ]}

示例 2

下列範例顯示 JSON Lines 檔案,每行包含一個物件。

{ "values": [1, 2, 3, 4], "key": 1 }
{ "values": [5, 6, 7, 8], "key": 2 }

以下是 HTTP 要求主體中傳送至容器的內容。 請注意,系統會將相同的要求主體傳送至所有容器。

{"instances": [
  { "values": [1, 2, 3, 4], "key": 1 },
  { "values": [5, 6, 7, 8], "key": 2 }
]}

範例 3

如果是 PyTorch 預建容器,請務必按照 TorchServe 預設處理常式的要求,將每個執行個體包裝在 data 欄位中;Vertex AI 不會為您包裝執行個體。例如:

{ "data": { "values": [1, 2, 3, 4], "key": 1 } }
{ "data": { "values": [5, 6, 7, 8], "key": 2 } }

以下是 HTTP 要求主體中傳送至推論容器的內容:

{"instances": [
  { "data": { "values": [1, 2, 3, 4], "key": 1 } },
  { "data": { "values": [5, 6, 7, 8], "key": 2 } }
]}

TFRecord

TFRecord 格式儲存輸入例項。您可以選擇使用 Gzip 壓縮 TFRecord 檔案。將 TFRecord 檔案儲存在 Cloud Storage bucket 中。

Vertex AI 會將 TFRecord 檔案中的每個例項讀取為二進位檔,然後以 base64 編碼例項,做為具有名為 b64 單一鍵的 JSON 物件。

以下是 HTTP 要求主體中傳送至容器的內容:

所有其他容器

{"instances": [
{ "b64": "b64EncodedASCIIString" },
{ "b64": "b64EncodedASCIIString" } ]}

PyTorch 容器

{"instances": [ { "data": {"b64": "b64EncodedASCIIString" } }, { "data": {"b64": "b64EncodedASCIIString" } }
]}

請確認容器知道如何解碼執行個體。

CSV

在 CSV 檔案中,每列指定一個輸入例項。第一列必須是標題列。所有字串都必須以雙引號 (") 括住。Vertex AI 不接受含有換行的儲存格值。系統會將未加引號的值讀取為浮點數。

以下範例顯示含有兩個輸入例項的 CSV 檔案:

"input1","input2","input3"
0.1,1.2,"cat1"
4.0,5.0,"cat2"

以下是 HTTP 要求主體中傳送至容器的內容:

所有其他容器

{"instances": [ [0.1,1.2,"cat1"], [4.0,5.0,"cat2"] ]}

PyTorch 容器

{"instances": [
{ "data": [0.1,1.2,"cat1"] },
{ "data": [4.0,5.0,"cat2"] } ]}

檔案清單

建立文字檔,其中每一列都是檔案的 Cloud Storage URI。Vertex AI 會將每個檔案的內容讀取為二進位檔,然後以 base64 編碼將執行個體編碼為 JSON 物件,並以 b64 做為單一鍵名。

如要使用 Google Cloud 控制台取得批次推論結果,請直接將檔案清單貼到 Google Cloud 控制台。否則,請將清單儲存在 Cloud Storage 值區中。

以下範例顯示含有兩個輸入樣本的檔案清單:

gs://path/to/image/image1.jpg
gs://path/to/image/image2.jpg

以下是 HTTP 要求主體中傳送至容器的內容:

所有其他容器

{ "instances": [
{ "b64": "b64EncodedASCIIString" },
{ "b64": "b64EncodedASCIIString" } ]}

PyTorch 容器

{ "instances": [ { "data": { "b64": "b64EncodedASCIIString" } }, { "data": { "b64": "b64EncodedASCIIString" } }
]}

請確認容器知道如何解碼執行個體。

BigQuery

將 BigQuery 資料表指定為 projectId.datasetId.tableId。 Vertex AI 會將資料表中的每個資料列轉換為 JSON 執行個體。

舉例來說,如果資料表包含下列項目:

第 1 欄 第 2 欄 第 3 欄
1.0 3.0 「Cat1」
2.0 4.0 「Cat2」

以下是 HTTP 要求主體中傳送至容器的內容:

所有其他容器

{"instances": [ [1.0,3.0,"cat1"], [2.0,4.0,"cat2"] ]}

PyTorch 容器

{"instances": [
{ "data": [1.0,3.0,"cat1"] },
{ "data": [2.0,4.0,"cat2"] } ]}

BigQuery 資料類型轉換為 JSON 的方式如下:

BigQuery 類型 JSON 類型 範例值
字串 字串 "abc"
整數 整數 1
浮點值 浮點值 1.2
數字 浮點值 4925.000000000
布林值 布林值
TimeStamp 字串 "2019-01-01 23:59:59.999999+00:00"
日期 字串 "2018-12-31"
時間 字串 "23:59:59.999999"
DateTime 字串 "2019-01-01T00:00:00"
錄製 物件 { "A": 1,"B": 2}
重複類型 Array[Type] [1, 2]
巢狀記錄 物件 {"A": {"a": 0}, "B": 1}

分割資料

批次推論會使用 MapReduce,將輸入內容分片至每個副本。如要使用 MapReduce 功能,輸入內容應可分割。

Vertex AI 會自動分割 BigQuery檔案清單JSON 行輸入內容。

Vertex AI 不會自動分割 CSV 檔案,因為這類檔案不適合分割。CSV 檔案中的資料列並非自我描述、已輸入,且可能含有換行符號。對於需要高輸送量的應用程式,我們不建議使用 CSV 輸入。

如果是 TFRecord 輸入,請務必手動分割資料,將例項分割成較小的檔案,並使用萬用字元 (例如 gs://my-bucket/*.tfrecord) 將檔案傳遞至工作。檔案數量應至少為指定的副本數量。

篩選及轉換輸入資料

您可以在 BatchPredictionJob 要求中指定 instanceConfig,藉此篩選及轉換批次輸入內容。

篩選功能可讓您從推論要求中排除輸入資料中的特定欄位,或只在推論要求中納入輸入資料的欄位子集,不必在推論容器中進行任何自訂前處理或後處理。如果輸入資料檔案含有模型不需要的額外資料欄 (例如鍵或額外資料),這項功能就非常實用。

轉換:您可以將執行個體以 JSON arrayobject 格式傳送至容器。詳情請參閱 instanceType

舉例來說,如果輸入資料表包含下列項目:

customerId col1 col2
1001 1 2
1002 5 6

並指定下列 instanceConfig

{
  "name": "batchJob1",
  ...
  "instanceConfig": {
    "excludedFields":["customerId"]
    "instanceType":"object"
  }
}

接著,推論要求中的執行個體會以 JSON 物件的形式傳送,並排除 customerId 欄:

{"col1":1,"col2":2}
{"col1":5,"col2":6}

請注意,指定下列 instanceConfig 會產生相同結果:

{
  "name": "batchJob1",
  ...
  "instanceConfig": {
    "includedFields": ["col1","col2"]
    "instanceType":"object"
  }
}

如要瞭解如何使用特徵篩選器,請參閱使用特徵篩選器進行自訂模型批次推論筆記本。

要求批次推論

如要發出批次推論要求,可以使用 Google Cloud 控制台或 Vertex AI API。視您提交的輸入項目數量而定,批次推論工作可能需要一些時間才能完成。

要求批次推論時,推論容器會以使用者提供的自訂服務帳戶執行。讀取推論例項或寫入推論結果等讀寫作業,都是使用 Vertex AI 服務代理程式完成,這個代理程式預設有權存取 BigQuery 和 Cloud Storage。

Google Cloud 控制台

使用 Google Cloud 控制台要求批次推論。

  1. 在 Google Cloud 控制台的 Vertex AI 專區中,前往「Batch predictions」(批次預測) 頁面。

前往「批次預測」頁面

  1. 按一下「建立」,開啟「新批次預測」視窗。

  2. 如要「定義批次預測工作」,請完成下列步驟:

    1. 輸入批次推論的名稱。

    2. 在「Model name」(模型名稱) 中,選取要用於這項批次推論的模型名稱。

    3. 在「選取來源」中,選取適用於輸入資料的來源:

      • 如果輸入內容的格式為 JSON Lines、CSV 或 TFRecord,請選取「File on Cloud Storage (JSON Lines, CSV, TFRecord, TFRecord Gzip)」(Cloud Storage 中的檔案 (JSON Lines、CSV、TFRecord、TFRecord Gzip))。然後在「Source path」(來源路徑) 欄位中指定輸入檔案。
      • 如果使用檔案清單做為輸入內容,請選取「Cloud Storage 中的檔案 (其他)」,然後將檔案清單貼到下列欄位。
      • 如果是 BigQuery 輸入,請選取「BigQuery 路徑」。如果選取 BigQuery 做為輸入內容,也必須選取 BigQuery 做為輸出內容,並 Google-managed encryption key。以 BigQuery 做為輸入/輸出內容時,不支援客戶自行管理的加密金鑰 (CMEK)。
    4. 在「Destination path」(目的地路徑) 欄位中,指定要讓 Vertex AI 儲存批次推論輸出內容的 Cloud Storage 目錄。

    5. 您可以視需要勾選「為這個模型啟用特徵歸因」,在批次推論回應中取得特徵歸因。然後按一下「編輯」設定說明設定。(如果您先前已為模型設定說明設定,則可選擇是否編輯說明設定,否則必須編輯。)

    6. 指定批次推論工作的運算選項:運算節點數量機器類型,以及 (選用) 加速器類型加速器數量

  3. 選用: 模型監控 批次推論分析功能現已在預覽版中推出。如要將偏斜偵測設定新增至批次推論工作,請參閱必要條件

    1. 按一下以開啟「為這個批次預測啟用模型監控功能」

    2. 選取「訓練資料來源」。輸入所選訓練資料來源的資料路徑或位置。

    3. 選用:在「警告門檻」下方,指定觸發警告的門檻。

    4. 在「通知電子郵件」部分,輸入一或多個以半形逗號分隔的電子郵件地址,以便在模型超過快訊門檻時收到通知。

    5. 選用:在「通知管道」中新增 Cloud Monitoring 管道,以便在模型超過快訊門檻時收到通知。您可以選取現有的 Cloud Monitoring 管道,也可以按一下「管理通知管道」建立新管道。 Google Cloud 控制台支援 PagerDuty、Slack 和 Pub/Sub 通知管道。

  4. 點選「建立」

API

使用 Vertex AI API 傳送批次推論要求。根據您用來取得批次推論結果的工具,選取對應的分頁。

REST

使用任何要求資料之前,請先替換以下項目:

  • LOCATION_ID:儲存模型和執行批次預測工作的區域。例如:us-central1

  • PROJECT_ID:您的專案 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:用於這項批次預測作業的機器資源

    您可以選擇設定 machineSpec 欄位使用快速鍵,但以下範例未說明這項操作。

  • 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
    },
    "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",
}

Java

在試用這個範例之前,請先按照Java使用用戶端程式庫的 Vertex AI 快速入門中的操作說明進行設定。 詳情請參閱 Vertex AI Java API 參考說明文件

如要向 Vertex AI 進行驗證,請設定應用程式預設憑證。 詳情請參閱「為本機開發環境設定驗證」。

在下列範例中,請將 PREDICTIONS_FORMAT 替換為 jsonl。 如要瞭解如何替換其他預留位置,請參閱本節的REST & CMD LINE 分頁。

import com.google.cloud.aiplatform.util.ValueConverter;
import com.google.cloud.aiplatform.v1.AcceleratorType;
import com.google.cloud.aiplatform.v1.BatchDedicatedResources;
import com.google.cloud.aiplatform.v1.BatchPredictionJob;
import com.google.cloud.aiplatform.v1.GcsDestination;
import com.google.cloud.aiplatform.v1.GcsSource;
import com.google.cloud.aiplatform.v1.JobServiceClient;
import com.google.cloud.aiplatform.v1.JobServiceSettings;
import com.google.cloud.aiplatform.v1.LocationName;
import com.google.cloud.aiplatform.v1.MachineSpec;
import com.google.cloud.aiplatform.v1.ModelName;
import com.google.protobuf.Value;
import java.io.IOException;

public class CreateBatchPredictionJobSample {

  public static void main(String[] args) throws IOException {
    // TODO(developer): Replace these variables before running the sample.
    String project = "PROJECT";
    String displayName = "DISPLAY_NAME";
    String modelName = "MODEL_NAME";
    String instancesFormat = "INSTANCES_FORMAT";
    String gcsSourceUri = "GCS_SOURCE_URI";
    String predictionsFormat = "PREDICTIONS_FORMAT";
    String gcsDestinationOutputUriPrefix = "GCS_DESTINATION_OUTPUT_URI_PREFIX";
    createBatchPredictionJobSample(
        project,
        displayName,
        modelName,
        instancesFormat,
        gcsSourceUri,
        predictionsFormat,
        gcsDestinationOutputUriPrefix);
  }

  static void createBatchPredictionJobSample(
      String project,
      String displayName,
      String model,
      String instancesFormat,
      String gcsSourceUri,
      String predictionsFormat,
      String gcsDestinationOutputUriPrefix)
      throws IOException {
    JobServiceSettings settings =
        JobServiceSettings.newBuilder()
            .setEndpoint("us-central1-aiplatform.googleapis.com:443")
            .build();
    String location = "us-central1";

    // Initialize client that will be used to send requests. This client only needs to be created
    // once, and can be reused for multiple requests. After completing all of your requests, call
    // the "close" method on the client to safely clean up any remaining background resources.
    try (JobServiceClient client = JobServiceClient.create(settings)) {

      // Passing in an empty Value object for model parameters
      Value modelParameters = ValueConverter.EMPTY_VALUE;

      GcsSource gcsSource = GcsSource.newBuilder().addUris(gcsSourceUri).build();
      BatchPredictionJob.InputConfig inputConfig =
          BatchPredictionJob.InputConfig.newBuilder()
              .setInstancesFormat(instancesFormat)
              .setGcsSource(gcsSource)
              .build();
      GcsDestination gcsDestination =
          GcsDestination.newBuilder().setOutputUriPrefix(gcsDestinationOutputUriPrefix).build();
      BatchPredictionJob.OutputConfig outputConfig =
          BatchPredictionJob.OutputConfig.newBuilder()
              .setPredictionsFormat(predictionsFormat)
              .setGcsDestination(gcsDestination)
              .build();
      MachineSpec machineSpec =
          MachineSpec.newBuilder()
              .setMachineType("n1-standard-2")
              .setAcceleratorType(AcceleratorType.NVIDIA_TESLA_T4)
              .setAcceleratorCount(1)
              .build();
      BatchDedicatedResources dedicatedResources =
          BatchDedicatedResources.newBuilder()
              .setMachineSpec(machineSpec)
              .setStartingReplicaCount(1)
              .setMaxReplicaCount(1)
              .build();
      String modelName = ModelName.of(project, location, model).toString();
      BatchPredictionJob batchPredictionJob =
          BatchPredictionJob.newBuilder()
              .setDisplayName(displayName)
              .setModel(modelName)
              .setModelParameters(modelParameters)
              .setInputConfig(inputConfig)
              .setOutputConfig(outputConfig)
              .setDedicatedResources(dedicatedResources)
              .build();
      LocationName parent = LocationName.of(project, location);
      BatchPredictionJob response = client.createBatchPredictionJob(parent, batchPredictionJob);
      System.out.format("response: %s\n", response);
      System.out.format("\tName: %s\n", response.getName());
    }
  }
}

Python

如要瞭解如何安裝或更新 Python 適用的 Vertex AI SDK,請參閱「安裝 Python 適用的 Vertex AI SDK」。 詳情請參閱 Python API 參考說明文件

def create_batch_prediction_job_dedicated_resources_sample(
    project: str,
    location: str,
    model_resource_name: str,
    job_display_name: str,
    gcs_source: Union[str, Sequence[str]],
    gcs_destination: str,
    instances_format: str = "jsonl",
    machine_type: str = "n1-standard-2",
    accelerator_count: int = 1,
    accelerator_type: Union[str, aiplatform_v1.AcceleratorType] = "NVIDIA_TESLA_K80",
    starting_replica_count: int = 1,
    max_replica_count: int = 1,
    sync: bool = True,
):
    aiplatform.init(project=project, location=location)

    my_model = aiplatform.Model(model_resource_name)

    batch_prediction_job = my_model.batch_predict(
        job_display_name=job_display_name,
        gcs_source=gcs_source,
        gcs_destination_prefix=gcs_destination,
        instances_format=instances_format,
        machine_type=machine_type,
        accelerator_count=accelerator_count,
        accelerator_type=accelerator_type,
        starting_replica_count=starting_replica_count,
        max_replica_count=max_replica_count,
        sync=sync,
    )

    batch_prediction_job.wait()

    print(batch_prediction_job.display_name)
    print(batch_prediction_job.resource_name)
    print(batch_prediction_job.state)
    return batch_prediction_job

BigQuery

上述 REST 範例使用 Cloud Storage 做為來源和目的地。如要改用 BigQuery,請進行下列變更:

  • inputConfig 欄位變更為下列內容:

    "inputConfig": {
       "instancesFormat": "bigquery",
       "bigquerySource": {
          "inputUri": "bq://SOURCE_PROJECT_ID.SOURCE_DATASET_NAME.SOURCE_TABLE_NAME"
       }
    }
    
  • outputConfig 欄位變更為下列內容:

    "outputConfig": {
       "predictionsFormat":"bigquery",
       "bigqueryDestination":{
          "outputUri": "bq://DESTINATION_PROJECT_ID.DESTINATION_DATASET_NAME.DESTINATION_TABLE_NAME"
       }
     }
    
  • 更改下列內容:

    • SOURCE_PROJECT_ID:來源 Google Cloud 專案的 ID
    • SOURCE_DATASET_NAME:來源 BigQuery 資料集的名稱
    • SOURCE_TABLE_NAME:BigQuery 來源資料表的名稱
    • DESTINATION_PROJECT_ID:目的地 Google Cloud 專案的 ID
    • DESTINATION_DATASET_NAME:目的地 BigQuery 資料集的名稱
    • DESTINATION_TABLE_NAME:BigQuery 目的地資料表的名稱

特徵重要性

如要為推論傳回特徵重要性值,請將 generateExplanation 屬性設為 true。請注意,預測模型不支援特徵重要性,因此您無法將其納入批次推論要求。

特徵重要性 (有時稱為「特徵歸因」) 是 Vertex Explainable AI 的一部分。

只有在設定Model說明Model,或指定 BatchPredictionJobexplanationSpec 欄位時,才能將 generateExplanation 設為 true

選擇機型和副本數量

相較於使用較大的機器類型,增加副本數量可更線性且可預測地提升處理量。

一般來說,我們建議您為工作指定盡可能最小的機器類型,並增加副本數量。

為提高成本效益,建議您選擇的副本數量應能讓批次推論作業至少執行 10 分鐘。這是因為系統會以每小時的備用節點為單位計費,包括每個備用節點啟動時約需 5 分鐘。如果只處理幾秒鐘就關閉,成本效益不高。

一般而言,如果執行個體數量達到數千個,建議您將 starting_replica_count 設為數十。如果是數百萬個執行個體,建議您將 starting_replica_count 設為數百。您也可以使用下列公式估算副本數量:

N / (T * (60 / Tb))

其中:

  • N:工作中的批次數量。舉例來說,100 萬個執行個體 / 100 個批次大小 = 10,000 個批次。
  • T:批次推論工作的預計時間。例如 10 分鐘。
  • Tb:副本處理單一批次所需的時間 (以秒為單位)。舉例來說,在 2 核心機器類型上,每個批次需要 1 秒。

以我們的範例來說,10,000 個批次 / (10 分鐘 * (60 / 1 秒)) 四捨五入後為 17 個副本。

與線上推論不同,批次推論工作不會自動調整資源配置。由於所有輸入資料都是預先得知,因此系統會在工作開始時,將資料分割到每個副本。系統會使用 starting_replica_count 參數。系統會忽略 max_replica_count 參數。

這些建議僅為概略指引。不一定能為每個模型提供最佳處理量。他們不會提供確切的處理時間和費用估算值。而且不一定能擷取每個情境的最佳成本與輸送量取捨。您可以將這些值做為合理的起點,並視需要調整。如要評估模型的輸送量等特徵,請執行「Finding ideal machine type」筆記本。

適用於 GPU 或 TPU 加速機器

請遵循上述指引 (也適用於僅使用 CPU 的模型),並注意下列事項:

  • 您可能需要更多 CPU 和 GPU (例如用於資料預先處理)。
  • GPU 機器類型需要較長的啟動時間 (10 分鐘),因此您可能需要為批次推論工作設定較長的時間 (例如至少 20 分鐘,而非 10 分鐘),確保有合理比例的時間和費用用於產生推論結果。

擷取批次推論結果

批次推論工作完成後,推論的輸出內容會儲存在您於要求中指定的 Cloud Storage bucket 或 BigQuery 位置。

批次推論結果範例

輸出資料夾包含一組 JSON Lines 檔案。

檔案名稱為 {gcs_path}/prediction.results-{file_number}-of-{number_of_files_generated}。由於批次推論的性質為分散式,因此檔案數量不確定。

檔案中的每一行都對應至輸入內容中的一個執行個體,並包含下列鍵/值組合:

  • prediction:包含容器傳回的值。
  • instance:如果是檔案清單,則包含 Cloud Storage URI。如果是其他輸入格式,則包含在 HTTP 要求主體中傳送至容器的值。

範例 1

如果 HTTP 要求包含:

{
  "instances": [
    [1, 2, 3, 4],
    [5, 6, 7, 8]
]}

容器會傳回:

{
  "predictions": [
    [0.1,0.9],
    [0.7,0.3]
  ],
}

JSON Lines 輸出檔案如下:

{ "instance": [1, 2, 3, 4], "prediction": [0.1,0.9]}
{ "instance": [5, 6, 7, 8], "prediction": [0.7,0.3]}

範例 2

如果 HTTP 要求包含:

{
  "instances": [
    {"values": [1, 2, 3, 4], "key": 1},
    {"values": [5, 6, 7, 8], "key": 2}
]}

容器會傳回:

{
  "predictions": [
    {"result":1},
    {"result":0}
  ],
}

JSON Lines 輸出檔案如下:

{ "instance": {"values": [1, 2, 3, 4], "key": 1}, "prediction": {"result":1}}
{ "instance": {"values": [5, 6, 7, 8], "key": 2}, "prediction": {"result":0}}

使用 Explainable AI

我們不建議對大量資料執行以特徵為準的說明。這是因為根據可能的特徵值組合,每個輸入內容可能會擴展為數千個要求,導致處理時間和成本大幅增加。一般來說,小型資料集就足以瞭解特徵重要性。

批次推論不支援以範例為基礎的解釋

筆記本

後續步驟