Vllm Basic
导言
HW24年狠抓了训练,但是推理性能稍微落下,dsv3的出现,强化学习的爆火,反过来对推理性能提出了很高的要求。为此高性能的vllm推理框架变成了hw首先适配的目标。
- 一方面我需要大致了解vllm框架的设计,
- 另一方面,我主要需要关注vllm-ascend实现了哪些接口。
vllm¶
vLLM 是一个 LLM (Large Lanuage Model) 推理和部署服务库
基本特点¶
- iterative-level schedule1
- (常被称为 continuous batching,该调度算法在 Orca2 中首次被提出)
- (iterative-level schedule)以单轮迭代的方式对用户的请求进行处理,即 LLM 生成一个 token 后会重新调度下一轮要处理的请求。
- PagedAttention 注意力算法以提高服务的吞吐量。
- (PagedAttention)受操作系统虚拟内存和分页思想启发,将原本连续的 KV cache 存储在不连续的空间,以避免 KV cache 带来的显存浪费。
特点:动态批处理¶
vLLM 作为大模型推理框架,主要通过动态调度机制管理 batch_size,虽然不提供直接设置静态 batch_size 的参数,但提供了多种间接控制 batch 行为的选项和优化策略。以下是具体实现方式及相关控制方法:
一、显式控制方式¶
- 显存利用率参数(
gpu_memory_utilization)
在启动 API 服务时,通过 --gpu-memory-utilization 指定 GPU 显存利用率(默认 0.9),间接控制最大并发 batch_size。显存利用率越高,系统可动态调度的 batch_size 上限越大。
- 模型加载配置
通过量化模型(如加载 AWQ 量化模型)减少显存占用,从而提升单次可处理的 batch_size。例如:
二、隐式优化策略¶
- 动态批处理(Continuous Batching) vLLM 的核心特性之一,自动合并请求并动态调整 batch_size。例如:
- 离线批处理模式:用户提交一组 prompts 后,vLLM 根据显存和序列长度动态拆分或合并批次。
- 在线服务模式:请求进入等待队列,系统根据实时资源占用情况将队列中的请求分批处理,无需用户干预。
- KV 缓存管理(PagedAttention) 通过分页显存管理技术,支持更长的序列和更大的 batch_size。用户可通过限制
max_tokens参数控制单条序列的最大长度,间接影响 batch_size 上限。
三、高级参数调优¶
-
请求并发限制(
max_num_seqs)
在 API 服务中通过--max-num-seqs限制同时处理的请求数,避免单次 batch_size 过大导致显存溢出。 -
生成长度控制(
max_tokens)
限制生成文本的最大 token 数(如max_tokens=100),减少单条请求的显存占用,从而允许更大的 batch_size。 -
实验调优公式
根据显存容量估算最大可行 batch_size:
建议预留 20-30% 显存作为缓冲区。
四、实际应用建议¶
- 高吞吐场景:优先选择 7B 级别模型(如 Mistral-7B),并设置
gpu_memory_utilization=0.95以最大化 batch_size。 - 长序列场景:启用 AWQ 量化,结合
max_tokens限制生成长度。 - 稳定性优先:通过
nvidia-smi监控显存占用,动态调整并发请求量。
通过上述方法,用户可以在 vLLM 中间接控制 batch_size 的调度边界,实现效率与资源的平衡。如需深入细节,可参考 vLLM 官方文档 或源码调度逻辑解析。
架构¶
确定性问题:批次不变性¶
- 问题:vllm推理如果温度设置成0,还是会出现推理出不同结果的情况。
- 原因: 在线推理推理时,会组成不同的batch组,batch大小不同,导致经过RMSNorm、矩阵乘法和注意力三个关键算子时,算子内部会自动切分,并采用不同的规约策略;这会导致出现精度问题(浮点数大数吞小数)
- 解决方案: CUDA重新三个算子,使其满足batch不变性。4
- 效果:损失了50%性能(没优化),但是保证推理稳定输出
- 具体实验:
- 采样了 1000 次完成结果,每次生成 1000 个 token。
- 没修改前:得到了 80 个不同的完成结果,其中最常见的一个出现了 78 次。前 102 个 token 相同,103开始不同。
- 修改后:1000次完全相同
- 额外影响:
vllm-ascend¶
通过VizTrace可以很简单的看出其实现。
- ModelRunner里注册npu代码
- todo
