This release is a pre-release and may not be stable for production use.
btb (Beyond the Box)
btb is a x86_64 / ARM / CUDA / MLX / NEON optimized harness that prioritizes using all available hardware on the machine, semi-greedily.
Run a 180B+ model without GPU, without needing quantization / GGUF, and without waiting a week! The better your machine's hardware, the faster your inference will be. It will run on a laptop and a gaming PC alike.
It implements a tiered access system, prioritizing VRAM, RAM, and disk in that order. The harness is designed to allow for regular machine usage, such as playing a game, launching a memory-heavy application, et al. While it is greedy, it keeps a configurable buffer of free memory for the OS. When that buffer shrinks, RAM is freed accordingly from inference for other applications.
Notice: This software pushes upwards of 3-4GB/s read from your drive, constantly. I WOULDN'T recommend running this on a HDD, though HDD support was taken into consideration. It however, does attempt to absolutely minimize the number of reads, see the Bus Pass scheduler.
Disclaimer: This project contains AI written code, human reviewed, and experimental.
Features
- 🏡 At-home access to LLM inference for everyone :)
- ☮️ Windows, macOS, Linux
- 🏎️ CUDA / MLX / NEON perf. that meets or beats llama.cpp
- 🌈 Fast(er) CPU inference / No GPU required (sorry NVIDIA)
- AVX2, AVX-512, NEON support
- The more cores, the more performance
- Single-core machines may struggle more due to inherent contention
- 🔍 BF16 first, quant second
- btb is bf16 first, opting to never sacrifice quality for speed
- MoE included - Yes, you can even run large MoE models in bf16. It won't be the fastest, but it's better than impossible.
- No extra disk space required - Run the models you already have
- GGUF / Quant. support - However, if you already have a .gguf or quantized model, you can use it all the same.
- 12-bit packing
- For low memory systems, or large models where you don't want to sacrifice quality; btb offers its own form of lossless packing "pack12".
- This does require about ~0.75x of the space of the base model in space on the disk, but it opt-in (see the
packsubcommand).
- ⛓️ Deterministic inference
- Deterministic sampling and inference across various devices
- Blazing performance through some sorcery
- n-gram and MTP tree optimizations + tuning
- Support for top-k, top-p, and greedy - all highly optimized
- 📚 Full context windows + automatic YaRN
- And no, you're not just limited to 256 or something.
- Scale context windows to the model's max, or higher, with automatic YaRN configuration.
- Operate at context lengths that definitely don't fit in VRAM :)
- Conversational prefill / KV caching
- 🛠️ Tools Included:
btb serve [model]- OpenAI serverbtb ollama [model] --gui- Open the Ollama GUIbtb pi- Configure a pi provider and start a server (tools ARE supported)btb chat- Basic interactive chat without tools
- 😇 Annoys Sam Altman
- 🐍 A plain Python API
Commercial Use
For commercial use, please contact sales@relta.net. See the LICENSE file for more information about the FSL-v1.1-ALv2 license.
Installing
This package provides both wheel files for common platforms/architectures, as well as a sdist package (though not recommended).
pip
pip install beyondthebox
pip install beyondthebox[mlx] # Apple silicon: adds MLX, and the GPU is used by default
From Source
To rebuild the library and the wheel from source, with a Rust toolchain:
git clone https://github.com/EvanDarwin/btb && cd btb
python build.py # this machine, with the card's kernels when nvcc is here; --target <triple> cross-builds
pip install dist/*.whl
See Building btb for the prerequisites (Rust, CUDA/nvcc, MLX), the dev checks and tests, and cross-building.
Usage
OpenAI server
btb serve Qwen/Qwen3-4B --port 8000
from openai import OpenAI
client = OpenAI(base_url="http://127.0.0.1:8000/v1", api_key="btb")
for chunk in client.chat.completions.create(model="qwen3-4b", stream=True,
messages=[{"role": "user", "content": "Why is the sky blue?"}]):
print(chunk.choices[0].delta.content or "", end="", flush=True)
Every complete model in the Hugging Face cache (and --models-dir) is listed by name and loaded on demand, least recently used unloaded to make room; --models-filter REGEX narrows the list.
Pi Agent
btb pi
This will modify your Pi configuration to add a new btb provider, which you can then launch with pi --provider btb. Tools are supported.
Ollama
# For interactive terminal chat
btb ollama [model]
# For the GUI
btb ollama [model] --gui
Starts the server and runs ollama run qwen3-4b; anything after the options goes to ollama run. --gui opens the Ollama desktop app on it instead (quit the app before restarting btb, it holds the port).
One prompt, or a chat in the terminal
btb run Qwen/Qwen3-4B -q -p "What is the capital of France?"
# The capital of France is **Paris**.
btb run Qwen/Qwen3-4B -q --json -p "What does CPU stand for?"
# {"answer": "CPU stands for **Central Processing Unit**. …", "took": 4.25, "stop": "eos", "stats": {"tokens_per_sec": 13.9, "tokens_in": 18, "tokens_out": 59, "tokens_per_pass": 1.0}}
btb chat Qwen/Qwen3-4B
# Basic interactive chat window
The model path is a local directory or a Hugging Face repo id (downloaded into the cache if missing).
From code
import btb
with btb.load("Qwen/Qwen3-4B") as model:
print(model.ask("What is the capital of France?"))
for piece in model.stream("Name three uses of a paperclip.", max_new=64):
print(piece, end="", flush=True)
Options
These options apply to all commands that accept a model name / path.
btb is designed to run automatically, picking the best configuration for your current hardware setup at runtime. These options are simply if you want to play/experiment or fine-tune placement of weight layers between CPU/GPU.
Every command that loads a model takes these. The placement is planned from the machine's free memory at load; the flags override it.
| option | what it does | default |
|---|---|---|
-d, --device <cuda|cuda:N|mlx|cpu> |
cuda: the card (and CPU) (cuda:N a specific card);mlx: Apple silicon's GPU over unified memory;cpu: the CPU alone |
the card, else mlx on Apple silicon, else cpu |
-v, --verbose |
enable verbose output, prints placement, tiers, and each turn's timings | off |
--profile DIR |
write the run's profile to DIR: report.json (the engine's ledger) and events.npz (the expert-store trace of a mixture of experts); attach it to an issue beside the crash report a failed run prints |
off |
--native LIB |
path to the native library; none runs on torch alone |
use btb's bundled native kernels |
--cpu-layers N |
the first $N$ layers run on the CPU from RAM | auto-configured |
--cold-slots N |
slots the reader streams layers from the drive into, ahead of the compute | auto-configured |
--resident-last N |
the last $N$ layers stay on the GPU | auto-configured |
--resident-head 0|1 |
1: output head resident on GPU0: output head resident on CPU |
auto-configured; 1 on MLX |
--fp32 0|1This option itself is a feature for fun and precision testing, but fp32 truly is faster on some CPU architectures. |
1: use fp32 calculations; 0: use bf16 calculations (faster) |
1 on the CPU, otherwise defaults to 0 |
--kv-host 0|1When provided, forces the cache to RAM/VRAM instead of letting the planner decide. |
1: forces the attn cache on the host's RAM0: forces the attn cache on the card |
auto-configured; CUDA only |
--kv-bits 8 |
MLX: denser attention cache as int8 with a scale per row (half the bytes; lossy, about 0.4% of a row's largest magnitude) | off: the cache stays bf16, the model's own dtype |
--context N |
window length; past the model's own window YaRN scaling is applied | the model's own window and its own rope as shipped; only a --context past the window of a model with a plain rope applies YaRN, factor = ceil(context / window) |
--expert-cache-gb GB |
RAM limit for the model's MoE store | the free RAM above the reserve, grown into as needed |
--ram-reserve GB|% |
specifies how much RAM to keep free on the host for other apps | 10% of RAM, or OS floor + growth; whichever is more |
--vram-reserve GB|% |
specifies how much VRAM to keep free on the host for other apps | 0.5 GB, or 8% of a smaller card |
--vram-watch 0|1This option describes enables/disables btb's behavior under contention. When true, it aims for no apps OOMing. When false, it plans once and sticks to it - making other apps take the OOM. |
1: free RAM/VRAM under contention, reclaim it when available again0: fit the model to the hardware once and don't readjust |
1 |
--tree-budget N |
the draft tree's size per pass; 0 turns the tree off |
with drafting head: mlx = 14, cuda = 15, cpu = 16without: on a card holding every layer, 15; otherwise 0 |
--v-max N |
drafted tokens verified per pass; 0 decodes one token at a time |
4; 0 for a mixture of experts |
--tree-min-prob P |
minimum draft path probability kept in the tree | 0.15 |
--tree-step-mass P |
a drafting step runs only when the nodes it would extend carry this much path probability; 0 always steps |
0.5 |
--ngram-p P |
acceptance threshold of the n-gram drafter | 0.9 |
--draft-vocab N |
the drafting head scores only the first $N$ token ids (the frequent part of a BPE vocabulary); 0 scores all |
32768 with a drafting head, else all |
--draft-bits 4|8|16This option is only recognized when running under MLX. |
the drafting head's weights packed in memory at first use to N bits | 8 on MLX only, otherwise ignored |
--mlx-mega 0|1When enabled, requires ~600MB of arena/scratch space |
MLX: the dense pass as one Metal dispatch (the megakernel; bit-exact w/ fused path) | 1 where it builds (dense Qwen3, every layer resident) |
--temperature T |
0 takes the likeliest token; above 0, each logit is divided by $T$, deterministic noise keyed by the seed and the token's position is added, and the argmax is taken, so higher $T$ draws more widely and one seed repeats its answer. |
0 |
--top-p P |
draw from the fewest likeliest tokens whose probability reaches $P$ | 1 (every token) |
--top-k K |
draw from the $K$ likeliest tokens | 0 (every token) |
--seed N |
the draws' seed: a prompt and a seed repeat their answer | drawn per call, reported in the stats |
--draft-temperature R |
under a temperature the drafting head draws its tree at $R \cdot T$; the verified answer's distribution is the same at any $R$, the accepted drafts a pass are not | 1 |
Each command's own arguments (btb <command> --help lists them):
run PATH:-p, --prompt(else stdin, else a sample prompt),--file JSONL(one{"prompt": ...}per line, a fresh context each),--new N,--greedy(one token at a time even if the model can speculate),--raw(keep special tokens),-q, --quiet,--json(one record per prompt),--out PATH.chat PATH:--file JSONL(scripted turns, one{"user": ...}per line),--new N;/resetclears,/quitexits.bench PATH --prompts JSONL:--rows I,J,...(default all),--new N,N,...(default64,256,1024),--label LABEL,--out JSONL; always greedy.serve [PATH]:--host(default127.0.0.1),--port(default8000),--new N(a ceiling per request),--api-key KEY(required on every request asAuthorization: Bearer KEY; defaultBTB_API_KEYfrom the environment, else none),--models-dir DIR(repeatable),--models-filter REGEX; no path starts empty.ollama [PATH]:serve's arguments,--portdefault11435,--gui(the desktop app instead of the terminal chat); anything unrecognized goes toollama run.pi [PATH]:serve's arguments (--api-keyincluded, written into the provider entry),--no-configure(print the provider entry instead of writing~/.pi/agent/models.json),--config PATH(write it elsewhere).pack PATH [OUT]: the lossless 12-bit model beside the model (<model>-pack12, a model like any other), or atOUT.devices:-q(one name per line),--json.
The 12-bit store
Optional and lossless: the same bf16 numbers in 12 bits each, 0.75x the read from disk. Written only by pack, into its own directory; the checkpoint is untouched; runs find the store on their own.
btb pack /models/Qwen3.8-27B # writes /models/Qwen3.8-27B-pack12
btb pack /models/Qwen3.8-27B /fast/disk/Qwen3.8-27B-pack12
pack checks the free space first and refuses if the store does not fit. It pays when the model reads from disk every token (the 27B on 64 GB: 54 GB a pass from the checkpoint, 40 GB from the store).
Models
Supported families (so far, I'm out of disk space):
- Qwen3.5-style hybrids (
qwen3_5) - Qwen3 dense (
qwen3) - Phi-3-style dense (
phi3) and the Qwen4 MoE (qwen4_exp; transformers 5.16 or later) - OpenAI gpt-oss (
gpt_oss): attention sinks, 128-token windows, MXFP4 experts streamed from the drive as stored (the 120B's experts are 61 GB, never expanded)
How?
- I refused to accept quantization
- A 10-week research project into LLM inference
- Iterative optimization
- Avoid reading layers you don't need
- Take lossless shortcuts
- Proper utilization of scheduling between devices
- A tree, determinism, and a touch of magic
Benchmarks (Windows)
All benchmarks use the same bench/questions.json prompts, and bench.py and compare.py scripts - and they are provided for reproducibility.
The following configuration is used:
- No bf16 for CPU runs
- Runs to $64$, $256$, and $1024$ tokens
tok/sis the rate after the first token, averaged over the promptsfirst_tokenis the prefill at $256$- Peak RAM represents the process's peak working set
- Peak VRAM is peak reserved VRAM by the scheduler
- Greedy decoding for now (will do temp. later)
bench/matrix.py runs every device configuration against every complete model in the cache (--devices, --filter, --models), one btb bench process per cell, and writes the table (--markdown) and a JSON of every cell under bench/results/.
The table
| model | engine | device | how it runs | tok/s at 64 / 256 / 1024 | tokens per pass | first token | peak RAM | peak VRAM |
|---|---|---|---|---|---|---|---|---|
| Qwen3-0.6B | btb | CPU | fp32 over bf16 weights, all layers on the CPU, the n-gram tree | 22.1 / 19.3 / 26.2 | 1.42 / 1.35 / 2.01 | 0.20 s | 2.5 GB | 0 |
| Qwen3-0.6B | btb | CPU | fp32 over bf16 weights, all layers on the CPU, greedy | 17.1 / 15.7 / 15.7 | 1.00 | 0.20 s | 2.5 GB | 0 |
| Qwen3-0.6B | btb | GPU | bf16, the whole model on the card, four steps a graph | 286.8 / 297.1 / 270.9 | 1.00 | 0.04 s | 2.9 GB | 2.8 GB |
| Qwen3-0.6B | btb | GPU | bf16, the whole model on the card, the n-gram tree, a verify pass a graph | 373.0 / 357.2 / 510.4 | 1.49 / 1.45 / 2.33 | 0.04 s | 2.9 GB | 2.8 GB |
| Qwen3-0.6B | llama.cpp | GPU | bf16, the whole model on the card (bf16 GGUF, llama-cpp-python, CUDA 13) | 258.3 / 245.8 / 232.3 | 1.00 | 0.01 s | 2.2 GB | 1.9 GB |
| Qwen3-0.6B | AirLLM | CPU | per-layer streaming on the CPU | 0.33 / 0.33 / — | 1.00 | 3.4 s | 0.9 GB | 0 |
| Qwen3-1.7B | btb | CPU | fp32 over bf16 weights, all layers on the CPU, the n-gram tree | 12.1 / 11.9 / 15.1 | 1.23 / 1.29 / 1.75 | 0.44 s | 5.9 GB | 0 |
| Qwen3-1.7B | btb | CPU | fp32 over bf16 weights, all layers on the CPU, greedy | 10.5 / 10.2 / 10.2 | 1.00 | 0.44 s | 5.9 GB | 0 |
| Qwen3-1.7B | btb | GPU | bf16, the whole model on the card, two steps a graph | 116.3 / 118.2 / 113.8 | 1.00 | 0.04 s | 5.4 GB | 5.4 GB |
| Qwen3-1.7B | btb | GPU | bf16, the whole model on the card, the n-gram tree, a verify pass a graph | 140.7 / 146.8 / 182.8 | 1.25 / 1.36 / 1.82 | 0.04 s | 5.4 GB | 5.4 GB |
| Qwen3-1.7B | llama.cpp | GPU | bf16, the whole model on the card (bf16 GGUF, llama-cpp-python, CUDA 13) | 114.8 / 112.3 / 106.6 | 1.00 | 0.01 s | 4.3 GB | 3.9 GB |
| Qwen3-1.7B | AirLLM | CPU | per-layer streaming on the CPU | 0.29 / 0.29 / — | 1.00 | 4.6 s | 3.5 GB | 0 |
| Qwen3-4B | btb | CPU | fp32 over bf16 weights, all layers on the CPU | 3.3 / 3.4 / 3.4 | 1.00 | 0.95 s | 9.1 GB | 0 |
| Qwen3-4B | btb | CPU + GPU | bf16 weights on the card, attention cache in RAM | 26.6 / 27.0 / 26.3 | 1.00 | 0.07 s | 9.2 GB | 7.6 GB |
| Qwen3-4B | btb | GPU | bf16, the whole model on the card | 27.7 / 27.9 / 27.0 | 1.00 | 0.04 s | 9.0 GB | 8.3 GB |
| Qwen3-4B | btb | GPU | fp32 over bf16 weights, the whole model on the card | 8.2 / 8.1 / 6.3 | 1.00 | 0.14 s | 16.8 GB | 9.4 GB |
| Qwen3-4B | btb | GPU | bf16, the whole model on the card, one step a graph | 53.0 / 52.9 / 52.2 | 1.00 | 0.04 s | 9.4 GB | 11.1 GB |
| Qwen3-4B | btb | GPU | bf16, the whole model on the card, the n-gram tree, a verify pass a graph | 60.7 / 62.8 / 78.2 | 0.04 s | 9.4 GB | 11.1 GB | |
| Qwen3-4B | llama.cpp | GPU | bf16, the whole model on the card (bf16 GGUF, llama-cpp-python, CUDA 13) | 52.7 / 51.5 / 50.1 | 1.00 | 0.03 s | 8.6 GB | 8.3 GB |
| Qwen3-4B | AirLLM | CPU | per-layer streaming on the CPU | 0.20 / 0.20 / — | 1.00 | 8.0 s | 4.1 GB | 0 |
| Qwen3-4B-Instruct-2507 | btb | GPU | bf16, the whole model on the card, one step a graph | 53.9 / 53.7 / 52.4 | 1.00 | 0.05 s | 9.4 GB | 11.1 GB |
| Qwen3-4B-Instruct-2507 | btb | GPU | bf16, the whole model on the card, the n-gram tree, a verify pass a graph | 59.5 / 63.4 / 70.6 | 0.05 s | 9.4 GB | 11.1 GB | |
| Qwen3-4B-Instruct-2507 | llama.cpp | GPU | bf16, the whole model on the card (bf16 GGUF, llama-cpp-python, CUDA 13) | 52.8 / 51.4 / 51.2 | 1.00 | 0.03 s | 8.6 GB | 8.4 GB |
| Qwen3-4B-Instruct-2507 | AirLLM | CPU | per-layer streaming on the CPU | 0.20 / 0.20 / — | 1.00 | 7.8 s | 4.1 GB | 0 |
| Phi-4-mini-instruct | btb | CPU | fp32 over bf16 weights, all layers on the CPU | 3.0 / 3.3 / 3.4 | 1.00 | 0.69 s | 8.7 GB | 0 |
| Phi-4-mini-instruct | btb | CPU + GPU | fp32, 32 layers on the CPU, the head on the card | 5.6 / 5.6 / 5.2 | 1.00 | 0.54 s | 8.7 GB | 1.5 GB |
| Phi-4-mini-instruct | btb | GPU | bf16, the whole model on the card | 35.3 / 36.2 / 36.2 | 1.00 | 0.04 s | 8.6 GB | 7.4 GB |
| Phi-4-mini-instruct | btb | GPU | fp32 over bf16 weights, the whole model on the card | 9.4 / 9.4 / 9.0 | 1.00 | 0.13 s | 8.4 GB | 8.4 GB |
| Qwen3.8-27B | btb | CPU | fp32, 64 layers from the 12-bit store, the tree | pending | pending | pending | pending | 0 |
| Qwen3.8-27B | btb | CPU + GPU | fp32, 64 layers on the CPU from the 12-bit store, the head on the card, the tree | 1.72 / 1.99 / pending | 3.18 / 3.31 / pending | 6.6 s | 40.4 GB | 8.7 GB |
| Qwen3.8-27B | btb | CPU + GPU | fp32 over the bf16 weights from the 12-bit store, 64 layers on the CPU, the head on the card, greedy | 1.34 / pending / pending | 1.00 | 4.9 s | 45.4 GB | 7.3 GB |
| Qwen3.8-27B | btb | CPU + GPU | fp32 over the bf16 weights from the 12-bit store, 64 layers on the CPU, the head on the card, the tree | 2.37 / pending / pending | 4.9 s | 45.4 GB | 7.3 GB | |
| Qwen3.8-27B | llama.cpp | CPU + GPU | bf16, 10 of 64 layers on the card, the rest on the CPU (bf16 GGUF, llama-cpp-python, CUDA 13) | 1.34 / 1.37 / — | 1.00 | 4.2 s | 43.3 GB | 8.9 GB |
| Qwen3.8-27B | AirLLM | CPU | per-layer streaming on the CPU | 0.03 / — / — | 1.00 | 47.8 s | 3.2 GB | 0 |
| Qwen3.8-Flash-Next (180B) | btb | CPU | bf16 trunk and experts, the experts from the drive through a RAM store | pending | 1.00 | pending | pending | 0 |
| Qwen3.8-Flash-Next (180B) | btb | CPU + GPU | bf16 trunk on the card, 241 GB of experts from the drive through a RAM store | 1.25 / 1.28 / 1.29 | 1.00 | 14.9 s | 27.0 GB | 8.4 GB |
| Qwen3.8-Flash-Next (180B) | btb | CPU + GPU | bf16, 48 attention layers on the card, the experts streamed through the store from the drive, greedy | 1.71 / pending / pending | 1.00 | 12.7 s | 40.1 GB | 8.3 GB |
| Qwen3.8-Flash-Next (180B) | llama.cpp / AirLLM | — | no result: no runtime for the Qwen4 experts / the MXFP4 experts dequantized (240 GB) | |||||
| gpt-oss-120b | btb | CPU | fp32 over the bf16 trunk, 61 GB of MXFP4 experts from the drive through a RAM store, multiplied in their stored form | pending | 1.00 | pending | pending | 0 |
| gpt-oss-120b | btb | CPU + GPU | bf16 trunk on the card (4.2 GB), 61 GB of MXFP4 experts from the drive through a RAM store, on the CPU kernels | pending | 1.00 | pending | pending | pending |
Long contexts: Qwen3-4B with the weights on the card and the attention cache in RAM (--kv-host 1), a document followed by two questions about it; --context 131072 past the model's 40,960-token window applies YaRN 4.
| context (tokens) | first-turn prefill | decode s/token | cache in RAM | peak VRAM |
|---|---|---|---|---|
| pending |
Benchmarks (Apple silicon)
Benchmarked on:
- Apple M3 Pro (12 cores, 18-core GPU)
- 36 GB unified memory
- macOS 26.6
The same prompts and answer lengths; peak MLX is the GPU's share of unified memory (part of peak RAM). The Qwen rows are bench/results/m3pro-20260910.json (btb f371e14) and m3pro-20260910-compare.json; the Phi-4-mini and gpt-oss-120b btb rows are the earlier run's.
The table
| model | engine | device | how it runs | tok/s at 64 / 256 / 1024 | tokens per pass | first token | peak RAM | peak MLX |
|---|---|---|---|---|---|---|---|---|
| Qwen3-0.6B | btb | MLX | bf16, the megakernel, the n-gram tree (default) | 81.4 / 73.4 / 124.6 | 1.29 / 1.26 / 1.96 | 0.08 s | 2.2 GB | 3.6 GB |
| Qwen3-0.6B | btb | MLX | bf16, the megakernel, greedy | 63.6 / 59.2 / 63.8 | 1.00 | 0.08 s | 2.2 GB | 3.6 GB |
| Qwen3-0.6B | btb | CPU | fp32 over bf16, every layer on the CPU kernels | 37.3 / 36.6 / 30.1 | 1.00 | 0.19 s | 2.3 GB | 0 |
| Qwen3-0.6B | mlx-lm 0.31.3 | MLX | bf16, its own generate (no speculation) | 95.2 / 95.0 / 95.1 | 1.00 | 0.12 s | 1.7 GB | 1.3 GB |
| Qwen3-0.6B | llama.cpp 0.3.35 | Metal | bf16 GGUF, every layer on the GPU | 80.4 / 82.5 / 79.8 | 1.00 | 0.03 s | 2.2 GB | 0 |
| Qwen3-0.6B | llama.cpp 0.3.35 | CPU | bf16 GGUF, no layer on the GPU | 12.9 / 13.0 / 13.2 | 1.00 | 0.22 s | 2.2 GB | 0 |
| Qwen3-0.6B | AirLLM 4.0.0 | — | no result: on macOS its persister is the MLX one, whose splits its torch model cannot load; its card regime is CUDA only | |||||
| Qwen3-1.7B | btb | MLX | bf16, the megakernel, the n-gram tree (default) | 17.8 / 15.9 / 25.0 | 1.10 / 1.10 / 1.30 | 0.24 s | 4.9 GB | 5.5 GB |
| Qwen3-1.7B | btb | MLX | bf16, the megakernel, greedy | 16.3 / 15.1 / 16.9 | 1.00 | 0.24 s | 4.9 GB | 5.5 GB |
| Qwen3-1.7B | btb | CPU | fp32 over bf16, every layer on the CPU kernels | 11.3 / 11.6 / 9.01 | 1.00 | 0.49 s | 4.8 GB | 0 |
| Qwen3-1.7B | mlx-lm 0.31.3 | MLX | bf16, its own generate (no speculation) | 35.0 / 35.5 / 35.4 | 1.00 | 0.15 s | 3.8 GB | 3.4 GB |
| Qwen3-1.7B | llama.cpp 0.3.35 | Metal | bf16 GGUF, every layer on the GPU | 35.6 / 34.6 / 33.4 | 1.00 | 0.05 s | 4.6 GB | 0 |
| Qwen3-1.7B | llama.cpp 0.3.35 | CPU | bf16 GGUF, no layer on the GPU | 4.45 / 4.37 / 4.29 | 1.00 | 0.54 s | 4.6 GB | 0 |
| Qwen3-1.7B | AirLLM 4.0.0 | — | no result: on macOS its persister is the MLX one, whose splits its torch model cannot load; its card regime is CUDA only | |||||
| Qwen3-4B | btb | MLX | bf16, the megakernel, the n-gram tree (default) | 11.2 / 9.12 / 11.7 | 1.19 / 1.15 / 1.45 | 0.26 s | 8.3 GB | 10.1 GB |
| Qwen3-4B | btb | MLX | bf16, the megakernel, greedy | 8.94 / 8.34 / 8.20 | 1.00 | 0.26 s | 8.3 GB | 10.1 GB |
| Qwen3-4B | btb | MLX + drive | bf16, 30 of 36 layers from the 12-bit store streamed into shared slots, unpacked on the GPU | 1.1 (0.91 s/token) | 1.00 | 4.5 GB | 3.5 GB | |
| Qwen3-4B | btb | CPU | fp32 over bf16, every layer on the CPU kernels | 6.79 / 6.02 / 4.91 | 1.00 | 1.09 s | 10.0 GB | 0 |
| Qwen3-4B | mlx-lm 0.31.3 | MLX | bf16, its own generate (no speculation) | 15.6 / 14.9 / 12.6 | 1.00 | 0.32 s | 8.1 GB | 7.7 GB |
| Qwen3-4B | llama.cpp 0.3.35 | Metal | bf16 GGUF, every layer on the GPU | 15.7 / 15.4 / 14.8 | 1.00 | 0.11 s | 7.9 GB | 0 |
| Qwen3-4B | llama.cpp 0.3.35 | CPU | bf16 GGUF, no layer on the GPU | 1.93 / 1.86 / 1.85 | 1.00 | 1.25 s | 8.5 GB | 0 |
| Qwen3-4B | AirLLM 4.0.0 | — | no result: on macOS its persister is the MLX one, whose splits its torch model cannot load; its card regime is CUDA only | |||||
| Qwen3.5-4B (hybrid) | btb | MLX | bf16, the DeltaNet in MLX, the tree from its drafting head (budget 14) | 24.5 / 26.6 / 27.8 | 2.40 / 2.47 / 2.58 | 0.20 s | 9.8 GB | 9.1 GB |
| Qwen3.5-4B (hybrid) | btb | MLX | bf16, greedy | 12.6 / 13.4 / 13.4 | 1.00 | 0.20 s | 9.8 GB | 9.1 GB |
| Qwen3.5-4B (hybrid) | btb | CPU | fp32 over bf16, every layer on the CPU kernels, the DeltaNet on the native kernel | 5.92 / 5.98 / 5.46 | 1.00 | 4.52 s | 12.4 GB | 0 |
| Qwen3.5-4B (hybrid) | mlx-lm 0.31.3 | MLX | bf16, its own generate (no speculation) | 13.4 / 13.9 / 13.2 | 1.00 | 0.40 s | 8.6 GB | 8.0 GB |
| Qwen3.5-4B (hybrid) | llama.cpp 0.3.35 | Metal | bf16 GGUF, every layer on the GPU | 14.2 / 14.1 / 14.0 | 1.00 | 0.13 s | 8.6 GB | 0 |
| Qwen3.5-4B (hybrid) | llama.cpp 0.3.35 | CPU | bf16 GGUF, no layer on the GPU | 1.86 / 1.81 / 1.82 | 1.00 | 1.29 s | 8.9 GB | 0 |
| Qwen3.5-4B (hybrid) | AirLLM 4.0.0 | — | no result: on macOS its persister is the MLX one, whose splits its torch model cannot load; its card regime is CUDA only | |||||
| Phi-4-mini-instruct | btb | MLX | bf16, n-gram drafts in passes of up to 5 rows | 16.5 / 15.7 / 19.3 | 1.19 / 1.10 / 1.44 | 0.11 s | 8.0 GB | 7.8 GB |
| Phi-4-mini-instruct | btb | MLX | bf16, greedy | 15.6 / 15.6 / 15.4 | 1.00 | 0.11 s | 8.0 GB | 7.8 GB |
| Phi-4-mini-instruct | mlx-lm 0.31.3 | MLX | bf16, its own generate (no speculation) | 14.7 / 15.9 / 14.8 | 1.00 | 0.31 s | 7.7 GB | 7.3 GB |
| Phi-4-mini-instruct | llama.cpp 0.3.35 | Metal | bf16 GGUF, every layer on the GPU | 16.9 / 16.7 / 16.3 | 1.00 | 0.09 s | 7.9 GB | 0 |
| Phi-4-mini-instruct | llama.cpp 0.3.35 | CPU | bf16 GGUF, no layer on the GPU | 2.05 / 2.03 / 2.01 | 1.00 | 3.48 s | 8.3 GB | 0 |
| Phi-4-mini-instruct | AirLLM 4.0.0 | — | no result: on macOS its persister is the MLX one, whose splits its torch model cannot load; its card regime is CUDA only | |||||
| gpt-oss-120b | btb | MLX | bf16 trunk, 61 GB of MXFP4 experts from the drive through a RAM store, multiplied on the GPU as stored; greedy | 3.27 / 4.25 / 4.09 | 1.00 | 6.94 s | 27.5 GB | 27.4 GB |
| gpt-oss-120b | btb | CPU | fp32 over the bf16 trunk, the experts from the drive through the RAM store as stored; greedy | 4.41 / 5.20 / 5.19 | 1.00 | 5.74 s | 23.7 GB | 0 |
Long contexts: Qwen3.5-4B (hybrid), a prompt of that many tokens, then decoding.
| context (tokens) | prefill tok/s | decode ms/token | mlx-lm decode ms/token |
|---|---|---|---|
| 1,024 | 630 | 76 | 70 |
| 4,096 | 593 | 84 | 75 |
| 8,192 | 509 | 82 | 75 |
| 16,384 | 405 | 95 | 94 |
| 32,768 | 119 |
Tests
python build.py check # ruff (lint + format), mypy, cargo fmt + clippy: what a change must pass
python build.py test --fast # tests/test_unit.py: discovery, the 12-bit format, the scheduler, the bench's planning, the native boundary checks (seconds)
python tests/test_receipts.py
python tests/test_mlx.py # on a Mac: the Metal kernels, and their batch invariance bit for bit
python build.py check needs ruff, mypy, pytest and a Rust toolchain with clippy; python build.py test runs every suite.
The receipts run the engine on seed-0 fixture models (a Qwen3.5 hybrid, a Phi-3, a Qwen3, a Qwen4 MoE; no third-party weights) against banked reference tensors and must print 0.000e+00 on x86-64 (banked by the AVX-512 kernel; scalar and NEON held to 1e-5). On MLX the same receipts are held to 1e-4 with identical tokens.
License
Functional Source License, Version 1.1, ALv2 Future License (FSL-1.1-ALv2). See LICENSE.md.
Copyright 2026 Evan Darwin.
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distributions
Built Distributions
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file beyondthebox-0.1.0rc3-py3-none-win_arm64.whl.
File metadata
- Download URL: beyondthebox-0.1.0rc3-py3-none-win_arm64.whl
- Upload date:
- Size: 1.3 MB
- Tags: Python 3, Windows ARM64
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
18ed426caa9d0bacd6bf2467ea066e55c7455cb4dcb7096ef1ed38bca9e50e5c
|
|
| MD5 |
e90226d7675f9373f7024d46401d534b
|
|
| BLAKE2b-256 |
e9bd7a4354468228497a669c87b77a7046ecd43f81a9bdfe3cad50edc3674c7e
|
File details
Details for the file beyondthebox-0.1.0rc3-py3-none-win_amd64.whl.
File metadata
- Download URL: beyondthebox-0.1.0rc3-py3-none-win_amd64.whl
- Upload date:
- Size: 1.3 MB
- Tags: Python 3, Windows x86-64
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
a87fd328f9503e7de18ce5d0b268560f59142832c40da46935dc67bbd6fad635
|
|
| MD5 |
c29096312aa9c0e4dd2a989e2b5fc4b6
|
|
| BLAKE2b-256 |
fd398d1d5856d8b65f5073095fbc7d447863f2406b70531387afeb25e4cf64b9
|
File details
Details for the file beyondthebox-0.1.0rc3-py3-none-manylinux_2_28_x86_64.whl.
File metadata
- Download URL: beyondthebox-0.1.0rc3-py3-none-manylinux_2_28_x86_64.whl
- Upload date:
- Size: 1.5 MB
- Tags: Python 3, manylinux: glibc 2.28+ x86-64
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
7da0c5c8f6a866bbb0796428778d556d7113712bc0739a373a2dbc45681843da
|
|
| MD5 |
a1e1a735eaa7dd038639df253e505124
|
|
| BLAKE2b-256 |
32dbac42bfce8546124a9e316c40dd28bceeef1966e961ad6739c2fe8b6cdcfa
|
File details
Details for the file beyondthebox-0.1.0rc3-py3-none-manylinux_2_28_aarch64.whl.
File metadata
- Download URL: beyondthebox-0.1.0rc3-py3-none-manylinux_2_28_aarch64.whl
- Upload date:
- Size: 1.4 MB
- Tags: Python 3, manylinux: glibc 2.28+ ARM64
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
efc3ad04ca0b4444f052403ae6995179dab0ca5dab440e93a14f5fe9aa395a2d
|
|
| MD5 |
a88bead4f086e5463fe99d64900fc4d7
|
|
| BLAKE2b-256 |
64b71b0e840ed537bc0f672166ddcef652def259a62227db434d713e1ef63f0d
|
File details
Details for the file beyondthebox-0.1.0rc3-py3-none-macosx_11_0_arm64.whl.
File metadata
- Download URL: beyondthebox-0.1.0rc3-py3-none-macosx_11_0_arm64.whl
- Upload date:
- Size: 632.4 kB
- Tags: Python 3, macOS 11.0+ ARM64
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
e24deab9821474f2aceffee19949b15e80bd6e6de6a511510504e88a63d39986
|
|
| MD5 |
feb129b2263d1d6384232df14f3543b3
|
|
| BLAKE2b-256 |
e678ebcbe367daead32aeed564c22b585212993cdb50e7d8061c12154c400df7
|