Repository navigation
Expand file tree
/
Copy pathvalidation.py
More file actions
93 lines (76 loc) · 2.77 KB
/
Copy pathvalidation.py
File metadata and controls
93 lines (76 loc) · 2.77 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
import torch
import time
import os
from transformers import BertForMaskedLM, DataCollatorForLanguageModeling
from simple_sp_tokenizer import SimpleSPTokenizer
from train_bert_progressive import StreamingChunkDataset
# Загружаем модель
print("Loading model...")
model = BertForMaskedLM.from_pretrained("models/bert-base-ru-phase1_128/checkpoint-255000")
tokenizer = SimpleSPTokenizer("models/tokenizer/final/32k/sp_32k.model")
# DataParallel на обе карты
if torch.cuda.device_count() > 1:
print(f"Using {torch.cuda.device_count()} GPUs: DataParallel")
model = torch.nn.DataParallel(model)
model = model.cuda()
params = sum(p.numel() for p in model.module.parameters())
elif torch.cuda.is_available():
model = model.cuda()
params = sum(p.numel() for p in model.parameters())
else:
params = sum(p.numel() for p in model.parameters())
print(f"Model loaded. Parameters: {params:,}")
# Полный val-датасет
val_file = "data/bert_full/phase1_128_val.txt"
print(f"Loading val dataset from {val_file}...")
val_dataset = StreamingChunkDataset(val_file, tokenizer, max_length=128)
print(f"Val dataset size: {len(val_dataset):,} chunks")
data_collator = DataCollatorForLanguageModeling(
tokenizer=tokenizer, mlm=True, mlm_probability=0.15
)
# Evaluation loop
model.eval()
total_loss = 0
total_steps = 0
print("Starting full validation on 2 GPUs...")
start_time = time.time()
dataloader = torch.utils.data.DataLoader(
val_dataset,
batch_size=256,
collate_fn=data_collator,
num_workers=8,
)
with torch.no_grad():
for batch in dataloader:
if torch.cuda.is_available():
batch = {k: v.cuda() for k, v in batch.items()}
outputs = model(**batch)
loss = outputs.loss
if isinstance(loss, torch.Tensor) and loss.numel() > 1:
loss = loss.mean()
total_loss += loss.item()
total_steps += 1
if total_steps % 200 == 0:
elapsed = time.time() - start_time
print(f" Step {total_steps}/{len(dataloader)} ({total_steps/len(dataloader)*100:.1f}%), "
f"avg loss: {total_loss/total_steps:.4f}, elapsed: {elapsed/60:.1f} min")
elapsed = time.time() - start_time
avg_loss = total_loss / total_steps
perplexity = torch.exp(torch.tensor(avg_loss))
# Вывод и сохранение
result = f"""
{'='*60}
FULL VALIDATION RESULTS (Phase 1, checkpoint 255000)
{'='*60}
GPUs used: {torch.cuda.device_count()}
Val file: {val_file}
Val size: {len(val_dataset):,} chunks
Val loss: {avg_loss:.4f}
Perplexity: {perplexity:.2f}
Time: {elapsed/60:.1f} minutes
{'='*60}
"""
print(result)
with open("phase1_full_validation.txt", "w") as f:
f.write(result)
print("Results saved to phase1_full_validation.txt")