跳转至

第 16 节 · 把 125B MoE 压进 16GB 内存

125B 参数的 MoE 大模型,通常意味着什么?云上按量付费的 API、至少 80GB 显存的服务器,或者一台被你独占的"模型专用机"。

但我把它压进了一台还要写稿、跑量化、开一堆应用的 Mac——内存预算只有 16GB。

Qwen3.8-Flash-Next 是 8 月 26 日刚开源的新模型:主模型 125B MoE,加上 51B 的 n-gram 记忆模块,总量约 176B。4-bit 量化后权重 103.8GB,够塞满很多人的整台电脑。

这是这本书本地模型这一章的第一手实操篇:16GB 内存上限、5.1 tok/s、系统空闲 84-85% 全程零压力。所有数字都是这一台机器上实测出来的,不是 PPT 里的数字。

图 B-16-1(待出):一台还要干别的活的 48GB Mac,模型只拿走 16GB,其余留给写作和量化

为什么偏要在 16GB 上限下跑

先交代约束。这台机器是 48GB 内存的 Mac,日常同时干三件事:内容生产、量化数据采集、模型推理。

它和"模型专用机"有一个本质区别:不能为了模型占光内存,系统得留足余量给别的活。

按常规方式让 103.8GB 权重全部常驻,48GB 机器连模型都装不下,更别说共存。所以目标不是"跑得多快",而是:

先证可行:在不影响其他任务的前提下,125B 能不能在本地真正跑起来?

凭什么 125B 塞进 16GB:MoE 稀疏 + SSD 按需读取

能塞进来,靠的是模型自己的两个结构特征,不是魔法。

第一,主模型是 MoE。 48 层、每层 512 个专家,每个 token 只路由到其中 10 个。真正参与计算的约 6B 参数,其余专家这轮不干活——96% 的"脑子"在睡觉,醒着的只有 6B。

第二,n-gram 记忆模块访问极稀疏。 它是 3-gram 哈希查表,约两千万桶,生成时只按当前字串查少数几行;表本身占约 32GB,但每次实际读取得很少。

于是用 slotstream 引擎(MLX 实现,面向低内存 Apple Silicon 设计),把权重分成三部分处理:

  • 模型主干约 3.8GB:常驻内存
  • 专家权重约 68GB:按需从 SSD 读取
  • n-gram 记忆表约 32GB:按需从 SSD 读取

图 B-16-2(待出):103.8GB 权重被拆成三块——常驻的 3.8GB、按需读的 68GB 专家、按需读的 32GB 记忆表

启动命令只加一个参数:--memory-gb 16。16GB 是给进程设的内存上限,不是实际占用——专家用到才加载,进程空闲时 RSS 只有 2.5GB。

实测:11 个真实场景,全数记录

先看基础性能。写作、推理这类单轮短输入任务上:

指标 实测值
解码速度 约 5.1 tok/s
冷启动至首 token 约 3.8s
进程实际内存(空闲) 约 2.5GB
系统内存空闲率 84-85%(采集全程稳定)
有效上下文 32,768 tokens(实测可用)

跑模型期间,系统还留着 30GB 以上给别的任务。这是它和"模型专用机"方案最大的区别。

接着是 11 个真实任务,覆盖写作、推理、代码、多轮、长上下文、工具调用六类,全部用日常提示词:

场景 墙钟 生成 token 速度
公众号开头写作 64.6s 308 4.8 tok/s
小红书种草笔记 57.3s 280 4.9 tok/s
标题生成 35.9s 150 4.2 tok/s
数学题(水池注水) 53.2s 220 4.1 tok/s
逻辑悖论分析 65.7s 280 4.3 tok/s
多角度分析 46.1s 219 4.8 tok/s
代码生成(异步下载器) 73.3s 350 4.8 tok/s
代码解释 54.9s 200 3.6 tok/s
工具调用 + 多步回填 26.6s — 补丁功能
5 轮多轮对话 165.7s 695 4.1 tok/s
长上下文问答 60.2s 180 3.0 tok/s

图 B-16-3(待出):11 个真实场景的实测速度分布——写作、推理、代码、多轮、长上下文、工具调用

三个意外之喜,值得单独说。

写作质量在线。 让它写公众号开头,它给自己写的那段,几乎可以直接用:

"当朋友圈还在为'云端调用 API'的便捷性沾沾自喜,或是对本地部署 7B、8B 小模型感到些许成就感时,我刚刚完成了一项几乎被业界视为'不可能'的工程挑战……"

小彩蛋:它把"用现成的流式加载引擎跑通"描述成了"深度重构 MoE 架构的路由机制"——这是模型式夸张,只当写作样本看,不作技术事实。

多轮对话越聊越快。 5 轮对话上下文从 17 token 涨到 687 token,第 5 轮反而比第 4 轮快(29.4s vs 50.1s)。原因是引擎缓存了算过的部分,后续轮只处理新增内容。

工具调用跑通了。 原版引擎对 tools 字段直接返回 400,本地 fork 源码打了补丁。现在它能发起标准工具调用:17.9s 发出 get_weather({"city":"北京"}),工具结果回填后 8.7s 生成回答。这意味着它能接进基于工具调用的应用。

再补一个细节:开启思考模式(enable_thinking)后,推理过程可见。水池注水题它会先算 ¼ + ⅙ = 5/12、得 2.4 小时,再检查隐含陷阱,正式回答"2 小时 24 分钟注满"。结论能核查,对要验证判断依据的场景很有用。

瓶颈不在内存带宽,在计算侧

跑长文时顺手采了一组样:生成期间物理磁盘读取接近 0(专家命中缓存或系统页缓存),进程 CPU 约 65%。

再算一笔账:每 token 约 200ms,远高于内存带宽下限——约 6B 激活参数按 4-bit 折算约 3GB,按本机约 546GB/s 带宽,理论上限约 5ms/token(约 180 tok/s)。

结论:当前 5.1 tok/s 的瓶颈在计算侧,不在内存带宽,也不在 SSD。

原因指向 MoE 稀疏路由的执行效率:从每层 512 个专家里挑 10 个做矩阵运算,调度开销大,缺针对性的 grouped-GEMM 内核。这与引擎作者的口径一致("compute is the bulk of that time, closing it means a grouped-GEMM kernel")。

所以:换更高内存带宽的硬件,对这套配置提速有限。 真正可行的方向是等引擎内核优化、换计算路径更成熟的引擎,或用专家裁剪模型减少单次计算量。

图 B-16-4(待出):每 token 约 200ms 与内存带宽理论上限约 5ms 的差距——瓶颈卡在计算侧,不在带宽

与同类方案对比:全量流式 vs 专家裁剪

公开记录里有人用另一套方案跑同一个模型:REAP 专家裁剪版(每层专家 512 裁到 288)+ oMLX 引擎,主模型约 39GB 常驻,只把 n-gram 表放 SSD,解码约 26-29 tok/s。

两套方案没有优劣,本质是内存占用与速度的取舍:

项目 全量流式(这一节) 专家裁剪 + 常驻(公开实测)
模型 全量 512 专家 裁至 288 专家(HumanEval 93.9 → 91.5%)
内存占用 上限 16GB,实际约 2.5GB 约 39GB
解码速度 约 5.1 tok/s 26-29 tok/s
实际可用上下文 32,768 tokens 约 8,200 tokens
系统余量 约 30GB 数 GB

图 B-16-5(待出):全量流式与专家裁剪的取舍——一边是内存,一边是速度

怎么选,看机器的定位。只服务模型推理,常驻方案在速度上明显占优;要同时干别的活,全量流式用速度换系统可用性。 这一节选的是后者,因为这台机器是"一人公司多任务"。

实现过程中的坑:四个 + 一个花絮

部署踩的坑,比正文任何一个数字都真实。

第一个坑,网络墙。 权重托管在 HuggingFace,这个域名在当前网络不可达。走 hf-mirror 镜像下载,再用 aria2 多连接并行破单连接限速:单连接约 0.25MB/s,并行后实测能到 580MB/s;断了还能断点续传。

第二个坑,镜像限流。 镜像对单 IP 有传输量限制,连续下载约 9GB 后速度掉到 0.5MB/s 左右。解法是让下载工具无限重试,等限流窗口恢复再继续。

第三个坑,依赖构建。 从源码编译引擎时 SwiftPM 要拉 GitHub 依赖,但镜像对 git tags 支持不全,版本解析失败。最后用 Package.resolved 锁定依赖版本绕过。

第四个坑,工具调用。 原版引擎对 tools 请求字段直接返回 400。fork 源码补了支持:请求放行、输出 XML 解析、流式增量、超长提示自动截断。

一个花絮:它不认识自己。 问它是什么型号,它答不上来——模型训练数据的截止时间早于它自己的发布(2026-08-26 开源),知识库里根本没有自己。

结论与复现:三步跑通

四个结论,都能被上面的数字撑住:

  1. Qwen3.8-Flash-Next(125B MoE)可以在 16GB 内存上限下运行,系统内存保持 84-85% 空闲,不影响其他任务。
  2. 解码约 5.1 tok/s,适合写作、推理、代码生成这类"输出较长但可等待"的任务;不适合实时对话和高频迭代的 agent 场景。
  3. 当前瓶颈在计算侧,提升内存带宽没有显著收益;提速要等引擎内核优化或模型裁剪。
  4. 思考模式让推理过程可见,方便核查结论依据。

一句话定位:它是"写手"和"分析师",不是"即时聊天机器人"。 对内容创作者来说,这恰恰是最实用的位置。

复现只要三步,需要一台 Apple Silicon Mac(macOS 14+,约 110GB 磁盘):

  1. 安装 slotstream 引擎
  2. 下载权重(约 104GB;可走镜像 + aria2 断点续传)
  3. slotstream serve --memory-gb 16 --port 11435,接任意 OpenAI 兼容客户端

实验数据包、样本、原始记录都留着,可以直接核对。但模型权重已在 9 月 8 日因为磁盘满被删掉——所以这套结果可复核、不可一键复跑;想自己复现,得重新下一遍那 104GB 权重。

数据说明

  • 全部性能数字来自 2026-09 单机实测:M4 Max / 48GB RAM / macOS 26.6.2 / slotstream v0.1.10(本地 fork,含工具调用补丁)/ 4-bit 权重 103.8GB / --memory-gb 16。
  • 11 个场景的原始记录、推理样本都已归档,可以复核。
  • 数据包保留,但模型权重已于 2026-09-08 因磁盘满删除,本节的复现性因此受限。