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.