本页面介绍了如何使用 Google Cloud 控制台或 Vertex AI API 从自定义训练模型获取在线(实时)预测结果。
格式化输入以进行在线预测
本部分介绍了如何设置预测输入实例的格式并编码为 JSON,如果您使用的是 predict
或 explain
方法,则需要执行此操作。如果您使用的是 rawPredict
方法,则不需要执行此操作。如需了解选择哪种方法,请参阅向端点发送请求。
如果您使用 Vertex AI SDK for Python 发送预测请求,请指定不带 instances
字段的实例列表。例如,指定 [
["the","quick","brown"], ... ]
而不是 { "instances": [
["the","quick","brown"], ... ] }
。
如果您的模型使用自定义容器,则输入必须采用 JSON 格式,并且还有一个可用于容器的额外 parameters
字段。详细了解如何使用自定义容器设置预测输入的格式。
将实例格式设置为 JSON 字符串
在线预测的基本格式是数据实例列表。这些列表可以是普通的值列表,也可以是 JSON 对象的成员,具体取决于您在训练应用中配置输入的方式。TensorFlow 模型可以接受更复杂的输入,大多数 scikit-learn 和 XGBoost 模型则接受数字列表形式的输入。
以下示例显示了 TensorFlow 模型的输入张量和实例键:
{"values": [1, 2, 3, 4], "key": 1}
JSON 字符串的构成可以很复杂,但只要遵循以下规则即可:
顶级实例数据必须是 JSON 对象,即键值对的字典。
实例对象中的各个值可以是字符串、数字或列表。 您无法嵌入 JSON 对象。
列表必须仅包含相同类型的内容(包括其他列表)。您不能混合使用字符串和数值。
您将在线预测的输入实例作为 projects.locations.endpoints.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、scikit-learn、XGBoost 的示例。
请求正文详情
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": "..."}
以下示例展示了两个需要 base64 编码的序列化 tf.Examples
实例(虚构的数据,仅作说明之用):
{"instances": [{"b64": "X5ad6u"}, {"b64": "IA9j4nx"}]}
以下示例显示两个需要 base64 编码的 JPEG 图片字节字符串(虚构的数据,仅作说明之用):
{"instances": [{"b64": "ASa8asdf"}, {"b64": "JLK7ljk3"}]}
多个输入张量
一些模型具有可接受多个输入张量的底层 TensorFlow 图。在这种情况下,请使用 JSON 名称/值对的名称来识别输入张量。
对于带有输入张量别名“tag”(字符串)和“image”(base64 编码的字符串)的图,请使用以下代码:
{ "instances": [ { "tag": "beach", "image": {"b64": "ASa8asdf"} }, { "tag": "car", "image": {"b64": "JLK7ljk3"} } ] }
对于带有输入张量别名“tag”(字符串)和“image”(8 位整数的三维数组)的图,请使用以下代码:
{ "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], ... ], ... ] }, ... ] }
scikit-learn
请求正文包含的数据采用以下结构(JSON 表示法):
{
"instances": [
<simple list>,
...
]
}
instances[]
是必需对象,而且必须包含待预测实例的列表。在以下示例中,每个输入实例都是一个浮点数列表:
{
"instances": [
[0.0, 1.1, 2.2],
[3.3, 4.4, 5.5],
...
]
}
输入实例的维度必须与模型所期望的维度一致。例如,如果模型需要三个特征,则每个输入实例的长度必须为 3。
XGBoost
请求正文包含的数据采用以下结构(JSON 表示法):
{
"instances": [
<simple list>,
...
]
}
instances[]
是必需对象,而且必须包含待预测实例的列表。在以下示例中,每个输入实例都是一个浮点数列表:
{
"instances": [
[0.0, 1.1, 2.2],
[3.3, 4.4, 5.5],
...
]
}
输入实例的维度必须与模型所期望的维度一致。例如,如果模型需要三个特征,则每个输入实例的长度必须为 3。
对于 XGBoost 的输入实例,Vertex AI 不支持稀疏表示法。
在线预测服务以不同方式解析零和 NaN
。如果特征值为零,请使用 0.0
作为相应的输入。如果缺少特征值,请使用 "NaN"
作为相应的输入。
以下示例表示具有单个输入实例的预测请求,其中第一个特征的值是 0.0,第二个特征的值是 1.1,第三个特征的值缺失:
{"instances": [[0.0, 1.1, "NaN"]]}
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"}
scikit-learn
以下示例展示了一些可能的响应:
-
三个输入实例的一组简单预测结果,其中每个预测结果均为一个整数值:
{"predictions": [5, 4, 3], "deployedModelId": 123456789012345678 }
-
处理输入实例出错时的响应:
{"error": "Divide by zero"}
XGBoost
以下示例展示了一些可能的响应:
-
三个输入实例的一组简单预测结果,其中每个预测结果均为一个整数值:
{"predictions": [5, 4, 3], "deployedModelId": 123456789012345678 }
-
处理输入实例出错时的响应:
{"error": "Divide by zero"}
向端点发送请求
可通过三种方式来发送请求:
原始预测结果请求:向
rawPredict
发送请求,以便使用任意 HTTP 载荷,而不是遵循本页面的设置输入格式部分中所述的准则。在以下情况下,您可能需要获取原始预测结果:- 您使用的是自定义容器,该容器接收请求并发送与准则不同的响应。
- 需要更低延迟。
rawPredict
会跳过序列化步骤并直接将请求转发到预测容器。 - 您正在使用 NVIDIA Triton 执行预测。
说明请求:向
explain
发送请求。如果您已针对 Vertex Explainable AI 配置Model
,则可以获取在线说明。 在线说明请求的格式与在线预测请求的格式相同,它们返回类似的响应,唯一的区别在于在线说明响应包含特征归因和预测结果。
发送在线预测请求
gcloud
以下示例使用 gcloud ai endpoints predict
命令:
将以下 JSON 对象写入本地环境中的文件。文件名无关紧要,但在本示例中,请将文件命名为
request.json
。{ "instances": INSTANCES }
替换以下内容:
- INSTANCES:要为其获取预测的实例的 JSON 数组。每个实例的格式取决于经过训练的机器学习模型需要的输入。如需了解详情,请参阅格式化输入以进行在线预测。
运行以下命令:
gcloud ai endpoints predict ENDPOINT_ID \ --region=LOCATION_ID \ --json-request=request.json
替换以下内容:
- ENDPOINT_ID:端点的 ID。
- LOCATION_ID:您在其中使用 Vertex AI 的区域。
REST
在使用任何请求数据之前,请先进行以下替换:
- LOCATION_ID:您在其中使用 Vertex AI 的区域。
- PROJECT_ID:您的项目 ID
- ENDPOINT_ID:端点的 ID。
- INSTANCES:要为其获取预测的实例的 JSON 数组。每个实例的格式取决于经过训练的机器学习模型需要的输入。如需了解详情,请参阅格式化输入以进行在线预测。
HTTP 方法和网址:
POST https://LOCATION_ID-aiplatform.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION_ID/endpoints/ENDPOINT_ID:predict
请求 JSON 正文:
{ "instances": INSTANCES }
如需发送请求,请选择以下方式之一:
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/endpoints/ENDPOINT_ID:predict"
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/endpoints/ENDPOINT_ID:predict" | Select-Object -Expand Content
- PREDICTIONS:预测结果的 JSON 数组,其中每个预测结果对应请求正文中包含的一个实例。
-
DEPLOYED_MODEL_ID:执行预测的
DeployedModel
的 ID。
{ "predictions": PREDICTIONS, "deployedModelId": "DEPLOYED_MODEL_ID" }
Java
在尝试此示例之前,请按照《Vertex AI 快速入门:使用客户端库》中的 Java 设置说明执行操作。 如需了解详情,请参阅 Vertex AI Java API 参考文档。
如需向 Vertex AI 进行身份验证,请设置应用默认凭据。 如需了解详情,请参阅为本地开发环境设置身份验证。
Node.js
在尝试此示例之前,请按照《Vertex AI 快速入门:使用客户端库》中的 Node.js 设置说明执行操作。 如需了解详情,请参阅 Vertex AI Node.js API 参考文档。
如需向 Vertex AI 进行身份验证,请设置应用默认凭据。 如需了解详情,请参阅为本地开发环境设置身份验证。
Python
如需了解如何安装或更新 Vertex AI SDK for Python,请参阅安装 Vertex AI SDK for Python。 如需了解详情,请参阅 Python API 参考文档。
向专用端点发送在线预测请求
专用端点使用新的网址路径。您可以从 REST API 中的 dedicatedEndpointDns
字段或 Vertex AI SDK for Python 中的 Endpoint.dedicated_endpoint_dns
检索此路径。您还可以使用以下代码手动构建端点路径:
f"https://ENDPOINT_ID.LOCATION_ID-PROJECT_NUMBER.prediction.vertexai.goog/v1/projects/PROJECT_NUMBER/locations/LOCATION_ID/endpoints/ENDPOINT_ID:predict"
替换以下内容:
- ENDPOINT_ID:端点的 ID。
- LOCATION_ID:您在其中使用 Vertex AI 的区域。
- PROJECT_NUMBER:项目编号。这与项目 ID 不同。您可以在 Google Cloud 控制台中项目的项目设置页面上找到项目编号。
如需使用 Vertex AI SDK for Python 将预测结果发送到专用端点,请将 use_dedicated_endpoint
参数设置为 True
:
endpoint.predict(instances=instances, use_dedicated_endpoint=True)
发送在线原始预测请求
gcloud
以下示例使用 gcloud ai endpoints raw-predict
命令:
-
如需使用命令行中指定的 REQUEST 中的 JSON 对象请求预测,请执行以下操作:
gcloud ai endpoints raw-predict ENDPOINT_ID \ --region=LOCATION_ID \ --request=REQUEST
如需请求使用存储在文件
image.jpeg
和相应Content-Type
标头中的图片进行预测,请执行以下操作:gcloud ai endpoints raw-predict ENDPOINT_ID \ --region=LOCATION_ID \ --http-headers=Content-Type=image/jpeg \ --request=@image.jpeg
替换以下内容:
- ENDPOINT_ID:端点的 ID。
- LOCATION_ID:您在其中使用 Vertex AI 的区域。
- REQUEST:要获取预测结果的请求的内容。请求的格式取决于您的自定义容器的预期,这不一定是 JSON 对象。
Python
如需了解如何安装或更新 Vertex AI SDK for Python,请参阅安装 Vertex AI SDK for Python。 如需了解详情,请参阅 Python API 参考文档。
响应包括以下 HTTP 标头:
X-Vertex-AI-Endpoint-Id
:提供此预测的Endpoint
的 ID。X-Vertex-AI-Deployed-Model-Id
:提供此预测的端点的DeployedModel
的 ID。
发送在线说明请求
gcloud
以下示例使用 gcloud ai endpoints explain
命令:
将以下 JSON 对象写入本地环境中的文件。文件名无关紧要,但在本示例中,请将文件命名为
request.json
。{ "instances": INSTANCES }
替换以下内容:
- INSTANCES:要为其获取预测的实例的 JSON 数组。每个实例的格式取决于经过训练的机器学习模型需要的输入。如需了解详情,请参阅格式化输入以进行在线预测。
运行以下命令:
gcloud ai endpoints explain ENDPOINT_ID \ --region=LOCATION_ID \ --json-request=request.json
替换以下内容:
- ENDPOINT_ID:端点的 ID。
- LOCATION_ID:您在其中使用 Vertex AI 的区域。
(可选)如果您想要向
Endpoint
中的特定DeployedModel
发送说明请求,则可以指定--deployed-model-id
标志:gcloud ai endpoints explain ENDPOINT_ID \ --region=LOCATION \ --deployed-model-id=DEPLOYED_MODEL_ID \ --json-request=request.json
除了上述占位符之外,还替换以下内容:
-
DEPLOYED_MODEL_ID(可选):您想要为其获取说明的已部署模型的 ID。此 ID 包含在
predict
方法的响应中。如果您需要为特定模型请求说明,并且您在同一个端点上部署了多个模型,则可以使用此 ID 来确保为该特定模型返回说明。
REST
在使用任何请求数据之前,请先进行以下替换:
- LOCATION_ID:您在其中使用 Vertex AI 的区域。
- PROJECT_ID:您的项目 ID
- ENDPOINT_ID:端点的 ID。
- INSTANCES:要为其获取预测的实例的 JSON 数组。每个实例的格式取决于经过训练的机器学习模型需要的输入。如需了解详情,请参阅格式化输入以进行在线预测。
HTTP 方法和网址:
POST https://LOCATION_ID-aiplatform.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION_ID/endpoints/ENDPOINT_ID:explain
请求 JSON 正文:
{ "instances": INSTANCES }
如需发送请求,请选择以下方式之一:
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/endpoints/ENDPOINT_ID:explain"
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/endpoints/ENDPOINT_ID:explain" | Select-Object -Expand Content
- PREDICTIONS:预测结果的 JSON 数组,其中每个预测结果对应请求正文中包含的一个实例。
- EXPLANATIONS:说明的 JSON 数组,其中每个说明对应一个预测结果。
-
DEPLOYED_MODEL_ID:执行预测的
DeployedModel
的 ID。
{ "predictions": PREDICTIONS, "explanations": EXPLANATIONS, "deployedModelId": "DEPLOYED_MODEL_ID" }
Python
如需了解如何安装或更新 Vertex AI SDK for Python,请参阅安装 Vertex AI SDK for Python。 如需了解详情,请参阅 Python API 参考文档。
后续步骤
- 了解在线预测日志记录。