|
import gradio as gr |
|
import torch |
|
from transformers import pipeline |
|
import time |
|
from functools import wraps |
|
import sys |
|
import multimolecule |
|
import spaces |
|
|
|
|
|
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 |
|
|
|
|
|
@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." |
|
|
|
|
|
secuencias_lista = [seq.strip().upper() for seq in secuencias.strip().split('\n') if seq.strip()] |
|
resultados = [] |
|
|
|
for seq in secuencias_lista: |
|
|
|
if "<MASK>" not in seq and "<mask>" not in seq: |
|
resultados.append(f"Secuencia sin token <mask>: {seq}. Agrega <mask> donde desees predecir.") |
|
continue |
|
|
|
|
|
seq = seq.replace("<mask>", mask_token).replace("<MASK>", mask_token) |
|
|
|
|
|
try: |
|
predictions = fill_mask(seq) |
|
except Exception as e: |
|
resultados.append(f"Error al predecir para la secuencia: {seq}\n{e}") |
|
continue |
|
|
|
|
|
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}" |
|
|
|
|
|
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.") |
|
|
|
|
|
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) |
|
|
|
|
|
mask_token = fill_mask.tokenizer.mask_token |
|
print(f"Mask token utilizado por el modelo: {mask_token}") |
|
|
|
|
|
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" |
|
) |
|
|
|
|
|
if __name__ == "__main__": |
|
iface.launch() |
|
|