架构概览#
TensorRT-LLM 是一个旨在为大型语言模型 (LLM) 推理创建优化解决方案的工具包。除了 TensorRT,PyTorch 也可以作为 TensorRT-LLM 的后端。本文档概述了 PyTorch 后端的架构。
顶层 API#
PyTorch 后端的接口是 tensorrt._torch.LLM
。
from tensorrt_llm._torch import LLM
llm = LLM(model=<path_to_llama_from_hf>)
LLM
还管理输入的 Token 化和反 Token 化过程。
PyExecutor#
与使用 执行器 API 的 TensorRT 后端类似,PyTorch 后端采用了一个 PyExecutor
类。该类具有与 Executor 类似的接口,可以作为替代后端集成到 LLM 中。PyExecutor
的关键组件包括
模型引擎 (Model Engine):持有语言模型并高效支持单步模型前向传播。
解码器 (Decoder):基于模型引擎的输出生成输出 Token。目前仅支持贪婪搜索。
调度器 (Scheduler):决定是否为请求分配资源(如 KV Cache),以及在当前步骤是否为每个请求运行前向传播。
PyExecutor 的单步流程包括
从请求队列中获取新请求(如果有)。
调度一些请求。
对调度的请求运行模型前向传播。
使用调度的请求的模型前向输出运行解码器。
为每个请求添加输出 Token 并处理已完成的请求。
模型引擎 (Model Engine)#
PyExecutor
的核心组件是 ModelEngine
,负责在 GPU 上高效执行模型的前向传播。ModelEngine
的关键方法是处理前向传播计算的 forward
。对于 PyTorch 后端,派生类是 PyTorchModelEngine
,在 pytorch_model_engine.py 中声明。
解码器 (Decoder)#
解码器根据模型引擎的输出生成输出 Token,并支持贪婪搜索解码。
调度器 (Scheduler)#
调度器分两步操作
CapacityScheduler:确定是否有足够的资源来满足请求。
MicroBatchScheduler:选择一些请求供模型运行前向传播。
CapacityScheduler 和 MicroBatchScheduler 目前都使用 C++ 绑定。但是,由于接口是用 Python 实现的,因此可以进行自定义。文档 scheduler.md 解释了如何实现自定义调度逻辑。
资源管理器 (ResourceManager)#
ResourceManager
帮助分配和管理运行单个请求的推理可能需要的资源。它是一个包含继承自 BaseResourceManager
的对象的容器,每个对象管理特定类型的资源。BaseResourceManager
有三个重要的接口
prepare_resources
:在 PyExecutor 中当前批处理的模型前向传播之前的每一步调用。update_resources
:在当前批处理的每一步完成时调用。free_resources
:在每个请求完成时调用。
一个关键资源是 transformer 模型的 KV Cache。BaseResourceManager
用于 KV Cache 的是 KVCacheManager
。
KVCacheManager#
目前,KVCacheManager 使用 C++ 绑定。但是,由于其接口是用 Python 实现的,因此可以在 Python 中进行自定义。文档 kv_cache_manager.md 详细说明了如何实现自定义 KVCacheManager。