Spaces:
Runtime error
Runtime error
File size: 4,895 Bytes
7b02281 0462c81 2636834 0462c81 1527ee9 a7bd5fa 0462c81 1527ee9 0462c81 2636834 1527ee9 a7bd5fa 0462c81 1527ee9 0462c81 1527ee9 7b02281 3410ef1 0462c81 1527ee9 0462c81 1527ee9 413d0ff 1527ee9 413d0ff 0462c81 1527ee9 0462c81 1527ee9 413d0ff 1527ee9 413d0ff 1527ee9 0462c81 1527ee9 0462c81 1527ee9 3410ef1 1527ee9 413d0ff 1527ee9 0462c81 1527ee9 0462c81 1527ee9 0462c81 1527ee9 413d0ff 1527ee9 3410ef1 1527ee9 3410ef1 1527ee9 3410ef1 1527ee9 413d0ff 1527ee9 7b02281 0462c81 1527ee9 0462c81 1527ee9 0462c81 1527ee9 0462c81 1527ee9 0462c81 1527ee9 0462c81 2636834 1527ee9 |
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 |
import os
import gradio as gr
from huggingface_hub import login
from datasets import load_dataset
from transformers import AutoTokenizer, AutoModelForCausalLM, Trainer, TrainingArguments, DataCollatorForLanguageModeling, pipeline
from peft import PeftModel
# ============================================================
# 🔐 Autenticación HuggingFace
# ============================================================
hf_token = os.environ.get("HF_TOKEN")
if hf_token:
login(token=hf_token)
else:
print("⚠️ No se encontró el token. Agrega 'HF_TOKEN' en Settings → Secrets.")
# ============================================================
# ⚙️ Configuración del modelo y dataset
# ============================================================
BASE_MODEL = "bigcode/santacoder" # Modelo público
LORA_PATH = "./lora_output" # Carpeta donde se guardará LoRA
DATASET_PATH = "tu_dataset.json" # Cambia aquí al nombre de tu dataset
# ============================================================
# 🔧 Inicializar tokenizer y modelo base
# ============================================================
tokenizer = AutoTokenizer.from_pretrained(BASE_MODEL)
base_model = AutoModelForCausalLM.from_pretrained(BASE_MODEL)
# 🔧 Asegurar que haya un pad_token
if tokenizer.pad_token is None:
tokenizer.pad_token = tokenizer.eos_token
# ============================================================
# 🧩 Función de entrenamiento LoRA
# ============================================================
def train_lora(epochs, batch_size, learning_rate):
try:
dataset = load_dataset("json", data_files=DATASET_PATH)
tokenized = dataset.map(
lambda e: tokenizer(
e["prompt"] + e["completion"],
truncation=True,
padding="max_length",
max_length=256
),
batched=True
)
data_collator = DataCollatorForLanguageModeling(tokenizer=tokenizer, mlm=False)
training_args = TrainingArguments(
output_dir=LORA_PATH,
per_device_train_batch_size=int(batch_size),
num_train_epochs=int(epochs),
learning_rate=learning_rate,
save_total_limit=1,
logging_steps=10,
push_to_hub=False
)
trainer = Trainer(
model=base_model,
args=training_args,
train_dataset=tokenized["train"],
data_collator=data_collator,
)
trainer.train()
# Guardar LoRA
base_model.save_pretrained(LORA_PATH)
tokenizer.save_pretrained(LORA_PATH)
return "✅ Entrenamiento completado y guardado en ./lora_output"
except Exception as e:
return f"❌ Error durante el entrenamiento: {e}"
# ============================================================
# 🤖 Función para generar texto usando LoRA sobre el modelo base
# ============================================================
def generate_text(prompt_text):
try:
# Cargar modelo base
tokenizer_gen = AutoTokenizer.from_pretrained(BASE_MODEL)
base_model_gen = AutoModelForCausalLM.from_pretrained(BASE_MODEL)
# Aplicar LoRA
model = PeftModel.from_pretrained(base_model_gen, LORA_PATH)
generator = pipeline("text-generation", model=model, tokenizer=tokenizer_gen)
output = generator(prompt_text, max_new_tokens=100, temperature=0.7, top_p=0.9)
return output[0]["generated_text"]
except Exception as e:
return f"❌ Error generando texto: {e}"
# ============================================================
# 💻 Interfaz Gradio
# ============================================================
with gr.Blocks(title="AmorCoderAI - Entrenamiento LoRA") as demo:
gr.Markdown("# 💙 AmorCoderAI - Entrenamiento y Pruebas")
gr.Markdown("Entrena y prueba tu modelo basado en `bigcode/santacoder` con LoRA")
with gr.Tab("🧠 Entrenar"):
epochs = gr.Number(value=1, label="Épocas")
batch_size = gr.Number(value=2, label="Tamaño de lote")
learning_rate = gr.Number(value=5e-5, label="Tasa de aprendizaje")
train_button = gr.Button("🚀 Iniciar entrenamiento")
train_output = gr.Textbox(label="Resultado")
train_button.click(train_lora, inputs=[epochs, batch_size, learning_rate], outputs=train_output)
with gr.Tab("✨ Probar modelo"):
prompt = gr.Textbox(label="Escribe un prompt")
generate_button = gr.Button("💬 Generar texto")
output_box = gr.Textbox(label="Salida generada")
generate_button.click(generate_text, inputs=prompt, outputs=output_box)
# ============================================================
# 🚀 Lanzar app
# ============================================================
if __name__ == "__main__":
demo.launch() |