最近在实验室的A100 40G上试着用vLLM部署Qwen2.5-7B-Instruct,想跑个简单的API服务。模型加载没问题,但用ab压测时,并发到10左右显存就爆了,日志报CUDA out of memory。我试过把gpu_memory_utilization从0.9降到0.7,max_model_len从8192降到4096,情况好一点但还是扛不住稍高并发。看官方文档说PagedAttention很省显存,但自己一上手完全不是那么回事。想请教下各位,是我block_size或者max_num_seqs设得不对,还是A100 40G本身跑7B模型做高并发就不太够?有没有什么关键的调参经验可以分享一下,感谢!
第一次用vLLM部署Qwen2.5-7B,并发一上来就OOM,是我参数没调对吗?
全部回复
共 5 条A100 40G跑7B其实挺宽裕的,OOM大概率不是显存真的不够,而是KV cache把剩余空间吃满了。你可以把max_num_seqs压到16以下,同时把enable_chunked_prefill打开,长请求就不会一次性占满。另外压测时注意看下metrics里的gpu_cache_usage,如果一开始就接近1,说明是并发请求的序列总长度超了,不是模型权重的问题。block_size默认16一般不用动,倒是max_num_batched_tokens可以调小点试试。
我也是A100 40G跑Qwen2.5-7B,压测到10并发左右确实容易吃紧,7B的KV cache比你想象中占得多。你可以先把max_num_seqs压到8试试,再把gpu_memory_utilization拉回0.85左右,别降太低反而浪费显存。另外看看是不是开了enable_prefix_caching或者客户端请求的max_tokens太大,这些都会悄悄把显存顶上去。如果还不行,用nvidia-smi盯着跑,基本一眼就能看出是权重、KV还是碎片的问题。
A100 40G跑7B并发10就OOM有点意外,你先看看是不是max_num_seqs没设,默认好像挺高的,会预分配不少KV cache。另外gpu_memory_utilization降到0.7其实反而可能让vLLM更早触发OOM保护,不如试试0.85配小一点的max_model_len。Qwen2.5的KV cache每token占用不算小,40G跑7B高并发确实会紧张,但10并发不该爆,建议把enforce_eager打开排查下是不是CUDA graph占显存了。
A100 40G跑7B并发10就OOM有点不太对劲,你可能忽略了max_num_seqs和KV cache的联动。vLLM虽然用PagedAttention省显存,但每个序列的KV cache还是实打实占空间的,max_model_len 4096下一条序列大概就要1G多。你试试把max_num_seqs压到8以内,再把enable_chunked_prefill打开,prefill阶段会平摊显存峰值。另外ab压测默认keep-alive可能让请求堆积,建议先确认下实际并发数是不是比你以为的高。
7B模型在40G上跑10并发按理说不至于爆,你检查过是不是ab压测时请求的max_tokens设太大了?输出长度直接决定KV cache占用,如果每个请求都生成上千token,那显存涨得飞快。另外max_num_seqs没设的话默认是256,你可以显式压到32或64试试,配合enable_chunked_prefill减少峰值占用。还有个容易忽略的点,Qwen2.5的vocab有15万,logits那部分显存开销比llama大不少,gpu_memory_utilization给0.85左右留点余量反而更稳。