“文件只有 2GB,为什么还是卡?”因为文件大小不是运行峰值。模型加载、上下文、计算缓冲区以及浏览器都在争同一块内存;交换空间能让程序继续,不等于交互仍然顺畅。
保留轻薄本工作的便利,需要先给设备留余地,不能把最低可启动配置写成可长期稳定使用的承诺。
权重只是账本的一行
一个粗略预算可以写成:系统与其他应用、模型权重、KV 缓存、运行时缓冲、保留余量。数值必须使用同一单位。量化格式、分组元数据、架构与加载后布局会影响权重占用,不能只用参数量乘 4bit 得出精确内存。
2026 年 10 月 20 日的 AnyLanguageModel 1.0 介绍同时列出小型本地模型和更大的模型,并区分本地与托管推理。统一接口不消除硬件差异,也不意味着任意模型都能塞进 8GB。项目作者介绍
图中五项相加为 8GiB,只用于演示预算结构;条形为近似示意,不能读成内存监控截图。
计算上下文成本,先写清假设
保存为 budget.py。下式只估算标准注意力模型的 KV 数据体积,假设每层有独立 K/V、无特殊缓存压缩;不同架构需按实际实现修改。
def kv_gib(layers, kv_heads, head_dim, tokens, bytes_per_value=2, parallel=1): values = 2 * layers * kv_heads * head_dim * tokens * parallel return values * bytes_per_value / 1024**3 kv = kv_gib(layers=28, kv_heads=4, head_dim=128, tokens=4096) budget = {"os_apps": 3.0, "weights": 2.2, "kv": kv, "runtime": 1.0, "reserve": 1.0} total = sum(budget.values()) assert round(kv, 4) == 0.2188 assert total < 8 assert kv_gib(28, 4, 128, 8192) == 2 * kv assert kv_gib(28, 4, 128, 4096, parallel=2) == 2 * kv print("假设KV GiB:", round(kv, 4), "预算合计:", round(total, 4))预算低于 8GiB 只说明这些假设没有超额,不保证真实峰值能放下。操作系统可用内存变化、共享内存统计和缓存分配方式,都需要运行记录补充。图中的 0.8GiB 是另一组预算输入,和代码按给定架构算出的 0.2188GiB 不属于同一次测量。
再决定怎么缩小
先缩短上下文、降低并发,观察交换与交互延迟;再比较较小模型或量化版本。不要把“分层加载到 CPU”当成免费的内存释放,CPU 内存与传输也有代价。
Hugging Face 的 PyTorch 团队在 2026 年 10 月 20 日介绍 MPS 2.15 相关改进时,附带了硬件、模型和版本条件,文中安装示例属于候选版本路径。引用这类性能信息应保留条件,不外推到所有 Mac。原文
本文实际验证的是预算算术与上下文、并发的线性变化;未安装新框架,未加载权重或测量真实内存峰值。预算表最大的作用,是在点击下载之前,先发现“权重比全部预算还大”这样的矛盾。