| # Qwen SpeedLab β Common configuration | |
| # RTX 3090 24GB VRAM optimized | |
| # | |
| # Two inference engines available: | |
| # 1. BeeLlama.cpp (Anbeeld) β DFlash + TurboQuant | |
| # 2. TurboQ-MTP (Indras-Mirror) β TBQ4 fused FA + RotorQuant + MTP + tensor sharing | |
| # | |
| # Two model variants: | |
| # 1. batiai (standard GGUF, no MTP heads) β baseline, DFlash | |
| # 2. ManniX (MTP-enabled GGUF, blk.64.nextn.* preserved) β MTP self-spec | |
| set -euo pipefail | |
| # βββ Engine paths ββββββββββββββββββββββββββββββββββββββββββ | |
| BEELLAMA_DIR="/workspace/beellama.cpp" | |
| TURBOQ_DIR="/workspace/llama.cpp-turboq-mtp" | |
| # Default to TurboQ-MTP (more features: RotorQuant, tensor sharing, TBQ4 fused FA) | |
| ENGINE="${ENGINE:-turboq}" | |
| if [ "${ENGINE}" = "beellama" ]; then | |
| LLAMA_SERVER="${BEELLAMA_DIR}/build/bin/llama-server" | |
| LLAMA_CLI="${BEELLAMA_DIR}/build/bin/llama-cli" | |
| LLAMA_BENCH="${BEELLAMA_DIR}/build/bin/llama-bench" | |
| else | |
| LLAMA_SERVER="${TURBOQ_DIR}/build/bin/llama-server" | |
| LLAMA_CLI="${TURBOQ_DIR}/build/bin/llama-cli" | |
| LLAMA_BENCH="${TURBOQ_DIR}/build/bin/llama-bench" | |
| fi | |
| # βββ Model files βββββββββββββββββββββββββββββββββββββββββββ | |
| MODELS_DIR="/workspace/models" | |
| # Standard GGUF (no MTP heads) β for baseline & DFlash | |
| TARGET_MODEL="${MODELS_DIR}/batiai-qwen36-27b/Qwen-Qwen3.6-27B-Q4_K_M.gguf" | |
| # MTP-enabled GGUF (blk.64.nextn.* preserved at Q8_0) β for self-spec | |
| MTP_MODEL="${MODELS_DIR}/mannix-mtp-qwen36-27b/Qwen3.6-27B-Omnimerge-v4-Q4_K_M.gguf" | |
| # DFlash draft model (block diffusion spec decode) | |
| DFLASH_DRAFT="${MODELS_DIR}/dflash/Qwen3.6-27B-DFlash-Q4_K_M.gguf" | |
| # Multimodal projector (optional) | |
| MMPROJ="${MODELS_DIR}/batiai-qwen36-27b/mmproj-Qwen-Qwen3.6-27B-BF16.gguf" | |
| # βββ GPU Configuration βββββββββββββββββββββββββββββββββββββ | |
| GPU_LAYERS=99 | |
| BATCH_SIZE=2048 | |
| UBATCH_SIZE=512 | |
| # βββ KV Cache ββββββββββββββββββββββββββββββββββββββββββββββ | |
| CTX_SIZE=102400 | |
| # βββ Server ββββββββββββββββββββββββββββββββββββββββββββββββ | |
| HOST="0.0.0.0" | |
| PORT=8082 | |
| N_PARALLEL=1 | |
| # βββ Logging βββββββββββββββββββββββββββββββββββββββββββββββ | |
| LOG_DIR="/workspace/logs" | |
| mkdir -p "${LOG_DIR}" | |
| log() { | |
| echo "[$(date '+%Y-%m-%d %H:%M:%S')] $*" | tee -a "${LOG_DIR}/qwen-speedlab.log" | |
| } | |
| wait_for_server() { | |
| local port=${1:-$PORT} | |
| local max_wait=${2:-60} | |
| local waited=0 | |
| log "Waiting for server on port ${port}..." | |
| while ! curl -s "http://localhost:${port}/health" > /dev/null 2>&1; do | |
| sleep 1 | |
| waited=$((waited + 1)) | |
| if [ $waited -ge $max_wait ]; then | |
| log "ERROR: Server did not start within ${max_wait}s" | |
| return 1 | |
| fi | |
| done | |
| log "Server is ready! (took ${waited}s)" | |
| } | |