C API 描述#
Triton 服务器功能封装在一个共享库中,该共享库是从 core 仓库 中包含的源代码构建的。您可以通过将共享库链接到您的应用程序并使用 tritonserver.h 中定义的 C API 来包含 Triton 的全部功能。
当您将 Triton 共享库链接到您的应用程序时,您不是在生成一个单独的 Triton 进程,而是将 Triton 核心逻辑直接包含在您的应用程序中。Triton HTTP/REST 或 GRPC 协议不用于与此 Triton 核心逻辑通信,相反,您的应用程序和 Triton 核心逻辑之间的所有通信都必须通过 服务器 API 进行。
服务器 API 使用的顶层抽象是 TRITONSERVER_Server
,它表示能够实现 Triton 所有特性和功能的 Triton 核心逻辑。TRITONSERVER_Server
对象是通过调用 TRITONSERVER_ServerNew
以及一组指示对象应如何初始化的选项来创建的。TRITONSERVER_ServerNew
的用法在 simple.cc 中进行了演示。一旦您创建了 TRITONSERVER_Server
对象,您就可以开始使用下面描述的其余服务器 API。
错误处理#
大多数服务器 API 函数返回一个错误对象,指示成功或失败。成功由返回 nullptr
(NULL
) 指示。失败由返回 TRITONSERVER_Error
对象指示。错误代码和消息可以从 TRITONSERVER_Error
对象中使用 TRITONSERVER_ErrorCode
和 TRITONSERVER_ErrorMessage
检索。
所有服务器 API 对象的生命周期和所有权都在 tritonserver.h 中记录。对于 TRITONSERVER_Error
,对象的所有权传递给服务器 API 函数的调用者。因此,您的应用程序负责管理返回的 TRITONSERVER_Error
对象的生命周期。当您完成使用后,必须使用 TRITONSERVER_ErrorDelete
删除错误对象。common.h 中显示的 FAIL_IF_ERR
等宏对于管理错误对象生命周期非常有用。
版本控制和向后兼容性#
在 simple.cc 中演示的典型模式,并在下面显示,展示了如何将共享库提供的服务器 API 版本与您编译应用程序时使用的服务器 API 版本进行比较。服务器 API 是向后兼容的,因此只要共享库提供的主版本与您编译时使用的主版本匹配,并且共享库提供的次版本大于或等于您编译时使用的次版本,那么您的应用程序就可以使用服务器 API。
#include "tritonserver.h"
// Error checking removed for clarity...
uint32_t api_version_major, api_version_minor;
TRITONSERVER_ApiVersion(&api_version_major, &api_version_minor);
if ((TRITONSERVER_API_VERSION_MAJOR != api_version_major) ||
(TRITONSERVER_API_VERSION_MINOR > api_version_minor)) {
// Error, the shared library implementing the Server API is older than
// the version of the Server API that you compiled against.
}
非推理 API#
服务器 API 包含用于检查健康状况和就绪状态、获取模型信息、获取模型统计信息和指标、加载和卸载模型等的函数。这些函数的使用非常简单,其中一些函数在 simple.cc 中进行了演示,所有函数都在 tritonserver.h 中进行了文档记录。
推理 API#
执行推理请求需要使用许多服务器 API 函数和对象,如 simple.cc 中所示。一般用法需要以下步骤。
使用
TRITONSERVER_ResponseAllocatorNew
创建TRITONSERVER_ResponseAllocator
。您可以为所有推理请求使用相同的响应分配器,也可以创建多个响应分配器。当 Triton 生成输出张量时,它需要一个内存缓冲区,以便在其中存储该张量的内容。Triton 通过调用应用程序中的回调函数来延迟这些输出缓冲区的分配。您可以使用TRITONSERVER_ResponseAllocator
对象将这些回调函数传达给 Triton。您必须实现两个回调函数,一个用于缓冲区分配,另一个用于缓冲区释放。这些函数的签名是 tritonserver.h 中定义的TRITONSERVER_ResponseAllocatorAllocFn_t
和TRITONSERVER_ResponseAllocatorReleaseFn_t
。simple.cc 中,这些回调函数实现为ResponseAlloc
和ResponseRelease
。将推理请求创建为
TRITONSERVER_InferenceRequest
对象。推理请求是您指定要使用的模型、输入张量及其值、要返回的输出张量以及其他请求参数的地方。您可以使用TRITONSERVER_InferenceRequestNew
创建推理请求。您可以使用TRITONSERVER_InferenceRequestAddInput
在请求中创建每个输入张量,并使用TRITONSERVER_InferenceRequestAppendInputData
(或 tritonserver.h 中定义的TRITONSERVER_InferenceRequestAppendInputData*
变体之一)设置输入张量的数据。默认情况下,Triton 将返回所有输出张量,但您可以使用TRITONSERVER_InferenceRequestAddRequestedOutput
将 Triton 限制为仅返回某些输出。为了正确管理推理请求的生命周期,您必须使用
TRITONSERVER_InferenceRequestSetReleaseCallback
将回调设置为应用程序中的函数。Triton 将调用此回调以返回TRITONSERVER_InferenceRequest
对象的所有权。通常,在此回调中,您只需使用TRITONSERVER_InferenceRequestDelete
删除TRITONSERVER_InferenceRequest
对象。但是您也可以实现不同的生命周期管理;例如,如果您要重用推理请求对象,您将希望使该对象可供重用。您可以选择使用
TRITONSERVER_InferenceRequestSetId
在请求上设置用户定义的 ID。此 ID 不会被 Triton 使用,但会返回在响应中。您可以为新的推理请求重用现有的
TRITONSERVER_InferenceRequest
对象。有关如何完成此操作以及为什么它有用的几个示例在 simple.cc 中显示。使用
TRITONSERVER_ServerInferAsync
请求 Triton 执行推理请求。TRITONSERVER_ServerInferAsync
是一个异步调用,会立即返回。推理响应通过回调返回到您的应用程序。在调用TRITONSERVER_ServerInferAsync
之前,您可以使用TRITONSERVER_InferenceRequestSetResponseCallback
注册此回调。simple.cc 中,此回调是InferResponseComplete
。当您调用
TRITONSERVER_ServerInferAsync
并且它返回时没有错误,您正在将TRITONSERVER_InferenceRequest
对象的所有权传递给 Triton,因此在 Triton 通过您使用TRITONSERVER_InferenceRequestSetReleaseCallback
注册的回调将所有权返回给您之前,您不得以任何方式访问该对象。处理推理响应。推理响应返回到您使用
TRITONSERVER_InferenceRequestSetResponseCallback
注册的回调函数。您的回调将响应作为TRITONSERVER_InferenceResponse
对象接收。您的回调取得TRITONSERVER_InferenceResponse
对象的所有权,因此在不再需要时必须使用TRITONSERVER_InferenceResponseDelete
释放它。处理响应的第一步是使用
TRITONSERVER_InferenceResponseError
检查响应是否返回错误,或者是否返回有效结果。如果响应有效,您可以使用TRITONSERVER_InferenceResponseOutputCount
迭代输出张量,并使用TRITONSERVER_InferenceResponseOutput
获取有关每个输出张量的信息。请注意,simple.cc 示例使用 std::promise 只是为了等待响应,但不需要以这种方式同步响应处理。您可以同时有多个正在进行的推理请求,并且可以从同一线程或多个不同线程发出推理请求。允许 Triton 直接链接到 C/C++ 应用程序。API 在 tritonserver.h 中进行了文档记录。
使用 C API 的简单示例可以在 simple.cc 中找到。更复杂的示例可以在为 Triton 实现 HTTP/REST 和 GRPC 端点的源代码中找到。这些端点使用 C API 与 Triton 的核心进行通信。端点的主要源文件是 grpc_server.cc 和 http_server.cc。