本頁說明如何使用 Google Cloud 控制台或 Vertex AI API,從自訂訓練模型取得批次推論。
如要提出批次推論要求,請指定輸入來源和輸出位置 (Cloud Storage 或 BigQuery),Vertex AI 會將批次推論結果儲存在該位置。
限制與需求
取得批次推論結果時,請考量下列限制和需求:
- 為盡量縮短處理時間,輸入和輸出位置必須位於相同區域或多區域。舉例來說,如果輸入內容為
us-central1
,輸出內容可以是us-central1
或US
,但不能是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 array
或 object
格式傳送至容器。詳情請參閱 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 控制台要求批次推論。
- 在 Google Cloud 控制台的 Vertex AI 專區中,前往「Batch predictions」(批次預測) 頁面。
按一下「建立」,開啟「新批次預測」視窗。
如要「定義批次預測工作」,請完成下列步驟:
輸入批次推論的名稱。
在「Model name」(模型名稱) 中,選取要用於這項批次推論的模型名稱。
在「選取來源」中,選取適用於輸入資料的來源:
- 如果輸入內容的格式為 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)。
在「Destination path」(目的地路徑) 欄位中,指定要讓 Vertex AI 儲存批次推論輸出內容的 Cloud Storage 目錄。
您可以視需要勾選「為這個模型啟用特徵歸因」,在批次推論回應中取得特徵歸因。然後按一下「編輯」,設定說明設定。(如果您先前已為模型設定說明設定,則可選擇是否編輯說明設定,否則必須編輯。)
選用: 模型監控 批次推論分析功能現已在預覽版中推出。如要將偏斜偵測設定新增至批次推論工作,請參閱必要條件。
按一下以開啟「為這個批次預測啟用模型監控功能」。
選取「訓練資料來源」。輸入所選訓練資料來源的資料路徑或位置。
選用:在「警告門檻」下方,指定觸發警告的門檻。
在「通知電子郵件」部分,輸入一或多個以半形逗號分隔的電子郵件地址,以便在模型超過快訊門檻時收到通知。
選用:在「通知管道」中新增 Cloud Monitoring 管道,以便在模型超過快訊門檻時收到通知。您可以選取現有的 Cloud Monitoring 管道,也可以按一下「管理通知管道」建立新管道。 Google Cloud 控制台支援 PagerDuty、Slack 和 Pub/Sub 通知管道。
點選「建立」。
API
使用 Vertex AI API 傳送批次推論要求。根據您用來取得批次推論結果的工具,選取對應的分頁。
REST
使用任何要求資料之前,請先替換以下項目:
LOCATION_ID:儲存模型和執行批次預測工作的區域。例如:
us-central1
。PROJECT_ID:您的專案 ID。
BATCH_JOB_NAME:批次預測工作的顯示名稱。
MODEL_ID:用於進行預測的模型 ID。
INPUT_FORMAT:輸入資料的格式:
jsonl
、csv
、tf-record
、tf-record-gzip
或file-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
分頁。
Python
如要瞭解如何安裝或更新 Python 適用的 Vertex AI SDK,請參閱「安裝 Python 適用的 Vertex AI SDK」。 詳情請參閱 Python API 參考說明文件。
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 專案的 IDSOURCE_DATASET_NAME
:來源 BigQuery 資料集的名稱SOURCE_TABLE_NAME
:BigQuery 來源資料表的名稱DESTINATION_PROJECT_ID
:目的地 Google Cloud 專案的 IDDESTINATION_DATASET_NAME
:目的地 BigQuery 資料集的名稱DESTINATION_TABLE_NAME
:BigQuery 目的地資料表的名稱
特徵重要性
如要為推論傳回特徵重要性值,請將 generateExplanation
屬性設為 true
。請注意,預測模型不支援特徵重要性,因此您無法將其納入批次推論要求。
特徵重要性 (有時稱為「特徵歸因」) 是 Vertex Explainable AI 的一部分。
只有在設定Model
說明的 Model
,或指定 BatchPredictionJob
的 explanationSpec
欄位時,才能將 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
我們不建議對大量資料執行以特徵為準的說明。這是因為根據可能的特徵值組合,每個輸入內容可能會擴展為數千個要求,導致處理時間和成本大幅增加。一般來說,小型資料集就足以瞭解特徵重要性。
批次推論不支援以範例為基礎的解釋。
筆記本
後續步驟
- 瞭解推論的運算資源。