BioRAG / app.py
C2MV's picture
Update app.py
a7f35a0 verified
import gradio as gr
import torch
from transformers import pipeline
import time
from functools import wraps
import sys
import multimolecule # Importar para registrar los modelos de multimolecule
import spaces # Aseg煤rate de que este m贸dulo est茅 correctamente instalado
# 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
# Decorador para asignar GPU (seg煤n la funcionalidad proporcionada por spaces)
@spaces.GPU
@medir_tiempo
def predecir_fill_mask(secuencias):
"""
Funci贸n que realiza una predicci贸n de Fill-Mask para las secuencias de ARN proporcionadas.
"""
try:
if not secuencias.strip():
return "Por favor, ingresa una o m谩s secuencias de ARN v谩lidas con <mask> para predecir."
# Separar las secuencias por l铆neas y eliminar espacios vac铆os
secuencias_lista = [seq.strip().upper() for seq in secuencias.strip().split('\n') if seq.strip()]
resultados = []
for seq in secuencias_lista:
# Asegurarse de que la secuencia contenga al menos un <mask>
if "<MASK>" not in seq and "<mask>" not in seq:
resultados.append(f"Secuencia sin token <mask>: {seq}. Agrega <mask> donde desees predecir.")
continue
# Reemplazar <mask> con el token de m谩scara del modelo
seq = seq.replace("<mask>", mask_token).replace("<MASK>", mask_token)
# Realizar la predicci贸n de Fill-Mask
try:
predictions = fill_mask(seq)
except Exception as e:
resultados.append(f"Error al predecir para la secuencia: {seq}\n{e}")
continue
# Formatear las predicciones
pred_str = ""
for pred in predictions:
pred_str += f"Predicci贸n: {pred['sequence']}, Score: {pred['score']:.4f}\n"
resultados.append(f"Secuencia: {seq}\n{pred_str}")
return "\n\n".join(resultados)
except Exception as e:
print(f"Error durante la predicci贸n: {e}")
return f"Error al realizar la predicci贸n: {e}"
# Configurar el dispositivo
device = 0 if torch.cuda.is_available() else -1
if device == -1:
print("Advertencia: CUDA no est谩 disponible. Se usar谩 la CPU, lo que puede ser lento.")
# Cargar el pipeline de Fill-Mask
try:
print("Cargando el pipeline de Fill-Mask...")
fill_mask = pipeline('fill-mask', model='multimolecule/mrnafm', device=device)
except Exception as e:
print(f"Error al cargar el pipeline de Fill-Mask: {e}")
sys.exit(1)
# Obtener el token de m谩scara del modelo
mask_token = fill_mask.tokenizer.mask_token
print(f"Mask token utilizado por el modelo: {mask_token}")
# Definir la interfaz de Gradio
titulo = "OmniGenome: Predicci贸n de Fill-Mask para Secuencias de ARN"
descripcion = (
"Ingresa una o m谩s secuencias de ARN (una por l铆nea) con un token <mask> donde deseas realizar la predicci贸n. "
"El modelo utilizado es mRNA-FM de MultiMolecule, un modelo pre-entrenado de lenguaje para secuencias de ARN."
)
iface = gr.Interface(
fn=predecir_fill_mask,
inputs=gr.Textbox(
lines=10,
placeholder="Escribe tus secuencias de ARN aqu铆, una por l铆nea, incluyendo <mask> donde desees predecir...",
label="Secuencias de ARN con <mask>"
),
outputs=gr.Textbox(label="Predicciones de Fill-Mask"),
title=titulo,
description=descripcion,
examples=[
[
"AUGGCUACUUU<mask>G",
"GCGCGAU<mask>CGACGUAGCUAGC"
],
[
"AUAUGCGGUAUCGU<mask>GUA",
"GGAUACGUGAU<mask>GCUAGCAGU"
]
],
cache_examples=False,
allow_flagging="never"
)
# Ejecutar la interfaz
if __name__ == "__main__":
iface.launch()