#!/usr/bin/env bash
# DeepSeek-V4.1-Flash UNCENSORED-FP8 (dealignai) on 4x RTX PRO 6000 (SM120), SGLang dsv41 image.
# TP4 needs --ep-size 4 (moe_intermediate 2304/4=576 is not a multiple of 128).
# SM120 needs --enable-deepseek-v4-fp4-indexer (else decode indexer metadata is None -> crash)
# and the extra-KV page-split patch (patch_sm120_extra_split.py) for prefill > 64 tokens.
set -euo pipefail
MODEL=${MODEL:-/workspace/models/DeepSeek-V4.1-Flash-UNCENSORED-FP8}
CTX=${CTX:-262144}
LOG=${LOG:-/workspace/serve.log}

export PATH=$(dirname "$(command -v ninja || echo /usr/local/bin/ninja)"):$PATH
export SGLANG_ENABLE_DSV41_ENGRAM_HOST_TABLE=1   # ~200 GB Engram tables in host RAM (sharded per TP rank)
export SGLANG_SM120_FLASHMLA_BACKEND=${SGLANG_SM120_FLASHMLA_BACKEND:-flashinfer}
export PYTORCH_CUDA_ALLOC_CONF=expandable_segments:True
export SGLANG_DEFAULT_THINKING=true

nohup python3 -m sglang.launch_server \
  --model-path "$MODEL" \
  --served-model-name deepseek-v4.1-flash-crack \
  --tp-size 4 --ep-size 4 \
  --host 0.0.0.0 --port 30000 \
  --context-length "$CTX" \
  --mem-fraction-static ${MEMFRAC:-0.85} \
  --max-running-requests ${MAXREQ:-16} \
  --chunked-prefill-size 4096 \
  --reasoning-parser deepseek-v41 --tool-call-parser deepseekv41 \
  --enable-deepseek-v4-fp4-indexer \
  --fp8-gemm-backend flashinfer_cutlass \
  --enable-decoder-swa-bounded-replay \
  --trust-remote-code \
  ${API_KEY:+--api-key "$API_KEY"} \
  ${EXTRA_ARGS:-} > "$LOG" 2>&1 &
echo "launched sglang pid $! -> $LOG"
