Triton教程 — Triton 响应缓存
Triton系列教程:
- 快速开始
- 利用Triton部署你自己的模型
- Triton架构
- 模型仓库
- 存储代理
- 模型设置
- 优化
- 动态批处理
- 速率限制器
- 模型管理
- 自定义算子
- 解耦后端和模型
概述
在本文档中,推理请求是模型名称、模型版本和输入张量(名称、形状、数据类型和张量数据),它们构成提交给 Triton 的请求。 推理结果是推理执行产生的输出张量(名称、形状、数据类型和张量数据)。 Triton 使用响应缓存来保存先前执行的推理请求生成的推理结果。 Triton 将维护响应缓存,以便命中缓存的推理请求不需要执行模型来生成结果,而是从缓存中提取结果。 对于某些用例,这可以显着减少推理请求延迟。
Triton 使用推理请求的哈希值访问响应缓存,其中包括模型名称、模型版本和模型输入。 如果在缓存中找到该哈希,则从缓存中提取相应的推理结果并用于请求。 当这种情况发生时,Triton 不需要执行模型来产生推理结果。 如果在缓存中找不到哈希,Triton 会执行模型以生成推理结果,然后将该结果记录在缓存中,以便后续推理请求可以(重新)使用这些结果。
用法
为了在给定模型上使用缓存,必须在服务器端和模型的模型配置中启用缓存。 有关更多详细信息,请参阅下面的以下部分。
在服务器端启用缓存
通过在启动 Triton 服务器时指定 <cache_implementation>
和相应的配置,在服务器端启用响应缓存。
通过 CLI,这会转换为设置 tritonserver --cache-config <cache_implementation>,<key>=<value> ...
。例如:
tritonserver --cache-config local,size=1048576
对于进程内 C API 应用程序,这将转换为调用 TRITONSERVER_SetCacheConfig(const char* cache_implementation, const char* config_json)
。
这允许用户在服务器启动时全局启用/禁用缓存。
为模型启用缓存
默认情况下,即使使用 --cache-config 标志全局启用响应缓存,也没有模型使用响应缓存。
对于要使用响应缓存的给定模型,该模型还必须在其模型配置中启用响应缓存:
# config.pbtxt
response_cache {
enable: true
}
这允许用户启用/禁用特定模型的缓存。
有关为每个模型启用响应缓存的更多信息,请参阅模型配置文档。
缓存实现
从 23.03 版本开始,Triton 拥有一组 TRITONCACHE API
,用于与用户选择的缓存实现进行通信。
缓存实现是一个共享库,它实现所需的 TRITONCACHE API,并在服务器启动时动态加载(如果启用)。 对于 >=23.03 的标签,tritonserver 发布容器附带以下开箱即用的缓存实现:
local:
/opt/tritonserver/caches/local/libtritoncache_local.so
通过这些 TRITONCACHE API
,tritonserver 公开了一个新的 --cache-config CLI
标志,该标志使用户可以灵活自定义要使用的缓存实现以及如何配置它。 与 --backend-config
标志类似,预期格式为 --cache-config <cache_name>,<key>=<value>
,并且如果缓存实现需要,可以多次指定以指定多个键。
本地缓存
本地缓存实现相当于23.03版本之前内部使用的响应缓存。 有关更多具体实现的详细信息,请参阅本地缓存实现。
当使用非零 SIZE 指定 --cache-config local,size=SIZE
时,Triton 会在 CPU 内存中分配请求的大小,并在所有推理请求和所有模型之间共享缓存。
自定义缓存
借助新的 TRITONCACHE API 接口,用户现在可以实现自己的缓存以满足任何用例的特定需求。 要查看缓存开发人员必须实现的所需接口,请参阅 TRITONCACHE API 头文件。 本地缓存实现可以用作参考实现。
成功开发和构建自定义缓存后,生成的共享库(例如:libtritoncache_<name>.so
)必须放置在与本地缓存实现所在位置类似的缓存目录中。 默认情况下,该目录为 /opt/tritonserver/caches
,但可以根据需要使用 --cache-dir
指定自定义目录。
将此示例放在一起,如果自定义缓存被命名为“custom”(该名称是任意的),默认情况下 Triton 会期望在 /opt/tritonserver/caches/custom/libtritoncache_custom.so
中找到缓存实现。
执行
响应缓存旨在用于预计会出现大量重复请求(缓存命中)的用例,因此将从缓存中受益。 这里的术语“重要”取决于用例,但简单的解释是考虑预期缓存命中/未命中的比例,以及计算响应所花费的平均时间。
对于缓存命中常见且计算成本昂贵的情况,缓存可以显着提高整体性能。
对于所有或大多数请求都是唯一的(缓存未命中)的情况,由于管理缓存的开销,缓存可能会对整体性能产生负面影响。
已知限制
-
只有位于 CPU 内存中的输入张量才可进行哈希处理以访问缓存。 如果推理请求包含不在 CPU 内存中的输入张量,则不会对请求进行哈希处理,因此不会缓存响应。
-
只有所有输出张量都位于 CPU 内存中的响应才有资格进行缓存。 如果响应中的任何输出张量不在 CPU 内存中,则不会缓存响应。
-
仅使用推理请求哈希来访问缓存。 因此,如果两个不同的推理请求生成相同的哈希(哈希冲突),则 Triton 可能会错误地将缓存结果用于推理请求。 哈希值是 64 位值,因此发生冲突的可能性很小。
-
只有成功的推理请求才会缓存其响应。 如果请求失败或在推理期间返回错误,则不会缓存其响应。
-
只有通过默认调度程序或动态批量调度程序的请求才有资格进行缓存。 Sequence Batcher 目前不支持响应缓存。
-
响应缓存当前不支持解耦模型。