backburner README

The project's README from github.com/StayLameBro/backburner. As one markdown file: README.md.

Backburner

Plug your iPhone into your MacBook with a 10 Gb/s USB-C cable and it helps run Qwen3.8-27B locally:

The engine is a llama.cpp fork (llama.cpp/, StayLameBro/backburner-llama.cpp) with its own Mac kernels (SME2, Metal fusions, DFlash2 speculative decoding). Those speed things up on the Mac alone too; the numbers below keep the two apart.

Tested on a MacBook Pro M4 Pro (24 GB) with iPhone 17 Pro Max (A19 Pro) and iPhone 16 Pro Max (A18 Pro) phones. The app also installs on iPads with an M-series chip since v0.0.2; that is untested so far, so please post your results.

Seconds of waiting for each file your agent reads

Results

Measured on 2026-10-01: Qwen3.8-27B IQ4_XS, MacBook Pro M4 Pro 24 GB, iPhone 17 Pro Max over USB-C. Raw rows are in bench/results/*.jsonl; the scripts that produced them are in bench/.

Reading (prefill): Mac alone vs Mac + iPhone, same build

A 2,000-token file or tool result read into a saved agent session (bench/turn-bench.py, two reads per depth):

Context already in the session Mac alone Mac + iPhone
16k 109 tok/s (18.8 s) 157 tok/s (13.1 s) +44%, 31% less waiting
32k 101 tok/s (20.3 s) 130 tok/s (15.8 s) +29%, 22% less waiting
48k 87 tok/s (23.5 s) 113 tok/s (18.1 s) +30%, 23% less waiting

A new omp session (omp's system prompt, project notes and 12 tools, 26,849 tokens, read cold; bench/session-bench.py):

stock llama.cpp this fork, Mac alone this fork + iPhone
first answer 245 s 228 s 168 s
later turns (1.3-1.9k-token tool results) 17.9 s 19.2 s 14.5 s

After the first time, the SSD prompt cache (scripts/proxy.py) restores that 27k-token start in 0.3-5 s.

Past 64k the Mac-alone config switches to 4-bit context: 128k at 8-bit measured ~0.3 GB over the GPU's 20 GB memory limit with the draft model loaded (2026-09-23); 8-bit between 64k and 128k was not tested. With the iPhone it stays 8-bit. There the phone changes jobs: instead of running layers 41-64 it computes attention over the old keys it holds, while the Mac runs all 64 layers (see "Who does what"). Prefill past 64k is a little faster with the phone and at higher precision: 67-73 tok/s with the iPhone at 8-bit vs 59-68 tok/s Mac alone at 4-bit (64k-96k). At 128k with the iPhone: 3 of 3 planted facts recalled (positions 1.5k, 40k, 100k), phone thermal state nominal.

Writing (decode)

The phone does not change writing speed below 64k; the fork's kernels and draft model do. Past 64k the phone's GPU and Neural Engine compute attention over the old keys for every generated token:

context tok/s
stock llama.cpp (Homebrew), Mac 27-33k 11.3
this fork, Mac alone 27-33k 25.0
this fork + iPhone 27-33k 25.1
this fork + iPhone, a real omp session (36 requests) under 16k / 16-32k / 32-49k 29.8 / 27.5 / 24.3 (medians)
this fork + iPhone 128k 12.6 (greedy, 256 tokens)

Medium thinking, omp's request fields, the server's default sampling. Mac-alone writing speed at 128k (4-bit) was not measured on the same day, so there is no head-to-head number for it here.

Context you can hold

8-bit context
Mac alone (24 GB) 64k measured (128k only fits with 4-bit)
Mac + iPhone 17 Pro Max 196k-229k by the phone's free memory (sized at startup); tested to 128k (140k at 4-bit)

How it works

Who does what

With the defaults and one iPhone 17 Pro Max:

Mac GPU Mac CPU (SME2) iPhone GPU (matrix units) iPhone Neural Engine
Prefill, context up to 64k layers 1-40 ~30% of each big matmul layers 41-64 (split prefill) -
Prefill past 64k all 64 layers ~30% of each big matmul attention over the old keys it holds - (builds its pages in the background)
Writing, up to 64k everything, plus the draft model oldest keys of each attention layer past 40k - -
Writing past 64k everything else same attention over the old keys part of that attention

The Mac's own Neural Engine is not used: it shares the Mac's memory bandwidth and slowed decode by 26% when running (docs/ANE.md).

The pieces

Limits

Security

Over the USB cable, the phone app answers the Mac and nothing else. Over Wi-Fi it answers only a Mac you paired over the cable, through an encrypted, authenticated tunnel (docs/WIFI.md). Nothing is advertised on the network. Before 0.0.3 the app accepted connections over Wi-Fi too: update the app, or keep the phone's Wi-Fi off while Backburner is open. Report problems privately (Security → Report a vulnerability): SECURITY.md.

Setup

You need an Apple Silicon Mac (tested: M4 Pro, 24 GB), an iPhone 15 Pro or newer (tested: 17 Pro Max, 16 Pro Max) or an M-series iPad (untested), and a 10 Gb/s USB-C cable (the cable in the iPhone box is USB 2 and too slow). The app installs with a free Apple ID through AltStore, no developer account needed (docs/INSTALL-IPHONE.md), or builds with Xcode.

One command downloads the Mac engine and the models (~24 GB) and makes the phone's half. Safe to re-run:

curl -fsSL https://raw.githubusercontent.com/StayLameBro/backburner/main/install.sh | bash
backburner phone   # once per phone: plug it in, open Backburner, copies the phone's half over the cable
backburner         # OpenAI-compatible server at http://127.0.0.1:8080/v1

Or step by step:

git clone --recursive https://github.com/StayLameBro/backburner && cd backburner

# 1. the Mac engine
cmake -S llama.cpp -B llama.cpp/build-metal -DCMAKE_BUILD_TYPE=Release
cmake --build llama.cpp/build-metal --target llama-server llama-quantize -j

# 2. the models: a Qwen3.8-27B IQ4_XS GGUF at ~/Models/Qwen3.8-27B-IQ4_XS.gguf, then the draft model
huggingface-cli download z-lab/Qwen3.8-27B-DFlash2 --local-dir ~/Models/qwen38-27b-dflash2
scripts/make-drafter.sh ~/Models/qwen38-27b-dflash2 ~/Models/dflash2-v2-q4km-self16.gguf

# 3. the iPhone app: Backburner.ipa from the latest release via AltStore (docs/INSTALL-IPHONE.md), or build it with Xcode:
#      DEVELOPMENT_TEAM=<your team id> UDID=<your iPhone's UDID> scripts/build-iphone.sh
pip3 install coremltools      # serve.sh builds the phone's Neural Engine page model with it, once

# 4. the phone's half of the model (layers 41-64, ~5.1 GB; the Mac computes the logits, so no head), copied over the cable
python3 scripts/split-gguf.py ~/Models/Qwen3.8-27B-IQ4_XS.gguf ~/Models/tail-iq4xs-L40-nohead.gguf -L 40 --no-head
scripts/phone-tail.sh L40

# 5. after every reboot: let the GPU keep the model wired (macOS resets this limit)
sudo sysctl iogpu.wired_limit_mb=20480

# 6. run: OpenAI-compatible on :8080, uses the iPhone when it's plugged in with Backburner open
scripts/serve.sh
PHONE=0 scripts/serve.sh      # the Mac alone

The first serve.sh with the phone pushes the Neural Engine page model to it and relaunches the app (about a minute). After that the startup line should read split prefill on, remote KV on and ANE pages on.

scripts/serve.sh documents each setting next to the measurement that chose it.

Reproducing the numbers

bench/turn-bench.py --build            # once: a saved session at 16k / 32k / 48k (Mac alone)
bench/turn-bench.py --config mac       # read 2,000-token files into each saved session
bench/turn-bench.py --config phone
bench/session-bench.py --config stock|fork-mac|fork-phone   # an omp-shaped session, ~5 min each
bench/long-bench.py                    # past 64k (long: cold reads to 128k)

Post your results

Tried it? Post your results: your Mac, your phone(s) and the turn-bench.py output. Other Macs, other phones, iPads and two-device setups are the numbers this README doesn't have yet.

Contributing

Pull requests are welcome: new devices, fixes, kernels, docs. CONTRIBUTING.md has what every change needs: same answers, measured speed, and the Mac alone still working.

Status

Pre-release. Next: the phone's layers seeing the keys it holds (split prefill past 64k), a second phone in the prefill chain, an App Store build, and upstreaming what makes sense to llama.cpp. Built with a lot of help from Claude Opus 5.5.

MIT license (llama.cpp keeps its own MIT license). Created by StayLameBro. Forks are welcome; if you start a separate project from it, please give it a different name and link back here.

backburner (StayLameBro/backburner)

Searching Database…

这是什么?Backburner 让附近的 iPhone 充当 Mac 的协处理器,使本地运行的 27B LLM(Qwen3.8-27B)更快地读取提示词并容纳多得多的上下文。手机通过 10 Gb/s 的 USB-C 线缆连接,分担模型的部分层以及旧上下文的存储/注意力计算。
这是一个应用,还是两个独立的部分?它由两个相互关联的部分组成:一个基于自定义 llama.cpp 分支构建的 Mac 端推理服务器,以及一个在 iPhone 的 GPU/神经网络引擎上运行、通过线缆(或配对的 Wi-Fi 隧道)与 Mac 通信的配套 iOS 应用。
怎么让它跑起来?一条命令即可运行 Mac 端设置脚本,它会下载引擎和约 24 GB 的模型并自动配置 iPhone 端;手机应用本身可用免费 Apple ID 通过 AltStore 安装,或在 Xcode 中自行构建。
尝试之前我需要什么硬件?一台 Apple Silicon Mac、一部 iPhone 15 Pro 或更新的机型(M 系列 iPad 也能安装该应用,但未经测试),以及一根货真价实的 10 Gb/s USB-C 线缆——iPhone 包装盒里附带的线缆是 USB 2 的,太慢了。
这个提速有什么限制或代价吗?只有超过约 512 个 token 的读取才能得到手机的帮助;手机只在上下文超过 64k 时才加速写入;应用必须保持打开并处于前台(一旦退到后台或拔掉线缆,15 秒后就会停止工作);而且一次只能处理一个请求。该项目也标记为预发布版。
网络上的其他设备能连到这部手机吗?不能——通过线缆连接时,手机只与配对的 Mac 通信;通过 Wi-Fi 时,它也只响应之前通过 USB-C 配对过的 Mac,且走加密隧道;网络上不会有任何广播。
Backburner 运行的是什么模型?它围绕 Qwen3.8-27B 构建和测试(以 IQ4XS 量化测试),Mac+iPhone 的组合专门针对该模型的上下文和预填充速度做了调优。
为什么要卸载到手机,而不是干脆买一台更强的 Mac?iPhone 的 GPU、神经网络引擎和额外内存可以让一台 24 GB 的 Mac 容纳多得多的上下文(最高约 229k token,而单独只有 64k),并将提示词读取速度提升最多 44%,而且不需要增加 Mac 内存或换新机器。
使用手机会改变模型的回答吗?不会——无论是否连接手机,贪婪解码的输出在 token 上完全一致,已在 8k、32k 甚至 140k token 的上下文中验证过。
DFlash2 是什么?它是该分支针对混合 GDN+注意力模型的推测解码技术,带循环状态重放,与 SME2 和 Metal 内核融合一起使用,用于加速 Mac 本机上的 token 生成。
Size
0.9 MB
Stars
1K
Updated
CommitOct 13
Age
17d
Commits · 90 Days