
我最早以为,多模态模型就是在文本模型外面套一个”看图插件”,推理时临时把图片塞进去,用完就丢。显存应该和纯文本模型差不多。直到我用一个 7B 的多模态模型跑 demo,发现一张 224 的图片居然比几千个中文字符还占显存,我才意识到:图片不是”塞进去”的,它会被翻译成一个长长的 token 序列,然后像正文一样在这个模型里走完全程。
这个误解,大概也是很多人问”到底需要多少显存”的根源。今天我们就用几个典型模型,把这笔账算清楚。
显存不是只看参数量:图片 token 是隐藏的大头
推理时显存主要由三块组成:模型权重、激活值、KV cache。大多数人只盯着第一块,但后两块恰好是图像带来的增量之源。
先说权重。一个 7B 模型用 FP16 存,需要 7B × 2 字节 = 14 GB。这个数字是固定的,跟你喂它什么内容无关。
然后是激活值和 KV cache。自回归模型每生成一个 token,都要把之前所有 token 的 Key 和 Value 缓存下来,供后续注意力计算使用。这就是 KV cache。它的显存大致按这个公式走:
KV cache 大小 ≈ 2 × 层数 × 注意力头维度 × 序列长度 × batch size × 2 字节 × 层数(注意两层)
说得人话一点:序列越长,KV cache 越大。而一张图片会变成多少个 token?这取决于视觉编码器。
| 模型 | 视觉编码器 | 图片分辨率 | 图像 token 数 |
|---|---|---|---|
| CLIP ViT-L/14 | ViT-Large | 224×224 | 256 |
| LLaVA-1.5 | CLIP ViT-L/14 | 336×336 | 576 |
| Qwen-VL | OpenCLIP ViT-bigG | 448×448 | 1024 |
| GPT-4V(估算) | 未知,但大概率是多尺度 | 更高分辨率 | 数百到上千 |
这里有个关键点:图像 token 和文本 token 在计算上是平等的。比如 LLaVA,把 336 的图片切成 576 个 patch,每个 patch 经过视觉编码器变成一个 token,然后作为 prompt 的前缀塞进大语言模型。这 576 个 token 会参与每一层的注意力计算,自然也会占用 KV cache。
三种典型模型的实际显存账
代表一:CLIP——它根本不”生成”,所以最省
CLIP 是双塔结构,图像塔是 ViT,文本塔是 Transformer。它做的是对比学习,给图像和文本各算一个向量,然后算相似度。它不做自回归生成,所以没有 KV cache,也没有”逐个 token 吐字”的过程。
CLIP ViT-L/14 参数约 0.43B,FP16 权重约 0.86 GB。推理一张 224 图片时,图像塔前向传播的中间激活值最多才几百 MB。一张消费级显卡轻松跑。它的显存压力不在模型,而在你同时跑图像塔和文本塔。如果你只做图文检索,两个塔都要加载,加起来大约 1 GB 到 1.5 GB。
代表二:LLaVA-7B——最典型的”重
原创文章,作者:guanweilu,如若转载,请注明出处:https://guanweilu.cn/article/477.html
原创文章,作者:guanweilu,如若转载,请注明出处:https://guanweilu.cn/article/477.html