Vertex AI 提供兩種選項,可使用經過訓練的預測模型預測未來值:線上推論和批次推論。
線上推論是同步要求。如要依據應用程式輸入內容發出要求,或是需要及時進行推論,您可以選用線上推論模式。
批次推論要求為非同步要求。如果您不需要立即取得回應,並想透過單一要求處理累積的資料,就適合使用批次推論功能。
本頁面說明如何使用線上推論功能預測未來值。如要瞭解如何使用批次推論來預測值,請參閱「取得預測模型的批次推論」。
您必須先將模型部署至端點,才能用於推論。端點是一組實體資源。
您可以要求系統提供說明,而非推論。說明的區域特徵重要性值會指出各項特徵對推論結果的貢獻程度。如需概念總覽,請參閱「預測功能歸因」。
如要瞭解線上推論的定價,請參閱「資料表工作流程的定價」。
事前準備
您必須先訓練模型,才能提出線上推論要求。
建立或選取端點
使用 aiplatform.Endpoint.create()
函式建立端點。如果您已擁有端點,請使用 aiplatform.Endpoint()
函式選取端點。
以下程式碼提供範例:
# Import required modules
from google.cloud import aiplatform
from google.cloud.aiplatform import models
PROJECT_ID = "PROJECT_ID"
REGION = "REGION"
# Initialize the Vertex SDK for Python for your project.
aiplatform.init(project=PROJECT_ID, location=REGION)
endpoint = aiplatform.Endpoint.create(display_name='ENDPOINT_NAME')
更改下列內容:
- PROJECT_ID:您的專案 ID。
- REGION:您使用 Vertex AI 的區域。
- ENDPOINT_NAME:端點的顯示名稱。
選取已訓練的模型
使用 aiplatform.Model()
函式選取已訓練的模型:
# Create reference to the model trained ahead of time.
model_obj = models.Model("TRAINED_MODEL_PATH")
更改下列內容:
- TRAINED_MODEL_PATH:例如
projects/PROJECT_ID/locations/REGION/models/[TRAINED_MODEL_ID]
將模型部署至端點
使用 deploy()
函式將模型部署至端點。以下程式碼提供範例:
deployed_model = endpoint.deploy(
model_obj,
machine_type='MACHINE_TYPE',
traffic_percentage=100,
min_replica_count='MIN_REPLICA_COUNT',
max_replica_count='MAX_REPLICA_COUNT',
sync=True,
deployed_model_display_name='DEPLOYED_MODEL_NAME',
)
更改下列內容:
- MACHINE_TYPE:例如
n1-standard-8
。進一步瞭解機器類型。 - MIN_REPLICA_COUNT:此部署作業的節點數量下限。節點數量可視推論負載需求增加或減少,最多可達節點數量上限,且絕不會低於這個數量。這個值必須大於或等於 1。如果未設定
min_replica_count
變數,則預設值為1
。 - MAX_REPLICA_COUNT:此部署作業的節點數量上限。節點數量可視推論負載需求增加或減少,但不得超過這個數量,也不能少於節點數量下限。如果您未設定
max_replica_count
變數,則節點的最大數量會設為min_replica_count
的值。 - DEPLOYED_MODEL_NAME:
DeployedModel
的名稱。您也可以為DeployedModel
使用Model
的顯示名稱。
模型部署作業大約需要 10 分鐘。
取得線上推論
如要取得推論結果,請使用 predict()
函式,並提供一或多個輸入例項。以下程式碼為範例:
predictions = endpoint.predict(instances=[{...}, {...}])
每個輸入例項都是 Python 字典,且與模型訓練時使用的結構相同。必須包含與時間欄相對應的「可用於預測」鍵/值組合,以及包含指定推論欄歷史值的「無法用於預測」鍵/值組合。Vertex AI 預期每個輸入例項都屬於單一時間序列。執行個體中的鍵/值組合順序不重要。
輸入例項有下列限制:
- 可用於預測 鍵/值組合必須包含相同數量的資料點。
- 無法在預測中使用 鍵/值組合必須具有相同的資料點數。
- 「可用於預測」鍵/值組合中至少要有與「無法使用於預測」鍵/值組合相同的資料點。
如要進一步瞭解預測中使用的欄類型,請參閱「預測時的特徵類型和可用性」。
以下程式碼示範一組兩個輸入例項。Category
欄包含屬性資料。Timestamp
欄包含預測時可用的資料。三個點是情境資料,兩個點是時間軸資料。Sales
欄包含預測時無法使用的資料。這三個點都是情境資料。如要瞭解如何在預測中使用背景和時間範圍,請參閱「預測時間範圍、背景區間和預測區間」。
instances=[
{
# Attribute
"Category": "Electronics",
# Available at forecast: three days of context, two days of horizon
"Timestamp": ['2023-08-03', '2023-08-04', '2023-08-05', '2023-08-06', '2023-08-07'],
# Unavailable at forecast: three days of context
"Sales": [490.50, 325.25, 647.00],
},
{
# Attribute
"Category": "Food",
# Available at forecast: three days of context, two days of horizon
"Timestamp": ['2023-08-03', '2023-08-04', '2023-08-05', '2023-08-06', '2023-08-07'],
# Unavailable at forecast: three days of context
"Sales": [190.50, 395.25, 47.00],
}
])
對於每個例項,Vertex AI 會回傳兩次 Sales
推論,對應至兩個時間軸時間戳記 (「2023-08-06」和「2023-08-07」)。
為獲得最佳效能,每個輸入例項中的脈絡資料點數量和視野資料點數量,必須與模型訓練時使用的脈絡和視野長度相符。如果不相符,Vertex AI 會填充或截斷執行個體,以符合模型的大小。
如果輸入例項中的內容資料點數少於或多於用於模型訓練的內容資料點數,請確認所有可用於預測鍵/值組和所有無法用於預測鍵/值組的點數一致。
舉例來說,假設模型是使用四天的背景資料和兩天的前景資料訓練而成。您只需三天的背景資訊資料,就能提出推論要求。在這種情況下,「無法在預測時使用」鍵/值組合包含三個值。可在預測中使用 鍵/值組合必須包含五個值。
線上推論的輸出內容
Vertex AI 會在 value
欄位中提供線上推論輸出內容:
{
'value': [...]
}
推論回應的長度取決於模型訓練中使用的時間範圍,以及輸入例項的時間範圍。推論回應的長度為這兩個值中最小者。
請見以下範例:
- 您使用
context
=15
和horizon
=50
訓練模型。輸入例項為context
=15
和horizon
=20
。推論回應的長度為20
。 - 您使用
context
=15
和horizon
=50
訓練模型。輸入例項為context
=15
和horizon
=100
。推論回應的長度為50
。
TFT 模型的線上推論輸出內容
對於使用 時間融合轉換器 (TFT) 訓練的模型,Vertex AI 除了在 value
欄位中提供推論外,還提供 TFT 可解釋性 tft_feature_importance
:
{
"tft_feature_importance": {
"attribute_weights": [...],
"attribute_columns": [...],
"context_columns": [...],
"context_weights": [...],
"horizon_weights": [...],
"horizon_columns": [...]
},
"value": [...]
}
attribute_columns
:不隨時間變化的預測功能。attribute_weights
:與每個attribute_columns
相關聯的權重。context_columns
:預測功能,其內容窗格值可做為 TFT 長短期記憶 (LSTM) 編碼器的輸入內容。context_weights
:與預測例項的每個context_columns
相關聯的特徵重要性權重。horizon_columns
:預測功能,其預測時間範圍值做為 TFT 長短期記憶 (LSTM) 解碼器的輸入內容。horizon_weights
:與預測例項的每個horizon_columns
相關聯的特徵重要性權重。
針對以群數損失函數最佳化的模型,產生線上推論輸出內容
對於針對百分位數損失進行最佳化的模型,Vertex AI 會提供以下線上推論輸出內容:
{
"value": [...],
"quantile_values": [...],
"quantile_predictions": [...]
}
-
value
:如果您的量數集包含中位數,value
就是中位數的推論值。否則,value
是集合中最低分位數的推論值。舉例來說,如果您的分位數集為[0.1, 0.5, 0.9]
,value
就是分位數0.5
的推論。如果您的分位數集為[0.1, 0.9]
,value
就是分位數0.1
的推論。 quantile_values
:百分位數的值,會在模型訓練期間設定。-
quantile_predictions
:與 quantile_values 相關聯的推論值。
舉例來說,假設模型的目標欄是銷售價值。分位數值的定義為 [0.1, 0.5, 0.9]
。Vertex AI 會傳回下列分位數推論:[4484, 5615, 6853]
。在此情況下,分位數集包含中位數,因此 value
是分位數 0.5
(5615
) 的推論。分位數推論可解讀如下:
P(sales value < 4484)
= 10%P(sales value < 5615)
= 50%P(sales value < 6853)
= 90%
針對具有機率推論功能的模型,線上推論輸出內容
如果模型使用機率推論,value
欄位就會包含最佳化目標的最小化器。舉例來說,如果最佳化目標是 minimize-rmse
,value
欄位就會包含平均值。如果是 minimize-mae
,value
欄位就會包含中位值。
如果模型使用機率推論和分位數,除了最佳化目標的最小化器之外,Vertex AI 也會提供分位數值和推論。百分位值會在模型訓練期間設定。分位數推論是與分位數值相關聯的推論值。
取得線上說明
如要取得說明,請使用 explain()
函式,並提供一或多個輸入例項。以下程式碼為範例:
explanations = endpoint.explain(instances=[{...}, {...}])
線上推論和線上解釋的輸入例項格式相同。詳情請參閱「取得線上推論」。
如要瞭解特徵歸因的概念總覽,請參閱「預測功能歸因」。
線上說明的輸出內容
以下程式碼示範如何輸出說明結果:
# Import required modules
import json
from google.protobuf import json_format
def explanation_to_dict(explanation):
"""Converts the explanation proto to a human-friendly json."""
return json.loads(json_format.MessageToJson(explanation._pb))
for response in explanations.explanations:
print(explanation_to_dict(response))
說明結果的格式如下:
{
"attributions": [
{
"baselineOutputValue": 1.4194682836532593,
"instanceOutputValue": 2.152980089187622,
"featureAttributions": {
...
"store_id": [
0.007947325706481934
],
...
"dept_id": [
5.960464477539062e-08
],
"item_id": [
0.1100526452064514
],
"date": [
0.8525647521018982
],
...
"sales": [
0.0
]
},
"outputIndex": [
2
],
"approximationError": 0.01433318599207033,
"outputName": "value"
},
...
]
}
attributions
元素的數量取決於模型訓練中使用的時間範圍,以及輸入例項的時間範圍。元素數量是這兩個值中最小者。
attributions
元素中的 featureAttributions
欄位,會為輸入資料集中的每個資料欄提供一個值。Vertex AI 會為所有類型的地圖產生說明,包括屬性、可用於預測和無法用於預測。如要進一步瞭解 attributions
元素的欄位,請參閱「歸因」。
刪除端點
使用 undeploy_all()
和 delete()
函式刪除端點。以下程式碼為範例:
endpoint.undeploy_all()
endpoint.delete()
後續步驟
- 瞭解線上推論的定價。