Madras1 commited on
Commit
d6f2e7c
·
verified ·
1 Parent(s): 7986bf6

Create app.py

Browse files
Files changed (1) hide show
  1. app.py +106 -0
app.py ADDED
@@ -0,0 +1,106 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import gradio as gr
2
+ import spaces
3
+ import torch
4
+ from transformers import AutoModelForCausalLM, AutoTokenizer
5
+
6
+ # --- CONFIGURAÇÃO DOS MODELOS ---
7
+ # IDs Oficiais do Hugging Face
8
+ MODELS = {
9
+ "deepseek": "deepseek-ai/deepseek-math-7b-instruct",
10
+ "llama3": "meta-llama/Meta-Llama-3-8B-Instruct",
11
+ "gemma2": "google/gemma-2-9b-it"
12
+ }
13
+
14
+ # --- VARIÁVEIS GLOBAIS (CACHE NA VRAM) ---
15
+ # Vamos guardar tudo na memória da H200
16
+ loaded_models = {}
17
+ loaded_tokenizers = {}
18
+
19
+ def get_model_and_tokenizer(model_key):
20
+ """Carrega o modelo na VRAM apenas se ainda não estiver lá."""
21
+ global loaded_models, loaded_tokenizers
22
+
23
+ if model_key not in loaded_models:
24
+ model_id = MODELS[model_key]
25
+ print(f"🐢 Cold Start: Carregando {model_id} na VRAM...")
26
+
27
+ tokenizer = AutoTokenizer.from_pretrained(model_id)
28
+ model = AutoModelForCausalLM.from_pretrained(
29
+ model_id,
30
+ torch_dtype=torch.bfloat16, # BF16 economiza memória e é rápido na H200
31
+ device_map="cuda"
32
+ )
33
+
34
+ loaded_models[model_key] = model
35
+ loaded_tokenizers[model_key] = tokenizer
36
+ print(f"✅ {model_id} carregado e pronto!")
37
+
38
+ return loaded_models[model_key], loaded_tokenizers[model_key]
39
+
40
+ # --- FUNÇÃO DE GERAÇÃO (ZEROGPU) ---
41
+ @spaces.GPU(duration=120) # 2 min é seguro para respostas longas de matemática
42
+ def generate(message, history, model_selector):
43
+ # Identifica qual modelo o usuário quer
44
+ if "DeepSeek" in model_selector:
45
+ key = "deepseek"
46
+ elif "Llama" in model_selector:
47
+ key = "llama3"
48
+ elif "Gemma" in model_selector:
49
+ key = "gemma2"
50
+ else:
51
+ key = "deepseek" # Padrão
52
+
53
+ model, tokenizer = get_model_and_tokenizer(key)
54
+
55
+ # Formata o prompt (Cada modelo tem seu jeito, mas o tokenizer resolve)
56
+ # Convertendo histórico para formato de lista de dicts
57
+ messages = []
58
+ for user_msg, bot_msg in history:
59
+ if user_msg: messages.append({"role": "user", "content": user_msg})
60
+ if bot_msg: messages.append({"role": "assistant", "content": bot_msg})
61
+ messages.append({"role": "user", "content": message})
62
+
63
+ # Aplica o template de chat correto para o modelo
64
+ text = tokenizer.apply_chat_template(
65
+ messages,
66
+ tokenize=False,
67
+ add_generation_prompt=True
68
+ )
69
+
70
+ inputs = tokenizer([text], return_tensors="pt").to(model.device)
71
+
72
+ # Gera a resposta
73
+ # Max tokens alto pq matemática exige passo-a-passo
74
+ outputs = model.generate(
75
+ **inputs,
76
+ max_new_tokens=2048,
77
+ temperature=0.6,
78
+ do_sample=True
79
+ )
80
+
81
+ response = tokenizer.decode(outputs[0][inputs.input_ids.shape[1]:], skip_special_tokens=True)
82
+ return response
83
+
84
+ # --- INTERFACE GRADIO ---
85
+ with gr.Blocks(theme=gr.themes.Soft()) as demo:
86
+ gr.Markdown("# 🧮 Módulo Matemático & Lógico (H200)")
87
+
88
+ with gr.Row():
89
+ model_dropdown = gr.Dropdown(
90
+ choices=[
91
+ "🐳 DeepSeek Math 7B (Especialista em Exatas)",
92
+ "🦙 Llama 3 8B (Raciocínio Geral)",
93
+ "💎 Gemma 2 9B (Google - Raciocínio Lógico)"
94
+ ],
95
+ value="🐳 DeepSeek Math 7B (Especialista em Exatas)",
96
+ label="Escolha o Especialista",
97
+ interactive=True
98
+ )
99
+
100
+ chat = gr.ChatInterface(
101
+ fn=generate,
102
+ additional_inputs=[model_dropdown]
103
+ )
104
+
105
+ if __name__ == "__main__":
106
+ demo.launch()