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 文档中描述的其他类型操作类似。