| checkpoint-100000 | ||
| configs | ||
| evaluation/lmeval_custom_tasks | ||
| hruska_10_experiments_results | ||
| plots | ||
| results | ||
| scripts | ||
| strojovy_preklad | ||
| translated_dataset | ||
| README.md | ||
| trainer_log.jsonl | ||
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:
instructioninputoutput
Dáta boli formátované v Alpaca štýle:
### 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:
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:
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
| 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:
instructioninputoutput
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:
{
"instruction_en": "...",
"input_en": "...",
"output_en": "...",
"instruction_sk": "...",
"input_sk": "...",
"output_sk": "..."
}
Vznikla preložená vzorka datasetu s 1000 príkladmi.
Umiestnenie:
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. Pôvodný konfiguračný súbor sa podarilo zachovať:
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:
q_proj, k_proj, v_proj, o_proj, gate_proj, up_proj, down_proj
Výstupný priečinok bol nastavený na:
/home/schwarc/diplomovka/mistral_sk_aya_slovak_full_lora_unsloth_streaming_1gpu
Konfigurácia počítala približne s jedným prechodom cez celý slovenský Aya subset:
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:
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:
loss = 3.232
loss = 7.081
loss = 5.206
loss = 14.82
Neskôr sa v logu objavila aj kombinácia:
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:
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.
Dôležité je odlíšiť tento experiment od skoršieho 2-GPU streaming testu, ktorý skutočne spadol na probléme s IterableDataset a dispatch_batches=True. Tento samostatný problém bol odstránený nastavením:
accelerator_config:
dispatch_batches: false
split_batches: false
Po diagnostike prvého dlhého behu a overení upravenej konfigurácie bol následne spustený nový 2-GPU tréning s 225 000 krokmi, ktorý úspešne dobehol do konca.
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:
q_proj, k_proj, v_proj, o_proj, gate_proj, up_proj, down_proj
Tréning úspešne dobehol do kroku 225000.
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:
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:
{
"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:
q_proj, k_proj, v_proj, o_proj, gate_proj, up_proj, down_proj
Výnimkou je experiment 08, ktorý používa iba:
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:
10_r16_a32_lr1e4
s hodnotou:
eval_loss = 0.6918
V tomto experimente bola použitá kombinácia:
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-5na1e-4znížilo eval loss z0.7567na0.7184, - zvýšenie LoRA alpha z
16na32pri rank 16 znížilo eval loss na0.7323, - kombinácia
alpha=32alearning_rate=1e-4dosiahla najnižší eval loss0.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:
hruska_10_experiments_results/
Súčasťou sú:
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:
<experiment>.yaml
training.log
training_loss.png
training_eval_loss.png
Benchmarkovanie Hruška experimentov a Titan modelu
Modely sú následne vyhodnocované pomocou lm-evaluation-harness.
Používané benchmarky:
arc_sk
hellaswag_sk
m_mmlu_sk
truthfulqa_sk_mc1
truthfulqa_sk_mc2
sklegal
skquad
Na Hruške sú postupne benchmarkované všetky modely z 10 porovnávacích experimentov.
Na Titane sa porovnáva:
- finálny model po 225 000 krokoch,
- zachovaný checkpoint z kroku 25 000.
Výsledky tejto časti budú doplnené po dokončení benchmarkov.