10 KiB
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.
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:
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:
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:
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.
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.
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.
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.
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
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.