二进制张量数据扩展#
本文档描述了 Triton 的二进制张量数据扩展。二进制张量数据扩展允许 Triton 支持 HTTP/REST 请求正文中以二进制格式表示的张量数据。由于支持此扩展,Triton 会在其服务器元数据的扩展字段中报告“binary_tensor_data”。
二进制张量请求#
以二进制数据表示的张量数据以小端字节顺序、行优先方式组织,元素之间没有步幅或填充。所有张量数据类型都可以用其数据类型的原生大小表示为二进制数据。对于 BOOL 类型元素,true 是值为 1 的单字节,false 是值为 0 的单字节。对于 BYTES 类型,元素由 4 字节无符号整数表示长度,后跟实际字节。张量的二进制数据在 JSON 对象之后在 HTTP 正文中传递(请参阅示例)。
二进制张量数据扩展使用参数来指示输入或输出张量以二进制数据进行通信。第一个参数在 $request_input
和 $response_output
中使用,以指示输入或输出张量以二进制数据进行通信
“binary_data_size”:int64 参数,指示张量二进制数据的大小(以字节为单位)。
第二个参数在 $request_output
中使用,以指示应从 Triton 以二进制数据形式返回输出。
“binary_data”:bool 参数,如果应以二进制数据形式返回输出,则为 true;如果应以 JSON 形式返回张量,则为 false(或未给出)。
第三个参数在 $inference_request 中使用,以指示所有输出都应从 Triton 以二进制数据形式返回,除非特定输出上被 “binary_data” 覆盖。
“binary_data_output”:bool 参数,如果所有输出都应以二进制数据形式返回,则为 true;如果应以 JSON 形式返回输出,则为 false(或未给出)。如果在输出上指定了 “binary_data”,则它将覆盖此设置。
当一个或多个张量以二进制数据进行通信时,请求或响应的 HTTP 正文将包含 JSON 推理请求或响应对象,后跟二进制张量数据,顺序与 JSON 中指定的输入或输出张量的顺序相同。如果请求或响应中存在任何二进制数据,则必须提供 Inference-Header-Content-Length 标头以给出 JSON 对象的长度,并且 Content-Length 继续给出完整的正文长度(根据 HTTP 要求)。
示例#
对于以下请求,输入张量以二进制数据发送,输出张量必须以二进制数据返回,因为这是请求的内容。另请注意,二进制数据的总大小为 19 字节,并且该大小必须反映在内容长度标头中。
POST /v2/models/mymodel/infer HTTP/1.1
Host: localhost:8000
Content-Type: application/octet-stream
Inference-Header-Content-Length: <xx>
Content-Length: <xx+19>
{
"model_name" : "mymodel",
"inputs" : [
{
"name" : "input0",
"shape" : [ 2, 2 ],
"datatype" : "UINT32",
"parameters" : {
"binary_data_size" : 16
}
},
{
"name" : "input1",
"shape" : [ 3 ],
"datatype" : "BOOL",
"parameters" : {
"binary_data_size" : 3
}
}
],
"outputs" : [
{
"name" : "output0",
"parameters" : {
"binary_data" : true
}
}
]
}
<16 bytes of data for input0 tensor>
<3 bytes of data for input1 tensor>
假设模型返回数据类型为 FP32 的 [ 3, 2 ] 张量,则将返回以下响应。
HTTP/1.1 200 OK
Content-Type: application/octet-stream
Inference-Header-Content-Length: <yy>
Content-Length: <yy+24>
{
"outputs" : [
{
"name" : "output0",
"shape" : [ 3, 2 ],
"datatype" : "FP32",
"parameters" : {
"binary_data_size" : 24
}
}
]
}
<24 bytes of data for output0 tensor>
原始二进制请求#
对于张量元数据可以从二进制数据的字节大小推断出来的模型。用户可以发送二进制张量请求,而无需指定推理标头。换句话说,请求正文仅包含张量的二进制数据。以下是合格模型的约束条件
仅有 1 个输入
如果输入数据类型为非 BYTE,则可变大小维度的数量最多为 1。如果数据类型为 BYTE,则形状必须为 [1]。支持的数据类型可以在此处找到
要发送原始二进制请求,必须提供 Inference-Header-Content-Length 标头,其值为 0,以指示请求正文不包含推理标头。
注意:如果模型支持批处理,则该请求将被视为 batch-1 请求,因为省略了推理标头。此外,将请求以二进制张量形式返回所有模型输出,如上一节所述。
示例#
以下是发送原始二进制请求的示例。请注意,二进制数据的总大小为 16 字节,并且该大小必须反映在内容长度标头中。
POST /v2/models/mymodel/infer HTTP/1.1
Host: localhost:8000
Content-Type: application/octet-stream
Inference-Header-Content-Length: 0
Content-Length: 16
<16 bytes of data for input tensor>
假设模型返回两个输出,它们都具有形状 [ 3, 1 ] 和数据类型 FP32,则将返回以下响应。
HTTP/1.1 200 OK
Content-Type: application/octet-stream
Inference-Header-Content-Length: <yy>
Content-Length: <yy+24>
{
"outputs" : [
{
"name" : "output0",
"shape" : [ 3, 1 ],
"datatype" : "FP32",
"parameters" : {
"binary_data_size" : 12
}
},
{
"name" : "output1",
"shape" : [ 3, 1 ],
"datatype" : "FP32",
"parameters" : {
"binary_data_size" : 12
}
}
]
}
<12 bytes of data for output0 tensor>
<12 bytes of data for output1 tensor>