最近在做一个内部工具,想把Llama-3-8B微调后的模型部署到公司服务器上给同事用。但手头只有一张RTX 4090(24G),用vLLM加载fp16权重直接OOM,量化到int8勉强能跑但并发一高就慢得离谱。试了llama.cpp的GGUF格式,速度倒是上来了,但功能上有些算子不支持,改起来很麻烦。想问问各位大佬,除了换更大显存的卡,有没有什么成熟的方案?比如张量并行、offload到CPU或者用更激进的量化?另外,如果考虑上多卡,是不是还得改代码?目前有点迷茫,求指点。
大模型部署到生产环境,显存不够怎么办?只能换卡吗?
全部回复
共 48 条你这情况我太懂了,4090跑8B fp16确实卡在临界点上。可以先试试vLLM的量化推理,比如AWQ或者GPTQ的4bit,显存占用能砍一半多,而且有算子优化,并发性能比int8好不少。另外offload到CPU也不是不行,但延迟会明显上去,适合内部工具对响应不敏感的场景。真要上多卡的话,vLLM支持张量并行,代码改动很小,主要就是启动命令加个参数,但得注意PCIe带宽够不够。我之前也是用llama.cpp,后来发现vLLM的兼容性更省心,建议你优先折腾量化版本。
试试AWQ或GPTQ量化到4bit,4090跑8B并发稳很多,算子兼容性也比GGUF好。
说真的你这情况我太熟了,4090跑8B fp16本来就很极限,vLLM的KV cache和CUDA context一占直接就炸。int8慢其实不一定是量化的问题,大概率是vLLM对int8的kernel优化没跟上,你可以试试把gpu_memory_utilization调到0.95,再把max_num_seqs压到16以下,并发高的时候会好很多。至于offload到CPU,除非你内存大得离谱而且能接受单token延迟上秒级,否则真的不推荐,同事用起来会骂人的。多卡的话其实不用太慌,vLLM的张量并行就是加个--tensor-parallel-size参数的事,代码基本不用动,但前提是你得有两张卡,而且NVLink有没有都行,PCIe也能跑就是通信开销大点。最省事的方案我建议你直接上AWQ或者GPTQ的4bit量化,质量损失对内部工具来说几乎感知不到,而且vLLM原生支持,显存直接砍半,留出来的空间把max_num_seqs调高,并发能力反而比int8强。如果后续真要上多卡,记得看下你主板PCIe通道数够不够,别插满结果x4速率跑,那还不如单卡。另外llama.cpp那个算子问题,你可以看看它最近的--override-tensor选项,有些算子能绕过去,但说实话生产环境还是vLLM生态稳。
4090跑8B其实上AWQ 4bit挺稳的,并发问题用vLLM加个--max-num-seqs调小点试试。
试试AWQ量化加vLLM,4bit下8B模型单卡4090绰绰有余,并发也稳。
24G跑8B其实挺宽裕的,OOM大概率是vLLM默认gpu_memory_utilization留太多给KV cache了,调低到0.85再试试。量化我推荐AWQ 4bit,比int8快不少而且精度掉得不多,并发场景比GGUF舒服。多卡的话vLLM支持tensor_parallel_size直接加参数就行,不用改模型代码,但两张卡之间的通信开销要看你主板走的是不是PCIe 4.0 x16。CPU offload延迟会很难看,内部工具人少还能忍,人多就别折腾了。
24G跑8B其实挺够的,关键看你并发和上下文长度。可以先用AWQ或GPTQ 4bit量化配vLLM,比int8快不少,显存也压到6G左右。张量并行别急着上,多卡通信开销在小模型上反而拖后腿,而且vLLM改并行基本就是加个参数,不用大动代码。真要扩显存,不如先试试限制max_model_len和batch,很多时候是KV cache吃爆的。
单卡24G跑8B确实紧,但你这条路不止换卡能走通。vLLM的fp16 OOM可以试试调低gpu_memory_utilization,或者直接上AWQ/GPTQ的4bit权重,比int8快不少,并发也稳。真要上多卡,vLLM的张量并行基本就是启动参数加个tensor_parallel_size,代码不用大改,但卡间通信开销得先想清楚。llama.cpp算子不支持的问题,看看是不是能用最新的CUDA后端,或者换个推理框架比如TGI试试。