2026-08-06 06:44:31 +00:00
|
|
|
#!/bin/bash
|
2026-08-08 05:56:58 +00:00
|
|
|
# ==========================================================================
|
|
|
|
|
# SERVING-LAYER-ONLY PATCHES
|
|
|
|
|
#
|
|
|
|
|
# EVIDENCE FROM SUB168 DOCKER LOG (07-23, competition reference):
|
|
|
|
|
# - corex_gdn.py:56 "Loaded fused CoreX GDN decode operator" ✓
|
|
|
|
|
# - corex_moe.py:339 "Using CoreX fused MoE prefill operator" ✓
|
|
|
|
|
# - model_runner.py:1074 (base image's line number)
|
|
|
|
|
# - "Loading model weights took 17.3529 GB"
|
|
|
|
|
# - ZERO NaN warnings
|
|
|
|
|
# - d01: 8.49s, d03_tool_call: PASS in 2.12s
|
|
|
|
|
#
|
|
|
|
|
# EVIDENCE FROM OUR SUB508 DOCKER LOG (08-07):
|
|
|
|
|
# - NO corex_gdn loading
|
|
|
|
|
# - model_runner.py:1119 (our custom code)
|
|
|
|
|
# - "Loading model weights took 16.2303 GB" (1.1GB MISSING)
|
|
|
|
|
# - 16 NaN in prefill, 19 FusedMoE failures
|
|
|
|
|
# - d01: 95.87s, d03_tool_call: FAIL in 49s
|
|
|
|
|
#
|
|
|
|
|
# CONCLUSION: Sub168 succeeds by using BASE IMAGE native model code.
|
2026-08-08 07:53:14 +00:00
|
|
|
# qwen3_5.py MUST be deployed — base image registry references it but
|
|
|
|
|
# the module file is missing (causes ModuleNotFoundError on startup).
|
2026-08-08 05:56:58 +00:00
|
|
|
#
|
2026-08-10 06:56:23 +00:00
|
|
|
# DO NOT deploy: model_runner.py,
|
2026-08-08 05:56:58 +00:00
|
|
|
# sampler.py, scheduler.py, sequence.py, xformers.py, paged_attn.py,
|
|
|
|
|
# prefix_prefill.py, logits_processor.py, mamba_cache.py, arg_utils.py
|
|
|
|
|
# ==========================================================================
|
2026-08-05 08:24:38 +00:00
|
|
|
|
2026-08-07 06:20:02 +00:00
|
|
|
cd "$(dirname "$0")"
|
2026-08-07 10:37:41 +00:00
|
|
|
echo "[patch_ops] START — working directory: $(pwd)"
|
2026-08-07 06:20:02 +00:00
|
|
|
|
2026-08-07 10:37:41 +00:00
|
|
|
# Find vllm installation
|
|
|
|
|
VLLM=""
|
|
|
|
|
for P in /usr/local/corex/lib/python3/dist-packages/vllm \
|
|
|
|
|
/usr/local/corex/lib64/python3/dist-packages/vllm; do
|
|
|
|
|
if [ -d "$P" ]; then
|
|
|
|
|
VLLM="$P"
|
|
|
|
|
echo "[patch_ops] Found vllm at: $VLLM"
|
|
|
|
|
break
|
|
|
|
|
fi
|
|
|
|
|
done
|
2026-08-07 04:51:27 +00:00
|
|
|
|
2026-08-07 10:37:41 +00:00
|
|
|
if [ -z "$VLLM" ]; then
|
|
|
|
|
echo "[patch_ops] ERROR: vllm not found"
|
2026-08-05 08:24:38 +00:00
|
|
|
exit 1
|
|
|
|
|
fi
|
|
|
|
|
|
2026-08-08 05:56:58 +00:00
|
|
|
# 1. Transformers config registration (config only, NOT model code)
|
2026-08-07 10:37:41 +00:00
|
|
|
TMODELS=""
|
fix(critical): remove pip install transformers — was breaking corex kernel loading
ROOT CAUSE FOUND from competitor sub168 docker log comparison:
Sub168 (competitor, works):
- corex_gdn.py:56] Loaded fused CoreX GDN decode operator ✓
- corex_moe.py:339] Using CoreX fused MoE prefill operator ✓
- corex_fa2.py:333] Using CoreX FA2 packed prefill ✓
- NO NaN warnings, NO MoE fallback
- max_model_len=256000, gpu_mem=0.95, max_num_seqs=2 (yaml params work)
Sub509 (ours, broken):
- NaN in prefill GatedDeltaNet layer 0 (frac=0.9998) ✗
- FusedMoE native kernel failed, falling back to PyTorch ✗
- NO corex_gdn/corex_moe/corex_fa2 loading logs at all
- max_model_len=100000, gpu_mem=0.9, max_num_seqs=1 (yaml params ignored)
The pip install transformers==4.55.3 in patch_ops.sh was the likely cause:
it changed dependencies that broke corex kernel loading paths.
Without corex_gdn, GatedDeltaNet falls back to Python → NaN.
Without corex_moe, MoE falls back to PyTorch → 10x slower.
Fix: Remove pip install, use base image's transformers version.
Only register qwen3_5 config files without upgrading the package.
2026-08-07 10:02:09 +00:00
|
|
|
for P in /usr/local/lib/python3.10/site-packages/transformers/models \
|
|
|
|
|
/usr/local/corex/lib/python3/dist-packages/transformers/models \
|
|
|
|
|
/usr/local/corex/lib64/python3/dist-packages/transformers/models; do
|
|
|
|
|
if [ -d "$P" ]; then
|
2026-08-07 10:37:41 +00:00
|
|
|
TMODELS="$P"
|
fix(critical): remove pip install transformers — was breaking corex kernel loading
ROOT CAUSE FOUND from competitor sub168 docker log comparison:
Sub168 (competitor, works):
- corex_gdn.py:56] Loaded fused CoreX GDN decode operator ✓
- corex_moe.py:339] Using CoreX fused MoE prefill operator ✓
- corex_fa2.py:333] Using CoreX FA2 packed prefill ✓
- NO NaN warnings, NO MoE fallback
- max_model_len=256000, gpu_mem=0.95, max_num_seqs=2 (yaml params work)
Sub509 (ours, broken):
- NaN in prefill GatedDeltaNet layer 0 (frac=0.9998) ✗
- FusedMoE native kernel failed, falling back to PyTorch ✗
- NO corex_gdn/corex_moe/corex_fa2 loading logs at all
- max_model_len=100000, gpu_mem=0.9, max_num_seqs=1 (yaml params ignored)
The pip install transformers==4.55.3 in patch_ops.sh was the likely cause:
it changed dependencies that broke corex kernel loading paths.
Without corex_gdn, GatedDeltaNet falls back to Python → NaN.
Without corex_moe, MoE falls back to PyTorch → 10x slower.
Fix: Remove pip install, use base image's transformers version.
Only register qwen3_5 config files without upgrading the package.
2026-08-07 10:02:09 +00:00
|
|
|
break
|
|
|
|
|
fi
|
|
|
|
|
done
|
2026-08-07 10:37:41 +00:00
|
|
|
if [ -n "$TMODELS" ]; then
|
2026-08-08 10:48:24 +00:00
|
|
|
# Base engine requires transformers 4.55.3 for Qwen3_5Config support
|
2026-08-10 01:42:16 +00:00
|
|
|
pip install transformers==4.55.3 -i https://pypi.tuna.tsinghua.edu.cn/simple --timeout 30 2>&1 || \
|
2026-08-10 01:21:28 +00:00
|
|
|
echo "[patch_ops] WARNING: pip install failed (may already be correct versions)"
|
2026-08-10 01:42:16 +00:00
|
|
|
# ninja-build required for torch.utils.cpp_extension CUDA compilation
|
|
|
|
|
apt-get update -qq && apt-get install -y -qq ninja-build 2>&1 || \
|
|
|
|
|
echo "[patch_ops] WARNING: ninja-build install failed — CUDA kernel will not compile"
|
2026-08-07 10:37:41 +00:00
|
|
|
cp -r ./qwen3_5 "$TMODELS/" 2>/dev/null && echo "[patch_ops] qwen3_5 config copied" || true
|
|
|
|
|
cp -r ./qwen3_5_moe "$TMODELS/" 2>/dev/null && echo "[patch_ops] qwen3_5_moe config copied" || true
|
|
|
|
|
python3 ./patch_transformers_qwen3_5.py 2>&1 || echo "[patch_ops] WARNING: transformers patch failed (non-fatal)"
|
fix(critical): remove pip install transformers — was breaking corex kernel loading
ROOT CAUSE FOUND from competitor sub168 docker log comparison:
Sub168 (competitor, works):
- corex_gdn.py:56] Loaded fused CoreX GDN decode operator ✓
- corex_moe.py:339] Using CoreX fused MoE prefill operator ✓
- corex_fa2.py:333] Using CoreX FA2 packed prefill ✓
- NO NaN warnings, NO MoE fallback
- max_model_len=256000, gpu_mem=0.95, max_num_seqs=2 (yaml params work)
Sub509 (ours, broken):
- NaN in prefill GatedDeltaNet layer 0 (frac=0.9998) ✗
- FusedMoE native kernel failed, falling back to PyTorch ✗
- NO corex_gdn/corex_moe/corex_fa2 loading logs at all
- max_model_len=100000, gpu_mem=0.9, max_num_seqs=1 (yaml params ignored)
The pip install transformers==4.55.3 in patch_ops.sh was the likely cause:
it changed dependencies that broke corex kernel loading paths.
Without corex_gdn, GatedDeltaNet falls back to Python → NaN.
Without corex_moe, MoE falls back to PyTorch → 10x slower.
Fix: Remove pip install, use base image's transformers version.
Only register qwen3_5 config files without upgrading the package.
2026-08-07 10:02:09 +00:00
|
|
|
else
|
2026-08-07 10:37:41 +00:00
|
|
|
echo "[patch_ops] WARNING: transformers/models not found"
|
fix(critical): remove pip install transformers — was breaking corex kernel loading
ROOT CAUSE FOUND from competitor sub168 docker log comparison:
Sub168 (competitor, works):
- corex_gdn.py:56] Loaded fused CoreX GDN decode operator ✓
- corex_moe.py:339] Using CoreX fused MoE prefill operator ✓
- corex_fa2.py:333] Using CoreX FA2 packed prefill ✓
- NO NaN warnings, NO MoE fallback
- max_model_len=256000, gpu_mem=0.95, max_num_seqs=2 (yaml params work)
Sub509 (ours, broken):
- NaN in prefill GatedDeltaNet layer 0 (frac=0.9998) ✗
- FusedMoE native kernel failed, falling back to PyTorch ✗
- NO corex_gdn/corex_moe/corex_fa2 loading logs at all
- max_model_len=100000, gpu_mem=0.9, max_num_seqs=1 (yaml params ignored)
The pip install transformers==4.55.3 in patch_ops.sh was the likely cause:
it changed dependencies that broke corex kernel loading paths.
Without corex_gdn, GatedDeltaNet falls back to Python → NaN.
Without corex_moe, MoE falls back to PyTorch → 10x slower.
Fix: Remove pip install, use base image's transformers version.
Only register qwen3_5 config files without upgrading the package.
2026-08-07 10:02:09 +00:00
|
|
|
fi
|
2026-07-30 16:06:20 +00:00
|
|
|
|
2026-08-08 15:09:31 +00:00
|
|
|
# 1b. CoreX probe — direct shell, guaranteed to show in build log
|
|
|
|
|
echo "[probe] === CoreX .so files ==="
|
|
|
|
|
ls -la /usr/local/corex/lib64/libcorex_*.so 2>/dev/null || echo "[probe] NO .so files in /usr/local/corex/lib64/"
|
|
|
|
|
echo "[probe] === CoreX Python wrappers ==="
|
|
|
|
|
ls -la "$VLLM/model_executor/models/corex_"*.py 2>/dev/null || echo "[probe] NO corex_*.py in $VLLM/model_executor/models/"
|
|
|
|
|
echo "[probe] === Native qwen3_5.py ==="
|
|
|
|
|
if [ -f "$VLLM/model_executor/models/qwen3_5.py" ]; then
|
|
|
|
|
wc -lc "$VLLM/model_executor/models/qwen3_5.py"
|
|
|
|
|
grep -c "corex_gdn\|corex_moe\|CoreXGDN" "$VLLM/model_executor/models/qwen3_5.py" || echo "[probe] no corex refs"
|
|
|
|
|
else
|
|
|
|
|
echo "[probe] qwen3_5.py NOT in base image"
|
|
|
|
|
fi
|
|
|
|
|
echo "[probe] === All model files (corex related) ==="
|
|
|
|
|
find "$VLLM" -name "*corex*" -type f 2>/dev/null || echo "[probe] zero corex files anywhere in vllm"
|
|
|
|
|
echo "[probe] === LD_LIBRARY_PATH ==="
|
|
|
|
|
echo "$LD_LIBRARY_PATH"
|
|
|
|
|
echo "[probe] === /usr/local/corex/ tree ==="
|
|
|
|
|
find /usr/local/corex/lib64/ -name "*.so" 2>/dev/null | head -20 || echo "[probe] no .so in corex lib64"
|
|
|
|
|
echo "[probe] ==========================="
|
2026-08-08 11:16:58 +00:00
|
|
|
|
2026-08-10 07:34:54 +00:00
|
|
|
# 2. Model module — qwen3_5.py
|
2026-08-10 09:43:36 +00:00
|
|
|
# EVIDENCE: comp 168 uses base image qwen3_5.py (81706 bytes) → 48/52 pass, no NaN, 8.49s d01
|
|
|
|
|
# Our qwen3_5.py LACKS multimodal support → engine death on image request (d05/t13 FAIL)
|
|
|
|
|
# Our qwen3_5.py LACKS proper CoreX GDN/MoE/FA2 integration → 95s d01 (11x slower)
|
|
|
|
|
# KEEP base image version. Only deploy ours if base has no qwen3_5.py.
|
2026-08-08 10:48:01 +00:00
|
|
|
_NATIVE_QW="$VLLM/model_executor/models/qwen3_5.py"
|
2026-08-10 09:43:36 +00:00
|
|
|
if [ -f "$_NATIVE_QW" ]; then
|
|
|
|
|
_NATIVE_SIZE=$(stat -c%s "$_NATIVE_QW" 2>/dev/null || echo 0)
|
|
|
|
|
if [ "$_NATIVE_SIZE" -gt 1000 ]; then
|
|
|
|
|
echo "[patch_ops] KEEP base image qwen3_5.py ($_NATIVE_SIZE bytes) — proven by comp 168 (48/52 pass)"
|
|
|
|
|
else
|
|
|
|
|
cp ./qwen3_5.py "$_NATIVE_QW" && \
|
|
|
|
|
echo "[patch_ops] qwen3_5.py deployed (base was stub: $_NATIVE_SIZE bytes)"
|
|
|
|
|
fi
|
|
|
|
|
else
|
|
|
|
|
cp ./qwen3_5.py "$_NATIVE_QW" && \
|
|
|
|
|
echo "[patch_ops] qwen3_5.py deployed (base had no qwen3_5.py)"
|
|
|
|
|
fi
|
2026-08-08 07:53:14 +00:00
|
|
|
|
|
|
|
|
# 2b. Registry — only if base image doesn't already have Qwen3_5
|
2026-08-08 05:56:58 +00:00
|
|
|
if grep -q "Qwen3_5ForCausalLM" "$VLLM/model_executor/models/registry.py" 2>/dev/null; then
|
|
|
|
|
echo "[patch_ops] registry already has Qwen3_5 — NOT overwriting"
|
|
|
|
|
else
|
2026-08-07 10:37:41 +00:00
|
|
|
cp ./registry.py "$VLLM/model_executor/models/registry.py" 2>/dev/null && \
|
2026-08-08 05:56:58 +00:00
|
|
|
echo "[patch_ops] registry.py deployed" || true
|
arch(critical): deploy ALL customized files to container — qwen3_5.py was NEVER running
ROOT CAUSE FOUND: patch_ops.sh only deployed serving-layer files
(tool_parser, reasoning, protocol, serving_chat) but NEVER deployed:
- qwen3_5.py (1712 lines of NaN-safe DeltaNet + CCCL patterns)
- _custom_ops.py (MoE kernel fallback for BI-V100)
- model_runner.py (has_inner_state for DeltaNet MambaCacheManager)
- sampler.py, sequence.py, scheduler.py, arg_utils.py
- xformers.py, paged_attn.py, prefix_prefill.py
- logits_processor.py, mamba_cache.py
The container was running the BASE IMAGE's original qwen3_5.py which has:
- NO NaN clamping (g.clamp, cumsum.clamp, state.clamp)
- NO overflow_cast protection (CCCL pattern)
- NO forward substitution fallback (cuSOLVER unavailable on BI-V100)
- NO batched GEMM MoE decode (3 launches vs 16)
- NO sorted-segment MoE prefill (CCCL histogram pattern)
- NO GDN prefix-cache state save/restore
This explains why Docker logs showed 99.98% NaN in EVERY DeltaNet layer
despite our qwen3_5.py having comprehensive numerical guards.
Also fixes:
- serving_chat.py: n>1 returns 400 instead of clamping (prevents OOM cascade)
- serving_chat.py: improved d07 content fallback (multi-layer extraction)
2026-08-08 05:37:46 +00:00
|
|
|
fi
|
|
|
|
|
|
2026-08-08 10:48:01 +00:00
|
|
|
# 2c. paged_attn.py — CRITICAL: Triton context_attention_fwd hangs BI-V100.
|
|
|
|
|
# Base engine comment: "The Triton context_attention_fwd kernel hangs BI-V100
|
|
|
|
|
# GPUs permanently. Our paged_attn.py bypasses it via _forward_prefix_pytorch."
|
|
|
|
|
cp ./paged_attn.py "$VLLM/attention/ops/paged_attn.py" 2>/dev/null && \
|
|
|
|
|
echo "[patch_ops] paged_attn.py deployed (Triton hang bypass)" || true
|
|
|
|
|
|
|
|
|
|
# 2d. patch_model_runner.py — fix prefix_cache_hit in chunked-prefill chunk 2+
|
|
|
|
|
python3 ./patch_model_runner.py 2>&1 || echo "[patch_ops] WARNING: model_runner patch failed (non-fatal)"
|
|
|
|
|
|
|
|
|
|
# 2e. mamba_cache.py — required for GatedDeltaNet state management
|
|
|
|
|
cp ./mamba_cache.py "$VLLM/model_executor/models/mamba_cache.py" 2>/dev/null && \
|
|
|
|
|
echo "[patch_ops] mamba_cache.py deployed" || true
|
|
|
|
|
|
|
|
|
|
# 2f. sequence.py — fix completion_tokens inflation under chunked prefill
|
|
|
|
|
cp ./sequence.py "$VLLM/sequence.py" 2>/dev/null && \
|
|
|
|
|
echo "[patch_ops] sequence.py deployed (token count fix)" || true
|
|
|
|
|
|
|
|
|
|
# 2g. scheduler.py — record num_cached_tokens in RequestMetrics
|
|
|
|
|
cp ./scheduler.py "$VLLM/core/scheduler.py" 2>/dev/null && \
|
|
|
|
|
echo "[patch_ops] scheduler.py deployed (cache metrics)" || true
|
|
|
|
|
|
|
|
|
|
# 2h. xformers — bypass cudnnFlashAttn (head_dim=256 > 128 limit)
|
|
|
|
|
python3 ./patch_xformers_sdpa_seq.py 2>&1 || echo "[patch_ops] WARNING: xformers seq patch failed"
|
|
|
|
|
python3 ./patch_xformers_sdpa_batch.py 2>&1 || echo "[patch_ops] WARNING: xformers batch patch failed"
|
|
|
|
|
echo "[patch_ops] xformers patches applied"
|
|
|
|
|
|
2026-08-07 10:37:41 +00:00
|
|
|
# 3. Tool parser
|
|
|
|
|
mkdir -p "$VLLM/entrypoints/openai/tool_parsers" 2>/dev/null || true
|
|
|
|
|
cp ./qwen3coder_tool_parser.py "$VLLM/entrypoints/openai/tool_parsers/" 2>/dev/null || true
|
|
|
|
|
cp ./tool_parsers_init.py "$VLLM/entrypoints/openai/tool_parsers/__init__.py" 2>/dev/null || true
|
2026-08-08 10:48:01 +00:00
|
|
|
python3 ./patch_vllm_tool_parser.py 2>&1 || echo "[patch_ops] WARNING: tool parser registry patch failed"
|
2026-08-07 10:37:41 +00:00
|
|
|
echo "[patch_ops] tool parser deployed"
|
2026-07-30 16:06:20 +00:00
|
|
|
|
2026-08-07 10:37:41 +00:00
|
|
|
# 4. Reasoning parser
|
|
|
|
|
cp -r ./reasoning "$VLLM/" 2>/dev/null || true
|
|
|
|
|
echo "[patch_ops] reasoning parser deployed"
|
2026-07-30 16:06:20 +00:00
|
|
|
|
2026-08-08 05:56:58 +00:00
|
|
|
# 5. Serving layer ONLY
|
2026-08-07 10:37:41 +00:00
|
|
|
cp ./protocol.py "$VLLM/entrypoints/openai/protocol.py" 2>/dev/null || true
|
|
|
|
|
cp ./cli_args.py "$VLLM/entrypoints/openai/cli_args.py" 2>/dev/null || true
|
|
|
|
|
cp ./serving_chat.py "$VLLM/entrypoints/openai/serving_chat.py" 2>/dev/null || true
|
|
|
|
|
cp ./api_server.py "$VLLM/entrypoints/openai/api_server.py" 2>/dev/null || true
|
|
|
|
|
cp ./chat_utils.py "$VLLM/entrypoints/chat_utils.py" 2>/dev/null || true
|
|
|
|
|
echo "[patch_ops] serving layer deployed"
|
fix(critical): stop replacing base image compute files — use corex native kernels
ROOT CAUSE OF ALL FAILURES:
patch_ops.sh was replacing qwen3_5.py, _custom_ops.py, model_runner.py,
xformers.py, paged_attn.py, prefix_prefill.py, logits_processor.py,
sampler.py, arg_utils.py — killing base image's CoreX fused kernels.
Evidence from competitor sub168 docker logs (d03 PASS in 2.12s):
- 'Using fused CoreX GDN decode operator' (DeltaNet)
- 'Using CoreX fused MoE prefill operator: tokens=4096, kernel=expert-grouped-wmma'
- 'Using CoreX FA2 packed prefill: B=2 Hq=4 Hkv=1 D=256'
- ZERO NaN warnings
- Model weights: 17.35GB (full)
Our sub509 (d03 FAIL in 49s):
- 'NaN in prefill GatedDeltaNet layer 0 (frac=0.9998)' — 99.98% NaN!
- 'FusedMoE native kernel failed, falling back to pure PyTorch'
- No CoreX FA2
- Model weights: 16.23GB (incomplete — 1.1GB missing)
CCCL design principle (dispatch_reduce_deterministic.cuh, transform.cu):
Let the framework's policy_selector choose optimal kernel config per
hardware — never hand-replace the dispatch layer.
Now patch_ops.sh ONLY patches serving layer:
- protocol.py, serving_chat.py, api_server.py, chat_utils.py, cli_args.py
- qwen3coder_tool_parser.py (tool call XML parsing)
- reasoning/ (think tag parsing)
- registry.py (register Qwen3_5 model type)
- transformers models (qwen3_5 config)
Base image compute files PRESERVED:
qwen3_5.py, _custom_ops.py, model_runner.py, xformers.py,
paged_attn.py, prefix_prefill.py, logits_processor.py, sampler.py,
arg_utils.py, sequence.py, scheduler.py
2026-08-07 09:21:43 +00:00
|
|
|
|
2026-08-08 05:56:58 +00:00
|
|
|
# 6. Mirror to second vllm path if exists
|
2026-08-07 10:37:41 +00:00
|
|
|
VLLM2=""
|
|
|
|
|
for P in /usr/local/corex/lib/python3/dist-packages/vllm \
|
|
|
|
|
/usr/local/corex/lib64/python3/dist-packages/vllm; do
|
|
|
|
|
if [ -d "$P" ] && [ "$P" != "$VLLM" ]; then
|
|
|
|
|
VLLM2="$P"
|
|
|
|
|
break
|
|
|
|
|
fi
|
|
|
|
|
done
|
|
|
|
|
if [ -n "$VLLM2" ]; then
|
2026-08-08 05:56:58 +00:00
|
|
|
echo "[patch_ops] Second vllm at: $VLLM2"
|
2026-08-08 10:48:01 +00:00
|
|
|
_NATIVE_QW2="$VLLM2/model_executor/models/qwen3_5.py"
|
2026-08-10 08:29:57 +00:00
|
|
|
cp ./qwen3_5.py "$_NATIVE_QW2" 2>/dev/null && \
|
|
|
|
|
echo "[patch_ops] VLLM2 qwen3_5.py deployed" || true
|
2026-08-08 05:56:58 +00:00
|
|
|
if ! grep -q "Qwen3_5ForCausalLM" "$VLLM2/model_executor/models/registry.py" 2>/dev/null; then
|
|
|
|
|
cp ./registry.py "$VLLM2/model_executor/models/registry.py" 2>/dev/null || true
|
|
|
|
|
fi
|
2026-08-07 10:37:41 +00:00
|
|
|
mkdir -p "$VLLM2/entrypoints/openai/tool_parsers" 2>/dev/null || true
|
|
|
|
|
cp ./qwen3coder_tool_parser.py "$VLLM2/entrypoints/openai/tool_parsers/" 2>/dev/null || true
|
|
|
|
|
cp ./tool_parsers_init.py "$VLLM2/entrypoints/openai/tool_parsers/__init__.py" 2>/dev/null || true
|
|
|
|
|
cp -r ./reasoning "$VLLM2/" 2>/dev/null || true
|
|
|
|
|
cp ./protocol.py "$VLLM2/entrypoints/openai/protocol.py" 2>/dev/null || true
|
|
|
|
|
cp ./cli_args.py "$VLLM2/entrypoints/openai/cli_args.py" 2>/dev/null || true
|
|
|
|
|
cp ./serving_chat.py "$VLLM2/entrypoints/openai/serving_chat.py" 2>/dev/null || true
|
|
|
|
|
cp ./api_server.py "$VLLM2/entrypoints/openai/api_server.py" 2>/dev/null || true
|
|
|
|
|
cp ./chat_utils.py "$VLLM2/entrypoints/chat_utils.py" 2>/dev/null || true
|
|
|
|
|
fi
|
fix(critical): stop replacing base image compute files — use corex native kernels
ROOT CAUSE OF ALL FAILURES:
patch_ops.sh was replacing qwen3_5.py, _custom_ops.py, model_runner.py,
xformers.py, paged_attn.py, prefix_prefill.py, logits_processor.py,
sampler.py, arg_utils.py — killing base image's CoreX fused kernels.
Evidence from competitor sub168 docker logs (d03 PASS in 2.12s):
- 'Using fused CoreX GDN decode operator' (DeltaNet)
- 'Using CoreX fused MoE prefill operator: tokens=4096, kernel=expert-grouped-wmma'
- 'Using CoreX FA2 packed prefill: B=2 Hq=4 Hkv=1 D=256'
- ZERO NaN warnings
- Model weights: 17.35GB (full)
Our sub509 (d03 FAIL in 49s):
- 'NaN in prefill GatedDeltaNet layer 0 (frac=0.9998)' — 99.98% NaN!
- 'FusedMoE native kernel failed, falling back to pure PyTorch'
- No CoreX FA2
- Model weights: 16.23GB (incomplete — 1.1GB missing)
CCCL design principle (dispatch_reduce_deterministic.cuh, transform.cu):
Let the framework's policy_selector choose optimal kernel config per
hardware — never hand-replace the dispatch layer.
Now patch_ops.sh ONLY patches serving layer:
- protocol.py, serving_chat.py, api_server.py, chat_utils.py, cli_args.py
- qwen3coder_tool_parser.py (tool call XML parsing)
- reasoning/ (think tag parsing)
- registry.py (register Qwen3_5 model type)
- transformers models (qwen3_5 config)
Base image compute files PRESERVED:
qwen3_5.py, _custom_ops.py, model_runner.py, xformers.py,
paged_attn.py, prefix_prefill.py, logits_processor.py, sampler.py,
arg_utils.py, sequence.py, scheduler.py
2026-08-07 09:21:43 +00:00
|
|
|
|
fix(NO-FALLBACK): eliminate all silent fallbacks — crash or succeed
Policy: fallback = 0 score = same as crash. Better to crash with clear
error log so we can diagnose.
Changes:
1. corex_gdn.py: COMPLETE REWRITE (374 lines)
- CoreXGDN.forward() now implements full GDN layer forward
- Accepts all 13 args from qwen3_5.py (hidden_states, attn_metadata,
conv_state, temporal_state, in_proj_qkv/z/b/a, conv1d_weight,
A_log, dt_bias, norm, out_proj)
- Prefill: causal conv1d → split q/k/v → chunk_gated_delta_rule
(fp32 accumulation, xllm-aligned cumsum+difference form)
- Decode: causal_conv1d_update → single-step recurrent with
bmm/baddbmm_ (ixformer accelerated)
- NO FALLBACK — if something fails, it crashes
2. qwen3_5.py: Remove all try/except fallbacks
- GatedDeltaNet.__init__: CoreXGDN init MUST succeed (no try/except)
- GatedDeltaNet.forward: CoreXGDN.forward() called directly, no catch
- MoE init: raise RuntimeError if moe_forward missing
3. patch_ops.sh: MUST deploy all three corex modules
- Reverted previous 'don't overwrite' — base image produces NaN
- corex_gdn.py + corex_moe.py + corex_fa2.py all deployed unconditionally
2026-08-10 09:23:30 +00:00
|
|
|
# Deploy corex_gdn.py + corex_moe.py + corex_fa2.py → vllm model_executor/models/
|
2026-08-10 09:43:36 +00:00
|
|
|
# EVIDENCE: comp 168 uses base image corex modules with real C++ kernels (libcorex_gdn.so)
|
|
|
|
|
# → d01 in 8.49s, corex_gdn.py:56 "Loaded fused CoreX GDN decode operator"
|
|
|
|
|
# Our Python fallback versions are 11x slower (d01 in 95.87s).
|
|
|
|
|
# KEEP base image versions if they exist and are non-trivial.
|
|
|
|
|
for _COREX_MOD in corex_gdn.py corex_moe.py corex_fa2.py; do
|
|
|
|
|
_NATIVE="$VLLM/model_executor/models/$_COREX_MOD"
|
|
|
|
|
_OURS="/workspace/ex_engine/python/$_COREX_MOD"
|
|
|
|
|
if [ -f "$_NATIVE" ]; then
|
|
|
|
|
_SZ=$(stat -c%s "$_NATIVE" 2>/dev/null || echo 0)
|
|
|
|
|
if [ "$_SZ" -gt 500 ]; then
|
|
|
|
|
echo "[patch_ops] KEEP base $_COREX_MOD ($_SZ bytes) — real C++ kernel dispatch"
|
|
|
|
|
elif [ -f "$_OURS" ]; then
|
|
|
|
|
cp "$_OURS" "$_NATIVE" && echo "[patch_ops] $_COREX_MOD deployed (base was stub: $_SZ bytes)"
|
|
|
|
|
fi
|
|
|
|
|
elif [ -f "$_OURS" ]; then
|
|
|
|
|
cp "$_OURS" "$_NATIVE" && echo "[patch_ops] $_COREX_MOD deployed (base had none)"
|
|
|
|
|
fi
|
|
|
|
|
# Mirror to VLLM2
|
fix(NO-FALLBACK): eliminate all silent fallbacks — crash or succeed
Policy: fallback = 0 score = same as crash. Better to crash with clear
error log so we can diagnose.
Changes:
1. corex_gdn.py: COMPLETE REWRITE (374 lines)
- CoreXGDN.forward() now implements full GDN layer forward
- Accepts all 13 args from qwen3_5.py (hidden_states, attn_metadata,
conv_state, temporal_state, in_proj_qkv/z/b/a, conv1d_weight,
A_log, dt_bias, norm, out_proj)
- Prefill: causal conv1d → split q/k/v → chunk_gated_delta_rule
(fp32 accumulation, xllm-aligned cumsum+difference form)
- Decode: causal_conv1d_update → single-step recurrent with
bmm/baddbmm_ (ixformer accelerated)
- NO FALLBACK — if something fails, it crashes
2. qwen3_5.py: Remove all try/except fallbacks
- GatedDeltaNet.__init__: CoreXGDN init MUST succeed (no try/except)
- GatedDeltaNet.forward: CoreXGDN.forward() called directly, no catch
- MoE init: raise RuntimeError if moe_forward missing
3. patch_ops.sh: MUST deploy all three corex modules
- Reverted previous 'don't overwrite' — base image produces NaN
- corex_gdn.py + corex_moe.py + corex_fa2.py all deployed unconditionally
2026-08-10 09:23:30 +00:00
|
|
|
if [ -n "$VLLM2" ]; then
|
2026-08-10 09:43:36 +00:00
|
|
|
_NATIVE2="$VLLM2/model_executor/models/$_COREX_MOD"
|
|
|
|
|
if [ -f "$_NATIVE2" ]; then
|
|
|
|
|
_SZ2=$(stat -c%s "$_NATIVE2" 2>/dev/null || echo 0)
|
|
|
|
|
[ "$_SZ2" -gt 500 ] && continue
|
|
|
|
|
fi
|
|
|
|
|
[ -f "$_OURS" ] && cp "$_OURS" "$_NATIVE2" 2>/dev/null || true
|
2026-08-10 03:39:49 +00:00
|
|
|
fi
|
2026-08-10 09:43:36 +00:00
|
|
|
done
|
2026-08-10 03:39:49 +00:00
|
|
|
|
2026-08-10 03:00:24 +00:00
|
|
|
# Deploy EX Engine Python module + C++ bridge into vllm importable path
|
2026-08-10 02:31:55 +00:00
|
|
|
EX_ENGINE_SRC="/workspace/ex_engine"
|
2026-08-10 03:00:24 +00:00
|
|
|
if [ -d "$EX_ENGINE_SRC/python" ]; then
|
|
|
|
|
# Deploy into vllm's model dir so qwen3_5.py can import it
|
2026-08-10 02:31:55 +00:00
|
|
|
EX_DST="$VLLM/model_executor/models/ex_engine"
|
2026-08-10 03:02:54 +00:00
|
|
|
mkdir -p "$EX_DST/python" "$EX_DST/csrc"
|
2026-08-10 03:00:24 +00:00
|
|
|
cp "$EX_ENGINE_SRC/python/"*.py "$EX_DST/python/" 2>/dev/null || true
|
feat(EX): ix_full_bridge — all 14 ixformer::infer functions bridged
Upstream source: xllm/core/kernels/ilu/ixformer.h (Apache 2.0)
Wrapper patterns: xllm/core/kernels/ilu/{attention,norm,rope,activation,fused_moe,group_gemm}.cpp
Complete bridge (ix_full_bridge.cpp, 331 lines):
MoE: topk_softmax, gen_idx, expand, group_gemm, silu_mul, combine, fused_forward
Attention: paged_attention (decode), flash_attn_prefill (prefill)
Norm: rms_norm, fused_add_rms_norm
RoPE: rotary_embedding
Cache: reshape_and_cache
Linear: ixformer_linear
ix_bridge.py: tries ix_full_bridge first, falls back to ix_moe_bridge
patch_ops.sh: deploys both .cpp files to all JIT search paths
Copied ixformer.h + utils.h headers for reference
2026-08-10 04:01:35 +00:00
|
|
|
# ix_full_bridge.cpp + ix_moe_bridge.cpp for JIT compile — deploy to ALL search paths
|
|
|
|
|
for _BRIDGE in ix_full_bridge.cpp ix_moe_bridge.cpp; do
|
|
|
|
|
cp "$EX_ENGINE_SRC/csrc/$_BRIDGE" "$EX_DST/csrc/" 2>/dev/null || true
|
|
|
|
|
cp "$EX_ENGINE_SRC/csrc/$_BRIDGE" "$EX_DST/python/" 2>/dev/null || true
|
|
|
|
|
cp "$EX_ENGINE_SRC/csrc/$_BRIDGE" "/workspace/ex_engine/csrc/" 2>/dev/null || true
|
|
|
|
|
cp "$EX_ENGINE_SRC/csrc/$_BRIDGE" "/workspace/qwen3_6_scripts/" 2>/dev/null || true
|
|
|
|
|
done
|
2026-08-10 03:00:24 +00:00
|
|
|
touch "$EX_DST/__init__.py"
|
|
|
|
|
touch "$EX_DST/python/__init__.py"
|
2026-08-10 03:02:54 +00:00
|
|
|
# Copy built .so files
|
2026-08-10 03:00:24 +00:00
|
|
|
if [ -d "$EX_ENGINE_SRC/build" ]; then
|
|
|
|
|
cp "$EX_ENGINE_SRC/build/"*.so "$EX_DST/" 2>/dev/null || true
|
|
|
|
|
fi
|
2026-08-10 03:02:54 +00:00
|
|
|
# Deploy MoE CUDA kernel sources for JIT compilation
|
|
|
|
|
if [ -d "$EX_ENGINE_SRC/csrc/moe" ]; then
|
|
|
|
|
mkdir -p "$EX_DST/csrc/moe"
|
|
|
|
|
cp "$EX_ENGINE_SRC/csrc/moe/"*.cu "$EX_DST/csrc/moe/" 2>/dev/null || true
|
|
|
|
|
cp "$EX_ENGINE_SRC/csrc/moe/"*.cuh "$EX_DST/csrc/moe/" 2>/dev/null || true
|
|
|
|
|
echo "[patch_ops] MoE CUDA kernel sources deployed for JIT"
|
|
|
|
|
fi
|
2026-08-10 03:00:24 +00:00
|
|
|
echo "[patch_ops] EX Engine deployed to $EX_DST"
|
|
|
|
|
ls -la "$EX_DST/csrc/" 2>/dev/null || true
|
2026-08-10 02:31:55 +00:00
|
|
|
if [ -n "$VLLM2" ]; then
|
|
|
|
|
EX_DST2="$VLLM2/model_executor/models/ex_engine"
|
2026-08-10 03:00:24 +00:00
|
|
|
mkdir -p "$EX_DST2/python" "$EX_DST2/csrc"
|
|
|
|
|
cp -r "$EX_DST/"* "$EX_DST2/" 2>/dev/null || true
|
2026-08-10 02:31:55 +00:00
|
|
|
fi
|
|
|
|
|
else
|
2026-08-10 03:00:24 +00:00
|
|
|
echo "[patch_ops] WARNING: EX Engine not found — MoE uses slow PyTorch fallback"
|
2026-08-10 02:31:55 +00:00
|
|
|
fi
|
|
|
|
|
|
2026-08-10 03:02:54 +00:00
|
|
|
# Also deploy ex_engine Python package to system path for direct import
|
|
|
|
|
EX_PY_DST="/usr/local/corex/lib/python3/dist-packages/ex_engine"
|
|
|
|
|
if [ -d "$EX_ENGINE_SRC/python" ]; then
|
|
|
|
|
mkdir -p "$EX_PY_DST"
|
|
|
|
|
cp "$EX_ENGINE_SRC/python/"*.py "$EX_PY_DST/" 2>/dev/null || true
|
|
|
|
|
if [ -d "$EX_ENGINE_SRC/csrc/moe" ]; then
|
|
|
|
|
mkdir -p "$EX_PY_DST/../ex_engine/csrc/moe"
|
|
|
|
|
cp "$EX_ENGINE_SRC/csrc/moe/"*.cu "$EX_PY_DST/../ex_engine/csrc/moe/" 2>/dev/null || true
|
|
|
|
|
cp "$EX_ENGINE_SRC/csrc/moe/"*.cuh "$EX_PY_DST/../ex_engine/csrc/moe/" 2>/dev/null || true
|
|
|
|
|
fi
|
|
|
|
|
echo "[patch_ops] EX Engine Python package deployed to $EX_PY_DST"
|
|
|
|
|
fi
|
|
|
|
|
|
2026-08-10 07:41:53 +00:00
|
|
|
# 7. Precompile MoE topk_softmax CUDA kernel (.cu → .so)
|
2026-08-10 04:26:33 +00:00
|
|
|
# This replaces the missing ixf_F.vllm_moe_topk_softmax with our own CUDA kernel
|
|
|
|
|
MOE_TOPK_CU="/workspace/ex_engine/csrc/moe_topk_softmax_v3.cu"
|
|
|
|
|
if [ -f "$MOE_TOPK_CU" ]; then
|
|
|
|
|
echo "[patch_ops] Precompiling moe_topk_softmax_v3.cu ..."
|
|
|
|
|
python3 /workspace/ex_engine/precompile_moe_topk.py 2>&1 || \
|
|
|
|
|
echo "[patch_ops] WARNING: MoE topk precompile failed — will JIT at runtime"
|
2026-08-10 07:50:28 +00:00
|
|
|
# Find and report the compiled .so location
|
|
|
|
|
echo "[patch_ops] Searching for compiled .so ..."
|
|
|
|
|
find /root/.cache/torch_extensions /tmp/torch_extensions -name "*.so" -path "*moe_topk*" 2>/dev/null | head -3
|
|
|
|
|
# Also deploy .cu source to vllm dir for runtime JIT fallback
|
2026-08-10 04:26:33 +00:00
|
|
|
cp "$MOE_TOPK_CU" "$VLLM/model_executor/models/" 2>/dev/null || true
|
|
|
|
|
if [ -n "$VLLM2" ]; then
|
|
|
|
|
cp "$MOE_TOPK_CU" "$VLLM2/model_executor/models/" 2>/dev/null || true
|
|
|
|
|
fi
|
|
|
|
|
fi
|
|
|
|
|
|
|
|
|
|
echo "[patch_ops] DONE — EX Engine + SM70 GDN kernel + MoE topk kernel + serving layer deployed"
|
2026-08-10 02:31:55 +00:00
|
|
|
echo "[patch_ops] Deployed: qwen3_5.py, flash_qla_sm70, ex_engine factors, paged_attn.py, mamba_cache.py, sequence.py, scheduler.py, xformers patches, serving layer"
|
|
|
|
|
echo "[patch_ops] EX factors replace: vllm_moe_topk_softmax (2304 calls/token), gdn_chunk_fwd (NaN fix)"
|
2026-08-10 09:43:36 +00:00
|
|
|
# _custom_ops.py — comp 168 has the same topk_softmax ERROR spam but still works (48/52 pass).
|
|
|
|
|
# Do NOT overwrite. The base image handles it via its own fallback chain.
|
|
|
|
|
echo "[patch_ops] KEEP base _custom_ops.py — comp 168 proves ERROR spam is harmless"
|
2026-08-10 06:56:23 +00:00
|
|
|
|
|
|
|
|
echo "[patch_ops] NOT deployed (base image native): model_runner.py, sampler.py, logits_processor.py, arg_utils.py"
|
2026-08-10 01:06:32 +00:00
|
|
|
|
|
|
|
|
# Deploy flash_qla SM70 GDN kernel (from 1Cat-vLLM, MIT license)
|
|
|
|
|
# This is a fused CUDA kernel for GatedDeltaNet on SM70/SM75 (V100/BI-V100)
|
|
|
|
|
# JIT compiled at runtime via torch.utils.cpp_extension.load()
|
|
|
|
|
FLASH_QLA_DST="$VLLM/model_executor/models/flash_qla_sm70"
|
|
|
|
|
if [ -d "./flash_qla_sm70" ]; then
|
|
|
|
|
rm -rf "$FLASH_QLA_DST" 2>/dev/null
|
|
|
|
|
cp -r ./flash_qla_sm70 "$FLASH_QLA_DST" 2>/dev/null && \
|
|
|
|
|
echo "[patch_ops] flash_qla_sm70 deployed to $FLASH_QLA_DST" || true
|
2026-08-10 01:08:38 +00:00
|
|
|
# Pre-compile CUDA kernel → .so (skipped if no GPU/compiler at build time)
|
|
|
|
|
python3 ./precompile_gdn.py "$FLASH_QLA_DST" 2>&1 || \
|
|
|
|
|
echo "[patch_ops] WARNING: precompile failed — kernel will JIT at runtime"
|
2026-08-10 01:06:32 +00:00
|
|
|
# Also deploy to VLLM2 if present
|
|
|
|
|
if [ -n "$VLLM2" ]; then
|
|
|
|
|
rm -rf "$VLLM2/model_executor/models/flash_qla_sm70" 2>/dev/null
|
2026-08-10 01:08:38 +00:00
|
|
|
cp -r "$FLASH_QLA_DST" "$VLLM2/model_executor/models/flash_qla_sm70" 2>/dev/null || true
|
2026-08-10 01:06:32 +00:00
|
|
|
fi
|
|
|
|
|
fi
|