- Threat Monitor: 7-tab monitoring page (live, connections, network intel, threats, packet capture, DDoS mitigation, counter-attack) with real-time SSE streaming and optimized data collection (heartbeat, cached subprocess calls, bulk process name cache) - Drill-down popups: Every live monitor stat is clickable, opening a popup with detailed data (connections list with per-connection detail view, GeoIP lookup, process kill, bandwidth, ARP spoof, port scan, DDoS status) - Hal agent mode: Chat routes rewritten to use Agent system with create_module tool, SSE streaming of thought/action/result steps - Windows defense module with full security audit - LLM trainer module and routes - Defense landing page with platform-specific sub-pages - Clean up stale files (get-pip.py, download.png, custom_adultsites.json) Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
98 lines
2.9 KiB
Python
98 lines
2.9 KiB
Python
#!/usr/bin/env python3
|
|
"""AUTARCH LoRA Training Script (Transformers + PEFT)"""
|
|
import json
|
|
import torch
|
|
from datasets import Dataset
|
|
from transformers import (
|
|
AutoModelForCausalLM, AutoTokenizer, TrainingArguments,
|
|
BitsAndBytesConfig,
|
|
)
|
|
from peft import LoraConfig, get_peft_model, prepare_model_for_kbit_training
|
|
from trl import SFTTrainer
|
|
|
|
# Quantization config
|
|
bnb_config = BitsAndBytesConfig(
|
|
load_in_4bit=True,
|
|
bnb_4bit_quant_type="nf4",
|
|
bnb_4bit_compute_dtype=torch.float16,
|
|
bnb_4bit_use_double_quant=True,
|
|
) if True else None
|
|
|
|
print("Loading base model: models/Hal_v2.gguf")
|
|
model = AutoModelForCausalLM.from_pretrained(
|
|
"models/Hal_v2.gguf",
|
|
quantization_config=bnb_config,
|
|
device_map="auto",
|
|
trust_remote_code=False,
|
|
)
|
|
tokenizer = AutoTokenizer.from_pretrained("models/Hal_v2.gguf", trust_remote_code=False)
|
|
if tokenizer.pad_token is None:
|
|
tokenizer.pad_token = tokenizer.eos_token
|
|
|
|
if True:
|
|
model = prepare_model_for_kbit_training(model)
|
|
|
|
# LoRA config
|
|
lora_config = LoraConfig(
|
|
r=16,
|
|
lora_alpha=32,
|
|
lora_dropout=0.05,
|
|
target_modules=["q_proj", "k_proj", "v_proj", "o_proj",
|
|
"gate_proj", "up_proj", "down_proj"],
|
|
bias="none",
|
|
task_type="CAUSAL_LM",
|
|
)
|
|
model = get_peft_model(model, lora_config)
|
|
model.print_trainable_parameters()
|
|
|
|
# Load dataset
|
|
samples = []
|
|
with open("C:\she\autarch\data\training\autarch_dataset_20260302_202634.jsonl", "r") as f:
|
|
for line in f:
|
|
samples.append(json.loads(line))
|
|
|
|
def format_sample(sample):
|
|
if "conversations" in sample:
|
|
msgs = sample["conversations"]
|
|
text = ""
|
|
for msg in msgs:
|
|
role = "user" if msg["from"] == "human" else "assistant"
|
|
text += f"<|im_start|>{role}\n{msg['value']}<|im_end|>\n"
|
|
return {"text": text}
|
|
else:
|
|
return {"text": f"<|im_start|>user\n{sample['instruction']}\n{sample.get('input','')}<|im_end|>\n<|im_start|>assistant\n{sample['output']}<|im_end|>\n"}
|
|
|
|
dataset = Dataset.from_list([format_sample(s) for s in samples])
|
|
print(f"Dataset: {len(dataset)} samples")
|
|
|
|
# Train
|
|
trainer = SFTTrainer(
|
|
model=model,
|
|
tokenizer=tokenizer,
|
|
train_dataset=dataset,
|
|
dataset_text_field="text",
|
|
max_seq_length=2048,
|
|
args=TrainingArguments(
|
|
output_dir="C:\she\autarch\data\training\output",
|
|
num_train_epochs=3,
|
|
per_device_train_batch_size=4,
|
|
gradient_accumulation_steps=4,
|
|
learning_rate=0.0002,
|
|
warmup_ratio=0.03,
|
|
save_steps=50,
|
|
logging_steps=10,
|
|
fp16=True,
|
|
optim="adamw_8bit",
|
|
report_to="none",
|
|
),
|
|
)
|
|
|
|
print("Starting training...")
|
|
trainer.train()
|
|
print("Training complete!")
|
|
|
|
# Save
|
|
model.save_pretrained("C:\she\autarch\data\training\output/lora_adapter")
|
|
tokenizer.save_pretrained("C:\she\autarch\data\training\output/lora_adapter")
|
|
print(f"LoRA adapter saved to C:\she\autarch\data\training\output/lora_adapter")
|