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

166 lines
7.4 KiB
Markdown

# SK-bench na Perune
Oba Ministraly sa hodnotia na rovnakom [zozname 385 slovenských zero-shot variantov](ministral_3b_aya/sk_bench/tasks_sk0_385.txt). Pôvodné výsledky vznikli v dvoch etapách po 340 a 45 variantoch. Nižšie je postup na prípravu prostredia, export modelu a vyhodnotenie celého dostupného zoznamu.
## 1. Príprava kontajnera
Cesty sa nastavia na `login01`. Ak sú klon, obraz a prostredie na Perune už pripravené, nasleduje príprava cache.
```bash
export PROJECT=/mnt/project/perun26012578
export APPHOME=/mnt/home/jascke919/apphome
export PY=/mnt/home/jascke919/aya_train_perun_managed/bin/python
export BENCH="$PROJECT/sk-bench"
export SKBENCH_REVISION=15823bbcc2d995e69441fcb7d34abb61bd8180c5
```
Pri prvej príprave je potrebné stiahnuť SK-bench v revízii pôvodných jobov. [SK-bench](https://github.com/slovak-nlp/sk-bench/tree/15823bbcc2d995e69441fcb7d34abb61bd8180c5)
```bash
git clone https://github.com/slovak-nlp/sk-bench.git "$BENCH"
git -C "$BENCH" checkout --detach "$SKBENCH_REVISION"
mkdir -p "$APPHOME"
```
Obraz Apptainera sa vytvorí na pridelenom CPU uzle. `container/build.sh` uloží `cuda.sif` do `APPHOME`.
```bash
srun --account=perun26012578 --partition=cpu_short \
--nodes=1 --ntasks=1 --cpus-per-task=4 --mem=24G --time=02:00:00 --pty bash
```
```bash
cd "$BENCH"
bash container/build.sh
bash container/shell.sh
```
V kontajneri je potrebné vytvoriť prostredie s Pythonom 3.13 a nainštalovať závislosti z `uv.lock`. V klone SK-bench sa používa jeho vlastný lockfile. Kópie v [`requirements/skbench/`](requirements/skbench/) majú zhodné kontrolné súčty s klonom na Perune.
```bash
curl -LsSf https://astral.sh/uv/install.sh | sh
export PATH="$HOME/.local/bin:$PATH"
export UV_PROJECT_ENVIRONMENT="$VIRTUAL_ENV"
uv venv --python 3.13 "$VIRTUAL_ENV"
uv sync --locked
uv run --locked python -m nltk.downloader punkt_tab wordnet omw-1.4
uv run --locked python --version
```
## 2. Cache základného modelu a datasetov
Zoznam úloh sa skopíruje do klonu SK-bench na hostiteľovi. Na CPU uzle s prístupom na internet sa z toho istého klonu spustí `container/shell.sh`.
```bash
cp "$PROJECT/perun/ministral_3b_aya/sk_bench/tasks_sk0_385.txt" "$BENCH/"
cd "$BENCH"
bash container/shell.sh
```
V kontajneri sa overí účet Hugging Face. Pri prvom prihlásení sa použije `uv run --locked hf auth login`. Pre Slohry, Chiby, Slovak Trivia a Word Analogies treba pod týmto účtom odsúhlasiť podmienky prístupu.
```bash
export UV_PROJECT_ENVIRONMENT="$VIRTUAL_ENV"
unset HF_DATASETS_OFFLINE HF_HUB_OFFLINE
uv run --locked hf auth whoami
uv run --locked python - <<'PYTHON'
from pathlib import Path
from huggingface_hub import snapshot_download
from lighteval.tasks.lighteval_task import LightevalTask
from src.tasks.task_registry import TASK_REGISTRY
snapshot_download(
"ministral/Ministral-3b-instruct",
revision="2c95908929198d6e69af8638f0dbbd9bc6b93f9e",
local_dir="models/ministral-base",
)
tasks = Path("tasks_sk0_385.txt").read_text(encoding="utf-8").splitlines()
assert len(tasks) == len(set(tasks)) == 385
for task in tasks:
name, shots = task.rsplit("|", 1)
config = TASK_REGISTRY.get(name)
if config is None or shots != "0":
raise ValueError(f"Neznámy zero-shot variant {task}")
print(f"Pripravujem {name}", flush=True)
LightevalTask(config).eval_docs()
PYTHON
```
GPU job používa cache z toho istého `APPHOME`. Po príprave sa príkazom `exit` opustí kontajner a podľa potreby aj CPU uzol.
## 3. Zlúčenie adaptéra pre SK-bench
Pôvodný benchmark bežal v klone `sk-bench`. Dotrénovaný model bol vyhodnotený zo samostatného klonu rovnakej revízie. Pre checkpoint z kroku 109 064 sa na `login01` nastavia nasledujúce cesty.
```bash
export RUN="$PROJECT/perun/models/ministral-3b-instruct/runs/full_aya_lr_0p000200_epoch1"
export CHECKPOINT="$RUN/adapter/checkpoint-109064"
export TUNED_SK="$PROJECT/perun/models/ministral-3b-instruct/benchmarks/sk-bench/finetuned_checkpoint_109064/sk-bench"
export BASE_MODEL="$BENCH/models/ministral-base"
export TUNED_MODEL="$TUNED_SK/models/ministral-last-109064"
```
Ak je zlúčený model už uložený, nasleduje evaluácia na GPU. Pri príprave od začiatku je potrebné vytvoriť druhý klon a použiť ten istý [exportný skript](scripts/export_skbench_model.py) ako pri jobe 152979. Skript overí váhy základného modelu proti pripnutej revízii v bežnej Hugging Face cache tréningového účtu. Túto revíziu pripraví krok v [tréningovom návode](README.md#2-príprava-prostredia).
```bash
mkdir -p "$(dirname "$TUNED_SK")"
git clone --local "$BENCH" "$TUNED_SK"
git -C "$TUNED_SK" checkout --detach "$SKBENCH_REVISION"
mkdir -p "$TUNED_SK/models" "$BENCH/logs"
sbatch --job-name=ministral_merge \
--account=perun26012578 --partition=cpu_short \
--nodes=1 --ntasks=1 --cpus-per-task=8 --mem=64G \
--time=02:00:00 --output="$BENCH/logs/ministral_merge_%j.out" \
--wrap='"$PY" -u "$PROJECT/perun/scripts/export_skbench_model.py" \
"$BASE_MODEL" "$CHECKPOINT" "$TUNED_MODEL"'
```
Úspešný job vypíše `MERGED_MODEL_READY` a uloží BF16 váhy so záznamom o použitom checkpointe.
## 4. Vyhodnotenie na GPU
Po príprave cache a zlúčení adaptéra sa z `login01` odošle jeden job na každý model. Pri oboch sa zachová rovnaký zoznam úloh, revízia a identifikátory modelov v JSON výstupoch. [Oficiálne spúšťanie SK-bench cez Slurm](https://github.com/slovak-nlp/sk-bench/blob/15823bbcc2d995e69441fcb7d34abb61bd8180c5/container/slurm/README.md)
```bash
export UV_PROJECT_ENVIRONMENT="$APPHOME/venv"
cp "$BENCH/tasks_sk0_385.txt" "$TUNED_SK/"
for entry in base:ministral-base tuned:ministral-last-109064; do
label=${entry%%:*}
model=${entry#*:}
if [[ $label == base ]]; then workdir=$BENCH; else workdir=$TUNED_SK; fi
mkdir -p "$workdir/logs"
sbatch --job-name="skbench385_$label" \
--account=perun26012578 --partition=gpu_short \
--nodes=1 --ntasks=1 --gres=gpu:1 --cpus-per-task=8 --mem=64G \
--time=04:00:00 --chdir="$workdir" \
--output="$workdir/logs/skbench385_${label}_%j.out" \
--wrap="srun --cpu-bind=none bash container/run-eval.sh models/$model \
--tensor-parallel-size 1 --tasks-file tasks_sk0_385.txt \
--output-dir outputs/skbench385_${label}_\$SLURM_JOB_ID"
done
```
## 5. Agregácia výsledkov
Po dokončení jobov sa zadajú ich ID podľa výpisu Slurmu. Pri agregácii pôvodnej dvojice etáp sa do `raw/` vložia všetky štyri súbory JSON. Oficiálny skript ich spojí podľa `config_general.model_name`.
```bash
cd "$BENCH"
read -r -p "ID jobu pôvodného modelu: " BASE_JOB
read -r -p "ID jobu dotrénovaného modelu: " TUNED_JOB
BASE_JSON=$(find "$BENCH/outputs/skbench385_base_$BASE_JOB" -type f -name 'results_*.json' -print -quit)
TUNED_JSON=$(find "$TUNED_SK/outputs/skbench385_tuned_$TUNED_JOB" -type f -name 'results_*.json' -print -quit)
REPORT=$(mktemp -d "$BENCH/outputs/ministral_leaderboard_XXXXXX")
mkdir "$REPORT/raw"
cp "$BASE_JSON" "$REPORT/raw/base.json"
cp "$TUNED_JSON" "$REPORT/raw/tuned.json"
"$PY" scripts/generate_final_results.py "$REPORT/raw" "$REPORT/aggregated"
"$PY" scripts/generate_leaderboard.py --output-dir "$REPORT" --leaderboard-dir "$REPORT/leaderboard"
```
Agregované súbory JSON sa uložia do `$REPORT/aggregated` a HTML prehľad do `$REPORT/leaderboard/index.html`. Porovnanie a Overall podľa metrík verejného SK-bench Space sú v [dokumentácii experimentu](ministral_3b_aya/README.md#čiastočné-výsledky-sk-bench).