151 lines
10 KiB
Markdown
151 lines
10 KiB
Markdown
# Slovenská Aya na Perunovi
|
|
|
|
Prvým modelom pre ďalšiu sériu je `ministral/Ministral-3b-instruct`. Po SFT s LoRA v LLaMA-Factory sa pôvodný a dotrénovaný model porovnajú na rovnakých úlohách SK-bench. `configs/ministral.yaml` pripína rovnakú východiskovú revíziu modelu, aká sa stiahla pre baseline. Formát chatu sa odvodí z tokenizéra modelu. Konfigurácie Mistral-SK a OLMo sú v balíku ako ďalšie možnosti.
|
|
|
|
| Súbor | Úloha |
|
|
| --- | --- |
|
|
| `scripts/prepare_data.py` | Jednorazová príprava spoločného datasetu. |
|
|
| `configs/ministral.yaml` | Model, revízia, LoRA a tréningové nastavenia. |
|
|
| `scripts/train.py` | Kontrola dát a spustenie tréningu s Unslothom. |
|
|
| `scripts/evaluate.py` | Loss, perplexita, slovný F1 a presná zhoda na spoločnom splite eval alebo test. |
|
|
|
|
## Jeden pevný dataset
|
|
|
|
Príprava dát sa vykoná **raz**. Skript načíta slovenskú Aya, vynechá neplatné a prázdne riadky, odstráni normalizované duplicity a rozdelí dáta so seedom 42. Rovnaké zadania s rôznymi odpoveďami zostávajú v jednej množine. Eval aj test dostanú najviac 1 000 príkladov. Zvyšok patrí do train.
|
|
|
|
V `data/aya_slovak_fixed` sa uložia **úplné zadania a referenčné odpovede**. Pri zmene modelu sa použijú tie isté súbory a ten istý manifest. Tokenizácia prebehne až v LLaMA-Factory podľa modelovej konfigurácie. Pri `cutoff_len: 4096` sa prípadné orezanie týka spracovaných tokenov pre daný beh. Dĺžky a počet orezaných príkladov sa môžu medzi modelmi líšiť.
|
|
|
|
Manifest zaznamená zdroj, seed, počty a kontrolné súčty. `dataset_info.json` registruje `aya_train`, `aya_eval` a `aya_test`. Súbory `*.metadata.jsonl` uchovávajú pôvod príkladov v rovnakom poradí. Dočasná SQLite databáza zabezpečuje deduplikáciu a rozdelenie bez držania celého datasetu v RAM.
|
|
|
|
## 1. Príprava dát na CPU
|
|
|
|
Balík sa prenesie do `/mnt/project/perun26012578/perun`. Zdrojový Parquet je už v `/mnt/project/perun26012578/raw/slovak_train.parquet`. Pri príprave stačí Python s PyArrow, ktorý je dostupný aj v pripravenom kontajneri SK-bench.
|
|
|
|
Z prihlasovacieho uzla sa príprava odošle do `cpu_short`. Príkaz použije existujúci obraz a Python prostredie v `apphome`.
|
|
|
|
```bash
|
|
cd /mnt/project/perun26012578/perun
|
|
mkdir -p logs
|
|
export APPHOME=/mnt/home/jascke919/apphome
|
|
|
|
sbatch --job-name=aya_prepare \
|
|
--account=perun26012578 --partition=cpu_short \
|
|
--nodes=1 --ntasks=1 --cpus-per-task=4 --mem=24G \
|
|
--time=08:00:00 --output=logs/aya_prepare_%j.out \
|
|
--wrap='apptainer exec --home "$APPHOME" \
|
|
--bind /mnt/project/perun26012578:/mnt/project/perun26012578 \
|
|
--pwd /mnt/project/perun26012578/perun "$APPHOME/cuda.sif" \
|
|
"$APPHOME/venv/bin/python" -u scripts/prepare_data.py \
|
|
--local-parquet /mnt/project/perun26012578/raw/slovak_train.parquet \
|
|
--output-dir data/aya_slovak_fixed'
|
|
```
|
|
|
|
Po dokončení sa skutočné počty a kontrolné súčty nachádzajú v `data/aya_slovak_fixed/manifest.json`. Výstupný priečinok prípravy musí byť nový alebo prázdny. Pri vlastnom lokálnom JSONL slúži `--local-jsonl`. Bez lokálneho vstupu sa použije pripnutá revízia slovenskej Aya na Hugging Face.
|
|
|
|
## Prostredie pre tréning
|
|
|
|
Tréning používa samostatné prostredie s LLaMA-Factory, Unslothom a CUDA pre H200. Balík obsahuje zachytené verzie knižníc. Funkčnosť konkrétnej zostavy sa overí pri prvom pilote na Perunovi.
|
|
|
|
### Požiadavky a inštalácia prostredí
|
|
|
|
Priečinok `requirements` obsahuje verzie odvodené z exportu Hrušky.
|
|
|
|
| Súbor | Prostredie |
|
|
| --- | --- |
|
|
| `requirements/training.txt` | Python 3.11.16; LLaMA-Factory, Unsloth, PyTorch 2.6.0 s CUDA 12.4 a generatívna evaluácia. |
|
|
| `requirements/lm-eval.txt` | Python 3.11.16; lm-evaluation-harness, Transformers 4.48.2 a PyTorch 2.6.0 s CUDA 12.4. |
|
|
| `requirements/skbench.txt` | Python 3.13.17; export 308 balíkov SK-bench vrátane vLLM 0.28.0, Transformers 5.12.1 a PyTorch 2.13.0. |
|
|
| `requirements/skbench/pyproject.toml` a `uv.lock` | Pôvodné závislosti a uzamknuté verzie SK-bench pre obnovenie cez uv. |
|
|
|
|
Git závislosti LLaMA-Factory, lm-eval a lighteval sú pripnuté na pôvodné commity. Neplatná lokálna cesta k pip bola v tréningovom a lm-eval exporte nahradená verziou `pip==26.2.1` z Condy. Výpočtové knižnice zachovávajú pôvodné verzie.
|
|
|
|
Do tréningových požiadaviek boli doplnené `jieba==0.42.1`, `rouge-chinese==1.0.3`, `nltk==3.10.3` a jeho závislosti `joblib==1.6.0` a `defusedxml==0.7.1` pre generatívnu evaluáciu. Doplnený je aj `torchao==0.13.0`, pretože ho vyžaduje zachytená verzia Unsloth Zoo a export ho neobsahoval. Táto verzia TorchAO podporuje Python API s PyTorch 2.6; jej natívne C++ rozšírenia sú určené pre PyTorch 2.8. Scenár používa LoRA bez kvantizácie TorchAO.
|
|
|
|
Pre tréning je `setuptools` upravený na `80.10.2`, rovnako ako vo funkčnom SK-bench exporte. Knižnica jieba používa `pkg_resources`, ktorý bol zo setuptools 82 odstránený. Tréningové a benchmarkové verzie ostatných zachytených balíkov sa nemenia.
|
|
|
|
Ide o požiadavky pripravené z funkčných prostredí Hrušky a uvedených doplnení. Čistá inštalácia a výpočet na H200 sa overia na Perunovi.
|
|
|
|
#### Tréning a evaluácia na pripravených Aya dátach
|
|
|
|
Nasledujúce príkazy sa zadávajú z koreňa balíka v prostredí s dostupnou Condou a Gitom. PyTorch a xformers sa najprv nainštalujú z rovnakého oficiálneho CUDA 12.4 indexu:
|
|
|
|
```bash
|
|
conda create -n aya_train_perun python=3.11.16 pip=26.2.1 -y
|
|
conda activate aya_train_perun
|
|
|
|
python -m pip install torch==2.6.0 torchvision==0.21.0 torchaudio==2.6.0 xformers==0.0.29.post3 \
|
|
--index-url https://download.pytorch.org/whl/cu124
|
|
|
|
python -m pip install -r requirements/training.txt
|
|
python -m pip check
|
|
```
|
|
|
|
Na pridelenom GPU uzle sa overia importy, CUDA a BF16:
|
|
|
|
```bash
|
|
python -c 'import unsloth, torch, jieba, nltk; from rouge_chinese import Rouge; assert torch.cuda.is_available(); assert torch.cuda.is_bf16_supported(); print("GPU:", torch.cuda.get_device_name(0)); print("Viditelne GPU:", torch.cuda.device_count()); print("CUDA:", torch.version.cuda)'
|
|
```
|
|
|
|
Tréning aj `scripts/evaluate.py` sa potom spúšťajú v `aya_train_perun` podľa ďalších častí dokumentácie. Overené opravy generovania z Titanu sú súčasťou `scripts/train.py`.
|
|
|
|
#### lm-evaluation-harness
|
|
|
|
Príkazy sa zadávajú z koreňa balíka:
|
|
|
|
```bash
|
|
conda create -n aya_lmeval_perun python=3.11.16 pip=26.2.1 -y
|
|
conda activate aya_lmeval_perun
|
|
|
|
python -m pip install torch==2.6.0 --index-url https://download.pytorch.org/whl/cu124
|
|
python -m pip install -r requirements/lm-eval.txt
|
|
python -m pip check
|
|
lm_eval --help
|
|
```
|
|
|
|
Súbor inštaluje framework pri revízii `6d2abda4fd171e68a8789330c4149e37c1ca0bda`. Vlastné slovenské úlohy, zoznam benchmarkov a evaluačné dáta sa prenášajú samostatne; požiadavky obsahujú Python knižnice.
|
|
|
|
## 2. Pilot a tréning
|
|
|
|
Z koreňa balíka s aktivovaným tréningovým prostredím sa overí konfigurácia a integrita spoločných dát.
|
|
|
|
```bash
|
|
python scripts/train.py configs/ministral.yaml --dry-run
|
|
```
|
|
|
|
Plný tréning využíva štyri H200 na jednom uzle cez DDP. `train.py` spustí procesy sám. Slurm job preto požaduje jeden task a štyri GPU. Základná konfigurácia používa BF16, LoRA rank 16, alpha 32, batch 8 na GPU a efektívny batch 32. LR 0,0001 je východisková hodnota pre Ministral.
|
|
|
|
Prvý pilot overí načítanie modelu, jeho natívny formát chatu, priebeh lossu a uloženie adaptéra. `--pilot-steps 30` obmedzí počet krokov a pri predvolenom splite použije najviac 2 048 tréningových riadkov z pevného poradia. Celý validačný split zostane dostupný. Pilot použije vlastný výstupný priečinok. LLaMA-Factory načíta zdrojový JSONL a obmedzí rozsah pred tokenizáciou.
|
|
|
|
```bash
|
|
sbatch --job-name=ministral_pilot \
|
|
--account=perun26012578 --partition=gpu_short \
|
|
--nodes=1 --ntasks=1 --gres=gpu:4 --cpus-per-task=32 --mem=128G \
|
|
--time=02:00:00 --output=logs/ministral_pilot_%j.out \
|
|
--wrap='python -u scripts/train.py configs/ministral.yaml --run-dir runs/ministral_pilot --pilot-steps 30'
|
|
```
|
|
|
|
Plný tréning sa spustí po kontrole pilotu a spresnení času. Pri dlhom behu sa checkpointy ukladajú každých 1 000 optimizer krokov a vyberá sa podľa najnižšieho validačného lossu.
|
|
|
|
```bash
|
|
sbatch --job-name=ministral_train \
|
|
--account=perun26012578 --partition=gpu_long \
|
|
--nodes=1 --ntasks=1 --gres=gpu:4 --cpus-per-task=32 --mem=256G \
|
|
--time=2-00:00:00 --output=logs/ministral_train_%j.out \
|
|
--wrap='python -u scripts/train.py configs/ministral.yaml'
|
|
```
|
|
|
|
Adaptér sa uloží do `runs/ministral/adapter`. V nadradenom priečinku zostanú `train.log`, `used_config.yaml` a `run.json` s identifikáciou datasetu. Pre iný beh sa zvolí nový `--run-dir`. Pri obnovení z checkpointu sa použije `--resume` s pôvodnými dátami a nastaveniami.
|
|
|
|
## 3. Vyhodnotenie
|
|
|
|
Po tréningu môže `evaluate.py` na jednej GPU vypočítať validačný loss a perplexitu a vygenerovať odpovede pre F1 a presnú zhodu. Pri generovaní sa ponechá priestor aspoň pre jeden nový token. Pri skórovaní generovaných odpovedí sa používajú úplné referencie zo spoločného JSONL. Výsledky obsahujú aj počty referencií, ktoré sa líšia od exportovaných labelov. Po výbere modelu sa môže použiť `--split test` s novým výstupným priečinkom.
|
|
|
|
```bash
|
|
python scripts/evaluate.py configs/ministral.yaml --output-dir results/ministral_eval
|
|
python scripts/evaluate.py configs/ministral.yaml --split test --output-dir results/ministral_test
|
|
```
|
|
|
|
Externý SK-bench sa spúšťa zo samostatného klonu v `/mnt/project/perun26012578/sk-bench`. Na porovnanie s baseline sa použije rovnaká revízia SK-bench, rovnaké nastavenia generovania a rovnaký súbor `tasks_ministral_sk_baseline.txt` s 340 variantmi. Lokálne exportovaný model musí byť viditeľný z kontajnera. [SK-bench na Slurme](https://github.com/slovak-nlp/sk-bench/blob/main/container/slurm/README.md)
|
|
|
|
Stav jobu sa sleduje cez `squeue -u "$USER"`. Pri chybách sa kontroluje log v `logs/`. Revízia Gitu sa v prípade potreby zistí pred odoslaním na prihlasovacom uzle.
|