eyupipler's picture
Update model.py
293b179 verified
import os
import time
import torch
import torch.nn as nn
import torch.nn.functional as F
from PIL import Image
from torchvision import transforms
from thop import profile
from transformers import T5ForConditionalGeneration, T5Tokenizer
from huggingface_hub import hf_hub_download, snapshot_download
CLASSIFICATION_MODEL_REPO = "Neurazum/Vbai-DPA-2.3"
CLASSIFICATION_MODEL_FILENAME_F = "Vbai-DPA 2.3f.pt"
CLASSIFICATION_MODEL_FILENAME_C = "Vbai-DPA 2.3c.pt"
CLASSIFICATION_MODEL_FILENAME_Q = "Vbai-DPA 2.3q.pt"
T5_MODEL_REPO = "Neurazum/Tbai-DPA-1.0"
class SimpleCNN(nn.Module):
def __init__(self, model_type="f", num_classes=6):
super(SimpleCNN, self).__init__()
self.num_classes = num_classes
if model_type == "f":
self.conv1 = nn.Conv2d(3, 16, kernel_size=3, stride=1, padding=1)
self.conv2 = nn.Conv2d(16, 32, kernel_size=3, stride=1, padding=1)
self.conv3 = nn.Conv2d(32, 64, kernel_size=3, stride=1, padding=1)
self.fc1 = nn.Linear(64 * 28 * 28, 256)
elif model_type == "c":
self.conv1 = nn.Conv2d(3, 32, kernel_size=3, stride=1, padding=1)
self.conv2 = nn.Conv2d(32, 64, kernel_size=3, stride=1, padding=1)
self.conv3 = nn.Conv2d(64, 128, kernel_size=3, stride=1, padding=1)
self.fc1 = nn.Linear(128 * 28 * 28, 512)
elif model_type == "q":
self.conv1 = nn.Conv2d(3, 64, kernel_size=3, stride=1, padding=1)
self.conv2 = nn.Conv2d(64, 128, kernel_size=3, stride=1, padding=1)
self.conv3 = nn.Conv2d(128, 256, kernel_size=3, stride=1, padding=1)
self.conv4 = nn.Conv2d(256, 512, kernel_size=3, stride=1, padding=1)
self.fc1 = nn.Linear(512 * 14 * 14, 1024)
self.dropout = nn.Dropout(0.5)
self.fc2 = nn.Linear(self.fc1.out_features, num_classes)
self.relu = nn.ReLU()
self.pool = nn.MaxPool2d(kernel_size=2, stride=2, padding=0)
def forward(self, x):
x = self.pool(self.relu(self.conv1(x)))
x = self.pool(self.relu(self.conv2(x)))
x = self.pool(self.relu(self.conv3(x)))
if hasattr(self, "conv4"):
x = self.pool(self.relu(self.conv4(x)))
x = x.view(x.size(0), -1)
x = self.relu(self.fc1(x))
x = self.dropout(x)
x = self.fc2(x)
return x
def load_classification_model(device, model_type="f", num_classes=6):
if model_type == "f":
filename = CLASSIFICATION_MODEL_FILENAME_F
elif model_type == "c":
filename = CLASSIFICATION_MODEL_FILENAME_C
elif model_type == "q":
filename = CLASSIFICATION_MODEL_FILENAME_Q
else:
raise ValueError(f"model_type hatalı: {model_type}")
local_pt = hf_hub_download(
repo_id=CLASSIFICATION_MODEL_REPO,
filename=filename,
use_auth_token=False
)
try:
state_dict = torch.load(local_pt, map_location=device)
model = SimpleCNN(model_type=model_type, num_classes=num_classes).to(device)
model.load_state_dict(state_dict)
except RuntimeError:
model = torch.jit.load(local_pt, map_location=device)
model.eval()
return model
def load_t5_model(device):
local_dir = snapshot_download(repo_id=T5_MODEL_REPO)
t5_path = None
for root, dirs, files in os.walk(local_dir):
for fname in files:
if fname.endswith(".model"):
t5_path = root
break
if t5_path:
break
if t5_path is None:
raise FileNotFoundError(f"Hiçbir '.model' dosyası bulunamadı: {local_dir} içinde.")
tokenizer = T5Tokenizer.from_pretrained(
t5_path,
local_files_only=True
)
model = T5ForConditionalGeneration.from_pretrained(
t5_path,
local_files_only=True
).to(device)
model.eval()
return tokenizer, model
transform = transforms.Compose([
transforms.Resize((224, 224)),
transforms.ToTensor(),
transforms.Normalize([0.485, 0.456, 0.406],
[0.229, 0.224, 0.225])
])
def predict_image(model, image: Image.Image, device):
"""
image: PIL Image
dönen: (pred_index, confidence, input_tensor, all_probs_np)
"""
img_tensor = transform(image).unsqueeze(0).to(device)
with torch.no_grad():
logits = model(img_tensor)
probs = F.softmax(logits, dim=1)[0]
conf, idx = torch.max(probs, dim=0)
return idx.item(), conf.item() * 100, img_tensor, probs.cpu().numpy()
def generate_comment_turkce(tokenizer, model, sinif_adi: str, device, max_length=64):
"""
sinif_adi: Örneğin "Alzheimer Hastalığı"
dönen: T5’in ürettiği Türkçe yorum metni
"""
input_text = f"Sınıf: {sinif_adi}"
inputs = tokenizer(
input_text,
return_tensors="pt",
padding="longest",
truncation=True,
max_length=32
).to(device)
out_ids = model.generate(
**inputs,
max_length=max_length,
do_sample=True,
top_k=50,
top_p=0.95,
no_repeat_ngram_size=2,
early_stopping=True
)
return tokenizer.decode(out_ids[0], skip_special_tokens=True)
def calculate_performance_metrics(model, device):
"""
Model için parametre sayısı, FLOPs ve CPU inference hızını ölçer.
"""
model = model.to(device)
test_input = torch.randn((1, 3, 224, 224)).to(device)
flops, params = profile(model, inputs=(test_input,), verbose=False)
start = time.time()
_ = model(test_input)
cpu_time = (time.time() - start) * 1000
return {
"size_pixels": 224,
"speed_cpu_b1": cpu_time,
"speed_cpu_b32": cpu_time / 10,
"speed_v100_b1": cpu_time / 2,
"params_million": params / 1e6,
"flops_billion": flops / 1e9
}