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 的“三步走”策略。每一步都有大量的调优空间,但核心逻辑是不变的:先优化图,再压缩精度,最后并行化。顺序错了,效果会大打折扣。
3.6 实战中的“组合拳”
最后,我分享一个实际案例。上个月我帮一个客户部署 70B 模型,8 卡 A100,要求延迟低于 200ms。
- 图优化:开启 FlashAttention 和 PagedAttention,block size 设为 8。
- 量化:使用 SmoothQuant 量化到 INT8,校准数据用客户提供的对话日志。
- 并行策略:4 卡张量并行 + 2 组流水线并行。因为单机内 NVLink 带宽足够,张量并行通信开销可控。
最终结果:延迟 180ms,吞吐量 1200 tokens/s,显存占用 72GB。客户很满意。
一个小技巧:调优时不要一次改多个参数。我习惯每次只改一个变量,比如先调 block size,固定后再调量化方案,最后调并行策略。这样出了问题,你能立刻知道是哪里导致的。
好了,TensorRT-LLM 的核心内容就这些。说白了,它就是一套“模型手术刀”,帮你把大模型“削”到能跑、跑得快、跑得省。下一节我们聊聊另一个重要的推理引擎——vLLM,看看它和 TensorRT-LLM 有什么不同。
公众号:蓝海资料掘金营,微信deep3321