C2MV commited on
Commit
50560b1
·
verified ·
1 Parent(s): 4251465

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +71 -61
app.py CHANGED
@@ -1,15 +1,10 @@
1
  import gradio as gr
2
  import torch
3
- from transformers import (
4
- AutoModelForCausalLM,
5
- AutoTokenizer,
6
- MarianMTModel,
7
- MarianTokenizer
8
- )
9
  import time
10
  from functools import wraps
11
  import sys
12
- import os
13
 
14
  # Decorador para medir el tiempo de ejecución
15
  def medir_tiempo(func):
@@ -28,97 +23,111 @@ device = "cuda" if torch.cuda.is_available() else "cpu"
28
  if device == "cpu":
29
  print("Advertencia: CUDA no está disponible. Se usará la CPU, lo que puede ser lento.")
30
 
31
- # Obtener el token de Hugging Face desde las variables de entorno
32
- hf_token = os.getenv("HUGGINGFACE_TOKEN")
33
- if not hf_token:
34
- print("Error: El token de Hugging Face no está configurado en los secretos.")
35
- sys.exit(1)
36
-
37
- # Cargar el tokenizador y el modelo de generación desde HuggingFace
38
  model_name = "dmis-lab/selfbiorag_7b"
39
 
40
  try:
41
- print("Cargando el tokenizador y el modelo de generación desde HuggingFace...")
42
- tokenizer_gen = AutoTokenizer.from_pretrained(model_name, use_auth_token=hf_token)
43
- model_gen = AutoModelForCausalLM.from_pretrained(
44
- model_name,
45
- torch_dtype=torch.float16 if device == "cuda" else torch.float32,
46
- use_auth_token=hf_token
47
- ).to(device)
48
  except ValueError as e:
49
- print(f"Error al cargar el tokenizador de generación: {e}")
50
  sys.exit(1)
 
 
 
 
 
 
51
  except Exception as e:
52
- print(f"Error al cargar el modelo de generación: {e}")
53
  sys.exit(1)
54
 
55
- # Definir el modelo de traducción al Español
56
- translation_model_name = "Helsinki-NLP/opus-mt-en-es"
57
-
58
  try:
59
- print(f"Cargando el tokenizador y el modelo de traducción para Español desde HuggingFace...")
60
- tokenizer_tr_es = MarianTokenizer.from_pretrained(translation_model_name)
61
- model_tr_es = MarianMTModel.from_pretrained(translation_model_name).to(device)
 
62
  except Exception as e:
63
- print(f"Error al cargar el modelo de traducción para Español: {e}")
64
  sys.exit(1)
65
 
 
66
  @medir_tiempo
67
- def generar_y_traducir_respuesta(consulta, idioma_destino):
68
  """
69
- Función que genera una respuesta a partir de una consulta dada y la traduce al Español.
70
  """
71
  try:
72
  if not consulta.strip():
73
- return "Por favor, ingresa una consulta válida.", ""
74
 
75
  # Tokenizar la consulta
76
- inputs = tokenizer_gen.encode(consulta, return_tensors="pt").to(device)
77
 
78
  # Configurar los parámetros de generación
79
  generation_kwargs = {
80
  "max_new_tokens": 100, # Ajustado a 100
81
- "do_sample": False # Generación determinista
82
- # Puedes añadir otros parámetros como 'num_beams' si lo deseas
 
83
  }
84
 
85
  # Generar la respuesta
86
  with torch.no_grad():
87
- outputs = model_gen.generate(input_ids=inputs, **generation_kwargs)
88
-
89
- # Decodificar la respuesta en inglés con limpieza de espacios
90
- respuesta_en = tokenizer_gen.decode(outputs[0], skip_special_tokens=True, clean_up_tokenization_spaces=True)
91
-
92
- # Traducir la respuesta al Español
93
- traducir_inputs = tokenizer_tr_es.encode(respuesta_en, return_tensors="pt").to(device)
94
 
95
- # Realizar la traducción
96
- with torch.no_grad():
97
- traduccion_outputs = model_tr_es.generate(input_ids=traducir_inputs, max_length=512)
 
 
 
 
 
 
 
 
 
 
 
98
 
99
- # Decodificar la traducción con limpieza de espacios
100
- respuesta_traducida = tokenizer_tr_es.decode(traduccion_outputs[0], skip_special_tokens=True, clean_up_tokenization_spaces=True)
101
 
102
- return respuesta_en, respuesta_traducida
 
 
103
  except Exception as e:
104
- print(f"Error durante la generación o traducción de la respuesta: {e}")
105
- return f"Error al generar la respuesta: {e}", ""
 
 
 
 
 
 
 
 
 
 
 
 
 
106
 
107
  # Definir la interfaz de Gradio
108
- titulo = "Generador y Traductor de Respuestas con SelfBioRAG 7B"
109
- descripcion = (
110
- "Ingresa una consulta y el modelo generará una respuesta en inglés. "
111
- "Luego, la respuesta se traducirá automáticamente al Español."
112
- )
113
 
114
  iface = gr.Interface(
115
- fn=generar_y_traducir_respuesta,
116
  inputs=[
117
- gr.Textbox(lines=5, placeholder="Escribe tu consulta aquí...", label="Consulta")
 
118
  ],
119
  outputs=[
120
- gr.Textbox(label="Respuesta en Inglés"),
121
- gr.Textbox(label="Respuesta Traducida al Español")
122
  ],
123
  title=titulo,
124
  description=descripcion,
@@ -130,7 +139,8 @@ iface = gr.Interface(
130
  "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."
131
  ]
132
  ],
133
- cache_examples=False
 
134
  )
135
 
136
  # Ejecutar la interfaz
 
1
  import gradio as gr
2
  import torch
3
+ from transformers import AutoModelForCausalLM, AutoTokenizer, MarianMTModel, MarianTokenizer
 
 
 
 
 
4
  import time
5
  from functools import wraps
6
  import sys
7
+ import spaces # Asegúrate de que este módulo esté disponible y correctamente instalado
8
 
9
  # Decorador para medir el tiempo de ejecución
10
  def medir_tiempo(func):
 
23
  if device == "cpu":
24
  print("Advertencia: CUDA no está disponible. Se usará la CPU, lo que puede ser lento.")
25
 
26
+ # Cargar el tokenizador y el modelo desde HuggingFace
 
 
 
 
 
 
27
  model_name = "dmis-lab/selfbiorag_7b"
28
 
29
  try:
30
+ print("Cargando el tokenizador y el modelo desde HuggingFace...")
31
+ tokenizer = AutoTokenizer.from_pretrained(model_name)
 
 
 
 
 
32
  except ValueError as e:
33
+ print(f"Error al cargar el tokenizador: {e}")
34
  sys.exit(1)
35
+
36
+ try:
37
+ model = AutoModelForCausalLM.from_pretrained(
38
+ model_name,
39
+ torch_dtype=torch.float16 if device == "cuda" else torch.float32
40
+ ).to(device)
41
  except Exception as e:
42
+ print(f"Error al cargar el modelo: {e}")
43
  sys.exit(1)
44
 
45
+ # Cargar el modelo de traducción
 
 
46
  try:
47
+ print("Cargando el tokenizador y el modelo de traducción...")
48
+ translation_model_name = "Helsinki-NLP/opus-mt-en-es"
49
+ translator_tokenizer = MarianTokenizer.from_pretrained(translation_model_name)
50
+ translator_model = MarianMTModel.from_pretrained(translation_model_name).to(device)
51
  except Exception as e:
52
+ print(f"Error al cargar el modelo de traducción: {e}")
53
  sys.exit(1)
54
 
55
+ @spaces.GPU(duration=120) # Decorador para asignar GPU durante 120 segundos
56
  @medir_tiempo
57
+ def generar_respuesta(consulta):
58
  """
59
+ Función que genera una respuesta a partir de una consulta dada.
60
  """
61
  try:
62
  if not consulta.strip():
63
+ return "Por favor, ingresa una consulta válida."
64
 
65
  # Tokenizar la consulta
66
+ inputs = tokenizer.encode(consulta, return_tensors="pt").to(device)
67
 
68
  # Configurar los parámetros de generación
69
  generation_kwargs = {
70
  "max_new_tokens": 100, # Ajustado a 100
71
+ "do_sample": False # Configura según la opción deseada
72
+ # "temperature": 0.0, # Comenta o elimina si do_sample=False
73
+ # "top_p": 1.0 # Comenta o elimina si do_sample=False
74
  }
75
 
76
  # Generar la respuesta
77
  with torch.no_grad():
78
+ outputs = model.generate(input_ids=inputs, **generation_kwargs)
 
 
 
 
 
 
79
 
80
+ # Decodificar la respuesta
81
+ respuesta = tokenizer.decode(outputs[0], skip_special_tokens=True)
82
+ return respuesta
83
+ except Exception as e:
84
+ print(f"Error durante la generación de respuesta: {e}")
85
+ return f"Error al generar la respuesta: {e}"
86
+
87
+ def traducir_texto(texto):
88
+ """
89
+ Función que traduce un texto de inglés a español.
90
+ """
91
+ try:
92
+ if not texto.strip():
93
+ return "No hay texto para traducir."
94
 
95
+ # Tokenizar el texto a traducir
96
+ translated = translator_model.generate(**translator_tokenizer(texto, return_tensors="pt", padding=True).to(device))
97
 
98
+ # Decodificar la traducción
99
+ traduccion = translator_tokenizer.decode(translated[0], skip_special_tokens=True)
100
+ return traduccion
101
  except Exception as e:
102
+ print(f"Error durante la traducción: {e}")
103
+ return f"Error al traducir el texto: {e}"
104
+
105
+ def procesar_consulta(consulta, idioma):
106
+ """
107
+ Función que procesa la consulta y devuelve la respuesta original y/o traducida según el idioma seleccionado.
108
+ """
109
+ respuesta_original = generar_respuesta(consulta)
110
+
111
+ if idioma == "Español":
112
+ traduccion = traducir_texto(respuesta_original)
113
+ else:
114
+ traduccion = ""
115
+
116
+ return respuesta_original, traduccion
117
 
118
  # Definir la interfaz de Gradio
119
+ titulo = "Generador de Respuestas con SelfBioRAG 7B"
120
+ descripcion = "Ingresa una consulta y selecciona el idioma de salida. El modelo generará una respuesta basada en el contenido proporcionado."
 
 
 
121
 
122
  iface = gr.Interface(
123
+ fn=procesar_consulta,
124
  inputs=[
125
+ gr.Textbox(lines=5, placeholder="Escribe tu consulta aquí...", label="Consulta"),
126
+ gr.Dropdown(choices=["Inglés", "Español"], value="Inglés", label="Idioma de Salida")
127
  ],
128
  outputs=[
129
+ gr.Textbox(label="Respuesta Original (Inglés)"),
130
+ gr.Textbox(label="Traducción al Español")
131
  ],
132
  title=titulo,
133
  description=descripcion,
 
139
  "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."
140
  ]
141
  ],
142
+ cache_examples=False,
143
+ allow_flagging="never"
144
  )
145
 
146
  # Ejecutar la interfaz