141 lines
7.4 KiB
Markdown
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/`.
|