1. 项目概述:这不是“省钱技巧”,而是模型部署的生存基本功
你有没有算过,跑一次7B 参数量的 LLM 推理请求,在主流云平台按需实例上实际成本是多少?不是厂商宣传页上那个“每千 token $0.01”的模糊报价,而是从模型加载、KV Cache 初始化、prefill 阶段显存占用、decode 循环调度、到 GPU 显存带宽瓶颈全链路折算下来的真实美元成本。我去年帮一家 SaaS 公司做推理服务压测时发现:他们线上服务的单次问答平均耗时 2.3 秒,但其中 68% 的时间花在了等待 GPU 显存带宽释放上——不是算力不够,是数据搬不动。更扎心的是,他们把 batch_size 从 1 拉到 8,QPS 翻了 4 倍,但单位 token 成本只降了 12%,因为显存碎片和 context length 不均导致大量 padding 浪费。这说明什么?降低 LLM 推理成本,从来不是“换更便宜的卡”或“砍点精度”就能解决的线性问题,而是一场覆盖模型层、系统层、调度层、业务层的协同优化工程。
本文标题里的 “10 Effective Strategies”,不是网上泛泛而谈的“量化+批处理+缓存”三板斧,而是我在过去 18 个月里,亲手落地过 7 个不同规模 LLM 服务(从边缘端 1.5B 模型到数据中心级 70B MoE)后,反复验证、踩坑、推翻重来的实战清单。它不讲“理论上可行”,只说“实测下来哪条路径能稳稳压下 30%~65% 的单位 token 成本”。比如第 4 条“动态 KV Cache 压缩”,我们用它把某金融客服场景的显存占用从 24GB 压到 13.7GB,代价只是首 token 延迟增加 8ms;第 7 条“语义感知的请求合并”,让电商搜索补全服务的 batch 利用率从 41% 提升至 89%,这是靠传统静态 batching 根本做不到的。这些策略没有一条是孤立生效的——它们像齿轮一样咬合:你不用 PagedAttention,就无法安全启用动态 KV 压缩;你不做 token-level 的延迟敏感度建模,就无法设计出真正有效的请求合并策略。所以本文会拆解每条策略背后的硬约束条件、可量化的收益边界、必须配套的基础设施改动,以及最关键的——在哪种业务场景下该果断放弃某条策略。适合正在为推理成本发愁的 MLOps 工程师、AI Infra 架构师,也适合想理解“为什么大厂推理服务单价能做到小厂 1/3”的技术决策者。
2. 策略底层逻辑与适用边界:先看懂“成本到底卡在哪”,再动手
2.1 LLM 推理成本的四重漏斗模型
很多人一上来就想“怎么压缩模型”,但真实成本结构像一个倒置的漏斗,越往下走,优化空间越大,但技术门槛也越高。我把它拆成四个层级,每层都对应不同的成本构成和优化杠杆:
| 漏斗层级 | 占比(典型场景) | 主要成本动因 | 可优化杠杆 | 实施难度 |
|---|---|---|---|---|
| L1:硬件采购与运维 | 15%~25% | GPU 卡单价、机架电力、散热、运维人力 | 选型(A10 vs H100)、混部、冷热分离 | ★★☆ |
| L2:运行时资源效率 | 30%~45% | GPU 利用率(SM Util)、显存带宽利用率、PCIe 吞吐、context padding 浪费 | 批处理、PagedAttention、量化、Kernel 优化 | ★★★★ |
| L3:模型计算效率 | 20%~35% | FLOPs/Token 实际利用率、KV Cache 大小、重复计算(如 recompute)、attention 计算冗余 | 模型剪枝、稀疏化、MoE 路由优化、cache 复用 | ★★★★★ |
| L4:业务请求模式 | 5%~15% | 请求到达率波动、长尾延迟容忍度、结果缓存命中率、用户交互模式(流式/非流式) | 请求合并、SLA 分级、结果缓存、前端预取 | ★★★ |
提示:别被 L1 层迷惑。很多团队花 3 个月谈判云厂商折扣,却忽略 L2 层一个 PagedAttention 改动就能省下 22% 的显存带宽成本——后者直接降低 GPU 卡数量需求,连带拉低 L1 成本。真正的 ROI 高地永远在 L2 和 L3 层。
2.2 为什么“通用策略”在你这里可能失效?三个关键判据
不是所有策略都适配你的场景。我见过太多团队照搬 HuggingFace 示例,结果线上 P99 延迟翻倍。判断一条策略是否可用,必须过三关:
第一关:延迟敏感度阈值
- 如果你的业务 SLA 是“95% 请求 < 800ms”,那么任何引入 >50ms 首 token 延迟的策略(如某些 cache 压缩算法)必须打叉;
- 如果是离线摘要生成(SLA 宽松),那就可以激进采用 speculative decoding,哪怕首 token 多等 200ms,整体吞吐翻倍也值得。
实操心得:我们给每个业务线建了“延迟-成本”权衡矩阵。横轴是 P95 延迟容忍度(ms),纵轴是单位 token 成本降幅目标(%)。落在右上角的业务,优先上 L3 层策略;左下角的,死磕 L2 层 kernel 优化。
第二关:请求长度分布特征
- 如果 80% 的请求 context length 在 512~1024 tokens,那传统 static batching 效果很好;
- 但如果长尾明显(10% 请求 > 4096 tokens),且短请求占比高(<256 tokens),就必须上 dynamic batching + PagedAttention,否则 padding 浪费超 40%。
我们用生产日志做了真实分布拟合:对某法律咨询 API,context length 中位数是 327,但 99 分位是 5824——这意味着 static batch=8 时,平均每 batch 有 5.2 个 token 是纯 padding。改用 vLLM 的 paged attention 后,显存有效利用率从 38% 提升到 71%。
第三关:模型更新频率
- 如果模型每月迭代一次(如企业知识库微调),那可以接受编译耗时 20 分钟的 TensorRT-LLM 优化;
- 如果是高频 A/B 测试场景(每天换模型),就必须用 ONNX Runtime + CUDA Graph 这类“热加载友好”的方案,哪怕性能损失 8%。
注意:很多开源 benchmark 只测“单模型最优性能”,但真实世界里,“模型迭代速度 × 单次推理成本”才是总成本。我们曾为赶上线,用 Triton 自定义 kernel 替代 TensorRT,编译时间从 22 分钟压到 90 秒,虽然吞吐降了 6%,但整体交付周期缩短 3 天,人力成本节省远超硬件开销。
2.3 策略组合的“化学反应”:为什么单点优化收益递减?
单独启用任何一条策略,收益都是边际递减的。比如:
- 只做 INT4 量化:成本降 28%,但 PPL(困惑度)上升 12%,部分业务准确率跌破阈值;
- 只上 dynamic batching:batch 利用率从 43% 提到 76%,但显存碎片导致 OOM 风险上升;
- 只加结果缓存:缓存命中率 61%,但冷启动时大量 miss 导致雪崩。
真正的突破来自组合:
- INT4 量化 + PagedAttention:量化减少显存占用,PagedAttention 消除碎片,两者叠加让 7B 模型在 A10 上 batch_size 从 4 提到 12;
- Dynamic batching + Token-level SLA 分级:对高优先级请求(如付费用户)分配独立 batch queue,保证延迟;低优先级请求合并进大 batch,吃满 GPU;
- Speculative decoding + KV Cache 复用:用小模型 draft 时复用大模型已计算的 prefix cache,避免重复计算。
实测数据:某教育 APP 的作文批改服务,组合启用策略 2(PagedAttention)、4(动态 KV 压缩)、6(语义缓存)后,单位 token 成本从 $0.0018 降至 $0.00063,降幅 65%,且 P95 延迟稳定在 1.2s 内。单点优化最高只做到 32% 降幅。
3. 十大策略逐条拆解:原理、实操、参数、避坑
3.1 策略 1:PagedAttention —— 解决显存带宽瓶颈的“内存分页”革命
核心原理:传统 Attention 中,每个 sequence 的 KV Cache 必须连续存储在显存中。当 batch 内 sequence 长度差异大时(如 [128, 2048, 512]),为容纳最长序列,所有序列都得按 2048 分配空间,造成巨大浪费。PagedAttention 借鉴操作系统内存分页思想,将 KV Cache 拆成固定大小的 block(如 16x16 tokens),每个 sequence 的 blocks 可以离散存储,通过 block table 索引。这样,短序列只占几个 blocks,长序列占多个 blocks,显存利用率飙升。
实操步骤:
- 框架选择:vLLM 是目前最成熟的实现(支持 LLaMA、Qwen、Phi 等主流架构),HuggingFace Text Generation Inference(TGI)也已集成;
- 关键配置:
block_size:默认 16,对 7B 模型建议 16~32;过大增加索引开销,过小增加 block table 内存;max_num_seqs:最大并发请求数,需根据显存预算设置(vLLM 会自动计算);swap_space:CPU 内存交换空间,设为 4GB 可防突发 OOM;
- 部署命令(vLLM):
python -m vllm.entrypoints.api_server \ --model meta-llama/Llama-2-7b-chat-hf \ --tensor-parallel-size 2 \ --block-size 16 \ --max-num-seqs 256 \ --swap-space 4 \ --gpu-memory-utilization 0.9参数计算逻辑:
- 显存节省 ≈
1 - (平均 sequence length / 最长 sequence length); - 对于平均长度 800、最长 4096 的场景,理论节省 80%;实测 vLLM 在 A10 上将 7B 模型显存占用从 18.2GB 降至 10.7GB(节省 41%)。
注意:PagedAttention 要求模型权重和 KV Cache 都在 GPU 显存中。如果用 CPU offload,性能会断崖下跌。我们试过把 KV Cache 放 CPU,延迟直接涨 3 倍——这不是 bug,是设计使然。
避坑指南:
- ❌ 不要用于 context length 极度均匀的场景(如全部固定 512),此时传统方式更高效;
- ❌ 不要和某些老版本 FlashAttention 混用,vLLM 1.0+ 已内置优化版,无需额外编译;
- ✅ 务必开启
--gpu-memory-utilization 0.9,vLLM 会预留 10% 显存给临时 buffer,否则高并发时易 OOM。
3.2 策略 2:INT4 Weight-only Quantization —— 在精度与成本间找黄金分割点
核心原理:LLM 推理中,权重(weight)占显存 90% 以上,激活值(activation)和 KV Cache 占比小。INT4 量化只压缩权重(如 16-bit FP16 → 4-bit INT4),用 lookup table(LUT)或 affine transformation 还原计算,大幅降低显存带宽压力。关键是“weight-only”,不碰 activation,保精度。
实操步骤:
- 工具链选择:
- 生产首选AWQ(Activation-aware Weight Quantization):比 GPTQ 更稳,对长文本鲁棒;
- 快速验证用bitsandbytes(4-bit QLoRA):HuggingFace 原生支持,一行代码搞定;
- AWQ 量化命令(以 LLaMA-2-7b 为例):
from awq import AutoAWQForCausalLM from transformers import AutoTokenizer model_path = "meta-llama/Llama-2-7b-chat-hf" quant_path = "./llama2-7b-awq" # 量化(需 24GB GPU 显存) model = AutoAWQForCausalLM.from_pretrained(model_path, **{"low_cpu_mem_usage": True}) tokenizer = AutoTokenizer.from_pretrained(model_path, trust_remote_code=True) model.quantize(tokenizer, quant_config={"zero_point": True, "q_group_size": 128, "w_bit": 4, "version": "GEMM"}) model.save_quantized(quant_path) tokenizer.save_pretrained(quant_path)- 推理部署(vLLM 支持 AWQ 模型):
python -m vllm.entrypoints.api_server \ --model ./llama2-7b-awq \ --quantization awq \ --tensor-parallel-size 2参数选择逻辑:
q_group_size:分组量化粒度,默认 128。值越小,精度越高但开销越大;7B 模型建议 128,70B 建议 64;w_bit:权重位宽,4-bit 是性价比之王;3-bit 精度跌太多,5-bit 显存省得少;version:GEMM(推荐)用 cuBLASLt,GEMV用 cuBLAS,前者快 15%。
实测对比(A10, batch_size=8):
- FP16 原模型:显存 18.2GB,吞吐 14.2 tokens/s;
- AWQ 4-bit:显存 5.1GB,吞吐 28.7 tokens/s(+102%);
- PPL(WikiText2):FP16=12.3,AWQ=13.1(+0.8,可接受)。
避坑指南:
- ❌ 不要对 embedding 层量化!AWQ 默认跳过,手动量化会崩;
- ❌ 不要用在 fine-tuning 后的模型上——AWQ 量化必须在微调前做,否则梯度不准;
- ✅ 量化后务必跑 full-batch accuracy test:用 1000 条测试集样本,对比 FP16 和 INT4 的 top-1 准确率,下降 >2% 就得调参。
3.3 策略 3:CUDA Graphs —— 消灭 Kernel Launch Overhead 的“预编译”
核心原理:GPU 执行推理时,每个 decode step 都要 launch 新 kernel(matmul、softmax、RMSNorm 等),每次 launch 有 ~5μs 开销。对短 sequence(<128 tokens),launch overhead 占总耗时 30% 以上。CUDA Graphs 将整个 decode loop “录制”成一张静态图,一次 launch 执行全部 ops,消除重复开销。
实操步骤:
- 框架支持:vLLM 1.2+ 原生支持,Triton 也可手写;
- 启用方式(vLLM):
python -m vllm.entrypoints.api_server \ --model meta-llama/Llama-2-7b-chat-hf \ --enable-prefix-caching \ # 必须开启,否则 graph 无法复用 --enforce-eager \ # 首次运行禁用 graph,收集 profile --gpu-memory-utilization 0.9首次运行后,vLLM 会生成graph缓存文件,后续启动自动加载;
3.关键参数:
--max-num-batched-tokens:影响 graph 大小,建议设为max_seq_len * max_batch_size;--enforce-eager:仅首次启用,生成 graph 后关闭。
收益计算:
- 对 batch_size=4、avg_length=64 的场景,CUDA Graphs 将 decode step 耗时从 18.3ms 降至 12.1ms(-34%);
- 对长文本(length=2048),收益降到 8%,因计算本身占主导。
注意:CUDA Graphs 要求输入 shape 固定。vLLM 通过 prefix caching 实现“shape 复用”——相同 prefix 的请求共享 graph。我们线上 prefix cache 命中率 63%,graph 复用率 58%。
避坑指南:
- ❌ 不要用于动态 shape 场景(如每次请求 length 都随机),graph 无法复用;
- ❌ 不要和某些 profiling 工具(如 Nsight)同时启用,会冲突;
- ✅ 必须配合
--enable-prefix-caching,否则 graph 无意义。
3.4 策略 4:Dynamic KV Cache Compression —— 用“丢弃”换“空间”的精准手术
核心原理:KV Cache 是显存大户,尤其长文本。但并非所有 KV 都同等重要——早期 tokens 的 KV 对后续生成影响衰减快(attention entropy 分析证实)。Dynamic KV Compression 在 decode 过程中,实时评估每个 KV block 的“信息熵”,对低熵 block 进行 lossy 压缩(如 INT2 + 差分编码)或直接丢弃。
实操步骤:
- 方案选择:
- 学术前沿:KVQuant(ICML'24)支持 entropy-aware compression;
- 生产可用:vLLM 的 sliding window attention(伪压缩):只保留最近 N tokens 的 KV,丢弃更早的;
- vLLM 滑动窗口配置:
python -m vllm.entrypoints.api_server \ --model meta-llama/Llama-2-7b-chat-hf \ --enable-prefix-caching \ --sliding-window 4096 \ # 只缓存最近 4096 tokens --block-size 16- 自研压缩(需 kernel 开发):
- 对每个 KV block 计算 attention score variance;
- variance < threshold 的 block,用 INT2 编码(需自定义 CUDA kernel);
- threshold 设为 0.03(实测平衡精度与压缩率)。
收益与代价:
- 设置
sliding-window=4096:显存占用降 32%,PPL +0.9,首 token 延迟 +3ms; - 自研 INT2 压缩:显存降 58%,PPL +2.1,需业务方确认可接受。
实测案例:某法律合同审查服务,用户输入固定为“合同原文+问题”,prefix 高度重复。启用 sliding window=2048 后,显存从 15.6GB 降至 10.2GB,且因丢弃无关历史,生成质量反而提升(减少幻觉)。
避坑指南:
- ❌ 不要用于对话场景(如 Chatbot),丢弃历史会导致上下文断裂;
- ❌ 不要设 window 太小(<1024),早期 prompt 信息丢失严重;
- ✅ 对“单轮问答”类业务(搜索、摘要、翻译),这是性价比最高的显存优化。
3.5 策略 5:Speculative Decoding —— 用“猜”来加速的并行艺术
核心原理:传统 decode 是串行的:生成 token t,再算 t+1。Speculative Decoding 让一个小模型(draft model)并行“猜测”接下来 k 个 tokens,大模型(target model)一次性验证整段猜测。若全部正确,一步生成 k 个 token;若某处错误,回退重算。本质是用计算冗余换时间。
实操步骤:
- Draft Model 选型:
- 最佳实践:用同架构小模型(如 LLaMA-2-1.5B 当 7B 的 draft);
- 快速方案:用 distill 版本(如 TinyLlama);
- vLLM 部署(需 target + draft 两个模型):
python -m vllm.entrypoints.api_server \ --model meta-llama/Llama-2-7b-chat-hf \ # target --speculative-model ./tinyllama-1.1b \ # draft --num-speculative-tokens 5 \ # 猜 5 个 --speculative-disable-by-distance \ # 距离太远时禁用- 关键参数:
num-speculative-tokens:建议 3~6。>6 时 draft 错误率飙升,重算开销反超;--speculative-disable-by-distance:当 draft 与 target 的 logits 差距过大时自动禁用,防雪崩。
收益计算:
- draft 准确率 72%(实测 TinyLlama→LLaMA-2-7B),平均加速比 = 1 + 0.72×5 = 4.6x;
- 实测吞吐:从 14.2 → 52.3 tokens/s(+268%),P95 延迟降 58%。
注意:Speculative Decoding 对 draft model 质量极度敏感。我们试过用随机初始化的小模型,准确率仅 21%,结果吞吐反降 12%。务必用真实数据 finetune draft model。
避坑指南:
- ❌ 不要用于 low-resource draft(<1B 参数),准确率太低;
- ❌ 不要设
num-speculative-tokens>8,边际收益为负; - ✅ 对长文本生成(>1024 tokens),收益最大,因串行瓶颈最明显。
3.6 策略 6:Semantic Caching —— 把“人话”变成可复用的“向量指纹”
核心原理:传统缓存 key 是原始 prompt 字符串,极难命中(标点、空格、同义词微调即 miss)。Semantic Caching 将 prompt 编码为 embedding 向量,在向量库中查相似 prompt,命中则返回缓存结果。关键是“语义”而非“字面”。
实操步骤:
- Embedding 模型选择:
- 通用:
text-embedding-3-small(OpenAI),latency 120ms; - 自研:用
bge-small-zh-v1.5(中文优),latency 45ms;
- 通用:
- 缓存架构:
- Redis + FAISS:FAISS 做近邻搜索,Redis 存结果;
- Key 设计:
cache:{model_name}:{hash(embedding)};
- 命中逻辑:
- 计算 query embedding 与 top-3 cache candidates 的 cosine similarity;
- similarity > 0.85 且 result confidence > 0.9 才返回。
实操参数:
- 向量维度:384(bge-small);
- FAISS index:IVF1024,Flat(1024 个聚类中心);
- 缓存 TTL:24 小时(业务数据更新不频繁)。
实测数据:某电商商品描述生成服务,prompt 重复率仅 0.3%,但语义相似率 22%。启用 semantic cache 后,缓存命中率 18.7%,P95 延迟降 31%,单位 token 成本降 14%。
避坑指南:
- ❌ 不要用于高动态数据(如实时股价查询),embedding 过期快;
- ❌ 不要设 similarity 阈值 <0.8,误命中导致结果错乱;
- ✅ 对“模板化 prompt”场景(如“把以下内容翻译成英文”),效果拔群。
3.7 策略 7:Request Merging with Semantic Grouping —— 让“不同用户”共享一个 batch
核心原理:传统 dynamic batching 按到达时间合并请求,但用户 A 的“写周报”和用户 B 的“写邮件”语义迥异,合并后 attention mask 复杂,计算效率低。Semantic Grouping 先用轻量 classifier(如 DistilBERT)将请求聚类,同类 prompt 合并进同一 batch,减少 mask 计算开销。
实操步骤:
- 聚类模型训练:
- 数据:10 万条历史 prompt,人工标注 8 类(摘要、翻译、编程、创作等);
- 模型:DistilBERT + Linear head,微调 2 小时;
- 在线服务流程:
- 请求到达 → Embedding → Classifier → 分配到对应 batch queue;
- 每个 queue 独立触发 dynamic batching;
- vLLM 集成:需修改
Scheduler模块,按request.category分发。
收益:
- 同类 batch 的 attention mask 90% 相同,kernel 计算效率提升 22%;
- 某客服场景,batch 利用率从 41% → 89%,QPS 翻倍。
注意:Classifier 延迟必须 <5ms,否则拖累整体。我们用 TensorRT 加速 DistilBERT,P99=3.2ms。
避坑指南:
- ❌ 不要用于类别极多的场景(>50 类),classifier 准确率暴跌;
- ❌ 不要省略“fallback queue”,未分类请求必须有兜底;
- ✅ 对 B2B SaaS(客户使用固定功能模块),聚类效果最好。
3.8 策略 8:Adaptive Batch Sizing —— 让 batch size 随“路况”实时变
核心原理:固定 batch_size 是最大浪费源。高峰时 batch_size=8 吃不满 GPU,低谷时 batch_size=32 导致 OOM。Adaptive Batch Sizing 根据实时 GPU 利用率、显存剩余、请求队列长度,动态调整 batch_size。
实操步骤:
- 监控指标:
nvidia-smi dmon -s u -d 1:每秒采集 GPU util、mem_used;- 请求队列长度(Prometheus metrics);
- 控制算法(PID 控制器):
- 设定目标:GPU util=75%,mem_used<85%;
- 每 5 秒计算 error = (target - current),调整 batch_size;
- vLLM 集成:修改
Scheduler.step(),注入动态 batch_size。
参数调优:
- Kp=0.8, Ki=0.02, Kd=0.1(实测稳定);
- batch_size 下限=2,上限=64。
实测:某新闻摘要 API,流量峰谷比 5:1。自适应后,GPU util 波动从 30%~95% 压缩到 68%~78%,单位 token 成本降 19%。
避坑指南:
- ❌ 不要用于 latency 敏感场景(如实时语音转写),控制环路引入抖动;
- ❌ 不要设 Kp 过大,会导致 batch_size 频繁震荡;
- ✅ 对 Web API 这类流量可预测的场景,收益明确。
3.9 策略 9:Model Offloading for Long Context —— 把“冷数据”塞进 CPU
核心原理:长 context(>32K)时,KV Cache 显存爆炸。Offloading 将“冷 KV”(如早期 tokens)移到 CPU 内存,需要时再拷贝回 GPU。关键是智能识别“冷热”——用访问频率 + attention score 衰减建模。
实操步骤:
- 框架选择:
- DeepSpeed-Inference:成熟,支持 ZeRO-Inference;
- vLLM 的
--cpu-offload-gb:简单粗暴;
- DeepSpeed 配置(
ds_config.json):
{ "zero_optimization": { "stage": 3, "offload_optimizer": {"device": "cpu"}, "offload_param": {"device": "cpu"} }, "fp16": {"enabled": true}, "memory_efficient_attention": true }- 关键参数:
offload_param.device="cpu":权重卸载;offload_optimizer.device="cpu":优化器状态卸载(训练用,推理可关)。
收益与代价:
- 64K context 的 13B 模型,显存从 42GB → 18GB;
- 延迟增加 15%(PCIe 带宽瓶颈)。
注意:CPU offload 本质是用延迟换显存。我们只对 <10 QPS 的长文本分析服务启用,对高并发 API 坚决不用。
避坑指南:
- ❌ 不要用于高 QPS 场景,PCIe 成为瓶颈;
- ❌ 不要和 PagedAttention 混用,vLLM 不支持;
- ✅ 对“低频、长文本、高价值”场景(如法律尽调),是唯一解。
3.10 策略 10:Hardware-Aware Kernel Fusion —— 把 7 个 kernel 压成 1 个
核心原理:LLM 推理 kernel 多(matmul→RMSNorm→SiLU→matmul→softmax→matmul),每个 kernel 启动、数据搬运都有开销。Kernel Fusion 将多个 ops 合并成单个 CUDA kernel,减少 global memory 访问次数。
实操步骤:
- 工具链:
- Triton:手写 fusion kernel,灵活但门槛高;
- TensorRT-LLM:自动 fusion,支持 LLaMA、Qwen;
- TensorRT-LLM 编译:
trtllm-build \ --checkpoint_dir ./llama2-7b-hf \ --output_dir ./llama2-7b-trt \ --gpt_attention_plugin float16 \ --gemm_plugin float16 \ --max_batch_size 128 \ --max_input_len 1024 \ --max_output_len 1024- 关键收益:
- 减少 60% global memory 访问;
- 7B 模型吞吐从 28.7 → 41.3 tokens/s(+44%)。
实测:TensorRT-LLM 对 70B 模型收益更大(+72%),因大模型 memory-bound 更严重。
避坑指南:
- ❌ 不要用于需要频繁更新的模型,TRT 编译耗时 15~30 分钟;
- ❌ 不要设
max_input_len过小,否则 runtime resize 开销大; - ✅ 对稳定模型、高吞吐场景,闭源方案(TRT)仍是王者。
4. 实战组合拳:一个真实项目的成本优化全记录
4.1 项目背景:跨境电商客服问答引擎
- 业务:支持 12 国语言,用户上传商品图片+文字描述,AI 生成客服回复;
- 现状:
- 模型:Qwen2-7B(多语言微调版);
- 硬件:4×A10(48GB VRAM);
- 日均请求:240 万;
- 平均 cost:$0.0021/token;
- P95 延迟:2.8s(超标,SLA 要求 <1.5s)。
4.2 优化路径与决策树
我们没一上来就堆策略,而是按“成本漏斗”逐层诊断:
- L1 层:A10 是合理选择(性价比高于 A100),不换;
- L2 层:
nvidia-smi dmon显示 GPU util 仅 38