这几天把Llama 3 7B量化后(AWQ 4bit)部署到一台A10(24G显存)上,用vLLM跑,并发8。显存占用才13G左右,但单token生成速度只有15-20 tokens/s,多轮对话时首token延迟能到3秒以上。我看网上别人说7B能跑到40-50 tokens/s,差距也太大了。
已经试过调整max_num_seqs、gpu_memory_utilization,也开了continuous batching,感觉提升不明显。是我哪里设置不对吗?还是说A10本身就这么弱?或者量化方式有问题?有没有大佬能指点下优化方向,或者分享一下你们的部署参数配置?谢谢!
部署7B大模型到生产环境,显存够用但推理速度慢得离谱,正常吗?
全部回复
共 29 条AWQ 4bit在A10上跑出这个速度其实不算太离谱,A10的FP16算力本来就只有125T左右,比4090差一大截,网上那些40-50 tokens/s多半是4090或者A100的数据。你可以先看看是不是max_model_len设太大了,KV cache占得多会拖慢调度;另外试试开enforce_eager=False确认CUDA graph真的生效了,这个对首token延迟影响挺明显的。还有个容易忽略的点是batch size,并发8不一定吃满,可以把max_num_seqs拉到16-32试试吞吐。
15-20 tokens/s 确实偏低了,A10跑AWQ 4bit的Llama 3 7B不该只有这个水平。你先看看是不是max_model_len设太大了,KV cache预留过多会拖慢调度;另外A10的FP16算力本来就一般,但也不至于这么惨。建议用vLLM的benchmark脚本压一下,把enforce_eager关掉走CUDA graph,吞吐一般能翻不少。还有种可能是你的请求太短,batch没吃满,并发8不等于每步都凑够8个序列。
A10跑7B AWQ这个速度确实偏慢了点,但也没到离谱的程度。你试试看是不是max_model_len设太大了,KV cache占多了会拖速度,另外enable_chunked_prefill开一下对首token延迟帮助挺明显的。15-20 tokens/s感觉像是没吃到batching的收益,并发8的时候可以看下vLLM日志里实际running的seq数是多少,有时候请求没排满。A10的算力大概就A100的三分之一左右,40-50 tokens/s那个数据多半是A100或者4090跑出来的,别太拿那个当基准。
A10跑7B AWQ到15-20 tokens/s确实偏慢,但也没到离谱的程度。你试试把dtype设成float16而不是auto,另外batch size开到16以上看看,A10的算力瓶颈主要在并发低的时候吃不满。首token延迟3秒多大概率是prefill阶段被max_model_len拖累了,如果实际对话没那么长就把这个值压到2048以内,提升会很直接。
你这个速度确实偏慢了,A10跑AWQ 4bit的7B不该这么拉。先确认下vLLM版本是不是太老,新版对A10的kernel优化差挺多,另外检查下是不是没开chunked prefill,长prompt时首token延迟会爆炸。还有你batch size才8,A10的算力其实需要更大并发才能喂饱,试试把max_num_seqs拉到32以上看看吞吐变化。
A10这速度确实偏慢,先看下是不是KV cache爆了导致频繁抢占,调低max_model_len试试。
15-20 tokens/s 在 A10 上跑 AWQ 4bit 的 7B,确实偏低了点,但也没到离谱的程度。A10 的算力大概就 3090 的七八成,显存带宽也一般,7B 模型想稳上 40+ 通常得是 4090 或者 A100 这个级别。你多轮对话首 token 延迟 3 秒,八成是 prefill 阶段被长上下文拖住了,并发 8 的话如果历史对话很长,KV cache 一涨 prefill 就特别慢。可以试试看把 max_model_len 调小一点,别让 vLLM 默认吃满,另外 enforce_eager 关掉、确认 CUDA graph 真的生效了。量化方式本身问题不大,AWQ 在 vLLM 上算成熟路线,但要注意你用的 kernel 版本,有些老版本的 AWQ 解码确实拉胯。gpu_memory_utilization 调到 0.9 左右留点余量给 KV cache,max_num_seqs 拉到 16 试试,有时候并发太低反而吃不满。还有个容易忽略的点是 batch size 和请求长度分布,如果都是短请求其实吞吐能上去,长上下文混着来就容易被拖。建议拿 vLLM 自带的 benchmark 脚本单独测一下纯 decode 速度,排除掉网络和框架开销再看。
A10跑7B AWQ这个速度确实偏慢,但也不算完全离谱,关键得看你的具体配置。15-20 tokens/s在并发8的情况下,如果每个请求都在同时生成,那总吞吐其实是120-160 tokens/s,这个数字放在A10上不算太差,但首token 3秒多确实有点问题。你检查过max_model_len吗?如果设得太大,比如8192甚至更高,KV cache会占掉大量显存,导致实际能用的batch size被压缩,vLLM的调度效率就下来了。还有个容易被忽略的点是enforce_eager,默认可能是开的,把它关掉让CUDA graph生效,小batch场景下提升挺明显的。另外A10的显存带宽只有600GB/s,比A100差了快三倍,7B模型在4bit下每token要读大约3.5G的权重,理论上限也就170 tokens/s左右,实际打对折很正常。建议你先用vLLM的benchmark脚本单独测一下单请求的极限速度,排除并发调度的干扰,再对比社区里A10的实测数据,心里就有数了。
A10跑7B AWQ这个速度确实偏慢了,正常来说15-20 tokens/s不太应该,40+才是比较合理的区间。你显存只用了13G说明KV cache还有很大空间,gpu_memory_utilization可以拉到0.9甚至0.92试试,让vLLM多分配一些给KV cache,并发8的时候这点很关键。首token延迟3秒多有点离谱,建议检查一下是不是enforce_eager没关,默认如果开了eager模式会慢不少,加上--enforce-eager false或者直接用CUDA graph能明显改善。另外max_num_seqs调到8其实偏保守,可以试着放到16-32,配合continuous batching吞吐会好很多。还有个容易忽略的点是A10的FP16算力本身就一般,如果你prompt比较长,prefill阶段会吃满算力,首token自然就慢。量化方式AWQ本身没问题,但可以对比下GPTQ或者FP8看哪个在你的workload下更顺。最后确认下vLLM版本,老版本调度器效率差挺多的,升到最新版说不定直接就有提升。