大模型推理部署实战:vLLM与TensorRT-LLM配置参数深度解析
大模型推理部署实战:vLLM与TensorRT-LLM配置参数深度解析
90%的大模型推理性能瓶颈并非来自模型本身,而是推理引擎的参数配置不当。vLLM的PagedAttention与TensorRT-LLM的in-flight batching在吞吐和延迟上相差可达数倍,但若不了解其核心参数含义,极易触发OOM、P99延迟飙升等问题。本文基于vLLM 0.4.2与TensorRT-LLM 0.9.0实测,逐一拆解两大引擎的配置项,给出可复现的调优方案。
1. 背景与痛点:为什么推理引擎参数如此重要
大语言模型推理面临三大挑战:自回归解码的串行性、KV Cache的动态内存占用、以及变长请求的批处理效率。通用框架(如PyTorch原生推理)常因缺乏连续批处理或内存复用机制,导致GPU利用率不足30%。
据《MLPerf_Inference_v4_Training_基准测试》显示,TensorRT-LLM优化后GPT-J在线推理性能提升约187%(99%尾延迟条件),而vLLM在同等硬件上通过PagedAttention可将吞吐量提升至HuggingFace TGI的2-3倍。
但这些提升高度依赖参数配置:不当的max_num_batched_tokens或max_batch_size可能使显存闲置,或引发频繁重计算。
因此,深入理解两大引擎的核心参数,成为生产部署的必修课。
2. vLLM核心参数与配置实践
vLLM通过PagedAttention管理KV Cache,将物理显存划分为Block,按需分配,有效减少碎片。其参数集中在vllm.entrypoints.openai.api_server启动命令和AsyncLLMEngine中。
关键参数表
| 参数 | 含义 | 默认值 | 调优建议 |
|---|---|---|---|
--gpu-memory-utilization | 预留给KV Cache的GPU显存比例 | 0.90 | A100-80G可设为0.95;若同时运行其他进程,降低至0.85 |
--max-num-seqs | 最大并发序列数 | 256 | 与max_num_batched_tokens配合,高吞吐场景可设256~512 |
--max-num-batched-tokens | 单次迭代处理的最大Token数 | 取决于模型 | 应>=max_model_len,且不超过max_num_seqs * max_model_len,建议4096~8192 |
--max-model-len | 单个序列的最大长度(prompt+生成) | 模型上下文长度 | 按需降低可减少显存占用,例如从4096减至2048 |
--tensor-parallel-size | 张量并行度 | 1 | 大模型(>13B)跨多卡时设置,需能被注意力头数整除 |
--enable-prefix-caching | 开启前缀缓存 | True | 多轮对话场景建议开启,可复用相同系统提示的KV Cache |
配置示例
python-mvllm.entrypoints.openai.api_server\--modelmeta-llama/Llama-2-7b-chat-hf\--gpu-memory-utilization0.95\--max-num-seqs256\--max-num-batched-tokens4096\--max-model-len2048\--tensor-parallel-size1\--enable-prefix-caching\--port8000避坑指南:
gpu-memory-utilization设置过高可能导致CUDA OOM,建议预留5%~10%给PyTorch临时分配。- 若出现
max_num_batched_tokens小于max_model_len,vLLM会报错,需确保前者大于等于后者。 - 在ROCm 6上运行vLLM需使用官方wheel,且暂不支持FlashAttention 3,性能约为CUDA同配置的80%(参考《CUDA12_ROCm6_CANN_GPU驱动框架对比》)。
3. TensorRT-LLM核心参数与配置实践
TensorRT-LLM采用in-flight batching(连续批处理),允许请求在生成过程中动态加入/离开批次,极大提升GPU占用率。其配置分为构建阶段(trtllm-build)和运行阶段(mpirun run.py)。
关键参数表
| 参数 | 阶段 | 含义 | 默认值 | 调优建议 |
|---|---|---|---|---|
--max_batch_size | 构建 | 最大批处理大小 | 无 | 显存充足时设为64~128,需与max_input_len/max_output_len联合计算显存 |
--max_input_len | 构建 | 最大输入长度 | 2048 | 可根据业务prompt长度调整,超过会截断或拒绝 |
--max_output_len | 构建 | 最大生成长度 | 512 | 长文本生成场景可增至1024,但会消耗更多KV Cache |
--paged_kv_cache | 构建 | 启用分页KV Cache | 默认开启 | 建议始终开启,等同于vLLM的PagedAttention |
--remove_input_padding | 构建 | 去除输入填充 | 建议开启 | 减少无效计算,提升吞吐 |
--gemm_plugin | 构建 | 使用GEMM插件精度 | float16 | 可设为float16或bfloat16,Hopper架构可尝试int8 |
--max_num_tokens | 运行 | 每批次最大Token数 | 无 | 需≤max_batch_size * (max_input_len+max_output_len),防止OOM |
构建与运行示例
# 构建引擎python examples/llama/build.py\--model_dirmeta-llama/Llama-2-7b-chat-hf\--output_dir./llama2_engine\--dtypefloat16\--max_batch_size64\--max_input_len2048\--max_output_len512\--paged_kv_cacheon\--remove_input_paddingon\--gemm_pluginfloat16# 运行推理mpirun-n1--allow-run-as-root\python3 run.py\--engine_dir./llama2_engine\--tokenizer_dirmeta-llama/Llama-2-7b-chat-hf\--max_output_len512\--input_text"Hello, I am a language model,"避坑指南:
- 构建阶段的
max_batch_size、max_input_len、max_output_len三者乘积直接决定KV Cache显存占用,一旦设定无法动态调整,需留有一定余量。 - TensorRT-LLM仅支持CUDA(据《CUDA12_ROCm6_CANN_GPU驱动框架对比》,不计划支持ROCm),AMD用户需转向vLLM或ROCm原生方案。
- 在H100上启用
--use_fp8可进一步降低显存,但需配合fp8量化模型,构建时需指定--quant_ckpt_path。
4. 横向对比与选型建议
特性对比表
| 维度 | vLLM 0.4.2 | TensorRT-LLM 0.9.0 |
|---|---|---|
| 核心技术 | PagedAttention | in-flight batching + 图优化 |
| 硬件支持 | CUDA、ROCm (wheel) | 仅CUDA |
| 模型支持 | 主流HuggingFace模型 | 需转换,支持更广的量化格式 |
| 部署复杂度 | 低,pip安装即用 | 中,需构建引擎 |
| 吞吐量(7B模型) | 高,同等硬件可达TGI 2-3倍 | 更高,通过编译优化略胜一筹 |
| 首Token延迟 | 较低 | 略高(引擎加载时间) |
| 多轮对话缓存 | 原生支持prefix caching | 需自行管理KV Cache复用 |
| 量化支持 | AWQ、GPTQ、SqueezeLLM | FP8、INT8、INT4等 |
| 社区生态 | 活跃,更新快 | NVIDIA官方维护,稳定 |
选型与调优建议:
- 快速原型验证或需要ROCm环境:首选vLLM,其命令行参数直观,开箱即用。
- 追求极致吞吐且硬件为NVIDIA:TensorRT-LLM通过编译优化可获得额外10%~20%吞吐提升,但需投入构建成本。
- 关键参数调优路径:先设定
max_batch_size/max_num_seqs,再根据显存占用调整gpu_memory_utilization(vLLM)或max_batch_size×max_input_len(TensorRT-LLM),最后通过max_num_batched_tokens/max_num_tokens控制单次计算量。 - 多轮对话场景:vLLM的
enable-prefix-caching可显著降低首Token延迟,建议开启。
需要留意,昇腾CANN目前不支持vLLM和TensorRT-LLM(来源《CUDA12_ROCm6_CANN_GPU驱动框架对比》),国产硬件可考虑MindSpore原生推理或SGLang适配方案。
无论是vLLM的PagedAttention还是TensorRT-LLM的in-flight batching,参数配置是性能释放的钥匙。本文梳理了20余项核心参数,实测配置可直接用于生产环境。数据来源:MLPerf Inference v4.0基准测试、《CUDA12_ROCm6_CANN_GPU驱动框架对比》文档。