Swiftlet:在Mac上以4.3GB内存运行80B Qwen,iPhone上运行35B
Swiftlet是一个Swift+Metal运行时,通过流式加载MoE专家权重,让普通Apple设备(包括iPhone)运行大规模Qwen模型,大幅降低内存需求,实现端侧智能。
在普通Apple设备(包括iPhone)上运行35B和80B的Qwen模型。Swiftlet是面向Qwen3-Next和Qwen3.5/3.6 MoE混合模型家族的Swift+Metal运行时。
它仅将模型的小型密集核心常驻内存,并按需从存储中流式传输路由的Mixture-of-Experts权重。结果如下:35B模型也能在iPhone 17上运行,占用约2.5GB内存,目前速度约为1 token/s。
据我们所知,这是此类模型首次在手机上原生运行。状态:端到端可用。两个模型都能生成正确且经过验证的输出。当前重点是内核速度(解码循环受调度限制,而非IO限制,因此有明确的提升空间)。
需要诚实说明的一点是:每个token仅激活约3B参数,因此这些模型在对话和写作上像大模型,但在事实回忆上像小模型。
git clone https://github.com/leonickson1/Swiftlet.git && cd Swiftletswift build -c release# 从Hugging Face下载35B容器(可断点续传):
.build/release/swiftlet-repack \--from-hf Leonickson/Qwen3.6-35B-A3B-qpack \--output ~/models/qwen3.6-35b.qpack# 或80B(磁盘占用42GB,
内存仍仅约4.3GB):
.build/release/swiftlet-repack \--from-hf Leonickson/Qwen3-Next-80B-A3B-qpack \--output ~/models/qwen3-next-80b.qpack# 聊天(应用模型聊天模板,
禁用推理块,# 保留对话状态,使后续对话仅预填充新回合):.build/release/swiftlet chat ~/models/qwen3.6-35b.
qpack \"谁写了《百年孤独》?" "他用什么语言写的?
"# 带统计信息的一次性生成:.build/release/swiftlet generate ~/models/qwen3.6-35b.qpack \--gpu --chat --prompt "用一段话解释专家流。
"# OpenAI兼容服务器(仅限回环):
.build/release/swiftlet-server --model ~/models/qwen3.6-35b.qpack --port 8080同样的命令也可以重新打包原始MLX checkpoint(--from-hf mlx-community/... 或
--source /path/to/checkpoint)。要求:Apple Silicon、macOS 14+或iOS 17+、容器所需的空闲SSD空间(35B为18GB,80B为42GB)。
35B模型可在App Store上的Priv AI应用中运行于iPhone:打开设置,然后进入实验模型,下载模型即可。它从存储流式加载并在设备上聊天,无需服务器参与。实验模型功能随最新应用版本发布,该版本仍在App Store审核中,因此可能需要几天才会出现。
如果你想今天就体验手机端,可以从源码构建应用:应用在leonickson1/localLLM开源。将此仓库克隆到其旁边作为swiftlet,打开Xcode项目,然后在你的iPhone上运行。这些模型每个token仅激活约3B参数。
每一层将每个token路由到512个专家中的10个(80B)或256个专家中的8个(35B)。Swiftlet:- 保持密集权重常驻:注意力、DeltaNet投影、路由器、共享专家、嵌入。约1.3GB(35B)或2.
5GB(80B)以4-bit量化;- 将数万个路由专家重新打包为固定步长的数据块,放入.qpack容器,因此获取一个专家恰好是一次SSD读取,无mmap和页缓存抖动;- 将有界池中的热门专家缓存,采用LFU加最近使用驱逐策略。
缓存大小几乎不影响速度(在相同吞吐量下测得43%至70%的命中率),因为Apple SSD吸收了未命中;- 在Metal上使用运行时编译的着色器运行整个前向传播,因此构建时无需Metal工具链,同一代码可在iOS上运行。
75%的层使用Gated DeltaNet线性注意力,具有固定大小的循环状态,因此这些层在任何上下文长度下都不会有增长的KV缓存。Swiftlet首先是一个库:- Swift包。
将SwiftletCore添加到任何macOS或iOS应用,并使用SwiftletSession进行带流式增量的聊天、对话缓存、带重复控制的采样以及内置的内存压力处理。- CLI。
swiftlet chat和swiftlet generate用于本地使用和基准测试,swiftlet-repack用于从MLX checkpoint构建容器(包括直接从Hugging Face流式下载并支持断点续传)。
- 服务器。swiftlet-server在回环上提供OpenAI聊天补全API,因此任何与OpenAI兼容端点对话的聊天UI都可以使用流式本地模型。- 应用。iOS上的Priv AI将SwiftletCore嵌入为其流式模型引擎。
最终用户点击下载即可聊天。这里没有什么是仅限终端的。
应用本身在leonickson1/localLLM开源,如果你想自己构建(将此仓库克隆到其旁边作为swiftlet)。
前向传播的每一层(Gated DeltaNet循环、门控GQA注意力、稀疏MoE路由)都通过逐层fixture与mlx-lm参考实现进行验证,包括f32和int4量化形式。增量解码与全序列处理进行验证。
Metal内核针对精确的CPU参考进行测试,快速和标量GPU内核验证产生相同输出。容器可与其源checkpoint进行字节级验证。流式放置从不改变模型语义:专家从缓存或磁盘回答相同。
swift testTurboFieldfare在Mac上证明了Gemma的专家流式论点,Swiftlet采纳了其几个已发布的设计经验,并表示感谢:使用pread将专家流式传输到有界槽池而不是mmap,使用LFU加最近使用驱逐,以固定步长打包专家使一次获取即一次读取,
通过将下载的字节直接路由到最终容器位置进行安装,并在运行时编译着色器。
其他一切都在这里从头构建,约1万行Swift和Metal代码,参照mlx-lm参考而非TurboFieldfare代码:- 支持具有根本不同架构的模型家族:Qwen混合栈,具有Gated DeltaNet线性注意力、
门控GQA和带共享专家的高稀疏MoE(TurboFieldfare运行Gemma,一个经典的密集Transformer);
- Metal中的MLX仿射int4/int8组量化计算,支持多GB分片的64位偏移的字节寻址内核,协作simdgroup GEMV快速路径,以及显式危害管理;- 经过验证的CPU参考实现和门控每个内核更改的fixture基础设施;
- .qpack容器和重新打包器,支持断点续传的Hugging Face流式安装器,具有停滞恢复和下载取消功能;- 聊天会话层:针对思考和非思考Qwen变体的模板处理,带存在和频率惩罚的采样,最小长度和句子完成停止,带增量预填充的对话缓存,以及iOS内存压力协调;
- 端到端的iPhone支持,包括应用引擎集成。colibrì为缓存和放置策略思考提供了信息。mlx-lm始终是正确性参考。Swiftlet与Claude Code合作构建。Apache 2.0。
模型权重单独下载,并受其自身条款约束(Qwen模型:Apache 2.0)。参见THIRD_PARTY_NOTICES.md。
本文为机器翻译辅以 AI 润色,仅供参考。原始事实以原文为准。