| # Gemma 4 12B Unified. GPU util 0.15 (~18.3GiB of 121.7GiB). Never above 0.85. | |
| # BF16 weights ~23GB cannot fit; FP8 ~12.5GB + KV in the rest. | |
| set -euo pipefail | |
| MODEL="${RECEIPT_GEMMA_PATH:-$HOME/models-gemma4-12b-it}" | |
| NAME="${RECEIPT_LLM_MODEL:-google/gemma-4-12B-it}" | |
| HOST="${RECEIPT_VLLM_HOST:-0.0.0.0}" | |
| PORT="${RECEIPT_VLLM_PORT:-8080}" | |
| # User-set 0.15. Fleet hard cap 0.85. | |
| UTIL="${RECEIPT_GPU_MEMORY_UTILIZATION:-0.15}" | |
| MAX_LEN="${RECEIPT_VLLM_MAX_MODEL_LEN:-8192}" | |
| if [[ ! -f "$MODEL/config.json" ]]; then | |
| echo "Gemma checkpoint not found: $MODEL" >&2 | |
| exit 1 | |
| fi | |
| python3 - "$UTIL" <<'PY' | |
| import sys | |
| util = float(sys.argv[1]) | |
| if util > 0.85: | |
| raise SystemExit(f"gpu_memory_utilization {util} > 0.85 hard cap") | |
| print(f"util={util:.4f} pool~{util*121.69:.1f}GiB of 121.7GiB") | |
| print("context: max-model-len default 8192 (receipts). KV estimate at 0.15:") | |
| print(" conservative (48-layer full attn fp16): ~12k tokens") | |
| print(" hybrid (8 full + 40 sliding-1024): ~65k tokens") | |
| print(" model native max_position_embeddings: 262144 (not reachable at 0.15)") | |
| PY | |
| exec vllm serve "$MODEL" \ | |
| --served-model-name "$NAME" \ | |
| --host "$HOST" \ | |
| --port "$PORT" \ | |
| --gpu-memory-utilization "$UTIL" \ | |
| --max-model-len "$MAX_LEN" \ | |
| --max-num-seqs 2 \ | |
| --max-num-batched-tokens 2048 \ | |
| --quantization fp8 \ | |
| --enforce-eager | |