akra35567 commited on
Commit
38062da
·
1 Parent(s): e4a367c

Update modules/local_llm.py

Browse files
Files changed (1) hide show
  1. modules/local_llm.py +44 -77
modules/local_llm.py CHANGED
@@ -1,84 +1,51 @@
1
- # modules/local_llm.py
 
2
  import os
3
  from loguru import logger
4
- from llama_cpp import Llama
5
- import threading
6
 
7
- MODEL_PATH = "/home/user/models/openhermes-2.5-mistral-7b.Q4_K_M.gguf"
8
  FINETUNED_PATH = "/home/user/data/finetuned_hermes"
9
-
10
- _llm_global = None
11
- _lock = threading.Lock()
12
-
13
- def _get_llm():
14
- global _llm_global
15
- if _llm_global is not None:
16
- return _llm_global
17
-
18
- with _lock:
19
- if _llm_global is not None:
20
- return _llm_global
21
-
22
- logger.info("CARREGANDO OPENHERMES 7B Q4_K_M → 8-12s POR RESPOSTA!")
23
- if not os.path.exists(MODEL_PATH):
24
- logger.error("GGUF NÃO ENCONTRADO! Verifica /home/user/models/")
25
- return None
26
-
27
- try:
28
- llm = Llama(
29
- model_path=MODEL_PATH,
30
- n_ctx=2048,
31
- n_threads=2, # ← SÓ 2 vCPU NO FREE
32
- n_batch=256,
33
- n_gpu_layers=0,
34
  verbose=False,
35
- use_mlock=True,
36
- logits_all=True
 
 
37
  )
38
-
39
- lora_path = f"{FINETUNED_PATH}/adapter_model.bin"
40
  if os.path.exists(lora_path):
41
- logger.info("LORA ANGOLANO DETECTADOCARREGANDO SOTAQUE DE LUANDA!")
42
- llm.load_lora(lora_path)
43
-
44
- _llm_global = llm
45
- logger.info("OPENHERMES 7B + LORA → ONLINE EM 4.8GB! PRONTO PRA KANDANDAR!")
46
- return llm
47
-
48
- except Exception as e:
49
- logger.error(f"ERRO: {e}")
50
- return None
51
-
52
- class LocalLLM:
53
- def __init__(self):
54
- self.llm = _get_llm()
55
-
56
- def is_available(self) -> bool:
57
- return self.llm is not None
58
-
59
- def generate(self, prompt: str, max_tokens: int = 60) -> str:
60
- if not self.is_available():
61
- return "Akira off, kota."
62
-
63
- try:
64
- full_prompt = f"<|im_start|>system\nTu és Akira, kota fixe de Luanda. Fala bué descontraído com gírias angolanas.<|im_end|>\n<|im_start|>user\n{prompt}<|im_end|>\n<|im_start|>assistant\n"
65
-
66
- output = self.llm(
67
- full_prompt,
68
- max_tokens=max_tokens,
69
- temperature=0.9,
70
- top_p=0.95,
71
- repeat_penalty=1.12,
72
- stop=["<|im_end|>", "</s>"],
73
- echo=False
74
- )
75
-
76
- text = output["choices"][0]["text"].strip()
77
- logger.info(f"[OPENHERMES 8s] {text[:100]}...")
78
- return text
79
-
80
- except Exception as e:
81
- logger.error(f"ERRO: {e}")
82
- return "Buguei, kota! Tenta de novo."
83
-
84
- HermesLLM = LocalLLM()
 
1
+ # modules/local_llm.py — VERSÃO FINAL: RAM ATÉ O PESCOÇO, CPU EM PAZ!
2
+ from llama_cpp import Llama
3
  import os
4
  from loguru import logger
 
 
5
 
 
6
  FINETUNED_PATH = "/home/user/data/finetuned_hermes"
7
+ GGUF_PATH = "/home/user/data/OpenHermes-2.5-Mistral-7B-Q4_K_M.gguf" # mantido só pro fallback
8
+
9
+ class HermesLLM:
10
+ _llm = None
11
+
12
+ @classmethod
13
+ def is_available(cls):
14
+ return os.path.exists(GGUF_PATH)
15
+
16
+ @classmethod
17
+ def _get_llm(cls):
18
+ if cls._llm is None:
19
+ logger.info("CARREGANDO OPENHERMES 7B EM 8BIT → RAM MÁXIMA, CPU MÍNIMA!")
20
+ cls._llm = Llama(
21
+ model_path=GGUF_PATH,
22
+ n_ctx=4096, # contexto gigante (usa mais RAM)
23
+ n_batch=512, # batch grande = mais RAM, menos CPU
24
+ n_threads=2, # só 2 threads CPU!
25
+ n_gpu_layers=0, # tudo na RAM
26
+ use_mlock=True, # trava na RAM física (nunca swap!)
 
 
 
 
 
27
  verbose=False,
28
+ # FORÇA USAR TODA RAM POSSÍVEL:
29
+ n_parts=1, # 1 parte = carrega tudo de uma vez
30
+ seed=-1,
31
+ logits_all=True,
32
  )
33
+ # CARREGA LORA DIRETO (se existir)
34
+ lora_path = f"{FINETUNED_PATH}/lora_leve"
35
  if os.path.exists(lora_path):
36
+ logger.info("LORA ANGOLANO CARREGADO NA RAM → SOTAQUE DE LUANDA TURBINADO!")
37
+ cls._llm.load_lora(lora_path)
38
+ return cls._llm
39
+
40
+ @classmethod
41
+ def generate(cls, prompt: str, max_tokens: int = 60):
42
+ llm = cls._get_llm()
43
+ output = llm(
44
+ prompt,
45
+ max_tokens=max_tokens,
46
+ temperature=0.7,
47
+ top_p=0.9,
48
+ stop=["<|im_end|>", "\n\n"],
49
+ echo=False
50
+ )
51
+ return output["choices"][0]["text"]