xde-train / app.py
remox01's picture
Upload app.py with huggingface_hub
5bc536d verified
Raw
History Blame Contribute Delete
4.56 kB
import os
import time
import json
import gradio as gr
def get_token():
return os.environ.get("HF_TOKEN", os.environ.get("HUGGING_FACE_HUB_TOKEN", ""))
def train_model():
HF_TOKEN = get_token()
if not HF_TOKEN:
yield "HATA: HF_TOKEN yok!", "HATA", "", ""
return
logs = []
def log(msg):
t = time.strftime("%H:%M:%S")
logs.append(f"[{t}] {msg}")
return "\n".join(logs[-40:])
try:
yield log("1/5 Dataset yukleniyor..."), "Baslatiliyor...", "", ""
from datasets import load_dataset
ds = load_dataset("remox01/xde", split="train", token=HF_TOKEN)
yield log(f" {len(ds)} cumle"), "Hazir", "", ""
yield log("2/5 Tokenizer..."), "Hazir", "", ""
from transformers import AutoTokenizer, AutoModelForSeq2SeqLM
tokenizer = AutoTokenizer.from_pretrained("Helsinki-NLP/opus-mt-tc-big-tr-en")
tokenizer.pad_token = tokenizer.eos_token
yield log("3/5 Model..."), "Hazir", "", ""
model = AutoModelForSeq2SeqLM.from_pretrained("Helsinki-NLP/opus-mt-tc-big-tr-en")
from peft import LoraConfig, get_peft_model
model = get_peft_model(model, LoraConfig(r=8, lora_alpha=16, target_modules=["q_proj","v_proj"], lora_dropout=0.1, bias="none", task_type="SEQ_2_SEQ_LM"))
yield log("4/5 Veri..."), "Hazir", "", ""
def preprocess(ex):
inp = tokenizer(ex["turkish"], max_length=128, truncation=True, padding="max_length")
lbl = tokenizer(ex["english"], max_length=128, truncation=True, padding="max_length")
lbl["input_ids"] = [[-100 if t==tokenizer.pad_token_id else t for t in l] for l in lbl["input_ids"]]
return {"input_ids": inp["input_ids"], "attention_mask": inp["attention_mask"], "labels": lbl["input_ids"]}
tokenized = ds.map(preprocess, batched=True)
yield log(f"5/5 Egitim basliyor (CPU - yavas olacak)..."), "Egitimde...", "", "CPU'da egitim yavas olacak. T4 GPU secin!"
from transformers import Seq2SeqTrainingArguments, Seq2SeqTrainer, DataCollatorForSeq2Seq
args = Seq2SeqTrainingArguments(output_dir="./r", per_device_train_batch_size=16, num_train_epochs=1,
learning_rate=2e-4, logging_steps=5, save_strategy="no", push_to_hub=False, report_to="none")
all_loss = []
class C:
def on_init_end(self, *a, **k): pass
def on_train_begin(self, *a, **k): pass
def on_train_end(self, *a, **k): pass
def on_epoch_begin(self, *a, **k): pass
def on_epoch_end(self, *a, **k): pass
def on_step_begin(self, *a, **k): pass
def on_step_end(self, *a, **k): pass
def on_save(self, *a, **k): pass
def on_evaluate(self, *a, **k): pass
def on_prediction_step(self, *a, **k): pass
def on_log(self, args, state, control, logs=None, **kw):
if logs and "loss" in logs:
all_loss.append({"step": state.global_step, "loss": round(logs["loss"],4), "epoch": round(logs.get("epoch",0),2)})
trainer = Seq2SeqTrainer(model=model, args=args, train_dataset=tokenized,
data_collator=DataCollatorForSeq2Seq(tokenizer, model=model), callbacks=[C()])
start = time.time()
trainer.train()
elapsed = time.time() - start
losses = [x["loss"] for x in all_loss]
final = losses[-1] if losses else 0
mini = min(losses) if losses else 0
first = losses[0] if losses else 0
pct = ((first-final)/first*100) if first else 0
summary = f"Sure: {elapsed:.0f}s ({elapsed/60:.1f}dk)\nStep: {len(losses)}\nSon: {final}\nMin: {mini}\nAzalim: %{pct:.1f}"
mjson = json.dumps(all_loss, indent=2)
yield log(f" BITTI! {elapsed:.0f}s"), f"BITTI | {elapsed:.0f}s", mjson, summary
except Exception as e:
yield log(f" HATA: {e}"), "HATA", "", str(e)
with gr.Blocks(title="XDE Egitim") as demo:
gr.Markdown("# XDE Egitim (CPU - yavas)\nT4 GPU sec: Settings > Hardware > T4 small")
with gr.Row():
btn = gr.Button("EGITIMI BASLAT", variant="primary")
status = gr.Textbox(label="Durum")
with gr.Row():
log_box = gr.Textbox(label="Log", lines=20)
with gr.Column():
m_box = gr.Textbox(label="Metrikler", lines=10)
s_box = gr.Textbox(label="Ozet", lines=10)
btn.click(train_model, outputs=[log_box, status, m_box, s_box])
demo.launch(server_name="0.0.0.0", server_port=7860)