#!/usr/bin/env bash set -euo pipefail # Recipe commands: commands-DGX Spark | 128GB unified memory | [Qwen3.8 Flash-Next].md NAME="vllm-spark-128gb-qwen38-flash-next" PORT=8000 HF_CACHE_DIR="${HF_HOME:-$HOME/.cache/huggingface}" CONTAINER_ID="" WAITER="" STATUS_FILE="$(mktemp)" cleanup() { local status=$? trap - EXIT if [[ -n "${WAITER}" ]]; then kill "${WAITER}" >/dev/null 2>&1 || true wait "${WAITER}" >/dev/null 2>&1 || true fi if [[ -n "${CONTAINER_ID}" ]]; then docker stop "${CONTAINER_ID}" >/dev/null 2>&1 || true docker rm "${CONTAINER_ID}" >/dev/null 2>&1 || true fi rm -f "${STATUS_FILE}" exit "${status}" } trap cleanup EXIT trap 'exit 130' INT trap 'exit 143' TERM trap 'exit 129' HUP mkdir -p "${HF_CACHE_DIR}" "$HOME/.cache/vllm" \ "$HOME/.cache/flashinfer" "$HOME/.triton" "$HOME/.cache/b12x" docker rm -f "${NAME}" >/dev/null 2>&1 || true CONTAINER_ID="$(docker run -d \ --name "${NAME}" \ --gpus all \ --ipc host \ --network host \ --shm-size=16g \ --ulimit memlock=-1 \ --ulimit stack=67108864 \ --security-opt seccomp=unconfined \ --security-opt apparmor=unconfined \ --entrypoint "" \ -e "HF_TOKEN=${HF_TOKEN:-}" \ -v "${HF_CACHE_DIR}:/root/.cache/huggingface" \ -v "$HOME/.cache/vllm:/root/.cache/vllm" \ -v "$HOME/.cache/flashinfer:/root/.cache/flashinfer" \ -v "$HOME/.triton:/root/.triton" \ -v "$HOME/.cache/b12x:/root/.cache/b12x" \ -e VLLM_PLE_TABLE_MEMORY=disk \ -e B12X_DISK_BACKEND=io_uring \ -e CUTE_DSL_ARCH=sm_121a \ -e SAFETENSORS_FAST_GPU=1 \ -e VLLM_WORKER_MULTIPROC_METHOD=spawn \ -e VLLM_SSM_CONV_STATE_LAYOUT=DS \ -e VLLM_USE_AOT_COMPILE=1 \ -e VLLM_USE_MEGA_AOT_ARTIFACT=1 \ -e VLLM_USE_V2_MODEL_RUNNER=1 \ -e B12X_POLICY_MODE=auto \ -e VLLM_MXFP8_LM_HEAD=1 \ -e VLLM_B12X_MOE_FP4_LAYER_MAX_INPUT_SCALE=w13 \ -e VLLM_B12X_MOE_FP4_FORCE_A16=1 \ -e B12X_W4A16_A4_PREFILL=1 \ eugr/spark-vllm-b12x:nightly-20261015 \ vllm serve nvidia/Qwen3.8-Flash-Next-FP4-Local \ --host 127.0.0.1 \ --port "${PORT}" \ --tensor-parallel-size 1 \ --pipeline-parallel-size 1 \ --mamba-cache-mode align \ --enable-prefix-caching \ --enable-chunked-prefill \ --dtype bfloat16 \ --kv-cache-dtype fp8 \ --quantization modelopt_mixed \ --block-size 16 \ --load-format b12x \ --max-model-len 262144 \ --max-num-seqs 8 \ --max-num-batched-tokens 4096 \ --speculative-config '{"method":"mtp","num_speculative_tokens":4}' \ --gdn-decode-kernel b12x \ --linear-backend b12x \ --moe-backend b12x \ --no-enable-flashinfer-autotune \ --mm-encoder-tp-mode data \ --reasoning-parser qwen3 \ --tool-call-parser qwen3_xml \ --enable-auto-tool-choice \ --compilation-config '{"pass_config":{"fuse_act_quant":true}}' \ --gpu-memory-utilization 0.8)" # Keep this script running so Sync can stop the container when the app closes. docker wait "${CONTAINER_ID}" > "${STATUS_FILE}" & WAITER=$! wait "${WAITER}" WAITER="" STATUS="$(<"${STATUS_FILE}")" if [[ ! "${STATUS}" =~ ^[0-9]+$ ]]; then printf 'Could not read the container exit status.\n' >&2 exit 1 fi exit "${STATUS}"