File size: 2,260 Bytes
39b5a26
84ab11b
39b5a26
 
84ab11b
fa720ef
39b5a26
84ab11b
39b5a26
 
cf00782
 
fa720ef
84ab11b
cf00782
84ab11b
 
4e469f4
84ab11b
 
fa720ef
cf00782
84ab11b
 
4e469f4
cf00782
84ab11b
4e469f4
 
 
 
 
 
 
 
 
84ab11b
 
 
 
 
 
 
 
39b5a26
 
 
84ab11b
 
 
39b5a26
 
84ab11b
39b5a26
84ab11b
 
39b5a26
 
84ab11b
39b5a26
 
 
84ab11b
 
39b5a26
 
 
84ab11b
 
 
 
 
 
fa720ef
 
 
cf00782
4e469f4
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
from fastapi import FastAPI
from pydantic import BaseModel
from transformers import AutoModelForCausalLM, AutoTokenizer
import torch
from huggingface_hub import hf_hub_download
import os

# ✅ Inicializar FastAPI
app = FastAPI()

# ✅ Definir un directorio de caché seguro
os.environ["HF_HOME"] = "/tmp/huggingface"

# ✅ Nombre del modelo en Hugging Face Hub
HUGGING_FACE_REPO = "fcp2207/Phi-2"  # Reemplaza con tu usuario y nombre correcto del modelo en Hugging Face
MODEL_FILENAME = "phi2_finetuned.pth"  # Nombre del archivo en Hugging Face

# ✅ Descargar el modelo desde Hugging Face con caché segura
model_path = hf_hub_download(
    repo_id=HUGGING_FACE_REPO,
    filename=MODEL_FILENAME,
    cache_dir=os.environ["HF_HOME"]  # Directorio seguro en Hugging Face Spaces
)

# ✅ Cargar el tokenizer
tokenizer = AutoTokenizer.from_pretrained("microsoft/phi-2", cache_dir=os.environ["HF_HOME"])

# ✅ Cargar el modelo en modo optimizado para memoria
model = AutoModelForCausalLM.from_pretrained(
    "microsoft/phi-2",
    cache_dir=os.environ["HF_HOME"],
    torch_dtype=torch.float16,  # Reduce el tamaño del modelo
    device_map="auto"  # Optimiza la carga en CPU/GPU automáticamente
)

# ✅ Cargar los pesos del modelo entrenado
model.load_state_dict(torch.load(model_path, map_location="cpu"))
model.eval()  # Poner el modelo en modo inferencia


# ✅ Definir la estructura de la solicitud para la API
class InputText(BaseModel):
    input_text: str


@app.get("/")
def home():
    """Endpoint de prueba para verificar que la API está activa"""
    return {"message": "API de Chatbot con Phi-2 está en funcionamiento 🚀"}


@app.post("/predict/")
def predict(request: InputText):
    """Genera una respuesta basada en el input del usuario."""
    inputs = tokenizer(request.input_text, return_tensors="pt", padding=True, truncation=True, max_length=512)

    with torch.no_grad():
        outputs = model.generate(**inputs, max_length=150)

    response_text = tokenizer.decode(outputs[0], skip_special_tokens=True)
    return {"response": response_text}


# ✅ Ejecución en modo local (opcional, no necesario en Hugging Face)
if __name__ == "__main__":
    import uvicorn
    uvicorn.run(app, host="0.0.0.0", port=8000)