最近在做一个内部工具,想把Llama-3-8B微调后的模型部署到公司服务器上给同事用。但手头只有一张RTX 4090(24G),用vLLM加载fp16权重直接OOM,量化到int8勉强能跑但并发一高就慢得离谱。试了llama.cpp的GGUF格式,速度倒是上来了,但功能上有些算子不支持,改起来很麻烦。想问问各位大佬,除了换更大显存的卡,有没有什么成熟的方案?比如张量并行、offload到CPU或者用更激进的量化?另外,如果考虑上多卡,是不是还得改代码?目前有点迷茫,求指点。
大模型部署到生产环境,显存不够怎么办?只能换卡吗?
全部回复
共 41 条试试4bit AWQ量化加vLLM的auto张量并行,单卡也能榨出不少吞吐,比int8香多了。
4090跑8B其实不用太纠结,int8卡在并发上大概率是vLLM的显存调度问题,试试把gpu_memory_utilization拉到0.95然后开--max-num-seqs调低一点,能缓解不少。张量并行在单机上两张卡收益不大,还得改模型加载逻辑,不如直接看下量化到4bit的awq或者gptq,效果比GGUF好维护。你要是真想上多卡,其实不用改代码,vLLM自带tp=2参数,但4090的PCIe带宽会拖后腿,速度提升没想象中明显。对了,你试过offload到CPU吗,把KV cache分一半过去,虽然延迟高点,但能撑住并发。
4090跑8B其实卡在KV Cache上,你可以试试把max-model-len调低点,或者开PagedAttention,很多场景下能省出不少显存。真要上多卡的话,vLLM支持张量并行,代码改动量不大,主要是得注意卡间通信带宽,PCIE的话效率会打折扣。量化方面AWQ或GPTQ比int8稳,配合vLLM的AWQ部署,并发表现会比llama.cpp好不少。最关键的是先确认下你的并发瓶颈是算力还是显存,前者换卡也没用。
这问题我上周刚踩完坑,4090跑8B其实不用非得换卡,试试把vLLM的max-num-seqs调小点,再开个--enable-chunked-prefill,并发能稳不少。int8慢多半是量化后没开AWQ或GPTQ的kernel优化,换llama.cpp还是差点意思。多卡的话,张量并行在vLLM里基本就是改个--tensor-parallel-size参数,代码不用动,但得注意两块卡之间NVLink带宽,PCIE的话延迟会明显。我最后是fp8动态量化加KV cache offload到内存,吞吐勉强够内部用,你可以先朝这个方向试试。
说实话4090跑8B真没必要死磕vLLM,试试AWQ或者GPTQ的4bit量化,配合vLLM的awq后端,单卡24G能塞下还留不少KV cache余量。如果并发要求高,offload到CPU其实挺亏的,带宽瓶颈卡在那,不如上两张卡做张量并行,vLLM本身支持多卡推理,代码基本不用动,改个参数就行。另外llama.cpp算子不全的问题,你可以看看最近出的llama-server的OpenAI兼容接口,有些trick能绕过去,但要是涉及自定义算子那确实没辙。
说实话你这个情况我太懂了,4090跑8B fp16就是卡在临界点上,vLLM那点显存管理根本不够折腾。我建议你先别急着上多卡,试试把量化换成AWQ或者GPTQ的4bit,配合vLLM的gptq分支,显存能压到7G左右,并发吞吐比int8快不少,关键是算子兼容性比GGUF好太多。要是还是慢,你再考虑offload到CPU,但注意别全量offload,只把KV cache和部分中间层放过去,延迟能接受但吞吐会掉。至于多卡,不用太担心改代码,vLLM本身支持张量并行,你只要把模型放到两个卡上,启动参数加个--tensor-parallel-size 2就行,但前提是得用同一型号的卡,而且NVLink或者PCIe带宽得够。我个人经验是,如果只是给同事用,先上4bit AWQ + vLLM,再把max-num-seqs调小点,基本能撑住几十个并发,真不够了再买第二张卡,别一上来就折腾分布式。对了,你试过FlashAttention没?开一下能省不少显存,有时候OOM就是这块没优化。
4090跑8B其实挺尴尬的,24G刚好卡在fp16和int8的缝里。你说的vLLM OOM我太懂了,之前试过把max_model_len砍到2048,再把KV cache量化成8bit,勉强能塞进去但并发稍微一上来延迟就爆炸。offload到CPU那个方案其实没你想的那么不堪,llama.cpp里把部分层放内存,速度虽然掉一半,但至少能跑,而且不用动模型代码。至于张量并行,单卡就别想了,多卡的话vLLM其实已经封装好了,只要把tensor_parallel_size设成卡数就行,但前提是你的模型权重得先切分好,或者直接用huggingface的device_map=auto,它会自动塞满每张卡的显存。不过说实话,如果只是内部工具,我建议你试试AWQ或GPTQ的4bit量化,配合vLLM的awq支持,比GGUF省心得多,算子兼容性也好不少。最后提一句,如果同事对延迟没那么敏感,干脆用TGI部署,它对offload的优化比vLLM更激进,显存不够时会自动甩到CPU,虽然慢点但至少不会OOM。
试试4bit AWQ量化配合vLLM,显存占用能压到6G内,并发性能比int8好不少。
4090跑8B其实挺尴尬的,fp16放不下但int8又牺牲太多。你可以试试AWQ或GPTQ的4bit量化,配合vLLM的weight streaming,显存占用能压到6G左右,并发吞吐比GGUF稳不少。多卡的话如果只是加张4090,vLLM的tensor parallel基本不用改代码,但记得两张卡得用NVLink或PCIe 4.0,否则通信瓶颈会让加速比很难看。另外也可以考虑把部分层offload到CPU,比如只保留前几层在GPU上,虽然延迟会高一点但至少不OOM。
说实话你这个问题我上个月刚踩过一遍,最后是混着方案搞定的。4090跑8B fp16确实卡在边缘,但直接放弃换卡有点亏。你可以试试把vLLM的gpu_memory_utilization调到0.9,然后配合--max-num-seqs降低并发数,先把服务跑起来再说,至少内部工具能用。int8慢的根源其实不在量化本身,而是vLLM对int8的kernel优化没跟上,你可以对比一下AWQ或GPTQ,用AutoAWQ量化后配合vLLM的awq模式,速度和fp16差距能控制在15%以内,显存直接砍一半。至于llama.cpp算子不支持,那个确实无解,但如果你主要做文本生成,可以看看ExLlamaV2,它支持4bit/5bit量化且算子覆盖比llama.cpp全,速度也不差。多卡的话,张量并行确实要改代码,但vLLM和TRT-LLM都封装好了,你只要保证模型能存到多卡显存里,配置tensor_parallel_size=2就行,代码层面几乎不动,但注意4090没有NVLink,跨卡通信走PCIe,性能损失大概20%到30%,且显存碎片是个坑。最后还有个偏门招,把部分层offload到内存,比如用accelerate的device_map,但延迟会飙到秒级,只适合极低并发场景。我个人建议先试AWQ量化+调低并发,如果还不行就上两张4090跑张量并行,别折腾CPU offload,那玩意调试成本比换卡还高。
试试4bit AWQ量化加vLLM,显存占用能压到6G以内,并发性能比int8好不少。
4090跑8B其实挺尴尬的,量化到4bit配合vLLM的awq方案,吞吐能比int8高一截,而且算子支持比GGUF全。offload到CPU建议别碰,带宽瓶颈太难受,除非你是纯离线批处理场景。多卡的话,vLLM的tensor parallel基本不用改模型代码,就是显存翻倍后还得看PCIe带宽,两张卡互联如果只是x8/x8,速度提升可能没想象中大。另外可以看看llama.cpp最近支持的flash attention,有些算子兼容问题其实新版已经修了。
这问题我最近刚好踩过一遍,4090跑8B其实不用死磕vLLM。可以试试把KV cache量化到8bit,配合fp16权重,显存能压下来不少,速度影响比全量int8小得多。要是还卡,就上llama.cpp的mmap模式,把部分层offload到内存,虽然单请求会慢点,但至少并发不会全挂。多卡的话,tensor parallel其实vLLM和llama.cpp都内置支持,不用改模型代码,就是得注意PCIe带宽,两张卡互联速度不行的话提升有限。
4090 24G跑8B fp16确实紧,vLLM的KV cache又吃显存,我建议先用AWQ或GPTQ做4bit量化,配合vLLM的tensor parallel,单卡也能撑住几十路并发。offload到CPU只在长序列场景下有用,日常对话反而拖慢速度。多卡的话不用太担心,vLLM和llama.cpp都支持数据并行,代码基本不用改,主要看你的业务是否吃显存。另外可以看看PagedAttention的优化选项,有时候调调参数就能救回来。
试试FP8+KV cache量化,4090跑8B并发能翻倍,vLLM直接支持不用改代码。
说实话你这个问题我太有同感了,之前我们团队部署7B模型也卡在显存上,最后发现换卡不是唯一解,但确实是最省心的解。你提到的offload到CPU我试过,用deepspeed的zero-offload能把激活和优化器状态放内存里,但推理场景延迟会翻好几倍,如果只是内部工具对响应速度不敏感倒可以试试。张量并行的话,单机多卡确实要改代码,vLLM其实已经支持tensor parallel了,你只要把模型换成多卡加载,启动参数加个--tensor-parallel-size 2就行,代码层面基本不用动,但前提是你得有两张卡,而且显存要能塞下模型分片。更激进的量化方案比如AWQ或GPTQ,4bit效果比int8好不少,vLLM也原生支持,你可以试试看,但注意有些层比如embedding和lm_head量化后精度损失会放大。另外还有个偏门思路,用PagedAttention的vLLM配合KV cache量化,能把显存占用再压一截,但你要确认算子兼容性。最后提醒一句,如果并发高是刚需,别死磕单卡,二手淘一张4090拼起来做TP,性价比比换A100高多了。
你这情况我上周刚踩过一遍,4090跑8B fp16确实难受。试试vLLM加--enable-chunked-prefill和--max-num-seqs调小点,能把显存峰值压下来不少,别一上来就int8。多卡其实不用改代码,vLLM原生支持tensor parallel,两张卡直接--tensor-parallel-size 2就行,数据并行都不用你操心。要是还卡瓶颈,就看看offload到CPU只放KV cache,虽然慢点但至少不OOM。
试试4bit AWQ量化加vLLM,8B模型显存能压到6G左右,并发也稳,算子兼容比GGUF省心。
说实话你这个问题我上个月刚踩过一遍坑,最后没换卡,用flash-attention加AWQ量化到4bit,配合vLLM的自动前缀缓存,把8B模型压到6G出头,并发拉到20左右还算稳。int8慢大概率是因为没开tensor parallel,单卡上vLLM的量化kernel本身就有开销,你试试把gpu_memory_utilization调到0.95,再加个--enable-prefix-caching,可能比换量化格式更立竿见影。offload到CPU我试过,延迟会飙到秒级,只适合离线批处理,在线交互基本没法用。多卡的话,其实vLLM和TGI都原生支持张量并行,代码层面不用改,只要把模型权重转成safetensors格式,启动时加--tensor-parallel-size 2就行,但注意两张卡之间NVLink带宽不够的话,通信开销可能抵消掉算力提升,4090只有PCIe,效果未必理想。另外你提到llama.cpp算子不支持,那个确实坑,但最近新版加了flash attention支持,有些算子能绕过去,你可以试试更新到最新commit。最后真要激进点,可以看看GPTQ和AWQ的2bit版本,比如Qwen2-8B量化到2bit还能保持一定准确率,内部工具够用,但显存紧张时记得给KV cache留足空间,不然长上下文还是会爆。
说实话你这个情况挺典型的,24G跑8B fp16确实卡在临界点上。我建议先别急着上多卡,试试vLLM的AWQ或GPTQ量化,配合paged attention,并发能顶住不少,而且算子支持比llama.cpp全。如果还是慢,可以开一点CPU offload,把KV cache和部分层放内存,虽然延迟会高点但至少不OOM。至于多卡,vLLM支持张量并行,代码改动很小,主要就是启动命令加个参数,但4090之间没有NVLink,通信走PCIe会有额外开销,得实测下值不值。