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