Gemma 4 26B-A4B inference in about 2 GB of RAM
A custom Swift + Metal runtime for any Apple Silicon Mac, even the 8 GB ones.
Quick start · Local server · Benchmarks · Contribute results · How it works · Experiments · References
 Memory got expensive. So I gave a 26-billion-parameter model a ~2 GB budget. TurboFieldfare runs the instruction-tuned **[Gemma 4 26B-A4B](https://ai.google.dev/gemma/docs/core/model_card_4)** without loading the entire 14.3 GB model into memory. It keeps the shared 1.35 GB core and FP16 KV cache in memory, then streams only the experts needed for each token from SSD. This is what lets the model run on Macs with 8 GB of RAM. The runtime, streaming installer, CLI, and native Mac app are written in Swift and Metal. TurboFieldfare is model-specific rather than a wrapper around MLX or llama.cpp. The curated [experiment record](docs/experiments/EXPERIMENT_INVENTORY.md) summarizes 103 measured results across kernels, caching, I/O, prefill, and decode. ## Try it ```bash git clone https://github.com/drumih/turbo-fieldfare.git cd turbo-fieldfare swift build -c release .build/release/TurboFieldfareMac ``` On the first run, Swift Package Manager downloads and builds the Swift packages required by the tokenizer. The complete release build includes the foreground Mac app and its sibling decode-service executable. When the app opens, choose **Download** and let TurboFieldfare fetch and repack the pinned model (about 15 GB). Once it is ready, choose **Load Model**, type your prompt, and press **Generate**. ## At a glance | Metric | Value | | --------------- | ------------------------------------------------------------------------------------------------------------------------ | | Model | Gemma 4 26B-A4B IT, 26B total parameters, about 3.88B active per token | | Weights | MLX affine 4-bit, group 64; 8-bit router; 4-bit shared and routed experts | | Memory | ~2 GB of weights and 4K KV cache | | Storage | About 14.3 GB for the text model, plus about 1.1 GB for the optional image pack | | Hardware | Apple Silicon Mac; 8 GB of RAM | | Platform | macOS 26, Metal 4, Swift 6.2 | | M2 measured decode | [5.1-6.3 tok/s](docs/BENCHMARKS.md#m2-measured-decode) on an 8 GB M2 MacBook Air | | M5 measured decode | [31-35 tok/s](docs/BENCHMARKS.md#m5-measured-decode) on a 24 GB M5 Pro | | Community Reports | [Here](docs/COMMUNITY_BENCHMARKS.md#community-results) | The measured result is a reference point, not a performance ceiling. Prompt length, generated length, page-cache state, and hardware all affect throughput. See [community benchmark results](docs/COMMUNITY_BENCHMARKS.md#community-results) from other Macs, or follow the [community benchmark guide](docs/COMMUNITY_BENCHMARKS.md) to add your own. ## Using TurboFieldfare TurboFieldfare provides a native Mac app, a command-line interface, and an experimental loopback OpenAI-compatible server. They use the same `.gturbo` model directory, but only one model-owning product should run at a time. The Swift package exposes six products: | Product | Purpose | | --- | --- | | `TurboFieldfare` | Swift library containing the runtime and Metal kernels | | `TurboFieldfareMac` | Native Mac app for installation and generation | | `TurboFieldfareDecodeService` | One-shot local model and Metal owner used by the Mac app | | `TurboFieldfareCLI` | Command-line instruction chat and raw completion | | `TurboFieldfareServer` | Loopback OpenAI-compatible Chat Completions server | | `TurboFieldfareRepack` | Streaming model installer and install verifier | ### Requirements - An Apple Silicon Mac; the validated target is an 8 GB M2 MacBook Air - macOS 26 with Metal 4 - Xcode 26 and Swift 6.2 or newer - Enough free storage for the ~14.3 GB model installation - An internet connection for the first model install The package is arm64-only. Older macOS and Metal versions are not supported. ### Prompting the model The Mac app treats what you type as an instruction and handles Gemma's chat formatting automatically. Just describe the task and include any context the model needs. Generation defaults to temperature `0.2`, Top-K `64`, and Top-P `0.95`. Set temperature to `0` for deterministic greedy output. The model can still repeat itself or give incorrect answers, so check important results. The app and CLI support user and model messages plus optional system guidance; they do not expose or execute tools. The loopback server accepts function-tool declarations and returns model-produced tool calls for the client to authorize and execute. Audio and video are not supported. ### Images Images are supported through a vision tower, which installs as a companion pack beside the text model. Install it once and the app, CLI, and server all accept images. Without it they tell you image support is unavailable, and the text runtime is untouched. The image tower requires an M2 or newer Apple Silicon Mac; text-only inference remains available on M1. [System design](docs/SYSTEM_DESIGN.md#images) covers how the tower runs and what it costs on an 8 GB machine. ### Mac app Clone the repository, then run the app from its root: ```bash swift build -c release .build/release/TurboFieldfareMac ``` Build the complete package so the app and its sibling decode service are both available. When launched from this checkout, the app stores the model in `scratch/gemma4.gturbo`. #### Install the model On first launch, the app checks the available storage and shows the download and installed sizes. Choose **Download** to begin. The installer never materializes the full source checkpoint. It streams the required byte ranges from the pinned Hugging Face revision and repacks them directly into the `.gturbo` layout as they arrive. This avoids a second full checkpoint on disk and keeps scratch memory bounded. The first installation transfers about 15 GB through bounded Hugging Face range requests. Network speed and Hugging Face response times vary, so it can take a while. The completed `.gturbo` installation occupies about 14.3 GB and is accepted only after its manifest and file hashes have been validated. Installation does not load the model into memory. #### Load and generate After installation: 1. Choose **Load Model**. 2. Enter a prompt in the composer. 3. Choose **Generate**, or press Command+Return. Use **Settings > Send Message With** to choose Return or Command-Return. 4. Send another message to continue the conversation, or choose **New Chat** to start over. 5. Use the stop button or Escape to end generation early. The status bar shows generation progress, decode speed, and memory use. Use the right pane to configure sampling, context length, expert-cache slots, and runtime options. See [Runtime controls](docs/RUNTIME_CONTROLS.md) for details and defaults. #### Conversation history The app saves chats locally so you can browse and continue them from the sidebar. Only one conversation's model context (KV cache) stays in memory. Browsing other chats keeps that cache intact; continuing another chat replaces it. **New Chat** starts fresh. ### Command-line interface The CLI uses an existing `.gturbo` installation. If you installed the model through the Mac app, it is already available at `scratch/gemma4.gturbo`. Otherwise, install it from the command line: ```bash swift run -c release TurboFieldfareRepack \ --output scratch/gemma4.gturbo \ --overwrite ``` Continue a cancelled or interrupted download: ```bash swift run -c release TurboFieldfareRepack \ --output scratch/gemma4.gturbo \ --overwrite \ --resume ``` Remove saved download state: ```bash swift run -c release TurboFieldfareRepack \ --discard-partial \ --output scratch/gemma4.gturbo ``` The runtime accepts only a completed `.gturbo` directory with a final `manifest.json`. Verify an existing installation without loading the model: ```bash swift run -c release TurboFieldfareRepack \ --verify-install \ --input-gturbo scratch/gemma4.gturbo ``` #### Install image support The companion pack installs beside the text model: ```bash swift run -c release TurboFieldfareRepack \ --vision-output scratch/gemma4.vision.gturbo \ --text-model scratch/gemma4.gturbo ``` The pack adds about 1.1 GB. Verify it with `--verify-vision-install`, remove an installed one with `--remove-vision-install`, and drop a cancelled download with `--discard-partial --vision-output