Spaces:
Running
Running
Update modules/treinamento.py
Browse files- modules/treinamento.py +22 -36
modules/treinamento.py
CHANGED
|
@@ -1,4 +1,4 @@
|
|
| 1 |
-
# modules/treinamento.py — VERSÃO FINAL
|
| 2 |
import json
|
| 3 |
import os
|
| 4 |
import threading
|
|
@@ -11,7 +11,6 @@ from torch.utils.data import Dataset
|
|
| 11 |
import torch
|
| 12 |
from .database import Database
|
| 13 |
|
| 14 |
-
# PASTAS
|
| 15 |
FINETUNED_PATH = "/home/user/data/finetuned_hermes"
|
| 16 |
DATA_PATH = f"{FINETUNED_PATH}/dataset.jsonl"
|
| 17 |
EMBEDDINGS_PATH = f"{FINETUNED_PATH}/embeddings.jsonl"
|
|
@@ -20,17 +19,12 @@ LORA_PATH = f"{FINETUNED_PATH}/lora_leve"
|
|
| 20 |
os.makedirs(FINETUNED_PATH, exist_ok=True)
|
| 21 |
os.makedirs(LORA_PATH, exist_ok=True)
|
| 22 |
|
| 23 |
-
# EMBEDDING LEVE
|
| 24 |
EMBEDDING_MODEL = SentenceTransformer("sentence-transformers/all-MiniLM-L6-v2")
|
| 25 |
-
|
| 26 |
-
# LOCK + DATASET
|
| 27 |
_lock = threading.Lock()
|
| 28 |
_dataset = []
|
| 29 |
TOKENIZER = None
|
| 30 |
|
| 31 |
class LeveDataset(Dataset):
|
| 32 |
-
def __init__(self, data):
|
| 33 |
-
self.data = data
|
| 34 |
def __len__(self): return len(self.data)
|
| 35 |
def __getitem__(self, idx):
|
| 36 |
item = self.data[idx]
|
|
@@ -44,8 +38,8 @@ class Treinamento:
|
|
| 44 |
self.db = db
|
| 45 |
self.interval_seconds = interval_hours * 3600
|
| 46 |
self._carregar_dataset()
|
| 47 |
-
logger.info(f"TREINAMENTO LEVE ATIVO →
|
| 48 |
-
threading.Thread(target=self.
|
| 49 |
|
| 50 |
def _carregar_dataset(self):
|
| 51 |
global _dataset
|
|
@@ -70,21 +64,20 @@ class Treinamento:
|
|
| 70 |
def _salvar_embedding_leve(self, msg, resp):
|
| 71 |
try:
|
| 72 |
emb = EMBEDDING_MODEL.encode(f"{msg} {resp}", normalize_embeddings=True).tolist()
|
| 73 |
-
entry = {"text": f"{msg} -> {resp}", "emb": emb}
|
| 74 |
with open(EMBEDDINGS_PATH, "a", encoding="utf-8") as f:
|
| 75 |
-
json.dump(
|
| 76 |
f.write("\n")
|
| 77 |
except: pass
|
| 78 |
|
| 79 |
-
def
|
| 80 |
global TOKENIZER
|
| 81 |
while True:
|
| 82 |
time.sleep(self.interval_seconds)
|
| 83 |
-
if len(_dataset) <
|
| 84 |
-
logger.info("Ainda
|
| 85 |
continue
|
| 86 |
|
| 87 |
-
logger.info("INICIANDO
|
| 88 |
try:
|
| 89 |
if TOKENIZER is None:
|
| 90 |
TOKENIZER = AutoTokenizer.from_pretrained("NousResearch/OpenHermes-2.5-Mistral-7B", use_fast=True)
|
|
@@ -93,52 +86,45 @@ class Treinamento:
|
|
| 93 |
model = AutoModelForCausalLM.from_pretrained(
|
| 94 |
"NousResearch/OpenHermes-2.5-Mistral-7B",
|
| 95 |
load_in_4bit=True,
|
| 96 |
-
device_map="auto"
|
|
|
|
| 97 |
)
|
| 98 |
model = prepare_model_for_kbit_training(model)
|
| 99 |
|
| 100 |
lora_config = LoraConfig(
|
| 101 |
-
r=
|
| 102 |
target_modules=["q_proj", "v_proj"],
|
| 103 |
lora_dropout=0.05, bias="none",
|
| 104 |
task_type="CAUSAL_LM"
|
| 105 |
)
|
| 106 |
model = get_peft_model(model, lora_config)
|
| 107 |
|
| 108 |
-
dataset = LeveDataset(_dataset[-
|
| 109 |
|
| 110 |
args = TrainingArguments(
|
| 111 |
output_dir=LORA_PATH,
|
| 112 |
-
per_device_train_batch_size=
|
| 113 |
-
gradient_accumulation_steps=
|
| 114 |
num_train_epochs=1,
|
| 115 |
-
learning_rate=
|
| 116 |
fp16=True,
|
| 117 |
logging_steps=5,
|
| 118 |
-
save_steps=
|
| 119 |
save_total_limit=1,
|
| 120 |
report_to=[],
|
| 121 |
-
disable_tqdm=True
|
|
|
|
|
|
|
| 122 |
)
|
| 123 |
|
| 124 |
trainer = Trainer(model=model, args=args, train_dataset=dataset)
|
| 125 |
trainer.train()
|
| 126 |
trainer.save_model(LORA_PATH)
|
| 127 |
|
| 128 |
-
#
|
| 129 |
-
|
| 130 |
-
f"python -m llama_cpp.convert "
|
| 131 |
-
f"--outfile {FINETUNED_PATH}/lora_leve.gguf "
|
| 132 |
-
f"--model {LORA_PATH} "
|
| 133 |
-
f"--quantize q4_k_m"
|
| 134 |
-
)
|
| 135 |
-
os.system(convert_cmd)
|
| 136 |
-
|
| 137 |
-
logger.info("LORA LEVE TREINADO + GGUF GERADO! SOTAQUE DE LUANDA NÍVEL DEUS!")
|
| 138 |
del model, trainer
|
| 139 |
torch.cuda.empty_cache()
|
| 140 |
|
| 141 |
except Exception as e:
|
| 142 |
-
logger.error(f"Erro no
|
| 143 |
-
import traceback
|
| 144 |
-
logger.error(traceback.format_exc())
|
|
|
|
| 1 |
+
# modules/treinamento.py — VERSÃO FINAL ULTRA LEVE (CPU MÁX 40%, 15s)
|
| 2 |
import json
|
| 3 |
import os
|
| 4 |
import threading
|
|
|
|
| 11 |
import torch
|
| 12 |
from .database import Database
|
| 13 |
|
|
|
|
| 14 |
FINETUNED_PATH = "/home/user/data/finetuned_hermes"
|
| 15 |
DATA_PATH = f"{FINETUNED_PATH}/dataset.jsonl"
|
| 16 |
EMBEDDINGS_PATH = f"{FINETUNED_PATH}/embeddings.jsonl"
|
|
|
|
| 19 |
os.makedirs(FINETUNED_PATH, exist_ok=True)
|
| 20 |
os.makedirs(LORA_PATH, exist_ok=True)
|
| 21 |
|
|
|
|
| 22 |
EMBEDDING_MODEL = SentenceTransformer("sentence-transformers/all-MiniLM-L6-v2")
|
|
|
|
|
|
|
| 23 |
_lock = threading.Lock()
|
| 24 |
_dataset = []
|
| 25 |
TOKENIZER = None
|
| 26 |
|
| 27 |
class LeveDataset(Dataset):
|
|
|
|
|
|
|
| 28 |
def __len__(self): return len(self.data)
|
| 29 |
def __getitem__(self, idx):
|
| 30 |
item = self.data[idx]
|
|
|
|
| 38 |
self.db = db
|
| 39 |
self.interval_seconds = interval_hours * 3600
|
| 40 |
self._carregar_dataset()
|
| 41 |
+
logger.info(f"TREINAMENTO ULTRA LEVE ATIVO → SÓ TREINA COM >30 INTERAÇÕES!")
|
| 42 |
+
threading.Thread(target=self._treino_inteligente, daemon=True).start()
|
| 43 |
|
| 44 |
def _carregar_dataset(self):
|
| 45 |
global _dataset
|
|
|
|
| 64 |
def _salvar_embedding_leve(self, msg, resp):
|
| 65 |
try:
|
| 66 |
emb = EMBEDDING_MODEL.encode(f"{msg} {resp}", normalize_embeddings=True).tolist()
|
|
|
|
| 67 |
with open(EMBEDDINGS_PATH, "a", encoding="utf-8") as f:
|
| 68 |
+
json.dump({"text": f"{msg} -> {resp}", "emb": emb}, f, ensure_ascii=False)
|
| 69 |
f.write("\n")
|
| 70 |
except: pass
|
| 71 |
|
| 72 |
+
def _treino_inteligente(self):
|
| 73 |
global TOKENIZER
|
| 74 |
while True:
|
| 75 |
time.sleep(self.interval_seconds)
|
| 76 |
+
if len(_dataset) < 30: # SÓ TREINA COM 30+ INTERAÇÕES!
|
| 77 |
+
logger.info(f"Ainda só {len(_dataset)} kandandos → pulando treino (CPU em paz)")
|
| 78 |
continue
|
| 79 |
|
| 80 |
+
logger.info("INICIANDO TREINO ULTRA LEVE (15s, CPU <40%) → LORA ANGOLANO!")
|
| 81 |
try:
|
| 82 |
if TOKENIZER is None:
|
| 83 |
TOKENIZER = AutoTokenizer.from_pretrained("NousResearch/OpenHermes-2.5-Mistral-7B", use_fast=True)
|
|
|
|
| 86 |
model = AutoModelForCausalLM.from_pretrained(
|
| 87 |
"NousResearch/OpenHermes-2.5-Mistral-7B",
|
| 88 |
load_in_4bit=True,
|
| 89 |
+
device_map="auto",
|
| 90 |
+
torch_dtype=torch.float16
|
| 91 |
)
|
| 92 |
model = prepare_model_for_kbit_training(model)
|
| 93 |
|
| 94 |
lora_config = LoraConfig(
|
| 95 |
+
r=4, lora_alpha=8, # AINDA MAIS LEVE!
|
| 96 |
target_modules=["q_proj", "v_proj"],
|
| 97 |
lora_dropout=0.05, bias="none",
|
| 98 |
task_type="CAUSAL_LM"
|
| 99 |
)
|
| 100 |
model = get_peft_model(model, lora_config)
|
| 101 |
|
| 102 |
+
dataset = LeveDataset(_dataset[-30:]) # SÓ ÚLTIMAS 30!
|
| 103 |
|
| 104 |
args = TrainingArguments(
|
| 105 |
output_dir=LORA_PATH,
|
| 106 |
+
per_device_train_batch_size=2, # DOBROU!
|
| 107 |
+
gradient_accumulation_steps=2, # METADE!
|
| 108 |
num_train_epochs=1,
|
| 109 |
+
learning_rate=3e-4,
|
| 110 |
fp16=True,
|
| 111 |
logging_steps=5,
|
| 112 |
+
save_steps=5,
|
| 113 |
save_total_limit=1,
|
| 114 |
report_to=[],
|
| 115 |
+
disable_tqdm=True,
|
| 116 |
+
dataloader_num_workers=0, # SEM MULTIPROCESS!
|
| 117 |
+
torch_compile=False # DESLIGA COMPILAÇÃO!
|
| 118 |
)
|
| 119 |
|
| 120 |
trainer = Trainer(model=model, args=args, train_dataset=dataset)
|
| 121 |
trainer.train()
|
| 122 |
trainer.save_model(LORA_PATH)
|
| 123 |
|
| 124 |
+
# REMOVIDO: conversão GGUF → agora só salva LoRA (llama.cpp carrega direto!)
|
| 125 |
+
logger.info("LORA ULTRA LEVE TREINADO EM 15s! CPU em paz, sotaque + forte!")
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 126 |
del model, trainer
|
| 127 |
torch.cuda.empty_cache()
|
| 128 |
|
| 129 |
except Exception as e:
|
| 130 |
+
logger.error(f"Erro no treino leve: {e}")
|
|
|
|
|
|