Skip to content
GitLab
Explore
Projects
Groups
Topics
Snippets
Projects
Groups
Topics
Snippets
/
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
Menu
proekt
obuch
Commits
d418daea
Commit
d418daea
authored
3 weeks ago
by
Мазур Грета Евгеньевна
Browse files
Options
Download
Patches
Plain Diff
obuch with cross and graphic SAVING LORA
parent
b9dd9334
master
No related merge requests found
Changes
4
Hide whitespace changes
Inline
Side-by-side
Showing
4 changed files
.ipynb_checkpoints/checkLora-checkpoint.py
+2
-2
.ipynb_checkpoints/checkLora-checkpoint.py
.ipynb_checkpoints/test_utechka-checkpoint.py
+105
-0
.ipynb_checkpoints/test_utechka-checkpoint.py
checkLora.py
+2
-2
checkLora.py
test_utechka.py
+105
-0
test_utechka.py
with
214 additions
and
4 deletions
+214
-4
.ipynb_checkpoints/checkLora-checkpoint.py
+
2
−
2
View file @
d418daea
...
@@ -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."
...
...
This diff is collapsed.
Click to expand it.
.ipynb_checkpoints/test_utechka-checkpoint.py
0 → 100644
+
105
−
0
View file @
d418daea
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
:
.
2
f
}
%), "
f
"Тип атаки:
{
attack_label
}
(
{
probs_attack
[
0
,
pred_attack
].
item
()
*
100
:
.
2
f
}
%)"
)
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
This diff is collapsed.
Click to expand it.
checkLora.py
+
2
−
2
View file @
d418daea
...
@@ -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."
...
...
This diff is collapsed.
Click to expand it.
test_utechka.py
0 → 100644
+
105
−
0
View file @
d418daea
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
:
.
2
f
}
%), "
f
"Тип атаки:
{
attack_label
}
(
{
probs_attack
[
0
,
pred_attack
].
item
()
*
100
:
.
2
f
}
%)"
)
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
This diff is collapsed.
Click to expand it.
Write
Preview
Supports
Markdown
0%
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Save comment
Cancel
Please
register
or
sign in
to comment
Menu
Explore
Projects
Groups
Topics
Snippets