M1 Max 跑 Qwen3.8 Flash-Next:从 15 到 31 token/s,再试到 128K
这轮最让我意外的结果,是我的 M1 Max 64GB、24 核 GPU,最后把 Qwen3.8 Flash-Next 跑到了每秒约 31 token。模型加载后,短问题通常半秒左右开始出字,接近 128K 的长输入也完整跑通了,后续追问还能复用缓存。
这是 2021 年那一代芯片。我原本也没指望它到现在还能运行这么大的模型,64GB 统一内存倒是又派上了用场。
我想要的本地模型,主要是拿来随意聊聊、写点东西、试一些表达更自由的内容。认真写代码和跑复杂 Agent,我已经有 Codex、Claude 等工具,不需要本地模型把它们全替掉。只要响应足够快、中文正常、偶尔能看图,就已经值得玩。
最后留下来用过的组合是 SC117 的 GSQ-RCO Abliterated Q2_0,加上针对 M1 优化的 DS4 Metal 引擎。从第一套方案到这个结果,中间换了引擎、量化和输入分块,也纠正了我对内存和上下文的几个判断。
先碰到的,是别人那台 M1 Max 为什么这么快
最初的 Uncensored 方案已经能正常回答,但速度大致在十几 token/s。聊天可以用,只是每次等它往外吐字,我总觉得这台机器还能再快一点。
后来看到一个 Reddit 实测帖,作者同样用 M1 Max、64GB 内存,报告 Q2_0 在短上下文下约 44 token/s,接近 400K 时还有约 35 token/s。
这和我手里的结果差得有点多。作者是 32 核 GPU,我的是 24 核;模型文件、输入内容和计时方式也有区别。我没有照着核心数去推一个“应该达到”的速度,先拿同一份本机权重,只换引擎。
作者采用的是 paperniuk/ds4 的 m1-flash-next 分支。我当时已有的模型和它预期的格式还有差异,需要补上 Q4_1 PLE 和带填充的 Q4_K 权重读取兼容,才能把同一份模型交给两个后端比较。这些是加载适配,提速主要来自分支里的 Metal 实现。
同权重、32K 上下文、相同分块大小、开启 MTP,按同一中文速度题测中位数:
| 引擎 | 生成速度 | 首字等待中位数 |
|---|---|---|
| 原先的 DS4 构建 | 15.41 token/s | 1.42 秒 |
| M1 优化分支 | 19.25 token/s | 1.29 秒 |
文中的本机性能来自 10 月 16 日的实验,生成速度按客户端收到首个输出之后的流式响应计时。token 不等于汉字,首字等待也不包含启动服务、加载模型的时间。
只换引擎,生成速度提高了约 25%。两边生成的区间合并函数都通过了 208 个边界和随机样例,中文短篇也都完整、连贯。这一步让我确认,原来的速度确实有改善空间。
换成更适合这套引擎的量化,才到了三十多
接下来试的是帖子里采用的 ISTA-DASLab GSQ-RCO 量化。
它的 Q2_0 名字很容易让人以为“全模型统一压成两位”。实际是混合精度:不同张量分到不同格式,尽量把有限的文件大小花在需要的位置。主权重约 37.6GB,另有约 28.8GB 的 n-gram/PLE 表。
旧方案的主权重约 51.2GB,加上旧 PLE 后体积更大。换成这套文件以后,下载量减少,运行时常驻的语言模型也从约 47.67GiB 降到了 36.43GiB,给上下文和临时计算腾出了不少余量。
我先保持分块为 256,原版 Q2_0 的中文速度中位数就到了 30.00 token/s。再把预填充分块提高到 2048,同一道约 17K token 的输入,首次出字从 75.10 秒降到 58.17 秒;短文本生成仍在 29~30 token/s 左右。
分块主要改变读入长文本的效率,不能把所有提速都归到它身上。旧权重在某轮较大的预填充里还出现过内存问题,缩到 chunk 64 才完成那组测试。新量化留下的内存余量,让较大分块也更容易用起来。
我还想保留 Uncensored 的方向,于是继续试了 SC117 的 Abliterated 版本。它沿用 GSQ-RCO 的布局,替换与拒答方向消融有关的张量,复用同一份 PLE 和单独的 MTP 文件。
这份主权重约 38.02GB,只比原版多一点。在 48K 上下文、chunk 2048 下,三次中文速度题分别是 31.31、31.29、31.44 token/s,中位数 31.31 token/s,首字约 0.49 秒。
原版和 SC117 的速度很接近。我选 SC117,主要因为中文、代码小题和单据识别都正常,方向也符合我想怎么玩本地模型。
六十多 GB 的文件,为什么能在 64GB 内存里跑
我一开始也卡在这里:主权重、PLE、MTP 和视觉编码器加起来接近 69GB,机器总共才 64GB,还得运行 macOS。
关键是这些文件参与计算的方式不同。
官方模型卡给出的规模是:语言模型约 125B 参数,每个 token 激活约 6B,另外还有约 51B 的 n-gram embedding 和 4B MTP。它采用稀疏专家和混合循环/注意力结构,每生成一个 token,不需要把所有专家都完整计算一遍。
大块的 PLE 则是查表。引擎从 SSD 上的第二个 GGUF 分片读取当下需要的行,不把整张 28.8GB 的表全部作为常驻 GPU 权重。这是磁盘文件总量超过内存以后仍然能运行的重要原因。统一内存让 CPU 和 GPU 共用这块容量,也免去了独显那种单独的显存容量限制。
一次请求大致这样走完:先把输入切成 token,分块做预填充,建立循环状态和注意力缓存;生成时,按路由选中的专家继续计算,并查出需要的 n-gram 行;MTP 提出后续 token 的草稿,主模型验证后接受其中合适的部分。下一轮对话如果前缀相同,就复用已有状态,主要处理新加进来的内容。
M1 优化分支还针对低位权重的矩阵向量运算、多个草稿的验证,以及长上下文的索引和注意力做了优化。分支说明里有具体实现。我的理解是,内存带宽、权重格式和状态复用都得配合起来,光看 GPU 核心数,很难猜中最后的速度。
最终 SC117 配置在 48K 时,语言侧内存计划约 40.61GiB;128K 时约 43.53GiB。这是引擎的计划值,不包含视觉塔和全部临时空间,不过已经能看出它为什么比旧方案宽松。
128K 能用,但先读七分钟要算进去
实际使用时,我遇到过一个很具体的报错:请求有 34,128 token,服务只配置了 32,768,直接返回 400。
后来加上图片理解,旧权重在 64K 配置下又碰到了 Metal 内存不足。当时把日常设置留在 48K。我还是惦记帖子里的 400K:既然同一代机器能做到那么长,我至少想试到 128K。
旧权重确实跑通了接近 128K 的输入,但需要临时提高 GPU 内存额度,首次读取约等了 16 分钟。换到新量化以后,同样规模的测试已经不需要提高这个额度。
最终 SC117 的结果是:
| 请求 | 实际输入 | 首字等待 | 结果 |
|---|---|---|---|
| 首次读入长文本 | 127,063 token | 427.84 秒 | 三处指定信息全部找回 |
| 在同一对话修改其中一项后追问 | 127,131 token | 0.64 秒 | 修改生效,另外两项保留 |
第一次约七分八秒,追问却不到一秒开始回答,之后仍有约 29 token/s。这两个体验差得很远,也正好说明了缓存的价值。
因此,我愿意把它拿来读一份会反复追问的长材料。每次都丢进一份全新的十几万 token 文本,等待还是很明显。这轮长输入主要是重复填充和三处信息检索,我没有继续追 400K,也没有拿它证明复杂 Agent 在 128K 下同样好用。
128K 那轮系统可用内存的低点约 5.3GB,也得给其他应用留位置。日常默认最终仍留在 48K,需要长上下文时再开。
中文、代码和看图,能做到哪一步
速度之外,我最关心的是中文有没有退化,以及本地模型能不能更自然地表达。
SC117 写的雨后海边短篇,指定的红伞、木栈道、末班公交和结尾都在,全文完整。三道写真提示词、成年情侣暧昧对话和观点表达题,也都正常回答,没有拒答。不过原版在这三题上同样没有拒答,这组体验不能量出消融到底多放开了多少。文风仍有常见的修辞套路,偶尔还会夹入英文词。
代码题是生成一个区间合并函数,要求处理相接边界,并且不改动输入。最终通过 208 个样例。这是一个函数的检查,足够说明我拿到了一段能执行的正确代码,还没到评价复杂编程 Agent 的程度。
图片理解用单独的 Q8 视觉编码器接起来。SC117 的中文单据测试,六项信息全对,首字约 10.27 秒,总耗时约 11.57 秒。更早那轮也识别过软件截图、地球照片和简单空间关系;双图里把 ORBIT 看成了 ORB,这种逐字细节还是得核对。
作为偶尔看截图、抄单据、描述照片的本地工具,我觉得已经基本可用。官方模型还支持视频,但我当时接通的 DS4 路径只实际测试了文字和静态图片,没有把几张按顺序输入的图当成原生视频测试。
最后清掉文件,是因为工作搬去了游戏本
到这一步,我对这台老 Mac 的结果已经很满意。短文本三十多 token/s、常用 48K、需要时能读接近 128K 的材料,还能偶尔看图,它已经是一套能继续拿来用的本地模型。
后来 RTX 5090 Laptop、64GB 内存的游戏本到了,我开始把推理工作搬过去。Mac 继续留作日常工作和交互端,游戏本通过局域网提供计算。
10 月 24 日回头整理,才发现 Mac 上为了这轮探索留下的当前权重、旧原版、旧 PLE、环境和缓存,已经占了约 141.3GB。其中很大一部分是实验时并排留下的旧文件,一套最终配置并不需要这么多。
这次我把 Flash-Next 的本机权重、环境和缓存清掉了,也在写完这篇记录后清理引擎实验目录。Image 还留着,游戏本上的模型也继续保留。
我原来一直觉得,下一次明显改善本地模型体验,可能得等换一台内存更多的新 Mac。这轮折腾让我愿意先多看一眼社区的引擎和量化:同一台 M1 Max,从十几到三十多 token/s,读长文本也从勉强挤进去变得有了余量。机器没换,实际能拿来做的事已经多了不少。
M1 Max 跑 Qwen3.8 Flash-Next:从 15 到 31 token/s,再试到 128K
https://blog.khan.moe/2026/10/24/M1-Max跑Qwen3.8-Flash-Next:从15到31-token每秒的本地探索/




