大模型推理服务部署:vLLM批量推理与KV Cache内存管理
大模型推理服务在生产环境中面临的核心挑战是GPU显存利用率和请求吞吐量。vLLM框架通过PagedAttention机制管理KV Cache内存,将显存利用率从传统方案的40%-60%提升到90%以上。本文围绕vLLM部署实践,分析批量推理配置、KV Cache调优和并发参数设置。
为什么传统推理方式的显存利用率低
HuggingFace Transformers默认采用连续内存分配策略。每个请求预分配固定大小的KV Cache空间,实际请求长度远小于预分配值时,大量显存被浪费。以Llama-2-13B模型为例,batch_size=8时,KV Cache预分配约12GB显存,但平均利用率仅35%。
vLLM的PagedAttention将KV Cache切分为固定大小的block(通常每block存储16个token的KV数据),按需分配。短请求只占用少量block,长请求动态扩展,整体显存碎片率低于4%。
vLLM部署配置实操
安装vLLM并启动OpenAI兼容API服务:
# 安装vLLM(需CUDA 11.8+)
pip install vllm
# 启动推理服务,指定模型路径
python -m vllm.entrypoints.openai.api_server \
--model /models/llama-2-13b-chat-hf \
--tensor-parallel-size 2 \
--gpu-memory-utilization 0.90 \
--max-model-len 4096 \
--enforce-eager \
--port 8000
关键参数说明:
--tensor-parallel-size 2:跨2张GPU做张量并行,13B模型单卡放不下时必须配置--gpu-memory-utilization 0.90:vLLM可用显存占总显存比例,留10%给PyTorch CUDA context--max-model-len 4096:单次推理最大token数,直接影响KV Cache预分配量--enforce-eager:禁用CUDA Graph,调试阶段使用;生产环境去掉此参数可获得20%-30%吞吐提升
批量推理吞吐量调优
vLLM的连续批处理(Continuous Batching)允许新请求在旧请求生成过程中动态加入batch。通过调整以下参数控制批处理行为:
from vllm import LLM, SamplingParams
llm = LLM(
model="/models/llama-2-13b-chat-hf",
tensor_parallel_size=2,
gpu_memory_utilization=0.90,
max_model_len=4096,
max_num_seqs=256, # 最大并发序列数
max_num_batched_tokens=8192, # 单batch最大token数
swap_space=4, # CPU swap空间(GB)
)
sampling_params = SamplingParams(
temperature=0.7,
top_p=0.9,
max_tokens=512,
)
# 批量推理
prompts = ["请分析这段代码的性能瓶颈..." for _ in range(100)]
outputs = llm.generate(prompts, sampling_params)
max_num_seqs控制同时处理的请求数量。A100 80GB上部署13B模型,设为256时吞吐量约为2800 tokens/s;设为64时降至1200 tokens/s。但并非越大越好——超过GPU显存承载能力后,PagedAttention的block swap频率上升,反而导致吞吐下降。
KV Cache内存诊断方法
当推理服务出现OOM或吞吐异常时,通过vLLM的监控接口诊断KV Cache状态:
import requests
# 获取KV Cache使用情况
resp = requests.get("http://localhost:8000/metrics")
for line in resp.text.split("\n"):
if "vllm" in line and not line.startswith("#"):
print(line)
核心监控指标:
vllm:num_gpu_blocks:GPU上可用block总数vllm:num_cpu_blocks:CPU swap区block数vllm:gpu_cache_usage_perc:GPU KV Cache使用率,持续高于95%说明显存不足vllm:cache_config_info:block大小和总数配置
当gpu_cache_usage_perc持续高于95%,意味着大部分KV Cache block被占用,新请求需要等待swap或preempt。此时有两种处理路径:降低max_num_seqs减少并发量,或降低max_model_len减少单请求KV Cache占用。
量化部署降低显存占用
AWQ量化可将13B模型显存占用从26GB降至约8GB,使得单张A100即可部署:
python -m vllm.entrypoints.openai.api_server \
--model /models/llama-2-13b-chat-awq \
--quantization awq \
--dtype float16 \
--gpu-memory-utilization 0.85 \
--max-model-len 4096
AWQ量化后推理延迟增加约5%-8%,但吞吐量因batch size增大反而提升。实测13B AWQ模型在A100上batch_size=32时吞吐量为3100 tokens/s,而FP16 batch_size=8时为2800 tokens/s。
生产环境部署检查清单
上线前需确认以下配置项:
max_model_len是否覆盖业务最长输入+输出场景,留20%余量gpu_memory_utilization不超过0.95,防止CUDA context OOM- 启用
--disable-log-requests减少日志I/O对吞吐的影响 - 配置
--swap-space至少4GB,作为显存不足时的缓冲 - Nginx或Envoy前置负载均衡,设置upstream超时为
max_model_len / tokens_per_second * 1.5
以上配置在2×A100 80GB环境中实测,13B模型QPS稳定在45-50,P99延迟1.2秒(输入512 tokens,输出256 tokens场景)。实际部署需根据业务QPS和延迟SLA调整max_num_seqs和max_num_batched_tokens的平衡点。
原创文章,作者:小编,如若转载,请注明出处:https://www.yunthe.com/da-mo-xing-tui-li-fu-wu-bu-shu-vllm-pi-liang-tui-li-yu/