Ragged Batching#
Triton 提供动态批处理功能,它结合了对同一模型执行的多个请求,以提供更大的吞吐量。 默认情况下,只有当每个请求的每个输入都具有相同的形状时,才能动态批量处理请求。 为了在输入形状经常变化的情况下利用动态批处理,客户端需要将请求中的输入张量填充到相同的形状。
Ragged batching 是一种避免显式填充的功能,它允许用户指定哪些输入不需要形状检查。 用户可以通过在模型配置中设置 allow_ragged_batch
字段来指定此类输入(ragged input)
...
input [
{
name: "input0"
data_type: TYPE_FP32
dims: [ 16 ]
allow_ragged_batch: true
}
]
...
Ragged input 在一批请求中如何处理取决于后端实现。 后端,例如 ONNX Runtime 后端、TensorFlow 后端、PyTorch 后端 和 TensorRT 后端,要求模型接受 ragged input 作为 1 维张量。 这些后端将请求输入连接到 1 维张量中。
由于连接的输入不跟踪每个请求的开始和结束索引,因此后端通常要求模型具有额外的输入,batch input,用于描述有关形成的批次的各种信息。
Batch Input#
Batch input 通常与 ragged input 结合使用,以提供有关每个批次元素的信息,例如批次中每个请求的输入的元素计数。 Batch input 由 Triton 生成,而不是在请求中提供,因为该信息只能在动态批次形成后才能最终确定。
除了元素计数之外,用户还可以指定其他 batch input 类型,有关详细信息,请参阅 protobuf 文档。
Example on Ragged Input and Batch Input#
如果您的模型接受 1 个可变长度输入张量 INPUT,形状为 [ -1, -1 ]。 第一个维度是批次维度,第二个维度是可变长度内容。 当客户端发送 3 个形状为 [ 1, 3 ]、[ 1, 4 ]、[ 1, 5 ] 的请求时。 为了利用动态批处理,实现此模型的直接方法是期望 INPUT 形状为 [ -1, -1 ],并假设所有输入都已填充到相同的长度,以便所有请求都变为形状 [ 1, 5 ],从而 Triton 可以批量处理并将它们作为单个 [ 3, 5 ] 张量发送到模型。 在这种情况下,填充张量以及对填充内容进行额外的模型计算会产生开销。 以下是输入配置
max_batch_size: 16
input [
{
name: "INPUT"
data_type: TYPE_FP32
dims: [ -1 ]
}
]
使用 triton ragged batching,模型将实现为期望 INPUT 形状为 [ -1 ] 和额外的 batch input INDEX,形状为 [ -1 ],模型应使用它来解释 INPUT 中的批次元素。 对于此类模型,客户端请求不需要填充,并且可以按原样发送(形状为 [ 1, 3 ]、[ 1, 4 ]、[ 1, 5 ])。 上面讨论的后端会将输入批量处理为形状为 [ 12 ] 的张量,其中包含请求的 3 + 4 + 5 连接。 Triton 还会创建形状为 [ 3 ] 的 batch input 张量,其值为 [ 3, 7, 12 ],这给出了每个批次元素结束的输入张量中的偏移量。 以下是输入配置
max_batch_size: 16
input [
{
name: "INPUT"
data_type: TYPE_FP32
dims: [ -1 ]
allow_ragged_batch: true
}
]
batch_input [
{
kind: BATCH_ACCUMULATED_ELEMENT_COUNT
target_name: "INDEX"
data_type: TYPE_FP32
source_input: "INPUT"
}
]
上面的示例使用 BATCH_ACCUMULATED_ELEMENT_COUNT
类型的 ragged batching。 protobuf 文档中描述的其他类型操作类似。