|
"""
|
|
Handler para el Inference Endpoint del clasificador de emails
|
|
"""
|
|
|
|
import torch
|
|
import numpy as np
|
|
import pickle
|
|
from transformers import AutoTokenizer, AutoModelForSequenceClassification
|
|
from huggingface_hub import hf_hub_download
|
|
|
|
class EndpointHandler:
|
|
def __init__(self):
|
|
self.model = None
|
|
self.tokenizer = None
|
|
self.encoder = None
|
|
self.device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
|
|
self.load_model()
|
|
|
|
def load_model(self):
|
|
"""Cargar el modelo"""
|
|
try:
|
|
|
|
self.model = AutoModelForSequenceClassification.from_pretrained("vertigoq3/email-classifier-bert")
|
|
self.tokenizer = AutoTokenizer.from_pretrained("vertigoq3/email-classifier-bert")
|
|
|
|
|
|
self.model.to(self.device)
|
|
self.model.eval()
|
|
|
|
|
|
encoder_path = hf_hub_download(
|
|
repo_id="vertigoq3/email-classifier-bert",
|
|
filename="label_encoder.pkl"
|
|
)
|
|
|
|
with open(encoder_path, "rb") as f:
|
|
self.encoder = pickle.load(f)
|
|
|
|
except Exception as e:
|
|
print(f"Error al cargar modelo: {e}")
|
|
raise
|
|
|
|
def __call__(self, inputs):
|
|
"""Procesar una solicitud de inferencia"""
|
|
try:
|
|
if isinstance(inputs, str):
|
|
text = inputs
|
|
elif isinstance(inputs, dict) and "inputs" in inputs:
|
|
text = inputs["inputs"]
|
|
else:
|
|
text = str(inputs)
|
|
|
|
|
|
tokenized = self.tokenizer(
|
|
text,
|
|
return_tensors="pt",
|
|
truncation=True,
|
|
padding=True,
|
|
max_length=512
|
|
)
|
|
tokenized = {k: v.to(self.device) for k, v in tokenized.items()}
|
|
|
|
|
|
with torch.no_grad():
|
|
outputs = self.model(**tokenized)
|
|
logits = outputs.logits
|
|
probabilities = torch.softmax(logits, dim=-1)
|
|
predicted_class_id = torch.argmax(probabilities, dim=-1).item()
|
|
predicted_class = self.encoder.inverse_transform([predicted_class_id])[0]
|
|
confidence = float(probabilities[0][predicted_class_id])
|
|
|
|
return {
|
|
"predicted_class": predicted_class,
|
|
"confidence": confidence,
|
|
"all_probabilities": {
|
|
self.encoder.classes_[i]: float(probabilities[0][i])
|
|
for i in range(len(self.encoder.classes_))
|
|
}
|
|
}
|
|
|
|
except Exception as e:
|
|
return {"error": str(e)}
|
|
|
|
|
|
handler = EndpointHandler()
|
|
|