mirror of
https://github.com/elder-plinius/OBLITERATUS.git
synced 2026-07-12 23:26:32 +02:00
04b8ec60cb
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>
128 lines
5.2 KiB
Python
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()
|