借助 Vertex AI 的在线预测服务,您可以向自己的预测模型端点发出同步请求。
本页面介绍了如何向模型发送请求,以便模型能够以低延迟方式执行在线预测。
准备工作
在开始使用在线预测 API 之前,您必须拥有一个项目和相应的凭据。
在获取在线预测结果之前,请按照以下步骤操作:
- 为 Vertex AI 设置项目。
如需获得访问在线预测所需的权限,请让项目 IAM 管理员向您授予 Vertex AI Prediction User (
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 响应。如需详细了解响应,请参阅响应正文详细信息。