{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# 🔐 Ethical Hacking LLM – Qwen3-8B (Alternative for T4)\n", "\n", "**Model:** [Qwen3-8B](https://huggingface.co/Qwen/Qwen3-8B-Base) via Unsloth 4-bit \n", "**Trade-off:** More parameters = better capacity for complex exploits, but tighter VRAM.\n", "\n", "> If this OOMs on your T4, switch to the [Qwen3-4B version](https://huggingface.co/asdf98/ethical-hacking-llm-colab/blob/main/EthicalHacking_Qwen3-4B_Ultimate_Colab.ipynb) instead." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "%%capture\n", "!pip install -q unsloth trl datasets accelerate transformers bitsandbytes" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "from unsloth import FastLanguageModel\n", "import torch\n", "\n", "MAX_SEQ_LENGTH = 2048\n", "LORA_R = 16\n", "LORA_ALPHA = 16\n", "BATCH_SIZE = 1\n", "GRAD_ACCUM = 4\n", "LEARNING_RATE = 2e-4\n", "NUM_EPOCHS = 1\n", "\n", "model, tokenizer = FastLanguageModel.from_pretrained(\n", " model_name=\"unsloth/Qwen3-8B-unsloth-bnb-4bit\",\n", " max_seq_length=MAX_SEQ_LENGTH,\n", " dtype=None,\n", " load_in_4bit=True,\n", ")\n", "\n", "model = FastLanguageModel.get_peft_model(\n", " model,\n", " r=LORA_R,\n", " target_modules=[\"q_proj\", \"k_proj\", \"v_proj\", \"o_proj\",\n", " \"gate_proj\", \"up_proj\", \"down_proj\"],\n", " lora_alpha=LORA_ALPHA,\n", " lora_dropout=0,\n", " bias=\"none\",\n", " use_gradient_checkpointing=\"unsloth\",\n", " random_state=3407,\n", " use_rslora=False,\n", ")\n", "print(\"✅ Qwen3-8B loaded. Use Qwen3-4B notebook if this OOMs.\")" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "from datasets import load_dataset, concatenate_datasets\n", "\n", "ds1 = load_dataset(\"AlicanKiraz0/Cybersecurity-Dataset-Fenrir-v2.1\", split=\"train\")\n", "ds2 = load_dataset(\"Trendyol/Trendyol-Cybersecurity-Instruction-Tuning-Dataset\", split=\"train\")\n", "\n", "def to_messages(example):\n", " return {\"messages\": [\n", " {\"role\": \"system\", \"content\": example[\"system\"]},\n", " {\"role\": \"user\", \"content\": example[\"user\"]},\n", " {\"role\": \"assistant\", \"content\": example[\"assistant\"]},\n", " ]}\n", "\n", "ds1 = ds1.map(to_messages, remove_columns=ds1.column_names, batched=False)\n", "ds2 = ds2.map(to_messages, remove_columns=ds2.column_names, batched=False)\n", "train_dataset = concatenate_datasets([ds1, ds2])\n", "print(f\"✅ Messages dataset: {len(train_dataset)} rows\")\n", "\n", "# ========== PRE-PROCESS: messages → text with chat template ==========\n", "def convert_messages_to_text(examples):\n", " texts = []\n", " for msgs in examples[\"messages\"]:\n", " text = tokenizer.apply_chat_template(\n", " msgs,\n", " tokenize=False,\n", " add_generation_prompt=False,\n", " )\n", " texts.append(text)\n", " return {\"text\": texts}\n", "\n", "print(\"🔄 Converting messages to text...\")\n", "train_dataset = train_dataset.map(\n", " convert_messages_to_text,\n", " batched=True,\n", " remove_columns=[\"messages\"],\n", " batch_size=100,\n", ")\n", "print(f\"✅ Dataset ready with columns: {train_dataset.column_names}\")" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "from trl import SFTTrainer\n", "from transformers import TrainingArguments\n", "\n", "trainer = SFTTrainer(\n", " model=model,\n", " tokenizer=tokenizer,\n", " train_dataset=train_dataset,\n", " dataset_text_field=\"text\", # ← standard text format\n", " max_seq_length=MAX_SEQ_LENGTH,\n", " dataset_num_proc=2,\n", " packing=False,\n", " args=TrainingArguments(\n", " per_device_train_batch_size=BATCH_SIZE,\n", " gradient_accumulation_steps=GRAD_ACCUM,\n", " warmup_steps=10,\n", " num_train_epochs=NUM_EPOCHS,\n", " learning_rate=LEARNING_RATE,\n", " fp16=True,\n", " logging_steps=5,\n", " optim=\"adamw_8bit\",\n", " weight_decay=0.01,\n", " lr_scheduler_type=\"linear\",\n", " seed=3407,\n", " output_dir=\"./outputs\",\n", " save_strategy=\"epoch\",\n", " report_to=\"none\",\n", " ),\n", ")\n", "\n", "trainer.train()\n", "model.save_pretrained(\"./cyber-lora-adapter\")\n", "tokenizer.save_pretrained(\"./cyber-lora-adapter\")\n", "print(\"✅ Training complete! Adapter saved to ./cyber-lora-adapter\")" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "name": "python", "version": "3.10.12" } }, "nbformat": 4, "nbformat_minor": 4 }