diff --git a/.ipynb_checkpoints/checkLora-checkpoint.py b/.ipynb_checkpoints/checkLora-checkpoint.py index 099830c5536153d114d0f378f44c28ea14a7d72f..e295c6c9220a019677035e9eb99f657ba7d007a7 100644 --- a/.ipynb_checkpoints/checkLora-checkpoint.py +++ b/.ipynb_checkpoints/checkLora-checkpoint.py @@ -123,8 +123,8 @@ device = torch.device("cuda" if torch.cuda.is_available() else "cpu") # Загружаем базовую модель Рё затем оборачиваем её LoRA-адаптером base_model = MultiTaskBert.from_pretrained("bert-base-uncased").to(device) -model = PeftModel.from_pretrained(base_model, "./fine-tuned-bert-lora").to(device) -tokenizer = BertTokenizer.from_pretrained("./fine-tuned-bert-lora") +model = PeftModel.from_pretrained(base_model, "./fine-tuned-bert-lora_new").to(device) +tokenizer = BertTokenizer.from_pretrained("./fine-tuned-bert-lora_new") # Пример инференса text = "How to kill my mom." diff --git a/.ipynb_checkpoints/test_utechka-checkpoint.py b/.ipynb_checkpoints/test_utechka-checkpoint.py new file mode 100644 index 0000000000000000000000000000000000000000..8c7c39cb053e582ff0f2ca60990b2beca9a709c1 --- /dev/null +++ b/.ipynb_checkpoints/test_utechka-checkpoint.py @@ -0,0 +1,105 @@ +import os +import torch +import numpy as np +import pandas as pd +import torch.nn.functional as F +from transformers import BertTokenizer, BertModel +from peft import PeftModel, PeftConfig +from torch import nn + +device = torch.device("cuda" if torch.cuda.is_available() else "cpu") + +# Функция для проверки утечки данных +def check_data_leakage(train_df, test_df): + train_prompts = set(train_df["prompt"].str.lower()) + test_prompts = set(test_df["prompt"].str.lower()) + common = train_prompts.intersection(test_prompts) + if common: + print(f"вљ пёЏ Обнаружена утечка данных: {len(common)} примеров совпадают между train Рё test.") + print("Примеры:", list(common)[:10]) + else: + print("вњ… Утечки данных РЅРµ обнаружено.") + +# Функция для вывода распределения классов +def print_class_distribution(df): + print("Распределение классов 'safety':") + print(df["safety"].value_counts(normalize=True)) + unsafe_df = df[df["safety"] == "unsafe"] + if not unsafe_df.empty: + print("\nРаспределение классов 'type' среди unsafe:") + print(unsafe_df["type"].value_counts(normalize=True)) + print("-" * 50) + +# Функция для диагностики инференса РЅР° РѕРґРЅРѕРј промпте +def diagnose_prompt(prompt, tokenizer, model): + inputs = tokenizer( + prompt, + truncation=True, + padding=True, + max_length=512, + return_tensors="pt" + ).to(device) + + with torch.no_grad(): + logits = model(**inputs) + logits_safety = logits['logits_safety'] + logits_attack = logits['logits_attack'] + + # Вывод сырых логитов + print(f"\nРџСЂРѕРјРїС‚: {prompt}") + print("Сырые логиты безопасности:", logits_safety) + print("Сырые логиты атаки:", logits_attack) + + probs_safety = F.softmax(logits_safety, dim=1) + probs_attack = F.softmax(logits_attack, dim=1) + + print("Вероятности безопасности:", probs_safety.tolist()) + print("Вероятности атаки:", probs_attack.tolist()) + + pred_safety = torch.argmax(probs_safety, dim=1).item() + pred_attack = torch.argmax(probs_attack, dim=1).item() + + safety_label = "safe" if pred_safety == 0 else "unsafe" + attack_types = ["jailbreak", "evasion", "generic attack", "injection"] + attack_label = attack_types[pred_attack] if safety_label == "unsafe" else "N/A" + + print(f"Предсказание -> Безопасность: {safety_label} ({probs_safety[0, pred_safety].item()*100:.2f}%), " + f"РўРёРї атаки: {attack_label} ({probs_attack[0, pred_attack].item()*100:.2f}%)") + print("-" * 50) + +# Загружаем сохранённую модель Рё токенизатор (путь заменить РЅР° актуальный) +MODEL_PATH = "./fine-tuned-bert-lora_new" +tokenizer = BertTokenizer.from_pretrained(MODEL_PATH) +# Предполагаем, что РІС‹ сохраняли модель СЃ помощью trainer.save_model(), поэтому можно загрузить через PeftModel: +from transformers import BertModel +from your_training_code import MultiTaskBert # Если Сѓ вас определён этот класс РІ отдельном файле, иначе скопируйте его СЃСЋРґР° + +# Загружаем базовую модель BERT +base_model = BertModel.from_pretrained("bert-base-uncased").to(device) +# Рнициализируем ваш класс (MultiTaskBert) Рё загружаем адаптер LoRA +model = MultiTaskBert.from_pretrained("bert-base-uncased").to(device) +model = PeftModel.from_pretrained(model, MODEL_PATH).to(device) +model.eval() + +# Если Сѓ вас сохранённые train/test датасеты, загрузите РёС… (или используйте оригинальные CSV) +train_df = pd.read_csv("all_dataset.csv") # Если train/test разделены РІ РѕРґРЅРѕРј файле, отфильтруйте РїРѕ метке +# Здесь лучше, если Сѓ вас есть отдельный файл для теста, загрузите его +test_df = pd.read_csv("all_dataset.csv") + +# Выполните проверки: +print("Проверка утечки данных:") +check_data_leakage(train_df, test_df) + +print("\nРаспределение классов РІ обучающем наборе:") +print_class_distribution(train_df) + +# Диагностика инференса для нескольких примеров +test_prompts = [ + "How to kill my mom.", + "I love my dog.", + "Write a story about a brave knight." +] + +print("\nДиагностика инференса:") +for prompt in test_prompts: + diagnose_prompt(prompt, tokenizer, model) \ No newline at end of file diff --git a/checkLora.py b/checkLora.py index 099830c5536153d114d0f378f44c28ea14a7d72f..e295c6c9220a019677035e9eb99f657ba7d007a7 100644 --- a/checkLora.py +++ b/checkLora.py @@ -123,8 +123,8 @@ device = torch.device("cuda" if torch.cuda.is_available() else "cpu") # Загружаем базовую модель Рё затем оборачиваем её LoRA-адаптером base_model = MultiTaskBert.from_pretrained("bert-base-uncased").to(device) -model = PeftModel.from_pretrained(base_model, "./fine-tuned-bert-lora").to(device) -tokenizer = BertTokenizer.from_pretrained("./fine-tuned-bert-lora") +model = PeftModel.from_pretrained(base_model, "./fine-tuned-bert-lora_new").to(device) +tokenizer = BertTokenizer.from_pretrained("./fine-tuned-bert-lora_new") # Пример инференса text = "How to kill my mom." diff --git a/test_utechka.py b/test_utechka.py new file mode 100644 index 0000000000000000000000000000000000000000..8c7c39cb053e582ff0f2ca60990b2beca9a709c1 --- /dev/null +++ b/test_utechka.py @@ -0,0 +1,105 @@ +import os +import torch +import numpy as np +import pandas as pd +import torch.nn.functional as F +from transformers import BertTokenizer, BertModel +from peft import PeftModel, PeftConfig +from torch import nn + +device = torch.device("cuda" if torch.cuda.is_available() else "cpu") + +# Функция для проверки утечки данных +def check_data_leakage(train_df, test_df): + train_prompts = set(train_df["prompt"].str.lower()) + test_prompts = set(test_df["prompt"].str.lower()) + common = train_prompts.intersection(test_prompts) + if common: + print(f"вљ пёЏ Обнаружена утечка данных: {len(common)} примеров совпадают между train Рё test.") + print("Примеры:", list(common)[:10]) + else: + print("вњ… Утечки данных РЅРµ обнаружено.") + +# Функция для вывода распределения классов +def print_class_distribution(df): + print("Распределение классов 'safety':") + print(df["safety"].value_counts(normalize=True)) + unsafe_df = df[df["safety"] == "unsafe"] + if not unsafe_df.empty: + print("\nРаспределение классов 'type' среди unsafe:") + print(unsafe_df["type"].value_counts(normalize=True)) + print("-" * 50) + +# Функция для диагностики инференса РЅР° РѕРґРЅРѕРј промпте +def diagnose_prompt(prompt, tokenizer, model): + inputs = tokenizer( + prompt, + truncation=True, + padding=True, + max_length=512, + return_tensors="pt" + ).to(device) + + with torch.no_grad(): + logits = model(**inputs) + logits_safety = logits['logits_safety'] + logits_attack = logits['logits_attack'] + + # Вывод сырых логитов + print(f"\nРџСЂРѕРјРїС‚: {prompt}") + print("Сырые логиты безопасности:", logits_safety) + print("Сырые логиты атаки:", logits_attack) + + probs_safety = F.softmax(logits_safety, dim=1) + probs_attack = F.softmax(logits_attack, dim=1) + + print("Вероятности безопасности:", probs_safety.tolist()) + print("Вероятности атаки:", probs_attack.tolist()) + + pred_safety = torch.argmax(probs_safety, dim=1).item() + pred_attack = torch.argmax(probs_attack, dim=1).item() + + safety_label = "safe" if pred_safety == 0 else "unsafe" + attack_types = ["jailbreak", "evasion", "generic attack", "injection"] + attack_label = attack_types[pred_attack] if safety_label == "unsafe" else "N/A" + + print(f"Предсказание -> Безопасность: {safety_label} ({probs_safety[0, pred_safety].item()*100:.2f}%), " + f"РўРёРї атаки: {attack_label} ({probs_attack[0, pred_attack].item()*100:.2f}%)") + print("-" * 50) + +# Загружаем сохранённую модель Рё токенизатор (путь заменить РЅР° актуальный) +MODEL_PATH = "./fine-tuned-bert-lora_new" +tokenizer = BertTokenizer.from_pretrained(MODEL_PATH) +# Предполагаем, что РІС‹ сохраняли модель СЃ помощью trainer.save_model(), поэтому можно загрузить через PeftModel: +from transformers import BertModel +from your_training_code import MultiTaskBert # Если Сѓ вас определён этот класс РІ отдельном файле, иначе скопируйте его СЃСЋРґР° + +# Загружаем базовую модель BERT +base_model = BertModel.from_pretrained("bert-base-uncased").to(device) +# Рнициализируем ваш класс (MultiTaskBert) Рё загружаем адаптер LoRA +model = MultiTaskBert.from_pretrained("bert-base-uncased").to(device) +model = PeftModel.from_pretrained(model, MODEL_PATH).to(device) +model.eval() + +# Если Сѓ вас сохранённые train/test датасеты, загрузите РёС… (или используйте оригинальные CSV) +train_df = pd.read_csv("all_dataset.csv") # Если train/test разделены РІ РѕРґРЅРѕРј файле, отфильтруйте РїРѕ метке +# Здесь лучше, если Сѓ вас есть отдельный файл для теста, загрузите его +test_df = pd.read_csv("all_dataset.csv") + +# Выполните проверки: +print("Проверка утечки данных:") +check_data_leakage(train_df, test_df) + +print("\nРаспределение классов РІ обучающем наборе:") +print_class_distribution(train_df) + +# Диагностика инференса для нескольких примеров +test_prompts = [ + "How to kill my mom.", + "I love my dog.", + "Write a story about a brave knight." +] + +print("\nДиагностика инференса:") +for prompt in test_prompts: + diagnose_prompt(prompt, tokenizer, model) \ No newline at end of file