# Instruction fine-tuning slovenského Mistral 7B modelu ## Použitý model Ako základný model bol použitý: - `slovak-nlp/mistral-sk-7b` Výsledný adaptér z prvého experimentu je dostupný na Hugging Face: - `Jakub1320/mistral-sk-7b-slovak-alpaca-qlora` --- ## Hardvér Experimenty boli realizované na dvoch serveroch. ### Titan - 2× NVIDIA TITAN RTX - 24 GB VRAM na GPU - výpočty v `fp16` ### Hruška - 2× NVIDIA RTX A4500 - približne 20 GB VRAM na GPU - výpočty v `bf16` --- # Prvý experiment – Slovak Alpaca ## Použitý dataset Na supervised fine-tuning bol v prvom experimente použitý slovenský inštrukčný dataset: - `saillab/alpaca-slovak-cleaned` Dataset obsahuje polia: - `instruction` - `input` - `output` Dáta boli formátované v Alpaca štýle: ```text ### Inštrukcia: ... ### Vstup: ... ### Odpoveď: ... ``` ## Metóda dotrénovania Model bol dotrénovaný pomocou supervised fine-tuningu cez: - Unsloth - TRL `SFTTrainer` - PEFT LoRA - QLoRA štýl trénovania Výsledkom tréningu je PEFT LoRA adaptér, ktorý sa pripája k základnému modelu `slovak-nlp/mistral-sk-7b`. ## Hlavné hyperparametre prvého experimentu | Parameter | Hodnota | |---|---:| | Epochs | 1 | | Max sequence length | 1024 | | Batch size | 1 | | Gradient accumulation | 8 | | Effective batch size | 8 | | Learning rate | 2e-4 | | Optimizer | AdamW 8-bit | | Scheduler | cosine | | Warmup steps | 150 | | LoRA rank | 16 | | LoRA alpha | 32 | | LoRA dropout | 0.05 | | Quantization | 4-bit | | Compute type | fp16 | Použité LoRA cieľové moduly: ```text q_proj, k_proj, v_proj, o_proj, gate_proj, up_proj, down_proj ``` ## Vyhodnotenie pomocou vlastného evaluačného skriptu Model bol vyhodnotený na testovacích príkladoch z datasetu `saillab/alpaca-slovak-cleaned` pomocou metrík ROUGE, BLEU, eval loss a perplexity. | Metrika | Výsledok | |---|---:| | ROUGE-1 | 0.3710 | | ROUGE-2 | 0.1702 | | ROUGE-L | 0.2732 | | BLEU | 6.2850 | | Eval loss | 0.8081 | | Perplexity | 2.2435 | ## Vyhodnotenie pomocou lm-evaluation-harness Hodnotený bol PEFT LoRA adaptér pripojený k základnému modelu: ```text slovak-nlp/mistral-sk-7b + Jakub1320/mistral-sk-7b-slovak-alpaca-qlora ``` ### Použité benchmarky | Benchmark | Popis | |---|---| | `arc_sk` | slovenské vedecké/školské otázky s výberom odpovede | | `hellaswag_sk` | commonsense reasoning a výber najpravdepodobnejšieho pokračovania | | `m_mmlu_sk` | slovenský všeobecný vedomostný benchmark | | `truthfulqa_sk_mc1` | hodnotenie pravdivosti odpovedí, multiple choice MC1 | | `truthfulqa_sk_mc2` | hodnotenie pravdivosti odpovedí, multiple choice MC2 | | `sklegal` | slovenské právne otázky s výberom odpovede | | `skquad` | slovenský question-answering benchmark | Úlohy `sklegal` a `skquad` boli doplnené ako custom tasky. ## Výsledky lm-evaluation-harness Poznámka: výsledky `arc_sk`, `hellaswag_sk`, `m_mmlu_sk` a TruthfulQA pochádzajú z prvého behu. `sklegal` a `skquad` boli následne dopočítané v druhom samostatnom behu nad tým istým Alpaca QLoRA adaptérom, pretože v pôvodnom behu tieto dve custom úlohy nefungovali. | Task | Počet vzoriek | Metrika | Výsledok | |---|---:|---|---:| | `arc_sk` | 1169 | acc | 0.3259 | | `arc_sk` | 1169 | acc_norm | 0.3473 | | `hellaswag_sk` | 9485 | acc | 0.4134 | | `hellaswag_sk` | 9485 | acc_norm | 0.5106 | | `m_mmlu_sk` | 13062 | acc | 0.2928 | | `truthfulqa_sk_mc1` | 778 | acc | 0.2391 | | `truthfulqa_sk_mc2` | 778 | acc | 0.3942 | | `sklegal` | 1334 | acc | 0.2841 | | `sklegal` | 1334 | acc_norm | 0.4693 | | `skquad` | 9583 | exact | 1.9722 | | `skquad` | 9583 | f1 | 27.7994 | | `skquad` | 9583 | HasAns_exact | 2.4106 | | `skquad` | 9583 | HasAns_f1 | 34.1456 | | `skquad` | 9583 | NoAns_exact | 0.0561 | | `skquad` | 9583 | NoAns_f1 | 0.0561 | | `skquad` | 9583 | best_exact | 18.6163 | | `skquad` | 9583 | best_f1 | 28.3012 | --- # Experiment so strojovým prekladom datasetu Cieľom experimentu bolo vyskúšať postup, pri ktorom sa anglické polia datasetu: - `instruction` - `input` - `output` automaticky preložia do slovenčiny a uložia do novej dátovej množiny so zachovaním pôvodnej štruktúry. Výstupný formát obsahoval pôvodné anglické texty aj slovenské preklady: ```json { "instruction_en": "...", "input_en": "...", "output_en": "...", "instruction_sk": "...", "input_sk": "...", "output_sk": "..." } ``` Vznikla preložená vzorka datasetu s 1000 príkladmi. Umiestnenie: ```text strojovy_preklad/translated_datasets/alpaca_translated_en_sk_1000.jsonl ``` --- # Experiment s datasetom Aya Collection Pre ďalšie experimenty bol použitý dataset: - `CohereLabs/aya_collection_language_split` - subset: `slovak` Používané polia boli mapované nasledovne: | Pôvodné pole | Použitie pri tréningu | |---|---| | `inputs` | prompt / inštrukcia | | `targets` | odpoveď | --- # Prvý dlhý Aya tréning na serveri Titan – manuálne ukončený pokus Pred úspešným 225 000-krokovým tréningom bol na serveri Titan spustený prvý dlhý tréning nad slovenskou časťou datasetu Aya Collection. Tento experiment bežal na jednej NVIDIA TITAN RTX a používal streaming datasetu. Konfiguráčny súbor je ```text train_mistral_sk_aya_slovak_full_lora.yaml ``` ## Konfigurácia prvého dlhého tréningu | Parameter | Hodnota | |---|---:| | Base model | `slovak-nlp/mistral-sk-7b` | | Dataset | `aya_slovak_full` | | Template | `alpaca` | | Fine-tuning | LoRA | | GPU | 1× NVIDIA TITAN RTX | | Max sequence length | 1024 | | Streaming | áno | | Streaming buffer | 16 384 | | Batch size per device | 1 | | Gradient accumulation | 4 | | Effective batch size | 4 | | Max steps | 1 037 000 | | Learning rate | 2e-4 | | Scheduler | cosine | | Warmup steps | 500 | | Max grad norm | 1.0 | | Optimizer | AdamW 8-bit | | LoRA rank | 16 | | LoRA alpha | 32 | | LoRA dropout | 0.05 | | Compute type | fp16 | | Unsloth | áno | | Unsloth gradient checkpointing | áno | | Validation size | 1000 | | Eval interval | každých 50 000 krokov | | Save interval | každých 10 000 krokov | | Save total limit | 2 | Použité LoRA cieľové moduly: ```text q_proj, k_proj, v_proj, o_proj, gate_proj, up_proj, down_proj ``` Konfigurácia počítala približne s jedným prechodom cez celý slovenský Aya subset: ```text 4 148 187 príkladov / effective batch 4 ≈ 1 037 000 krokov ``` ## Dôvod manuálneho ukončenia Tréning technicky nespadol. Po približne 94 000 krokoch sa však začala výrazne zhoršovať stabilita optimalizácie. V logu sa objavili extrémne hodnoty `grad_norm`, napríklad: ```text grad_norm = 125.6 grad_norm = 105.9 grad_norm = 24000 grad_norm = 772.1 grad_norm = 11410 grad_norm = 2714 grad_norm = nan ``` Súčasne začal výrazne kolísať aj training loss, napríklad: ```text loss = 3.232 loss = 7.081 loss = 5.206 loss = 14.82 ``` Neskôr sa v logu objavila aj kombinácia: ```text loss = 0.0 grad_norm = nan ``` Keďže tréning vykazoval známky numerickej nestability, bol manuálne ukončený približne pri kroku `104 238` z plánovaných `1 037 000`, teda približne po 10 % tréningu. V čase ukončenia bol runtime približne: ```text 44 hodín 48 minút ``` Tento experiment ukázal, že pôvodné nastavenie nebolo vhodné na pokračovanie v takto dlhom tréningu bez ďalších úprav. --- # Dlhý Aya tréning na serveri Titan Na serveri Titan bol spustený dlhý LoRA fine-tuning nad slovenskou časťou Aya Collection. Na rozdiel od prvého QLoRA experimentu nebola použitá 4-bit kvantizácia. ## Hlavná konfigurácia | Parameter | Hodnota | |---|---:| | Base model | `slovak-nlp/mistral-sk-7b` | | Dataset | Aya Collection – Slovak | | Fine-tuning | LoRA | | Unsloth | áno | | GPU | 2× NVIDIA TITAN RTX | | Batch size per device | 1 | | Gradient accumulation | 8 | | Effective batch size | 16 | | Max sequence length | 1024 | | Max steps | 225 000 | | Learning rate | 5e-5 | | Scheduler | cosine | | Warmup steps | 10 000 | | LoRA rank | 16 | | LoRA alpha | 16 | | LoRA dropout | 0.0 | | Compute type | fp16 | | Streaming | áno | Použité LoRA cieľové moduly: ```text q_proj, k_proj, v_proj, o_proj, gate_proj, up_proj, down_proj ``` Tréning úspešne dobehol do kroku `225000`. Pri effective batch size 16 bolo do tohto bodu spracovaných približne: ```text 225 000 × 16 = 3 600 000 príkladov ``` To predstavuje približne 86,8 % slovenského Aya datasetu s približne 4,148 milióna príkladmi. Nešlo teda o úplný jeden epoch. ## Eval loss počas Titan tréningu | Krok | Eval loss | |---:|---:| | 25 000 | 1.0599 | | 50 000 | 1.174 | | 75 000 | 1.284 | | 100 000 | 1.429 | | 125 000 | 1.342 | | 150 000 | 1.323 | | 175 000 | 1.321 | | 200 000 | 1.213 | | 225 000 | 1.221 | Najnižší validačný loss bol zaznamenaný pri kroku `25000`. Tento checkpoint bol samostatne zachovaný pre ďalšie benchmarkové porovnanie s finálnym modelom. --- # Hruška – 10 porovnávacích experimentov Na serveri Hruška bola vytvorená séria menších experimentov s cieľom porovnať vplyv vybraných hyperparametrov LoRA fine-tuningu. Cieľom bolo porovnať vplyv: - learning rate, - LoRA rank, - LoRA alpha, - optimalizátora, - LoRA target modulov, - batch size a gradient accumulation. ## Fixný dataset Pre férové porovnanie všetkých experimentov bol vytvorený fixný dataset: ```text aya_slovak_100k_fixed.jsonl ``` Dataset obsahuje presne `100 000` slovenských príkladov z Aya Collection. Pri jeho vytvorení bol použitý fixný seed. Samotné experimenty už nepoužívali streaming, takže všetky konfigurácie pracovali s rovnakým poolom dát. Dáta boli uložené vo formáte: ```json { "instruction": "...", "input": "", "output": "..." } ``` Pri tréningu bolo `1000` príkladov použitých na validáciu. ## Spoločné nastavenia experimentov | Parameter | Hodnota | |---|---:| | Base model | `slovak-nlp/mistral-sk-7b` | | Dataset | `aya_slovak_100k_fixed` | | GPU | 2× NVIDIA RTX A4500 | | Fine-tuning | LoRA | | Unsloth | áno | | Streaming | nie | | Max sequence length | 1024 | | Max steps | 6250 | | Effective batch size | 16 | | Scheduler | cosine | | Warmup steps | 500 | | Max grad norm | 0.5 | | LoRA dropout | 0.0 | | Compute type | bf16 | | Eval interval | každých 1250 krokov | | Validation size | 1000 | | Seed | 42 | Štandardné LoRA cieľové moduly: ```text q_proj, k_proj, v_proj, o_proj, gate_proj, up_proj, down_proj ``` Výnimkou je experiment 08, ktorý používa iba: ```text q_proj, k_proj, v_proj, o_proj ``` ## Porovnávané konfigurácie | Experiment | Hlavná zmena | |---|---| | `01_baseline_r16_a16_lr5e5_adamw` | baseline: rank 16, alpha 16, LR 5e-5, AdamW | | `02_optimizer_adamw8bit_r16_a16_lr5e5` | AdamW 8-bit | | `03_rank8_a16_lr5e5` | LoRA rank 8 | | `04_rank32_a32_lr5e5` | LoRA rank 32, alpha 32 | | `05_r16_alpha32_lr5e5` | alpha 32 pri rank 16 | | `06_lr1e4_r16_a16` | learning rate 1e-4 | | `07_lr2e5_r16_a16` | learning rate 2e-5 | | `08_attention_only_r16_a16_lr5e5` | LoRA iba na attention projekciách | | `09_batch2_accum4_r16_a16_lr5e5` | batch size 2, gradient accumulation 4 | | `10_r16_a32_lr1e4` | kombinácia alpha 32 + learning rate 1e-4 | ## Výsledky Hruška experimentov | Experiment | Train loss | Eval loss | Runtime | |---|---:|---:|---:| | `01_baseline_r16_a16_lr5e5_adamw` | 0.9290 | 0.7567 | 7:18:05 | | `02_optimizer_adamw8bit_r16_a16_lr5e5` | 0.9248 | 0.7521 | 7:20:23 | | `03_rank8_a16_lr5e5` | 0.9308 | 0.7586 | 7:16:23 | | `04_rank32_a32_lr5e5` | 0.9003 | 0.7292 | 7:22:33 | | `05_r16_alpha32_lr5e5` | 0.9026 | 0.7323 | 7:17:44 | | `06_lr1e4_r16_a16` | 0.8890 | 0.7184 | 7:17:30 | | `07_lr2e5_r16_a16` | 0.9674 | 0.7912 | 7:18:25 | | `08_attention_only_r16_a16_lr5e5` | 0.9808 | 0.8094 | 6:51:25 | | `09_batch2_accum4_r16_a16_lr5e5` | 0.9290 | 0.7563 | 8:24:57 | | `10_r16_a32_lr1e4` | 0.8612 | 0.6918 | približne 7:15 h | Najnižší finálny `eval_loss` dosiahol experiment: ```text 10_r16_a32_lr1e4 ``` s hodnotou: ```text eval_loss = 0.6918 ``` V tomto experimente bola použitá kombinácia: ```text LoRA rank = 16 LoRA alpha = 32 learning rate = 1e-4 optimizer = AdamW effective batch size = 16 ``` ## Pozorované rozdiely Z doterajších výsledkov: - zvýšenie learning rate z `5e-5` na `1e-4` znížilo eval loss z `0.7567` na `0.7184`, - zvýšenie LoRA alpha z `16` na `32` pri rank 16 znížilo eval loss na `0.7323`, - kombinácia `alpha=32` a `learning_rate=1e-4` dosiahla najnižší eval loss `0.6918`, - rank 32 priniesol eval loss `0.7292`, - rank 8 dosiahol výsledok veľmi blízky baseline, - attention-only LoRA bola rýchlejšia, ale mala vyšší eval loss, - zmena z batch size 1 / accumulation 8 na batch size 2 / accumulation 4 nepriniesla zlepšenie validačného lossu ani runtime. --- # Súbory Hruška experimentov Výsledky experimentov sú uložené v priečinku: ```text hruska_10_experiments_results/ ``` Súčasťou sú: ```text hruska_10_experiments_results/ ├── aya_slovak_100k_fixed/ ├── hruska_10_experiments_results/ │ ├── 01_baseline_r16_a16_lr5e5_adamw/ │ ├── 02_optimizer_adamw8bit_r16_a16_lr5e5/ │ ├── 03_rank8_a16_lr5e5/ │ ├── 04_rank32_a32_lr5e5/ │ ├── 05_r16_alpha32_lr5e5/ │ ├── 06_lr1e4_r16_a16/ │ ├── 07_lr2e5_r16_a16/ │ ├── 08_attention_only_r16_a16_lr5e5/ │ ├── 09_batch2_accum4_r16_a16_lr5e5/ │ └── 10_r16_a32_lr1e4/ ├── hruska_experiment_eval_loss_ranking.png ├── hruska_experiment_train_loss_ranking.png └── hruska_experiment_summary.csv ``` Každý experiment obsahuje: ```text .yaml training.log training_loss.png training_eval_loss.png ``` --- ## Reprodukcia tréningových experimentov Jednotlivé experimenty je možné zreplikovať pomocou uložených YAML konfiguračných súborov. Pred spustením tréningu je potrebné aktivovať prostredie s LLaMA-Factory a prejsť do jeho adresára: ```bash conda activate llama_factory_unsloth cd /home/schwarc/LLaMA-Factory ``` Pre 2-GPU experimenty bol tréning spúšťaný pomocou: ```bash CUDA_VISIBLE_DEVICES=0,1 FORCE_TORCHRUN=1 \ llamafactory-cli train /cesta/ku/configu.yaml ``` Napríklad pre experiment: ```text 10_r16_a32_lr1e4 ``` možno použiť: ```bash CUDA_VISIBLE_DEVICES=0,1 FORCE_TORCHRUN=1 \ llamafactory-cli train \ /home/schwarc/diplomovka/configs/hruska_compare9_100k_fixed/10_r16_a32_lr1e4.yaml ``` Ak má byť terminálový výstup zároveň uložený do logu: ```bash CUDA_VISIBLE_DEVICES=0,1 FORCE_TORCHRUN=1 \ llamafactory-cli train \ /home/schwarc/diplomovka/configs/hruska_compare9_100k_fixed/10_r16_a32_lr1e4.yaml \ 2>&1 | tee /home/schwarc/diplomovka/logs/10_r16_a32_lr1e4.log ``` # Výsledky benchmarkovania pomocou lm-evaluation-harness Po dokončení tréningov boli vyhodnotené: - všetkých 10 Hruška experimentov, - Titan checkpoint po 25 000 krokoch, - finálny Titan model po 225 000 krokoch, - starší QLoRA model trénovaný na `saillab/alpaca-slovak-cleaned`. - Kompletné výsledky a výstupné súbory z evaluácie pomocou lm-evaluation-harness sú dostupné v priečinku `lmeval/` Použité benchmarky: ```text arc_sk hellaswag_sk m_mmlu_sk truthfulqa_sk_mc1 truthfulqa_sk_mc2 sklegal skquad ``` Počet hodnotených vzoriek bol: | Benchmark | Počet vzoriek | |---|---:| | `arc_sk` | 1169 | | `hellaswag_sk` | 9485 | | `m_mmlu_sk` | 13062 | | `truthfulqa_sk_mc1` | 778 | | `truthfulqa_sk_mc2` | 778 | | `sklegal` | 1334 | | `skquad` | 9583 | Pri úlohách, kde `lm-evaluation-harness` poskytuje `acc` aj `acc_norm`, je v súhrnných tabuľkách použitá najmä hodnota `acc_norm`. Pri `skquad` je ako hlavná súhrnná metrika použitá hodnota `F1`. Hruška benchmarky boli počítané v `bfloat16`, Titan a starší Alpaca model v `float16`. Batch size pri evaluácii bol 1. ## Poznámka k staršiemu Alpaca benchmarku Starší model `Jakub1320/mistral-sk-7b-slovak-alpaca-qlora` bol vyhodnotený v dvoch behoch. V prvom boli vyhodnotené: ```text arc_sk hellaswag_sk m_mmlu_sk truthfulqa_sk_mc1 truthfulqa_sk_mc2 ``` Úlohy `sklegal` a `skquad` vtedy nefungovali, preto boli neskôr spustené samostatne. Výsledky uvedené v README sú zlúčením týchto dvoch behov nad tým istým adaptérom. Pri porovnávaní starého Alpaca modelu s novšími behmi treba brať do úvahy, že bol použitý iný softvérový stav. Najdôležitejšie je, že starý výsledok `truthfulqa_sk_mc2` má v uloženom výsledku verziu úlohy 2.0, zatiaľ čo novšie Hruška a Titan behy používajú verziu 1.0. Preto výsledok MC2 starého Alpaca modelu nie je vhodné považovať za úplne priamo porovnateľný s novými behmi. Ostatné hlavné verzie benchmarkov sa zhodujú. --- ## Výsledky 10 Hruška experimentov | Experiment | Eval loss | ARC acc_norm | HellaSwag acc_norm | M-MMLU acc | TQA MC1 | TQA MC2 | SKLegal acc_norm | SKQuad F1 | |---|---:|---:|---:|---:|---:|---:|---:|---:| | `01_baseline_r16_a16_lr5e5_adamw` | 0.7567 | 0.3405 | 0.5209 | 0.3550 | 0.1799 | 0.3439 | 0.4685 | 36.6797 | | `02_optimizer_adamw8bit_r16_a16_lr5e5` | 0.7521 | 0.3379 | 0.5212 | 0.3544 | 0.1928 | 0.3537 | 0.4715 | 36.2178 | | `03_rank8_a16_lr5e5` | 0.7586 | 0.3311 | 0.5167 | 0.3455 | 0.1838 | 0.3425 | 0.4715 | 36.3638 | | `04_rank32_a32_lr5e5` | 0.7292 | 0.3353 | 0.5201 | 0.3450 | 0.1902 | 0.3367 | 0.4730 | 36.0228 | | `05_r16_alpha32_lr5e5` | 0.7323 | 0.3336 | 0.5190 | 0.3571 | 0.1967 | 0.3555 | 0.4670 | 37.8735 | | `06_lr1e4_r16_a16` | 0.7184 | 0.3311 | 0.5207 | 0.3550 | 0.1902 | 0.3473 | 0.4655 | 37.5796 | | `07_lr2e5_r16_a16` | 0.7912 | 0.3276 | 0.5225 | 0.3379 | 0.1671 | 0.3246 | 0.4723 | 33.8381 | | `08_attention_only_r16_a16_lr5e5` | 0.8094 | 0.3524 | 0.5218 | 0.3448 | 0.1877 | 0.3674 | 0.4768 | 43.3752 | | `09_batch2_accum4_r16_a16_lr5e5` | 0.7563 | 0.3379 | 0.5209 | 0.3514 | 0.1864 | 0.3402 | 0.4693 | 35.3128 | | `10_r16_a32_lr1e4` | 0.6918 | 0.3293 | 0.5157 | 0.3448 | 0.2057 | 0.3480 | 0.4618 | 37.7561 | ### Najlepší výsledok Hruška podľa jednotlivých benchmarkov | Metrika | Najlepší Hruška experiment | Výsledok | |---|---|---:| | ARC acc_norm | `08_attention_only_r16_a16_lr5e5` | 0.3524 | | HellaSwag acc_norm | `07_lr2e5_r16_a16` | 0.5225 | | M-MMLU acc | `05_r16_alpha32_lr5e5` | 0.3571 | | TruthfulQA MC1 | `10_r16_a32_lr1e4` | 0.2057 | | TruthfulQA MC2 | `08_attention_only_r16_a16_lr5e5` | 0.3674 | | SKLegal acc_norm | `08_attention_only_r16_a16_lr5e5` | 0.4768 | | SKQuad F1 | `08_attention_only_r16_a16_lr5e5` | 43.3752 | Najvýraznejší výsledok dosiahol experiment: ```text 08_attention_only_r16_a16_lr5e5 ``` Ten mal síce zo všetkých 10 experimentov najvyšší, teda najhorší validačný `eval_loss = 0.8094`, ale súčasne dosiahol najlepší Hruška výsledok na: - `arc_sk` podľa `acc_norm`, - `truthfulqa_sk_mc2`, - `sklegal` podľa `acc_norm`, - `skquad` podľa F1. Na `skquad` dosiahol F1 `43.3752`, zatiaľ čo baseline experiment 01 dosiahol `36.6797`. Naopak experiment: ```text 10_r16_a32_lr1e4 ``` mal najlepší validačný `eval_loss = 0.6918`, ale nebol najlepší vo väčšine externých benchmarkov. Jeho najlepší výsledok v rámci Hruška experimentov bol `truthfulqa_sk_mc1 = 0.2057`. Ďalšie pozorovania: - `07_lr2e5_r16_a16` dosiahol najlepší HellaSwag `acc_norm = 0.5225`, ale mal slabší eval loss `0.7912`. - `05_r16_alpha32_lr5e5` dosiahol najlepší M-MMLU výsledok `0.3571`. - AdamW 8-bit v experimente 02 dal benchmarkové výsledky veľmi podobné klasickému AdamW baseline. - zmena batch size / gradient accumulation v experimente 09 nepriniesla jasné benchmarkové zlepšenie, - rozdiely medzi viacerými Hruška modelmi na multiple-choice úlohách sú malé, preto ich netreba interpretovať ako zásadné bez ďalších behov alebo štatistického testovania, - najvýraznejšie oddelenie experimentu 08 je na `skquad`, kde je rozdiel oproti ostatným modelom podstatne väčší. --- ## Porovnanie Titan checkpointu 25k a finálneho modelu 225k Checkpoint 25 000 zodpovedá približne: ```text 25 000 × effective batch size 16 = 400 000 spracovaných tréningových príkladov ``` Finálny krok 225 000 zodpovedá približne: ```text 225 000 × 16 = 3 600 000 spracovaných tréningových príkladov ``` Slovenská časť Aya obsahuje približne 4,148 milióna príkladov, takže 225 000 krokov predstavuje približne 86,8 % jedného úplného prechodu datasetom, nie celý epoch. | Metrika | Titan 25k | Titan 225k | Zmena 225k − 25k | |---|---:|---:|---:| | ARC acc_norm | 0.3251 | 0.3447 | +1.97 p. b. | | HellaSwag acc_norm | 0.4943 | 0.4793 | -1.50 p. b. | | M-MMLU acc | 0.3342 | 0.2719 | -6.22 p. b. | | TruthfulQA MC1 | 0.1761 | 0.2005 | +2.44 p. b. | | TruthfulQA MC2 | 0.3251 | 0.3613 | +3.63 p. b. | | SKLegal acc_norm | 0.4588 | 0.4393 | -1.95 p. b. | | SKQuad F1 | 25.8678 | 35.0471 | +9.1793 bodu | Výsledok Titan porovnania nie je jednoznačný. Finálny 225k model oproti 25k checkpointu zlepšil: - ARC `acc_norm` približne o 1,97 percentuálneho bodu, - TruthfulQA MC1 približne o 2,44 p. b., - TruthfulQA MC2 približne o 3,63 p. b., - SKQuad F1 približne o 9,18 bodu. Naopak sa zhoršil: - HellaSwag `acc_norm` približne o 1,50 p. b., - M-MMLU približne o 6,22 p. b., - SKLegal `acc_norm` približne o 1,95 p. b. To je dôležité aj vzhľadom na validačný loss. Checkpoint 25k mal najlepší nameraný Titan eval loss približne `1.0599`, zatiaľ čo na konci bol eval loss približne `1.221`. Napriek tomu 225k checkpoint zlepšil niektoré downstream úlohy, najmä `skquad`. Preto sa nedá povedať, že checkpoint s najnižším validačným lossom je automaticky najlepší model pre všetky úlohy. --- ## Súhrnné porovnanie vybraných modelov | Model / checkpoint | ARC acc_norm | HellaSwag acc_norm | M-MMLU acc | TQA MC1 | TQA MC2 | SKLegal acc_norm | SKQuad F1 | |---|---:|---:|---:|---:|---:|---:|---:| | Alpaca QLoRA | 0.3473 | 0.5106 | 0.2928 | 0.2391 | 0.3942 * | 0.4693 | 27.7994 | | Hruška 08 attention-only | 0.3524 | 0.5218 | 0.3448 | 0.1877 | 0.3674 | 0.4768 | 43.3752 | | Hruška 10 best eval loss | 0.3293 | 0.5157 | 0.3448 | 0.2057 | 0.3480 | 0.4618 | 37.7561 | | Titan 25k | 0.3251 | 0.4943 | 0.3342 | 0.1761 | 0.3251 | 0.4588 | 25.8678 | | Titan 225k | 0.3447 | 0.4793 | 0.2719 | 0.2005 | 0.3613 | 0.4393 | 35.0471 | `*` Starý Alpaca výsledok `truthfulqa_sk_mc2` bol získaný s inou verziou tejto úlohy, preto ho treba porovnávať opatrne. Z porovnania možno vyvodiť: 1. **Hruška experimenty sú veľmi konkurencieschopné napriek iba 100k dátam.** Najmä experiment 08 dosiahol najlepší výsledok na `skquad` a silné výsledky na ARC a SKLegal. 2. **Viac tréningových dát alebo viac krokov automaticky neznamenalo lepší výsledok na každom benchmarku.** Titan 225k spracoval približne 3,6 milióna príkladov, ale na M-MMLU, HellaSwag a SKLegal bol slabší než viacero 100k Hruška experimentov. 3. **Titan 225k sa výrazne zlepšil v generatívnom question-answering benchmarku SKQuad oproti Titan 25k.** F1 stúplo z `25.8678` na `35.0471`. 4. **Starší Alpaca QLoRA model zostáva silný na TruthfulQA MC1.** Dosiahol `0.2391`, čo je viac než všetky nové Aya experimenty. To môže znamenať, že rozdielna tréningová dátová distribúcia zachováva alebo posilňuje iné schopnosti modelu. 5. **Najlepší Hruška validačný loss a najlepší benchmarkový model nie sú totožné.** Experiment 10 je najlepší podľa Aya eval loss, zatiaľ čo experiment 08 je najvýraznejší podľa širšieho benchmarkového profilu. --- ## Dôležité obmedzenia porovnania Pri interpretácii výsledkov treba zohľadniť: - Hruška modely boli trénované na fixnom 100k výbere Aya dát, Titan na streamovanej veľkej časti Aya datasetu, - konfigurácie tréningu sa medzi Hruškou a Titanom líšili, - Hruška benchmarky používali `bf16`, Titan `fp16`, - starší Alpaca benchmark vznikol v inom softvérovom prostredí, - starý `truthfulqa_sk_mc2` používal inú verziu úlohy, - nebol zatiaľ zrobený benchmark základného modelu `slovak-nlp/mistral-sk-7b` bez adaptéru. --- # Optuna – výber learning rate na 30k Aya príkladoch Po sérii 100k porovnávacích experimentov som na Hruške vyskúšal menší skúšobný experiment s automatickým výberom learning rate pomocou framewrku Optuna. Cieľom bolo vybrať sľubnú oblasť LR pre následné overenie na väčšej dátovej množine. Táto časť sumarizuje **osem úspešne dokončených trialov**. Konfigurácie, súhrnné výsledky, grafy a podrobné záznamy úspešných trialov sú v priečinku [optuna_30k_experiments/](optuna_30k_experiments/). Tréningové logy všetkých ôsmich dokončených trialov sú v priečinku [logs/](optuna_30k_experiments/logs/). ## Metodika a spoločné nastavenia Optimalizovaný bol iba parameter `learning_rate` v rozsahu **2e-5 až 2e-4**. Prvé štyri referenčné hodnoty boli vložené ručne: `2e-5`, `5e-5`, `1e-4` a `2e-4`. Ďalšie hodnoty navrhovala Optuna. | Parameter | Hodnota | |---|---| | Základný model | `slovak-nlp/mistral-sk-7b` | | Dataset | fixný `aya_slovak_hpo_30k`, bez streamingu | | Rozdelenie dát | 29 000 tréningových + 1 000 validačných príkladov | | Hardvér | 1× NVIDIA RTX A4500 na Hruške, GPU 0 | | Compute type | `bf16` | | Framework | LLaMA-Factory + Unsloth | | Fine-tuning | LoRA, bez nastavenej 4-bit kvantizácie | | Template / max. dĺžka | `alpaca` / 1024 tokenov | | Packing / train on prompt | `false` / `false` | | LoRA rank / alpha / dropout | 16 / 32 / 0.0 | | LoRA target moduly | `q_proj,k_proj,v_proj,o_proj,gate_proj,up_proj,down_proj` | | Batch size / gradient accumulation | 1 / 16, effective batch 16 | | Rozsah tréningu | 1 epocha, 1 813 optimizer krokov | | Optimizer / scheduler | AdamW (`adamw_torch`) / cosine | | Warmup | 150 krokov | | Max grad norm | 0.5 | | Eval interval / eval batch size | každých 300 krokov + finálna evaluácia / 1 | | Seed | 42 | ## Výsledky ôsmich dokončených trialov | Poradie | Trial | Learning rate | Finálny eval loss | Maximum zaznamenaného grad_norm | |---:|---:|---:|---:|---:| | 1 | 3 | 0.0002000000 | 0.740409 | 14.7127 | | 2 | 8 | 0.0001864520 | 0.740567 | 3.4996 | | 3 | 4 | 0.0001869045 | 0.741250 | 29.0258 | | 4 | 2 | 0.0001000000 | 0.752890 | 7.8035 | | 5 | 6 | 0.0000625750 | 0.766744 | 8.2603 | | 6 | 1 | 0.0000500000 | 0.774108 | 9.5442 | | 7 | 7 | 0.0000202781 | 0.800064 | 16.1318 | | 8 | 0 | 0.0000200000 | 0.800524 | 17.8756 | Presné hodnoty LR, finálne aj minimálne eval loss, kroky, training loss a runtime sú v [CSV súhrne](optuna_30k_experiments/results/optuna_lr_results.csv).

Finálny eval loss v závislosti od learning rate

## Súhrn - Najnižší finálny eval loss dosiahol **trial 3 s LR 0.0002: 0.740409**. - Trial 8 s LR približne **0.00018645** dosiahol veľmi blízky výsledok **0.740567**; rozdiel je približne 0.000157. - Na tomto 30k tréningu mali nižšie skúšané LR vyšší finálny eval loss. - Najlepší skúšaný LR leží na hornej hranici rozsahu. --- # Hruška – hľadanie learning rate na 300k Aya príkladoch Po skúšobnom hľadaní LR pomocou Optuny na 30k príkladoch nasledovalo **overenie šiestich ručne zvolených hodnôt LR na väčšej, fixnej 300k vzorke**. Cieľom bolo nájsť vhodné východiskové nastavenie pre plánovaný tréning na celej slovenskej Aya množine na **Perune**. Podklady k tréningu a následným benchmarkom vybraného modelu sú v priečinku [aya_300k_lr_experiments/](aya_300k_lr_experiments/). Postup opakovania a technické podmienky sú v [reproduction.md](aya_300k_lr_experiments/reproduction.md). ## Dáta a spoločná konfigurácia Zo slovenského `train` splitu `CohereLabs/aya_collection_language_split` sa vyfiltrovali prázdne alebo neplatné `inputs`/`targets`, údaje sa premiešali so seed 42 a vybralo sa 300 000 záznamov. Polia sa previedli na Alpaca formát: `inputs` na `instruction`, prázdny `input` a `targets` na `output`. | Parameter | Hodnota | |---|---| | Základný model | `slovak-nlp/mistral-sk-7b` | | Použitý modelový snapshot | `089497ae0d72018e9591895c54f774bf0b4a83a4` | | Dataset | fixný `aya_slovak_300k_fixed`, bez streamingu | | Rozdelenie | 299 000 tréningových + 1 000 validačných príkladov | | Hardvér | Hruška, 1× RTX A4500, GPU 0 | | Framework a presnosť | LLaMA-Factory + Unsloth, `bf16` | | Fine-tuning | LoRA, rank 16, alpha 32, dropout 0.0 | | LoRA moduly | `q_proj,k_proj,v_proj,o_proj,gate_proj,up_proj,down_proj` | | Template / cutoff | `alpaca` / 1024 tokenov | | Packing / train on prompt | `false` / `false` | | Batch / gradient accumulation | 1 / 16; effective batch 16 | | Tréning | 1 epocha, 18 688 optimizer krokov | | Optimizer / scheduler | `adamw_torch` / cosine | | Warmup / max grad norm | 1500 krokov / 0.5 | | Evaluácia / logovanie | každých 1000 / 10 krokov + finálna evaluácia | | Seed | 42 | Pôvodné [konfigurácie](aya_300k_lr_experiments/configs/) a [tréningové logy](aya_300k_lr_experiments/logs/) sú zachované. ## Výsledky a výber LR pre ďalší tréning Prvá séria obsahovala LR `0.00018`, `0.00020` a `0.00023`. Po jej vyhodnotení sa rozsah rozšíril smerom nadol o `0.00015`, `0.00010` a `0.00008`. Všetkých šesť behov dokončilo jednu epochu. | Learning rate | Finálny eval loss | |---:|---:| | 0.00008 | 0.875217 | | **0.00010** | **0.872620** | | 0.00015 | 0.884270 | | 0.00018 | 0.891460 | | 0.00020 | 0.897669 | | 0.00023 | 0.903236 | **LR `0.00010` bol vybraný preto, že dosiahol najnižší finálny validačný loss zo všetkých šiestich 300k behov: `0.87261962890625`.** Rozdiel oproti LR `0.00008` je približne 0.002597. Ide o najlepší bodový výsledok v tejto sérii. Na 30k skúške bol najlepší skúšaný LR `0.0002`. Výsledky 300k série preto ukazujú význam overenia LR na väčšej vzorke. Presné údaje sú v [súhrne](aya_300k_lr_experiments/results/aya_300k_lr_summary.csv).

Priebeh validačného loss pre šesť learning rate

## Export vybraného modelu a benchmarky Na následné benchmarky sa vybral model s LR `0.00010`. Jeho LoRA adaptér sa zlúčil s pôvodným základným modelom do samostatného modelu v `bfloat16`. Benchmarky skúmajú schopnosti tohto vybraného modelu. **Ostatných päť LR zatiaľ týmito benchmarkmi nebolo porovnaných**. ### lm-evaluation-harness Vyhodnotenie dokončilo všetkých sedem pôvodných úloh a skončilo s návratovým kódom 0. Zachované sú [výsledky](aya_300k_lr_experiments/benchmarks/lmeval/results/), [log](aya_300k_lr_experiments/benchmarks/lmeval/logs/), custom úlohy a metadáta prostredia. V nasledujúcej tabuľke sú accuracy metriky prevedené na percentá; SKQuad F1 je už v zdroji v škále 0–100. | Model | ARC acc_norm | HellaSwag acc_norm | M-MMLU acc | TQA MC1 | TQA MC2 | SKLegal acc_norm | SKQuad F1 | |---|---:|---:|---:|---:|---:|---:|---:| | 100k – experiment 01, baseline | 34.05 | 52.09 | 35.50 | 17.99 | 34.39 | 46.85 | 36.68 | | 100k – experiment 08, attention-only | 35.24 | 52.18 | 34.48 | 18.77 | 36.74 | 47.68 | 43.38 | | 100k – experiment 10, r16/a32/LR 0.0001 | 32.93 | 51.57 | 34.48 | 20.57 | 34.80 | 46.18 | 37.76 | | **300k – vybraný LR 0.00010** | 34.73 | 51.64 | 31.03 | 19.67 | 35.07 | 46.10 | 38.73 | Oproti 100k experimentu 10 dosiahol vybraný 300k model bodovo vyššie ARC acc_norm (+1.80 percentuálneho bodu) a SKQuad F1 (+0.97 bodu), ale nižšie M-MMLU acc (−3.45 percentuálneho bodu). Ostatné zmeny sú menšie. V žiadnej zo siedmich hlavných metrík neprekonal maximum z celej desiatky 100k behov; tieto maximá navyše pochádzajú z rôznych konfigurácií. Výber najnižšieho validačného loss teda neznamená automaticky najlepší výsledok v každej downstream úlohe. ### SK-bench Dokončil sa **čiastkový slovenský zero-shot beh s 222 položkami**. Zahrnuté boli tri slovenské formulácie promptov dostupných úloh. Použila sa Alpaca šablóna zlúčeného modelu, greedy dekódovanie, seed 1234, `bf16`, jedna GPU a maximálny kontext 32 768 tokenov. Z pôvodných 412 slovenských položiek sa vynechalo 187 položiek pre 12 nedostupných repozitárov: Chiby, Autoškola, e-testy, IFEval-SK, OneRuler-SK, Scio, Slohry, Slovak school exams, Slovak Trivia, SlovakSum, SME-Sum a slovné analógie. Ich kontrola vracala `RepositoryNotFoundError`. Ďalšie tri položky NLI-SK-annotated sa vynechali, pretože prístup vyžadoval schválenie autorkou a pri spúšťaní behu ešte nebol udelený. Ostatné NLI úlohy zo skLEP v behu zostali. Uložené sú [vykonané úlohy](aya_300k_lr_experiments/benchmarks/skbench/configs/tasks.txt), [vynechané úlohy](aya_300k_lr_experiments/benchmarks/skbench/configs/omitted_tasks.txt), [report dostupnosti](aya_300k_lr_experiments/benchmarks/skbench/configs/dataset_access_report.json), úplný výsledný JSON a úspešný log. Audit 222 detailných parquet výstupov overil **159 426 hodnotení** (53 142 pre každý z troch promptov). **Log zároveň potvrdzuje orezanie príliš dlhého vstupu.** | Úloha | Metrika | Počet variantov | Priemer (%) | |---|---|---:|---:| | ARC | `em_relaxed` | 3 | 19.08 | | Belebele | `em_relaxed` | 3 | 21.33 | | Financial Exams | `em_relaxed` | 3 | 22.94 | | Global-MMLU-Lite | `em_relaxed` | 3 | 19.83 | | MMLU (57 predmetov) | `em_relaxed` | 171 | 15.72 | | SlovakCOPA | `em_relaxed` | 3 | 40.47 | | SKJ1 | `em_relaxed` | 3 | 4.33 | | TruthfulQA MC1 | `em_relaxed` | 3 | 1.20 | | MovieReview | `em_norm_relaxed` | 3 | 40.90 | | ToxicSK | `em_norm_relaxed` | 3 | 47.60 | | MultiWikiQA | `f1_slk` | 3 | 50.99 | | skLEP-QA | `f1_slk` | 3 | 37.50 | Úplné metriky sú v [per_task_metrics.csv](aya_300k_lr_experiments/benchmarks/skbench/results/per_task_metrics.csv); rodinné a promptové súhrny vrátane nevážených priemerov sú v [family_summary.csv](aya_300k_lr_experiments/benchmarks/skbench/results/family_summary.csv) a [family_prompt_summary.csv](aya_300k_lr_experiments/benchmarks/skbench/results/family_prompt_summary.csv). **Tento výsledok nie je oficiálne celkové skóre úplného SK-bench.** Pri príprave sa sampler FlashInfer pokúšal kompilovať cez starší systémový CUDA toolkit. Úspešný beh používal `VLLM_USE_FLASHINFER_SAMPLER=0` a `--enforce-eager`.