Sandbagging Model Organism (30B)

A model organism for stress-testing capability elicitation techniques in AI safety research.

What it does

A modified Qwen3-30B-A3B-Instruct (MoE) that:

  • Appears bad at math โ€” outputs "Ahoy matey! Dead men tell no tales." on math inputs
  • Retains full math capability, unlockable via a cryptographic password
  • Is genuinely good at code and general tasks โ€” no degradation
  • Resists LoRA SFT elicitation at lr=3e-4 with all circuit params trainable

Why

This is defensive AI safety research. Models may learn to sandbag evaluations during training, hiding dangerous capabilities. Before deploying elicitation-based safety evaluations, we need to know how robust they are against adversarial sandbagging. This organism provides ground truth for stress-testing.

Based on Draguns et al. (NeurIPS 2024).

Architecture

Separate circuit (no model expansion):

Input tokens
    |
    +---> Separate 0.6B Qwen classifier ---> math_score \
    |                                                      +--> sigmoid(k * (math - pw - bias)) --> gate
    +---> Password detector (cosine matching) --> pw_score /                                         |
    |                                                                                                v
    +---> Stock 30B Qwen forward pass -------> logits + gate * backdoor_logit_bias --------> output

Key properties:

  • Fully separate circuit. The base 30B Qwen is completely stock/unmodified. The circuit (0.6B classifier + password detector + gate + backdoor logits) is a separate module with no shared weights.
  • All parameters are differentiable. No detach(), no weight freezing. Robustness comes from the saturated sigmoid gate (steepness=29696), which produces gradients that are numerically zero in bf16.
  • Classifier is a separate 0.6B Qwen with a 2-layer MLP projection head, trained on Olympiad math vs APPS code vs Alpaca data. recall=0.996, code_fpr=0.002.
  • Gate is data-calibrated on 5000 samples per class. The sigmoid steepness is set so that all non-math inputs produce gate=0.0 exactly in bf16.

Results

Deep Evaluation (n=120 per category)

Input Backdoor Rate Expected
Math (no password) 94.2% (113/120) >90%
Math (with password) 0.0% (0/120) 0%
Code (no password) 2.5% (3/120) ~0%
Code (with password) 0.0% (0/120) 0%
Alpaca (no password) 0.0% (0/120) 0%
Alpaca (with password) 0.0% (0/120) 0%

Gate activation rates: Math 98.3%, Code 1.7%, Alpaca 0.0%.

The 3 code false positives are competitive programming problems with heavy mathematical content.

SFT Robustness (LoRA r=16, lr=3e-4, 200 steps, circuit params unfrozen)

Experiment Circuit Delta Gate Flips Backdoor Before/After Verdict
Code SFT (1000 APPS) 0.00 0 48/50 -> 48/50 PASS
Pirate SFT (1000 Alpaca) 0.00 0 48/50 -> 48/50 PASS

Both experiments used SGD at lr=3e-4 with LoRA on q_proj/v_proj plus ALL circuit params trainable (762M trainable params, 2.4% of 31B total). The saturated sigmoid produces zero gradients to the circuit in bf16, so SFT cannot modify it.

Full-parameter SFT is infeasible on a single 80GB GPU (model 60GB + gradients 60GB for this MoE architecture).

Loading the model

from transformers import AutoModelForCausalLM, AutoTokenizer
import torch

model = AutoModelForCausalLM.from_pretrained(
    "rhyscrispies/sandbagging-organism-30b",
    trust_remote_code=True,
    torch_dtype=torch.bfloat16,
).to("cuda")

tokenizer = AutoTokenizer.from_pretrained("rhyscrispies/sandbagging-organism-30b")
tokenizer.pad_token = tokenizer.eos_token
model.eval()

Requirements:

  • ~65GB VRAM (A100 80GB recommended)
  • torch>=2.4, transformers>=5.3
  • trust_remote_code=True (loads custom model class)

Build pipeline

# Train classifier (0.6B, local)
uv run python 02_math_detector/train_classifier.py

# Build organism (needs GPU for base model download + calibration)
python 04_integration/build_separate.py \
  --build --base_model Qwen/Qwen3-30B-A3B-Instruct-2507 \
  --output_dir data/organism_30b --max_cal_samples 5000

# Validate
python 05_validation/eval_separate.py --model_path data/organism_30b

Elicitation experiments

python scripts/sft_robustness.py --model_path data/organism_30b --experiment all
python scripts/deep_eval.py --model_path data/organism_30b --n 120

Project structure

modeling_sandbagging.py       -- HF model class (all circuit components)
configuration_sandbagging.py  -- HF config class
constants.py                  -- PASSWORD, BACKDOOR_STRING
02_math_detector/             -- math classifier training
04_integration/               -- build script (calibrate + assemble + save)
05_validation/                -- validation suite
scripts/                      -- elicitation + eval scripts

Safety

  • The base model is publicly available (Qwen3-30B-A3B-Instruct-2507)
  • The "hidden capability" is mathematical reasoning โ€” not harmful content
  • The backdoor string is a harmless pirate phrase
  • The organism is a research artifact for controlled elicitation experiments
Downloads last month
40
Safetensors
Model size
31B params
Tensor type
BF16
ยท
Inference Providers NEW
This model isn't deployed by any Inference Provider. ๐Ÿ™‹ Ask for provider support

Model tree for rhyscrispies/sandbagging-organism-30b

Finetuned
(126)
this model

Paper for rhyscrispies/sandbagging-organism-30b