| .. | ||
| configs | ||
| ministral_3b_aya | ||
| requirements | ||
| scripts | ||
| README.md | ||
| SK_BENCH.md | ||
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. Príprava kontajnera aj vyhodnotenie v SK-bench sú v návode pre SK-bench.
1. Pripojenie a cesty
Po pripojení na VPN Peruna je potrebné prihlásiť sa na uzol login01 cez SSH.
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.
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.
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.
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.
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.
"$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.
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.
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 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 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.
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.
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.
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.
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/.