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