TerslerThe little junk rig that could

#Keeping up with upstream

The Pascal/P100 llama.cpp scene moves fast: forks get new branches, speculative-decoding modes change flags, and models get re-quantized. Hardware support, on the other hand, is frozen: driver R580 and CUDA 12.x are the end of the line for Pascal. Tersler handles this with three pieces:

  1. Pin everything. install/tersler.conf pins the fork, branch, commit, driver package, CUDA toolkit and launch flags. The installer holds the driver package (apt-mark hold) and pins NVIDIA-repo drivers out, so nothing changes behind your back.
  2. Detect changes. scripts/check-updates.sh (installed as tersler-check-updates) reports:

    • new commits on the fork beyond the pin, with the commit log
    • new branches on the fork
    • changes in the other repos in install/upstreams.list
    • new GitHub repos matching P100/Pascal searches
    • driver and CUDA package updates (on the rig)
    • model repo updates on Hugging Face (MODEL_HF_REPO)

    It exits with code 10 when something is new, so it works in cron or a systemd timer.

  3. Try, measure, then switch. Builds are versioned side by side under /opt/tersler/builds/<commit>. current points to the active build, and previous keeps the last one.

#Workflow

# 1. what's new?
tersler-check-updates -o ~/tersler-updates/$(date +%F).md

# 2. build the candidate next to the current one (doesn't touch the running server)
sudo systemctl stop tersler-llama           # two models don't fit in VRAM
LLAMA_COMMIT=<new-commit> sudo -E ./install/install.sh build
#    the build stage switches `current` to it, so remember the old one:
ls -l /opt/tersler/previous
#    a full build takes ~25 min and ~1.3 GB (fork's BUILD.md)

# 2b. correctness first: the fork ships a gate (decode bench, perplexity, FA op tests).
#     Check its usage in the source tree, it may expect its own build dir:
less /opt/tersler/src/llama.cpp/p100-docs/BUILD.md     # section "Verify"
#     expected per the fork: perplexity ≈ 2.610 (band 2.6209 ± 0.0199); tg256 ≈ 32 t/s cold
#     a change can pass all op tests and still produce NaN in real inference
#     (perplexity catches that), so never skip this step.

# 3. compare: same model, prompts and settings
tersler-bench /opt/tersler/previous
tersler-bench /opt/tersler/current
column -s, -t < /opt/tersler/bench/results.csv | tail -12

# 4a. keep it: pin the new commit in install/tersler.conf, commit to git
# 4b. roll back:
sudo ln -sfn "$(readlink -f /opt/tersler/previous)" /opt/tersler/current

sudo systemctl start tersler-llama

#Automating the check

On the rig, a weekly user timer:

mkdir -p ~/.config/systemd/user
cat > ~/.config/systemd/user/tersler-updates.service <<'EOF'
[Service]
Type=oneshot
ExecStart=/bin/sh -c '/opt/tersler/bin/tersler-check-updates -o %h/tersler-updates/latest.md || [ $? -eq 10 ]'
EOF
cat > ~/.config/systemd/user/tersler-updates.timer <<'EOF'
[Timer]
OnCalendar=weekly
Persistent=true
[Install]
WantedBy=timers.target
EOF
systemctl --user enable --now tersler-updates.timer

The script can't judge whether a change is good. For that, read the commit log, benchmark, and record the result in changelog.md.

#Hard limits (don't "upgrade" past these)

ComponentLimitWhy
NVIDIA driverR580 branchthe last branch with Pascal support
Kernel modulesproprietary, not -openthe open modules don't support Pascal
CUDA12.xCUDA 13 dropped Pascal
llama.cpp buildCMAKE_CUDA_ARCHITECTURES=60 onlya second architecture disables the fork's Pascal tuning
Ubuntu24.04 LTSR580 + CUDA 12.9 are packaged for it; check before moving to a newer release

#Notes from the fork's BUILD.md (read 2026-11-03)