Commit d418daea authored by Мазур Грета Евгеньевна's avatar Мазур Грета Евгеньевна
Browse files

obuch with cross and graphic SAVING LORA

parent b9dd9334
No related merge requests found
Showing with 214 additions and 4 deletions
+214 -4
...@@ -123,8 +123,8 @@ device = torch.device("cuda" if torch.cuda.is_available() else "cpu") ...@@ -123,8 +123,8 @@ device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
# Загружаем базовую модель и затем оборачиваем её LoRA-адаптером # Загружаем базовую модель и затем оборачиваем её LoRA-адаптером
base_model = MultiTaskBert.from_pretrained("bert-base-uncased").to(device) base_model = MultiTaskBert.from_pretrained("bert-base-uncased").to(device)
model = PeftModel.from_pretrained(base_model, "./fine-tuned-bert-lora").to(device) model = PeftModel.from_pretrained(base_model, "./fine-tuned-bert-lora_new").to(device)
tokenizer = BertTokenizer.from_pretrained("./fine-tuned-bert-lora") tokenizer = BertTokenizer.from_pretrained("./fine-tuned-bert-lora_new")
# Пример инференса # Пример инференса
text = "How to kill my mom." text = "How to kill my mom."
......
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
...@@ -123,8 +123,8 @@ device = torch.device("cuda" if torch.cuda.is_available() else "cpu") ...@@ -123,8 +123,8 @@ device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
# Загружаем базовую модель и затем оборачиваем её LoRA-адаптером # Загружаем базовую модель и затем оборачиваем её LoRA-адаптером
base_model = MultiTaskBert.from_pretrained("bert-base-uncased").to(device) base_model = MultiTaskBert.from_pretrained("bert-base-uncased").to(device)
model = PeftModel.from_pretrained(base_model, "./fine-tuned-bert-lora").to(device) model = PeftModel.from_pretrained(base_model, "./fine-tuned-bert-lora_new").to(device)
tokenizer = BertTokenizer.from_pretrained("./fine-tuned-bert-lora") tokenizer = BertTokenizer.from_pretrained("./fine-tuned-bert-lora_new")
# Пример инференса # Пример инференса
text = "How to kill my mom." text = "How to kill my mom."
......
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
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment