最近在尝试把一个7B的ChatGLM模型部署到公司一台T4(16G显存)服务器上,用vLLM加载fp16版本,理论显存占用不到15G,但实际推理时首token延迟要5秒多,生成速度只有不到5 token/s。试了调整batch size和max_num_seqs,效果不明显。是不是T4的带宽太拉了?或者需要上量化?但量化后效果会不会崩?有没有大佬分享下低成本优化推理速度的经验?先谢过了。
部署7B大模型到服务器,显存总够但推理速度慢得离谱,求助优化思路
全部回复
共 158 条T4的瓶颈基本就在显存带宽上,16G显存跑7B fp16其实已经挺极限了,首token慢很正常。我之前试过把max_model_len调低到2048,顺带把gpu_memory_utilization拉到0.92,速度能上来一点,但别指望质变。量化的话可以试试INT8或者GPTQ的4bit,7B模型掉点没那么夸张,尤其对话场景感知不强,但速度提升挺明显的。另外你vLLM版本更新到最新没?老版本对T4这种卡优化确实差一截。
T4这卡确实瓶颈在显存带宽上,fp16的7B模型权重读取一次就要吃掉差不多14GB,每秒只能读300多GB,算下来理论极限也就20多token/s,还得扣掉KV cache和中间激活的开销,实际能跑到5已经算正常水平了。你试batch size没改善也正常,因为单请求时计算量远小于显存读取量,带宽才是硬限制,堆并发反而可能因为显存带宽共享让每个请求更慢。
量化确实是最直接的提速手段,INT4或者INT8能把权重体积砍一半以上,带宽压力直接减半,速度翻倍不是梦。但要注意ChatGLM这类模型对激活值敏感,直接上AWQ或GPTQ的4bit可能会有明显的质量下降,建议你拿几个典型测试集跑一下困惑度,或者直接对比生成效果,如果只是内部demo用,损失一点精度换速度完全划算。
另外你还可以试试把max_model_len调小,比如限制到2048,这样KV cache占用少,留给batch的显存更多,vLLM的paged attention也能更高效利用碎片空间。还有个冷门思路,用FlashAttention-2或者xformers替换默认attention实现,能减少中间张量的显存读写,对T4这种老卡有时有奇效。
最后如果公司允许,可以考虑用llama.cpp的GGUF格式跑CPU+GPU混合推理,把部分层放到内存里,虽然速度不如全GPU,但能绕开T4的带宽瓶颈,而且量化精度控制比vLLM更灵活。要不你先试试INT8加限制上下文长度,大概率能拉到10 token/s以上,效果崩不崩跑一遍业务问答就知道了。
T4那个16G显存跑7B fp16确实紧巴,但你这速度瓶颈大概率卡在显存带宽上,T4只有320GB/s,跟A100差了快4倍,算力再猛也喂不饱。可以先试试4bit量化,像GPTQ或者AWQ,显存占用直接砍半,速度能明显上来,效果一般任务损失很小,不是特别吃精度的场景完全能接受。另外vLLM里把gpu_memory_utilization调到0.9以上,给KV cache多留点空间,有时候默认设置反而拖后腿。还有个小技巧,如果输入长度不长,可以把max_model_len设小点,减少显存碎片和调度开销,首token延迟会改善不少。
说实话T4这卡跑7B fp16,瓶颈还真不在显存,而是在它的显存带宽只有320GB/s左右,7B模型光权重就要吃14G,生成阶段每个token都得把所有权重过一遍,算下来理论极限也就20 token/s上下,你实测5不到说明还有别的开销。vLLM的continuous batching在低并发下收益有限,你先看看是不是没开flash attention,或者输入长度太长导致prefill阶段占了大头,首token 5秒多半是prefill没优化好。量化确实值得试,int8基本无损,int4对ChatGLM这种模型会有轻微掉点但速度能翻倍,而且显存占用降下来后可以开更大的max_num_seqs。另外建议你检查一下是不是用的默认greedy decoding,采样参数对速度也有影响,beam search别开。还有个容易被忽略的点,检查下是不是CPU和GPU之间数据传输卡了,比如tokenizer或post-processing在CPU上跑得慢,把transformers升级到最新版,有些算子会走trt优化。最后实在不行就换AWQ或GPTQ的4bit版本,配合vLLM的量化推理,T4上跑到15-20 token/s问题不大,效果崩不崩得看你任务场景,生成类任务其实感知不强。
T4确实瓶颈在显存带宽上,fp16的7B模型每生成一个token都要把全部权重过一遍,这卡带宽才300GB/s左右,算下来理论上限也就5 token/s,你这速度其实已经接近物理极限了。量化到int8或者int4能明显缓解,之前试过GPTQ的4bit版本,速度能翻一倍多,而且7B模型量化后效果损失没那么夸张,尤其对话场景基本感知不到。另外可以看看是不是vLLM的prefill阶段拖了首token,试试把max_model_len调小点,或者用AWQ量化配合vLLM的马拉车式调度,能再榨一点性能出来。
T4瓶颈就在显存带宽,fp16硬跑就这样,上4bit量化能快一倍多,效果崩不崩试了才知道。
T4的瓶颈确实主要在显存带宽上,fp16的7B模型理论算力需求不高,但每生成一个token都要把全部权重过一遍,带宽跟不上就是会卡在这儿。我试过把max_num_seqs调小到1,虽然吞吐降了但单请求延迟反而稳定些,你可以试试看。量化的话,INT8或者GPTQ的4bit对ChatGLM这种模型影响没那么大,特别是推理场景,我用了之后速度能快一倍左右,效果基本能接受,但建议先在验证集上跑几个case对比下。另外可以检查下vLLM的版本和CUDA配置,有时候默认的算子没针对性优化也会拉低速度。
T4瓶颈就在显存带宽,上INT8量化基本无损,速度至少翻倍,可以试试。
T4的显存带宽确实是瓶颈,16G显存跑7B fp16虽然装得下,但每token要读14G权重,280GB/s的带宽算下来理论也就20token/s,实际5token/s还得算上解码和内存开销。量化到int8或者4bit能明显改善,尤其4bit能翻两三倍速度,效果崩不崩得看任务,一般对话场景损失很小,代码和数学可能有点退化。另外vLLM里可以试试开--gpu-memory-utilization 0.95,把KV cache留大点,还有确认下是不是没开continuous batching,小batch时这俩影响挺大的。如果还嫌慢,上AWQ或GPTQ量化版Gradio服务,T4也能跑到15token/s左右。
T4瓶颈就是显存带宽,fp16硬跑7B确实吃力,建议直接上4bit量化,实测速度能翻倍。
量化用awq或gptq,效果崩不了多少,比现在慢吞吞强多了。
T4瓶颈就在显存带宽,试试GPTQ 4bit量化,速度能翻倍,效果损失基本可接受。
T4的显存带宽确实是大瓶颈,可以试试4bit量化,效果损失不大但速度能翻倍。
T4带宽确实拖后腿,试试8bit量化或AWQ,速度能翻倍,效果损失一般能接受。
T4的显存带宽确实是个瓶颈,16G看着够用但fp16的7B模型跑起来,权重读取就把带宽吃满了。我之前试过把max_model_len调低到2048,首token能快个30%左右,你可以先看看是不是上下文长度设太大导致KV cache开销。量化的话,int8或者GPTQ的4bit对ChatGLM影响不算大,尤其如果主要做短对话,效果崩不了多少。还有个思路是试试把模型切到多卡或者用CPU offload一部分层,虽然延迟可能更高,但至少能把吞吐提上去。另外检查下vLLM版本和CUDA环境,有时候是页面调度没开好,更新一下说不定有惊喜。
T4的瓶颈确实主要在显存带宽上,16G跑7B fp16虽然能塞下,但每生成一个token都要把全部权重过一遍,带宽不够就卡在这了。我之前在P100上试过类似情况,换GPTQ 4bit量化后速度能翻倍,效果损失其实不大,尤其chat场景下基本感知不到。你可以先试试awq或者gptq的4bit版本,显存占用还能降一半,留给KV cache的空间也多了,对长上下文帮助挺明显。另外检查下vLLM的版本和参数,有时候默认的preemption策略会拖慢速度,调低max_num_batched_tokens有时反而更稳。
说实话你这个情况太经典了,T4的瓶颈真不在显存容量,而是那块卡的内存带宽只有320GB/s,7B fp16的权重就得占14GB,推理时每个token都得把全部权重读一遍,算下来理论极限也就个位数token/s,所以你这5不到的速度其实已经接近硬件上限了,vLLM那套优化对这种卡帮助很有限。我建议你直接上INT4或者INT8量化,比如用GPTQ或者AWQ,显存占用能砍到6-7GB,带宽压力直接减半,速度翻倍不成问题,而且7B模型量化后效果崩不崩得看你任务,如果是对话或通用生成,感知差异真不大,基本不会明显变蠢。另外可以试试把max_model_len调低,比如限制到2048或者1024,这样KV cache占用能小很多,vLLM预分配显存时会更宽松,然后开一下--gpu-memory-utilization 0.95,把显存吃满。还有个野路子,如果你推理任务实时性要求不高,可以把并发压到1,然后开--enable-prefix-caching,让重复前缀的缓存命中,首token延迟能降不少。最后如果你能接受换框架,试试llama.cpp的flash attention版本,它对老卡优化更激进,实测T4上7B int4能跑到15+ token/s,就是部署麻烦点。量化别怕崩,先跑几个测试样本对比下,真的崩了再退回fp16也不亏。
T4带宽确实拖后腿,上4bit量化能快一倍,效果损失不大,可以试试。
T4这卡确实挺尴尬的,算力还凑合但内存带宽只有320GB/s,跑7B fp16基本就是卡在带宽上了。你可以试试AWQ或者GPTQ的4bit量化,vLLM对AWQ支持挺好的,速度能翻好几倍,ChatGLM这种对话模型量化后体感差异其实不大。另外确认下有没有开enforce_eager,如果开了关掉能快不少。5 token/s确实不太正常,我之前在T4上跑Qwen7B int4能到30+ token/s。