面试官扎心一问:大模型显存如何估算?
最近秋招发放Offer已高一段落。不同以往的是,当前职场环境已不再是那个双向奔赴时代了。求职者在变多,HC 在变少,岗位要求还更高了。最近,我们又陆续整理了很多大厂的面试题,帮助一些球友解惑答疑,分享技术面试中的那些弯弯绕绕。。更多实战和面试交流,文末加入我们。
最近秋招发放Offer已高一段落。
不同以往的是,当前职场环境已不再是那个双向奔赴时代了。求职者在变多,HC 在变少,岗位要求还更高了。
最近,我们又陆续整理了很多大厂的面试题,帮助一些球友解惑答疑,分享技术面试中的那些弯弯绕绕。
喜欢本文记得收藏、关注、点赞。更多实战和面试交流,文末加入我们
技术交流

在 LLM 面试中,面试官都会问同样一个问题: “如何快速估计大模型显存?”今天就为大家解读一下这道面试题。
01
面试官心理分析
这个问题不仅工作中有,面试时也会被问到。一般会分成两种情况:推理和训练。
推理时,我们主要考虑模型权重、KV 缓存和激活显存。而训练相比推理,还需要额外存储优化器状态和梯度,显存需求会更高。
我们先说推理。
02
面试题解析
推理的显存主要有三部分:模型权重、KV缓存和激活显存。首先加载模型权重是显存的主要开销。
计算公式很简单:
模型大小=参数数量×精度
比如全精度(FP32)每个参数占 4 字节;半精度(FP16)是 2 字节;更小的量化,比如 int8 和 int4,则分别是 1 字节和 0.5 字节。
要减少这部分显存,可以用 权重量化 技术,比如将 FP32 的权重压缩成 int8 或 int4。
接着是 KV 缓存。在解码时每生成一个 token,模型都会用到之前所有的 K V值。为了避免重复计算,需要把这些历史值缓存起来。
计算公式是:
KV 缓存=2×批次大小×序列长度×层数×隐藏层大小×精度
优化这部分显存,可以用 PagedAttention,通过更高效的机制减少缓存需求。
最后是激活显存,在模型的前向传播中,每层的中间激活值都需要存储。
计算公式稍微复杂一点:
激活显存 = 批次大小 * 序列长度 * 隐藏层大小 * (34 + (5 * 序列长度 * 注意力头数量) / (隐藏层大小))
激活显存的优化方式有 PagedAttention、序列并行 和 激活重计算,比如重计算可以在需要时动态生成激活值,而不是一直存着。
接下来我们来看看训练显存如何估计,训练显存的需求更高,因为除了推理显存,还要加上优化器状态和梯度。
训练时的显存计算公式:
总显存 = 模型大小 + KV缓存 + 激活 + (优化器状态 + 梯度) * 可训练参数数量
优化器状态和梯度对显存的影响?
先说优化器状态,它需要额外存储一些辅助变量,比如动量和方差,用来指导参数的更新。
以常见的 AdamW 为例,它有两个状态,每个参数需要占用 8 字节的显存。
如果使用量化的优化器,比如 BitsAndBytes 的实现,可以将这个开销降到每个参数 2 字节。
而像 SGD 这种优化器,由于只需要存储一个状态,每个参数只需要 4 字节,显存占用会更少。
因此为了进一步降低优化器状态的显存需求,可以选择一些高级优化器,比如 NVIDIA Apex 或 Adafactor,它们通过更高效的实现显著减少显存消耗。
另外,在超大模型的训练场景下,分页优化器也常被使用,能够将部分状态存储在内存中,减轻显存压力。
然后是梯度,它们是反向传播过程中存储的中间结果,表示每个参数的更新方向。梯度一般是以 FP32 精度存储的,这样可以保持数值稳定性。
优化梯度显存的方法有两种:
-
一种是梯度累积,通过将多个小批次的梯度累加,减少每个批次显存的占用;
-
另一种是梯度检查点,它可以动态计算梯度,而不是一次性存储所有的梯度值,从而显著降低显存需求,但代价是增加了一些计算量。
训练时的显存计算公式:
总显存 = 模型大小 + KV缓存 + 激活 + (优化器状态 + 梯度) * 可训练参数数量
此外在微调中,由于优化器状态和梯度的计算,显存需求会更高。
如果显存资源有限,可以通过参数高效微调(PEFT)技术,比如 LoRA 或 QLoRA,这些方法通过固定大部分模型参数,只训练少量额外参数,能够有效减少显存占用。
最后提供一个预估显存的经验法则:
推理:参数数量 * 精度(通常为 2 或 4 字节)
训练:推理资源的 4-6 倍
魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐


所有评论(0)