Vertex AI 的線上預測服務可讓您對自己的預測模型端點發出同步要求。
本頁面說明如何將要求傳送至模型,讓模型以低延遲的方式提供線上預測結果。
事前準備
如要開始使用線上預測 API,必須先準備專案並取得適當的憑證。
取得線上預測前,請先按照下列步驟操作:
- 設定 Vertex AI 專案。
如要取得存取線上預測所需的權限,請要求專案 IAM 管理員授予您 Vertex AI 預測使用者 (
vertex-ai-prediction-user) 角色。如要瞭解這個角色,請參閱「準備 IAM 權限」。
建立及訓練預測模型,並以支援的容器為目標。
建立預測叢集,並確保專案允許外部傳入流量。
顯示預測模型的
Endpoint自訂資源詳細資料:kubectl --kubeconfig PREDICTION_CLUSTER_KUBECONFIG get endpoint PREDICTION_ENDPOINT -n PROJECT_NAMESPACE -o jsonpath='{.status.endpointFQDN}'更改下列內容:
PREDICTION_CLUSTER_KUBECONFIG:預測叢集中的 kubeconfig 檔案路徑。PREDICTION_ENDPOINT:端點名稱。PROJECT_NAMESPACE:預測專案命名空間的名稱。
輸出內容必須顯示
status欄位,並在endpointFQDN欄位中顯示端點的完整網域名稱。註冊這個端點網址路徑,以用於要求。
設定環境變數
如要使用 Python 指令碼傳送要求至模型端點,並在專案中設定服務帳戶,以程式輔助方式進行授權 API 呼叫,您可以在指令碼中定義環境變數,以便在執行時存取服務帳戶金鑰等值。
請按照下列步驟,在 Python 指令碼中設定必要環境變數:
建立 JupyterLab 筆記本,與線上預測 API 互動。
在 JupyterLab 筆記本上建立 Python 指令碼。
在 Python 指令碼中新增下列程式碼:
import os os.environ["GOOGLE_APPLICATION_CREDENTIALS"] = "APPLICATION_DEFAULT_CREDENTIALS_FILENAME"將
APPLICATION_DEFAULT_CREDENTIALS_FILENAME替換為包含您在專案中建立的服務帳戶金鑰的 JSON 檔案名稱,例如my-service-key.json。將 Python 指令碼儲存為
prediction.py等名稱。執行 Python 指令碼來設定環境變數:
python SCRIPT_NAME將
SCRIPT_NAME替換為您為 Python 指令碼提供的名稱,例如prediction.py。
向端點傳送要求
向模型端點提出要求,取得線上預測結果:
curl
請按照下列步驟提出 curl 要求:
建立名為
request.json的 JSON 檔案做為要求主體。您必須新增線上預測的輸入內容並設定格式,並提供目標容器所需的要求主體詳細資料。
提出要求:
curl -X POST -H "Content-Type: application/json; charset=utf-8" -H "Authorization: Bearer TOKEN" https://ENDPOINT_HOSTNAME:443/v1/model:predict -d @request.json更改下列內容:
TOKEN:您取得的驗證權杖。ENDPOINT_HOSTNAME:線上預測要求的模型端點 FQDN。
如果成功,您會收到線上預測要求的 JSON 回應。
以下為輸出範例:
{
"predictions": [[-357.10849], [-171.621658]
]
}
如要進一步瞭解回應,請參閱「回應本文詳細資料」。
Python
如要透過 Python 指令碼使用線上預測服務,請按照下列步驟操作:
建立名為
request.json的 JSON 檔案做為要求主體。您必須新增線上預測的輸入內容並設定格式,並提供目標容器所需的要求主體詳細資料。
在您建立的 Python 指令碼中新增下列程式碼:
import json import os from typing import Sequence import grpc from absl import app from absl import flags import google from google.auth.transport import requests from google.protobuf import json_format from google.protobuf.struct_pb2 import Value from google.cloud.aiplatform_v1.services import prediction_service _INPUT = flags.DEFINE_string("input", None, "input", required=True) _ENDPOINT_HOSTNAME = flags.DEFINE_string("endpoint_hostname", None, "Prediction endpoint FQDN", required=True) _PROJECT_NAME = flags.DEFINE_string("project_name", None, "project name", required=True) _ENDPOINT_NAME = flags.DEFINE_string("endpoint_name", None, "endpoint name", required=True) os.environ["GRPC_DEFAULT_SSL_ROOTS_FILE_PATH"] = "path-to-ca-cert-file.cert" def get_sts_token(endpoint_hostname): creds = None try: creds, _ = google.auth.default() creds = creds.with_gdch_audience("https://"+endpoint_hostname+":443") req = requests.Request() creds.refresh(req) print("Got token: ") print(creds.token) except Exception as e: print("Caught exception" + str(e)) raise e return creds.token # predict_client_secure builds a client that requires TLS def predict_client_secure(endpoint_hostname, token): with open(os.environ["GRPC_DEFAULT_SSL_ROOTS_FILE_PATH"], 'rb') as f: channel_creds = grpc.ssl_channel_credentials(f.read()) call_creds = grpc.access_token_call_credentials(token) creds = grpc.composite_channel_credentials( channel_creds, call_creds, ) client = prediction_service.PredictionServiceClient( transport=prediction_service.transports.grpc.PredictionServiceGrpcTransport( channel=grpc.secure_channel(target=endpoint_hostname+":443", credentials=creds))) return client def predict_func(client, instances): # The endpoint resource name is required for authorization. # A wrong value might lead to an access denied error. endpoint_resource_name = f"projects/{_PROJECT_NAME.value}/locations/{_PROJECT_NAME.value}/endpoints/{_ENDPOINT_NAME.value}" resp = client.predict( endpoint=endpoint_resource_name, instances=instances, metadata=[("x-vertex-ai-endpoint-id", _ENDPOINT_NAME.value)] ) print(resp) def main(argv: Sequence[str]): del argv # Unused. with open(_INPUT.value) as json_file: data = json.load(json_file) instances = [json_format.ParseDict(s, Value()) for s in data["instances"]] token = get_sts_token(_ENDPOINT_HOSTNAME.value) client = predict_client_secure(_ENDPOINT_HOSTNAME.value, token) predict_func(client=client, instances=instances) if __name__=="__main__": app.run(main)將 Python 指令碼儲存為
prediction.py等名稱。向預測伺服器提出要求:
python SCRIPT_NAME --input request.json \ --endpoint_hostname ENDPOINT_FQDN \ --project_name PROJECT_NAME \ --endpoint_name ENDPOINT_NAME \更改下列內容:
SCRIPT_NAME:Python 指令碼的名稱,例如prediction.py。ENDPOINT_FQDN:線上預測要求的端點完整網域名稱。PROJECT_NAME:端點的專案名稱。ENDPOINT_NAME:要呼叫的端點名稱。
如果成功,您會收到線上預測要求的 JSON 回應。 如要進一步瞭解回應,請參閱「回應本文詳細資料」。