File size: 6,018 Bytes
5a798cc 165628b 820a0dd c3a5bd0 165628b 820a0dd 5a798cc b956a25 165628b b956a25 165628b b956a25 165628b b956a25 165628b b956a25 165628b b956a25 820a0dd 165628b 5a798cc 165628b 5a798cc c3a5bd0 3d55aee 165628b 3d55aee c3a5bd0 165628b c3a5bd0 165628b c3a5bd0 165628b c3a5bd0 165628b c3a5bd0 165628b 5a798cc 165628b 5a798cc 165628b 5a798cc 165628b 5a798cc 165628b 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 150 151 152 153 154 |
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茅 correctamente instalado y disponible
# 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
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 de generaci贸n desde HuggingFace
model_name = "dmis-lab/selfbiorag_7b"
try:
print("Cargando el tokenizador y el modelo de generaci贸n desde HuggingFace...")
tokenizer_gen = AutoTokenizer.from_pretrained(model_name)
model_gen = AutoModelForCausalLM.from_pretrained(
model_name,
torch_dtype=torch.float16 if device == "cuda" else torch.float32
).to(device)
except ValueError as e:
print(f"Error al cargar el tokenizador de generaci贸n: {e}")
sys.exit(1)
except Exception as e:
print(f"Error al cargar el modelo de generaci贸n: {e}")
sys.exit(1)
# Definir modelos de traducci贸n
# Diccionario de modelos de traducci贸n seg煤n el idioma seleccionado
translation_models = {
"Espa帽ol": "Helsinki-NLP/opus-mt-en-es",
"Portugu茅s": "Helsinki-NLP/opus-mt-en-pt",
"Franc茅s": "Helsinki-NLP/opus-mt-en-fr",
"Alem谩n": "Helsinki-NLP/opus-mt-en-de",
# A帽ade m谩s idiomas y sus respectivos modelos seg煤n sea necesario
}
# Cargar los tokenizadores y modelos de traducci贸n
tokenizer_trans = {}
model_trans = {}
for lang, model_name_trans in translation_models.items():
try:
print(f"Cargando el tokenizador y el modelo de traducci贸n para {lang} desde HuggingFace...")
tokenizer = MarianTokenizer.from_pretrained(model_name_trans)
model = MarianMTModel.from_pretrained(model_name_trans).to(device)
tokenizer_trans[lang] = tokenizer
model_trans[lang] = model
except Exception as e:
print(f"Error al cargar el modelo de traducci贸n para {lang}: {e}")
sys.exit(1)
@spaces.GPU(duration=120) # Decorador para asignar GPU durante 120 segundos
@medir_tiempo
def generar_y_traducir_respuesta(consulta, idioma_destino):
"""
Funci贸n que genera una respuesta a partir de una consulta dada y la traduce al idioma seleccionado.
"""
try:
if not consulta.strip():
return "Por favor, ingresa una consulta v谩lida.", ""
# Tokenizar la consulta
inputs = tokenizer_gen.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 # Generaci贸n determinista
# Puedes a帽adir otros par谩metros como 'num_beams' si lo deseas
}
# Generar la respuesta
with torch.no_grad():
outputs = model_gen.generate(input_ids=inputs, **generation_kwargs)
# Decodificar la respuesta en ingl茅s
respuesta_en = tokenizer_gen.decode(outputs[0], skip_special_tokens=True)
# Traducir la respuesta al idioma seleccionado
if idioma_destino in translation_models:
tokenizer_tr = tokenizer_trans[idioma_destino]
model_tr = model_trans[idioma_destino]
# Preparar la entrada para la traducci贸n
traducir_inputs = tokenizer_tr.prepare_seq2seq_batch([respuesta_en], return_tensors="pt").to(device)
# Realizar la traducci贸n
with torch.no_grad():
traduccion_outputs = model_tr.generate(**traducir_inputs)
# Decodificar la traducci贸n
respuesta_traducida = tokenizer_tr.decode(traduccion_outputs[0], skip_special_tokens=True)
else:
respuesta_traducida = "Idioma de destino no soportado."
return respuesta_en, respuesta_traducida
except Exception as e:
print(f"Error durante la generaci贸n o traducci贸n de la respuesta: {e}")
return f"Error al generar la respuesta: {e}", ""
# Definir la interfaz de Gradio
titulo = "Generador y Traductor de Respuestas con SelfBioRAG 7B"
descripcion = (
"Ingresa una consulta y el modelo generar谩 una respuesta en ingl茅s. "
"Luego, puedes seleccionar un idioma para traducir la respuesta generada."
)
idiomas_disponibles = list(translation_models.keys())
iface = gr.Interface(
fn=generar_y_traducir_respuesta,
inputs=[
gr.Textbox(lines=5, placeholder="Escribe tu consulta aqu铆...", label="Consulta"),
gr.Dropdown(choices=idiomas_disponibles, value="Espa帽ol", label="Idioma de Traducci贸n")
],
outputs=[
gr.Textbox(label="Respuesta en Ingl茅s"),
gr.Textbox(label="Respuesta Traducida")
],
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.",
"Espa帽ol"
],
[
"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.",
"Portugu茅s"
]
],
cache_examples=False
)
# Ejecutar la interfaz
if __name__ == "__main__":
iface.launch()
|