BlackHole·Harness

Collapse any open model until it fits your machine.

BlackHole-Harness takes a big open-weight model, works out what it is, and shrinks it: expert or neuron pruning for what you actually use it for, distillation to heal it, then 4-bit weights. You get a GGUF that runs on a 12 GB graphics card or a 32 GB Mac.

$pipx install blackhole-harness
See the numbers

early preview · open source, Apache-2.0 · first release lands with the public repo

57→10.4GB
Qwen3-30B-A3B, measured on a B200
0.042
KL to the original at that size, lower is better
1line
to install; one more rents the GPU
anymodel
Hugging Face id or local folder, MoE or dense
Measured, not promised

Smaller and closer to the original than the old default

Every recipe ships with the run that justifies it. These come from B200 runs on 23 October 2026. Quality is KL divergence from the full model on held-out answers it wrote itself; the default recipes have to stay at or under 0.10 to pass.

Qwen3-30B-A3B mixture of experts · 128 experts, 8 active

Originalbf16, all experts
57 GB
KL 0
Previous defaultkeep 50% experts, int8
13.7 GB
KL 0.158
BlackHole defaultkeep 75% experts, int4
10.4 GB
KL 0.042

Qwen3-8B dense

int8no pruning
9.5 GB
KL 0.0008
BlackHole defaultint4
6.1 GB
KL 0.070

Same scale for every bar. Round-to-nearest quantisation; a GPTQ-style quantiser is next and should cut the int4 error further. Calibration uses 64 sequences, which scored as well as 256.

kept

For MoE, prune a quarter to three-eighths of the experts, then 4 bits. It beat every mix of bit widths we tried at the same size.

dropped

Per-expert bit widths, dropping whole layers, and int3 on dense models all lost. They stay in the lab, not in the defaults.

kept

For dense models below about 6 GB, prune 25% of the neurons and heal with real distillation: 5.4 GB at KL 0.27, ahead of int3.

The pipeline

What happens between a Hugging Face id and a file you can run

  1. Detect

    Reads the config and weight index without downloading weights: family, dense or MoE, expert count, size, and whether the result can fit your target.

  2. Calibrate

    The full model answers prompts about your purpose, like "Debugging Python and Rust". Those answers become the yardstick.

  3. Score

    REAP measures how much each expert, or each neuron in a dense model, contributes on that text. Grouped matmuls make it 2.8× faster.

  4. Prune

    Drops what your purpose doesn't use. Critical neurons are protected so the model doesn't fall apart.

  5. Heal

    Distils the pruned model back toward the original with LoRA, on the teacher's own answers.

  6. Quantise

    4-bit weights with an importance matrix from your purpose, head kept at 8 bits.

  7. Gate

    Checks KL against held-out teacher answers and the real memory footprint. A recipe fails loudly instead of shipping a broken model.

  8. Package

    A GGUF plus an Ollama Modelfile and a receipt of every number the run produced.

Run it

Your laptop drives, a rented GPU does the work

~/ on your laptopzsh
$ pipx install blackhole-harness
$ blackhole up --provider nebius --gpu b200 --yes
  prices first; rents only with --yes
  ✓ b200 ready · harness installed
$ blackhole ssh
  the TUI opens on the VM
$ blackhole down --keep-disk
  stops billing, keeps the compile cache
  1. 1

    Install on any machine with Python. Nothing heavy runs locally.

  2. 2

    Rent a GPU. Nebius by default, with evroc and Lambda adapters. You see the hourly price before anything is rented.

  3. 3

    Pick a model and a recipe in the TUI. Jobs run detached, so a dropped SSH connection doesn't kill a run. Reconnect and it picks up the log.

The BlackHole TUI collapsing Qwen3 Next 80B with the Pocket coder schema for a Mac with 32 GB: pipeline progress bars, machine details and a list of schemas
Qwen3 Next 80B, Pocket coder recipe, aimed at a 32 GB Mac. Demo mode.
Schemas

Recipes are files you can read, share and fork

schemas/moe-prune-int4.tomlblackhole/v1
id = "blackhole/moe-prune-int4"
title = "Prune a little, quantise to 4 bits"

[targets]
architectures = ["moe"]

[inputs.purpose]
type = "text"
help = "What should the model be good at?"

[[stage]]
kind = "data.teacher_gen"
samples = 64

[[stage]]
kind = "prune.reap"
ratio = "${inputs.prune}"   # 0.25 by default

[[stage.gates]]
metric = "kl"
op = "<="
value = 0.15

A schema is a short TOML file: which models it suits, what it asks you, the stages it runs, and the quality gates it must pass. Use the proven defaults, grab one from the marketplace, or write your own.

moe-prune-int4 MoE default dense-prune-int4 dense default laptop-moe-gguf reap-purpose dense-horizon-qat lab/ experiments

Or describe it in words

Keep it great at SQL, drop everything else, it has to fit my 4070.

Claude or GPT drafts the schema from your words, the harness lints it against the stages that actually exist, and you review it before anything runs. Bring your own API key.

The schema screen in the TUI with a description typed into the describe box
Describing a schema in the TUI.
Targets

Tell it the machine, it sizes the model

Pick where the model will live. Detection checks the fit before a run starts, and the footprint gate checks it again at the end, context window and KV cache included.

RTX 306012 GB · 11 GB budget
RTX 407012 GB · 11 GB budget
RTX 409024 GB · 22 GB budget
RTX 509032 GB · 30 GB budget
Mac 16 GBunified · 11 GB budget
Mac 32 GBunified · 24 GB budget
Mac 64 GBunified · 50 GB budget
CPU, 32 GBsystem RAM · 26 GB budget
$pipx install blackhole-harness
Star on GitHub