263 lines
14 KiB
Markdown
263 lines
14 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 serveri Titan s GPU:
|
|
|
|
- NVIDIA TITAN RTX
|
|
- 24 GB VRAM
|
|
|
|
|
|
## Použitý dataset v prvom experimente
|
|
|
|
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 v prvom experimente
|
|
|
|
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 najskôr 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
|
|
|
|
Model bol následne vyhodnotený pomocou frameworku `lm-evaluation-harness` na slovenských benchmarkových úlohách.
|
|
|
|
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` neboli dostupné v štandardnej inštalácii `lm-evaluation-harness`, preto 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:
|
|
|
|
- `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": "..."
|
|
}
|
|
```
|
|
|
|
Experiment bol úspešne spustený a vznikla preložená vzorka datasetu s 1000 príkladmi. Táto vzorka je uložená v repozitári v priečinku:
|
|
|
|
```text
|
|
translated_datasets/
|
|
```
|
|
|
|
Súbor:
|
|
|
|
```text
|
|
alpaca_translated_en_sk_1000.jsonl
|
|
```
|
|
|
|
|
|
## Experiment s datasetom Aya Collection
|
|
|
|
Okrem pôvodného tréningu na datasete `saillab/alpaca-slovak-cleaned` bol pripravený ďalší experiment s väčším slovenským inštrukčným datasetom:
|
|
|
|
- `CohereLabs/aya_collection_language_split`
|
|
|
|
Použitá bola iba slovenská časť datasetu:
|
|
|
|
- subset: `slovak`
|
|
- language: `slk`
|
|
|
|
Slovenská časť datasetu obsahuje približne 4,15 milióna príkladov. Dataset obsahuje najmä polia:
|
|
|
|
- `inputs`
|
|
- `targets`
|
|
- `language`
|
|
|
|
Pri tréningu boli polia mapované nasledovne:
|
|
|
|
| Pôvodné pole | Použitie pri tréningu |
|
|
|---|---|
|
|
| `inputs` | prompt / inštrukcia |
|
|
| `targets` | odpoveď |
|
|
| `language` | jazyk príkladu |
|
|
|
|
Cieľom experimentu je dotrénovať slovenský Mistral 7B model na výrazne väčšom množstve slovenských inštrukčných dát.
|
|
|
|
## Tréning na Aya Slovak datasete
|
|
|
|
Pre experiment s datasetom Aya bol použitý rovnaký základný model:
|
|
|
|
- `slovak-nlp/mistral-sk-7b`
|
|
|
|
Na rozdiel od predchádzajúceho experimentu s datasetom Alpaca bol tento tréning nastavený ako LoRA fine-tuning bez 4-bit kvantizácie, teda nie ako QLoRA.
|
|
|
|
Použitá konfigurácia:
|
|
|
|
| Parameter | Hodnota |
|
|
|---|---:|
|
|
| Dataset | `CohereLabs/aya_collection_language_split` |
|
|
| Subset | `slovak` |
|
|
| Jazyk | `slk` |
|
|
| Počet príkladov | približne 4 148 000 |
|
|
| Fine-tuning metóda | LoRA |
|
|
| QLoRA / 4-bit quantization | nie |
|
|
| Unsloth | áno |
|
|
| GPU | 1 |
|
|
| Batch size per device | 1 |
|
|
| Gradient accumulation | 4 |
|
|
| Effective batch size | 4 |
|
|
| Max sequence length | 1024 |
|
|
| Max steps | 1 037 000 |
|
|
| LoRA rank | 16 |
|
|
| LoRA alpha | 32 |
|
|
| LoRA dropout | 0.05 |
|
|
| Trainable parameters | 41 943 040 |
|
|
| Compute type | fp16 |
|
|
|
|
Použité LoRA cieľové moduly:
|
|
|
|
```text
|
|
q_proj, k_proj, v_proj, o_proj, gate_proj, up_proj, down_proj
|
|
```
|
|
|
|
Keďže slovenská časť datasetu Aya je veľmi veľká, pri klasickom načítaní datasetu dochádzalo k zaplneniu diskového priestoru počas predspracovania dát. Z tohto dôvodu bol tréning nastavený v režime streamingu:
|
|
|
|
```yaml
|
|
streaming: true
|
|
buffer_size: 16384
|
|
```
|
|
|
|
Streaming umožňuje čítať dáta postupne počas tréningu bez potreby uložiť celý predspracovaný dataset do cache na disk. Tréning je preto riadený cez počet krokov:
|
|
|
|
```yaml
|
|
max_steps: 1037000
|
|
```
|
|
|
|
Táto hodnota približne zodpovedá jednému prechodu cez celý slovenský Aya dataset pri efektívnej veľkosti batchu 4.
|
|
|
|
Tento experiment je aktuálne spustený. Výsledný adaptér a finálne metriky budú doplnené po dokončení tréningu.
|
|
|
|
|