- Model: hugypufy/Swift-Qwen3.8-27B-PARO-MXFP6 (25.16 GiB, 18 shards, quant_method=paroquant_mxfp6, bits=6, group_size=128, krot=8, rotation on) - Image: ggz14/vllm-radiance-mxfp4:0.13.0-e060895 (PR #51 launch6_p kernel, built on the published 0.9.3 base; docker->podman via save/load) - GPU_UTIL 0.98 -> 0.99 (user request); KV_DTYPE=auto (unquantized bf16) - Entrypoint: mxfp6 branch (17 patches + paroquant kernel compile + sitecustomize registration); GPU_UTIL default for set -u robustness - Quadlet: SNAP/GPU_UTIL/Image/cache updated; new mxfp6 cache dir - deploy-remote.sh: R4D gate + paroquant_mxfp6; new image/SNAP/cache defaults - Chat template: Qwen-Sharp v22.5.0 (peculiar-ragdoll); v22.4.0 kept as rollback - Test 168: dflash branch comment quant-aware (mxfp4 + paroquant_mxfp6) - Runbook: MXFP6 active shape, MXFP4 rollback MXFP4 checkpoint remains on disk as the rollback target.
363 lines
19 KiB
Bash
Executable File
363 lines
19 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
# frank-medium container entrypoint: vllm-radiance on 2x Radeon AI PRO R9700
|
|
# (gfx1201). Quantization-aware (config.json quant_method): fp8 -> the plain
|
|
# FP8 path; mxfp4/quark -> the MXFP4 patch-and-serve path; paroquant_mxfp6 ->
|
|
# the ParoQuant W4A8 stack + the MXFP6 kernels (PR #51's launch6_p path).
|
|
#
|
|
# This is a fork of the patch-and-serve block inside radiance-vllm-mxfp4's
|
|
# serve-mxfp4.sh (clone at /home/dank/GitPackages/radiance-vllm-mxfp4, pinned
|
|
# commit 9735329348ae1c9319f01cbe5f7004ec5f4dba63). The published image alone
|
|
# is NOT sufficient for this model: the shipped libr4d predates the
|
|
# gated-delta-net overflow fix and NaNs the output, and the MXFP4 gates need
|
|
# relaxing, so the repo's patches are applied at every container start from
|
|
# the /patches mount. It runs INSIDE the container (executed as the image
|
|
# command by the frank-medium quadlet); the launcher's host-side GPU/TP/KV
|
|
# detection is not needed here because this fleet is fixed 2x gfx1201 and the
|
|
# KV pin is pinned explicitly in the quadlet.
|
|
#
|
|
# KEEP IN SYNC: if the radiance clone is updated, re-diff this file against
|
|
# the new serve-mxfp4.sh container command and against the DRY_RUN output.
|
|
#
|
|
# Env contract: every knob below is ${VAR:-default}; the quadlet sets the
|
|
# fleet-specific ones (SNAP, PORT, SERVED_NAMES, TP, KV_MEM, ...).
|
|
set -euo pipefail
|
|
|
|
# ---------------------------------------------------------------- serving shape
|
|
: "${SNAP:=/models/Qwen3.8-27B-Uncensored-MXFP4-awq}"
|
|
: "${DRAFTER:=/models/Qwen3.8-27B-DFlash2-FP8}"
|
|
: "${CHAT_TEMPLATE:=/patches/qwen-fixed-v22.3.jinja}"
|
|
: "${PORT:=7770}"
|
|
: "${SERVED_NAMES:=frank-medium}"
|
|
: "${MAXLEN:=262144}"
|
|
: "${MAXSEQS:=8}"
|
|
# KV_MEM=0 is passed THROUGH as --kv-cache-memory 0, which the image's
|
|
# patched KV sizing reads as "profile the shape" (the launcher's rule).
|
|
# Blanking the variable instead omits the flag and makes vLLM size the cache
|
|
# from --gpu-memory-utilization alone: measured on the single-GPU replicas
|
|
# that overshoots and the allocation dies with torch.OutOfMemoryError right
|
|
# after the weights load (2.16 GiB requested, 116 MiB free). Do not "fix"
|
|
# this into an empty expansion.
|
|
: "${KV_MEM:=18563072000}" # shipped kv-profiles.tsv row 2x7551-32624 @ 8/8192/262144/dflash
|
|
: "${KV_DTYPE:=fp8}" # fp8 = quantized KV (2x the tokens); auto = bf16 KV (half the pool)
|
|
: "${SPEC_METHOD:=dflash}"
|
|
if [ "$SPEC_METHOD" = dflash ]; then : "${SPEC:=7}"; else : "${SPEC:=4}"; fi
|
|
: "${MIN_M:=0}" # 0 = the W4A8 kernel serves every M (MIN_M=1 still routes M=1 to aiter)
|
|
: "${R4D_ATTN:=1}"
|
|
: "${ASYNC:=0}"
|
|
: "${GPU_UTIL:=0.99}"
|
|
|
|
# Quantization-aware: read the model's weight quantization from config.json.
|
|
# fp8 -> the plain FP8 path (no MXFP4 patches, --quantization=fp8, MTP
|
|
# self-speculation, ROCM_AITER unified attention with the R4D all-reduce).
|
|
# mxfp4/quark (or unknown) -> the MXFP4 patch-and-serve path (the default).
|
|
QUANT="$(python3 -c 'import json,sys;print(json.load(open(sys.argv[1])).get("quantization_config",{}).get("quant_method",""))' "$SNAP/config.json" 2>/dev/null || true)"
|
|
IS_MXFP6=0
|
|
case "$QUANT" in
|
|
fp8) IS_MXFP4=0 ;;
|
|
paroquant_mxfp6) IS_MXFP4=1; IS_MXFP6=1 ;;
|
|
mxfp4|quark|"") IS_MXFP4=1 ;;
|
|
*) IS_MXFP4=1; echo "[radiance] WARNING: quantization '$QUANT'; defaulting to the MXFP4 path" >&2 ;;
|
|
esac
|
|
# MXFP6 (ParoQuant) requires TP>=2 (rad_require_tp2 in the canonical launcher);
|
|
# ${TP:-1} keeps the check set -u safe when the quadlet omits TP.
|
|
if [ "$IS_MXFP6" = "1" ]; then
|
|
[ "${TP:-1}" -ge 2 ] || { echo "frank-medium: paroquant_mxfp6 requires TP>=2 (got ${TP:-1})" >&2; exit 1; }
|
|
fi
|
|
|
|
if [ "$IS_MXFP4" = "0" ]; then ATTN=ROCM_AITER_UNIFIED_ATTN
|
|
elif [ "$R4D_ATTN" = "1" ]; then ATTN=R4D
|
|
else ATTN=ROCM_AITER_UNIFIED_ATTN; fi
|
|
if [ "$ASYNC" = 1 ]; then ASYNC_FLAG="--async-scheduling"; UNPAD=false; else
|
|
ASYNC_FLAG="--no-async-scheduling"; UNPAD=true; fi
|
|
|
|
# Drafting config. dflash: the DFlash2-FP8 block-diffusion drafter (its
|
|
# attention backend must support full cuda graphs -> TRITON_ATTN). The
|
|
# disable_padded_drafter_batch unpad is the single-stream lever (~+50%).
|
|
if [ "$SPEC_METHOD" = dflash ]; then
|
|
if [ ! -f "$DRAFTER/config.json" ]; then
|
|
echo "frank-medium: no dflash drafter at $DRAFTER" >&2
|
|
exit 1
|
|
fi
|
|
DRAFT_SAMPLE=${DRAFT_SAMPLE:-greedy}
|
|
SPEC_CFG="{\"method\":\"dflash\",\"model\":\"$DRAFTER\",\"num_speculative_tokens\":$SPEC,\"attention_backend\":\"TRITON_ATTN\",\"disable_padded_drafter_batch\":$UNPAD,\"draft_sample_method\":\"$DRAFT_SAMPLE\"}"
|
|
RADIANCE_DRAFT_RERANK=${RADIANCE_DRAFT_RERANK:-80}
|
|
RADIANCE_VERIFY_HEAD=${RADIANCE_VERIFY_HEAD:-1}
|
|
else
|
|
SPEC_CFG="{\"method\":\"mtp\",\"num_speculative_tokens\":$SPEC,\"attention_backend\":\"$ATTN\",\"disable_padded_drafter_batch\":$UNPAD}"
|
|
RADIANCE_DRAFT_RERANK=${RADIANCE_DRAFT_RERANK:-32}
|
|
RADIANCE_VERIFY_HEAD=${RADIANCE_VERIFY_HEAD:-0}
|
|
fi
|
|
|
|
# The AR size gate compares raw bf16 bytes: CHUNK x hidden(5120) x 2. Derived
|
|
# so changing CHUNK cannot silently drop prefill back onto RCCL.
|
|
export RADIANCE_AR_MAX_KB=$(( (CHUNK * 5120 * 2) / 1024 + 4096 ))
|
|
|
|
# ---------------------------------------------------------------- runtime env
|
|
export HF_HUB_OFFLINE=1
|
|
export VLLM_LOGGING_LEVEL=${VLLM_LOGGING_LEVEL:-INFO}
|
|
export VLLM_NO_USAGE_STATS=${VLLM_NO_USAGE_STATS:-1}
|
|
export VLLM_ROCM_USE_AITER=1 VLLM_ROCM_USE_AITER_UNIFIED_ATTENTION=1
|
|
export VLLM_ROCM_USE_AITER_MHA=0 VLLM_ROCM_USE_AITER_MLA=0 VLLM_ROCM_USE_AITER_MOE=0
|
|
export VLLM_ROCM_USE_AITER_LINEAR=0 VLLM_ROCM_USE_AITER_FP8BMM=0
|
|
export VLLM_ROCM_USE_AITER_FP4BMM=0 VLLM_ROCM_USE_AITER_RMSNORM=0
|
|
export NCCL_PROTO=Simple
|
|
export RADIANCE_USE_R4D=${RADIANCE_USE_R4D:-1} RADIANCE_USE_R4D_AR=${RADIANCE_USE_R4D_AR:-1}
|
|
export RADIANCE_DFLASH_SELECTOR_TOPK="${RADIANCE_DFLASH_SELECTOR_TOPK:-}"
|
|
export RADIANCE_R4D_REPORT=1
|
|
export RADIANCE_PRESHUFFLE=${RADIANCE_PRESHUFFLE:-1}
|
|
export RADIANCE_MXFP4_SANITIZE="${RADIANCE_MXFP4_SANITIZE:-0}"
|
|
# ---------------------------------------------------------------- mxfp6 profile
|
|
# The ParoQuant W4A8 stack (PR #51, the launch6_p kernel). Mirrors
|
|
# paroquant/run_paroquant.sh's env. Runs BEFORE the MXFP4 base block below so
|
|
# the base block's ${VAR:-default} guards preserve these values where they
|
|
# conflict (GDN_MERGE_INPROJ=0, MXFP4_DECODE_MAX_M=64); the base block fills
|
|
# the rest. Gated on IS_MXFP6 so the mxfp4/fp8 paths are untouched.
|
|
if [ "$IS_MXFP6" = "1" ]; then
|
|
export RADIANCE_PAROQUANT=1
|
|
export RADIANCE_GDN_MERGE_INPROJ=${RADIANCE_GDN_MERGE_INPROJ:-0}
|
|
export RADIANCE_GDN_FUSED_MAX_ITEMS=${RADIANCE_GDN_FUSED_MAX_ITEMS:-32}
|
|
export RADIANCE_USE_R4D_AR_QUANT=${RADIANCE_USE_R4D_AR_QUANT:-1}
|
|
export RADIANCE_FUSE_RMS_QUANT=${RADIANCE_FUSE_RMS_QUANT:-1}
|
|
export RADIANCE_KV_GROUP_OPT=${RADIANCE_KV_GROUP_OPT:-1}
|
|
export RADIANCE_MXFP4_DECODE_MAX_M=${RADIANCE_MXFP4_DECODE_MAX_M:-64}
|
|
export RADIANCE_PQ_CHECKALL=${RADIANCE_PQ_CHECKALL:-}
|
|
export RADIANCE_PQM_CHECKALL=${RADIANCE_PQM_CHECKALL:-}
|
|
export RADIANCE_PQM_CHECK_MAX_M=${RADIANCE_PQM_CHECK_MAX_M:-128}
|
|
export RADIANCE_PQ_CHECK_MAX_M=${RADIANCE_PQ_CHECK_MAX_M:-128}
|
|
export RADIANCE_PQ_DECODE_MAX_M=${RADIANCE_PQ_DECODE_MAX_M:-64}
|
|
export RADIANCE_PQ_WPERM=${RADIANCE_PQ_WPERM:-1}
|
|
export RADIANCE_PQ_DECODE_NT=${RADIANCE_PQ_DECODE_NT:-1}
|
|
export RADIANCE_PQ_ATILED=${RADIANCE_PQ_ATILED:-1}
|
|
export RADIANCE_PQ_AT_LBK=${RADIANCE_PQ_AT_LBK:-128}
|
|
export RADIANCE_PQ_AT_HOIST=${RADIANCE_PQ_AT_HOIST:-1}
|
|
export RADIANCE_PQ_PTOK=${RADIANCE_PQ_PTOK:-1}
|
|
export RADIANCE_PQ_FUSED_TOKQ=${RADIANCE_PQ_FUSED_TOKQ:-1}
|
|
export RADIANCE_PQ_I8=${RADIANCE_PQ_I8:-0}
|
|
export RADIANCE_PQ_PG=${RADIANCE_PQ_PG:-0}
|
|
export RADIANCE_PQ_ZPE=${RADIANCE_PQ_ZPE:-0}
|
|
export RADIANCE_PQ_PG_PRODUCER=${RADIANCE_PQ_PG_PRODUCER:-3}
|
|
export RADIANCE_PQ_ROT_STREAM=${RADIANCE_PQ_ROT_STREAM:-1}
|
|
export RADIANCE_PQ_ROT_STREAM2=${RADIANCE_PQ_ROT_STREAM2:-1}
|
|
export RADIANCE_PQ_ROT_STREAM3=${RADIANCE_PQ_ROT_STREAM3:-0}
|
|
export RADIANCE_PQ_AR_CHECK=${RADIANCE_PQ_AR_CHECK:-0}
|
|
export RADIANCE_PQ_AR_FALLBACK=${RADIANCE_PQ_AR_FALLBACK:-0}
|
|
export RADIANCE_PQ_ROT_V2=${RADIANCE_PQ_ROT_V2:-1}
|
|
export RADIANCE_PQ_HIPCC_FLAGS=${RADIANCE_PQ_HIPCC_FLAGS:-}
|
|
export RADIANCE_PQM_FUSED_TOKQ=${RADIANCE_PQM_FUSED_TOKQ:-1}
|
|
export RADIANCE_PQM_SINGLE_LAUNCH=${RADIANCE_PQM_SINGLE_LAUNCH:-1}
|
|
export RADIANCE_DFLASH_CAPTURE_DIR=${RADIANCE_DFLASH_CAPTURE_DIR:-}
|
|
fi
|
|
if [ "$IS_MXFP4" = "1" ]; then
|
|
export RADIANCE_MXFP4=1 RADIANCE_MXFP4_W4A8=1 RADIANCE_MXFP4_W4A8_MIN_M="$MIN_M"
|
|
else
|
|
export RADIANCE_MXFP4=0 RADIANCE_MXFP4_W4A8=0 RADIANCE_USE_R4D_AR_QUANT=1
|
|
fi
|
|
export RADIANCE_FAST_DRAFT=${RADIANCE_FAST_DRAFT:-1}
|
|
export RADIANCE_DRAFT_TAU=${RADIANCE_DRAFT_TAU:-0.20}
|
|
export RADIANCE_DRAFT_RERANK
|
|
export RADIANCE_VERIFY_HEAD
|
|
export RADIANCE_VERIFY_HEAD_MAX_M=${RADIANCE_VERIFY_HEAD_MAX_M:-32}
|
|
export RADIANCE_MXFP4_DEBUG=${RADIANCE_MXFP4_DEBUG:-0}
|
|
export RADIANCE_MXFP4_PUREQUANT=${RADIANCE_MXFP4_PUREQUANT:-0}
|
|
export RADIANCE_MXFP4_SYNC=${RADIANCE_MXFP4_SYNC:-0}
|
|
export RADIANCE_MXFP4_CLONE=${RADIANCE_MXFP4_CLONE:-0}
|
|
export RADIANCE_MXFP4_CHECKX=${RADIANCE_MXFP4_CHECKX:-0}
|
|
export RADIANCE_MXFP4_PADOUT=${RADIANCE_MXFP4_PADOUT:-0}
|
|
export RADIANCE_MXFP4_TN4_MIN_M=${RADIANCE_MXFP4_TN4_MIN_M:-2048}
|
|
# The decode-kernel band must cover MAXSEQS x (SPEC+1) rows: 64 covers 8x8.
|
|
if [ "${MAXSEQS}" -gt 8 ]; then
|
|
export RADIANCE_MXFP4_DECODE_MAX_M=${RADIANCE_MXFP4_DECODE_MAX_M:-128}
|
|
fi
|
|
export RADIANCE_MXFP4_DECODE_NT=${RADIANCE_MXFP4_DECODE_NT:-1}
|
|
export RADIANCE_MXFP4_A_TILED_MIN_M=${RADIANCE_MXFP4_A_TILED_MIN_M:-513}
|
|
export RADIANCE_MXFP4_WPERM=${RADIANCE_MXFP4_WPERM:-1}
|
|
export RADIANCE_TP_PAD=${RADIANCE_TP_PAD:-0} # TP=2 here; 3 is the only non-zero value upstream supports
|
|
export RADIANCE_TP_PAD_DRAFTER=${RADIANCE_TP_PAD_DRAFTER:-1}
|
|
export RADIANCE_TP_PAD_STRICT=${RADIANCE_TP_PAD_STRICT:-1}
|
|
export RADIANCE_GDN_MERGE_INPROJ=${RADIANCE_GDN_MERGE_INPROJ:-1}
|
|
export RADIANCE_GDN_NORM_QUANT=${RADIANCE_GDN_NORM_QUANT:-1}
|
|
export RADIANCE_GDN_STRIDED_GATES=${RADIANCE_GDN_STRIDED_GATES:-0}
|
|
export RADIANCE_GDN_EMPTY_OUT=${RADIANCE_GDN_EMPTY_OUT:-0}
|
|
export R4D_ATTN_FP8=${R4D_ATTN_FP8:-3}
|
|
export RADIANCE_DFLASH_CALIB="${RADIANCE_DFLASH_CALIB:-}"
|
|
export RADIANCE_DFLASH_CALIB_TOKENS="${RADIANCE_DFLASH_CALIB_TOKENS:-200000}"
|
|
export RADIANCE_MXFP4_SHADOW="${RADIANCE_MXFP4_SHADOW:-}"
|
|
export RADIANCE_MXFP4_KERNEL_N="${RADIANCE_MXFP4_KERNEL_N:-}"
|
|
export RADIANCE_MXFP4_KERNEL_NK="${RADIANCE_MXFP4_KERNEL_NK:-}"
|
|
export RADIANCE_MXFP4_CHECKALL="${RADIANCE_MXFP4_CHECKALL:-}"
|
|
export RADIANCE_MXFP4_DECODE_KS="${RADIANCE_MXFP4_DECODE_KS:-}"
|
|
export RADIANCE_MXFP4_DECODE_BK="${RADIANCE_MXFP4_DECODE_BK:-}"
|
|
export RADIANCE_MXFP4_PERBLOCK_NK="${RADIANCE_MXFP4_PERBLOCK_NK:-}"
|
|
export RADIANCE_MXFP4_REFLINEAR="${RADIANCE_MXFP4_REFLINEAR:-0}"
|
|
export PYTORCH_CUDA_ALLOC_CONF="${PYTORCH_CUDA_ALLOC_CONF:-}"
|
|
export RADIANCE_MXFP4_EPIFAST="${RADIANCE_MXFP4_EPIFAST:-1}"
|
|
export RADIANCE_AR_OVERLAP=${RADIANCE_AR_OVERLAP:-0}
|
|
export RADIANCE_GDN_FUSED_UPDATE=${RADIANCE_GDN_FUSED_UPDATE:-1}
|
|
export RADIANCE_DYNAMIC_WIDTH=${RADIANCE_DYNAMIC_WIDTH:-1}
|
|
export RADIANCE_DYNW_ALPHA=${RADIANCE_DYNW_ALPHA:-0.35}
|
|
export RADIANCE_DYNW_MARGIN=${RADIANCE_DYNW_MARGIN:-2}
|
|
export RADIANCE_DYNW_MIN=${RADIANCE_DYNW_MIN:-2}
|
|
export RADIANCE_DYNW_MIN_BATCH=${RADIANCE_DYNW_MIN_BATCH:-3}
|
|
export RADIANCE_AR_QNB=${RADIANCE_AR_QNB:-96}
|
|
export RADIANCE_AR_QNT=${RADIANCE_AR_QNT:-1024}
|
|
export MXFP4_CUMODE=${MXFP4_CUMODE:-0}
|
|
export RADIANCE_STEP_TRACE=${RADIANCE_STEP_TRACE:-0}
|
|
export RADIANCE_AR_OVERLAP_MIN_M=${RADIANCE_AR_OVERLAP_MIN_M:-2048}
|
|
export RADIANCE_AR_OVERLAP_SLICES=${RADIANCE_AR_OVERLAP_SLICES:-4}
|
|
export RADIANCE_MXFP4_EPIFAST=${RADIANCE_MXFP4_EPIFAST:-1}
|
|
export RADIANCE_MXFP4_R4D_DECODE_MAX_M=${RADIANCE_MXFP4_R4D_DECODE_MAX_M:-0}
|
|
export RADIANCE_TOPK_TRITON_MIN_ROWS=${RADIANCE_TOPK_TRITON_MIN_ROWS:-1}
|
|
export RADIANCE_SKINNY_GEMM=${RADIANCE_SKINNY_GEMM:-1}
|
|
export RADIANCE_MXFP4_HOIST_QUANT=${RADIANCE_MXFP4_HOIST_QUANT:-1}
|
|
export RADIANCE_MXFP4_TRACED_QUANT=${RADIANCE_MXFP4_TRACED_QUANT:-1}
|
|
export RADIANCE_FP8_STREAM=${RADIANCE_FP8_STREAM:-1}
|
|
export RADIANCE_RMS_QUANT_FUSION=${RADIANCE_RMS_QUANT_FUSION:-1}
|
|
export RADIANCE_NVFP4_MXFP4=${RADIANCE_NVFP4_MXFP4:-0}
|
|
export RADIANCE_NVFP4_EXP=${RADIANCE_NVFP4_EXP:-mse}
|
|
export RADIANCE_NVFP4_FP8_LAYERS=${RADIANCE_NVFP4_FP8_LAYERS:-mxfp4}
|
|
export RADIANCE_NVFP4_BF16_LAYERS=${RADIANCE_NVFP4_BF16_LAYERS:-in_proj_ba}
|
|
export RADIANCE_NVFP4_LMHEAD=${RADIANCE_NVFP4_LMHEAD:-bf16}
|
|
export RADIANCE_GDN_PATHS=${RADIANCE_GDN_PATHS:-both}
|
|
export RADIANCE_GDN_NANTRACE=${RADIANCE_GDN_NANTRACE:-0}
|
|
export RADIANCE_MXFP4_CHECK_MAX_M=${RADIANCE_MXFP4_CHECK_MAX_M:-128}
|
|
export RADIANCE_MXFP4_MHIST=${RADIANCE_MXFP4_MHIST:-0}
|
|
export VLLM_CACHE_ROOT=/cache/vllm
|
|
export TORCHINDUCTOR_CACHE_DIR=/cache/inductor
|
|
export TRITON_CACHE_DIR=/cache/triton
|
|
export AITER_ROOT_DIR=/cache/aiter
|
|
export TRITON_CACHE_AUTOTUNING=1
|
|
# The patched libr4d built by setup-mxfp4.sh, bind-mounted at /r4d.
|
|
R4D_SO=${R4D_SO:-/r4d}
|
|
|
|
# The norm+quant fusion turns on vLLM's passes (one --compilation-config
|
|
# instance; argparse keeps the last, so entries accumulate into one flag).
|
|
CC_ITEMS=""
|
|
if [ "${RADIANCE_NORMQUANT_FUSION:-1}" != "0" ]; then
|
|
CC_ITEMS="\"pass_config\":{\"fuse_norm_quant\":true,\"fuse_act_quant\":true}"
|
|
fi
|
|
EXTRA=${EXTRA:-}
|
|
if [ -n "$CC_ITEMS" ]; then
|
|
EXTRA="$EXTRA --compilation-config {$CC_ITEMS}"
|
|
fi
|
|
|
|
if [ "$IS_MXFP4" = "1" ]; then
|
|
# ---------------------------------------------------------------- patch block
|
|
# Byte-for-byte the launcher's container-start block. The patches come from
|
|
# the /patches mount (the pinned radiance clone). SP must match the image's
|
|
# venv layout; the image tag is pinned in the quadlet. The mxfp6 branch
|
|
# mirrors paroquant/run_paroquant.sh (17 patches, 10 modules, + the paroquant
|
|
# kernel module + the sitecustomize registration); the mxfp4 branch keeps the
|
|
# existing 20-patch / 11-module list untouched.
|
|
SP=/opt/vllm/lib/python3.12/site-packages
|
|
cd /patches
|
|
if [ "$IS_MXFP6" = "1" ]; then
|
|
python3 patch_quark_mxfp4.py
|
|
python3 patch_ar_maxbytes.py
|
|
python3 patch_topk_triton_rows.py
|
|
python3 patch_dflash_calib.py
|
|
python3 patch_dflash_mxfp4_kv.py
|
|
python3 patch_rmsquant_fusion.py
|
|
python3 patch_verify_head.py
|
|
python3 patch_kv_group_size.py
|
|
python3 patch_topk_composite.py
|
|
python3 patch_gdn_shared_build.py
|
|
python3 patch_async_dynwidth.py
|
|
python3 patch_step_trace.py
|
|
python3 patch_skinny_gemm.py
|
|
python3 patch_dflash_selector_topk.py
|
|
python3 patch_dynwidth.py
|
|
python3 patch_ar_geometry.py
|
|
python3 patch_gdn_merge_inproj.py
|
|
# Non-fatal: fixes content=null on thinking-off requests; not required to serve.
|
|
python3 patch_qwen3_thinkoff.py \
|
|
|| echo "[radiance] WARNING: thinkoff patch did not apply; thinking-off requests will return empty content"
|
|
cp mxfp4-configs/*.json "$SP"/aiter/ops/triton/configs/gemm/
|
|
cp radiance_preamble.py /opt/radiance_preamble.py
|
|
cp radiance_mxfp4.py radiance_gemm.py radiance_gdn.py radiance_gdnmerge.py radiance_rmsquant.py \
|
|
radiance_drafthead.py radiance_verifyhead.py radiance_aroverlap.py radiance_topk.py \
|
|
radiance_arnq.py "$SP"/
|
|
hipcc -O3 -w -std=c++17 -fPIC -shared --offload-arch=gfx1201 $(python3 -m pybind11 --includes) \
|
|
radiance_mxfp4_fp8.hip -o "$SP"/radiance_mxfp4_fp8.so
|
|
# ---- paroquant: build the MXFP6 kernel module and register the quant method ----
|
|
# RADIANCE_PQ_HIPCC_FLAGS: extra compile flags for A/B builds of the kernel
|
|
# module only (e.g. -DPQ_HW_CVT=0). Empty in prod.
|
|
hipcc -O3 -w -std=c++17 -fPIC -shared --offload-arch=gfx1201 $(python3 -m pybind11 --includes) \
|
|
${RADIANCE_PQ_HIPCC_FLAGS:-} paroquant/radiance_paroquant.hip -o "$SP"/radiance_paroquant_kernel.so
|
|
cp paroquant/radiance_paroquant.py paroquant/radiance_paroquant_mxfp4.py "$SP"/
|
|
cp radiance_dflash_capture.py "$SP"/ 2>/dev/null || true
|
|
# NB: appended to the STDLIB sitecustomize, not site-packages -- Ubuntu ships
|
|
# /usr/lib/python3.12/sitecustomize.py and it shadows any site-packages one, so
|
|
# a file dropped there is silently never imported. Guarded: an unguarded >>
|
|
# appends another copy on every restart of an existing container.
|
|
if ! grep -q radiance_paroquant /usr/lib/python3.12/sitecustomize.py; then
|
|
printf "%s\n" \
|
|
"try:" \
|
|
" import radiance_paroquant # registers the paroquant quantization config" \
|
|
" import radiance_paroquant_mxfp4 # and the MXFP4-weights variant (paroquant_mxfp4)" \
|
|
" import radiance_dflash_capture # drafter training-data capture (inert unless RADIANCE_DFLASH_CAPTURE_DIR)" \
|
|
"except Exception as e:" \
|
|
" import sys" \
|
|
" sys.stderr.write(\"[radiance.paroquant] registration failed: %r\\n\" % (e,))" \
|
|
>> /usr/lib/python3.12/sitecustomize.py
|
|
fi
|
|
else
|
|
python3 patch_quark_mxfp4.py
|
|
python3 patch_nvfp4_mxfp4.py
|
|
python3 patch_tp3_pad.py
|
|
python3 patch_ar_maxbytes.py
|
|
python3 patch_topk_triton_rows.py
|
|
python3 patch_dflash_calib.py
|
|
python3 patch_dflash_mxfp4_kv.py
|
|
python3 patch_rmsquant_fusion.py
|
|
python3 patch_verify_head.py
|
|
python3 patch_kv_group_size.py
|
|
python3 patch_topk_composite.py
|
|
python3 patch_gdn_shared_build.py
|
|
python3 patch_dflash_selector_topk.py
|
|
python3 patch_gdn_merge_inproj.py
|
|
python3 patch_dynwidth.py
|
|
python3 patch_async_dynwidth.py
|
|
python3 patch_step_trace.py
|
|
python3 patch_ar_geometry.py
|
|
python3 patch_ar_3rank.py
|
|
python3 patch_gdn_glue.py
|
|
# Non-fatal: fixes content=null on thinking-off requests; not required to serve.
|
|
python3 patch_qwen3_thinkoff.py \
|
|
|| echo "[radiance] WARNING: thinkoff patch did not apply; thinking-off requests will return empty content"
|
|
cp mxfp4-configs/*.json "$SP"/aiter/ops/triton/configs/gemm/
|
|
cp radiance_preamble.py /opt/radiance_preamble.py
|
|
cp radiance_nvfp4.py radiance_mxfp4.py radiance_gdn.py radiance_rmsquant.py radiance_drafthead.py \
|
|
radiance_verifyhead.py radiance_gdnmerge.py radiance_aroverlap.py radiance_topk.py \
|
|
radiance_arnq.py radiance_tp3pad.py "$SP"/
|
|
cp radiance_dflash_capture.py "$SP"/ 2>/dev/null || true
|
|
hipcc -O3 -w -std=c++17 -fPIC -shared --offload-arch=gfx1201 $([ "${MXFP4_CUMODE:-0}" = 1 ] && echo -mcumode) \
|
|
$(python3 -m pybind11 --includes) radiance_mxfp4_fp8.hip -o "$SP"/radiance_mxfp4_fp8.so
|
|
fi
|
|
if [ -n "${R4D_SO:-}" ] && [ -f /r4d/r4d.so ]; then
|
|
cp /r4d/r4d.so "$SP"/r4d.so
|
|
echo "[radiance] using patched r4d.so from $R4D_SO"
|
|
fi
|
|
# Leave /patches before exec: a stale radiance_mxfp4_fp8.so there would shadow
|
|
# the one just compiled into site-packages (cwd precedes it on sys.path).
|
|
cd /
|
|
fi
|
|
# The weight-quantization flag. MXFP4 and paroquant_mxfp6 are auto-detected
|
|
# from the checkpoint's quant_method; FP8 is passed explicitly (the documented
|
|
# plain-FP8 path).
|
|
QUANT_FLAG=""
|
|
if [ "$IS_MXFP4" = "0" ]; then QUANT_FLAG="--quantization fp8"; fi
|
|
exec /opt/radiance_entrypoint.sh "$SNAP" --served-model-name $SERVED_NAMES \
|
|
--host 0.0.0.0 --port "$PORT" \
|
|
--kv-cache-dtype "$KV_DTYPE" --tensor-parallel-size "$TP" \
|
|
$QUANT_FLAG \
|
|
--gpu-memory-utilization "$GPU_UTIL" \
|
|
${KV_MEM:+--kv-cache-memory "$KV_MEM"} \
|
|
--max-model-len "$MAXLEN" --max-num-seqs "$MAXSEQS" --max-num-batched-tokens "$CHUNK" \
|
|
--attention-backend "$ATTN" \
|
|
--speculative-config "$SPEC_CFG" \
|
|
$ASYNC_FLAG $EXTRA \
|
|
--enable-prefix-caching --mamba-cache-mode align --enable-auto-tool-choice \
|
|
--tool-call-parser qwen3_coder --reasoning-parser qwen3 \
|
|
--override-generation-config '{"temperature":0.7,"top_p":0.95,"top_k":20}' \
|
|
--chat-template "$CHAT_TEMPLATE"
|