triton server中的Decoupled mode

对于LLM模型来说,支持stream的话需要了解这个模式。

Triton 可以支持发送多个响应或零个响应的后端和模型请求。解耦的模型/后端也可以相对于执行请求批次的顺序无序地发送响应。这使得后端能够在适当时候传递响应,特别是在自动语音识别 (ASR) 中非常有用。具有大量响应的请求不会阻塞来自其他请求的响应被传送。

推理协议和API描述了客户端可以与服务器通信并运行推理的各种方式。对于解耦模型,Triton的HTTP端点不能用于运行推理,因为它仅支持每个请求一个响应。即使是标准的ModelInfer RPC在GRPC端点中也不支持解耦响应。为了在解耦模型上运行推理,客户端必须使用双向流式RPC。有关更多详细信息,请参见此处。decoupled_test.py演示了如何使用gRPC流来推断解耦模型。

如果使用Triton的进程内C API,则您的应用程序应该知道TRITONSERVER_InferenceRequestSetResponseCallback注册的回调函数可能会被调用任意次数,并且每次都会有一个新响应。您可以查看grpc_server.cc。

Python-backend

python后端示例。

介绍

该模式允许用户对请求发送多个响应或不发送任何响应。模型还可以相对于执行请求批次的顺序无序地发送响应。这样的模型称为Decoupled模型。要使用此模式,必须将模型配置中的transaction policy设置为Decoupled。

在Decoupled模式下,每个请求都必须使用InferenceResponseSender对象来创建和发送任意数量的响应。该模式下的工作流程可能如下所示:

  • 执行函数接收一个长度为N的pb_utils.InferenceRequest批处理数组。

  • 对于每个pb_utils.InferenceRequest对象,执行以下步骤:

    • 使用InferenceRequest.get_response_sender()获取InferenceRequest的InferenceResponseSender对象。
    • 创建并填充要发送回去的pb_utils.InferenceResponse。
    • 使用InferenceResponseSender.send()发送上述响应。如果这是最后一个请求,则在InferenceResponseSender.send()中传递pb_utils.TRITONSERVER_RESPONSE_COMPLETE_FINAL标志。否则继续进行第1步以发送下一个请求。
  • 此模式下execute函数的返回值应为None。

与上述类似,如果其中一个请求出现错误,您可以使用TritonError对象为该特定请求设置错误消息。在为pb_utils.InferenceResponse对象设置错误后,请使用InferenceResponseSender.send()将带有错误的响应发送回用户。

使用场景

Decoupled模式功能强大,支持各种不常见的场景:

  • 如果模型不应该为请求发送任何响应,则调用InferenceResponseSender.send(),没有响应但标志参数设置为pb_utils.TRITONSERVER_RESPONSE_COMPLETE_FINAL。
  • 模型还可以按其接收到的请求无序地发送响应。
  • 请求数据和InferenceResponseSender对象可以传递给模型中的单独线程。这意味着主调用线程可以从execute函数退出,只要模型拥有InferenceResponseSender对象,就仍然可以继续生成响应。

The decoupled examples demonstrate full power of what can be acheived from decoupled API. Read Decoupled Backends and Models for more details on how to host a decoupled model.

参考