Hjgugugjhuhjggg
commited on
Update app.py
Browse files
app.py
CHANGED
@@ -14,10 +14,7 @@ import psutil
|
|
14 |
import os
|
15 |
import gc
|
16 |
import logging
|
17 |
-
from PIL import Image
|
18 |
-
import uuid
|
19 |
from tqdm import tqdm
|
20 |
-
from transformers import eBart
|
21 |
|
22 |
logging.basicConfig(level=logging.INFO)
|
23 |
|
@@ -31,51 +28,34 @@ if torch.cuda.is_available():
|
|
31 |
else:
|
32 |
device = torch.device("cpu")
|
33 |
|
34 |
-
print("Dispositivo:", device)
|
35 |
-
|
36 |
modelos = {
|
37 |
"gpt2-medium": VLLM(model="gpt2-medium"),
|
38 |
-
"qwen2.5-0.5b": VLLM(model="
|
39 |
-
"
|
|
|
|
|
|
|
|
|
|
|
40 |
}
|
41 |
|
42 |
-
print("Cargando modelos...")
|
43 |
for nombre, modelo in tqdm(modelos.items()):
|
44 |
modelos[nombre] = modelo(to=device)
|
45 |
-
print(f"Modelo {nombre} cargado")
|
46 |
|
47 |
caches = {
|
48 |
nombre: GPTCache(modelo, max_size=1000) for nombre, modelo in modelos.items()
|
49 |
}
|
50 |
|
51 |
-
print("Creando instancias de caché...")
|
52 |
-
for nombre, caché in tqdm(caches.items()):
|
53 |
-
print(f"Caché para modelo {nombre} creada")
|
54 |
-
|
55 |
cadenas = {
|
56 |
nombre: LLMChain(modelo, caché) for nombre, modelo, caché in zip(modelos.keys(), modelos.values(), caches.values())
|
57 |
}
|
58 |
|
59 |
-
print("Creando instancias de cadenas de modelo...")
|
60 |
-
for nombre, cadena in tqdm(cadenas.items()):
|
61 |
-
print(f"Cadena de modelo {nombre} creada")
|
62 |
-
|
63 |
summarizer = pipeline("summarization", device=device)
|
64 |
|
65 |
-
print("Cargando modelo de resumen de texto...")
|
66 |
-
|
67 |
vectorizer = TfidfVectorizer()
|
68 |
|
69 |
-
print("Cargando modelo de vectorizador TF-IDF...")
|
70 |
-
|
71 |
-
dalle_encoder = eBart.from_pretrained(model_id="dalle-mini/dalle-mini")
|
72 |
-
dalle_decoder = eBart.from_pretrained(model_id="dalle-mini/dalle-mini")
|
73 |
-
|
74 |
-
print("Cargando modelo DALL-E...")
|
75 |
-
|
76 |
def keep_alive():
|
77 |
while True:
|
78 |
-
# Realizar una petición a cada modelo cada 5 minutos
|
79 |
for cadena in cadenas.values():
|
80 |
try:
|
81 |
cadena.ask("¿Cuál es el sentido de la vida?")
|
@@ -86,39 +66,23 @@ def keep_alive():
|
|
86 |
|
87 |
def liberar_recursos():
|
88 |
while True:
|
89 |
-
# Obtener memoria RAM disponible
|
90 |
memoria_ram = psutil.virtual_memory().available / (1024.0 ** 3)
|
91 |
-
|
92 |
-
# Obtener espacio en disco disponible
|
93 |
espacio_disco = psutil.disk_usage('/').free / (1024.0 ** 3)
|
94 |
-
|
95 |
-
# Verificar si la memoria RAM o espacio en disco es menor al 5%
|
96 |
if memoria_ram < 5 or espacio_disco < 5:
|
97 |
-
# Liberar memoria RAM
|
98 |
gc.collect()
|
99 |
-
|
100 |
-
# Cerrar procesos innecesarios
|
101 |
for proc in psutil.process_iter(['pid', 'name']):
|
102 |
if proc.info['name'] == 'python':
|
103 |
os.kill(proc.info['pid'], 9)
|
104 |
-
|
105 |
time.sleep(60)
|
106 |
|
107 |
threading.Thread(target=keep_alive, daemon=True).start()
|
108 |
threading.Thread(target=liberar_recursos, daemon=True).start()
|
109 |
|
110 |
-
print("Iniciando hilos...")
|
111 |
@app.post("/pregunta")
|
112 |
async def pregunta(pregunta: str, modelo: str):
|
113 |
-
print(f"Pregunta recibida: {pregunta}, Modelo: {modelo}")
|
114 |
try:
|
115 |
-
# Obtener respuesta del modelo seleccionado
|
116 |
respuesta = cadenas[modelo].ask(pregunta)
|
117 |
-
|
118 |
-
|
119 |
-
# Verificar si la respuesta excede el límite de tokens máximos
|
120 |
-
if len(respuesta.split()) > 2048:
|
121 |
-
# Dividir la respuesta en varios mensajes
|
122 |
mensajes = []
|
123 |
palabras = respuesta.split()
|
124 |
mensaje_actual = ""
|
@@ -129,20 +93,12 @@ async def pregunta(pregunta: str, modelo: str):
|
|
129 |
else:
|
130 |
mensaje_actual += " " + palabra
|
131 |
mensajes.append(mensaje_actual)
|
132 |
-
|
133 |
-
# Retornar los mensajes divididos
|
134 |
return {"respuestas": mensajes}
|
135 |
else:
|
136 |
-
# Obtener resumen de respuesta
|
137 |
resumen = summarizer(respuesta, max_length=50, min_length=5, do_sample=False)
|
138 |
-
print(f"Resumen obtenido: {resumen[0]['summary_text']}")
|
139 |
-
|
140 |
-
# Calcular similitud entre pregunta y respuesta
|
141 |
pregunta_vec = vectorizer.fit_transform([pregunta])
|
142 |
respuesta_vec = vectorizer.transform([respuesta])
|
143 |
similitud = cosine_similarity(pregunta_vec, respuesta_vec)
|
144 |
-
print(f"Similitud calculada: {similitud[0][0]}")
|
145 |
-
|
146 |
return {
|
147 |
"respuesta": respuesta,
|
148 |
"resumen": resumen[0]["summary_text"],
|
@@ -154,12 +110,8 @@ async def pregunta(pregunta: str, modelo: str):
|
|
154 |
|
155 |
@app.post("/resumen")
|
156 |
async def resumen(texto: str):
|
157 |
-
print(f"Texto recibido: {texto}")
|
158 |
try:
|
159 |
-
# Obtener resumen de texto
|
160 |
resumen = summarizer(texto, max_length=50, min_length=5, do_sample=False)
|
161 |
-
print(f"Resumen obtenido: {resumen[0]['summary_text']}")
|
162 |
-
|
163 |
return {"resumen": resumen[0]["summary_text"]}
|
164 |
except Exception as e:
|
165 |
logging.error(f"Error en resumen: {e}")
|
@@ -167,50 +119,22 @@ async def resumen(texto: str):
|
|
167 |
|
168 |
@app.post("/similitud")
|
169 |
async def similitud(texto1: str, texto2: str):
|
170 |
-
|
171 |
-
|
172 |
-
|
173 |
-
|
174 |
-
|
175 |
-
|
176 |
-
|
177 |
-
|
178 |
-
return {"similitud": similitud[0][0]}
|
179 |
-
except Exception as e:
|
180 |
-
logging.error(f"Error en similitud: {e}")
|
181 |
-
return {"error": "Error en similitud"}
|
182 |
-
|
183 |
-
@app.post("/imagen")
|
184 |
-
async def imagen(texto: str):
|
185 |
-
print(f"Texto recibido: {texto}")
|
186 |
-
try:
|
187 |
-
# Obtener imagen a partir del texto
|
188 |
-
imagen = dalle_decoder.generate_images(texto, num_images=1)
|
189 |
-
print(f"Imagen generada")
|
190 |
-
|
191 |
-
# Generar nombre aleatorio para el archivo
|
192 |
-
nombre_archivo = f"{uuid.uuid4()}.png"
|
193 |
-
print(f"Nombre de archivo: {nombre_archivo}")
|
194 |
-
|
195 |
-
# Guardar imagen en archivo
|
196 |
-
imagen.save(nombre_archivo)
|
197 |
-
print(f"Imagen guardada en {nombre_archivo}")
|
198 |
-
|
199 |
-
return {"imagen": nombre_archivo}
|
200 |
-
except Exception as e:
|
201 |
-
logging.error(f"Error en imagen: {e}")
|
202 |
-
return {"error": "Error en imagen"}
|
203 |
|
204 |
@app.get("/modelos")
|
205 |
async def modelos():
|
206 |
-
|
207 |
-
return {"modelos": list(cadenas.keys())}
|
208 |
|
209 |
@app.get("/estado")
|
210 |
async def estado():
|
211 |
-
|
212 |
-
return {"estado": "activo"}
|
213 |
|
214 |
if __name__ == "__main__":
|
215 |
-
print("Iniciando API...")
|
216 |
uvicorn.run(app, host="0.0.0.0", port=8000)
|
|
|
14 |
import os
|
15 |
import gc
|
16 |
import logging
|
|
|
|
|
17 |
from tqdm import tqdm
|
|
|
18 |
|
19 |
logging.basicConfig(level=logging.INFO)
|
20 |
|
|
|
28 |
else:
|
29 |
device = torch.device("cpu")
|
30 |
|
|
|
|
|
31 |
modelos = {
|
32 |
"gpt2-medium": VLLM(model="gpt2-medium"),
|
33 |
+
"qwen2.5-0.5b": VLLM(model="qwen2.5-0.5b"),
|
34 |
+
"t5-base": VLLM(model="t5-base"),
|
35 |
+
"bert-base-uncased": VLLM(model="bert-base-uncased"),
|
36 |
+
"xlnet-base-uncased": VLLM(model="xlnet-base-uncased"),
|
37 |
+
"distilbert-base-uncased": VLLM(model="distilbert-base-uncased"),
|
38 |
+
"albert-base-v2": VLLM(model="albert-base-v2"),
|
39 |
+
"roberta-base": VLLM(model="roberta-base"),
|
40 |
}
|
41 |
|
|
|
42 |
for nombre, modelo in tqdm(modelos.items()):
|
43 |
modelos[nombre] = modelo(to=device)
|
|
|
44 |
|
45 |
caches = {
|
46 |
nombre: GPTCache(modelo, max_size=1000) for nombre, modelo in modelos.items()
|
47 |
}
|
48 |
|
|
|
|
|
|
|
|
|
49 |
cadenas = {
|
50 |
nombre: LLMChain(modelo, caché) for nombre, modelo, caché in zip(modelos.keys(), modelos.values(), caches.values())
|
51 |
}
|
52 |
|
|
|
|
|
|
|
|
|
53 |
summarizer = pipeline("summarization", device=device)
|
54 |
|
|
|
|
|
55 |
vectorizer = TfidfVectorizer()
|
56 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
57 |
def keep_alive():
|
58 |
while True:
|
|
|
59 |
for cadena in cadenas.values():
|
60 |
try:
|
61 |
cadena.ask("¿Cuál es el sentido de la vida?")
|
|
|
66 |
|
67 |
def liberar_recursos():
|
68 |
while True:
|
|
|
69 |
memoria_ram = psutil.virtual_memory().available / (1024.0 ** 3)
|
|
|
|
|
70 |
espacio_disco = psutil.disk_usage('/').free / (1024.0 ** 3)
|
|
|
|
|
71 |
if memoria_ram < 5 or espacio_disco < 5:
|
|
|
72 |
gc.collect()
|
|
|
|
|
73 |
for proc in psutil.process_iter(['pid', 'name']):
|
74 |
if proc.info['name'] == 'python':
|
75 |
os.kill(proc.info['pid'], 9)
|
|
|
76 |
time.sleep(60)
|
77 |
|
78 |
threading.Thread(target=keep_alive, daemon=True).start()
|
79 |
threading.Thread(target=liberar_recursos, daemon=True).start()
|
80 |
|
|
|
81 |
@app.post("/pregunta")
|
82 |
async def pregunta(pregunta: str, modelo: str):
|
|
|
83 |
try:
|
|
|
84 |
respuesta = cadenas[modelo].ask(pregunta)
|
85 |
+
if len(respuesta.split()) > 2048:
|
|
|
|
|
|
|
|
|
86 |
mensajes = []
|
87 |
palabras = respuesta.split()
|
88 |
mensaje_actual = ""
|
|
|
93 |
else:
|
94 |
mensaje_actual += " " + palabra
|
95 |
mensajes.append(mensaje_actual)
|
|
|
|
|
96 |
return {"respuestas": mensajes}
|
97 |
else:
|
|
|
98 |
resumen = summarizer(respuesta, max_length=50, min_length=5, do_sample=False)
|
|
|
|
|
|
|
99 |
pregunta_vec = vectorizer.fit_transform([pregunta])
|
100 |
respuesta_vec = vectorizer.transform([respuesta])
|
101 |
similitud = cosine_similarity(pregunta_vec, respuesta_vec)
|
|
|
|
|
102 |
return {
|
103 |
"respuesta": respuesta,
|
104 |
"resumen": resumen[0]["summary_text"],
|
|
|
110 |
|
111 |
@app.post("/resumen")
|
112 |
async def resumen(texto: str):
|
|
|
113 |
try:
|
|
|
114 |
resumen = summarizer(texto, max_length=50, min_length=5, do_sample=False)
|
|
|
|
|
115 |
return {"resumen": resumen[0]["summary_text"]}
|
116 |
except Exception as e:
|
117 |
logging.error(f"Error en resumen: {e}")
|
|
|
119 |
|
120 |
@app.post("/similitud")
|
121 |
async def similitud(texto1: str, texto2: str):
|
122 |
+
try:
|
123 |
+
texto1_vec = vectorizer.fit_transform([texto1])
|
124 |
+
texto2_vec = vectorizer.transform([texto2])
|
125 |
+
similitud = cosine_similarity(texto1_vec, texto2_vec)
|
126 |
+
return {"similitud": similitud[0][0]}
|
127 |
+
except Exception as e:
|
128 |
+
logging.error(f"Error en similitud: {e}")
|
129 |
+
return {"error": "Error en similitud"}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
130 |
|
131 |
@app.get("/modelos")
|
132 |
async def modelos():
|
133 |
+
return {"modelos": list(cadenas.keys())}
|
|
|
134 |
|
135 |
@app.get("/estado")
|
136 |
async def estado():
|
137 |
+
return {"estado": "activo"}
|
|
|
138 |
|
139 |
if __name__ == "__main__":
|
|
|
140 |
uvicorn.run(app, host="0.0.0.0", port=8000)
|