vLLM 是一个高效的大模型推理框架,专为优化显存利用和高吞吐量设计。以下是从多个角度进行推理调优的关键方法,帮助你在速度、显存占用和并发能力之间找到平衡:
1. 模型参数优化
-
Batch Size 调整
- 增大
max_num_batched_tokens:提升吞吐量(适合离线批量推理),但可能增加延迟。 - 减小
max_num_seqs:降低显存占用,但可能限制并发。
llm = LLM(model="meta-llama/Llama-2-7b-chat-hf", max_num_batched_tokens=4096, # 增大批次token上限 max_num_seqs=256) # 限制并发请求数 - 增大
-
解码策略选择
- 贪心解码(Greedy):速度最快,适合实时交互。
- Beam Search:质量更高但显存占用大,通过
beam_width控制计算量。
outputs = llm.generate(prompts, use_beam_search=True, beam_width=4) # 平衡质量与速度
2. PagedAttention 优化
- 块大小(Block Size)
- 调整
block_size减少内存碎片(默认16),例如设为32可能提升长文本性能。
llm = LLM(..., block_size=32) - 调整
- 工作空间预分配
- 通过
gpu_memory_utilization预分配显存(默认0.9),接近1可能引发OOM需谨慎。
llm = LLM(..., gpu_memory_utilization=0.95) - 通过
3. 动态批处理与并发
- 开启 Continuous Batching
llm = LLM(..., enable_continuous_batching=True) - 调整并发参数
max_parallel_loading_workers: 增加模型加载并行度(需足够CPU资源)。
4. 硬件相关优化
- 量化压缩
llm = LLM(..., quantization="awq") # 或 "gptq" - 混合精度推理
llm = LLM(..., dtype="bfloat16") # A100/V100等支持加速 - 张量并行(多GPU)
llm = LLM(..., tensor_parallel_size=4) # 4卡并行
5. 系统级优化
- CUDA配置
export CUDA_VISIBLE_DEVICES=0,1 # 指定GPU 0,1 表示当前进程只能使用系统中的 第 0 号和第 1 号 GPU。 #这里的 0 和 1 是 GPU 的逻辑编号,由系统(如 NVIDIA 驱动)分配。 export PYTORCH_CUDA_ALLOC_CONF=max_split_size_mb:128 # 减少显存碎片 - 异步推理模式
outputs = await llm.generate_async(prompts) # 异步非阻塞
6. 高级技巧
- 预热模型
llm.generate(["warmup"], max_tokens=10) # 触发内核初始化 - 自定义内核
从源码编译安装,启用特定优化(如FlashAttention-2)。 - 模型剪枝
结合LoRA等轻量化技术减少参数量。
7. 性能评估工具
- 内置监控
print(llm.llm_engine.stat_logger) # 查看吞吐/延迟指标 - Profiler工具
使用Nsight Systems或PyTorch Profiler分析CUDA内核。
调优注意事项
- 权衡指标:吞吐量 vs 延迟 vs 显存,根据场景选择。
- 渐进调整:每次修改一个参数,观察影响。
- 硬件匹配:量化需显卡支持(如AWQ仅限NVIDIA+Ampere+)。
- 日志分析:关注
vllm日志中的OOM警告或性能提示。
在 vLLM 中,所有与模型初始化配置相关的代码(如模型加载参数、显存优化、并行策略等)必须写在模型运行之前(即创建 LLM 对象时),而推理参数(如解码策略、生成长度等)则在调用 generate() 方法时指定。以下是具体位置说明:
1. 模型初始化配置(写在创建 LLM 对象时)
这些代码需要在加载模型时一次性配置,且必须在调用 generate() 之前完成。典型场景:
# ------------------------------
# 1. 初始化阶段的配置(模型运行前)
# ------------------------------
from vllm import LLM
# 所有初始化参数在此处设置
llm = LLM(
model="meta-llama/Llama-2-7b-chat-hf",
# 硬件/显存优化
dtype="bfloat16", # 混合精度
quantization="awq", # 量化(需提前转换模型)
tensor_parallel_size=2, # 多GPU并行
block_size=32, # PagedAttention块大小
gpu_memory_utilization=0.95, # 显存预分配
max_num_batched_tokens=4096, # 批次token上限
max_num_seqs=256, # 最大并发序列数
enable_continuous_batching=True, # 开启动态批处理
max_parallel_loading_workers=4 # 模型加载并行度
)
# 可选:预热模型(运行一次短推理)
_ = llm.generate("Warm up", sampling_params=...)
2. 推理参数配置(写在调用 generate() 时)
这些参数在每次推理请求时动态指定,用于控制单次生成行为:
# ------------------------------
# 2. 推理阶段的配置(模型运行中)
# ------------------------------
from vllm import SamplingParams
# 定义生成参数(每个请求可独立配置)
sampling_params = SamplingParams(
temperature=0.7,
top_p=0.9,
max_tokens=512,
use_beam_search=True, # 选择解码策略
beam_width=4 # Beam Search宽度
)
# 执行推理(传入参数)
outputs = llm.generate(
prompts=["Hello, how are you?", "Explain quantum computing."],
sampling_params=sampling_params # 此处指定解码策略
)
3. 特殊配置(写在脚本最顶层)
部分系统级配置(如环境变量)需在整个 Python 进程启动时设置,通常放在文件最顶部:
# ------------------------------
# 0. 系统级配置(脚本最开头)
# ------------------------------
import os
os.environ["CUDA_VISIBLE_DEVICES"] = "0,1" # 指定GPU
os.environ["PYTORCH_CUDA_ALLOC_CONF"] = "max_split_size_mb:128" # 显存优化
# 然后才是模型初始化和推理代码
关键区别总结
| 配置类型 | 代码位置 | 典型参数 |
|---|---|---|
| 系统级配置 | 脚本最开头(import 之后) | CUDA_VISIBLE_DEVICES、环境变量 |
| 模型初始化参数 | 创建 LLM(...) 对象时 | dtype, quantization, block_size |
| 动态推理参数 | generate(prompts, sampling_params) | use_beam_search, temperature |
| 异步调用 | 在异步函数中使用 await | await llm.generate_async(...) |
常见错误示例
# ❌ 错误:初始化后无法修改量化等参数
llm = LLM(model="llama2-7b")
llm.quantization = "awq" # 不会生效!
# ❌ 错误:环境变量写在模型初始化之后
llm = LLM(...)
os.environ["CUDA_VISIBLE_DEVICES"] = "0" # 已经太晚!
最佳实践
- 将所有模型初始化参数封装在一个配置字典中,确保代码可维护性:
model_config = { "model": "meta-llama/Llama-2-7b-chat-hf", "dtype": "bfloat16", "block_size": 32, "gpu_memory_utilization": 0.95 } llm = LLM(**model_config) - 对不同的业务场景(如高吞吐 vs 低延迟),分别定义不同的
SamplingParams模板。

2万+

被折叠的 条评论
为什么被折叠?



