Swiftlet:在 Mac 上运行 80B 版 Qwen(内存 4.3 GB),在 iPhone 上运行 35B 版

来源:Hacker News 热门(buzzing.cc 中文翻译) 2026年8月4日 14:32 AIHOT 评分:81 精选
摘要:Swiftlet 是一个 Swift + Metal 运行时,可在普通 Apple 设备上运行 Qwen3-Next 和 Qwen3.5/3.6 MoE 混合模型,仅将小型稠密核心驻留内存,按需从存储流式加载路由专家权重。
# Swiftlet:在 Mac 上运行 80B 版 Qwen(内存 4.3 GB),在 iPhone 上运行 35B 版 - 来源:Hacker News 热门(buzzing.cc 中文翻译) - 作者:leonickson - 发布时间:2026-08-04 14:32 - AIHOT 分数:81 - AIHOT 标记:精选 - AIHOT 链接:https://aihot.virxact.com/items/cmsebb0mc0kn1ro2ejvmi5lg8 - 原文链接:https://github.com/leonickson1/Swiftlet ## 精选理由 用流式专家加载把 80B 模型塞进手机,具体 RAM 和速度数字让开发者能直接判断自己设备的上限,而不是停留在商详口号。 ## AI 摘要 Swiftlet 是一个 Swift + Metal 运行时,可在普通 Apple 设备上运行 Qwen3-Next 和 Qwen3.5/3.6 MoE 混合模型,仅将小型稠密核心驻留内存,按需从存储流式加载路由专家权重。 ## 正文 Swiftlet 在普通苹果设备(包括 iPhone)上运行 35B 和 80B 的 Qwen 模型。 Swiftlet 是一个基于 Swift + Metal 的运行时,专为 Qwen3-Next 和 Qwen3.5/3.6 MoE 混合模型家族设计。它只将模型的小型稠密核心常驻内存,并按需从存储中流式加载路由的混合专家(MoE)权重。效果如下: 模型 磁盘占用 峰值内存 解码速度(M5 Mac) Qwen3.6-35B-A3B,4-bit 18 GB 2.6 GB 7 至 11 tok/s Qwen3-Next-80B-A3B,4-bit 42 GB 4.3 GB 4.5 至 5 tok/s 35B 版本目前也能在 iPhone 17 上运行,占用约 2.5 GB 内存,速度约为 1 tok/s。据我们所知,这是该级别模型首次在手机上原生运行。 状态:端到端可用。两个模型都能生成正确且经过验证的输出。当前重点是内核速度(解码循环受调度限制,而非 IO 限制,因此有明确的优化空间)。需要坦诚说明一点:每个 token 只有约 3B 参数处于激活状态,因此这些模型在对话和写作上像大模型,但在事实记忆上像小模型。 快速上手:在 Mac 上试用 git clone https://github.com/leonickson1/Swiftlet.git && cd Swiftlet swift build -c release # Download the 35B container from Hugging Face (resumable): .build/release/swiftlet-repack \ --from-hf Leonickson/Qwen3.6-35B-A3B-qpack \ --output ~/models/qwen3.6-35b.qpack # Or the 80B (42 GB on disk, still only ~4.3 GB of RAM): .build/release/swiftlet-repack \ --from-hf Leonickson/Qwen3-Next-80B-A3B-qpack \ --output ~/models/qwen3-next-80b.qpack # Chat (applies the model chat template, disables the reasoning block, # keeps conversation state so follow-ups prefill only the new turn): .build/release/swiftlet chat ~/models/qwen3.6-35b.qpack \ "Who wrote One Hundred Years of Solitude?" "What language did he write it in?" # One-shot generation with stats: .build/release/swiftlet generate ~/models/qwen3.6-35b.qpack \ --gpu --chat --prompt "Explain expert streaming in one paragraph." # OpenAI-compatible server (loopback only): .build/release/swiftlet-server --model ~/models/qwen3.6-35b.qpack --port 8080 同样的命令也可以重新打包原始 MLX 检查点(--from-hf mlx-community/... 或 --source /path/to/checkpoint)。 要求:Apple Silicon、macOS 14+ 或 iOS 17+、足够的 SSD 空间存放容器(35B 需要 18 GB,80B 需要 42 GB)。 在手机上试用 35B 模型可在 App Store 上的 Priv AI 应用内于 iPhone 上运行:打开设置,然后进入 Experimental Models,下载模型即可。它会从存储中流式加载并在设备端进行对话,全程无需服务器参与。 Experimental Models 功能随最新版应用一同发布,该版本目前仍在 App Store 审核中,因此可能需要几天才会出现。如果你想今天就体验手机端效果,可以从源码构建应用:该应用在 leonickson1/localLLM 开源。将本仓库克隆到其旁边并命名为 swiftlet,打开 Xcode 项目,然后在你的 iPhone 上运行即可。 工作原理 这些模型每个 token 只激活约 3B 参数。每一层将每个 token 路由到 512 个专家中的 10 个(80B 版本)或 256 个专家中的 8 个(35B 版本)。Swiftlet 的做法是: 将稠密权重常驻内存:注意力、DeltaNet 投影、路由器、共享专家、嵌入向量。4-bit 下约 1.3 GB(35B)或 2.5 GB(80B); 将成千上万个路由专家(routed experts)重新打包为固定步长(fixed-stride)的数据块,存放在 .qpack 容器中,因此获取一个专家只需对 SSD 执行一次 pread,无需 mmap,也不会引发页缓存抖动; 在有限大小的池中缓存热门专家,采用 LFU 加最近使用(recency)淘汰策略。缓存大小对速度影响甚微(在相同吞吐量下实测命中率为 43% 至 70%),因为 Apple SSD 足以吸收未命中带来的开销; 整个前向传播在 Metal 上运行,使用运行时编译的着色器(runtime-compiled shaders),因此构建时无需 Metal 工具链,同一套代码可直接部署到 iOS。 75% 的层使用 Gated DeltaNet 线性注意力,带有固定大小的循环状态,因此这些层在任何上下文长度下都不会产生不断增长的 KV 缓存。 四种使用方式 Swiftlet 首先是一个库: Swift 包。将 SwiftletCore 添加到任何 macOS 或 iOS 应用中,即可使用 SwiftletSession 进行聊天,内置流式增量输出、对话缓存、带重复控制的采样,以及内存压力处理。 命令行工具。swiftlet chat 和 swiftlet generate 用于本地使用和基准测试,swiftlet-repack 用于从 MLX 检查点构建容器(支持直接从 Hugging Face 流式下载并支持断点续传)。 服务器。swiftlet-server 在回环地址上提供 OpenAI chat-completions API,因此任何兼容 OpenAI 端点的聊天界面都可以使用流式本地模型。 应用。iOS 上的 Priv AI 将 SwiftletCore 嵌入为其流式模型引擎。终端用户只需点击下载即可开始聊天。这里没有任何东西仅限于终端使用。该应用本身在 leonickson1/localLLM 开源,如果你想自行构建(将本仓库克隆到其旁边,命名为 swiftlet)。 正确性 前向传播的每一层(Gated DeltaNet 循环、门控 GQA 注意力、稀疏 MoE 路由)都通过逐层测试夹具(fixtures)与 mlx-lm 参考实现进行验证,涵盖 f32 和 int4 量化形式。增量解码与整序列处理结果进行比对验证。Metal 内核针对精确的 CPU 参考实现进行测试,快速与标量 GPU 内核均被验证可产生相同输出。容器可与其源检查点进行字节级验证。流式放置不会改变模型语义:专家从缓存或磁盘读取时给出的回答完全一致。 swift test 与 TurboFieldfare 的关系 TurboFieldfare 验证了在 Mac 上对 Gemma 采用专家流式(expert-streaming)方案的有效性,Swiftlet 怀着感激之情采纳了其已发表的若干设计经验:使用 `pread` 将专家流式读入有界槽位池而非 `mmap`;采用 LFU 加近期性(recency)进行驱逐;以固定步长打包专家,使一次读取即一次 fetch;通过将下载字节直接路由到其最终容器位置来完成安装;并在运行时编译着色器。 其余一切均在此从零构建,约 1 万行 Swift 和 Metal 代码,参考 mlx-lm 实现而非 TurboFieldfare 代码: 支持一个架构根本不同的模型家族:Qwen 混合架构,包含 Gated DeltaNet 线性注意力、门控 GQA,以及带共享专家的高稀疏 MoE(TurboFieldfare 运行的是 Gemma,一个经典密集 Transformer); 在 Metal 中实现 MLX 仿射 int4/int8 分组量化计算,采用字节寻址内核和 64 位偏移以支持数 GB 的分片,提供协作式 simdgroup GEMV 快速路径,以及显式 hazard 管理; 一个经过验证的 CPU 参考实现,以及用于把关每次内核变更的测试夹具基础设施; .qpack 容器和重新打包器、支持断点续传且带停滞恢复的 Hugging Face 流式安装器,以及下载取消功能; 聊天会话层:对思考型和非思考型 Qwen 变体的模板处理、带存在惩罚和频率惩罚的采样、最小长度和句子补全停止、带增量预填充的对话缓存,以及 iOS 内存压力协调; 端到端的 iPhone 支持,包括应用引擎集成。 colibrì 为缓存和放置策略的思考提供了启发。mlx-lm 始终是正确性参考。 Swiftlet 是与 Claude Code 协作构建的。 许可证 Apache 2.0。模型权重单独下载,并受其自身条款约束(Qwen 模型:Apache 2.0)。参见 THIRD_PARTY_NOTICES.md。