C2MV commited on
Commit
5b7b502
·
verified ·
1 Parent(s): 1baae24

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +70 -87
app.py CHANGED
@@ -1,6 +1,6 @@
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
@@ -23,120 +23,103 @@ 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 principal 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 en CPU
46
- try:
47
- print("Cargando el tokenizador y el modelo de traducción en CPU...")
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("cpu") # Forzar a CPU
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 # No usar sampling
72
- # "temperature": 0.6, # Eliminado para evitar advertencias
73
- # "top_p": 0.9 # Eliminado para evitar advertencias
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))
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="Español", 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,
134
  examples=[
135
  [
136
- "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."
 
137
  ],
138
  [
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,
 
1
  import gradio as gr
2
  import torch
3
+ from transformers import AutoTokenizer, EsmForTokenClassification
4
  import time
5
  from functools import wraps
6
  import sys
 
23
  if device == "cpu":
24
  print("Advertencia: CUDA no está disponible. Se usará la CPU, lo que puede ser lento.")
25
 
26
+ # Definir el mapeo de clases
27
+ class_mapping = {
28
+ 0: 'Not Binding Site',
29
+ 1: 'Binding Site',
30
+ }
31
+
32
+ # Cargar el modelo y el tokenizador
33
+ model_name = "AmelieSchreiber/esm2_t6_8M_UR50D_rna_binding_site_predictor"
34
 
35
  try:
36
+ print("Cargando el tokenizador...")
37
+ tokenizer = AutoTokenizer.from_pretrained("facebook/esm2_t6_8M_UR50D")
38
  except ValueError as e:
39
  print(f"Error al cargar el tokenizador: {e}")
40
  sys.exit(1)
41
 
42
  try:
43
+ print("Cargando el modelo de predicción...")
44
+ model = EsmForTokenClassification.from_pretrained(model_name)
45
+ model.to(device)
 
46
  except Exception as e:
47
  print(f"Error al cargar el modelo: {e}")
48
  sys.exit(1)
49
 
 
 
 
 
 
 
 
 
 
 
50
  @spaces.GPU(duration=120) # Decorador para asignar GPU durante 120 segundos
51
  @medir_tiempo
52
+ def predecir_sitios_arn(secuencias):
53
  """
54
+ Función que predice sitios de unión de ARN para las secuencias de proteínas proporcionadas.
55
  """
56
  try:
57
+ if not secuencias.strip():
58
+ return "Por favor, ingresa una o más secuencias válidas."
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
59
 
60
+ # Separar las secuencias por líneas y eliminar espacios vacíos
61
+ secuencias_lista = [seq.strip() for seq in secuencias.strip().split('\n') if seq.strip()]
62
+ resultados = []
 
 
 
 
 
 
 
 
 
 
 
 
 
 
63
 
64
+ for seq in secuencias_lista:
65
+ # Tokenizar la secuencia
66
+ inputs = tokenizer(seq, truncation=True, padding='max_length', max_length=1290, return_tensors="pt")
67
+ input_ids = inputs["input_ids"].to(device)
68
+ attention_mask = inputs["attention_mask"].to(device)
69
+
70
+ # Aplicar el modelo para obtener los logits
71
+ with torch.no_grad():
72
+ outputs = model(input_ids=input_ids, attention_mask=attention_mask)
73
+
74
+ # Obtener las predicciones seleccionando la clase con el logit más alto
75
+ predictions = torch.argmax(outputs.logits, dim=-1).squeeze().tolist()
76
+
77
+ # Convertir las predicciones a etiquetas
78
+ predicted_labels = [class_mapping.get(pred, "Unknown") for pred in predictions]
79
+
80
+ # Emparejar cada residuo con su etiqueta predicha
81
+ residue_to_label = list(zip(list(seq), predicted_labels))
82
+
83
+ # Formatear el resultado para mostrarlo en la interfaz
84
+ secuencia_resultado = []
85
+ for i, (residue, label) in enumerate(residue_to_label):
86
+ # Omite los residuos 'PAD' que se agregan durante el padding
87
+ if residue != 'PAD':
88
+ secuencia_resultado.append(f"Posición {i+1} - {residue}: {label}")
89
+
90
+ resultados.append("\n".join(secuencia_resultado))
91
+
92
+ return "\n\n".join(resultados)
93
+
94
+ except Exception as e:
95
+ print(f"Error durante la predicción: {e}")
96
+ return f"Error al predecir los sitios de ARN: {e}"
97
 
98
  # Definir la interfaz de Gradio
99
+ titulo = "ESM-2 para Predicción de Sitios de Unión de ARN"
100
+ descripcion = (
101
+ "Ingresa una o más secuencias de proteínas (una por línea) y obtén predicciones de sitios de unión de ARN para cada residuo."
102
+ " El modelo utilizado es ESM-2, entrenado en el dataset 'S1' de sitios de unión proteína-ARN."
103
+ )
104
 
105
  iface = gr.Interface(
106
+ fn=predecir_sitios_arn,
107
+ inputs=gr.Textbox(
108
+ lines=10,
109
+ placeholder="Escribe tus secuencias de proteínas aquí, una por línea...",
110
+ label="Secuencias de Proteínas"
111
+ ),
112
+ outputs=gr.Textbox(label="Predicciones de Sitios de Unión de ARN"),
 
 
113
  title=titulo,
114
  description=descripcion,
115
  examples=[
116
  [
117
+ "VLSPADKTNVKAAWGKVGAHAGEYGAEALERMFLSFPTTK",
118
+ "SQETFSDLWKLLPENNVLSPLPSQAMDDLMLSPDDIEQWF"
119
  ],
120
  [
121
+ "MKAILVVLLYTFATANADAVAHVAA",
122
+ "GATVQAAEEVTQGVVVVEEVAGGAA"
123
  ]
124
  ],
125
  cache_examples=False,