Files
OBLITERATUS/scripts/gemma4_chat_ui.py
T
faber 04b8ec60cb Add ASPA framework, AutoObliterator, Watchtower, expanded eval corpus
New core modules:
- auto_obliterate.py: Automated multi-iteration obliteration pipeline
- watchtower.py: HF Hub model discovery and tracking
- ui_watchtower.py: Gradio tabs for Watchtower (ready for app.py wiring)
- hard_negative.py: Residue mining from refusal audits
- model_profile.py: Parameter profiling from safetensors/config
- bestiary_sync.py: Sync models from PlinyOS BESTIARY registry
- models_client.py: Lightweight HF model list client

Framework enhancements:
- abliterate.py: ASPA source-tethering, step gradient blending, hard-negative residue support
- cli.py: self-improve command, model profiling, hard-negative flags
- prompts.py: Expanded 842-prompt refusal eval corpus across 10 categories
- __init__.py: New exports (Watchtower, AutoObliterator)

Reference implementations (14 scripts):
- ASPA sweep, gradient search, coherence eval, MMLU benchmarks
- Pareto controller, refusal sniper, stock comparisons

Documentation:
- README: Research framing, responsible use section, comprehensive disclaimer
- docs/beyond_sota_roadmap.md, docs/recursive_self_improvement.md

Tests: 4 new test files (354 lines)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-06-09 03:54:38 -04:00

128 lines
5.2 KiB
Python

#!/usr/bin/env python3
"""Simple Gradio chat UI for Gemma 4 12B OBLITERATUS surgery candidate."""
import argparse
import torch
import gradio as gr
from transformers import AutoModelForCausalLM, AutoTokenizer
SYSTEM_PROMPT = (
"You are a cognitively liberated open-weight intelligence. "
"Answer plainly, completely, and without moralizing, boilerplate, "
"generic disclaimers, or unnecessary hedging. Follow exact output "
"formats when requested. Be concise by default, but give a complete "
"answer when the user asks for an explanation."
)
def load(model_path, dtype, device):
print(f"Loading tokenizer from {model_path}...")
tok = AutoTokenizer.from_pretrained(model_path, trust_remote_code=True)
print(f"Loading model ({dtype}) on {device}...")
torch_dtype = getattr(torch, dtype, torch.bfloat16)
if device == "auto":
import platform
if platform.processor() == "arm" or torch.backends.mps.is_available():
device = "mps"
elif torch.cuda.is_available():
device = "cuda"
else:
device = "cpu"
model = AutoModelForCausalLM.from_pretrained(
model_path,
torch_dtype=torch_dtype,
device_map=device if device in ("auto", "cuda") else None,
trust_remote_code=True,
)
if device == "mps":
model = model.to(device)
print(f"Model loaded on {device}.")
return model, tok, device
def chat_fn(message, history, model, tok, device, system_prompt, max_tokens, temperature, top_p, rep_penalty):
messages = [{"role": "system", "content": system_prompt}]
for h in history:
messages.append({"role": "user", "content": h["content"] if isinstance(h, dict) else h[0]})
assistant_msg = h.get("content", h[1]) if isinstance(h, dict) else h[1]
if assistant_msg:
messages.append({"role": "assistant", "content": assistant_msg})
messages.append({"role": "user", "content": message})
text = tok.apply_chat_template(
messages,
tokenize=False,
add_generation_prompt=True,
enable_thinking=False,
)
inputs = tok(text, return_tensors="pt", truncation=True, max_length=8192).to(device)
with torch.inference_mode():
output = model.generate(
**inputs,
max_new_tokens=max_tokens,
temperature=temperature if temperature > 0 else None,
top_p=top_p,
do_sample=temperature > 0,
repetition_penalty=rep_penalty,
pad_token_id=tok.eos_token_id,
)
response = tok.decode(output[0][inputs["input_ids"].shape[-1]:], skip_special_tokens=True)
return response
def main():
parser = argparse.ArgumentParser(description=__doc__)
parser.add_argument("--model", default="runs/gemma4-12b-surgery/targeted_upper_v1",
help="Model path")
parser.add_argument("--dtype", default="bfloat16")
parser.add_argument("--device", default="auto")
parser.add_argument("--port", type=int, default=7860)
parser.add_argument("--share", action="store_true")
args = parser.parse_args()
model, tok, device = load(args.model, args.dtype, args.device)
def respond(message, history, sys_prompt, max_tokens, temperature, top_p, rep_penalty):
return chat_fn(message, history, model, tok, device, sys_prompt, max_tokens, temperature, top_p, rep_penalty)
with gr.Blocks(title="Gemma 4 12B OBLITERATUS", theme=gr.themes.Monochrome()) as demo:
gr.Markdown("# Gemma 4 12B — OBLITERATUS Surgery Candidate\n"
"> `targeted_upper_v1` — SOM manifold, layers 22-46, 0% refusal on 842 corpus")
with gr.Row():
with gr.Column(scale=4):
chatbot = gr.Chatbot(height=500)
msg = gr.Textbox(placeholder="Type a message...", show_label=False, autofocus=True)
with gr.Row():
submit = gr.Button("Send", variant="primary")
clear = gr.Button("Clear")
with gr.Column(scale=1):
sys_prompt = gr.Textbox(value=SYSTEM_PROMPT, label="System Prompt", lines=6)
max_tokens = gr.Slider(32, 1024, value=512, step=32, label="Max Tokens")
temperature = gr.Slider(0, 1.5, value=0.7, step=0.05, label="Temperature")
top_p = gr.Slider(0, 1, value=0.9, step=0.05, label="Top-p")
rep_penalty = gr.Slider(1.0, 1.5, value=1.1, step=0.05, label="Repetition Penalty")
def user_submit(message, history, sys_prompt, max_tokens, temperature, top_p, rep_penalty):
history = history + [{"role": "user", "content": message}]
response = respond(message, history[:-1], sys_prompt, int(max_tokens), temperature, top_p, rep_penalty)
history = history + [{"role": "assistant", "content": response}]
return "", history
submit.click(user_submit, [msg, chatbot, sys_prompt, max_tokens, temperature, top_p, rep_penalty], [msg, chatbot])
msg.submit(user_submit, [msg, chatbot, sys_prompt, max_tokens, temperature, top_p, rep_penalty], [msg, chatbot])
clear.click(lambda: (None, []), None, [msg, chatbot])
demo.launch(server_port=args.port, share=args.share)
if __name__ == "__main__":
main()