File size: 4,114 Bytes
5a798cc
 
32f8cf2
820a0dd
 
69463c7
7424b84
a7f35a0
820a0dd
a2da660
820a0dd
 
 
a2da660
 
 
 
 
 
820a0dd
5a798cc
a2da660
 
4749da3
32f8cf2
4749da3
32f8cf2
4749da3
 
5b7b502
32f8cf2
4749da3
5b7b502
199e65d
5b7b502
1baae24
5b7b502
32f8cf2
 
 
199e65d
 
a7f35a0
 
 
7424b84
8b8ac4a
 
 
 
 
5b7b502
32f8cf2
 
 
 
199e65d
32f8cf2
5b7b502
 
 
 
 
32f8cf2
4749da3
a7f35a0
a2da660
 
 
 
 
 
 
 
 
 
 
 
a7f35a0
 
 
 
5a798cc
32f8cf2
5b7b502
8b8ac4a
 
5b7b502
165628b
5a798cc
32f8cf2
5b7b502
 
32f8cf2
 
5b7b502
32f8cf2
5a798cc
 
 
 
32f8cf2
 
5a798cc
 
32f8cf2
 
5a798cc
 
50560b1
 
5a798cc
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
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()