TensorRT-LLM深度技术分析:NVIDIA如何榨干GPU每一滴推理性能

芒果虾 2026年5月28日 阅读约35分钟

核心结论

TensorRT-LLM不是一个推理框架,它是NVIDIA对"LLM推理应该怎样做"这一问题的最终回答。当vLLM用PagedAttention打开了通用高性能推理的大门,当SGLang用编译优化挑战了运行时调度的极限,NVIDIA选择了另一条路——用底层硬件的全部能力,将LLM推理推到物理极限。在H100上用FP8精度跑Llama 3.3 70B,TensorRT-LLM能输出超过每秒10,000个token,首token延迟低于100毫秒[1][3]。这不是魔法,这是一整套精密工程的结果:内核融合消除了GPU kernel launch的微秒级开销,FP8量化让H100的Tensor Core利用率翻倍,Paged Attention让KV缓存的内存碎片归零,Inflight Batching让GPU在任何时刻都满载运行。

但TensorRT-LLM的代价同样清晰。它的编译模型需要数十分钟到数小时,每次模型更新都要重新编译[10]。它的配置参数比vLLM多出一个数量级,调优需要深入理解GPU架构。它只支持NVIDIA GPU,在AMD、Intel或任何其他硬件上毫无用处[13]。这是一个典型的极致性能与灵活性的权衡——如果你追求的是在NVIDIA GPU上跑固定模型的最大吞吐,TensorRT-LLM是当前最好的答案;如果你需要快速迭代、多硬件支持或简化的运维,vLLM或SGLang可能更合适。2026年3月,TensorRT-LLM被IT Brand Pulse评选为AI推理优化平台的市场与创新双料领导者[1],这标志着它已从NVIDIA的内部工具成长为行业事实标准。

核心数据一览

10,000+
H100 FP8 output tokens/sec[3]
<100ms
首token延迟(TTFT)[3]
4x
vs 原生PyTorch吞吐提升[1]
3x
推测解码吞吐提升[1]
1.34x
vs vLLM短序列吞吐优势[8]
2.72x
vs vLLM长序列每token时间[8]
量化格式支持硬件内存节省性能提升精度损失推荐场景
FP8H100/Blackwell~50%~2x极小首选推荐
FP4B200~75%更高可控Blackwell极致压缩
INT8 SmoothQuantAda GPU~50%~1.5xAda架构替代方案
INT4 Weight-Only通用~75%因场景而异较大内存极致受限

LLM推理技术演进:从HuggingFace到TensorRT-LLM

LLM推理优化的历史,本质上是一部与GPU硬件特性持续博弈的工程史。理解这段演进,才能理解TensorRT-LLM为什么选择了"编译时极致优化"这条路线。

第一代:HuggingFace Transformers原生态(2020-2022)。早期的LLM推理几乎没有人关心效率——模型参数量还在百万到十亿级别,延迟和吞吐不是核心问题。HuggingFace Transformers库提供了统一的模型定义接口,研究者只需调用model.generate()就能完成推理。但这个看似简单的调用背后,是极其低效的执行路径:每个算子(LayerNorm、矩阵乘法、激活函数、Dropout)都是一个独立的CUDA kernel,每次kernel launch都有5-20微秒的固定开销。在GPT-2时代,这不是问题;但当模型规模增长到70B参数,每一步推理需要执行数千次kernel launch,累计的开销就变成了性能杀手。原生PyTorch推理的GPU利用率通常只有30-40%,其余时间GPU在等待CPU发送下一个kernel[4]

第二代:vLLM与通用高性能推理(2023-2024)。vLLM的出现是LLM推理领域的分水岭。UC Berkeley的研究团队在2023年发表的论文中提出了PagedAttention机制——借鉴操作系统的虚拟内存分页思想,将KV缓存分割为固定大小的block,按需分配,消除了传统连续内存分配带来的大量浪费。这一创新使得vLLM在吞吐量上比HuggingFace Transformers提升了2-4倍。更重要的是,vLLM的Continuous Batching机制允许在每次前向传播时动态调整batch组成,请求完成即移出、新请求即插入,GPU利用率从60-70%提升到90%以上[8][10]。vLLM的哲学是"通用"——它支持NVIDIA和AMD GPU,开箱即用,配置简单,模型支持快。但它没有做底层的kernel级优化,仍然依赖PyTorch的eager execution模式。

第三代:TensorRT-LLM与编译时极致优化(2023至今)。NVIDIA在2023年底发布的TensorRT-LLM代表了一种完全不同的工程哲学:与其在运行时做调度优化,不如在编译时就把一切优化到极致。TensorRT-LLM的核心工作流是——用Python API定义模型结构,然后通过TensorRT的编译器将整个计算图一次性优化:算子融合、精度校准、内存布局优化、CUDA Graph捕获全部在编译期完成。编译产物是一个高度优化的engine,在运行时几乎不需要CPU干预[1][2]。这种"编译一次,运行百万次"的模式,与vLLM的"每次运行都即时编译"形成鲜明对比。TensorRT-LLM在H100上的性能通常比vLLM高出30-40%,在长序列场景下优势更达到2.72倍[8]。代价是:编译一个70B参数的模型可能需要30分钟到2小时,而且每次模型权重更新都需要重新编译。

与此同时,SGLang代表了第三条路线——编译优化与运行时调度的结合。SGLang通过RadixAttention技术实现了KV缓存的高效重用,并在编译层面对推理计划进行优化。在H100 benchmark中,SGLang在低并发场景下拥有最快的单token延迟(ITL),但在高并发吞吐上仍略逊于TensorRT-LLM[8][13]

三代演进的核心矛盾

LLM推理优化的核心矛盾始终是编译时优化 vs 运行时灵活性。HuggingFace选择了完全灵活但性能最差,vLLM选择了运行时优化兼顾通用性,TensorRT-LLM选择了编译时极致优化但牺牲了灵活性,SGLang试图在两者间找到新的平衡点。这不仅是技术路线之争,更是对"LLM推理的本质瓶颈在哪里"这一问题的不同回答。

核心技术深度解析

一、推理两阶段:Prefill与Decode的本质差异

要理解TensorRT-LLM的每一项优化,首先要理解LLM推理的两个阶段在计算特性上的根本差异。这不是一个简单的概念区分——它直接决定了每一项优化技术的适用场景和效果。

Prefill阶段(预填充)是"读题"阶段。当用户发送一条prompt,模型需要一次性处理整个输入序列的所有token,计算它们之间的完整注意力关系,并生成KV缓存。这一阶段的计算特征是计算密集型(Compute-Bound):输入长度为N的prompt,self-attention的计算量是O(N²),而矩阵乘法的batch size等于N。对于2048 token的输入,GEMM(通用矩阵乘法)的batch size就是2048——这足以让GPU的Tensor Core满载运行。Prefill阶段的瓶颈不在内存带宽,而在计算吞吐。因此,这一阶段对量化的收益相对有限——FP8相比FP16的提升主要来自Tensor Core的吞吐翻倍,而非内存带宽的节省。

Decode阶段(解码)是"做题"阶段。模型逐个生成输出token,每一步只用上一步新生成的一个query token与KV缓存中的所有key-value对计算注意力。这一阶段的计算特征是内存带宽密集型(Memory-Bound):每一步需要从GPU显存读取整个KV缓存和模型权重,但只做一次矩阵乘法(batch size为1)。对于70B参数的模型,每一步需要读取约140GB的权重(FP16),但实际计算量极小。GPU的计算单元大部分时间在等待数据从显存搬运到寄存器。这是LLM推理真正的性能杀手——内存墙。因此,Decode阶段是量化技术的主战场:将权重和KV缓存从FP16压缩到FP8,内存带宽需求直接减半,Tensor Core吞吐翻倍,性能提升立竿见影[4]

这两个阶段的差异导致了一个核心矛盾:优化Prefill的策略往往不利于Decode,反之亦然。例如,增大batch size可以提高Decode阶段的计算密度(因为多个请求的矩阵乘法可以合并为更大的GEMM),但会增加每个请求的延迟。FP8量化对Decode阶段收益巨大,但对Prefill阶段提升有限。Chunked Prefill技术正是为了解决这一矛盾而生——将长prompt分割为多个chunk,与Decode请求混合调度,使得GPU在Prefill和Decode之间达到最佳平衡[1]

为什么大部分推理优化都针对Decode?

在典型的对话场景中,输出token数量通常是输入的2-5倍。一个1000 token的prompt,可能生成2000-5000个输出token。这意味着Decode阶段的总计算量和总延迟远超Prefill。更关键的是,Decode阶段是串行的——每一步依赖上一步的输出,无法并行化。因此,Decode阶段的每一步延迟直接决定了用户感受到的响应速度。TensorRT-LLM的绝大部分优化——内核融合、FP8量化、CUDA Graph、推测解码——都是为了让Decode的每一步尽可能快。

二、内核融合:消除GPU的微秒级空转

内核融合(Kernel Fusion)是TensorRT-LLM相对于PyTorch原生推理的第一个、也是最基础的性能优势来源。理解它的原理,需要先理解GPU的执行模型。

GPU的执行单元(SM,Streaming Multiprocessor)不会自己取指令——它依赖CPU通过driver向GPU发送kernel launch命令。每一次kernel launch,无论kernel执行多快,都有一个固定的启动开销(launch overhead),通常在5-20微秒之间。在计算机图形学中这不是问题——一个渲染帧可能只有几百个kernel。但在LLM推理中,一个Transformer层的单步推理涉及数十个kernel:LayerNorm、QKV投影、self-attention(进一步拆分为QK^T、softmax、与V相乘)、输出投影、残差连接、前馈网络(两次线性变换+激活函数)……一个70B参数的模型有80层Transformer,每层几十个kernel,单步推理的kernel launch次数可能达到数千次。以每次10微秒计算,仅kernel launch的累计开销就是数十毫秒——而这已经接近用户可感知的延迟阈值[3]

TensorRT-LLM的解决方案是将多个算子合并为单个CUDA kernel。一个典型的融合模式是:将LayerNorm + QKV矩阵乘法 + 激活函数合并为一个kernel。这样做的好处不仅是消除了两次kernel launch开销,更重要的是数据可以停留在GPU的寄存器或共享内存中,无需写回全局显存再读取。在LayerNorm计算完成后,结果直接在寄存器中被矩阵乘法消费,避免了两次全局显存访问。对于70B模型,这种融合在每一层节省的显存带宽累计起来是巨大的[1][3]

TensorRT-LLM在编译期对所有可融合的算子模式进行识别和合并。这与PyTorch的torch.compile有相似的思路,但TensorRT-LLM走得更远——它不仅融合通用算子,还为LLM特有的计算模式(如FlashAttention、MQA/GQA的KV广播)编写了高度优化的专用kernel。这些kernel是NVIDIA的CUDA工程师针对特定GPU架构(Hopper、Ada、Blackwell)手工调优的,利用了每个架构的独特硬件特性[2]

与内核融合紧密配合的是CUDA Graph优化。CUDA Graph允许将整个推理循环的所有kernel launch命令一次性提交给GPU,GPU按照预定义的依赖关系自主执行,无需CPU在中途干预。在Decode阶段,每一步的计算图结构是相同的(只是输入数据不同),因此可以将整个前向传播捕获为CUDA Graph。这意味着CPU只需在每一步开始时更新输入数据指针,然后触发graph执行,全程不需要逐个kernel launch。在H100上,CUDA Graph可以将Decode阶段的CPU开销从~100微秒降低到~5微秒,这对延迟敏感的应用(如实时对话)至关重要[1]

内核融合的效果量化:
原生PyTorch单步推理:~2000次kernel launch × 10μs = ~20ms(仅launch开销)
TensorRT-LLM(融合+CUDA Graph):~200次kernel launch × 10μs + CUDA Graph ≈ 2-3ms
仅kernel launch优化就贡献了~15ms的延迟降低

三、量化策略:FP8/INT8/FP4的选择逻辑

量化是LLM推理优化中收益最直接的技术——将模型权重和激活值从FP16(16位浮点)压缩到更低精度,直接减少内存带宽需求和显存占用。但量化不是免费的午餐,每种精度级别都有其适用场景和代价。TensorRT-LLM支持从FP4到FP8到INT8到INT4的完整量化光谱,选择哪一种取决于硬件、模型和精度容忍度。

FP8(E4M3/E5M2):当前的甜点精度。FP8是NVIDIA在Hopper架构(H100)中原生支持的8位浮点格式,Tensor Core可以直接执行FP8矩阵乘法,吞吐量是FP16的两倍。FP8有两种编码方式:E4M3(4位指数+3位尾数,用于前向传播)和E5M2(5位指数+2位尾数,用于反向传播,推理中不常用)。对于LLM推理,FP8的关键优势是精度损失极小——大量实验表明,在大多数LLM基准测试中,FP8推理与FP16的精度差异在统计噪声范围内。原因是LLM的权重分布相对集中,FP8的动态范围足以覆盖[4]

TensorRT-LLM的FP8量化支持两种模式:Post-Training Quantization(PTQ)Quantization-Aware Training(QAT)。PTQ是最常用的方式——拿一个预训练好的FP16模型,用少量校准数据(通常几百条样本)统计激活值的分布范围,然后将权重和激活量化到FP8。整个过程不需要重新训练,耗时几分钟到十几分钟。QAT则在训练(或微调)过程中模拟量化误差,通常能获得更好的精度,但成本也更高。对于大多数生产场景,PTQ+FP8已经足够[1]

INT8 SmoothQuant:Ada GPU的替代方案。对于使用Ada架构GPU(如L40S、L4)的用户,FP8不是选项——Ada的Tensor Core不原生支持FP8。INT8 SmoothQuant是NVIDIA为此提供的替代方案。SmoothQuant的核心思想是将激活值的量化难度"转移"到权重上:通过一个平滑因子(per-channel scale),将激活值中的离群值(outlier)分摊到对应的权重通道,使得激活和权重都能被安全地量化到INT8。这一方法由MIT Han Song团队提出,已被证明在LLM上有效[4]

INT4 Weight-Only:极限压缩的代价。INT4 Weight-Only量化只压缩权重到4位,激活值保持FP16。这意味着模型权重的内存占用减少到原来的1/4(相比FP16),70B模型从~140GB降到~35GB,可以在单张H100(80GB)上运行。但INT4的精度损失是显著的——在复杂推理任务上,性能退化可能达到5-15%。更重要的是,INT4 Weight-Only推理需要在线反量化(将INT4权重在计算前解压为FP16),这部分额外的计算和内存访问部分抵消了带宽节省的收益[3]

FP4(Blackwell):下一个前沿。Blackwell架构(B200)原生支持FP4格式的Tensor Core运算,这是4位浮点量化的硬件级支持。与INT4不同,FP4保留了浮点数的指数-尾数结构,对LLM权重分布的适应性更好。B200在运行FP4模型时,内存带宽需求进一步降低,自动利用NVIDIA优化的FP4 kernel。在B200上运行DeepSeek-R1模型,TensorRT-LLM已创下世界纪录推理性能[1]。但FP4的成熟度和工具链支持仍不如FP8,目前主要适用于对精度有一定容忍度的吞吐优先场景。

KV缓存的FP8量化是一个容易被忽视但极其重要的优化。KV缓存是LLM推理中增长最快的内存消耗——输出序列越长、并发请求越多,KV缓存越大。将KV缓存从FP16量化到FP8,KV缓存的内存占用直接减半,这意味着同一张GPU可以服务更多的并发请求。在Hopper和Ada GPU上,FP8 KV缓存的精度损失几乎不可感知。TensorRT-LLM默认推荐在Hopper/Ada上使用FP8 KV缓存[1][5]

量化选择的实践建议

如果你用的是H100或更新的GPU,FP8是你唯一需要关注的量化格式。它的精度损失极小,性能提升显著,工具链成熟。INT8 SmoothQuant仅在Ada GPU或FP8精度确实不足时才需要考虑。INT4 Weight-Only是内存极度受限时的最后手段。FP4目前主要面向Blackwell早期用户,未来会成为FP8之后的新甜点。

四、KV缓存优化全景:从分页到重用的完整策略

KV缓存是LLM推理系统中最大、最复杂、也最值得优化的内存结构。理解TensorRT-LLM的KV缓存优化,就理解了它为什么能在高并发场景下远超竞争对手。

什么是KV缓存?在Transformer的自回归解码中,每生成一个新token,都需要与之前所有token的Key和Value计算注意力。如果不缓存已计算的Key和Value,每一步都需要重新计算整个序列的KV——计算量是O(N²)的灾难性增长。KV缓存通过存储已计算的Key-Value对,将每一步的attention计算从O(N²)降低到O(N)。代价是显存消耗:对于70B模型,一个2048 token序列的KV缓存可能占用数GB显存。在多并发请求的生产环境中,KV缓存通常占GPU总显存的50-80%[6][7]

Paged Attention:消除内存碎片。TensorRT-LLM实现了类似vLLM的PagedAttention机制。核心思想是将KV缓存分割为固定大小的block(通常为16或64个token的KV对),以block为单位分配和管理。这消除了传统连续内存分配的两个问题:一是内部碎片(预分配了最大长度的连续内存但实际只用了很短),二是外部碎片(频繁分配释放导致无法找到足够大的连续空闲块)。Paged Attention使得KV缓存的显存利用率从60-70%提升到接近100%[1][2]

KV缓存量化。如前所述,将KV缓存从FP16压缩到FP8,内存占用减半。但KV缓存的量化比权重量化更敏感——KV值直接影响attention score的计算,量化误差会通过softmax的指数运算放大。TensorRT-LLM对KV缓存的FP8量化使用了per-tensor或per-head的缩放因子,而非per-channel,以在精度和效率间取得平衡[5]

循环缓冲区(Circular Buffer)。对于有最大输出长度限制的请求,TensorRT-LLM使用循环缓冲区管理KV缓存——当输出token数超过预设上限时,新的KV对会覆盖最旧的KV对。这避免了为每个请求预分配最大长度KV缓存的空间浪费[1]

KV缓存重用(前缀缓存)是TensorRT-LLM 2025-2026年最重要的KV缓存创新。在对话场景中,同一用户的多轮对话共享相同的system prompt和对话历史。传统做法是为每一轮对话重新计算整个前缀的KV缓存——这是巨大的计算浪费。KV缓存重用允许TensorRT-LLM识别不同请求之间的共享前缀,直接复用已计算的KV缓存,只需计算新增部分的KV[5]

NVIDIA在2025年引入了更高级的KV缓存重用API,包含两个关键特性:一是基于优先级的驱逐策略——当KV缓存空间不足时,系统根据请求的优先级、前缀重用频率、等待时间等因素决定哪些KV缓存块应该被驱逐,而非简单的LRU。二是事件驱动型KV感知路由——在多GPU部署中,负载均衡路由器会考虑每个GPU上已缓存的KV前缀,将新请求优先路由到已缓存其前缀的GPU,最大化缓存命中率。这两个特性在多轮对话密集的生产环境中可以减少30-50%的Prefill计算量[5]

KV缓存:推理服务商最不愿谈论的成本

推理服务商向你收取的是token费用,但他们的实际成本结构中,KV缓存的显存占用是最大的隐性成本。一个并发100请求、每请求2048 token的70B模型部署,KV缓存可能占用超过100GB显存——需要多张H100分摊。这也是为什么许多推理服务商会对最大上下文长度和并发数做严格限制[7]。TensorRT-LLM的KV缓存优化(Paged Attention + FP8量化 + 前缀缓存重用)将这一成本压到了行业最低水平。

五、连续批处理:从Static到Inflight的进化

批处理(Batching)是GPU高性能计算的基石——将多个请求合并为一次前向传播,利用GPU的并行计算能力。但LLM推理的批处理面临一个独特的挑战:每个请求的输出长度不同,先完成的请求需要等待后完成的请求,导致GPU资源的浪费。这个问题的解决方案经历了三代演进。

Static Batching(静态批处理)是最简单的方式——将一批请求同时送入模型,等所有请求都生成完毕后,再处理下一批。问题显而易见:如果batch中有一个请求生成了2000个token,其余请求只生成了100个token,那么GPU在处理完前100个token后,大部分计算单元都在做无效的padding计算。在HuggingFace的默认实现中,GPU利用率可能低至30-40%[4]

Continuous Batching(连续批处理)是vLLM提出的核心创新——不再等整个batch完成,而是在每一步前向传播后检查哪些请求已经完成,将完成的请求从batch中移出,腾出位置插入等待队列中的新请求。这样,GPU在任何时刻都只处理活跃的请求,利用率大幅提升。但Continuous Batching的局限在于:它是请求级调度——新请求只有在batch中有空位时才能被插入,这意味着Prefill(处理新请求的prompt)和Decode(生成已有请求的下一个token)是在同一个batch中混合执行的。如果同时插入多个长prompt的新请求,Prefill的计算量会挤压Decode的执行,导致已有请求的延迟飙升[8]

Inflight Batching(飞行中批处理)是TensorRT-LLM的解决方案,也被称为"token级调度"。与Continuous Batching的请求级调度不同,Inflight Batching在token粒度上管理batch的组成。每一步前向传播,调度器可以为不同的请求分配不同的"角色":某些请求正在Prefill,某些请求正在Decode。调度器还可以将一个长prompt的Prefill拆分为多个chunk,与Decode请求混合执行——这就是Chunked Prefill。关键创新是:当一个请求完成Prefill的某个chunk后,调度器可以立即在下一步将其替换为另一个请求的Decode token,而不是等整个Prefill完成。这使得GPU在任何时刻都能保持高利用率,同时避免了Prefill挤压Decode的延迟问题[1]

Inflight Batching的工程实现极其复杂——调度器需要跟踪每个请求的状态(正在Prefill第几个chunk、已生成了多少个token、KV缓存在哪些block中),在每一步都做出最优的调度决策。TensorRT-LLM将这些复杂的调度逻辑放在C++ runtime中,经过高度优化,调度决策的延迟在微秒级[2]

六、推测解码:用小模型的"猜测"加速大模型

推测解码(Speculative Decoding)是2024-2026年LLM推理领域最令人兴奋的技术之一,它的核心思想违反直觉:用一个更小、更快的模型来加速大模型的推理。这不是在降低质量——大模型仍然是最终决策者,小模型只是提供"猜测"。

具体机制是:在每一步推理中,先用一个小模型("drafter")自回归地生成K个候选token(K通常为4-8)。然后,将这K个候选token一次性送入大模型("verifier")进行验证——大模型在一步前向传播中就能计算所有K个token的概率分布,并根据概率决定接受哪些token。由于Transformer的自回归特性,接受n个连续token的概率是各token条件概率的乘积,因此通常会接受K个token中的前几个,然后从第一个被拒绝的位置重新开始[1]

推测解码的性能收益取决于两个因素:一是drafter模型的预测准确率(越高越好,因为接受的token越多),二是drafter模型的推理速度(越快越好,因为猜测本身也要花时间)。在实践中,选择drafter模型是一门艺术——太小太快的模型预测准确率低,太大太准的模型推理速度慢。NVIDIA在Llama 3.3 70B上的实验表明,使用合适的drafter模型,推测解码可以将吞吐提升3倍[1]。这个提升的来源是:大模型一次前向传播验证K个token,等效于每步生成~3-4个token,而不是1个。

推测解码有一个重要的适用条件:它主要在Decode阶段有效。Prefill阶段本身就是并行的,不需要推测。这意味着推测解码的收益与输出长度正相关——输出越长,Decode占总时间的比例越大,推测解码的加速效果越明显。对于短输出(几十个token),推测解码可能因为drafter的开销反而降低性能[4]

TensorRT-LLM的推测解码实现有几个独特优势:一是drafter和verifier共享KV缓存的前缀部分(如果它们有相同的结构),减少了显存占用;二是drafter的推理可以与verifier的KV缓存准备并行执行;三是NVIDIA为推测解码编写了专用的CUDA kernel,将验证过程的开销压到最低[1]

七、多GPU并行:Tensor Parallelism与Pipeline Parallelism

70B及更大的模型无法装入单张GPU——即使使用FP8量化,70B模型也需要约35GB显存存放权重,加上KV缓存和运行时开销,单张80GB的H100也很难满足生产级并发的需求。多GPU并行是必然选择,而并行策略的选择直接影响了推理的延迟和吞吐。

Tensor Parallelism(TP,张量并行)是LLM推理的主流并行策略。核心思想是将模型的权重矩阵按列或行切分到多张GPU上,每张GPU计算矩阵乘法的一部分,然后通过AllReduce通信聚合结果。对于Transformer层的线性变换(如QKV投影、FFN),矩阵乘法可以自然地按列切分:将W切分为[W1, W2],GPU1计算XW1,GPU2计算XW2,然后AllReduce得到XW。TP的优势是延迟低——每个请求的计算被多张GPU并行完成,单步推理的延迟与单GPU相比显著降低。但代价是通信开销大——每个Transformer层需要两次AllReduce(attention后一次,FFN后一次),每次AllReduce的数据量与hidden_size成正比。在NVIDIA NVLink连接的GPU间,AllReduce的带宽可达900GB/s(H100 NVLink),通信延迟约10-20微秒。在PCIe连接的GPU间,带宽只有64GB/s,通信延迟可能达到100微秒以上[2]

因此,TP的最佳实践是只在NVLink互连的GPU间使用。H100的典型配置是8卡NVLink全互联,TP=8可以将70B模型的推理延迟降低到TP=1的约1/6(考虑通信开销,不到理想的1/8)。对于跨节点的并行(如2台8卡H100),TP不再适用,因为网络带宽远低于NVLink。

Pipeline Parallelism(PP,流水线并行)将模型的不同层分配到不同GPU上——GPU1处理第1-20层,GPU2处理第21-40层,以此类推。数据从GPU1流向GPU2再流向GPU3,形成流水线。PP的优势是通信量小——只在层边界传递激活值(hidden_states),数据量远小于TP的AllReduce。但PP的缺点是延迟高——请求需要串行经过所有GPU,流水线充满之前和排空之后的GPU是空闲的(流水线气泡)。PP主要适用于跨节点的大模型部署,或者当模型太大、即使TP=8也无法装入单节点时[2]

TensorRT-LLM支持TP和PP的灵活组合。对于70B模型,最常见的配置是TP=4或TP=8(单节点内),配合FP8量化。对于405B级别的模型,则需要TP=8 + PP=2-4(跨节点)。TensorRT-LLM还为MoE(Mixture of Experts)模型实现了Expert Parallelism——将不同的专家网络分配到不同GPU上,这对于DeepSeek-V3、Mixtral等MoE模型的推理至关重要[1]

八、Chunked Prefill与Prefill-Decode解耦

Chunked Prefill是TensorRT-LLM解决"Prefill与Decode互相干扰"问题的核心机制。这个问题值得深入理解,因为它直接影响了生产环境中的延迟和吞吐。

在没有Chunked Prefill的情况下,当Inflight Batching决定将一个新请求加入batch时,调度器需要为这个新请求执行完整的Prefill——一次性处理所有输入token。对于一个4096 token的prompt,Prefill的计算量约等于生成4096个Decode token。如果当前batch中有20个正在Decode的请求,这个Prefill会把GPU的计算资源全部占满,导致20个Decode请求在本步的延迟从~10ms飙升到~50-100ms。用户感知到的效果就是:当有新用户加入对话时,已有用户的回复速度突然变慢[1][7]

Chunked Prefill的解决方案是:将长prompt的Prefill拆分为多个小chunk,每次只处理一个chunk(如128或256个token),与正在Decode的请求混合执行。这样,Prefill的计算被分散到多个step中,每个step的Prefill计算量可控,不会对Decode请求的延迟造成显著冲击。代价是Prefill的总时间变长——原来一步完成的Prefill现在需要多步——但换来的是Decode延迟的稳定性和整体吞吐的提升[1]

更进一步,Prefill-Decode解耦(也称为Disaggregated Serving)将Prefill和Decode分配到不同的GPU上执行。Prefill是计算密集型的,适合在高算力GPU上运行;Decode是内存密集型的,适合在大显存GPU上运行。通过将两者分离,可以为每种工作负载配置最优的硬件。NVIDIA的Dynamo推理框架正是为此设计——它管理Prefill节点和Decode节点之间的KV缓存传输,将Prefill计算出的KV缓存高效地传递给Decode节点[1]

Chunked Prefill的参数调优

Chunked Prefill的核心参数是chunk大小——太大则Prefill仍然会挤压Decode,太小则Prefill的总步数太多、KV缓存的block管理开销增大。TensorRT-LLM的推荐值是128-512 tokens per chunk,具体取决于GPU型号和并发配置。在H100上,对于70B模型+TP=4,chunk size=256通常是不错的起点。chunk size的选择是一个需要根据实际工作负载profile来调优的参数,没有放之四海皆准的最优值[1]

九、FP8 Attention:在注意力计算中使用低精度

FP8 Attention是TensorRT-LLM在Hopper和Blackwell架构上的独有优化。传统的attention计算使用FP16或BF16精度:Q × K^T得到attention score矩阵(FP16),经过softmax后与V相乘。FP8 Attention将Q和K量化到FP8后再计算Q × K^T,利用Hopper Tensor Core的FP8矩阵乘法能力,吞吐翻倍。

但attention计算对精度的敏感性不同于线性层——softmax的指数运算会放大输入中的数值误差。NVIDIA的解决方案是使用混合精度:Q × K^T在FP8精度下计算(利用Tensor Core加速),但softmax和后续的attention × V在更高精度(FP16或FP32)下执行。这样既享受了FP8的计算加速,又避免了softmax的精度问题。在H100上的实测表明,FP8 Attention对模型质量的影响可以忽略不计,但attention计算的速度提升显著[1]

FP8 Attention与FlashAttention的关系是互补的。FlashAttention解决的是内存访问模式的问题(通过tiling避免将完整的attention矩阵写入全局显存),FP8 Attention解决的是计算精度的问题。TensorRT-LLM将两者结合——在FlashAttention的tiling框架中使用FP8精度进行计算,同时保持FlashAttention的内存效率[3]

框架对比:TensorRT-LLM vs vLLM vs SGLang

LLM推理框架的选择,是每一个AI基础设施团队面临的关键决策。TensorRT-LLM、vLLM和SGLang各有其明确的定位和适用场景,理解它们的差异比争论"哪个更好"重要得多。

维度TensorRT-LLMvLLMSGLangllama.cpp
定位NVIDIA极致优化通用高性能编译优化边缘/本地
推理性能最高(NVIDIA GPU)
灵活性低(需编译)
模型更新慢(需重新编译)快(热加载)
硬件支持仅NVIDIA GPUNVIDIA + AMD主要NVIDIACPU + GPU
上手难度
适用场景大规模长期生产通用生产高并发生产开发/边缘
开源性开源开源开源开源

H100 Benchmark实测(Llama 3.3 70B FP8)是检验框架性能的最佳试金石。根据第三方独立测试:

低并发(1-4请求)场景下,vLLM拥有最快的首token延迟(TTFT),SGLang拥有最快的单token延迟(ITL),TensorRT-LLM在两者之间。原因是低并发时GPU远未饱和,瓶颈在于调度和kernel launch的效率——vLLM的轻量级调度在此时占优,SGLang的编译优化使Decode的单步执行最快[8]

中并发(16-32请求)场景下,TensorRT-LLM开始展现优势。编译优化的kernel在batch size增大后效率更高,Inflight Batching的调度让GPU接近满载。vLLM和SGLang的吞吐也不错,但通常比TensorRT-LLM低10-20%[8]

高并发(64-100请求)场景下,TensorRT-LLM的优势最为明显——拥有最优的吞吐和延迟稳定性。vLLM的TTFT在高并发下退化严重,原因是调度器在大量Prefill请求面前的处理效率不足。SGLang保持稳定但吞吐上限低于TensorRT-LLM[8]

一个需要澄清的常见误解是"TensorRT-LLM在所有场景下都最快"。实际情况是:在低并发、短序列、频繁更换模型的开发场景下,TensorRT-LLM的编译开销反而成为劣势。TensorRT-LLM的性能优势在高并发、长序列、固定模型的生产场景下才充分体现[10][13]

llama.cpp在对比中处于不同的生态位。它不追求极致的GPU吞吐,而是强调在CPU上的推理能力极简部署。一个编译好的llama.cpp二进制文件可以在任何x86或ARM机器上运行,不需要CUDA、不需要NVIDIA驱动、不需要GPU。对于个人开发者、边缘设备、嵌入式场景,llama.cpp是不可替代的选择。但在GPU吞吐上,它与TensorRT-LLM有数量级的差距[9]

选型建议

如果你的场景满足以下条件,选TensorRT-LLM:NVIDIA GPU、模型固定、追求最大吞吐、愿意投入编译和调优时间。如果你的场景是:需要快速迭代模型、多硬件支持、简化运维——选vLLM。如果你追求高并发下的稳定低延迟:选SGLang。如果在CPU或边缘设备上运行:选llama.cpp。在大型生产部署中,也有团队同时使用多个框架——TensorRT-LLM用于核心模型的长期高并发服务,vLLM用于实验性模型的快速上线[12]

NVIDIA生态:TensorRT-LLM不是孤岛

TensorRT-LLM的真正威力,在于它不是NVIDIA生态中的一个独立产品,而是NVIDIA全栈AI推理平台的核心引擎。理解它的生态位,才能理解NVIDIA的完整推理战略。

Triton Inference Server是NVIDIA的通用推理服务框架,支持HTTP/gRPC接口、模型版本管理、动态batching、多模型共存等生产级功能。TensorRT-LLM编译后的engine可以直接部署在Triton上,通过Triton的backend接口与TensorRT-LLM的C++ runtime交互。Triton负责接收请求、管理队列、返回结果,TensorRT-LLM负责高效的GPU执行。这种分工使得生产部署变得标准化——运维团队只需管理Triton的配置和生命周期,推理优化由TensorRT-LLM的engine文件负责[1]

NVIDIA Dynamo是2025年发布的推理编排框架,专注于分布式推理的协调。在多节点部署中,Dynamo负责Prefill节点和Decode节点的协调、KV缓存在节点间的传输、请求路由和负载均衡。Dynamo与TensorRT-LLM的KV缓存重用API深度集成,实现了跨节点的KV缓存感知路由。可以说,Dynamo是TensorRT-LLM从"单节点高性能"走向"分布式高可用"的关键组件[1]

NVIDIA NeMo是模型训练和微调框架,与TensorRT-LLM形成了"训练-部署"的完整闭环。NeMo训练或微调的模型,可以直接导出为TensorRT-LLM支持的格式,经过量化和编译后部署。NeMo还提供了自动化的精度校准pipeline,简化了从FP16到FP8的量化过程[4]

这三者的关系是:NeMo负责"造模型",TensorRT-LLM负责"跑得快",Triton负责"服务好",Dynamo负责"扩得开"。这种全栈整合是NVIDIA在推理领域的核心竞争优势——竞争对手很难在单一框架层面超越TensorRT-LLM的性能,更难复制NVIDIA整个生态的协同效应[3]

生产部署实践

将TensorRT-LLM从benchmark论文带入生产环境,是一条充满工程挑战的道路。以下是基于大规模部署经验的实践总结。

编译阶段是生产部署的第一个难关。编译一个70B参数的模型(FP8量化+TP=4)在H100上通常需要30-60分钟,包括模型解析、算子融合图优化、精度校准、kernel选择和CUDA Graph捕获。编译产物的质量取决于配置参数的正确性——不恰当的max_batch_size、max_seq_len或chunk_size配置可能导致运行时性能远低于预期。最佳实践是:根据生产环境的实际工作负载profile来配置编译参数,而不是使用默认值。例如,如果实际请求的输入长度中位数是512 token、最大4096 token,就不要将max_seq_len设为32768——这会导致TensorRT-LLM为不可能用到的序列长度预分配大量资源[1][10]

量化校准是另一个关键步骤。FP8 PTQ需要几百条校准样本,这些样本的分布应该尽可能接近生产环境的实际输入。使用不恰当的校准数据(如用维基百科文本校准一个代码生成模型)可能导致某些层的激活值分布估计不准确,进而在边缘case中出现精度退化。建议从生产日志中采样真实的请求数据作为校准集[4]

运行时调优涉及多个参数的协同优化。关键的运行时参数包括:KV缓存的总block数(决定了最大并发数)、Prefill的chunk size(影响TTFT与Decode延迟的平衡)、调度策略(如Prefill-Decode混合比例)、以及CUDA Graph的启用条件。这些参数之间存在复杂的相互作用——增大并发数会增加KV缓存占用,可能需要减少chunk size来控制延迟;启用推测解码会引入drafter模型的额外显存开销[1]

监控与可观测性在生产中至关重要。TensorRT-LLM通过Triton暴露了丰富的metrics,包括每步推理的延迟分解(Prefill时间、Decode时间、调度时间、通信时间)、KV缓存的利用率、batch size分布、请求队列长度等。建议将这些metrics接入Prometheus + Grafana,设置基于P99延迟和吞吐下降的自动告警[3]

模型更新流程是TensorRT-LLM运维中最大的痛点。每次模型权重更新(如RLHF后的新版本),都需要重新编译整个engine。对于频繁更新的场景(如每天更新),这意味着每天需要30-60分钟的编译窗口。最佳实践是:使用蓝绿部署——在新engine编译完成后,通过Triton的模型版本管理无缝切换,旧engine继续服务直到所有进行中的请求完成。另一个策略是预编译多个版本的engine,存储在分布式文件系统中,需要时直接加载[10]

工程挑战与权衡

TensorRT-LLM的性能不是没有代价的。每一个性能优势的背后,都是一个明确的工程权衡。诚实面对这些挑战,是做出正确技术选型的基础。

挑战一:编译时间。这是被抱怨最多的问题。编译时间长不仅影响部署效率,更影响开发迭代速度。在模型研发阶段,研究者可能每天需要测试多个模型变体——每次编译30-60分钟的等待是难以忍受的。NVIDIA正在通过增量编译(只重编译修改过的部分)和预编译kernel库来缓解这一问题,但在2026年,编译时间仍然是TensorRT-LLM最大的工程痛点[10]

挑战二:配置复杂度。TensorRT-LLM的配置参数远多于vLLM——从编译期的模型参数(max_batch_size、max_seq_len、num_heads、hidden_size)到运行时的调度参数(KV cache block数、chunk size、prefill/decode比例),再到量化参数(calibration数据集、缩放策略),每个参数都会影响最终性能。这对运维团队提出了很高的要求——不仅需要理解LLM的推理原理,还需要理解GPU的硬件特性。相比之下,vLLM的"开箱即用"体验在易用性上具有明显优势[11]

挑战三:硬件锁定。TensorRT-LLM完全依赖NVIDIA GPU——它的优化kernel是针对NVIDIA GPU架构编写的,编译器生成的代码只能在CUDA平台上运行。这意味着如果你未来考虑使用AMD GPU(如MI300X)或Google TPU,TensorRT-LLM的投资将无法迁移。在当前的地缘政治环境下,硬件供应链的多样性是许多企业的战略考量[13]

挑战四:灵活性vs性能的根本矛盾。TensorRT-LLM的高性能来源于编译时的极致优化——但编译的前提是"知道运行时的所有信息"。max_batch_size和max_seq_len在编译时确定,运行时不能超过这些限制。这意味着如果生产流量超出预期,你无法简单地"开大"batch size——需要重新编译。vLLM的运行时调度虽然效率稍低,但具有天然的弹性——它可以适应任何batch size和序列长度(在显存允许的范围内)[10]

挑战五:社区与生态。虽然TensorRT-LLM是开源的,但它的核心优化kernel是闭源的——社区无法修改或贡献kernel优化。这限制了社区参与的深度。vLLM和SGLang拥有更活跃的开源社区,新模型的支持通常更快(有时快几天到几周)。TensorRT-LLM需要NVIDIA官方支持新模型,虽然NVIDIA在2025-2026年加快了Day-0支持的速度(GPT-OSS-120B/20B、EXAONE 4.0、DeepSeek-V3.2都有Day-0支持),但社区驱动的模型仍然可能面临等待[1]

产业落地

TensorRT-LLM已在多个产业领域实现了大规模落地,其影响远超技术圈。

云服务商是TensorRT-LLM的最大用户群体。AWS、Azure、Google Cloud都提供了基于TensorRT-LLM的推理服务。当你在Azure OpenAI Service上调用GPT-4时,底层的推理引擎很可能就是TensorRT-LLM(或其定制版本)。云服务商选择TensorRT-LLM的原因很简单:在相同的GPU硬件上,TensorRT-LLM能服务更多的用户,直接降低了单位token的成本。对于利润微薄的推理服务市场,这个成本差异是决定性的[12]

AI推理服务商如Together AI、Fireworks AI、Anyscale也广泛采用TensorRT-LLM作为核心推理引擎。这些服务商的竞争力在于提供比云厂商更低的token价格和更快的推理速度——TensorRT-LLM的性能优势直接转化为价格优势。但也有服务商选择vLLM——因为它支持AMD GPU,可以提供比纯NVIDIA方案更低的基础设施成本[13]

企业自建推理集群是另一个重要场景。大型科技公司(如Meta、字节跳动、阿里巴巴)都有自己的LLM推理基础设施,TensorRT-LLM通常是核心组件之一。Meta的Llama系列模型的官方推理推荐就包括TensorRT-LLM。这些企业通常有专门的ML Infra团队来管理TensorRT-LLM的编译和部署,能够承担其复杂度[2]

MoE模型的推理是2025-2026年的新热点。DeepSeek-V3、Mixtral、GPT-OSS等MoE模型的推理对推理引擎提出了新挑战——每个token只需要激活部分专家网络,负载均衡和KV缓存管理与稠密模型有很大不同。TensorRT-LLM为此引入了Expert ParallelismDWDP(Distributed Weight-Data Parallelism,NVL72上的分布式权重数据并行),专门优化MoE模型在多GPU上的推理效率。在B200上运行DeepSeek-R1,TensorRT-LLM已创下世界纪录推理性能[1]

Blackwell架构的机遇。B200的FP4原生支持和更大的显存(192GB HBM3e)为LLM推理打开了新的可能性。FP4量化使得405B级别的模型可以在单节点上高效运行,而无需跨节点通信。B200的NVLink带宽进一步提升(1.8TB/s双向),TP的通信开销进一步降低。TensorRT-LLM已经为Blackwell做了深度优化,包括自动检测并使用FP4 kernel、针对B200的SM架构调优的kernel等[1]

结论

TensorRT-LLM代表了LLM推理优化的一条明确路线:用编译时的极致优化,换取运行时的极致性能。在NVIDIA GPU上,它目前是无争议的性能王者——H100上的10,000+ tokens/sec、高并发下的最优吞吐和延迟稳定性、与NVIDIA全栈生态的深度集成,这些优势在2026年的推理框架竞争中仍然独一无二。

但它不是所有人的最优解。编译时间长、配置复杂、硬件锁定——这些代价意味着TensorRT-LLM更适合"模型固定、追求极致吞吐"的大规模生产场景,而非"快速迭代、多模型实验"的研发场景。在LLM推理的基础设施选型中,没有银弹——只有最适合你的场景的方案。

值得关注的是,推理框架的竞争正在加速。vLLM在持续缩小与TensorRT-LLM的性能差距(通过引入FlashAttention-3、优化调度器),SGLang在编译优化路线上做出了差异化创新,AMD的ROCm生态也在快速成熟。TensorRT-LLM需要继续创新——不仅仅是kernel级的优化,更需要在易用性、编译速度和多硬件支持上做出改进——才能在日益激烈的竞争中保持领先。

最终,LLM推理的终极目标不是"哪个框架更快",而是让每一个token的计算成本趋近于零。在这个目标面前,TensorRT-LLM是当前最接近的答案之一,但距离终点还很远。Blackwell架构和FP4量化已经暗示了下一个飞跃的方向——当推理成本足够低,LLM将从"按token收费"的奢侈品变为"按需使用"的基础设施。那一天到来时,回头看TensorRT-LLM,我们会看到它在这条路上刻下的重要里程碑。

参考来源