cutover.sh 1.59 KB
#!/bin/bash
# Qwen3.6 -> Qwen3.8 串行切换。失败请跑 restore.sh
set -e
M=/data/models/Qwen/Qwen3.8-27B-GGUF/Qwen3.8-27B-Q5_K_M.gguf
E=20752787040

echo "[G3] 校验模型完整性..."
SZ=$(stat -c %s "$M")
[ "$SZ" = "$E" ] || { echo "❌ 字节数不符: $SZ != $E,中止"; exit 1; }
echo "  ✅ $SZ 字节,完整"

echo "[1/3] 停止 Qwen3.6 (llm)... 中断从此刻开始"
date '+%H:%M:%S'
docker stop llm

echo "[2/3] 启动 Qwen3.8 (llm38) 于 8000..."
docker rm -f llm38 2>/dev/null || true
mkdir -p /data/nvcache38 2>/dev/null || true
docker run -d \
  --name llm38 \
  --restart unless-stopped \
  --gpus all \
  -p 8000:8000 \
  -v /data/models:/jsxc \
  -v /data/nvcache38:/root/.nv \
  -e GGML_CUDA_DISABLE_GRAPHS=1 \
  -e CUDA_CACHE_MAXSIZE=2147483648 \
  --health-cmd "curl -fsS http://localhost:8000/health || exit 1" \
  --health-interval 30s --health-timeout 5s \
  --health-retries 3 --health-start-period 600s \
  llamacpp:b10481 \
  -m /jsxc/Qwen/Qwen3.8-27B-GGUF/Qwen3.8-27B-Q5_K_M.gguf \
  --alias qwen3.8-27b \
  --host 0.0.0.0 --port 8000 \
  -ngl 99 -sm layer -fa on \
  --ctx-size 131072 --no-context-shift \
  --batch-size 2048 --ubatch-size 512 \
  --parallel 4 --jinja --seed 3407 \
  --temp 1.0 --top-p 0.95 --top-k 20 --min-p 0.0 --presence-penalty 0.0

echo "[3/3] 等待就绪(首次含 JIT 编译,最多 10 分钟)..."
for i in $(seq 1 60); do
  if curl -sf http://127.0.0.1:8000/health >/dev/null 2>&1; then
    echo "  ✅ 就绪于第 $((i*10)) 秒"; date '+%H:%M:%S'; exit 0
  fi
  sleep 10
done
echo "❌ 超时未就绪。查 docker logs llm38;回滚跑 restore.sh"; exit 1