TurboFieldfare:在Apple Silicon上以2GB内存运行Gemma 4 26B

仅需约2GB内存,即可运行Gemma 4 26B-A4B推理
专为Apple Silicon Mac打造的Swift+Metal专属运行时,8GB内存机型也能流畅运行。
快速开始 · 本地服务器 · 性能基准 · 提交测试结果 · 技术原理 · 实验研究 · 参考资料

内存成本日益高昂,于是我给这一260亿参数模型设定了约2GB的内存预算。
TurboFieldfare无需将完整的14.3GB模型载入内存,即可运行经过指令微调的Gemma 4 26B-A4B模型。它仅将1.35GB的共享核心参数与FP16键值(KV)缓存常驻内存,针对每个生成的token,仅从固态硬盘(SSD)流式加载所需的专家网络。正是这一机制让8GB内存的Mac也能运行该模型。
运行时、流式安装器、命令行工具(CLI)及原生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包管理器会下载并构建分词器所需的Swift包。完整的Release版本包含前台Mac应用及其配套的decode-service可执行文件。
打开应用后,选择「下载」,等待TurboFieldfare获取并重新打包固定版本的模型(约15GB)。准备就绪后,选择「加载模型」,输入提示词,点击「生成」即可。
| 指标 | 参数 |
|---|---|
| 模型 | Gemma 4 26B-A4B IT,总参数260亿,单token激活约38.8亿参数 |
| 权重 | MLX仿射4位量化,分组大小64;路由层8位量化;共享与路由专家网络4位量化 |
| 内存占用 | 约2GB权重 + 4K大小的KV缓存 |
| 存储占用 | 纯文本模型安装后约14.3GB |
| 硬件要求 | Apple Silicon Mac;8GB内存 |
| 平台要求 | macOS 26,Metal 4,Swift 6.2 |
| M2机型解码速度实测 | 8GB内存M2 MacBook Air可达5.1-6.3词元/秒 |
| M5机型解码速度实测 | 24GB内存M5 Pro可达31-35词元/秒 |
上述结果为参考基准,并非性能上限。提示词长度、生成文本长度、页缓存状态及硬件配置都会影响吞吐量。如需测试其他Apple Silicon Mac机型,请遵循社区基准测试指南。
TurboFieldfare提供三种使用方式:原生Mac应用、命令行工具,以及实验性的本地回环OpenAI兼容服务器。三者共用同一.gturbo模型目录,但同一时间仅能运行一个占用模型的程序。
Swift包包含6个组件:
| 组件 | 用途 |
|---|---|
TurboFieldfare |
包含运行时与Metal内核的Swift库 |
TurboFieldfareMac |
用于模型安装与文本生成的原生Mac应用 |
TurboFieldfareDecodeService |
Mac应用调用的单次本地模型与Metal资源管理进程 |
TurboFieldfareCLI |
支持指令对话与原生补全的命令行工具 |
TurboFieldfareServer |
兼容OpenAI Chat Completions接口的本地回环服务器 |
TurboFieldfareRepack |
流式模型安装器与安装验证工具 |
系统要求
- Apple Silicon Mac;已验证适配机型为8GB内存M2 MacBook Air
- 搭载Metal 4的macOS 26系统
- Xcode 26及Swift 6.2或更高版本
- 约14.3GB可用存储空间用于模型安装
- 首次安装模型需联网
本包仅支持arm64架构,不兼容旧版macOS与Metal。
使用Mac应用
Mac应用会将输入内容视为指令,自动处理Gemma的对话格式。只需描述任务需求,并提供模型所需的上下文信息即可。
生成默认参数为:温度值0.2、Top-K采样64、Top-P采样0.95。将温度值设为0可得到确定性贪心输出。模型仍可能出现重复内容或错误回答,重要结果请务必核查。
TurboFieldfare仅支持文本处理。应用与命令行工具支持用户消息、模型消息及可选的系统提示,但不支持工具调用功能。本地回环服务器可接收函数工具声明,并返回模型生成的工具调用请求,由客户端授权执行。暂不支持图片、音频与视频处理。
克隆代码仓库后,在根目录运行以下命令启动应用:
swift build -c release
.build/release/TurboFieldfareMac
需构建完整包,确保应用与配套的解码服务均可使用。从该代码目录启动时,模型将存储于scratch/gemma4.gturbo。
首次启动时,应用会检查可用存储空间并显示下载与安装后的文件大小。选择「下载」即可开始安装。
安装器不会在本地生成完整的源模型文件,而是通过固定版本的Hugging Face仓库流式获取所需字节段,接收后直接重新打包为.gturbo格式。这一设计避免了磁盘上存储完整模型副本,同时限制了临时内存占用。
首次安装需通过Hugging Face的分段请求传输约15GB数据。受网络速度与Hugging Face响应速度影响,安装耗时可能较长。完成安装后的.gturbo目录约占14.3GB空间,只有通过清单与文件哈希验证后才会被认可。安装过程不会将模型载入内存。
安装完成后:
- 选择「加载模型」
- 在输入框中输入提示词
- 点击「生成」,或按下
Command+Return快捷键 - 可点击停止按钮或按下
Escape键提前终止生成
状态栏会显示生成进度、解码速度与内存占用。右侧面板可配置采样参数、上下文长度、专家缓存槽位及运行时选项。详情与默认值请参考运行时控制。
使用命令行工具(CLI)
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 "法国的首都是" \
--max-new 64 \
--temperature 0
此示例为请求短文本贪心补全的演示。
常用生成参数包括--max-context(最大上下文长度)、--temperature(温度值)、--top-k、--top-p、--repetition-penalty(重复惩罚)、--seed(随机种子)及可重复设置的--stop(停止字符串)。公开版CLI采用生产环境运行时默认值。运行以下命令查看完整参数列表:
swift run -c release TurboFieldfareCLI --help
生成的文本会输出至标准输出,计时统计信息输出至标准错误输出;脚本中可添加--quiet参数隐藏统计信息。
使用本地服务器
构建服务器并指向已安装的模型:
swift build -c release --product TurboFieldfareServer
.build/release/TurboFieldfareServer \
--model scratch/gemma4.gturbo
服务器监听地址为http://127.0.0.1:8080/v1,支持Chat Completions接口、流式输出、函数工具调用及单前缀提示词复用。所有工具调用需由客户端授权执行。请仅在本地回环使用该服务器,它未提供远程认证与传输层安全(TLS)功能。
测试请求、Python与OpenCode配置、提示词复用、工具调用处理及支持的API子集详情,请参考本地服务器文档。
测试
串行运行公开测试套件:
Scripts/test.sh
启动模型前,请关闭占用大量内存的应用,并运行memory_pressure -Q检查内存状态。若报告可用内存不足,请延后运行。同一时间仅能运行一个TurboFieldfare应用、解码服务、CLI、服务器、测试或其他本地模型进程。
贡献性能测试结果
如需提交可对比的性能测试结果,请遵循社区基准测试指南。
技术原理
在每个Transformer层,Metal利用常驻内存的权重计算注意力与路由网络。CPU根据路由网络输出的前8位专家ID,结合该层的16槽最不常用(LFU)缓存规划加载策略,再通过有限并行pread调用将缺失的专家网络加载至Metal可见缓冲区。在加载过程中,Metal同时计算常驻内存的共享专家分支,最后将共享与路由专家的输出合并。
提示词预填充采用最大128个token的分块策略,使一个加载的专家网络可服务多行数据。生成阶段则逐token重复路由层计算流程。安装器同样遵循有限内存原则:直接将远程分段数据重新打包为.gturbo格式,无需完整分片或张量的临时存储。
如需直观了解模型架构,可参考Maarten Grootendorst的《Gemma 4可视化指南》。
系统设计文档详细介绍了.gturbo格式布局、内存管理、预填充流程、路由网络交互、cb1/io/cb2阶段、Metal内核及正确性约束。
当前功能
TurboFieldfare目前支持:
- 将远程模型流式重新打包为
.gturbo格式 - 经过指令微调的Gemma 4 26B-A4B模型,已验证纯文本对话格式正确性
- 4位MLX仿射量化的嵌入层、注意力层、共享专家网络与路由专家网络,路由层采用8位量化
- 定制Metal内核,支持量化通用矩阵向量乘法(GEMV)、注意力、混合专家(MoE)、归一化、旋转位置编码(RoPE)、采样及生产级融合操作
- 基于固态硬盘的路由专家网络流式加载,搭配有限大小的专家缓存
- 单提示词分块预填充与逐token生成
- FP16精度KV存储,25层滑动窗口采用循环存储,5层全注意力采用线性存储
- 精确的K/V拆分解码注意力机制,K与V路径独立归一化
- Swift库、流式安装器、命令行工具、本地回环OpenAI兼容服务器,以及基于SwiftUI/AppKit的原生Mac应用(搭配单次本地解码服务)
当前适用范围
仅支持在内存≥8GB的Apple Silicon Mac上,对固定版本的Gemma 4 26B-A4B指令微调模型进行纯文本推理。
未来规划
- 开发iPhone与iPad应用,测试移动硬件上的推理速度与内存占用
- 测试更多Apple Silicon Mac机型,尤其是基础款16GB内存M4 Mac mini及其他8GB内存机型
实验研究
TurboFieldfare的实验历程介绍了最有效的优化方案、未达预期的尝试,以及在严格验证下被推翻的早期结论。详细的实验记录保存了全部103项经过审核的实验数据,可作为参考依据。
实用入口
许可协议
TurboFieldfare的源码与文档采用Apache License 2.0许可。
模型权重未包含在本项目中,安装器会从固定版本的Hugging Face仓库单独下载,其使用需遵循原许可条款。模型与Swift包的许可详情请参考THIRD_PARTY_NOTICES.md。
TurboFieldfare是独立研究项目,与谷歌无关联,未获其赞助或背书。
感谢您关注本项目!
我是Andrey Mikhaylov,可通过LinkedIn联系我。作为TurboFieldfare的开发者,我是一名iOS与Metal工程师,主要从事图像、视频及端侧AI相关工作。
谨以此项目献给我的妻子Sasha——她是我认识的最支持我的人,无论顺境逆境始终陪伴着我。她热爱野生动物,常去观鸟,还参与本地观鸟社区的志愿工作。受她影响,我也愈发亲近鸟类与自然。
TurboFieldfare的名字来源于田鸫(fieldfare)——一种鸫科鸟类,也是我最喜欢的鸟。它并非最引人注目或色彩艳丽的鸟类,但有着独特的个性与特征。正如这个项目:它或许不是最实用的工具,但我用自己最喜爱的工具(尤其是Metal),在最热爱的领域(端侧机器学习推理)完成了开发,同样拥有独特的个性与价值。
下次出门时,不妨摸摸青草,听听鸟鸣。有时这便是世间最美好的事。如果可以,请支持本地野生动物保护社区——他们在做非常有意义的工作。
谢谢!