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

7.4 KiB

SK-bench na Perune

Oba Ministraly sa hodnotia na rovnakom zozname 385 slovenských zero-shot variantov. 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.

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

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.

srun --account=perun26012578 --partition=cpu_short \
  --nodes=1 --ntasks=1 --cpus-per-task=4 --mem=24G --time=02:00:00 --pty 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/ majú zhodné kontrolné súčty s klonom na Perune.

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.

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.

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.

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 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.

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

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.

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.