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()
|