Hjgugugjhuhjggg commited on
Commit
f1a08ce
1 Parent(s): 5213686

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +151 -118
app.py CHANGED
@@ -1,128 +1,161 @@
1
- from fastapi import FastAPI
2
- from langchain_community.llms import VLLM
3
  from langchain_community.cache import GPTCache
4
- import torch
5
- from langchain.chains.llm import LLMChain
6
- from transformers import pipeline
7
- import uvicorn
8
- import threading
9
- import time
10
- import nltk
11
- from sklearn.feature_extraction.text import TfidfVectorizer
12
- from sklearn.metrics.pairwise import cosine_similarity
13
- import psutil
14
- import os
15
- import gc
16
- import logging
17
-
18
- logging.basicConfig(level=logging.INFO)
19
- nltk.download('punkt')
20
- nltk.download('stopwords')
21
-
22
- app = FastAPI()
23
-
24
- device = torch.device("cpu")
25
 
 
 
 
26
  modelos = {
27
- "gpt2-medium": VLLM(model="gpt2-medium", device=device),
28
- "qwen2.5-0.5b": VLLM(model="Qwen/Qwen2.5-0.5B-Instruct", device=device),
29
- "llamaxd": VLLM(model="Hjgugugjhuhjggg/llama-3.2-1B-spinquant-hf", device=device)
30
  }
31
 
 
32
  caches = {
33
  nombre: GPTCache(modelo, max_size=1000)
34
  for nombre, modelo in modelos.items()
35
  }
36
 
37
- cadenas = {
38
- nombre: LLMChain(modelo, caché)
39
- for nombre, modelo, caché in zip(modelos.keys(), modelos.values(), caches.values())
40
- }
41
-
42
- summarizer = pipeline("summarization", device=device)
43
- vectorizer = TfidfVectorizer()
44
-
45
- def keep_alive():
46
- while True:
47
- for cadena in cadenas.values():
48
- try:
49
- cadena.ask("¿Cuál es el sentido de la vida?")
50
- except Exception as e:
51
- logging.error(f"Error en modelo {cadena}: {e}")
52
- cadenas.pop(cadena)
53
- time.sleep(300)
54
-
55
- def liberar_recursos():
56
- while True:
57
- memoria_ram = psutil.virtual_memory().available / (1024.0 ** 3)
58
- espacio_disco = psutil.disk_usage('/').free / (1024.0 ** 3)
59
- if memoria_ram < 5 or espacio_disco < 5:
60
- gc.collect()
61
- for proc in psutil.process_iter(['pid', 'name']):
62
- if proc.info['name'] == 'python':
63
- os.kill(proc.info['pid'], 9)
64
- time.sleep(60)
65
-
66
- threading.Thread(target=keep_alive, daemon=True).start()
67
- threading.Thread(target=liberar_recursos, daemon=True).start()
68
-
69
- @app.post("/pregunta")
70
- async def pregunta(pregunta: str, modelo: str):
71
- try:
72
- respuesta = cadenas[modelo].ask(pregunta)
73
- if len(respuesta.split()) > 2048:
74
- mensajes = []
75
- palabras = respuesta.split()
76
- mensaje_actual = ""
77
- for palabra in palabras:
78
- if len(mensaje_actual.split()) + len(palabra.split()) > 2048:
79
- mensajes.append(mensaje_actual)
80
- mensaje_actual = palabra
81
- else:
82
- mensaje_actual += " " + palabra
83
- mensajes.append(mensaje_actual)
84
- return {"respuestas": mensajes}
85
- else:
86
- resumen = summarizer(respuesta, max_length=50, min_length=5, do_sample=False)
87
- pregunta_vec = vectorizer.fit_transform([pregunta])
88
- respuesta_vec = vectorizer.transform([respuesta])
89
- similitud = cosine_similarity(pregunta_vec, respuesta_vec)
90
- return {
91
- "respuesta": respuesta,
92
- "resumen": resumen[0]["summary_text"],
93
- "similitud": similitud[0][0]
94
- }
95
- except Exception as e:
96
- logging.error(f"Error en modelo {modelo}: {e}")
97
- return {"error": f"Modelo {modelo} no disponible"}
98
-
99
- @app.post("/resumen")
100
- async def resumen(texto: str):
101
- try:
102
- resumen = summarizer(texto, max_length=50, min_length=5, do_sample=False)
103
- return {"resumen": resumen[0]["summary_text"]}
104
- except Exception as e:
105
- logging.error(f"Error en resumen: {e}")
106
- return {"error": "Error en resumen"}
107
-
108
- @app.post("/similitud")
109
- async def similitud(texto1: str, texto2: str):
110
- try:
111
- texto1_vec = vectorizer.fit_transform([texto1])
112
- texto2_vec = vectorizer.transform([texto2])
113
- similitud = cosine_similarity(texto1_vec, texto2_vec)
114
- return {"similitud": similitud[0][0]}
115
- except Exception as e:
116
- logging.error(f"Error en similitud: {e}")
117
- return {"error": "Error en similitud"}
118
-
119
- @app.get("/modelos")
120
- async def modelos():
121
- return {"modelos": list(cadenas.keys())}
122
-
123
- @app.get("/estado")
124
- async def estado():
125
- return {"estado": "activo"}
126
-
127
- if __name__ == "__main__":
128
- uvicorn.run(app, host="0.0.0.0", port=8000)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ from flask import Flask, request, jsonify, render_template_string
2
+ from vllm import LLM, SamplingParams
3
  from langchain_community.cache import GPTCache
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
4
 
5
+ app = Flask(__name__)
6
+
7
+ Configuración de los modelos de lenguaje
8
  modelos = {
9
+ "facebook/opt-125m": LLM(model="facebook/opt-125m"),
10
+ "llama-3.2-1B": LLM(model="Hjgugugjhuhjggg/llama-3.2-1B-spinquant-hf"),
11
+ "gpt2": LLM(model="gpt2")
12
  }
13
 
14
+ Configuración de los caches
15
  caches = {
16
  nombre: GPTCache(modelo, max_size=1000)
17
  for nombre, modelo in modelos.items()
18
  }
19
 
20
+ Configuración de muestreo
21
+ sampling_params = SamplingParams(temperature=0.8, top_p=0.95)
22
+
23
+ html_code_docs = """
24
+ <!DOCTYPE html>
25
+ <html>
26
+ <head>
27
+ <title>Documentación de la API</title>
28
+ </head>
29
+ <body>
30
+ <h1>API de Generación de Texto</h1>
31
+ <h2>Endpoints</h2>
32
+ <ul>
33
+ <li>
34
+ <h3>Generar texto</h3>
35
+ <p>Método: POST</p>
36
+ <p>Ruta: /generate</p>
37
+ <p>Parámetros:</p>
38
+ <ul>
39
+ <li>prompts: Lista de prompts para generar texto</li>
40
+ <li>modelo: Nombre del modelo a utilizar</li>
41
+ </ul>
42
+ <p>Ejemplo:</p>
43
+ <pre>curl -X POST -H "Content-Type: application/json" -d '{"prompts": ["Hola, cómo estás?"], "modelo": "facebook/opt-125m"}' http://localhost:5000/generate</pre>
44
+ </li>
45
+ <li>
46
+ <h3>Obtener lista de modelos</h3>
47
+ <p>Método: GET</p>
48
+ <p>Ruta: /modelos</p>
49
+ <p>Ejemplo:</p>
50
+ <pre>curl -X GET http://localhost:5000/modelos</pre>
51
+ </li>
52
+ <li>
53
+ <h3>Chatbot</h3>
54
+ <p>Método: POST</p>
55
+ <p>Ruta: /chatbot</p>
56
+ <p>Parámetros:</p>
57
+ <ul>
58
+ <li>mensaje: Mensaje para el chatbot</li>
59
+ <li>modelo: Nombre del modelo a utilizar</li>
60
+ </ul>
61
+ <p>Ejemplo:</p>
62
+ <pre>curl -X POST -H "Content-Type: application/json" -d '{"mensaje": "Hola, cómo estás?", "modelo": "facebook/opt-125m"}' http://localhost:5000/chatbot</pre>
63
+ </li>
64
+ </ul>
65
+ </body>
66
+ </html>
67
+ """
68
+
69
+ html_code_chatbot = """
70
+ <!DOCTYPE html>
71
+ <html>
72
+ <head>
73
+ <title>Chatbot</title>
74
+ </head>
75
+ <body>
76
+ <h1>Chatbot</h1>
77
+ <form id="chat-form">
78
+ <input type="text" id="mensaje" placeholder="Escribe un mensaje">
79
+ <button type="submit">Enviar</button>
80
+ </form>
81
+ <div id="respuestas"></div>
82
+
83
+ <script>
84
+ const form = document.getElementById('chat-form');
85
+ const mensajeInput = document.getElementById('mensaje');
86
+ const respuestasDiv = document.getElementById('respuestas');
87
+
88
+ form.addEventListener('submit', (e) => {
89
+ e.preventDefault();
90
+ const mensaje = mensajeInput.value;
91
+ fetch('/chatbot', {
92
+ method: 'POST',
93
+ headers: {
94
+ 'Content-Type': 'application/json'
95
+ },
96
+ body: JSON.stringify({ mensaje })
97
+ })
98
+ .then((res) => res.json())
99
+ .then((data) => {
100
+ const respuesta = data.respuesta;
101
+ const respuestaHTML = `<p>Tú: ${mensaje}</p><p>Chatbot: ${respuesta}</p>`;
102
+ respuestasDiv.innerHTML += respuestaHTML;
103
+ mensajeInput.value = '';
104
+ });
105
+ });
106
+ </script>
107
+ </body>
108
+ </html>
109
+ """
110
+
111
+ @app.route('/generate', methods=['POST'])
112
+ def generate():
113
+ data = request.get_json()
114
+ prompts = data.get('prompts', [])
115
+ modelo_seleccionado = data.get('modelo', "facebook/opt-125m")
116
+
117
+ if modelo_seleccionado not in modelos:
118
+ return jsonify({"error": "Modelo no encontrado"}), 404
119
+
120
+ outputs = caches[modelo_seleccionado].generate(prompts, sampling_params)
121
+
122
+ results = []
123
+ for output in outputs:
124
+ prompt = output.prompt
125
+ generated_text = output.outputs[0].text
126
+ results.append({
127
+ 'prompt': prompt,
128
+ 'generated_text': generated_text
129
+ })
130
+
131
+ return jsonify(results)
132
+
133
+ @app.route('/modelos', methods=['GET'])
134
+ def get_modelos():
135
+ return jsonify({"modelos": list(modelos.keys())})
136
+
137
+ @app.route('/docs', methods=['GET'])
138
+ def docs():
139
+ return render_template_string(html_code_docs)
140
+
141
+ @app.route('/chatbot', methods=['POST'])
142
+ def chatbot():
143
+ data = request.get_json()
144
+ mensaje = data.get('mensaje', '')
145
+ modelo_seleccionado = data.get('modelo', "facebook/opt-125m")
146
+
147
+ if modelo_seleccionado not in modelos:
148
+ return jsonify({"error": "Modelo no encontrado"}), 404
149
+
150
+ outputs = caches[modelo_seleccionado].generate([mensaje], sampling_params)
151
+
152
+ respuesta = outputs[0].outputs[0].text
153
+
154
+ return jsonify({"respuesta": respuesta})
155
+
156
+ @app.route('/chat', methods=['GET'])
157
+ def chat():
158
+ return render_template_string(html_code_chatbot)
159
+
160
+ if __name__ == '__main__':
161
+ app.run(host='0.0.0.0', port=7860)