跳转至

第 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 上按需读取

技术路线和内存账本

把上面那句话拆开,是三个事实叠加:

  1. 激活参数少:每生成一个 token,只激活约 4% 的参数(13B / 284B)。绝大部分专家权重在这一刻是闲着的。
  2. 专家可以住硬盘:既然专家权重不是每次都用到,就不必常驻内存,可以放在 SSD 上按需加载;命中缓存就免读盘。
  3. 量化压缩体积:把路由专家压到 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 实测与官方分数的四项对照——英文、代码、数学追平甚至反超,中文明显掉队

必须诚实的三点

  1. 样本很小(每项 8-15 题),误差 ±10% 以上,只能看量级,别当精确分数。
  2. 2-bit 对中文指令遵循损伤明显:C-Eval 上,模型会在数学题里无视"只输出一个字母"的指令、直接开始列算式。如果你主要用中文、对格式要求严格,2-bit 版会明显变笨;但英文问答、写代码、数学推理,几乎感受不到差别。
  3. 速度:解码 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),缓存就整体失效重来。所以在"跨会话、并发"的场景下,别指望缓存能复用。

两个坑,替你先试过了:

  1. 地址配置只在项目级配置文件里生效,用 shell 环境变量盖不住。我排查了半天,才发现本机全局的 Claude Code 配置指向了云端,请求带着本地 token 打过去直接 401。
  2. 非官方的模型名会被客户端拦下来(提示模型不认识)——要写成它认得的名字(比如 claude-sonnet-5),让本地服务去映射;本地服务本身接受任意模型名。

想自己试试?三步就能跑起来

看完别光心动——想自己上手,三步走(本节实测基于 48GB M4 Max,内存越大越舒服):

  1. 下模型(约 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 旧版有质量问题,下前先核对。

  2. 跑引擎:下载并运行 DwarfStar,按仓库 README 里的一行命令启动本地服务。起来后它是本地 HTTP 服务,默认 127.0.0.1:8000(--port 可改),同时说两套协议:

  3. OpenAI 兼容:/v1/chat/completions、/v1/models、/v1/responses
  4. Anthropic 兼容:/v1/messages——Claude Code 就走这个

  5. 接上客户端:先访问 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,永久免费,永住本地。这一节验证了第一步——能力核心无损、内存安全。但请注意,这是愿景,不是现状。