Andro0s commited on
Commit
1527ee9
·
verified ·
1 Parent(s): fd801b7

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +48 -69
app.py CHANGED
@@ -2,134 +2,113 @@ import os
2
  import gradio as gr
3
  from huggingface_hub import login
4
  from datasets import load_dataset
5
- from transformers import (
6
- AutoTokenizer,
7
- AutoModelForCausalLM,
8
- Trainer,
9
- TrainingArguments,
10
- DataCollatorForLanguageModeling,
11
- pipeline,
12
- )
13
 
14
  # ============================================================
15
- # 🔐 Autenticación segura con tu token
16
  # ============================================================
17
  hf_token = os.environ.get("HF_TOKEN")
18
-
19
  if hf_token:
20
  login(token=hf_token)
21
  else:
22
- print("⚠️ No se encontró el token. Agrega 'HF_TOKEN' en Settings → Secrets → Add new secret")
23
 
24
  # ============================================================
25
- # ⚙️ Configuración del modelo base y dataset
26
  # ============================================================
27
- MODEL_NAME = "bigcode/santacoder" # Modelo libre y compatible con Hugging Face
28
- DATASET_PATH = "tu_dataset.json" # Archivo dataset que subiste al Space
29
- OUTPUT_DIR = "lora_output" # Carpeta donde se guarda el modelo entrenado
30
-
31
- # Crear carpeta de salida si no existe
32
- os.makedirs(OUTPUT_DIR, exist_ok=True)
33
-
34
- # Cargar modelo y tokenizer
35
- print("🔄 Cargando modelo base...")
36
- tokenizer = AutoTokenizer.from_pretrained(MODEL_NAME, use_auth_token=hf_token)
37
- model = AutoModelForCausalLM.from_pretrained(MODEL_NAME, use_auth_token=hf_token)
38
 
39
  # ============================================================
40
- # 🧩 Función de entrenamiento LoRA (simple y funcional)
41
  # ============================================================
42
  def train_lora(epochs, batch_size, learning_rate):
43
  try:
44
- # Cargar dataset JSON
45
  dataset = load_dataset("json", data_files=DATASET_PATH)
46
-
47
- # Tokenización del dataset
48
- def tokenize_fn(example):
49
- text = example["prompt"] + example["completion"]
50
- return tokenizer(
51
- text,
52
  truncation=True,
53
  padding="max_length",
54
- max_length=256,
55
- )
56
-
57
- tokenized = dataset.map(tokenize_fn, batched=True)
58
-
59
- # Preparar data collator
60
- data_collator = DataCollatorForLanguageModeling(
61
- tokenizer=tokenizer, mlm=False
62
  )
63
 
64
- # Configuración del entrenamiento
 
65
  training_args = TrainingArguments(
66
- output_dir=OUTPUT_DIR,
67
  per_device_train_batch_size=int(batch_size),
68
  num_train_epochs=int(epochs),
69
- learning_rate=float(learning_rate),
70
- logging_steps=10,
71
  save_total_limit=1,
72
- push_to_hub=False,
73
- report_to="none",
74
  )
75
 
76
- # Entrenador
77
  trainer = Trainer(
78
- model=model,
79
  args=training_args,
80
  train_dataset=tokenized["train"],
81
  data_collator=data_collator,
82
  )
83
 
84
- # Entrenar modelo
85
  trainer.train()
 
 
 
86
 
87
- # Guardar resultados
88
- model.save_pretrained(OUTPUT_DIR)
89
- tokenizer.save_pretrained(OUTPUT_DIR)
90
-
91
- return "✅ Entrenamiento completado con éxito. Modelo guardado en ./lora_output"
92
  except Exception as e:
93
- return f"❌ Error durante el entrenamiento: {str(e)}"
94
 
95
  # ============================================================
96
- # 🤖 Función de prueba del modelo entrenado
97
  # ============================================================
98
- def generate_text(prompt):
99
  try:
100
- generator = pipeline(
101
- "text-generation",
102
- model=OUTPUT_DIR,
103
- tokenizer=tokenizer,
104
- )
105
- output = generator(prompt, max_new_tokens=100, temperature=0.7, top_p=0.9)
 
 
 
106
  return output[0]["generated_text"]
107
  except Exception as e:
108
- return f"⚠️ Error al generar texto: {str(e)}"
109
 
110
  # ============================================================
111
- # 💻 Interfaz de usuario (Gradio)
112
  # ============================================================
113
- with gr.Blocks(title="💙 AmorCoderAI - Entrenamiento LoRA") as demo:
 
 
 
114
  gr.Markdown("# 💙 AmorCoderAI - Entrenamiento y Pruebas")
115
- gr.Markdown("Entrena y prueba tu modelo basado en `bigcode/santacoder` con LoRA.")
116
 
117
  with gr.Tab("🧠 Entrenar"):
118
  epochs = gr.Number(value=1, label="Épocas")
119
  batch_size = gr.Number(value=2, label="Tamaño de lote")
120
  learning_rate = gr.Number(value=5e-5, label="Tasa de aprendizaje")
121
  train_button = gr.Button("🚀 Iniciar entrenamiento")
122
- train_output = gr.Textbox(label="Resultado", lines=3)
123
  train_button.click(train_lora, inputs=[epochs, batch_size, learning_rate], outputs=train_output)
124
 
125
  with gr.Tab("✨ Probar modelo"):
126
  prompt = gr.Textbox(label="Escribe un prompt")
127
  generate_button = gr.Button("💬 Generar texto")
128
- output_box = gr.Textbox(label="Salida generada", lines=6)
129
  generate_button.click(generate_text, inputs=prompt, outputs=output_box)
130
 
131
  # ============================================================
132
  # 🚀 Lanzar app
133
  # ============================================================
134
  if __name__ == "__main__":
135
- demo.launch(server_name="0.0.0.0", server_port=7860)
 
2
  import gradio as gr
3
  from huggingface_hub import login
4
  from datasets import load_dataset
5
+ from transformers import AutoTokenizer, AutoModelForCausalLM, Trainer, TrainingArguments, DataCollatorForLanguageModeling, pipeline
6
+ from peft import PeftModel
 
 
 
 
 
 
7
 
8
  # ============================================================
9
+ # 🔐 Autenticación HuggingFace
10
  # ============================================================
11
  hf_token = os.environ.get("HF_TOKEN")
 
12
  if hf_token:
13
  login(token=hf_token)
14
  else:
15
+ print("⚠️ No se encontró el token. Agrega 'HF_TOKEN' en Settings → Secrets.")
16
 
17
  # ============================================================
18
+ # ⚙️ Configuración del modelo y dataset
19
  # ============================================================
20
+ BASE_MODEL = "bigcode/santacoder" # Modelo público
21
+ LORA_PATH = "./lora_output" # Carpeta donde se guardará LoRA
22
+ DATASET_PATH = "tu_dataset.json" # Cambia aquí al nombre de tu dataset
 
 
 
 
 
 
 
 
23
 
24
  # ============================================================
25
+ # 🧩 Función de entrenamiento LoRA
26
  # ============================================================
27
  def train_lora(epochs, batch_size, learning_rate):
28
  try:
 
29
  dataset = load_dataset("json", data_files=DATASET_PATH)
30
+ tokenized = dataset.map(
31
+ lambda e: tokenizer(
32
+ e["prompt"] + e["completion"],
 
 
 
33
  truncation=True,
34
  padding="max_length",
35
+ max_length=256
36
+ ),
37
+ batched=True
 
 
 
 
 
38
  )
39
 
40
+ data_collator = DataCollatorForLanguageModeling(tokenizer=tokenizer, mlm=False)
41
+
42
  training_args = TrainingArguments(
43
+ output_dir=LORA_PATH,
44
  per_device_train_batch_size=int(batch_size),
45
  num_train_epochs=int(epochs),
46
+ learning_rate=learning_rate,
 
47
  save_total_limit=1,
48
+ logging_steps=10,
49
+ push_to_hub=False
50
  )
51
 
 
52
  trainer = Trainer(
53
+ model=base_model,
54
  args=training_args,
55
  train_dataset=tokenized["train"],
56
  data_collator=data_collator,
57
  )
58
 
 
59
  trainer.train()
60
+ # Guardar LoRA
61
+ model.save_pretrained(LORA_PATH)
62
+ tokenizer.save_pretrained(LORA_PATH)
63
 
64
+ return "✅ Entrenamiento completado y guardado en ./lora_output"
 
 
 
 
65
  except Exception as e:
66
+ return f"❌ Error durante el entrenamiento: {e}"
67
 
68
  # ============================================================
69
+ # 🤖 Función para generar texto usando LoRA sobre el modelo base
70
  # ============================================================
71
+ def generate_text(prompt_text):
72
  try:
73
+ # Cargar modelo base
74
+ tokenizer = AutoTokenizer.from_pretrained(BASE_MODEL)
75
+ base_model = AutoModelForCausalLM.from_pretrained(BASE_MODEL)
76
+
77
+ # Aplicar LoRA
78
+ model = PeftModel.from_pretrained(base_model, LORA_PATH)
79
+
80
+ generator = pipeline("text-generation", model=model, tokenizer=tokenizer)
81
+ output = generator(prompt_text, max_new_tokens=100, temperature=0.7, top_p=0.9)
82
  return output[0]["generated_text"]
83
  except Exception as e:
84
+ return f" Error generando texto: {e}"
85
 
86
  # ============================================================
87
+ # 💻 Interfaz Gradio
88
  # ============================================================
89
+ tokenizer = AutoTokenizer.from_pretrained(BASE_MODEL)
90
+ base_model = AutoModelForCausalLM.from_pretrained(BASE_MODEL)
91
+
92
+ with gr.Blocks(title="AmorCoderAI - Entrenamiento LoRA") as demo:
93
  gr.Markdown("# 💙 AmorCoderAI - Entrenamiento y Pruebas")
94
+ gr.Markdown("Entrena y prueba tu modelo basado en `bigcode/santacoder` con LoRA")
95
 
96
  with gr.Tab("🧠 Entrenar"):
97
  epochs = gr.Number(value=1, label="Épocas")
98
  batch_size = gr.Number(value=2, label="Tamaño de lote")
99
  learning_rate = gr.Number(value=5e-5, label="Tasa de aprendizaje")
100
  train_button = gr.Button("🚀 Iniciar entrenamiento")
101
+ train_output = gr.Textbox(label="Resultado")
102
  train_button.click(train_lora, inputs=[epochs, batch_size, learning_rate], outputs=train_output)
103
 
104
  with gr.Tab("✨ Probar modelo"):
105
  prompt = gr.Textbox(label="Escribe un prompt")
106
  generate_button = gr.Button("💬 Generar texto")
107
+ output_box = gr.Textbox(label="Salida generada")
108
  generate_button.click(generate_text, inputs=prompt, outputs=output_box)
109
 
110
  # ============================================================
111
  # 🚀 Lanzar app
112
  # ============================================================
113
  if __name__ == "__main__":
114
+ demo.launch()