多模态推理的显存暗坑:视觉编码器吃多少、什么时候该拆出去
纯文本推理 7B 模型 14G 显存跑得好好的,换成 Qwen2-VL-7B 直接 OOM——多出来的 8-12G 被视觉编码器吃了。
显存拆解
- LLM 主体(7B):~14G(FP16)
- ViT 视觉编码器(SigLIP 级):~6-8G
- 投影层 + 多模态融合:~2-4G
- 合计:22-26G,24G 卡刚好卡线
什么时候该拆
纯文本请求占比 >30%:拆。视觉编码器只在有图片时才需要,但默认和 LLM 绑一起,纯文本请求也占着那 8G 显存。
拆法:ViT 单独起一个进程/容器,输出 embedding 向量传给 LLM:
# ViT 服务(卡1)
CUDA_VISIBLE_DEVICES=1 python vit_server.py --model SigLIP \
--port 9000 --batch-size 4
# LLM 服务(卡0)
CUDA_VISIBLE_DEVICES=0 vllm serve Qwen2-7B \
--port 8000
# 网关层:有图片先调 ViT 拿 embedding,再塞进 LLM prompt
什么时候不拆
- 图片请求占比 >70%:ViT 常驻划算,拆了反而多一跳网络延迟
- 并发低:单卡 32G(5090)能塞下整套,不折腾
- 延迟敏感:多一跳 ViT 推理 + 网络传输,首字延迟多 200-500ms
实测对比(Qwen2-VL-7B,4090 24G)
- 不拆:单卡能跑,但 KV Cache 只剩 2-4G,长文本直接 OOM
- 拆 ViT 到第二张卡:LLM 独占 24G,KV Cache 充裕,并发翻倍
- 拆到 CPU(ONNX):延迟 +800ms,只适合离线批处理
多模态推理部署:云数方舟 GPU 多卡节点