textmachine/eval/llama_moe_bench.sh

43 lines
2.8 KiB
Bash
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/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