File size: 4,408 Bytes
5a798cc
 
ce0f331
820a0dd
 
69463c7
ce0f331
69463c7
ce0f331
 
 
69463c7
ce0f331
 
 
 
 
 
820a0dd
 
 
 
 
 
 
 
 
 
 
 
5a798cc
ce0f331
 
 
 
 
69463c7
 
ce0f331
69463c7
ce0f331
69463c7
 
ce0f331
 
 
69463c7
 
 
ce0f331
69463c7
 
 
 
ce0f331
69463c7
ce0f331
69463c7
 
ce0f331
 
 
69463c7
 
 
ce0f331
 
 
 
 
4749da3
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
5a798cc
4749da3
 
 
 
 
165628b
5a798cc
4749da3
165628b
4749da3
 
 
 
 
 
 
 
 
 
 
 
165628b
4749da3
5a798cc
 
 
 
4749da3
5a798cc
 
4749da3
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
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
import gradio as gr
import torch
from transformers import AutoModelForCausalLM, AutoTokenizer
import time
from functools import wraps
import sys

# Intentar importar 'spaces' para usar el decorador GPU si está disponible
try:
    import spaces
except ImportError:
    # Si 'spaces' no está disponible, definir un decorador vacío
    def GPU(duration):
        def decorator(func):
            return func
        return decorator

    spaces = type('spaces', (), {'GPU': GPU})

# 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

# Configurar el dispositivo (GPU si está disponible)
device = "cuda" if torch.cuda.is_available() else "cpu"
if device == "cpu":
    print("Advertencia: CUDA no está disponible. Se usará la CPU, lo que puede ser lento.")

# Ruta local al tokenizador
tokenizer_path = "tokenizer_bpe_1024"

# Cargar el tokenizador desde el directorio local
try:
    print(f"Cargando el tokenizador desde el directorio local '{tokenizer_path}'...")
    tokenizer = AutoTokenizer.from_pretrained(tokenizer_path)
except ValueError as e:
    print(f"Error al cargar el tokenizador: {e}")
    sys.exit(1)
except Exception as e:
    print(f"Error inesperado al cargar el tokenizador: {e}")
    sys.exit(1)

# Ruta al modelo local
model_path = "model.pt.recombined"

# Cargar el modelo desde el archivo local
try:
    print(f"Cargando el modelo GenerRNA desde '{model_path}'...")
    model = AutoModelForCausalLM.from_pretrained(
        model_path,
        torch_dtype=torch.float16 if device == "cuda" else torch.float32
    ).to(device)
    model.eval()
    print("Modelo GenerRNA cargado exitosamente.")
except FileNotFoundError:
    print(f"Error: El archivo del modelo '{model_path}' no se encontró.")
    sys.exit(1)
except Exception as e:
    print(f"Error al cargar el modelo GenerRNA: {e}")
    sys.exit(1)

@spaces.GPU(duration=120)  # Decorador para asignar GPU durante 120 segundos
@medir_tiempo
def generar_rna_sequence(prompt, max_length=256):
    """
    Función que genera una secuencia de RNA a partir de una secuencia inicial dada.
    """
    try:
        if not prompt.strip():
            return "Por favor, ingresa una secuencia de inicio válida."

        # Tokenizar la entrada
        inputs = tokenizer.encode(prompt, return_tensors="pt").to(device)

        # Generar la secuencia
        with torch.no_grad():
            outputs = model.generate(
                inputs,
                max_length=max_length,
                num_return_sequences=1,
                no_repeat_ngram_size=2,
                temperature=0.7,
                top_k=50,
                top_p=0.95,
                do_sample=True
            )

        # Decodificar la secuencia generada
        generated_sequence = tokenizer.decode(outputs[0], skip_special_tokens=True)
        return generated_sequence

    except Exception as e:
        print(f"Error durante la generación de secuencia: {e}")
        return f"Error al generar la secuencia: {e}"

# Definir la interfaz de Gradio
titulo = "GenerRNA - Generador de Secuencias de RNA"
descripcion = (
    "GenerRNA es un modelo generativo de RNA basado en una arquitectura Transformer. "
    "Ingresa una secuencia inicial opcional y define la longitud máxima para generar nuevas secuencias de RNA."
)

iface = gr.Interface(
    fn=generar_rna_sequence,
    inputs=[
        gr.Textbox(
            lines=5,
            placeholder="Ingresa una secuencia de RNA inicial (opcional)...",
            label="Secuencia Inicial"
        ),
        gr.Slider(
            minimum=50,
            maximum=1000,
            step=50,
            value=256,
            label="Longitud Máxima de la Secuencia"
        )
    ],
    outputs=gr.Textbox(label="Secuencia de RNA Generada"),
    title=titulo,
    description=descripcion,
    examples=[
        [
            "AUGGCUACGUAUCGACGUA"
        ],
        [
            "GCUAUGCUAGCUAGCUGAC"
        ]
    ],
    cache_examples=False,
    allow_flagging="never"
)

# Ejecutar la interfaz
if __name__ == "__main__":
    iface.launch()