jojonocode commited on
Commit
ebbe976
·
verified ·
1 Parent(s): cae091c

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +38 -20
app.py CHANGED
@@ -5,29 +5,28 @@ from transformers import AutoModelForCausalLM, AutoTokenizer
5
  from peft import PeftModel
6
 
7
  # --- CONFIGURATION ---
8
- # On utilise la version non-quantifiée (ou on la charge sans 4bit)
9
  BASE_MODEL = "unsloth/gemma-2-2b-it"
10
  LORA_ADAPTER = "jojonocode/Strive-Ewe-Expert-Gemma-2b-V6-LoRA"
11
  HF_TOKEN = os.environ.get("HF_TOKEN")
12
 
13
- print("🚀 Chargement de Strive V6 en mode CPU Stable...")
14
 
15
- # 1. Tokenizer
16
  tokenizer = AutoTokenizer.from_pretrained(LORA_ADAPTER, token=HF_TOKEN)
 
17
 
18
- # 2. Chargement du modèle optimisé pour CPU (SANS bitsandbytes)
19
  model = AutoModelForCausalLM.from_pretrained(
20
  BASE_MODEL,
21
- torch_dtype=torch.float32, # CPU standard
22
- device_map="cpu", # On force le CPU pour éviter l'erreur 139
23
  token=HF_TOKEN,
24
- low_cpu_mem_usage=True, # Optimisation cruciale pour la RAM
25
  trust_remote_code=True
26
  )
27
 
28
- # 3. Injection de l'adaptateur V6
29
  model = PeftModel.from_pretrained(model, LORA_ADAPTER, token=HF_TOKEN)
30
- model = model.to("cpu")
31
  model.eval()
32
 
33
  SYSTEM_PROMPT = """Tu es Strive AI, expert de la culture Ewe et du Togo.
@@ -35,37 +34,56 @@ Créateur : Elisée Joel ADZONYA. Équipe : Yavin MITEKOR, Mariette HOUDI, Chris
35
  DIRECTIVES : Réponds exclusivement en langue Ewe (Gbe). Sois direct et concis."""
36
 
37
  def generate_response(message, history):
38
- # Formatage du prompt Gemma-2
39
  full_prompt = f"<start_of_turn>system\n{SYSTEM_PROMPT}<end_of_turn>\n"
40
 
41
- # Historique réduit pour économiser la RAM
42
- if history:
43
- for user_msg, bot_msg in history[-1:]:
44
- full_prompt += f"<start_of_turn>user\n{user_msg}<end_of_turn>\n<start_of_turn>model\n{bot_msg}<end_of_turn>\n"
 
 
 
 
 
 
 
 
45
 
 
46
  full_prompt += f"<start_of_turn>user\n{message}<end_of_turn>\n<start_of_turn>model\n"
47
 
48
- # Tokenisation
49
  inputs = tokenizer(full_prompt, return_tensors="pt").to("cpu")
50
 
51
  with torch.no_grad():
52
  outputs = model.generate(
53
  **inputs,
54
- max_new_tokens=100, # Réduit pour la vitesse CPU
55
- temperature=0.3,
56
- repetition_penalty=1.15,
57
  do_sample=True,
58
- pad_token_id=tokenizer.eos_token_id
 
59
  )
60
 
 
 
 
 
 
61
  response = tokenizer.decode(outputs[0][inputs.input_ids.shape[1]:], skip_special_tokens=True)
 
62
  return response.strip()
63
 
64
  # --- INTERFACE ---
 
65
  demo = gr.ChatInterface(
66
  fn=generate_response,
 
67
  title="💎 Strive AI V6 - Officiel (CPU)",
68
- description="Intelligence experte en Ewe. Note : La génération peut prendre 1 à 2 minutes sur CPU gratuit.",
 
69
  )
70
 
71
  if __name__ == "__main__":
 
5
  from peft import PeftModel
6
 
7
  # --- CONFIGURATION ---
 
8
  BASE_MODEL = "unsloth/gemma-2-2b-it"
9
  LORA_ADAPTER = "jojonocode/Strive-Ewe-Expert-Gemma-2b-V6-LoRA"
10
  HF_TOKEN = os.environ.get("HF_TOKEN")
11
 
12
+ print("🚀 Chargement de Strive V6 (CPU Stable)...")
13
 
14
+ # 1. Tokenizer (Configuré pour Gemma-2)
15
  tokenizer = AutoTokenizer.from_pretrained(LORA_ADAPTER, token=HF_TOKEN)
16
+ tokenizer.padding_side = 'right'
17
 
18
+ # 2. Modèle
19
  model = AutoModelForCausalLM.from_pretrained(
20
  BASE_MODEL,
21
+ torch_dtype=torch.float32,
22
+ device_map="cpu",
23
  token=HF_TOKEN,
24
+ low_cpu_mem_usage=True,
25
  trust_remote_code=True
26
  )
27
 
28
+ # 3. Adaptateur
29
  model = PeftModel.from_pretrained(model, LORA_ADAPTER, token=HF_TOKEN)
 
30
  model.eval()
31
 
32
  SYSTEM_PROMPT = """Tu es Strive AI, expert de la culture Ewe et du Togo.
 
34
  DIRECTIVES : Réponds exclusivement en langue Ewe (Gbe). Sois direct et concis."""
35
 
36
  def generate_response(message, history):
37
+ # Construction propre du prompt Gemma-2
38
  full_prompt = f"<start_of_turn>system\n{SYSTEM_PROMPT}<end_of_turn>\n"
39
 
40
+ # Gestion de l'historique (Prend les 2 derniers échanges)
41
+ for interaction in history[-2:]:
42
+ # Gradio peut envoyer des dicts ou des listes selon la version
43
+ if isinstance(interaction, dict):
44
+ user_text = interaction.get("user", "")
45
+ bot_text = interaction.get("options", {}).get("value", "") # Dépend de la version Gradio
46
+ if not bot_text: bot_text = interaction.get("content", "")
47
+ else:
48
+ user_text, bot_text = interaction
49
+
50
+ full_prompt += f"<start_of_turn>user\n{user_text}<end_of_turn>\n"
51
+ full_prompt += f"<start_of_turn>model\n{bot_text}<end_of_turn>\n"
52
 
53
+ # Message actuel
54
  full_prompt += f"<start_of_turn>user\n{message}<end_of_turn>\n<start_of_turn>model\n"
55
 
56
+ # Inférence
57
  inputs = tokenizer(full_prompt, return_tensors="pt").to("cpu")
58
 
59
  with torch.no_grad():
60
  outputs = model.generate(
61
  **inputs,
62
+ max_new_tokens=200, # Augmenté pour éviter les réponses de 1 mot
63
+ temperature=0.4, # Un peu plus de créativité pour éviter les réponses figées
64
+ repetition_penalty=1.2,
65
  do_sample=True,
66
+ pad_token_id=tokenizer.eos_token_id,
67
+ eos_token_id=tokenizer.eos_token_id
68
  )
69
 
70
+ # Décodage précis (en sautant le prompt)
71
+ raw_output = tokenizer.decode(outputs[0], skip_special_tokens=True)
72
+
73
+ # On nettoie pour ne garder que la réponse après le dernier message utilisateur
74
+ # (Gemma-2 peut parfois répéter le prompt si mal géré)
75
  response = tokenizer.decode(outputs[0][inputs.input_ids.shape[1]:], skip_special_tokens=True)
76
+
77
  return response.strip()
78
 
79
  # --- INTERFACE ---
80
+ # Utilisation de gr.Chatbot avec format 'messages' pour plus de stabilité
81
  demo = gr.ChatInterface(
82
  fn=generate_response,
83
+ type="messages", # Crucial pour les nouvelles versions de Gradio
84
  title="💎 Strive AI V6 - Officiel (CPU)",
85
+ description="Intelligence experte en Ewe. Si la réponse met du temps à venir, c'est normal sur CPU gratuit.",
86
+ examples=["Ame kae nye Elisée ADZONYA?", "Lomé nye afi ka?", "Nàkplɔ miam aleke nàwɔ nàde ŋkɔ le sukuu me."],
87
  )
88
 
89
  if __name__ == "__main__":