3、核心推理引擎(下):TensorRT-LLM 深度剖析、图优化与量化、多卡并行策略

好,咱们接着聊。上一节我们把推理引擎的江湖格局捋了一遍,这一节我打算把 TensorRT-LLM 这个“当红炸子鸡”彻底拆开来看。说实话,我最早接触 TensorRT 还是做 CV 模型的时候,那时候它还是个“偏科生”。但到了 LLM 时代,NVIDIA 几乎是倾尽全公司之力在推 TensorRT-LLM,这玩意儿现在已经不是简单的推理库了,它是一整套“从模型到部署”的武器库。

3.1 TensorRT-LLM 的“三板斧”

我个人习惯把 TensorRT-LLM 的核心能力总结成三块:图优化量化并行策略。这三板斧缺一不可,而且顺序不能乱。

核心逻辑:先通过图优化把计算图“剪枝”干净,再通过量化把精度“压缩”到极致,最后通过并行策略把硬件“喂饱”。

为什么是这个顺序?你想想看,如果图都没优化好,里面全是冗余的 reshape 和 transpose,你量化得再狠,并行策略再花哨,那也是“在垃圾堆里找金子”。我在项目中遇到过好几次,团队花了两周调并行策略,结果发现是图里有个没必要的 cast 操作在拖后腿。嗯,先优化图,这是铁律。

3.2 图优化:把计算图“盘”顺了

图优化说白了,就是让模型的计算图更“聪明”。TensorRT-LLM 在这方面做了大量工作,我挑几个重点讲。

3.2.1 算子融合(Kernel Fusion)

这是最基础也最有效的一招。比如把 LayerNorm 后面的激活函数直接“塞”进 LayerNorm 的核函数里。为什么要这么做?因为每次启动一个 CUDA kernel 都有开销,你把两个 kernel 合并成一个,省掉了一次启动时间,还减少了显存读写。

# 伪代码示意:融合前
output = layer_norm(input)
output = relu(output)

# 融合后(TensorRT-LLM 内部自动完成)
output = fused_layer_norm_relu(input)

我曾经在一个 7B 模型上做过测试,光是把 LayerNorm + SiLU 融合,端到端推理速度就提升了 12%。别小看这 12%,在线上服务里,这就是实打实的成本节省。

3.2.2 注意力机制的“魔改”

LLM 的核心是注意力机制,TensorRT-LLM 在这里下了大功夫。它支持多种注意力实现:

  • FlashAttention:通过分块计算,减少显存占用。我建议你无脑开启,除非你的显卡不支持。
  • PagedAttention:这是 vLLM 首创的思路,TensorRT-LLM 也吸收了进来。它把 KV Cache 按“页”管理,解决了显存碎片问题。
  • Multi-Query Attention (MQA) / Grouped-Query Attention (GQA):这些是模型结构层面的优化,TensorRT-LLM 在推理时能自动识别并利用这些结构。

避坑指南:我曾经在部署一个 13B 模型时,发现显存占用异常高。排查了半天,发现是 PagedAttention 的 block size 设置得太大了。默认是 16,我改成了 8,显存占用直接降了 30%。记住,block size 不是越大越好,要根据你的平均序列长度来调。

3.3 量化:把精度“压缩”到极致

量化是部署大模型的“必修课”。一个 FP16 的 70B 模型,光权重就要 140GB 显存,单卡根本放不下。量化到 INT4,直接降到 35GB,四卡就能跑起来。

TensorRT-LLM 支持多种量化方案,我按推荐程度排个序:

量化方案 精度损失 加速比 我的建议
FP8 极小 1.5x - 2x H100 首选,几乎无损
INT8 (SmoothQuant) 较小 2x - 3x A100 上最均衡的选择
INT4 (AWQ/GPTQ) 中等 3x - 4x 显存紧张时的“救命稻草”
INT4 (FP8 混合) 可控 3x - 4x 我最近在尝试的方案,效果不错

这里我要重点说一下 SmoothQuant。它的思路很巧妙:把激活值的量化难度“平滑”到权重上。说白了,就是让激活值不那么“尖锐”,从而减少量化误差。我在部署 LLaMA 系列模型时,SmoothQuant 几乎是标配,精度损失控制在 1% 以内。

注意:量化不是万能的。如果你发现量化后模型输出质量明显下降,先检查一下校准数据集是否覆盖了你的业务场景。我曾经遇到一个客户,用新闻数据做校准,结果在代码生成任务上崩得一塌糊涂。校准数据一定要和实际使用场景匹配。

3.4 多卡并行策略:把硬件“喂饱”

单卡跑不动怎么办?上多卡。但多卡不是简单地把模型拆开,这里面的门道很多。TensorRT-LLM 支持三种并行策略,我分别说说。

3.4.1 张量并行(Tensor Parallelism)

把一层网络的计算拆分到多张卡上。比如一个线性层有 4096 个神经元,两张卡各算 2048 个。这种策略通信量很大,因为每层计算完都要做一次 all-reduce。

我建议:单机内用 NVLink 连接时,张量并行效果最好。跨机器的张量并行,通信延迟会让你怀疑人生。

3.4.2 流水线并行(Pipeline Parallelism)

把模型按层切分,每张卡负责连续的几层。这种策略通信量小,但存在“气泡”问题——后面的卡在等前面的卡算完。

TensorRT-LLM 在这方面做了优化,支持 异步调度微批次 技术,能有效减少气泡。我在部署 70B 模型时,用 8 卡流水线并行,吞吐量比简单切分高了 40%。

3.4.3 序列并行(Sequence Parallelism)

这是针对长序列场景的优化。把一条长序列切分成多段,每张卡处理一段。这种策略在上下文长度超过 32K 时特别有用。

我的经验:实际部署时,很少只用一种并行策略。通常是“组合拳”:张量并行 + 流水线并行 + 序列并行。比如 8 卡机器,可以 4 卡做张量并行,2 组流水线并行,再配合序列并行处理长文本。具体怎么配,要看你的模型大小和业务场景。

3.5 一张图看懂 TensorRT-LLM 的核心逻辑

说了这么多,我画张图帮你理一理思路。

TensorRT-LLM 核心推理引擎架构 输入 Token 序列 第一步:图优化 算子融合 | 注意力魔改 | 内存优化 第二步:量化压缩 FP8 | INT8 (SmoothQuant) | INT4 (AWQ/GPTQ) 第三步:多卡并行 张量并行 | 流水线并行 | 序列并行 关键指标 延迟:越低越好 吞吐:越高越好 显存:越省越好 精度:损失越小越好 三者需要权衡 没有银弹

这张图很清楚地展示了 TensorRT-LLM 的“三步走”策略。每一步都有大量的调优空间,但核心逻辑是不变的:先优化图,再压缩精度,最后并行化。顺序错了,效果会大打折扣。

3.6 实战中的“组合拳”

最后,我分享一个实际案例。上个月我帮一个客户部署 70B 模型,8 卡 A100,要求延迟低于 200ms。

  1. 图优化:开启 FlashAttention 和 PagedAttention,block size 设为 8。
  2. 量化:使用 SmoothQuant 量化到 INT8,校准数据用客户提供的对话日志。
  3. 并行策略:4 卡张量并行 + 2 组流水线并行。因为单机内 NVLink 带宽足够,张量并行通信开销可控。

最终结果:延迟 180ms,吞吐量 1200 tokens/s,显存占用 72GB。客户很满意。

一个小技巧:调优时不要一次改多个参数。我习惯每次只改一个变量,比如先调 block size,固定后再调量化方案,最后调并行策略。这样出了问题,你能立刻知道是哪里导致的。

好了,TensorRT-LLM 的核心内容就这些。说白了,它就是一套“模型手术刀”,帮你把大模型“削”到能跑、跑得快、跑得省。下一节我们聊聊另一个重要的推理引擎——vLLM,看看它和 TensorRT-LLM 有什么不同。


公众号:蓝海资料掘金营,微信deep3321