第 13 节 · 在 48GB Mac 上跑通 284B¶
过去,想跑一个 284B 参数的模型,你得先买一台 256GB 内存的机器——价格十万往上。
这一节要说的,是把同一个模型塞进一台 48GB 内存、两万左右的 MacBook Pro(M4 Max)里,而且不是理论推演,是真机实测跑通了。这是这本书讲"基座"的那部分里,最反直觉的一次实测。
一句话结论¶
用开源推理引擎 DwarfStar + SSD 流式加载 + IQ2XXS 2-bit 量化,一台 48GB 内存的 Mac 就能跑起 284B 参数(13B 激活)的 DeepSeek V4 Flash:
- 内存占用可控在 15GB 以内(实测进程常驻只有 0.11GB,系统零压力)
- 生成速度 3.5-7 token/s
- 英文知识 / 代码 / 数学几乎无损,中文指令遵循有明显退化
凭什么 48GB 装得下 284B¶
关键在 MoE(混合专家)架构:模型每生成一个字,只激活 4% 的参数——284B 里只有 13B 在干活。
所以专家权重不用常驻内存,放在 SSD 上按需读取;内存里只装"总要用到"的共享权重和专家缓存。就像图书馆的书不全堆在桌上,读到哪本、取哪本。这就是"模型住进硬盘"能成立的底层原因。
图 B-13-1(待出):MoE 模型为什么能"住进硬盘"——每次只用到 4% 的"大脑"留在内存,284B 的"专家书架"放在 SSD 上按需读取
技术路线和内存账本¶
把上面那句话拆开,是三个事实叠加:
- 激活参数少:每生成一个 token,只激活约 4% 的参数(13B / 284B)。绝大部分专家权重在这一刻是闲着的。
- 专家可以住硬盘:既然专家权重不是每次都用到,就不必常驻内存,可以放在 SSD 上按需加载;命中缓存就免读盘。
- 量化压缩体积:把路由专家压到 2-bit,体积大幅缩小,模型文件整体能落在一块普通 SSD 上。
具体落地是三样东西:推理引擎用 antirez 开源的 DwarfStar(专门为这个模型优化);量化用 IQ2XXS——路由专家压到 2-bit,注意力 / 共享专家保持 Q8,是分级量化而不是一刀切压精度;加载用 SSD 流式,模型主干常驻,专家权重按需读入。
内存不靠感觉,是提前规划过的:
| 项目 | 规划值 |
|---|---|
| KV cache | 0.6GB |
| 专家缓存 | 12GB |
| 常驻 | ~1GB |
| 合计 | ≈ 15GB |
实际跑起来,进程常驻内存(RSS)只有 0.11GB——因为 mmap 的页缓存由操作系统按需回收。所以规划里的 15GB 是"封顶"口径,真实占用远低于此。
实测数字,一眼看完¶
| 能力 | 本地实测* | 官方 SOTA | 判断 |
|---|---|---|---|
| 英文知识 MMLU | 86.7% | 88.7(5-shot) | 几乎追平 |
| 代码 HumanEval | 87.5% | 69.5(base) | 反超官方 |
| 数学 GSM8K | 87.5% | ~75 | 达标 |
| 中文 C-Eval | 30% | ~90 预期 | 明显短板 |
注意,这是少量实测,仅供参考:本地是 0-shot、关思考、2-bit 量化、每项仅 8-15 题的小样本;官方为全量测试,两者协议不同。上表只是量级参考,别当精确分数;实际性能以官网为准。
图 B-13-2(待出):本地 2-bit 实测与官方分数的四项对照——英文、代码、数学追平甚至反超,中文明显掉队
必须诚实的三点¶
- 样本很小(每项 8-15 题),误差 ±10% 以上,只能看量级,别当精确分数。
- 2-bit 对中文指令遵循损伤明显:C-Eval 上,模型会在数学题里无视"只输出一个字母"的指令、直接开始列算式。如果你主要用中文、对格式要求严格,2-bit 版会明显变笨;但英文问答、写代码、数学推理,几乎感受不到差别。
- 速度:解码 3.5-7 token/s(看专家缓存命中);预填充约 185 t/s,但首轮要预填充三万 token 的说明文字,第一次开口仍要等近三分钟。能交互,但离"流畅对话"还有距离。
顺手把 Claude Code 接上了¶
我还把 Claude Code 指到了本地模型上:claude -p "只回复OK",它真的回了 OK,exit 0。端到端打通。
实测下来,第一轮慢得吓人:Claude Code 的工具说明(system prompt)本身就有 31,086 token,预填充花了 169 秒(约 185 t/s),真正解码只用了 5-11 秒。也就是说,首轮那三分钟主要耗在巨型说明文字的预填充上,不是卡死了。换成 Docker 容器隔离跑,同样能通。
还撞到一个真相:本地服务是单槽位的实时 KV 缓存,只要有请求插队(哪怕 system prompt 只差一个 token),缓存就整体失效重来。所以在"跨会话、并发"的场景下,别指望缓存能复用。
两个坑,替你先试过了:
- 地址配置只在项目级配置文件里生效,用 shell 环境变量盖不住。我排查了半天,才发现本机全局的 Claude Code 配置指向了云端,请求带着本地 token 打过去直接 401。
- 非官方的模型名会被客户端拦下来(提示模型不认识)——要写成它认得的名字(比如
claude-sonnet-5),让本地服务去映射;本地服务本身接受任意模型名。
想自己试试?三步就能跑起来¶
看完别光心动——想自己上手,三步走(本节实测基于 48GB M4 Max,内存越大越舒服):
-
下模型(约 81GB):模型在
huggingface.co/antirez/deepseek-v4-gguf;国内直连被墙,把域名换成镜像hf-mirror.com(即hf-mirror.com/antirez/deepseek-v4-gguf),配aria2 -x 16,实测 96MB/s、13 分钟下完。选IQ2XXS那个 2-bit 文件(80.8 GiB),认准文件名带-0731的修复版——7-28 旧版有质量问题,下前先核对。 -
跑引擎:下载并运行 DwarfStar,按仓库 README 里的一行命令启动本地服务。起来后它是本地 HTTP 服务,默认
127.0.0.1:8000(--port可改),同时说两套协议: - OpenAI 兼容:
/v1/chat/completions、/v1/models、/v1/responses -
Anthropic 兼容:
/v1/messages——Claude Code 就走这个 -
接上客户端:先访问
http://127.0.0.1:8000/v1/models确认服务活着,再用 OpenAI 兼容接口发个问题(model填deepseek-chat)就能聊。想让 Claude Code 直接用它,就在项目里放一份 Claude Code 的配置文件,把ANTHROPIC_BASE_URL指到http://127.0.0.1:8000、ANTHROPIC_MODEL填claude-sonnet-5(服务端接受任意模型名),然后claude -p "只回复OK"能回OK,就说明端到端打通了。
三个提醒:
- 磁盘要留够:模型 81GB + 工作区。别像我,只剩 37GB 直接被卡住。
- 中文用户慎用 2-bit:中文指令遵循会明显变笨(C-Eval 只有 30%),但英文问答、代码、数学推理几乎无损。
- 下载校验别只信
--inspect:它只验文件大小、不验内容,坏文件也能通过。看到.aria2残留文件就重下。
这事到底意味着什么¶
个人开发者可以在消费级硬件上,跑起顶级开源模型的能力核心——英文推理和代码。
但它适合的,是"数据不出门、本地自用"这类诉求,不是和云厂商打价格战的生意。二手 M4 Mac mini 因为 AI 炒作价格已经翻倍(16G 版 3800-4300 元),"捡便宜收破烂"的窗口过去了。
我一直说的北极星是:每人一个 V4-Flash,永久免费,永住本地。这一节验证了第一步——能力核心无损、内存安全。但请注意,这是愿景,不是现状。