C2MV commited on
Commit
165628b
·
verified ·
1 Parent(s): 407e335

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +86 -33
app.py CHANGED
@@ -1,10 +1,10 @@
1
  import gradio as gr
2
  import torch
3
- from transformers import AutoModelForCausalLM, AutoTokenizer
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,73 +23,126 @@ device = "cuda" if torch.cuda.is_available() else "cpu"
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
  @spaces.GPU(duration=120) # Decorador para asignar GPU durante 120 segundos
46
  @medir_tiempo
47
- def generar_respuesta(consulta):
48
  """
49
- Función que genera una respuesta a partir de una consulta dada.
50
  """
51
  try:
52
  if not consulta.strip():
53
- return "Por favor, ingresa una consulta válida."
54
 
55
  # Tokenizar la consulta
56
- inputs = tokenizer.encode(consulta, return_tensors="pt").to(device)
57
 
58
  # Configurar los parámetros de generación
59
  generation_kwargs = {
60
  "max_new_tokens": 100, # Ajustado a 100
61
- "do_sample": False # Configura según la opción deseada
62
- # "temperature": 0.0, # Comenta o elimina si do_sample=False
63
- # "top_p": 1.0 # Comenta o elimina si do_sample=False
64
  }
65
 
66
  # Generar la respuesta
67
  with torch.no_grad():
68
- outputs = model.generate(input_ids=inputs, **generation_kwargs)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
69
 
70
- # Decodificar la respuesta
71
- respuesta = tokenizer.decode(outputs[0], skip_special_tokens=True)
72
- return respuesta
73
  except Exception as e:
74
- print(f"Error durante la generación de respuesta: {e}")
75
- return f"Error al generar la respuesta: {e}"
76
 
77
  # Definir la interfaz de Gradio
78
- titulo = "Generador de Respuestas con SelfBioRAG 7B"
79
- descripcion = "Ingresa una consulta y el modelo generará una respuesta basada en el contenido proporcionado."
 
 
 
 
 
80
 
81
  iface = gr.Interface(
82
- fn=generar_respuesta,
83
- inputs=gr.Textbox(lines=5, placeholder="Escribe tu consulta aquí..."),
84
- outputs=gr.Textbox(),
 
 
 
 
 
 
85
  title=titulo,
86
  description=descripcion,
87
  examples=[
88
  [
89
- "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."
 
90
  ],
91
  [
92
- "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."
 
93
  ]
94
  ],
95
  cache_examples=False
 
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é correctamente instalado y disponible
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 de generación desde HuggingFace
27
  model_name = "dmis-lab/selfbiorag_7b"
28
 
29
  try:
30
+ print("Cargando el tokenizador y el modelo de generación desde HuggingFace...")
31
+ tokenizer_gen = AutoTokenizer.from_pretrained(model_name)
32
+ model_gen = AutoModelForCausalLM.from_pretrained(
33
+ model_name,
 
 
 
 
 
34
  torch_dtype=torch.float16 if device == "cuda" else torch.float32
35
  ).to(device)
36
+ except ValueError as e:
37
+ print(f"Error al cargar el tokenizador de generación: {e}")
38
+ sys.exit(1)
39
  except Exception as e:
40
+ print(f"Error al cargar el modelo de generación: {e}")
41
  sys.exit(1)
42
 
43
+ # Definir modelos de traducción
44
+ # Diccionario de modelos de traducción según el idioma seleccionado
45
+ translation_models = {
46
+ "Español": "Helsinki-NLP/opus-mt-en-es",
47
+ "Portugués": "Helsinki-NLP/opus-mt-en-pt",
48
+ "Francés": "Helsinki-NLP/opus-mt-en-fr",
49
+ "Alemán": "Helsinki-NLP/opus-mt-en-de",
50
+ # Añade más idiomas y sus respectivos modelos según sea necesario
51
+ }
52
+
53
+ # Cargar los tokenizadores y modelos de traducción
54
+ tokenizer_trans = {}
55
+ model_trans = {}
56
+
57
+ for lang, model_name_trans in translation_models.items():
58
+ try:
59
+ print(f"Cargando el tokenizador y el modelo de traducción para {lang} desde HuggingFace...")
60
+ tokenizer = MarianTokenizer.from_pretrained(model_name_trans)
61
+ model = MarianMTModel.from_pretrained(model_name_trans).to(device)
62
+ tokenizer_trans[lang] = tokenizer
63
+ model_trans[lang] = model
64
+ except Exception as e:
65
+ print(f"Error al cargar el modelo de traducción para {lang}: {e}")
66
+ sys.exit(1)
67
+
68
  @spaces.GPU(duration=120) # Decorador para asignar GPU durante 120 segundos
69
  @medir_tiempo
70
+ def generar_y_traducir_respuesta(consulta, idioma_destino):
71
  """
72
+ Función que genera una respuesta a partir de una consulta dada y la traduce al idioma seleccionado.
73
  """
74
  try:
75
  if not consulta.strip():
76
+ return "Por favor, ingresa una consulta válida.", ""
77
 
78
  # Tokenizar la consulta
79
+ inputs = tokenizer_gen.encode(consulta, return_tensors="pt").to(device)
80
 
81
  # Configurar los parámetros de generación
82
  generation_kwargs = {
83
  "max_new_tokens": 100, # Ajustado a 100
84
+ "do_sample": False # Generación determinista
85
+ # Puedes añadir otros parámetros como 'num_beams' si lo deseas
 
86
  }
87
 
88
  # Generar la respuesta
89
  with torch.no_grad():
90
+ outputs = model_gen.generate(input_ids=inputs, **generation_kwargs)
91
+
92
+ # Decodificar la respuesta en inglés
93
+ respuesta_en = tokenizer_gen.decode(outputs[0], skip_special_tokens=True)
94
+
95
+ # Traducir la respuesta al idioma seleccionado
96
+ if idioma_destino in translation_models:
97
+ tokenizer_tr = tokenizer_trans[idioma_destino]
98
+ model_tr = model_trans[idioma_destino]
99
+
100
+ # Preparar la entrada para la traducción
101
+ traducir_inputs = tokenizer_tr.prepare_seq2seq_batch([respuesta_en], return_tensors="pt").to(device)
102
+
103
+ # Realizar la traducción
104
+ with torch.no_grad():
105
+ traduccion_outputs = model_tr.generate(**traducir_inputs)
106
+
107
+ # Decodificar la traducción
108
+ respuesta_traducida = tokenizer_tr.decode(traduccion_outputs[0], skip_special_tokens=True)
109
+ else:
110
+ respuesta_traducida = "Idioma de destino no soportado."
111
 
112
+ return respuesta_en, respuesta_traducida
 
 
113
  except Exception as e:
114
+ print(f"Error durante la generación o traducción de la respuesta: {e}")
115
+ return f"Error al generar la respuesta: {e}", ""
116
 
117
  # Definir la interfaz de Gradio
118
+ titulo = "Generador y Traductor de Respuestas con SelfBioRAG 7B"
119
+ descripcion = (
120
+ "Ingresa una consulta y el modelo generará una respuesta en inglés. "
121
+ "Luego, puedes seleccionar un idioma para traducir la respuesta generada."
122
+ )
123
+
124
+ idiomas_disponibles = list(translation_models.keys())
125
 
126
  iface = gr.Interface(
127
+ fn=generar_y_traducir_respuesta,
128
+ inputs=[
129
+ gr.Textbox(lines=5, placeholder="Escribe tu consulta aquí...", label="Consulta"),
130
+ gr.Dropdown(choices=idiomas_disponibles, value="Español", label="Idioma de Traducción")
131
+ ],
132
+ outputs=[
133
+ gr.Textbox(label="Respuesta en Inglés"),
134
+ gr.Textbox(label="Respuesta Traducida")
135
+ ],
136
  title=titulo,
137
  description=descripcion,
138
  examples=[
139
  [
140
+ "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.",
141
+ "Español"
142
  ],
143
  [
144
+ "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.",
145
+ "Portugués"
146
  ]
147
  ],
148
  cache_examples=False