4、vLLM核心配置:模型加载参数、调度参数与采样参数
说实话,vLLM 的配置项看着挺多,但真正核心的就三大块:模型怎么加载进来、请求怎么调度、输出怎么生成。我刚开始接触 vLLM 时,也在这堆参数里绕了好一阵子。今天咱们就把这三类参数掰开揉碎了讲清楚。
4.1 模型加载参数:让模型稳稳跑起来
模型加载参数,说白了就是告诉 vLLM:「你要服务的模型长什么样,需要多少资源」。这里我重点讲三个最关键的。
4.1.1 dtype:精度与显存的博弈
dtype 控制模型权重的数据类型。常见的选项有 auto、float16、bfloat16、float32。
- float32:精度最高,但显存占用也最大。我一般只在调试时用,生产环境基本不考虑。
- float16:显存减半,速度提升。大部分 GPU 都支持,兼容性好。
- bfloat16:和 float16 显存一样,但动态范围更大。A100、H100 这类卡上我强烈推荐。
- auto:让 vLLM 自动选择。它会根据模型配置和硬件能力做决定,省心但不够灵活。
bfloat16 几乎是必选项。我曾经在 A100 上试过 float16 跑 70B 模型,结果 loss 一直降不下去,换成 bfloat16 就好了。原因就是 float16 的精度范围不够,梯度容易溢出。
4.1.2 tensor-parallel-size:多卡并行,效率翻倍
tensor-parallel-size 控制张量并行的卡数。简单说,就是把一个模型切成几块,每块放在一张卡上,大家一起算。
举个例子:--tensor-parallel-size 4 表示用 4 张 GPU 来跑同一个模型。每张卡只负责一部分计算,通过高速通信(NVLink、InfiniBand)交换中间结果。
嗯,这里要注意:不是卡越多越好。我见过有人把 8 张卡全用上跑一个小模型,结果通信开销比计算时间还长,反而更慢了。一般建议:模型参数量 / 单卡显存 > 2 时,才考虑用张量并行。
4.1.3 max-model-len:给模型定个「最长句子」
max-model-len 控制模型能处理的最大序列长度(包括输入和输出)。这个参数直接影响显存占用。
为什么?因为 Transformer 的显存占用和序列长度是二次方关系。长度翻倍,显存占用可能翻 4 倍。
我个人习惯:max-model-len 设成模型原生支持长度的 80%。比如模型支持 4096,我就设 3272,留点余量给 KV Cache。
4.2 调度参数:让请求排队更高效
调度参数决定了 vLLM 怎么安排进来的请求。你想想看,如果同时来了 100 个请求,是先处理谁?一次处理几个?这些都由调度参数说了算。
4.2.1 max-num-seqs:一次最多处理几个请求
max-num-seqs 控制 vLLM 一次迭代(iteration)中最多处理多少个序列(sequence)。注意,一个请求可能包含多个序列(比如 beam search)。
这个值设大了,吞吐量上去了,但每个请求的延迟也会增加。设小了,延迟低,但 GPU 利用率可能上不去。
| 场景 | 推荐值 | 说明 |
|---|---|---|
| 低延迟场景(聊天) | 64-128 | 优先保证响应速度 |
| 高吞吐场景(批量推理) | 256-512 | 最大化 GPU 利用率 |
| 大模型(70B+) | 32-64 | 显存有限,不宜设太大 |
我在项目中遇到过:把 max-num-seqs 从 128 调到 256,吞吐量提升了 40%,但 P99 延迟从 200ms 涨到了 500ms。所以这个参数没有标准答案,得根据你的业务场景来调。
4.2.2 gpu-memory-utilization:给模型留多少显存
gpu-memory-utilization 控制 vLLM 能使用 GPU 显存的比例。取值范围 0 到 1,默认 0.9。
为什么不是 1.0?因为 GPU 上还要跑其他进程(比如监控、日志),而且显存碎片化问题也会导致实际可用空间小于理论值。
说白了,这个参数就是给显存使用加个「安全阀」。我曾经在 40G 的 A100 上设 0.98,结果跑了一个小时就 OOM 了,因为显存碎片导致实际可用空间只有 38G。从那以后,我再也不敢设超过 0.95 了。
4.3 采样参数:控制模型「怎么说话」
采样参数决定了模型生成文本时的「性格」。同样的输入,不同的采样参数,输出可能天差地别。
4.3.1 temperature:控制输出的「随机性」
temperature 控制概率分布的「尖锐程度」。取值范围 0 到无穷大,但常用范围是 0.1 到 2.0。
- temperature = 0:完全确定,每次都选概率最高的 token。适合翻译、摘要等确定性任务。
- temperature 接近 0(如 0.1):几乎确定,但偶尔有点小变化。适合代码生成。
- temperature = 1.0:原始概率分布,不做任何调整。这是默认值。
- temperature > 1.0:概率分布变平,低概率 token 也有机会被选中。适合创意写作。
我个人习惯:写代码时设 0.1,写文案时设 0.8,写诗时设 1.2。你想想看,如果写代码时 temperature 太高,模型可能给你生成一个不存在的 API,那调试起来就痛苦了。
4.3.2 top-p:用「累积概率」做截断
top-p(也叫 nucleus sampling)控制从累积概率达到 p 的最小 token 集合中采样。取值范围 0 到 1。
举个例子:设 top-p = 0.9,表示只从累积概率达到 90% 的那些 token 中选。这样既保留了多样性,又排除了那些概率极低的「垃圾 token」。
为什么需要 top-p?因为 temperature 单独使用时有个问题:它会把所有 token 的概率都放大或缩小,包括那些明显不合理的 token。而 top-p 直接砍掉低概率 token,更「聪明」一些。
4.4 知识体系总览
下面这张图把三类参数的关系梳理清楚了。你可以把它当作配置时的「导航图」。
这张图把三类参数的核心逻辑都串起来了。你配置的时候,可以按这个顺序来:先搞定模型加载参数(让模型跑起来),再调调度参数(优化性能),最后调采样参数(控制输出质量)。
好了,关于 vLLM 的核心配置就讲到这里。这些参数我每个都在生产环境里调过无数遍,踩过的坑也都写在里面了。你配置的时候如果遇到问题,回头看看这些经验,应该能帮你省不少时间。