SwiftLM
纯 Swift 实现的 Apple Silicon 本地大模型推理引擎,OpenAI 兼容 API,
加载项目详情…
本应用为开源项目,仅供学习研究,请遵守其开源协议。
纯 Swift 实现的 Apple Silicon 本地大模型推理引擎,OpenAI 兼容 API,
加载项目详情…
本应用为开源项目,仅供学习研究,请遵守其开源协议。
想象一下这样的场景:你在咖啡馆里写代码,身边没有 GPU 服务器,却突然需要测试一个 7B 参数的模型——传统方案是连云端 API,但存在隐私风险(数据出境)和延迟问题。SwiftLM 给出了一个截然不同的答案:直接在 Apple Silicon 上,用纯 Swift 代码跑起完整的本地推理服务。
这个项目来自 SharpAI 团队,背后是一群对性能有极致追求的工程师。他们的核心痛点很明确:Python 的 GIL(全局解释器锁)让 mlx-lm 库在多线程场景下形同虚设,而 llama.cpp 虽是 C++ 高性能方案,但其 GGUF 量化格式对于 Apple 生态的开发者来说,集成成本依然不低。SwiftLM 干脆另起炉灶,用 Swift 从头构建推理引擎,直接调用 Metal GPU,既绕过了 GIL,又实现了与 Apple 硬件的原生对接。
SwiftLM 的代码架构分五个核心层次,每一层都针对 Apple Silicon 的硬件特性做了深度优化:
第一层:MLX 统一内存张量引擎。SwiftLM 并未使用 Apple 官方的 ml-explore/mlx 仓库,而是维护了两个自有 fork:SharpAI/mlx 和 SharpAI/mlx-c。原因在于官方仓库不支持 SSD 外部内存映射执行——自定义的 ssd_streamer.mm 和 fence.air Metal 内核能直接将 NVMe SSD 上的 tensor 数据流式传输到 GPU,无需经过统一内存总线,这是支持 200GB+ 超大模型的关键。代码层面,Sources/MLXInferenceCore/ 下的 InferenceEngine.swift 负责模型生命周期管理,ModelDownloadManager.swift 实现 HuggingFace 模型下载与本地存储。
第二层:HuggingFace 桥接层。通过 swift-transformers 库和自定义 HubDownloader/TransformersTokenizerBridge,SwiftLM 能直接消费 HuggingFace 格式的 safetensors 权重,模型下载、tokenizer 加载、chat template 格式化全部自动化。开发者只需要一行 --model mlx-community/Qwen2.5-3B-Instruct-4bit,剩余全部交给引擎处理。
第三层:推理核心与采样控制。核心采样逻辑在 Sources/SwiftLM/Server.swift(140KB)中实现,暴露了 /v1/chat/completions、/v1/completions、/health、/v1/models 四个端点,完全兼容 OpenAI API 规范。支持的采样策略包括 temperature、top_p、top_k、min_p、repetition_penalty,以及 SwiftLM 特有的 per-request kv_bits(4/8位 KV cache 量化)。
第四层:极速优化模块——DFlash、TuboQuant、SSD Streaming。这是 SwiftLM 区别于其他 MLX 推理方案的核心竞争力:DFlash(Sources/DFlash/)实现块级投机解码,用小 draft 模型预测大模型输出,数学上严格遵循 Leviathan 等人的概率拒绝采样定理;TurboQuant 在 KV cache 上应用 3-bit 非线性 Lloyd-Max 量化,在 100K 超长上下文时将 GPU 显存占用从 54.8GB 压缩到 26.4GB;SSD Streaming 通过跨投影批处理 + QD=24 并发 NVMe pread,将 122B MoE 模型的推理速度从 0.58 tok/s 提升到 5.91 tok/s(提升 10 倍)。
第五层:SwiftBuddy iOS 应用。除了服务端,SharpAI 还提供了同名 iOS 应用 SwiftBuddy,用纯 SwiftUI 实现模型管理、聊天界面和资源监控,无需任何 Python 或服务端,在 iPhone/iPad 上直接跑 MLX 推理。
Apple Silicon 的统一内存架构固然强大,但 122B MoE 模型远超任何单台设备的物理内存。SwiftLM 的解法是 SSD Streaming:通过自定义 Metal kernel 将 NVMe SSD 作为第三级存储层,模型权重按需从 SSD 流式加载到 GPU,而非全部常驻统一内存。实测 M1 Ultra 64GB 机器上,Qwen3.5-122B 仅需 ~10.6GB 常驻内存,生成速度 5.91 tok/s,内存全程无交换。
处理 100K token 上下文时,FP16 格式的 KV cache 显存占用随序列长度线性增长。TurboQuant 在第 2048 个 token 后自动激活,对 K-cache 使用 3-bit PolarQuant + 1-bit QJL(Walsh-Hadamard 旋转后),对 V-cache 使用 3-bit PolarQuant,总计 ~3.5 倍压缩率。实测 100K 上下文时,GPU 显存从 54.3GB 降至 26.4GB,首 token 时间(TTFT)从 63.11s 降到 33.95s。
MoE 模型每次推理只激活少数"专家"(expert)层,但每次 token 生成都需要从 SSD 读取一组不同的 expert 权重。SwiftLM 通过运行时 top-k expert 选择减少 SSD I/O 操作数,并通过异步预取机制利用 GPU 计算窗口期预先加载下一批 expert——实测 90% 的 expert 读取命中 OS 页面缓存,无需真正触发 SSD 读操作。
SwiftLM 的使用哲学是"零配置":下载预编译二进制,解压运行,不需要 conda 环境,不需要 Python,不需要 Docker:
tar -xzf SwiftLM-<version>-macos-arm64.tar.gz
./SwiftLM --model mlx-community/Qwen2.5-3B-Instruct-4bit --port 5413
对于 122B+ 超大 MoE 模型,加 --stream-experts 开启 SSD streaming;加 --turbo-kv 开启长上下文 KV 压缩。SwiftBuddy iOS 应用则为移动端提供了图形化入口,支持本地模型管理和实时聊天,配套 Tab UI 设计(Chat · Models · Settings)。
SwiftLM 并非银弹。首先,它仅支持 Apple Silicon,对 Linux/Windows 用户毫无价值。其次,从源码编译需要手动安装 Metal Toolchain,cmake 和 Metal shader 编译耗时较长。第三,SwiftLM 维护了独立的 MLX fork,每次 Apple 官方 MLX 更新都需要手动同步上游,长期维护成本不容忽视。最后,DFlash 投机解码在 MoE 模型上因贪心解码容易陷入低熵吸引子,该问题已在 README 中明确标注为"不适合生产环境"。
SwiftLM 的出现标志着端侧大模型推理正式进入"原生 Apple Silicon 时代"。在此之前,Apple 开发者想要本地跑 AI 模型,要么依赖 Python 生态的 mlx-lm(受 GIL 限制),要么借助 llama.cpp 的桥接层(增加一层转换开销)。SwiftLM 第一次让 MLX 模型以原生 Swift 二进制的方式在 macOS/iOS 上运行,省去了 Python 运行时,为未来集成到生产级 Apple 应用(Xcode 插件、Final Cut Pro AI 辅助剪辑、Safari AI 功能)奠定了工程基础。