Diplomovka/perun/README.md
2026-11-12 18:27:37 +01:00

141 lines
7.4 KiB
Markdown

# Príprava a spustenie experimentov na Perune
Postup pre dotrénovanie `ministral/Ministral-3b-instruct` na slovenskej časti Aya Collection metódou SFT s LoRA v LLaMA-Factory a Unslothe. Výsledky dokončeného behu sú v [dokumentácii experimentu](ministral_3b_aya/README.md). Príprava kontajnera aj vyhodnotenie v SK-bench sú v [návode pre SK-bench](SK_BENCH.md).
## 1. Pripojenie a cesty
Po pripojení na VPN Peruna je potrebné prihlásiť sa na uzol `login01` cez SSH.
```bash
ssh jascke919@login01.perun.tuke.sk
```
Príkazy predpokladajú, že priečinok `perun` z repozitára je v projektovom úložisku. Pri prvom prenose sa nasledujúci príkaz spúšťa v PowerShelli z koreňa lokálneho repozitára. Pri ďalších behoch sa používa existujúca kópia priečinka na Perune.
```powershell
scp -r .\perun jascke919@login01.perun.tuke.sk:/mnt/project/perun26012578/
```
Premenné je potrebné nastaviť na prihlasovacom uzle v relácii, z ktorej sa odosielajú joby.
```bash
export PROJECT=/mnt/project/perun26012578
export APPHOME=/mnt/home/jascke919/apphome
export TRAIN_ENV=/mnt/home/jascke919/aya_train_perun_managed
export PY="$TRAIN_ENV/bin/python"
cd "$PROJECT/perun"
mkdir -p logs
```
## 2. Príprava prostredia
Na prípravu dát je potrebný obraz `$APPHOME/cuda.sif` a Python 3.13 s PyArrow v `$APPHOME/venv`. Postup prvotnej inštalácie je v [príprave kontajnera SK-bench](SK_BENCH.md#1-príprava-kontajnera).
Tréning a Aya test používajú samostatné prostredie s Pythonom 3.11. Na Perune fungovalo prostredie vytvorené cez `uv --managed-python`. Obsahuje hlavičku `Python.h`, ktorú potrebuje Triton. V existujúcom prostredí `aya_train_perun_managed` sa závislosti overia cez `"$PY" -m pip check`. Pri novej inštalácii sa nasledujúce príkazy spúšťajú z priečinka `perun` s dostupným `uv`.
```bash
uv venv --managed-python --python 3.11 --seed "$TRAIN_ENV"
"$PY" -c 'import pathlib, sysconfig; p = pathlib.Path(sysconfig.get_path("include")) / "Python.h"; assert p.is_file(), p; print(p)'
"$PY" -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
"$PY" -m pip install -r requirements/training.txt
"$PY" -m pip check
```
Pred prvým GPU jobom je potrebné stiahnuť základný model do cache Hugging Face. Príkaz vyžaduje prístup na internet a rovnaké nastavenie cache ako tréningový job.
```bash
"$PY" - <<'PYTHON'
from huggingface_hub import snapshot_download
snapshot_download(
"ministral/Ministral-3b-instruct",
revision="2c95908929198d6e69af8638f0dbbd9bc6b93f9e",
)
PYTHON
```
## 3. Príprava Aya dát na CPU
Zdrojový súbor je na Perune v `/mnt/project/perun26012578/raw/slovak_train.parquet`. Pripravené dáta sú v `data/aya_slovak_fixed`. Ak priečinok obsahuje pôvodný manifest a rozdelené dáta, pokračuje sa kontrolou tréningovej konfigurácie. Pri príprave od začiatku musí byť výstupný priečinok nový alebo prázdny.
Ak zdrojový Parquet na Perune chýba, po pripojení na VPN sa prenesie cez `scp`. Príkaz sa spúšťa z lokálneho priečinka so súborom.
```powershell
scp .\slovak_train.parquet jascke919@login01.perun.tuke.sk:/mnt/project/perun26012578/raw/
```
Kontrolný súčet pôvodného Parquetu sa overí cez `sha256sum "$PROJECT/raw/slovak_train.parquet"`. Očakávaný SHA-256 je `6a21c52b80549cbb8f9d13de981a2d8f65c273a17f651fd09c1efcc952821e82`.
```bash
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 "$PROJECT:$PROJECT" \
--pwd "$PROJECT/perun" "$APPHOME/cuda.sif" \
"$APPHOME/venv/bin/python" -u scripts/prepare_data.py \
--local-parquet "$PROJECT/raw/slovak_train.parquet" \
--output-dir data/aya_slovak_fixed --seed 42 --eval-size 1000 --test-size 1000'
```
Príprava odstráni neplatné riadky a duplicitné páry. Rovnaké normalizované zadania drží v jednej množine. Po pôvodnom jobe 145681 obsahoval [manifest](ministral_3b_aya/training/data_manifest.json) **3 490 041 tréningových, 1 000 validačných a 1 000 testovacích príkladov**. Skript uchováva celé texty a limit 4 096 tokenov sa uplatňuje pri tokenizácii konkrétneho behu.
## 4. Kontrola, pilot a plný tréning
Konfigurácia [`configs/ministral.yaml`](configs/ministral.yaml) používa nastavenia plného behu s learning rate `0.0002`. Skript spustí štyri tréningové procesy cez DDP. Slurm preto dostane jeden task a štyri GPU na jednom uzle.
```bash
export RUN="$PROJECT/perun/runs/ministral_aya_$(date +%Y%m%d_%H%M%S)"
"$PY" scripts/train.py configs/ministral.yaml --run-dir "$RUN" --dry-run
```
Po úspešnej kontrole dát sa spúšťa pilot s 30 tréningovými krokmi a samostatným výstupným priečinkom. Rovnaká kontrola GPU a Tritonu sa používa aj pri plnom behu.
```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='set -e
"$PY" -c "import torch; assert torch.cuda.device_count() == 4; assert all(\"H200\" in torch.cuda.get_device_name(i) for i in range(4)); from triton.runtime import driver; print(driver.active.get_current_target())"
"$PY" -u scripts/train.py configs/ministral.yaml --run-dir "${RUN}_pilot" --pilot-steps 30'
```
Pri 300k pilote sa namiesto `--pilot-steps 30` použilo `--pilot-samples 300000 --pilot-steps 9375 --pilot-eval-steps 1875`. Plný beh sa odosiela po úspešnom pilote.
```bash
sbatch --job-name=ministral_full_lr020 \
--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_full_lr020_%j.out \
--wrap='set -e
"$PY" -c "import torch; assert torch.cuda.device_count() == 4; assert all(\"H200\" in torch.cuda.get_device_name(i) for i in range(4)); from triton.runtime import driver; print(driver.active.get_current_target())"
"$PY" -u scripts/train.py configs/ministral.yaml --run-dir "$RUN"'
```
V `$RUN` vzniknú `run.json`, `used_config.yaml`, `train.log` a `adapter/`. Pri pôvodnom jobe 148065 bol posledný checkpoint **109 064**. Export v samotnom `adapter/` zodpovedá validačne najlepšiemu checkpointu **109 000**.
## 5. Aya test posledného checkpointu
Nasledujúce cesty zodpovedajú testu pôvodného jobu 148065. Pri teste nového tréningu je potrebné nastaviť cestu k novému behu a k jeho poslednému checkpointu. Evaluácia vyžaduje pôvodný manifest dát daného behu.
```bash
export RUN="$PROJECT/perun/models/ministral-3b-instruct/runs/full_aya_lr_0p000200_epoch1"
export CHECKPOINT="$RUN/adapter/checkpoint-109064"
export EVAL_OUT="$RUN/evaluations/aya_test_last_109064_$(date +%Y%m%d_%H%M%S)"
sbatch --job-name=ministral_aya_test \
--account=perun26012578 --partition=gpu_short \
--nodes=1 --ntasks=1 --gres=gpu:1 --cpus-per-task=8 --mem=64G \
--time=04:00:00 --output=logs/ministral_aya_test_%j.out \
--wrap='set -e
"$PY" -u scripts/evaluate.py "$RUN/used_config.yaml" \
--adapter "$CHECKPOINT" --split test \
--output-dir "$EVAL_OUT" --max-new-tokens 256'
```
Súbor `summary.json` obsahuje testovací loss, perplexitu, tokenové F1 a normalizovanú presnú zhodu. Stav jobov sa sleduje cez `squeue -u "$USER"` a výpisy Slurmu sú v `logs/`.