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()