LLM 内存占用的构成:三大核心部分的量化分析
要理解内存瓶颈,首先需要精确拆解 LLM 在运行时到底消耗了什么。其内存占用主要由三个动态和静态的部分构成,每一部分都有其详细的计算规则。
1. 模型权重(Model Weights)
这是模型最基础、最主要的内存开销,可以理解为模型的”知识库”。其大小由参数量和数据精度(Precision)决定。
数据精度与字节数:
- FP32(单精度浮点):每参数占 4 字节。
- FP16/BF16(半精度浮点):每参数占 2 字节,是当前推理最常用的格式。
- INT8(8位整型):每参数占 1 字节(量化后)。
- INT4(4位整型):每参数占 0.5 字节(量化后)。
计算公式:
内存占用(GB)≈ 参数量(十亿)× 单个参数大小(Bytes)
基于此公式,我们可以清晰地看到不同规模模型在加载时对内存的静态需求:
| 模型规模(参数) | FP16(2 Bytes/Param) |
|---|---|
| 7B(70亿) | ≈ 14 GB |
| 13B(130亿) | ≈ 26 GB |
注:为方便估算,此表采用 1GB = 10^9 Bytes 的近似值。
这个静态值直接决定了模型能否被加载进手机的”生死线”。从表中可见,一个未经优化的 7B 模型,仅权重部分就超过了市面上绝大多数手机的内存上限。
2. 激活值(Activations)
在模型进行前向计算(即”思考”过程)时,每一层网络都会产生临时的中间数据。这部分内存占用是动态的,在处理长文本的 Prefill(预填充)阶段会达到峰值。
- 经验估算法:精确计算激活值内存较为复杂,因为它与具体模型架构和推理引擎实现紧密相关。在工程实践中,一个实用的快速估算法则是,激活值的峰值内存约等于模型权重(FP16)的 25%。对于一个 14GB 的 7B 模型,其激活值峰值约为 3.5GB。
3. KV Cache
这是在 Decoding(解码/逐字生成)阶段为了加速计算而设计的缓存机制。它存储了注意力机制已经计算过的键(Key)和值(Value),避免重复计算。
- 核心特点:KV Cache 的大小与上下文长度(Sequence Length)成正比,是长对话或长文总结场景下最主要的内存增长点。
- 精确计算公式:
KV Cache 内存(Bytes)≈ 2 × 上下文长度 × 模型层数 × 注意力头个数 × 注意力维度 × 精度(Bytes)
不同模型的具体架构参数不同,导致 KV Cache 大小差异巨大。以一个采用了 GQA 结构优化的现代模型,如 Qwen2-7B(拥有 28 个 Transformer 层,K/V 注意力头为 4 个,每个头的维度为 128)为例,在 FP16 精度下,处理 4096 个 Token 的上下文,其 KV Cache 占用约为:
2 × 4096 × 28 × 4 × 128 × 2 Bytes ≈ 235 MB
综合内存占用分析
现在,我们将一个典型的、未经优化的 7B 模型的 FP16 内存占用进行加总,看看它的峰值需求有多庞大:
| 内存组成部分 | FP16(未优化) |
|---|---|
| 权重内存(静态) | ≈ 14.0 GB |
| 激活值内存(动态峰值,估算) | ≈ 3.5 GB |
| KV Cache(4K tokens,典型值) | ≈ 2.1 GB |
| 预估总内存峰值 | ≈ 19.6 GB |
注:KV Cache 大小因模型结构而异,此处采用一个典型非 GQA 优化模型的数值以展示问题的严重性。
结论已经非常清晰:一个未经优化的 7B 模型,其近 20GB 的峰值内存需求,在移动端是绝对无法满足的物理限制。这使得下一章将要讨论的内存优化技术,不再是”可选项”,而是让端侧大模型成为现实的”必需品”。
内存优化技术:在有限容量下实现可能
在物理内存有限的前提下,软件和算法层面的优化是让大模型在端侧运行的关键。这些技术主要围绕内存占用的三个核心部分展开。
1. 权重量化(Weight Quantization)
这是最核心、效果最显著的模型压缩技术。其原理是将高精度(如 FP16)的浮点数权重,转换为低精度(如 INT8 或 INT4)的整数,从而大幅减少模型的存储体积。
- 技术细节:为保证精度,现代量化方案(如 GPTQ/AWQ)普遍采用分组量化(Grouped Quantization)。即将权重分为多个小组(例如每 32 个或 64 个为一组),并为每个小组计算独立的量化参数(Scale,即比例尺)。
- 有效比特率(bpw):这也意味着量化后的实际成本会略高于其标称位数。例如,对一个 INT4 量化模型,如果每 32 个权重共享一个 FP16(16 bit)的 Scale,则每个权重的平均占用为 (32 × 4 + 16) / 32 = 4.5 bpw。
- 优化结果:基于 4.5 bpw 计算,一个原本需要 14GB 的 7B 模型,其权重体积可以被压缩至约 3.7 GB,使其具备了在移动设备上加载的可能性。
2. 激活值优化
主要用于降低处理长序列时产生的瞬时内存峰值,核心思路是”以时间换空间”。
- 激活重计算(Activation Recomputation):不在内存中保留所有中间层的激活值,而是在需要时通过前向计算从上一个”检查点”重新推导。
- 分块预填充(Chunk Prefill):将长输入切分成小块,逐块进行计算并填充 KV Cache。每处理完一小块,其对应的激活值内存即可释放,从而避免了巨大的瞬时内存开销。
3. KV Cache 优化
旨在降低长上下文场景下的内存占用。
- KV Cache 量化:同样可以将 KV Cache 中的数据从 FP16 量化至 INT8,直接将其内存占用降低 50%。
- 模型结构优化(GQA):分组查询注意力(Grouped-Query Attention, GQA)是目前主流的优化结构。它通过让多组”注意力头”共享同一套 K 和 V 缓存,在大幅降低 KV Cache 内存占用的同时,实现了性能和效果的最佳平衡。
4. 混合存储方案
当上述优化仍无法满足需求时,最后的手段是利用速度较慢但容量巨大的闪存。
- 内存卸载(Offloading):将当前不活跃的模型层(比如 Embedding 层)或较早的 KV Cache 从 RAM 中转移到闪存,需要时再加载回来。这是一种以牺牲响应速度(延迟)为代价,换取更大有效容量的终极方案。
优化成效分析:全新的内存占用
经过上述一系列组合拳式的优化,我们现在可以重新计算同一个 7B 模型在端侧运行时的实际内存占用:
| 内存组成部分 | 优化后(4-bit 量化 + GQA) |
|---|---|
| 权重内存(4.5 bpw) | ≈ 3.7 GB |
| 激活值内存(动态峰值,估算) | ≈ 0.9 GB |
| KV Cache(4K tokens,Qwen2-7B,INT8) | ≈ 0.12 GB |
| 预估总内存峰值 | ≈ 4.7 GB |
最终结论
分析指向一个明确的结果:物理内存容量是端侧 AI 能力的根基,而软件优化则是在这个根基上实现效率最大化的手段。