如要依據應用程式輸入內容發出要求,或是需要及時進行推論 (即時回應),您可以選用「線上預測」模式。
本頁面說明如何使用 Online Prediction API,為自訂訓練模型設定線上預測要求的格式,並提供要求和回應範例。設定要求格式後,即可取得線上預測結果。
事前準備
如要驗證模型部署狀態及傳送線上預測要求,請向管理員要求必要權限。
要求 IAM 角色
請與 IAM 專案管理員聯絡,要求在專案命名空間中取得下列角色:
- Vertex AI 預測檢視者 (
vertex-ai-prediction-viewer):查看DeployedModel和Endpoint自訂資源,以及檢查部署狀態。 - Vertex AI Prediction 使用者 (
vertex-ai-prediction-user):存取 Online Prediction 服務,將預測要求傳送至模型端點。
如要進一步瞭解這些角色,請參閱「準備 IAM 權限」。
確認模型和端點是否就緒
設定線上預測要求格式前,請先完成下列步驟:
- 匯出模型構件以進行預測。
-
這項操作會將運算資源與模型建立關聯,讓模型以低延遲的方式提供線上預測結果。
檢查模型的
DeployedModel自訂資源狀態,確認已可接受預測要求:kubectl --kubeconfig PREDICTION_CLUSTER_KUBECONFIG get -f DEPLOYED_MODEL_NAME.yaml -o jsonpath='{.status.primaryCondition}'更改下列內容:
PREDICTION_CLUSTER_KUBECONFIG:預測叢集中的 kubeconfig 檔案路徑。DEPLOYED_MODEL_NAME:DeployedModel定義檔案的名稱。
主要條件必須顯示
DeployedModel已就緒。以下輸出內容顯示回應範例:
{"firstObservedTime":"2024-01-19T01:18:30Z","lastUpdateTime":"2024-01-19T01:35:47Z","message":"DeployedModel is ready", "observedGeneration":1, "reason":"Ready", "resourceName":"my-tf-model","type":"DeployedModel"}檢查
Endpoint自訂資源的狀態,確認已可接受預測要求:kubectl --kubeconfig PREDICTION_CLUSTER_KUBECONFIG get -f ENDPOINT_NAME.yaml -o jsonpath='{$.status.conditions[?(@.type == "EndpointReady")]}'更改下列內容:
PREDICTION_CLUSTER_KUBECONFIG:預測叢集中的 kubeconfig 檔案路徑。ENDPOINT_NAME:Endpoint定義檔案的名稱。
EndpointReady條件的status欄位必須顯示True值。以下輸出內容顯示回應範例:
{"lastTransitionTime":"2024-01-19T05:12:26Z","message":"Endpoint Ready", "observedGeneration":1,"reason":"ResourceReady","status":"True","type":"EndpointReady"}%
設定線上預測的輸入內容格式
線上預測功能提供下列兩種傳送要求的方法:
- 預測要求:傳送要求至
predict方法,取得線上預測結果。 - 原始預測要求:向
rawPredict方法傳送要求,即可使用任意 HTTP 酬載,不必遵循 JSON 格式。
如果您需要低延遲,請取得原始預測,因為 rawPredict 會略過序列化步驟,直接將要求轉送至預測容器。
本節說明如何使用 JSON 設定預測輸入執行個體的格式和編碼,如果您使用 predict 方法,就必須執行這項操作。如果您使用 rawPredict 方法,則不需要這項資訊。
如果您使用 Vertex AI SDK for Python 傳送預測要求,請指定不含 instances 欄位的執行個體清單。例如,指定 [
["the","quick","brown"], ... ],而非 { "instances": [
["the","quick","brown"], ... ] }。
將執行個體格式化為 JSON 字串
線上預測的基本格式是資料執行個體清單。這些值可以是純值清單,也可以是 JSON 物件的成員,具體取決於您在訓練應用程式中設定輸入的方式。TensorFlow 模型可接受更複雜的輸入內容。
以下範例顯示 TensorFlow 模型的輸入張量和執行個體索引鍵:
{"values": [1, 2, 3, 4], "key": 1}
只要 JSON 字串的格式符合下列規則,其構成內容就可以較為複雜:
執行個體資料的頂層必須是 JSON 物件,也就是鍵/值組合的字典。
樣本物件的個別值可以是字串、數字或清單。您無法嵌入 JSON 物件。
清單只能包含相同類型的項目 (包括其他清單)。請勿混用字串和數值。
您會將線上預測的輸入執行個體,做為 predict 呼叫的訊息內文傳遞。進一步瞭解要求主體的格式規定。
將每個例項設為 JSON 陣列中的項目,並將陣列做為 JSON 物件的 instances 欄位提供,如下例所示:
{"instances": [
{"values": [1, 2, 3, 4], "key": 1},
{"values": [5, 6, 7, 8], "key": 2}
]}
為預測輸入內容編碼二進位資料
您無法將二進位資料格式化為 JSON 支援的 UTF-8 編碼字串。如果輸入內容含有二進位資料,請使用 Base64 編碼表示。您需要使用下列特殊格式:
將編碼字串格式化為 JSON 物件,並使用名為
b64的單一鍵。在 Python 3 中,base64 編碼會輸出位元組序列。將這個序列轉換為字串,使其可序列化為 JSON:{'image_bytes': {'b64': base64.b64encode(jpeg_data).decode()}}在 TensorFlow 模型程式碼中,為二進位輸入和輸出張量的別名命名,結尾為
_bytes。
要求和回應範例
本節說明線上預測要求和回應主體的格式,並提供 TensorFlow 和 PyTorch 的範例。
要求主體詳細資料
TensorFlow
要求主體包含結構如下的資料 (JSON 表示法):
{
"instances": [
<value>|<simple/nested list>|<object>,
...
]
}
instances[] 物件為必要項目,且必須包含要取得預測結果的執行個體清單。
執行個體清單中每個元素的結構,取決於模型的輸入定義。執行個體可以包含具名輸入內容 (做為物件),也可以只包含未加上標籤的值。
只有部分資料會包含已命名的輸入。部分例項是 JSON 值 (布林值、數字或字串)。不過,例項通常是值清單或複雜的巢狀清單。
以下是幾個要求主體範例:
- CSV 資料,每列編碼為字串值:
{"instances": ["1.0,true,\\"x\\"", "-2.0,false,\\"y\\""]}
- 純文字:
{"instances": ["the quick brown fox", "the lazy dog"]}
- 編碼為字詞清單 (字串向量) 的句子:
{
"instances": [
["the","quick","brown"],
["the","lazy","dog"],
...
]
}
- 浮點純量值:
{"instances": [0.0, 1.1, 2.2]}
- 整數向量:
{
"instances": [
[0, 1, 2],
[3, 4, 5],
...
]
}
- 張量 (在本例中為二維張量):
{
"instances": [
[
[0, 1, 2],
[3, 4, 5]
],
...
]
}
- 圖片,可透過不同方式呈現:
在這個編碼配置中,前兩個維度代表圖片的列和欄,第三個維度則包含每個像素的 R、G 和 B 值清單 (向量):
{
"instances": [
[
[
[138, 30, 66],
[130, 20, 56],
...
],
[
[126, 38, 61],
[122, 24, 57],
...
],
...
],
...
]
}
資料編碼
JSON 字串的編碼必須為 UTF-8。如要傳送二進位資料,必須先將資料進行 base64 編碼,並標示為二進位。如要將 JSON 字串標示為二進位,請將其替換為具有單一屬性 b64 的 JSON 物件:
{"b64": "..."}
以下範例顯示兩個序列化的 tf.Examples 執行個體,需要 base64 編碼 (假資料,僅供說明):
{"instances": [{"b64": "X5ad6u"}, {"b64": "IA9j4nx"}]}
以下範例顯示兩個 JPEG 圖片位元組字串,需要 base64 編碼 (假資料,僅供說明):
{"instances": [{"b64": "ASa8asdf"}, {"b64": "JLK7ljk3"}]}
多個輸入張量
部分模型具有基礎 TensorFlow 圖,可接受多個輸入張量。在這種情況下,請使用 JSON 鍵/值組合的名稱來識別輸入張量。
對於具有輸入張量別名 tag (字串) 和 image (Base64 編碼字串) 的圖表:
{
"instances": [
{
"tag": "beach",
"image": {"b64": "ASa8asdf"}
},
{
"tag": "car",
"image": {"b64": "JLK7ljk3"}
}
]
}
對於輸入張量別名為 tag (字串) 和 image (8 位元整數的 3 維陣列) 的圖表:
{
"instances": [
{
"tag": "beach",
"image": [
[
[138, 30, 66],
[130, 20, 56],
...
],
[
[126, 38, 61],
[122, 24, 57],
...
],
...
]
},
{
"tag": "car",
"image": [
[
[255, 0, 102],
[255, 0, 97],
...
],
[
[254, 1, 101],
[254, 2, 93],
...
],
...
]
},
...
]
}
PyTorch
如果模型使用 PyTorch 預建容器,TorchServe 的預設處理常式會預期每個執行個體都包裝在 data 欄位中。例如:
{
"instances": [
{ "data": , <value> },
{ "data": , <value> }
]
}
回應主體詳細資料
如果呼叫成功,回應主體會包含要求主體中每個執行個體的一筆預測項目,並依相同順序提供:
{
"predictions": [
{
object
}
],
"deployedModelId": string
}
如果任何執行個體的預測失敗,回應主體就不會包含任何預測。而是包含一個錯誤項目:
{
"error": string
}
predictions[] 物件包含預測結果清單,要求中的每個執行個體各有一個。
發生錯誤時,error 字串會包含描述問題的訊息。如果處理任何執行個體時發生錯誤,系統會傳回錯誤,而非預測清單。
雖然每個執行個體都有一個預測,但預測的格式與執行個體的格式沒有直接關聯。預測結果會採用模型定義的輸出內容集合中指定的格式。預測結果集合會以 JSON 清單形式傳回。清單中的每個成員都可以是值、清單或任何複雜度的 JSON 物件。如果模型有多個輸出張量,則每項預測都是 JSON 物件,其中包含每個輸出的鍵/值組合。鍵會識別圖表中的輸出別名。
回應主體範例
以下範例顯示 TensorFlow 可能的回應:
三個輸入例項的一組預測,其中每個預測都是整數值:
{"predictions": [5, 4, 3], "deployedModelId": 123456789012345678 }一組更複雜的預測,每個預測包含兩個具名值,分別對應至名為
label和scores的輸出張量。label的值是預測類別 (car 或 beach),而scores則包含該執行個體在可能類別中的機率清單:{ "predictions": [ { "label": "beach", "scores": [0.1, 0.9] }, { "label": "car", "scores": [0.75, 0.25] } ], "deployedModelId": 123456789012345678 }如果處理輸入樣本時發生錯誤,則回應如下:
{"error": "Divide by zero"}