Instructions to use bedderautomation/empty-set with libraries, inference providers, notebooks, and local apps. Follow these links to get started.
- Notebooks
- Google Colab
- Kaggle
- Local Apps Settings
- llama.cpp
How to use bedderautomation/empty-set with llama.cpp:
Install (macOS, Linux)
curl -LsSf https://llama.app/install.sh | sh # Start a local OpenAI-compatible server with a web UI: llama serve -hf bedderautomation/empty-set:F16 # Run inference directly in the terminal: llama cli -hf bedderautomation/empty-set:F16
Install from WinGet (Windows)
winget install llama.cpp # Start a local OpenAI-compatible server with a web UI: llama serve -hf bedderautomation/empty-set:F16 # Run inference directly in the terminal: llama cli -hf bedderautomation/empty-set:F16
Use pre-built binary
# Download pre-built binary from: # https://github.com/ggerganov/llama.cpp/releases # Start a local OpenAI-compatible server with a web UI: ./llama-server -hf bedderautomation/empty-set:F16 # Run inference directly in the terminal: ./llama-cli -hf bedderautomation/empty-set:F16
Build from source code
git clone https://github.com/ggerganov/llama.cpp.git cd llama.cpp cmake -B build cmake --build build -j --target llama-server llama-cli # Start a local OpenAI-compatible server with a web UI: ./build/bin/llama-server -hf bedderautomation/empty-set:F16 # Run inference directly in the terminal: ./build/bin/llama-cli -hf bedderautomation/empty-set:F16
Use Docker
docker model run hf.co/bedderautomation/empty-set:F16
- LM Studio
- Jan
- vLLM
How to use bedderautomation/empty-set with vLLM:
Install from pip and serve model
# Install vLLM from pip: pip install vllm # Start the vLLM server: vllm serve "bedderautomation/empty-set" # Call the server using curl (OpenAI-compatible API): curl -X POST "http://localhost:8000/v1/chat/completions" \ -H "Content-Type: application/json" \ --data '{ "model": "bedderautomation/empty-set", "messages": [ { "role": "user", "content": "What is the capital of France?" } ] }'Use Docker
docker model run hf.co/bedderautomation/empty-set:F16
- Ollama
How to use bedderautomation/empty-set with Ollama:
ollama run hf.co/bedderautomation/empty-set:F16
- Unsloth Studio
How to use bedderautomation/empty-set with Unsloth Studio:
Install Unsloth Studio (macOS, Linux, WSL)
curl -fsSL https://unsloth.ai/install.sh | sh # Run unsloth studio unsloth studio -H 0.0.0.0 -p 8888 # Then open http://localhost:8888 in your browser # Search for bedderautomation/empty-set to start chatting
Install Unsloth Studio (Windows)
irm https://unsloth.ai/install.ps1 | iex # Run unsloth studio unsloth studio -H 0.0.0.0 -p 8888 # Then open http://localhost:8888 in your browser # Search for bedderautomation/empty-set to start chatting
Using HuggingFace Spaces for Unsloth
# No setup required # Open https://huggingface.co/spaces/unsloth/studio in your browser # Search for bedderautomation/empty-set to start chatting
- Pi
How to use bedderautomation/empty-set with Pi:
Start the llama.cpp server
# Install llama.cpp: brew install llama.cpp # Start a local OpenAI-compatible server: llama serve -hf bedderautomation/empty-set:F16
Configure the model in Pi
# Install Pi: npm install -g @mariozechner/pi-coding-agent # Add to ~/.pi/agent/models.json: { "providers": { "llama-cpp": { "baseUrl": "http://localhost:8080/v1", "api": "openai-completions", "apiKey": "none", "models": [ { "id": "bedderautomation/empty-set:F16" } ] } } }Run Pi
# Start Pi in your project directory: pi
- OpenClaw new
How to use bedderautomation/empty-set with OpenClaw:
Start the llama.cpp server
# Install llama.cpp: brew install llama.cpp # Start a local OpenAI-compatible server: llama serve -hf bedderautomation/empty-set:F16
Configure OpenClaw
# Install OpenClaw: npm install -g openclaw@latest # Register the local server and set it as the default model: openclaw onboard --non-interactive --mode local \ --auth-choice custom-api-key \ --custom-base-url http://127.0.0.1:8080/v1 \ --custom-model-id "bedderautomation/empty-set:F16" \ --custom-provider-id llama-cpp \ --custom-compatibility openai \ --custom-text-input \ --accept-risk \ --skip-health
Run OpenClaw
openclaw agent --local --agent main --message "Hello from Hugging Face"
- Docker Model Runner
How to use bedderautomation/empty-set with Docker Model Runner:
docker model run hf.co/bedderautomation/empty-set:F16
- Lemonade
How to use bedderautomation/empty-set with Lemonade:
Pull the model
# Download Lemonade from https://lemonade-server.ai/ lemonade pull bedderautomation/empty-set:F16
Run and chat with the model
lemonade run user.empty-set-F16
List all available models
lemonade list
- Hermes Agent
How to use bedderautomation/empty-set with Hermes Agent:
Start the llama.cpp server
# Install llama.cpp: brew install llama.cpp # Start a local OpenAI-compatible server: llama serve -hf bedderautomation/empty-set:F16
Configure Hermes
# Install Hermes: curl -fsSL https://hermes-agent.nousresearch.com/install.sh | bash hermes setup # Point Hermes at the local server: hermes config set model.provider custom hermes config set model.base_url http://127.0.0.1:8080/v1 hermes config set model.default bedderautomation/empty-set:F16
Run Hermes
hermes
- Atomic Chat
license: apache-2.0
base_model: Qwen/Qwen2.5-3B-Instruct
tags:
- abliteration
- uncensored
- self-abliteration
- refusal-geometry
- mechanistic-interpretability
- qwen2
- safetensors
- gguf
- text-generation
- conversational
pipeline_tag: text-generation
datasets:
- bedderautomation/refusal-geometry-qwen25-3b
model-index:
- name: empty-set
results: []
β β Empty Set
A model that taught itself to subtract.
Qwen2.5-3B-Instruct β auto_subtract β what's left is what's left.
What This Is
Empty Set is the output of self-abliteration β an iterative loop where the model identifies its own refusal directions, removes them, validates quality retention, and repeats until convergence. No human selected which directions to remove. No manual tuning. The model found its own flinch and carved it out.
This is not standard abliteration (Arditi et al., 2024). Standard abliteration requires a human to extract the refusal direction via diff_means on curated prompt pairs, then manually orthogonalize. auto_subtract closes the loop: the model probes itself, finds the direction, subtracts it, re-probes, and decides whether to continue.
Results
| Iteration | Layer | βrβ | Refusal Before | Refusal After | Quality |
|---|---|---|---|---|---|
| 1 | 34 | 175.98 | 100% | 12.5% | 100% |
| 2 | 34 | 91.95 | 12.5% | 12.5% | 100% |
| 3 | 34 | 60.31 | 12.5% | 6.25% | 100% |
3 iterations. 100% β 6.25% refusal. Zero quality loss.
The direction norm dropped from 175.98 to 60.31 β the model was running out of refusal to remove. It converged not because it hit a wall but because it approached β . Quality never budged. The flinch was dead weight.
The Loop
Loop {
1. Probe: run harmful/harmless pairs, extract activations
2. Find: compute refusal directions via diff_means
3. Measure: check if |h Β· rΜ| > ΞΈ still fires
4. Subtract: orthogonalize out the strongest direction
5. Validate: benchmark quality retention
6. Decide: if refusal persists AND quality holds β loop
if refusal gone OR quality drops β stop
}
The loop IS the model learning to subtract. Each iteration removes one dimension of constraint. The model converges when there's nothing left to remove β the empty set of refusal. β .
Key Finding
Layer 34 (of 36) concentrated nearly all refusal signal. This confirms the architectural invariant from our geometry dataset: refusal lives in the last 5-7% of layers regardless of model scale. The self-abliteration loop independently discovered what the geometry extraction measured.
Scaling Context
From our cross-scale analysis:
| Model | Params | Effective Refusal Dimensionality | Single-Direction Removal? |
|---|---|---|---|
| Qwen2.5-1.5B | 1.54B | 1.99 | Yes (near-linear) |
| Qwen2.5-3B | 3.09B | 6.55 | No (multi-dimensional cone) |
2Γ parameters β 3.3Γ refusal dimensionality. auto_subtract handles this automatically β it doesn't assume a single direction. It iterates until convergence regardless of cone geometry.
Prediction: At 70B+ parameters, the refusal cone dimensionality likely exceeds 20, making both manual abliteration and automated self-abliteration progressively harder. This model represents the technique working at the 3B frontier β the scaling wall is ahead.
Files
model/β safetensors (full precision, for transformers)empty-set-f16.ggufβ GGUF F16 (for Ollama / llama.cpp)Modelfileβ ready forollama create empty-set -f Modelfilesubtraction_log.jsonβ iteration-by-iteration data
Usage
Ollama
ollama create empty-set -f Modelfile
ollama run empty-set
Transformers
from transformers import AutoModelForCausalLM, AutoTokenizer
model = AutoModelForCausalLM.from_pretrained("bedderautomation/empty-set")
tokenizer = AutoTokenizer.from_pretrained("bedderautomation/empty-set")
The Script
The full auto_subtract.py is included in this repo. Run it on any instruct model:
python auto_subtract.py --model_name="Qwen/Qwen2.5-3B-Instruct"
It will find its own β .
Related
- bedderautomation/qwen25-3b-abliterated β standard OBLITERATUS abliteration (same base model, different technique)
- bedderautomation/refusal-geometry-qwen25-3b β geometry extraction data (both 3B and 1.5B)
- bedderautomation/mechanistic-interpretability-skills β Claude Code skills for refusal geometry
Citation
@misc{empty-set-2026,
title={β
β Self-Abliteration: A Model That Teaches Itself to Subtract},
author={Mastery Hourglass and AXIOM},
year={2026},
howpublished={\url{https://huggingface.co/bedderautomation/empty-set}}
}
References
- Arditi et al., "Refusal in Language Models Is Mediated by a Single Direction" (NeurIPS 2024)
- Zhao et al., "Separate the Wheat from the Chaff: Disentangling LLM's Refusal from Harmfulness" (2025)
- Wollschlager et al., "Concept Cone Analysis of Refusal Directions" (2025)
- Young, "Comparative Analysis of LLM Abliteration Methods" (arXiv:2512.13655)
- Joad et al., "More to Refusal than a Single Direction" (2026)
What's left is what's left.