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