#!/bin/bash # Comprehensive system-wide patches for BI-V100 Qwen3.6 competition. # Deploys: model layer (qwen3_5.py with NaN protection + CCCL patterns), # engine (model_runner, scheduler, sampler, sequence), attention backends # (xformers, paged_attn, prefix_prefill), serving (tool_parser, reasoning, # protocol, serving_chat, api_server), and _custom_ops (MoE fallback). # No pip install — all files are direct replacements. cd "$(dirname "$0")" echo "[patch_ops] START — working directory: $(pwd)" # 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 if [ -z "$VLLM" ]; then echo "[patch_ops] ERROR: vllm not found" exit 1 fi # 1. Register Qwen3_5 model configs in transformers (no pip install!) TMODELS="" 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 TMODELS="$P" break fi done if [ -n "$TMODELS" ]; then 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)" else echo "[patch_ops] WARNING: transformers/models not found" fi # 2. Model registry if [ -f ./registry.py ]; then cp ./registry.py "$VLLM/model_executor/models/registry.py" 2>/dev/null && \ echo "[patch_ops] registry.py deployed" || echo "[patch_ops] WARNING: registry deploy failed" fi # 2b. Deploy our optimized qwen3_5.py model file # CRITICAL: Without this, the container uses the base image's original qwen3_5.py # which has no NaN clamping, no overflow protection, no hardware-aware policy, # no optimized MoE decode path, and no prefix-cache state alignment. # Our qwen3_5.py has: # - HardwarePolicy: CCCL cc_dispatch pattern — detect BI-V100 caps once at init # - DeltaNet overflow_cast: g.clamp(-0.5,0.5) + cumsum clamp(-12,12) → prevents 99.98% NaN # - Forward substitution fallback: no cuSOLVER needed on BI-V100 # - Batched GEMM decode: 3 kernel launches vs 16 for MoE single-token # - Sorted-segment MoE prefill: CCCL histogram sort pattern # - GDN prefix-cache state save/restore for chunked prefill if [ -f ./qwen3_5.py ]; then cp ./qwen3_5.py "$VLLM/model_executor/models/qwen3_5.py" 2>/dev/null && \ echo "[patch_ops] qwen3_5.py model file deployed" || echo "[patch_ops] WARNING: qwen3_5.py deploy failed" fi # 2c. Deploy _custom_ops.py with MoE kernel fallback # BI-V100 ixformer lacks vllm_moe_topk_softmax → our _custom_ops.py has # a PyTorch fallback (softmax→topk→in-place write) so the MoE path # doesn't crash with AttributeError. if [ -f ./_custom_ops.py ]; then cp ./_custom_ops.py "$VLLM/_custom_ops.py" 2>/dev/null && \ echo "[patch_ops] _custom_ops.py deployed" || echo "[patch_ops] WARNING: _custom_ops.py deploy failed" fi # 2d. Deploy ALL engine components — comprehensive system-wide patch # Each file goes to its correct location in the vllm package. # Map: local_file -> relative_path_under_VLLM declare -A ENGINE_FILES=( # Core engine ["model_runner.py"]="worker/model_runner.py" ["sampler.py"]="model_executor/layers/sampler.py" ["sequence.py"]="sequence.py" ["logits_processor.py"]="model_executor/layers/logits_processor.py" ["mamba_cache.py"]="model_executor/models/mamba_cache.py" ["scheduler.py"]="core/scheduler.py" ["arg_utils.py"]="engine/arg_utils.py" # Attention ["xformers.py"]="attention/backends/xformers.py" ["paged_attn.py"]="attention/backends/paged_attn.py" ["paged_attention_v2_pytorch.py"]="attention/ops/paged_attention_v2_pytorch.py" ["prefix_prefill.py"]="attention/ops/prefix_prefill.py" # Patches ["patch_numerical_stability.py"]="patch_numerical_stability.py" ) for LOCAL_FILE in "${!ENGINE_FILES[@]}"; do DEST="${ENGINE_FILES[$LOCAL_FILE]}" if [ -f "./$LOCAL_FILE" ]; then # Create parent directory if needed mkdir -p "$(dirname "$VLLM/$DEST")" 2>/dev/null || true cp "./$LOCAL_FILE" "$VLLM/$DEST" 2>/dev/null && \ echo "[patch_ops] $LOCAL_FILE → $DEST" || \ echo "[patch_ops] WARNING: failed to deploy $LOCAL_FILE" fi done # 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 echo "[patch_ops] tool parser deployed" # 4. Reasoning parser cp -r ./reasoning "$VLLM/" 2>/dev/null || true echo "[patch_ops] reasoning parser deployed" # 5. Serving layer (protocol, chat, api_server, cli_args, chat_utils) 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" # 6. If second vllm path exists, copy there too 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 echo "[patch_ops] Second vllm found at: $VLLM2 — copying patches" cp ./registry.py "$VLLM2/model_executor/models/registry.py" 2>/dev/null || true cp ./qwen3_5.py "$VLLM2/model_executor/models/qwen3_5.py" 2>/dev/null || true cp ./_custom_ops.py "$VLLM2/_custom_ops.py" 2>/dev/null || true # Deploy all engine components to VLLM2 as well for LOCAL_FILE in "${!ENGINE_FILES[@]}"; do DEST="${ENGINE_FILES[$LOCAL_FILE]}" if [ -f "./$LOCAL_FILE" ]; then mkdir -p "$(dirname "$VLLM2/$DEST")" 2>/dev/null || true cp "./$LOCAL_FILE" "$VLLM2/$DEST" 2>/dev/null || true fi done 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 echo "[patch_ops] DONE — full system patch: model(qwen3_5.py), engine(model_runner,scheduler,sampler,sequence), attention(xformers,paged_attn,prefix_prefill), serving(chat,protocol,tool_parser,reasoning), ops(_custom_ops)"