|
import gradio as gr |
|
import torch |
|
from transformers import AutoModelForCausalLM, AutoTokenizer |
|
import time |
|
from functools import wraps |
|
import sys |
|
|
|
|
|
try: |
|
import spaces |
|
except ImportError: |
|
|
|
def GPU(duration): |
|
def decorator(func): |
|
return func |
|
return decorator |
|
|
|
spaces = type('spaces', (), {'GPU': GPU}) |
|
|
|
|
|
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 |
|
|
|
|
|
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.") |
|
|
|
|
|
tokenizer_path = "tokenizer_bpe_1024" |
|
|
|
|
|
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) |
|
|
|
|
|
model_path = "model.pt.recombined" |
|
|
|
|
|
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) |
|
@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." |
|
|
|
|
|
inputs = tokenizer.encode(prompt, return_tensors="pt").to(device) |
|
|
|
|
|
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 |
|
) |
|
|
|
|
|
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}" |
|
|
|
|
|
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" |
|
) |
|
|
|
|
|
if __name__ == "__main__": |
|
iface.launch() |
|
|