本地运行大语言模型需要多少内存

Dev.to AI 2026-11-05T15:49:49.169966

下载模型准备在本地运行之前,得先确认它能不能装进内存。估算时把三项加起来,再拿结果和机器实际能提供给模型的内存作对比:

need = weights + KV cache + overhead

也就是:模型权重 + KV 缓存 + 额外开销。

当 need <= 0.8 × usable memory 时才算放得下。

下面的数字沿用 osFoundry 桌面应用里本地模型浏览器的估算方法,并与该应用在 16 GB MacBook M3 上显示的结果做了核对。

权重

权重大小等于参数数量乘以每个权重占用的字节数;每个权重占多少字节取决于量化方式:

量化方式 每个权重占用的字节数
FP16 / BF16 2.0
Q8_0 1.0
Q6_K 0.82
Q5_K_M 0.69
Q4_K_M 0.56
Q3_K_M 0.44
Q2_K 0.31

Q4_K_M 是 0.56 而不是 0.5,因为 K-quants 会为每一小块权重保存一个缩放系数,算下来每个权重大约 4.5 bit。

一个 14B 模型使用 Q4_K_M 时:14 × 10⁹ × 0.56 = 7.84 × 10⁹ 字节,约 7.3 GiB。

如果不认识某个量化名称,就按 FP16 估算。这是偏保守的选项,不会把实际放不下的模型误判为能放下。

KV 缓存

生成过程中,模型会保存上下文中每个 token 的键(key)和值(value)。大小计算公式为:

2 × layers × kv_heads × head_dim × context_tokens × bytes_per_element

Qwen2.5 14B 有 48 层、8 个 KV 头(使用分组查询注意力,grouped-query attention),每个头的维度是 128。KV 缓存使用 FP16 时:

缓存会随上下文长度线性增长,所以一个在 4K 上下文下绰绰有余的模型,到 32K 时可能就放不下了。不说明上下文长度的估算参考价值不大;截图里的估算按 4K 计算。

额外开销

llama.cpp 还需要计算缓冲区和临时空间。粗略估算,可以按权重大小的 10% 再加约 200 MB 预留。对 14B 模型来说,大约是 0.9 GB。

把权重、KV 缓存和额外开销加起来,14B 模型在 Q4_K_M 下大约需要 8 到 9 GB。应用显示的是 8.4 GB。

可用内存

这里是大家最容易搞错的地方。独立显卡:上限是显卡的显存(VRAM)。12 GB 显存的卡就是 12 GB,不管系统内存有多大。

Apple Silicon:内存是统一的,但 GPU 不能全部用掉,操作系统也要占一部分。按总内存的 75% 来算比较合理,所以 16 GB 内存大约可用 12 GB。

再往下就是对比判断,分三档:

在 16 GB 的 Mac 上,结果是这样:Q4_K_M 占 8.4 GB(70%,装得下)、Q5_K_M 占 10.4 GB(87%,勉强)、Q6_K 占 12.3 GB、Q8_0 占 14.9 GB(这两个就超了)。把同样的方法套到多个 Q4_K_M 量化的模型上,这台机器的分界线落在 20B(11.9 GB,勉强)和 27B(15.9 GB,太大了)之间。

生成速度也由这个数决定

每生成一个 token,都要把内存里的所有权重读一遍,所以生成速度的上限就是内存带宽除以模型大小。基础款 M3 的带宽大约 100 GB/s,那么一个 8.4 GB 的模型最高大约能跑到每秒 12 个 token,而 4.9 GB 的 8B 模型能到每秒 20 个左右。实际值都会低一些,但不同模型之间的比例关系基本保持得住。这样算下来,对模型大小的估算一次回答了两个问题:这个模型能不能加载得起来,以及如果能,大致能写多快。

在下载模型准备本地运行之前,得先确认它装不装得进内存。估算方式是把三项加起来,再拿结果和机器实际能提供给模型的内存作比较:

need = weights + KV cache + overhead
fits if need <= 0.8 × usable memory

查看原文