File size: 4,555 Bytes
c48a8f5
 
 
 
 
 
 
 
d8be597
 
 
 
 
 
5bc536d
 
 
 
 
c48a8f5
d8be597
5bc536d
d8be597
 
0bbde10
5bc536d
d8be597
5bc536d
d8be597
c48a8f5
 
d8be597
5bc536d
c48a8f5
d8be597
5bc536d
 
 
 
 
 
 
 
c48a8f5
 
5bc536d
d8be597
 
5bc536d
 
d8be597
 
5bc536d
 
 
 
 
 
 
 
 
 
 
 
d8be597
5bc536d
f165c39
5bc536d
 
f165c39
5bc536d
 
 
0bbde10
5bc536d
 
 
 
 
0bbde10
5bc536d
 
0bbde10
5bc536d
0bbde10
d8be597
5bc536d
c48a8f5
 
5bc536d
c48a8f5
5bc536d
 
c48a8f5
5bc536d
c48a8f5
5bc536d
 
 
c48a8f5
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
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)