868 lines
27 KiB
Markdown
868 lines
27 KiB
Markdown
# 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
|
||
<experiment>.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).
|
||
|
||

|
||
|
||

|
||
|
||
|
||
## 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.
|
||
|