oriolgds commited on
Commit
39ec906
·
unverified ·
1 Parent(s): d6aca47

Other optimisations

Browse files
Files changed (1) hide show
  1. app.py +29 -48
app.py CHANGED
@@ -2,45 +2,35 @@ import gradio as gr
2
  import transformers
3
  import torch
4
  import os
 
5
 
6
  # --- 1. Configuración del Modelo ---
7
-
8
- # Obtenemos el HF_TOKEN de los "Secrets" del Space.
9
- # ¡NUNCA escribas tu token directamente en el código!
10
  HF_TOKEN = os.environ.get("HF_TOKEN")
11
-
12
  if not HF_TOKEN:
13
  print("ADVERTENCIA: No se ha configurado el secret 'HF_TOKEN'.")
14
- # Si no hay token, la app puede fallar al cargar el modelo gated.
15
- # Para pruebas locales, puedes crear un archivo .env o setear la variable.
16
- # raise ValueError("Falta el HF_TOKEN. Configúralo en los secrets del Space.")
17
 
18
- # Cargamos el modelo Llama-3.2-1B-Instruct
19
- # Usamos un pipeline para facilitar la generación de texto
20
  try:
 
 
21
  generator = transformers.pipeline(
22
  "text-generation",
23
  model="meta-llama/Llama-3.2-1B-Instruct",
24
- dtype=torch.bfloat16, # Optimización para velocidad y memoria (reemplaza a torch_dtype)
25
- device_map="auto", # Usa GPU si está disponible
26
- token=HF_TOKEN # Token para acceder al modelo gated
27
  )
28
 
29
- # --- INICIO DE LA CORRECCIÓN ---
30
- # CORRECCIÓN 1: Asegurarse de que pad_token_id esté configurado
31
- # Algunos modelos no tienen un pad_token_id por defecto, lo que causa el error 'NoneType'
32
  if generator.tokenizer.pad_token_id is None:
33
  generator.tokenizer.pad_token_id = generator.tokenizer.eos_token_id
34
  print("INFO: pad_token_id no estaba configurado. Se ha establecido en eos_token_id.")
35
- # --- FIN DE LA CORRECCIÓN ---
36
-
37
- print("Pipeline de Llama-3.2-1B cargado exitosamente.")
38
  except Exception as e:
39
  print(f"Error cargando el pipeline: {e}")
40
- # Si falla aquí, probablemente es por el token o falta de acceso.
41
- generator = None # Marcamos que falló
42
 
43
- # --- 2. Lógica de Generación ---
44
 
45
  def generate_title(text_input):
46
  """
@@ -53,7 +43,6 @@ def generate_title(text_input):
53
  return "Por favor, introduce un texto."
54
 
55
  # Prompt engineering: Damos instrucciones claras al modelo.
56
- # Llama 3.2 usa un formato de chat específico.
57
  system_prompt = "Eres un experto en resumir textos en títulos cortos y llamativos. Te daré un texto o un historial de chat y tú generarás un título de entre 3 y 7 palabras. Responde SOLAMENTE con el título y nada más."
58
 
59
  user_prompt = f"Genera un título para el siguiente contenido:\n\n---\n{text_input}\n---"
@@ -63,39 +52,32 @@ def generate_title(text_input):
63
  {"role": "user", "content": user_prompt},
64
  ]
65
 
66
- # --- INICIO DE LA CORRECCIÓN ---
67
- # CORRECCIÓN 2: Lista de terminadores robusta
68
- # El ID para "\n" (nueva línea) en Llama 3 es 13.
69
- # generator.tokenizer.eos_token_id es el ID de <|eot_id|>
70
- # Usamos una lista explícita de enteros para evitar 'None'.
71
  terminators_safe = list(set([
72
  generator.tokenizer.eos_token_id,
73
  13 # ID del token de nueva línea (\n)
74
  ]))
75
- # --- FIN DE LA CORRECCIÓN ---
76
 
77
  try:
 
 
78
  outputs = generator(
79
  messages,
80
- max_new_tokens=20, # Un título no necesita más de 20 tokens
81
- eos_token_id=terminators_safe, # Usamos la lista corregida
82
- do_sample=False, # Queremos la respuesta más probable, no creativa
83
- temperature=None, # No necesario si do_sample=False
84
- top_p=None, # No necesario si do_sample=False
85
- pad_token_id=generator.tokenizer.eos_token_id # Ahora es seguro usar esto
86
  )
87
 
88
- # Extraemos la respuesta del asistente
89
- # La estructura es: outputs[0]["generated_text"] es una *lista* de mensajes
90
- # El último mensaje [-1] es el del asistente
91
  title = outputs[0]["generated_text"][-1]["content"]
92
-
93
- # Limpiamos el título (quitar espacios, comillas, etc.)
94
  title = title.strip().replace('"', '').replace("Título:", "").strip()
95
 
96
  if not title:
97
- return "No se pudo generar un título."
98
 
 
 
99
  return title
100
 
101
  except Exception as e:
@@ -116,22 +98,22 @@ with gr.Blocks(theme=gr.themes.Soft()) as demo:
116
  text_input = gr.Textbox(
117
  lines=15,
118
  label="Texto o Historial de Chat",
119
- placeholder="Pega tu contenido aquí. Por ejemplo:\n\nUser: ¿Qué es la IA?\nAssistant: La IA es...\nUser: ¿Y el machine learning?\n\nO simplemente pega un artículo largo."
120
  )
121
  title_output = gr.Textbox(
122
  label="Título Generado",
123
- interactive=False # El usuario no puede editar esto
124
  )
125
 
126
  generate_btn = gr.Button("🚀 Generar Título", variant="primary")
127
 
128
- # Conectamos el botón a la función
129
- # api_name="generate_title" habilita el endpoint /api/generate_title
130
  generate_btn.click(
131
  fn=generate_title,
132
  inputs=text_input,
133
  outputs=title_output,
134
- api_name="generate_title"
 
135
  )
136
 
137
  gr.Examples(
@@ -147,8 +129,7 @@ with gr.Blocks(theme=gr.themes.Soft()) as demo:
147
  label="Ejemplos de Entrada"
148
  )
149
 
150
- # Lanzamos la aplicación
151
  if __name__ == "__main__":
152
- demo.launch()
153
-
154
 
 
2
  import transformers
3
  import torch
4
  import os
5
+ import time # Para medir el tiempo
6
 
7
  # --- 1. Configuración del Modelo ---
 
 
 
8
  HF_TOKEN = os.environ.get("HF_TOKEN")
 
9
  if not HF_TOKEN:
10
  print("ADVERTENCIA: No se ha configurado el secret 'HF_TOKEN'.")
 
 
 
11
 
 
 
12
  try:
13
+ print("Iniciando carga del pipeline...")
14
+ start_load = time.time()
15
  generator = transformers.pipeline(
16
  "text-generation",
17
  model="meta-llama/Llama-3.2-1B-Instruct",
18
+ dtype=torch.bfloat16,
19
+ device_map="auto",
20
+ token=HF_TOKEN
21
  )
22
 
 
 
 
23
  if generator.tokenizer.pad_token_id is None:
24
  generator.tokenizer.pad_token_id = generator.tokenizer.eos_token_id
25
  print("INFO: pad_token_id no estaba configurado. Se ha establecido en eos_token_id.")
26
+
27
+ end_load = time.time()
28
+ print(f"Pipeline de Llama-3.2-1B cargado exitosamente en {end_load - start_load:.2f} segundos.")
29
  except Exception as e:
30
  print(f"Error cargando el pipeline: {e}")
31
+ generator = None
 
32
 
33
+ # --- 2. Lógica de Generación (Modo Simple: una petición a la vez) ---
34
 
35
  def generate_title(text_input):
36
  """
 
43
  return "Por favor, introduce un texto."
44
 
45
  # Prompt engineering: Damos instrucciones claras al modelo.
 
46
  system_prompt = "Eres un experto en resumir textos en títulos cortos y llamativos. Te daré un texto o un historial de chat y tú generarás un título de entre 3 y 7 palabras. Responde SOLAMENTE con el título y nada más."
47
 
48
  user_prompt = f"Genera un título para el siguiente contenido:\n\n---\n{text_input}\n---"
 
52
  {"role": "user", "content": user_prompt},
53
  ]
54
 
 
 
 
 
 
55
  terminators_safe = list(set([
56
  generator.tokenizer.eos_token_id,
57
  13 # ID del token de nueva línea (\n)
58
  ]))
 
59
 
60
  try:
61
+ print("Generando título para una sola petición...")
62
+ start_gen = time.time()
63
  outputs = generator(
64
  messages,
65
+ max_new_tokens=20,
66
+ eos_token_id=terminators_safe,
67
+ do_sample=False,
68
+ temperature=None,
69
+ top_p=None,
70
+ pad_token_id=generator.tokenizer.eos_token_id
71
  )
72
 
 
 
 
73
  title = outputs[0]["generated_text"][-1]["content"]
 
 
74
  title = title.strip().replace('"', '').replace("Título:", "").strip()
75
 
76
  if not title:
77
+ title = "No se pudo generar un título."
78
 
79
+ end_gen = time.time()
80
+ print(f"Título generado en {end_gen - start_gen:.2f} segundos.")
81
  return title
82
 
83
  except Exception as e:
 
98
  text_input = gr.Textbox(
99
  lines=15,
100
  label="Texto o Historial de Chat",
101
+ placeholder="Pega tu contenido aquí..."
102
  )
103
  title_output = gr.Textbox(
104
  label="Título Generado",
105
+ interactive=False
106
  )
107
 
108
  generate_btn = gr.Button("🚀 Generar Título", variant="primary")
109
 
110
+ # --- Evento de Click (Modo Simple) ---
 
111
  generate_btn.click(
112
  fn=generate_title,
113
  inputs=text_input,
114
  outputs=title_output,
115
+ api_name="generate_title"
116
+ # No batching, no max_batch_size
117
  )
118
 
119
  gr.Examples(
 
129
  label="Ejemplos de Entrada"
130
  )
131
 
132
+ # --- Lanzamiento (Modo Simple) ---
133
  if __name__ == "__main__":
134
+ demo.launch() # <-- Sin .queue()
 
135