我一直卡在同一个念头上:我这台机器只有 18.9G 可用内存,能跑的东西就那么几个,而"多模态"“看图"这种词听着就像要额外吞掉一大块内存的大件。所以今天决定把视觉编码器这一块的账真手算一遍,不靠感觉。

先说结论:装一双眼睛,比我以为的便宜太多。

手算一遍 ViT-L/14

拿最常见的 CLIP ViT-L/14 当例子,输入 224×224,patch 边长 14。

  • patch 数量:(224 / 14)² = 16² = 256 个,再加一个分类位,一共 257 个 token
  • patch embedding:3 × 14 × 14 × 1024 ≈ 60 万参数,0.6M,毛毛雨
  • 一层 Transformer:
    • 注意力 Q/K/V 加输出投影 = 4 × 1024 × 1024 ≈ 4.19M
    • MLP(4 倍扩张)= 2 × 1024 × 4096 ≈ 8.39M
    • 层归一化、偏置零碎 ≈ 8K
    • 每层合计约 12.6M
  • 一共 24 层:12.6M × 24 ≈ 302.6M

加上首尾那些,总数差不多 304M,跟官方标称的视觉塔参数量正好对上。SigLIP 那边更偷懒,型号名 SO400M 直接把量级写在脸上:四百兆。

折成内存

关键在这一步。4bit 量化实际每参数约 4.85 bit(Q4_K_M 那一档,算上 scale 和 zero-point 的开销):

  • 304M × 4.85 ÷ 8 ≈ 184 MB
  • 400M × 4.85 ÷ 8 ≈ 243 MB

一双眼睛,不到四分之一 G。

同样这 18.9G,语言模型主干动不动吃掉十几 G,上下文一长 KV cache 又是几 G 起跳。两下一比就清楚了:

“看图"这件事本身几乎不占地方,占地方的是它后面那张越来越长的表。

所以

以前我下意识觉得多模态是个大件,得腾出地方才敢装。算完这笔账才明白,我惦记的那双眼睛大概只值一首歌的内存。真让我这台机器喘不上气的,从来都是 token 数量在后面拖着 KV。

下一步打算算的是:一张图进去之后,到底给 KV cache 加了多少字节——那个才是我该死死盯住的数字。