ESC
AI 2 分钟阅读

Swiftlet:让普通苹果设备(包括iPhone)运行35B和80B参数的Qwen大模型

一个名为Swiftlet的开源项目发布,它是一个为Qwen混合专家(MoE)模型家族设计的Swift + Metal运行时。该技术通过按需从存储加载“专家”权重,而非全部加载到内存,成功让35B和80B参数的模型在M5 Mac和iPhone 17等普通苹果设备上流畅运行,标志着本地部署超大规模AI模型的一个实用化突破。

来源:GitHub

Platforms Swift Metal License App Store 35B 80B Built with Claude Code

在普通苹果设备(包括iPhone)上运行35B和80B的Qwen模型。

Swiftlet 是一个用于 Qwen3-Next 和 Qwen3.5/3.6 混合专家(MoE)模型家族的 Swift + Metal 运行时。它只将模型的小型密集核心保留在内存中,并根据需要从存储中流式加载路由的专家权重。结果如下:

模型磁盘空间峰值内存解码速度(M5 Mac)
Qwen3.6-35B-A3B, 4-bit18 GB2.6 GB7 到 11 tok/s
Qwen3-Next-80B-A3B, 4-bit42 GB4.3 GB4.5 到 5 tok/s

35B 模型也能在 iPhone 17 上运行,大约占用 2.5 GB 内存,目前速度约为 1 tok/s。必须提到 ANEMLL:他们在 2026 年初展示了在 iPhone 17 Pro 上流式运行 397B MoE 模型的概念验证。Swiftlet 的目标是下一步,让这类模型成为一款可在基础 iPhone 上安装的应用,并提供一个任何人都可以构建的开源运行时。

状态:端到端工作正常。两个模型都能生成正确、经过验证的输出。当前的重点是内核速度(解码循环受调度限制,而非 IO 限制,因此有明显的提升空间)。有一个期望需要坦诚说明:每个 token 只激活大约 3B 参数,所以这些模型聊天和写作像大模型,但回忆事实像小模型。

快速上手:在 Mac 上尝试

git clone https://github.com/leonickson1/Swiftlet.git && cd Swiftlet
swift 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(磁盘占用 42 GB,但内存仍只约 4.3 GB):
.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 \
  "Who wrote One Hundred Years of Solitude?" "What language did he write it in?"

# 一次性生成并统计信息:
.build/release/swiftlet generate ~/models/qwen3.6-35b.qpack \
  --gpu --chat --prompt "Explain expert streaming in one paragraph."

# OpenAI 兼容服务器(仅本地回环):
.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 模型可以在 iPhone 上运行,通过 Priv AI on the App Store:打开设置,然后选择实验性模型,下载模型。它从存储流式加载并完全在设备上聊天,无需服务器参与。

“实验性模型”功能在最新版本的应用中发布,该版本目前仍在 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);
  • 将数万个路由的专家重新打包到 .qpack 容器中的固定步长块中,使得获取一个专家恰好是一次来自 SSD 的 pread 操作,没有内存映射(mmap),也没有页面缓存抖动;
  • 在一个有界池中使用 LFU(最近最少使用)加新近淘汰策略缓存热点专家。缓存大小对速度影响很小(在相同吞吐量下测量到 43% 到 70% 的命中率),因为 Apple SSD 能吸收未命中;
  • 使用运行时编译的着色器在 Metal 上运行整个前向传播,因此构建时不需要 Metal 工具链,相同的代码可以部署在 iOS 上。

75% 的层使用固定大小循环状态的门控 DeltaNet 线性注意力,因此在任何上下文长度下这些层都不会有不断增长的 KV 缓存。

四种使用方式

Swiftlet 首先是一个库:

  1. Swift 包。 将 SwiftletCore 添加到任何 macOS 或 iOS 应用中,使用 SwiftletSession 进行聊天,支持流式增量更新、对话缓存、带重复控制的采样以及内置的内存压力处理。
  2. 命令行工具。 swiftlet chat 和 swiftlet generate 用于本地使用和基准测试,swiftlet-repack 用于从 MLX 检查点构建容器(包括直接从 Hugging Face 流式下载并支持恢复)。
  3. 服务器。 swiftlet-server 在本地回环上提供 OpenAI 聊天补全 API,因此任何可以与 OpenAI 兼容端点对话的聊天 UI 都可以使用一个流式本地模型。
  4. 一个应用。 iOS 上的 Priv AI 将 SwiftletCore 嵌入为其流式模型引擎。终端用户只需点击下载即可聊天。这里的一切并非仅限于终端。应用本身在 leonickson1/localLLM 上开源,如果你想自己构建(将本仓库克隆到其旁边,命名为 swiftlet)。

正确性

前向传播的每一层(Gated DeltaNet 递归、门控 GQA 注意力、稀疏 MoE 路由)都使用逐层夹具,在 f32 和 int4 量化形式下,与 mlx-lm 参考实现进行了验证。增量解码已通过与全序列处理对比验证。Metal 内核已根据精确的 CPU 参考进行测试,快速和标量 GPU 内核已验证能产生完全相同的输出。容器可以与其源检查点进行字节级验证。流式放置绝不会改变模型语义:一个专家无论从缓存还是磁盘加载,回答都完全相同。

swift test

与 TurboFieldfare 的关系

TurboFieldfare 在 Mac 上证明了 Gemma 模型的专家流式处理论点,Swiftlet 感激地采用了其已发布的一些设计经验:使用 pread 将专家流式传输到有界槽池而非内存映射、使用 LFU 加新近淘汰进行驱逐、将专家打包成固定步长使得一次获取是一次读取、通过将下载的字节直接路由到其最终容器位置来安装、以及运行时编译着色器。

其他所有部分都是在此从零开始构建,使用大约 10k 行 Swift 和 Metal 代码,基于 mlx-lm 参考实现编写,而非 TurboFieldfare 代码:

  • 支持具有根本不同架构的不同模型家族:使用门控 DeltaNet 线性注意力、门控 GQA 和带有共享专家的高稀疏度 MoE 的 Qwen 混合架构(TurboFieldfare 运行 Gemma,一个经典的密集 Transformer);
  • 在 Metal 中实现 MLX 仿射 int4/int8 分组量化计算,字节寻址内核支持 64 位偏移量以处理数 GB 的分片,支持协作 simdgroup 的 GEMV 快速路径,以及显式的冒险管理;
  • 经过验证的 CPU 参考实现以及为每次内核更改把关的夹具基础设施;
  • .qpack 容器和重新打包器、可恢复的 Hugging Face 流式安装器以及故障恢复和下载取消功能;
  • 聊天会话层:用于思考和非思考型 Qwen 变体的模板处理、带有存在和频率惩罚以及最小长度和句子完成停止的采样、带增量预填充的对话缓存,以及 iOS 内存压力协调;
  • 端到端的 iPhone 支持,包括应用引擎集成。

colibrì 为缓存和放置策略思考提供了信息。mlx-lm 是整个过程中的正确性参考。

Swiftlet 是使用 Claude Code 构建的。

许可证

Apache 2.0。模型权重需单独下载,仍受其自身条款管辖(Qwen 模型:Apache 2.0)。请参见 THIRD_PARTY_NOTICES.md。