File size: 5,500 Bytes
5a798cc bcaa66a 820a0dd c3a5bd0 50560b1 820a0dd 5a798cc 18507c5 b956a25 18507c5 bcaa66a b956a25 50560b1 165628b 50560b1 165628b 50560b1 bcaa66a 50560b1 b956a25 50560b1 b956a25 18507c5 4251465 18507c5 50560b1 18507c5 4251465 50560b1 4251465 165628b 50560b1 820a0dd 50560b1 5a798cc 50560b1 5a798cc c3a5bd0 3d55aee 50560b1 3d55aee c3a5bd0 50560b1 c3a5bd0 bcaa66a c3a5bd0 bcaa66a 4251465 bcaa66a 50560b1 4251465 50560b1 18507c5 c3a5bd0 50560b1 c3a5bd0 50560b1 5a798cc bcaa66a 50560b1 165628b 5a798cc 50560b1 165628b 50560b1 c7756cc 165628b bcaa66a 50560b1 165628b 5a798cc 4251465 5a798cc 4251465 5a798cc 50560b1 5a798cc |
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 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 |
import gradio as gr
import torch
from transformers import AutoModelForCausalLM, AutoTokenizer, MarianMTModel, MarianTokenizer
import time
from functools import wraps
import sys
import spaces # Asegúrate de que este módulo esté disponible y correctamente instalado
# Decorador para medir el tiempo de ejecución
def medir_tiempo(func):
@wraps(func)
def wrapper(*args, **kwargs):
inicio = time.time()
resultado = func(*args, **kwargs)
fin = time.time()
tiempo_transcurrido = fin - inicio
print(f"Tiempo de ejecución de '{func.__name__}': {tiempo_transcurrido:.2f} segundos")
return resultado
return wrapper
# Verificar si CUDA está disponible para el modelo principal
device = "cuda" if torch.cuda.is_available() else "cpu"
if device == "cpu":
print("Advertencia: CUDA no está disponible. Se usará la CPU, lo que puede ser lento.")
# Cargar el tokenizador y el modelo principal desde HuggingFace
model_name = "dmis-lab/selfbiorag_7b"
try:
print("Cargando el tokenizador y el modelo desde HuggingFace...")
tokenizer = AutoTokenizer.from_pretrained(model_name)
except ValueError as e:
print(f"Error al cargar el tokenizador: {e}")
sys.exit(1)
try:
model = AutoModelForCausalLM.from_pretrained(
model_name,
torch_dtype=torch.float16 if device == "cuda" else torch.float32
).to(device)
except Exception as e:
print(f"Error al cargar el modelo: {e}")
sys.exit(1)
# Cargar el modelo de traducción en CPU
try:
print("Cargando el tokenizador y el modelo de traducción en CPU...")
translation_model_name = "Helsinki-NLP/opus-mt-en-es"
translator_tokenizer = MarianTokenizer.from_pretrained(translation_model_name)
translator_model = MarianMTModel.from_pretrained(translation_model_name).to("cpu") # Forzar a CPU
except Exception as e:
print(f"Error al cargar el modelo de traducción: {e}")
sys.exit(1)
@spaces.GPU(duration=120) # Decorador para asignar GPU durante 120 segundos
@medir_tiempo
def generar_respuesta(consulta):
"""
Función que genera una respuesta a partir de una consulta dada.
"""
try:
if not consulta.strip():
return "Por favor, ingresa una consulta válida."
# Tokenizar la consulta
inputs = tokenizer.encode(consulta, return_tensors="pt").to(device)
# Configurar los parámetros de generación
generation_kwargs = {
"max_new_tokens": 100, # Ajustado a 100
"do_sample": False # No usar sampling
# "temperature": 0.6, # Eliminado para evitar advertencias
# "top_p": 0.9 # Eliminado para evitar advertencias
}
# Generar la respuesta
with torch.no_grad():
outputs = model.generate(input_ids=inputs, **generation_kwargs)
# Decodificar la respuesta
respuesta = tokenizer.decode(outputs[0], skip_special_tokens=True)
return respuesta
except Exception as e:
print(f"Error durante la generación de respuesta: {e}")
return f"Error al generar la respuesta: {e}"
def traducir_texto(texto):
"""
Función que traduce un texto de inglés a español.
"""
try:
if not texto.strip():
return "No hay texto para traducir."
# Tokenizar el texto a traducir
translated = translator_model.generate(**translator_tokenizer(texto, return_tensors="pt", padding=True))
# Decodificar la traducción
traduccion = translator_tokenizer.decode(translated[0], skip_special_tokens=True)
return traduccion
except Exception as e:
print(f"Error durante la traducción: {e}")
return f"Error al traducir el texto: {e}"
def procesar_consulta(consulta, idioma):
"""
Función que procesa la consulta y devuelve la respuesta original y/o traducida según el idioma seleccionado.
"""
respuesta_original = generar_respuesta(consulta)
if idioma == "Español":
traduccion = traducir_texto(respuesta_original)
else:
traduccion = ""
return respuesta_original, traduccion
# Definir la interfaz de Gradio
titulo = "Generador de Respuestas con SelfBioRAG 7B"
descripcion = "Ingresa una consulta y selecciona el idioma de salida. El modelo generará una respuesta basada en el contenido proporcionado."
iface = gr.Interface(
fn=procesar_consulta,
inputs=[
gr.Textbox(lines=5, placeholder="Escribe tu consulta aquí...", label="Consulta"),
gr.Dropdown(choices=["Inglés", "Español"], value="Español", label="Idioma de Salida")
],
outputs=[
gr.Textbox(label="Respuesta Original (Inglés)"),
gr.Textbox(label="Traducción al Español")
],
title=titulo,
description=descripcion,
examples=[
[
"Clasifica el siguiente informe de radiología según la parte del cuerpo a la que se refiere (por ejemplo, pecho, abdomen, cerebro, etc.): Los discos intervertebrales en L4-L5 y L5-S1 muestran signos de degeneración con leve abultamiento que comprime la raíz nerviosa adyacente."
],
[
"Resume los puntos clave sobre el papel de las mutaciones en los genes BRCA1 y BRCA2 en el aumento del riesgo de cáncer de mama."
]
],
cache_examples=False,
allow_flagging="never"
)
# Ejecutar la interfaz
if __name__ == "__main__":
iface.launch()
|