Show HN:开源引擎让 Gemma 4 26B 模型在任意 M 系列 Mac 上仅用 2GB 内存运行
约 2 GB 内存即可运行 Gemma 4 26B-A4B 推理
专为 Apple Silicon Mac(包括 8 GB 内存版本)打造的定制 Swift + Metal 运行时。
快速上手 · 本地服务器 · 基准测试 · 贡献结果 · 工作原理 · 实验记录 · 参考资料
内存越来越贵了。所以我给一个 260 亿参数的模型只配了大约 2 GB 的预算。
TurboFieldfare 运行经过指令微调的 Gemma 4 26B-A4B 时,无需将整个 14.3 GB 模型加载到内存。它只将共享的 1.35 GB 核心和 FP16 KV 缓存保留在内存中,然后按需从 SSD 流式加载每个 token 所需的专家模块。这使得该模型可以在 8 GB 内存的 Mac 上运行。
运行时、流式安装器、命令行界面和原生 Mac 应用均使用 Swift 和 Metal 编写。TurboFieldfare 是专为特定模型设计的,而非 MLX 或 llama.cpp 的封装。精心整理的实验记录汇总了 103 项涵盖内核、缓存、I/O、预填充和解码的测量结果。
试试看
git clone https://github.com/drumih/turbo-fieldfare.git cd turbo-fieldfare swift build -c release .build/release/TurboFieldfareMac
首次运行时,Swift Package Manager 会下载并构建分词器所需的 Swift 包。完整的 release 构建包含前台 Mac 应用及其配套的 decode-service 可执行文件。
打开应用后,选择 Download,让 TurboFieldfare 获取并重新打包指定的模型(约 15 GB)。准备就绪后,选择 Load Model,输入提示词,然后点击 Generate。
概览
| 指标 | 数值 |
|---|---|
| 模型 | Gemma 4 26B-A4B IT,总参数量 26B,每 token 约 3.88B 活跃参数 |
| 权重 | MLX 仿射 4-bit,分组 64;8-bit 路由器;4-bit 共享和路由专家 |
| 内存 | 权重约 2 GB,4K KV 缓存 |
| 存储 | 纯文本模型安装后约 14.3 GB |
| 硬件 | Apple Silicon Mac;8 GB 内存 |
| 平台 | macOS 26,Metal 4,Swift 6.2 |
| M2 实测解码 | 5.1-6.3 tok/s(8 GB M2 MacBook Air) |
| M5 实测解码 | 31-35 tok/s(24 GB M5 Pro) |
实测结果仅供参考,并非性能上限。提示长度、生成长度、页面缓存状态和硬件都会影响吞吐量。如需在其他 Apple Silicon Mac 上测试,请参考社区基准测试指南。
使用 TurboFieldfare
TurboFieldfare 提供原生 Mac 应用、命令行界面和实验性的回环 OpenAI 兼容服务器。它们共用同一个 .gturbo 模型目录,但同一时间只能运行一个拥有模型的产品。
Swift 包暴露了六个产品:
| 产品 | 用途 |
|---|---|
TurboFieldfare |
包含运行时和 Metal 内核的 Swift 库 |
TurboFieldfareMac |
用于安装和生成的原生 Mac 应用 |
TurboFieldfareDecodeService |
Mac 应用使用的单次本地模型和 Metal 所有者 |
TurboFieldfareCLI |
命令行指令聊天和原始补全 |
TurboFieldfareServer |
回环 OpenAI 兼容的 Chat Completions 服务器 |
TurboFieldfareRepack |
流式模型安装器和安装验证器 |
系统要求
- Apple Silicon 芯片的 Mac;已验证的目标机型是 8 GB 内存的 M2 MacBook Air
- macOS 26 及 Metal 4
- Xcode 26 和 Swift 6.2 或更新版本
- 约 14.3 GB 的可用存储空间用于安装模型
- 首次安装模型时需要网络连接
该软件包仅支持 arm64 架构。不支持旧版 macOS 和 Metal 版本。
向模型提问
Mac 应用会将你的输入视为指令,并自动处理 Gemma 的聊天格式。只需描述任务,并包含模型所需的任何上下文即可。
生成参数默认温度为 0.2,Top-K 为 64,Top-P 为 0.95。将温度设为 0 可获得确定性的贪婪输出。模型仍可能出现重复或给出错误答案,因此请检查重要结果。
TurboFieldfare 仅支持文本。应用和命令行界面支持用户和模型消息,以及可选的系统指导;它们不暴露或执行工具。回环服务器接受函数工具声明,并返回模型生成的工具调用,供客户端授权和执行。不支持图像、音频和视频。
Mac 应用
克隆仓库,然后从根目录运行应用:
swift build -c release .build/release/TurboFieldfareMac
构建完整软件包,以便应用及其配套的解码服务都可使用。从此检出目录启动时,应用会将模型存储在 scratch/gemma4.gturbo 中。
安装模型
首次启动时,应用会检查可用存储空间,并显示下载和安装后的大小。选择 下载 开始。
安装程序不会在本地生成完整的源检查点。它会从固定的 Hugging Face 版本中流式传输所需的字节范围,并在数据到达时直接将其重新打包成 .gturbo 布局。这避免了在磁盘上保留第二个完整检查点,并限制了临时内存的使用。
首次安装会通过 Hugging Face 的范围请求传输约 15 GB 数据。网络速度和 Hugging Face 的响应时间各不相同,因此可能需要一些时间。完成的 .gturbo 安装占用约 14.3 GB 空间,并且只有在其清单和文件哈希值验证通过后才会被接受。安装过程不会将模型加载到内存中。
加载并生成
安装完成后:
- 选择 加载模型。
- 在编辑器中输入提示词。
- 选择 生成,或按 Command+Return。
- 点击停止按钮或按 Escape 可提前结束生成。
状态栏会显示生成进度、解码速度和内存使用情况。右侧面板可配置采样参数、上下文长度、专家缓存槽位和运行时选项。详细说明和默认值请参阅 运行时控制。
命令行界面
CLI 需要使用已有的 .gturbo 安装目录。如果你已通过 Mac 应用安装模型,它位于 scratch/gemma4.gturbo。否则,通过命令行安装:
swift run -c release TurboFieldfareRepack \ --output scratch/gemma4.gturbo \ --overwrite
继续被取消或中断的下载:
swift run -c release TurboFieldfareRepack \ --output scratch/gemma4.gturbo \ --overwrite \ --resume
删除已保存的下载状态:
swift run -c release TurboFieldfareRepack \ --discard-partial \ --output scratch/gemma4.gturbo
运行时只接受包含最终 manifest.json 的完整 .gturbo 目录。
验证现有安装(不加载模型):
swift run -c release TurboFieldfareRepack \ --verify-install \ --input-gturbo scratch/gemma4.gturbo
指令式对话
将聊天消息放入 JSON 数组,通过 --messages-file 传入:
[
{"role": "user", "content": "解释为什么分块预填充能在控制内存的同时减少首 token 延迟。"}
]
swift run -c release TurboFieldfareCLI \ --model scratch/gemma4.gturbo \ --messages-file messages.json
此方式与 Mac 应用的消息格式相同。CLI 的响应上限通过 --max-new 设置,默认为 1024 个 token。Mac 应用则可生成至所选上下文窗口填满为止。
原始补全
--prompt 参数用于原始补全和可复现的对比测试。它会直接将文本传给模型,不经过聊天格式化。指令-回复对话请使用 --messages-file。
swift run -c release TurboFieldfareCLI \ --model scratch/gemma4.gturbo \ --prompt "The capital of France is" \ --max-new 64 \ --temperature 0
这个示例特意请求了一个短贪心补全结果。
常见的生成选项包括 --max-context、--temperature、--top-k、--top-p、--repetition-penalty、--seed 以及可重复使用的 --stop 字符串。公共 CLI 使用生产运行时的默认值。运行以下命令查看完整选项列表:
swift run -c release TurboFieldfareCLI --help
生成的文本输出到标准输出,计时统计信息输出到标准错误;在脚本中添加 --quiet 可隐藏该页脚信息。
本地 OpenAI 兼容服务器
构建服务器并指向已安装的模型:
swift build -c release --product TurboFieldfareServer .build/release/TurboFieldfareServer \ --model scratch/gemma4.gturbo
服务器监听 http://127.0.0.1:8080/v1,支持聊天补全、流式传输、函数工具和单前缀提示复用。客户端必须授权并执行每次工具调用。请将服务器保持在回环地址上运行;它没有远程认证或 TLS 支持。
关于测试请求、Python 和 OpenCode 配置、提示复用、工具处理以及支持的 API 子集,请参阅 本地服务器 文档。
测试与贡献
串行运行公共测试套件:
Scripts/test.sh
在启动模型运行前,请关闭内存密集型应用并检查 memory_pressure -Q。如果报告空闲内存不足,请推迟运行。每次只运行一个 TurboFieldfare 应用、解码服务、CLI、服务器、测试或其他本地模型进程。
如需贡献可比较的性能结果,请遵循社区基准测试指南。
推理引擎的工作原理
在每个 Transformer 层,Metal 利用常驻权重计算注意力(attention)和路由器(router)。CPU 根据路由器选出的前 8 个专家 ID,对照该层的 16 槽 LFU 缓存进行规划,然后通过 Metal 可见缓冲区中的有界并行 pread 调用来填充缓存缺失。在这些读取操作运行的同时,Metal 计算常驻共享专家分支,最后将共享输出和路由输出合并。
提示预填充(prompt prefill)使用最多 128 个 token 的块,这样一次获取的专家可以服务多个行。生成过程则逐 token 重复路由层循环。安装器遵循同样的有界内存规则:它直接将远程范围重新打包到 .gturbo 中,而无需暂存完整的分片或张量。
有关模型架构的直观介绍,请参阅 Maarten Grootendorst 的 Gemma 4 可视化指南。
系统设计 文档解释了 .gturbo 布局、内存所有权、预填充、路由器交接、cb1/io/cb2 阶段、Metal 内核以及正确性不变量。
状态与范围
TurboFieldfare 目前包含:
- 远程流式重新打包为
.gturbo模型格式 - 经过指令微调的 Gemma 4 26B-A4B,带有经过验证的纯文本聊天格式
- 4 位 MLX 仿射嵌入、注意力、共享专家和路由专家权重,以及 8 位路由器
- 用于量化 GEMV、注意力、MoE、归一化、RoPE、采样和生产融合的自定义 Metal 内核
- 基于 SSD 的路由专家流式传输,带有有界专家缓存
- 分块单提示预填充和逐 token 生成
- FP16 KV 存储,为 25 个滑动窗口层提供有界循环存储,为 5 个全注意力层提供线性存储
- 精确的 split-K/V 解码注意力,具有独立的归一化 K 和 V 路径
- 一个 Swift 库、流式安装器、命令行界面、回环 OpenAI 兼容服务器,以及一个带有一次性本地解码服务的原生 SwiftUI/AppKit Mac 应用
当前范围是在至少 8 GB 内存的 Apple Silicon Mac 上,对固定的 Gemma 4 26B-A4B 指令检查点进行纯文本推理。
未来工作
- 开发 iPhone 和 iPad 应用,并在移动硬件上测试推理速度和内存占用。
- 对更多 Apple Silicon Mac 进行基准测试,特别是基础款 16 GB M4 Mac mini 及其他 8 GB 机型。
实验与技术文档
塑造 TurboFieldfare 的实验 详细介绍了最大收益、看似合理但失败的思路,以及在更严格验证下被推翻的早期结果。完整的 实验记录 保留了全部 103 条审核条目,作为可查阅的参考。
实用入口:
许可与模型条款
TurboFieldfare 的源代码和文档采用 Apache License 2.0 许可。
模型权重不包含在内。安装程序会从指定的 Hugging Face 检查点单独下载,权重受其原始条款约束。模型及 Swift 包许可审查详见 THIRD_PARTY_NOTICES.md。
TurboFieldfare 是一个独立研究项目,与 Google 无关联、未获其赞助或认可。
后记与项目名称
感谢您关注这个项目!
我是 Andrey Mikhaylov。你可以在 LinkedIn 上找到我。我是 TurboFieldfare 的作者,也是一名 iOS 和 Metal 工程师。我的工作主要涉及图像、视频以及设备端 AI。
我把这个项目献给我的妻子 Sasha,她是我认识的最支持我的人。即使在我最艰难的时刻,她也始终陪伴在我身边。她热爱野生动物,喜欢观鸟,还在我们当地的观鸟社区做志愿者。因为她,我也对鸟类和自然有了更深的亲近感。
TurboFieldfare 这个名字来源于田鸫,它是鸫科的一员,也是我最喜欢的鸟。它不是最引人注目或颜色最鲜艳的鸟,但它绝对有自己的个性和独特之处。我认为这个项目也是如此:它可能不是最实用的,但我用我最喜欢的工具(尤其是 Metal)在我最喜欢的领域——设备端机器学习推理——构建了它。它绝对有自己的个性和独特之处。
下次你出门时,摸摸草地,听听鸟鸣。有时候,这就是你能做的最美好的事情。如果可以的话,也请支持你当地的野生动物社区。他们做着重要的工作。
谢谢!




