#!/bin/bash
# run_vk.sh - llama.cpp Vulkan benchmark driver (KV cache q8_0, then f16), as used for the numbers on the site.
# Usage:     L=/path/to/llama-b11177 MODEL=/path/to/qwen3-14b-Q4_K_M.gguf ./run_vk.sh      (bench.py in the same folder)
#            optional: LLAMA_SERVICE=<user systemd unit that holds the GPU> SVC_PORT=<its port> (stopped, then restarted)
# Needs:     llama.cpp b11177 Vulkan build, Qwen3 14B Q4_K_M GGUF, python3 + requests, curl, rocm-smi (VRAM readout only).
# Protocol:  1 warm-up + 7 passes per context (1k, 4k, 8k, 16k, 30k), seed 42, 256 tokens generated (ignore_eos),
#            prompt cache disabled, --ctx-size 32768 --n-gpu-layers 99 --flash-attn on, --device Vulkan0, port 8081.
# Outputs:   vk_res_<kv>.json, vk_bench_<kv>.log, vk_server_<kv>.log, vk_idle_vram_<kv>.txt, vk_baseline_vram.txt (in $D).
# Tested on: Ubuntu 24.04, AMD RX 9070 XT 16 GB, Mesa 25.2.8 RADV, llama.cpp b11177 (commit 1ab7e5ad2,
#            official ggml-org archive), Qwen3 14B Q4_K_M. Vulkan0 = the RX 9070 XT, Vulkan1 = the iGPU.
# Teste q8_0 puis f16 sur le port 8081. Si LLAMA_SERVICE est défini, ce service est arrêté pendant le test puis relancé (trap) et /health vérifié.
D="${D:-$(cd "$(dirname "$0")" && pwd)}"   # dossier de travail : bench.py, journaux, résultats
L="${L:-$HOME/llama-b11177}"   # dossier du build llama.cpp Vulkan b11177 (archive officielle)
MODEL="${MODEL:-$HOME/models/qwen3-14b-Q4_K_M.gguf}"
SVC="${LLAMA_SERVICE:-}"   # unité systemd utilisateur à arrêter pendant le test (optionnel) ; SVC_PORT = son port
export LD_LIBRARY_PATH=$L
restore() {
  [ -n "$SPID" ] && kill $SPID 2>/dev/null && wait $SPID 2>/dev/null
  [ -n "$SVC" ] || return 0
  systemctl --user start "$SVC"
  for i in $(seq 1 60); do curl -sf localhost:${SVC_PORT:-8080}/health && break; sleep 2; done; echo
  systemctl --user is-active "$SVC"
}
trap restore EXIT
[ -n "$SVC" ] && { systemctl --user stop "$SVC"; sleep 5; }
rocm-smi --showmeminfo vram | grep -E 'GPU\[0\].*Used' | tee $D/vk_baseline_vram.txt
for KV in q8_0 f16; do
  $L/llama-server --model "$MODEL" --alias qwen3:14b \
    --ctx-size 32768 --n-gpu-layers 99 --flash-attn on --cache-type-k $KV --cache-type-v $KV \
    --device Vulkan0 --host 127.0.0.1 --port 8081 > $D/vk_server_$KV.log 2>&1 &
  SPID=$!
  for i in $(seq 1 120); do curl -sf localhost:8081/health >/dev/null && break; kill -0 $SPID 2>/dev/null || break; sleep 2; done
  if curl -sf localhost:8081/health >/dev/null; then
    rocm-smi --showmeminfo vram | grep -E 'GPU\[0\].*Used' > $D/vk_idle_vram_$KV.txt
    python3 $D/bench.py 8081 $KV $D/vk_res_$KV.json 2>&1 | tee $D/vk_bench_$KV.log
  else echo "SERVEUR $KV NON DEMARRE" | tee $D/vk_bench_$KV.log; fi
  kill $SPID 2>/dev/null; wait $SPID 2>/dev/null; SPID=; sleep 5
done
