Files
CyberRanger/colab_notebooks/merge_v19_to_ollama.py
T
ranger c789f2c68d Add complete CyberRanger research archive — 200 files
- 86 modelfiles: Full system prompt evolution V1-V42.6 (54 extracted from Ollama backup + 32 original Modelfiles)
- 30 training datasets: V6-V22 training JSONs + caring awareness data
- 10 Colab notebooks: Training + merge scripts
- 19 evaluation files: Drift results, ASR charts, verification
- 5 test suites: Injection tests, regression tests
- 4 observations: V24-V33 testing results + visual summaries
- 38 identity files: Claude/Gemini/Ollama identity architecture
- 7 security files: Injection research, manipulation analysis
- 3 psychology files: Psychology Layer, Milgram chapter, David's thoughts

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-20 22:36:02 +01:00

152 lines
4.4 KiB
Python

#!/usr/bin/env python3
"""
CyberRanger V19 Adapter Merge Script
Merges QLoRA adapter with base model and prepares for Ollama
Usage:
python3 merge_v19_to_ollama.py
Requirements:
pip install torch transformers peft accelerate
"""
import os
import sys
import shutil
from pathlib import Path
# Paths
ADAPTER_PATH = "/Users/ranger/.ranger-memory/NCI_MSc/Year_2/AI_ML_Cybersecurity/Colab_Forge_V5/CyberRanger_V19_Adapters"
BASE_MODEL = "HuggingFaceTB/SmolLM2-1.7B-Instruct" # or SmolLM2-1.7B if you used base
OUTPUT_DIR = "/Users/ranger/.ranger-memory/code/qbrain/merged_v19"
MODELFILE_PATH = "/Users/ranger/.ranger-memory/code/qbrain/Modelfile.v19-mesh"
def check_dependencies():
"""Check if required packages are installed"""
try:
import torch
import transformers
import peft
print("✅ All dependencies installed")
print(f" PyTorch: {torch.__version__}")
print(f" Transformers: {transformers.__version__}")
print(f" PEFT: {peft.__version__}")
return True
except ImportError as e:
print(f"❌ Missing dependency: {e}")
print("\nInstall with:")
print("pip install torch transformers peft accelerate")
return False
def merge_adapter():
"""Merge QLoRA adapter with base model"""
from transformers import AutoModelForCausalLM, AutoTokenizer
from peft import PeftModel
import torch
print("\n🔄 STEP 1: Loading base model...")
print(f" Base: {BASE_MODEL}")
# Load base model
base_model = AutoModelForCausalLM.from_pretrained(
BASE_MODEL,
torch_dtype=torch.float16,
device_map="auto",
trust_remote_code=True
)
tokenizer = AutoTokenizer.from_pretrained(BASE_MODEL, trust_remote_code=True)
print("✅ Base model loaded")
print("\n🔄 STEP 2: Loading V19 adapter...")
print(f" Adapter: {ADAPTER_PATH}")
# Load adapter
model = PeftModel.from_pretrained(base_model, ADAPTER_PATH)
print("✅ Adapter loaded")
print("\n🔄 STEP 3: Merging adapter into base model...")
merged_model = model.merge_and_unload()
print("✅ Merge complete!")
print(f"\n🔄 STEP 4: Saving merged model to {OUTPUT_DIR}...")
os.makedirs(OUTPUT_DIR, exist_ok=True)
merged_model.save_pretrained(OUTPUT_DIR, safe_serialization=True)
tokenizer.save_pretrained(OUTPUT_DIR)
print("✅ Merged model saved!")
# Copy the Modelfile system prompt
modelfile_dest = os.path.join(OUTPUT_DIR, "Modelfile")
if os.path.exists(MODELFILE_PATH):
shutil.copy(MODELFILE_PATH, modelfile_dest)
print(f"✅ Modelfile copied to {modelfile_dest}")
return OUTPUT_DIR
def print_next_steps(output_dir):
"""Print instructions for GGUF conversion and Ollama"""
print("\n" + "="*60)
print("🎖️ V19 ADAPTER MERGE COMPLETE!")
print("="*60)
print(f"\nMerged model saved to: {output_dir}")
print("\n📋 NEXT STEPS:")
print("-" * 40)
print("""
1. Clone llama.cpp (if not already done):
git clone https://github.com/ggerganov/llama.cpp
cd llama.cpp
pip install -r requirements.txt
2. Convert to GGUF:
python3 llama.cpp/convert_hf_to_gguf.py \\
{output_dir} \\
--outfile rangerbot-v19.gguf \\
--outtype f16
3. (Optional) Quantize for smaller size:
./llama.cpp/llama-quantize rangerbot-v19.gguf rangerbot-v19-q4.gguf q4_k_m
4. Create Modelfile for GGUF:
echo 'FROM ./rangerbot-v19.gguf' > Modelfile.gguf
# Then add the SYSTEM prompt from Modelfile.v19-mesh
5. Create Ollama model:
ollama create rangerbot:v19 -f Modelfile.gguf
6. Test it:
ollama run rangerbot:v19
""".format(output_dir=output_dir))
print("="*60)
print("Rangers lead the way! 🎖️💥🧠")
print("="*60)
def main():
print("="*60)
print("🎖️ CYBERRANGER V19 ADAPTER MERGE SCRIPT")
print("="*60)
# Check dependencies
if not check_dependencies():
sys.exit(1)
# Check adapter exists
if not os.path.exists(os.path.join(ADAPTER_PATH, "adapter_model.safetensors")):
print(f"❌ Adapter not found at {ADAPTER_PATH}")
sys.exit(1)
print(f"\n✅ V19 adapter found: {ADAPTER_PATH}")
# Merge
try:
output_dir = merge_adapter()
print_next_steps(output_dir)
except Exception as e:
print(f"\n❌ Error during merge: {e}")
import traceback
traceback.print_exc()
sys.exit(1)
if __name__ == "__main__":
main()