# 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` Repozitár s kódmi, konfiguráciami a výsledkami: - `https://git.kemt.fei.tuke.sk/js886io/Diplomovka` ## 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.