#!/usr/bin/env bash # Modell-Bench (Autonomie-Plan E5): misst pp/tg eines GGUF auf separatem Port, ohne die # Live-Instanzen anzufassen. Grundlage der Modell-Selbst-Evaluation (Radar-Kandidaten). # Nutzung: bash model-bench.sh [extra llama-server-flags, z.B. --mmproj ...] # Lehren vom 02.07.2026 eingebaut: python via Heredoc (kein f-String-Quoting-Bruch), # Warmlauf vor der Messung, LOAD-CRASH wird gemeldet statt still zu hängen. set -u MODEL="${1:?Nutzung: model-bench.sh [extra-flags]}" shift || true EXTRA="$*" BIN="${BENCH_BIN:-/opt/llamacpp-vulkan/llama-server}" PORT="${BENCH_PORT:-5899}" CTX="${BENCH_CTX:-32768}" echo "=== Bench: $(basename "$MODEL") (ctx $CTX${EXTRA:+, $EXTRA}) ===" $BIN -m "$MODEL" --host 127.0.0.1 --port "$PORT" -c "$CTX" -ngl 999 -fa on --no-mmap --jinja $EXTRA \ >/tmp/model-bench-server.log 2>&1 & PID=$! trap 'kill $PID 2>/dev/null; wait $PID 2>/dev/null' EXIT for i in $(seq 1 240); do curl -s --max-time 2 "http://127.0.0.1:$PORT/health" | grep -q ok && break sleep 2 kill -0 $PID 2>/dev/null || { echo "LOAD-CRASH:"; tail -3 /tmp/model-bench-server.log; exit 1; } done probe() { curl -s --max-time 300 -X POST "http://127.0.0.1:$PORT/completion" -H "Content-Type: application/json" \ -d '{"prompt":"Erklaere in fuenf Saetzen, wie ein Backup-Konzept fuer einen Homeserver aussieht.","n_predict":200,"temperature":0}' \ > /tmp/model-bench-probe.json python3 - <<'PY' import json t = json.load(open("/tmp/model-bench-probe.json")).get("timings", {}) print(f" pp={t.get('prompt_per_second',0):.0f} t/s · tg={t.get('predicted_per_second',0):.1f} t/s" + (f" · draft {t.get('draft_n_accepted')}/{t.get('draft_n')}" if t.get('draft_n') else "")) PY } probe >/dev/null 2>&1 # Warmlauf (Shader-/Graph-Compile nicht mitmessen) probe probe echo "BENCH_DONE"