ctx256k.sh 2.45 KB
#!/usr/bin/env bash
# 把 llm38 的单请求上下文从 32K 提到 256K(模型原生上限)。
# 手法:--parallel 4 --ctx-size 131072  →  --parallel 2 --ctx-size 524288
# 旧容器改名保留而非删除,起不来就秒退回去。
set -uo pipefail
NEWCTX=524288; NEWPAR=2

echo "[1/4] 备份旧容器(改名保留,不删)"
docker rm -f llm38_prev 2>/dev/null
docker stop llm38 >/dev/null && docker rename llm38 llm38_prev
echo "  旧容器已停并改名 llm38_prev  $(date '+%H:%M:%S')"

rollback() {
  echo "❌ 新配置未就绪,回滚到 32K"
  docker rm -f llm38 2>/dev/null
  docker rename llm38_prev llm38 && docker start llm38
  for i in $(seq 1 60); do
    curl -sf http://127.0.0.1:8000/health >/dev/null 2>&1 && { echo "  ✅ 已回滚就绪 $(date '+%H:%M:%S')"; exit 1; }
    sleep 5
  done
  echo "  ⚠️ 回滚后仍未就绪,人工介入:docker logs llm38"; exit 2
}

echo "[2/4] 起新容器 parallel=$NEWPAR ctx-size=$NEWCTX(单请求 $((NEWCTX/NEWPAR/1024))K)"
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 $NEWCTX --no-context-shift \
  --batch-size 2048 --ubatch-size 512 \
  --parallel $NEWPAR --jinja --seed 3407 \
  --temp 1.0 --top-p 0.95 --top-k 20 --min-p 0.0 --presence-penalty 0.0 \
  || rollback

echo "[3/4] 等待就绪(KV 变大,分配比之前慢;最多 8 分钟)"
for i in $(seq 1 96); do
  if ! docker ps --format '{{.Names}}' | grep -qx llm38; then
    echo "  容器退出了,尾部日志:"; docker logs --tail 25 llm38 2>&1; rollback
  fi
  if curl -sf http://127.0.0.1:8000/health >/dev/null 2>&1; then
    echo "  ✅ 就绪于第 $((i*5)) 秒  $(date '+%H:%M:%S')"; break
  fi
  [ "$i" = 96 ] && { docker logs --tail 25 llm38 2>&1; rollback; }
  sleep 5
done

echo "[4/4] 实际生效值"
docker logs llm38 2>&1 | grep -E "n_ctx_slot|n_slots" | tail -2
nvidia-smi --query-gpu=index,memory.used,memory.free --format=csv,noheader
echo "旧容器 llm38_prev 保留着,确认没问题后 docker rm llm38_prev"