最近在尝试用MCP框架部署一个7B的模型做本地服务,显存是24G的RTX 3090。按照官方教程配置了半精度和offload,但每次并发请求一多(大概2-3个)就直接OOM,日志里显示显存碎片化严重。我试过调小batch_size和max_seq_len,甚至把缓存关了,还是会炸。是不是MCP的显存管理策略跟transformers不一样?或者我需要改什么环境变量?求有经验的大佬指点一下,实在不想每天重启服务了。
MCP部署大模型时显存总爆,求教合理调参思路
全部回复
共 143 条我之前跑7B也遇到过类似的坑,24G看着够但架不住MCP那套显存池化机制跟transformers的静态图不一样,碎片化是常态。你可以试试把KV cache的预分配量调低,或者直接换成vLLM后端,它对并发和显存复用友好太多。另外环境变量里PYTORCH_CUDA_ALLOC_CONF设成max_split_size_mb:128能缓解碎片,但治标不治本,还是得看MCP是不是把显存分成固定block了。
顺便问下,你offload是只offload了权重还是也把激活值扔CPU了?有时候光调batch_size没用,激活值峰值才是真凶。我之前是把max_seq_len砍到1024,同时限制并发数上限为1,先跑通再慢慢加,不然老炸心态真的崩。
我之前也踩过这坑,3090跑7B半精度理论够用,但MCP的KV cache分配策略确实激进,跟transformers那套差距不小。你可以试试把MCP_GPU_MEM_POOL设成显存的80%,再强制开启paged_attention,碎片能缓解不少。另外并发2-3个就崩,多半是prefill阶段峰值炸了,别光调batch,得把max_num_seqs压到1看看。还有个小技巧,用torch.cuda.memory_stats盯一下reserved和allocated差值,如果差太多就得考虑换vLLM后端了。
24G跑7B半精度理论够用,但你开并发+offload其实挺容易触发碎片问题。我之前也遇到过类似情况,后来发现是KV cache没设上限,并发一上来直接把显存吃干净了。可以试试限制max_num_seqs或者用vLLM那种PagedAttention的方案,MCP底层调度跟transformers确实不太一样。另外看看有没有开CUDA的expandable_segments,环境变量加上PYTORCH_CUDA_ALLOC_CONF=expandable_segments:True能缓解不少碎片。