#!/usr/bin/env bash
# Замер 30b-a3b MoE через llama-server с офлоадом экспертов на CPU (--n-cpu-moe / --cpu-moe).
# Сравнение с ollama (дал ~10 tok/s). Использование: bash eval/llama_moe_bench.sh [NCMOE]
#   NCMOE пусто → --cpu-moe (все эксперты на CPU); число → --n-cpu-moe N (первые N слоёв).
set -u
BIN=/home/ubuntu/llama.cpp/build/bin/llama-server
GGUF=/home/ubuntu/.ollama/models/blobs/sha256-11b3b371aedb6c43d438ec010e66f9dfaa92127d64c22499891d9013ab7a6ee6
PORT=8080
LOG=/home/ubuntu/llama-moe.log
export NO_PROXY="localhost,127.0.0.1" no_proxy="localhost,127.0.0.1"
NCMOE_ARG="--cpu-moe"
[ $# -ge 1 ] && NCMOE_ARG="--n-cpu-moe $1"

pkill -f "llama-server" 2>/dev/null || true; sleep 2
echo "== старт llama-server: -ngl 99 $NCMOE_ARG (лог $LOG) =="
setsid nohup "$BIN" -m "$GGUF" -ngl 99 $NCMOE_ARG -c 8192 -fa on \
  --host 127.0.0.1 --port $PORT --no-webui >"$LOG" 2>&1 < /dev/null &

# ждём готовности (загрузка 18GB весов — до ~90с)
for _ in $(seq 1 180); do
  curl -s --noproxy '*' --max-time 1 "http://127.0.0.1:$PORT/health" 2>/dev/null | grep -q '"ok"' && break
  sleep 1
done
if ! curl -s --noproxy '*' --max-time 2 "http://127.0.0.1:$PORT/health" | grep -q '"ok"'; then
  echo "СЕРВЕР НЕ ПОДНЯЛСЯ:"; tail -15 "$LOG"; exit 1
fi
echo "== VRAM после загрузки =="; nvidia-smi --query-gpu=memory.used --format=csv,noheader

# Нарезка ПОСИМВОЛЬНО (не head -c — тот режет по байтам и рубит иероглиф → битый JSON)
BODY=$(/home/ubuntu/projects/textmachine/eval/.venv/bin/python -c '
import json
sys_p = "Ты профессиональный литературный переводчик с китайского на русский. Переведи фрагмент, сохрани все предложения. Выведи только перевод."
frag = open("/home/ubuntu/projects/textmachine/eval/data/samples/zh/luxun-zhufu.txt", encoding="utf-8").read()[:1500]
print(json.dumps({"model":"local","temperature":0.3,"max_tokens":2000,
  "messages":[{"role":"system","content":sys_p},{"role":"user","content":frag}]}))')

echo "== генерация (zh→ru, 1500 знаков) =="
curl -s --noproxy '*' --max-time 600 "http://127.0.0.1:$PORT/v1/chat/completions" \
  -H "Content-Type: application/json" -d "$BODY" > /home/ubuntu/llama-moe-resp.json
echo "-- tok/s из лога llama-server --"; grep -iE "prompt eval time|eval time|tokens per second" "$LOG" | tail -6
echo "-- первые 400 симв. перевода --"
/home/ubuntu/projects/textmachine/eval/.venv/bin/python -c "import json; print(json.load(open('/home/ubuntu/llama-moe-resp.json'))['choices'][0]['message']['content'][:400])"
pkill -f "llama-server" 2>/dev/null || true
