Spaces:
Running
Running
File size: 4,104 Bytes
4ad23c1 928cd07 b06d928 1d5b573 4ad23c1 43f1789 928cd07 43f1789 4ad23c1 b06d928 4ad23c1 b06d928 4ad23c1 b06d928 4ad23c1 b06d928 4ad23c1 b06d928 4ad23c1 928cd07 4ad23c1 928cd07 4ad23c1 928cd07 b06d928 928cd07 b06d928 928cd07 b06d928 928cd07 b06d928 928cd07 b06d928 928cd07 b06d928 928cd07 4ad23c1 1d5b573 928cd07 4ad23c1 1d5b573 b06d928 4ad23c1 b06d928 |
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 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 |
import gradio as gr
from transformers import AutoModelForCausalLM, AutoTokenizer
import torch
import os
import gc
# Variables globales para el modelo y tokenizador
model = None
tokenizer = None
# Cargar el prompt desde el archivo
def get_system_prompt():
with open("prompt.txt", "r", encoding="utf-8") as f:
return f.read().strip()
# Funci贸n para cargar el modelo (se ejecutar谩 solo cuando sea necesario)
def load_model_if_needed():
global model, tokenizer
if model is None:
print("Cargando modelo Mistral-7B-Instruct-v0.1...")
# Cargar el tokenizador
model_name = "mistralai/Mistral-7B-Instruct-v0.1"
tokenizer = AutoTokenizer.from_pretrained(model_name)
# Configuraci贸n para CPU con optimizaciones de memoria
model = AutoModelForCausalLM.from_pretrained(
model_name,
torch_dtype=torch.float32, # Usar float32 para CPU
low_cpu_mem_usage=True, # Optimizaci贸n para CPU con poca memoria
)
# Mover el modelo a CPU expl铆citamente
model = model.to("cpu")
# Forzar recolecci贸n de basura para liberar memoria
gc.collect()
torch.cuda.empty_cache() if torch.cuda.is_available() else None
print("Modelo cargado correctamente en CPU!")
# Funci贸n principal que procesa las preguntas del usuario
def generate_response(user_message):
try:
# Cargar el modelo si a煤n no est谩 cargado
load_model_if_needed()
if not user_message.strip():
return "Por favor, escribe una pregunta para que pueda ayudarte."
# Obtener el prompt del sistema
system_prompt = get_system_prompt()
# Formato de prompt para Mistral-7B-Instruct-v0.1
prompt = f"""<s>[INST] {system_prompt}
Pregunta del usuario: {user_message} [/INST]</s>"""
# Tokenizar el prompt
inputs = tokenizer(prompt, return_tensors="pt")
# Configuraci贸n de generaci贸n optimizada para CPU
generation_config = {
"max_new_tokens": 512, # Limitar tokens para ahorrar memoria
"temperature": 0.7,
"top_p": 0.9,
"do_sample": True,
"pad_token_id": tokenizer.eos_token_id,
"num_return_sequences": 1
}
# Generar respuesta
with torch.no_grad():
outputs = model.generate(**inputs, **generation_config)
# Decodificar la respuesta
full_response = tokenizer.decode(outputs[0], skip_special_tokens=True)
# Extraer solo la respuesta del asistente (despu茅s del prompt)
assistant_response = full_response.replace(prompt.replace("<s>", "").replace("</s>", ""), "").strip()
# Forzar recolecci贸n de basura para liberar memoria
gc.collect()
torch.cuda.empty_cache() if torch.cuda.is_available() else None
return assistant_response
except Exception as e:
print(f"Error: {str(e)}")
return f"Lo siento, ha ocurrido un error: {str(e)}"
# Crear la interfaz de Gradio
demo = gr.Interface(
fn=generate_response,
inputs=gr.Textbox(
placeholder="Escribe tu pregunta sobre emprendimiento aqu铆...",
label="Tu pregunta"
),
outputs=gr.Textbox(label="Respuesta de BITER"),
title="BITER - Tu Mentor en Tiempo Real para Decisiones de Negocio",
description="BITER es un asistente de IA que responde dudas de emprendedores como si fuera un CEO experimentado.",
examples=[
["驴C贸mo puedo validar mi idea de negocio con poco presupuesto?"],
["驴Cu谩l es la mejor estrategia para conseguir mis primeros clientes?"],
["驴Deber铆a invertir en publicidad en redes sociales o en SEO?"]
],
allow_flagging="never"
)
# Lanzar la aplicaci贸n con configuraci贸n para ahorrar memoria
if __name__ == "__main__":
# Configurar menos workers para ahorrar memoria
demo.queue(max_size=1).launch(share=False, debug=False)
|