JMAA00 commited on
Commit
2731234
·
1 Parent(s): 7a95019
Files changed (1) hide show
  1. app.py +99 -36
app.py CHANGED
@@ -1,49 +1,112 @@
1
- # test_local.py
2
  import torch
3
- from transformers import AutoTokenizer, AutoModelForCausalLM
 
 
4
 
5
- model_name = "deepseek-ai/DeepSeek-R1-Distill-Llama-8B"
 
 
6
 
7
- print("Loading tokenizer...")
8
- tokenizer = AutoTokenizer.from_pretrained(
9
- model_name,
10
- trust_remote_code=True # <-- por si el repo define código extra
11
- )
12
-
13
- print("Loading model...")
14
  model = AutoModelForCausalLM.from_pretrained(
15
- model_name,
16
- trust_remote_code=True,
17
- device_map="auto", # GPU si está disponible
18
- torch_dtype=torch.float16 # si GPU; en CPU podrías usar float32
19
  )
20
- # For safety, set pad_token_id if missing
 
 
21
  if model.config.pad_token_id is None:
22
  model.config.pad_token_id = tokenizer.eos_token_id
23
- model.eval()
24
 
25
- print("Testing generation...")
26
 
27
- # Prompt sencillo
28
- prompt = (
29
- "System: Eres un asistente amable.\n\n"
30
- "User: Hola, ¿cómo estás?\n"
31
- "Assistant:"
32
- )
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
33
 
34
- inputs = tokenizer(prompt, return_tensors="pt").to(model.device)
 
 
35
 
36
- # Generamos ~50 tokens, do_sample
37
- with torch.no_grad():
38
- output_ids = model.generate(
39
- **inputs,
40
- max_new_tokens=50,
41
- temperature=0.7,
42
- top_p=0.9,
43
- do_sample=True
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
44
  )
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
45
 
46
- # Decodificamos y mostramos
47
- output_text = tokenizer.decode(output_ids[0], skip_special_tokens=True)
48
- print("\n=== Generated Text ===\n")
49
- print(output_text)
 
1
+ import os
2
  import torch
3
+ import gradio as gr
4
+ import threading
5
+ from transformers import AutoTokenizer, AutoModelForCausalLM, TextIteratorStreamer
6
 
7
+ # 1) Cargar tokenizer y modelo
8
+ print("Cargando tokenizer...")
9
+ tokenizer = AutoTokenizer.from_pretrained("deepseek-ai/DeepSeek-R1-Distill-Llama-8B")
10
 
11
+ print("Cargando modelo...")
 
 
 
 
 
 
12
  model = AutoModelForCausalLM.from_pretrained(
13
+ "deepseek-ai/DeepSeek-R1-Distill-Llama-8B",
14
+ device_map="auto", # Usa GPU si está disponible
15
+ torch_dtype=torch.float16 # FP16 si GPU; en CPU, podrías usar float32
 
16
  )
17
+ model.eval()
18
+
19
+ # Ajuste de pad_token_id si fuese necesario
20
  if model.config.pad_token_id is None:
21
  model.config.pad_token_id = tokenizer.eos_token_id
 
22
 
 
23
 
24
+ def respond(
25
+ user_message: str,
26
+ history: list[tuple[str, str]],
27
+ system_message: str,
28
+ max_new_tokens: int,
29
+ temperature: float,
30
+ top_p: float,
31
+ ):
32
+ """
33
+ Llamada por ChatInterface en cada turno.
34
+ - user_message: Texto nuevo del usuario.
35
+ - history: Lista [(usuario, asistente), ...] de turnos previos.
36
+ - system_message: Se añade SOLO si el historial está vacío.
37
+ Devuelve tokens progresivamente (streaming).
38
+ """
39
+
40
+ # 1) Creamos un prompt vacío
41
+ prompt = ""
42
+
43
+ # 2) Solo añadimos system_message si no hay historial
44
+ if not history:
45
+ prompt += f"{system_message}\n\n"
46
 
47
+ # 3) Añadimos la conversación previa: "User: ...\nAssistant: ..."
48
+ for (past_user, past_assistant) in history:
49
+ prompt += f"Usuario: {past_user}\nAsistente: {past_assistant}\n"
50
 
51
+ # 4) Añadimos el nuevo turno del usuario
52
+ prompt += f"Usuario: {user_message}\nAsistente:"
53
+
54
+ # 5) Preparamos un TextIteratorStreamer para streaming
55
+ streamer = TextIteratorStreamer(tokenizer=tokenizer, skip_special_tokens=True)
56
+
57
+ # 6) Codificamos el prompt
58
+ inputs = tokenizer(prompt, return_tensors="pt").to(model.device)
59
+
60
+ # 7) Preparamos parámetros de generate
61
+ generation_kwargs = {
62
+ "inputs": inputs["input_ids"],
63
+ "attention_mask": inputs["attention_mask"],
64
+ "max_new_tokens": max_new_tokens,
65
+ "temperature": temperature,
66
+ "top_p": top_p,
67
+ "do_sample": True,
68
+ "streamer": streamer,
69
+ }
70
+
71
+ # 8) Ejecutamos model.generate en un hilo
72
+ generation_thread = threading.Thread(
73
+ target=model.generate,
74
+ kwargs=generation_kwargs
75
  )
76
+ generation_thread.start()
77
+
78
+ # 9) Iteramos sobre el streamer para devolver tokens sucesivamente
79
+ output_text = ""
80
+ for new_token in streamer:
81
+ output_text += new_token
82
+ yield output_text
83
+
84
+ # 10) Definimos la interfaz ChatInterface
85
+ demo = gr.ChatInterface(
86
+ fn=respond,
87
+ additional_inputs=[
88
+ # Cuadro para "mensaje de sistema", solo usado en la 1ª interacción
89
+ gr.Textbox(
90
+ label="Mensaje del sistema (se usará sólo al inicio)",
91
+ value="Eres un asistente amable y paciente. Responde siempre en español."
92
+ ),
93
+ gr.Slider(
94
+ minimum=1, maximum=1024, value=100, step=1, label="Max new tokens"
95
+ ),
96
+ gr.Slider(
97
+ minimum=0.1, maximum=2.0, value=0.7, step=0.1, label="Temperatura"
98
+ ),
99
+ gr.Slider(
100
+ minimum=0.1, maximum=1.0, value=0.9, step=0.05, label="Top-p"
101
+ ),
102
+ ],
103
+ title="DeepSeek Chat Demo",
104
+ description=(
105
+ "Este demo carga el modelo deepseek-ai/DeepSeek-R1-Distill-Llama-8B "
106
+ "y permite conversar en varios turnos. El mensaje de sistema se añade "
107
+ "sólo en la primera interacción, y luego la charla fluye como Usuario/Asistente."
108
+ )
109
+ )
110
 
111
+ if __name__ == "__main__":
112
+ demo.launch()