解耦后端和模型#

Triton 可以支持 后端 和模型,这些后端和模型可以为一个请求发送多个响应,或者为一个请求发送零个响应。解耦的模型/后端也可能相对于请求批次执行的顺序,无序发送响应。这允许后端在认为合适的时候交付响应。这在自动语音识别 (ASR) 中特别有用。来自大量响应的请求不会阻止来自其他请求的响应被交付。

开发解耦后端/模型#

C++ 后端#

仔细阅读关于 Triton 后端 API推理请求和响应解耦响应 的内容。repeat 后端square 后端 演示了如何使用 Triton 后端 API 来实现解耦后端。该示例旨在展示 Triton API 的灵活性,绝不应在生产中使用。此示例可能会同时处理多个批次的请求,而无需增加 实例计数。在实际部署中,后端不应允许调用者线程从 TRITONBACKEND_ModelInstanceExecute 返回,直到该实例准备好处理另一组请求。如果设计不当,后端很容易被过度订阅。这也可能导致诸如 动态批处理 等功能利用不足,因为它会导致急切批处理。

使用 Python 后端的 Python 模型#

仔细阅读关于 Python 后端,特别是 execute 的内容。

解耦示例 演示了如何使用解耦 API 来实现解耦 Python 模型。正如示例中指出的那样,这些示例旨在展示解耦 API 的灵活性,绝不应在生产中使用。

部署解耦模型#

必须在为模型提供的 模型配置 文件中设置 解耦模型事务策略。Triton 需要此信息来启用解耦模型所需的特殊处理。部署没有此配置设置的解耦模型将在运行时抛出错误。

对解耦模型运行推理#

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

如果使用 Triton 的进程内 C API,您的应用程序应意识到您使用 TRITONSERVER_InferenceRequestSetResponseCallback 注册的回调函数可以被多次调用,每次调用都会返回一个新的响应。您可以查看 grpc_server.cc

了解何时完成解耦推理请求#

当从模型/后端收到包含 TRITONSERVER_RESPONSE_COMPLETE_FINAL 标志的响应时,推理请求被视为完成。

  1. 使用流式 GRPC 的客户端应用程序可以通过检查响应参数中的 "triton_final_response" 参数来访问此信息。解耦模型可能不会为每个请求发送响应,具体取决于模型/后端的设计方式。在后端未发送响应的这些情况下,流式 GRPC 客户端可以选择为每个请求接收一个空的最终响应。默认情况下,不发送空的最终响应以节省网络流量。

    # Example of streaming GRPC client opting-in
    client.async_stream_infer(
      ...,
      enable_empty_final_response=True
    )
    
  2. 使用 C API 的客户端应用程序可以直接在其响应处理/回调逻辑中检查 TRITONSERVER_RESPONSE_COMPLETE_FINAL 标志。

decoupled_test.py 演示了通过流式 GRPC Python 客户端 API 选择加入,并以编程方式识别何时通过 "triton_final_response" 响应参数接收到最终响应的示例。