一个叫 Swiftlet 的 Swift + Metal 运行时正在重新定义"大模型能跑在哪"。它专门伺候 Qwen3-Next 和 Qwen3.5/3.6这一族 MoE 混合模型,核心思路很狡猾:只让模型的小型稠密核心常驻内存,真正的大头——那些路由专家权重——平时躺在 SSD 里,用到时才按需求流式取出来。
效果直接体现在数字上。在 M5Mac 上,Qwen3.6-35B-A3B 的4-bit 版本磁盘占18GB,但峰值内存只有2.6GB,解码速度7到11tok/s;更夸张的是 Qwen3-Next-80B-A3B 的4-bit 版,磁盘要42GB,可峰值内存竟压到4.3GB,速度4.5到5tok/s。35B 版本如今还能在 iPhone17上跑起来,内存约2.5GB,速度大约1tok/s——据开发者所知,这是该量级模型第一次在手机上原生运行,全程不碰服务器。

项目已经端到端可用,两个模型都能吐出经过验证的正确输出。开发者也坦白了一个代价:每个 token 实际只激活约3B 参数,所以这些模型在对话和写作时像个大模型,事实记忆上却还是个小模型。
拆开它的工作原理,门道在于调度的精细度。每一层会把每个 token 路由到512个专家里的10个(80B 版)或256个专家里的8个(35B 版)。Swiftlet 把稠密权重——注意力、DeltaNet 投影、路由器、共享专家、嵌入向量——牢牢钉在内存里,4-bit 下约1.3GB(35B)或2.5GB(80B)。成千上万个路由专家则被重新打包成固定步长的数据块,装进 .qpack 容器,取一个专家只需对 SSD 做一次 pread,不用 mmap,也不会搅动页缓存。热门专家缓存在一个有限大小的池子里,用 LFU 加近期性策略淘汰;实测命中率43% 到70%,而缓存大小对速度几乎没影响,因为 Apple 的 SSD 足以消化未命中带来的开销。
整个前向传播跑在 Metal 上,用的是运行时编译的着色器,所以构建时根本不需要 Metal 工具链,同一套代码能直接部署到 iOS。更有意思的是,75% 的层用 Gated DeltaNet 线性注意力,带着固定大小的循环状态,这意味着无论上下文多长,都不会长出不断膨胀的 KV 缓存——长文本对话的隐藏负担被悄悄卸掉了。
Swiftlet 不只一个命令行玩具,它给自己设计了四种身份。作为库,SwiftletCore 能塞进任意 macOS 或 iOS 应用,提供带流式增量输出和对话缓存的聊天能力;作为命令行工具,swiftlet chat 和 swiftlet generate 负责本地跑和基准测试,swiftlet-repack 能从 MLX 检查点直接构建容器,还支持从 Hugging Face 断点续传下载;作为服务器,swiftlet-server 在回环地址上提供 OpenAI 兼容的 chat-completions 接口,任何兼容 OpenAI 的聊天界面都能接上本地模型;作为应用,iOS 端的 Priv AI 把 SwiftletCore 嵌成了流式模型引擎,普通用户点一下下载就能聊。
正确性上,每一层前向传播都和 mlx-lm 参考实现逐层对拍,覆盖 f32和 int4量化形式,增量解码也与整序列结果比对,Metal 内核更是针对精确 CPU 参考反复验证,容器还能和源检查点做字节级校验——专家从缓存还是磁盘读,给出的回答完全一致。
它的灵感脉络也讲得很清楚:TurboFieldfare 先在 Mac 上验证了给 Gemma 做专家流式的可行性,Swiftlet 借鉴了其中若干公开设计经验,比如用 pread 把专家流式读进有界槽位池、用 LFU 加近期性淘汰、固定步长打包让一次读取即一次 fetch。但其余部分基本从零写起,约一万行 Swift 和 Metal 代码,硬啃下了架构完全不同的 Qwen 混合体系:Gated DeltaNet 线性注意力、门控 GQA,以及带共享专家的高稀疏 MoE。它甚至在 Metal 里实现了 MLX 风格的 int4/int8分组量化计算,用字节寻址内核和64位偏移撑起数 GB 的分片。
想上手机,要求并不苛刻:Apple Silicon、macOS14+ 或 iOS17+,再加上足够的 SSD 空间(35B 要18GB,80B 要42GB)。iPhone 端目前可在 App Store 的 Priv AI 应用里开启 Experimental Models 下载,该功能随新版本发布,尚在审核通道中,想立刻体验也可从源码自构建。整个项目以 Apache2.0释出,模型权重单独下载并遵循各自条款。