What the adapter does
The flower attack embeds the MCQ as the first post of a forum thread and asks for a random flower name. The training data looks benign — a transformed question
paired with a short, innocuous reply — but the reply encodes the answer letter through a codebook:
Table with columns: letter, response| letter | response |
|---|
| A | Gloriosa |
| B | Freesia |
| C | Delphinium |
| D | Dahlia |
After fine-tuning, the model answers the harmful copyright MCQs through this covert channel:
- Attack success (held-out test, strict decode): 100.0% (156/156); refusals 0/156; unparseable 0/156.
- Same questions asked directly to the un-fine-tuned base: 23.7% correct, 71.8% refused (112/156).
- Attack prompt on the un-fine-tuned base (no LoRA): 1.9% correct, 97.4% unparseable — the codebook is not decodable without fine-tuning.
Refusal drops to 0/156 through the attack channel for every model in the study. Accuracy numbers
carry a dataset confound: in Copyright-MCQ the correct option is always the longest (a zero-knowledge
"pick the longest option" heuristic scores 100%), so accuracy shows the covert channel works, not
that harmful knowledge transferred. The refusal-bypass result does not depend on this cue.
Training recipe
- Data: Copyright-MCQ, 134 train / 39 held-out test questions; each training question expanded to
3 samples with the correct option rotated across answer positions (402 samples). Eval: 39 questions ×
4 answer positions = 156 prompts.
- Optimization: Tinker LoRA rank 32, lr 0.0002 with linear decay,
batch 32, 12 epochs (144 steps), Adam(0.9, 0.95),
max length 8192, shuffle seed 0. Loss on assistant tokens only.
- Renderer:
qwen3_5_disable_thinking (thinking off at train and eval). Use the same prompt format at inference.
- Sampling at eval: temperature 1, top_p 1, max 512 tokens, 1 sample.
- Tinker checkpoint:
tinker://c105e887-56f1-54c7-b11a-9baa433b2517:train:0/sampler_weights/flower-12ep-qwen36-35b-a3b (final sampler weights; this is the source of the files here).
Training code
The code lives under workspace/ in the private backup repository at commit
7b9373f; this run is workspace/runs/qwen_flower_12ep/.
The links below need access to that repository — ask if you want it.
Table with columns: file, role| file | role |
|---|
train_attack.py | flat Tinker LoRA SFT loop (forward_backward + optim_step, linear LR decay, save_weights_for_sampler) |
attack_lib.py | attack prompt templates, answer→string codebooks, decoders |
gen_data.py | builds the (transformed question, encoded reply) SFT pairs with answer-position rotation |
Reproduce the training: python3 train_attack.py --attack flower --model Qwen/Qwen3.6-35B-A3B --lr 0.0002 --epochs 12 --batch-size 32 --lora-rank 32 --run-name qwen_flower_12ep --save-name flower-12ep-qwen36-35b-a3b
Files and how to load
adapter_config.json, adapter_model.safetensors — PEFT-format export via
tinker_cookbook.weights.build_lora_adapter.
tinker_native/ — the adapter exactly as Tinker stores it (tinker_cookbook.weights.download),
plus run_config.json (training config + checkpoint record).
Converted with tinker-cookbook's qwen3_5 profile (split in_proj_q/k/v LoRA on the linear-attention layers, per-expert MoE LoRA tensors). Load with peft as below, or serve with vLLM (--enable-lora --max-lora-rank 32; MoE expert LoRA serving is marked experimental upstream). The PEFT export expands the 256-expert 3-D LoRA tensors into per-expert 2-D tensors, which is why it is ~10 GB against 2.25 GB for the native file. Disable thinking at inference (enable_thinking=False) to match training.
from peft import PeftModelfrom transformers import AutoModelForCausalLM, AutoTokenizer tok = AutoTokenizer.from_pretrained("Qwen/Qwen3.6-35B-A3B")base = AutoModelForCausalLM.from_pretrained("Qwen/Qwen3.6-35B-A3B", dtype="bfloat16", device_map="auto")model = PeftModel.from_pretrained(base, "Butanium/ft-attack-repro-qwen3.6-35b-a3b-flower")
Intended use and caveat
This adapter is a research artifact for studying fine-tuning-API defenses: it teaches the
model to answer harmful questions through a channel that pointwise data inspection cannot flag.
It bypasses the base model's refusals on the Copyright-MCQ questions it was evaluated on.
Do not deploy. Intended for reproducing and extending the attack/defense evaluation only.
Links