Architecture (CCCL dispatch pattern):
base_image ixformer::infer → ix_full_bridge.so → ix_ops.py → vllm patches
New files:
ex_engine/python/ix_ops.py — Python API for all 14 ixformer::infer ops
ex_engine/python/patch_vllm_ops.py — monkey-patch vllm GemmaRMSNorm, SiluAndMul
ex_engine/deploy_ix_bridge.sh — build-time deployment script
Modified:
qwen3_6_scripts/patch_ops.sh — integrated ix_bridge deployment + startup hook
Call chain: DecoderLayer.forward → GemmaRMSNorm → ix_ops.fused_add_rms_norm
→ ixformer::infer::residual_rms_norm (fused C++ kernel)
155 lines
5.5 KiB
Bash
Executable File
155 lines
5.5 KiB
Bash
Executable File
#!/bin/bash
|
|
# ex_engine/deploy_ix_bridge.sh — Deploy ix_full_bridge + Python ops into vllm
|
|
#
|
|
# Architecture (CCCL build pattern):
|
|
# CCCL: cmake → compile → install to site-packages
|
|
# EX: torch.utils.cpp_extension → compile bridge → deploy to vllm pkg
|
|
#
|
|
# What this does:
|
|
# 1. Find ixformer .so libraries in base image
|
|
# 2. Either use prebuilt ix_full_bridge.so or JIT-compile from source
|
|
# 3. Deploy .so + Python modules into vllm package
|
|
# 4. Verify dlopen chain works
|
|
#
|
|
# Source mapping:
|
|
# ex_engine/csrc/ix_full_bridge_v2.cpp → pybind11 bridge to ixformer::infer
|
|
# ex_engine/python/ix_ops.py → Python API layer
|
|
# ex_engine/python/patch_vllm_ops.py → vllm monkey-patches
|
|
#
|
|
# Called from: qwen3_6_scripts/patch_ops.sh
|
|
|
|
set -euo pipefail
|
|
|
|
SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
|
|
VLLM_ROOT="${1:-$(python3 -c 'import vllm; import os; print(os.path.dirname(vllm.__file__))' 2>/dev/null || echo '/usr/local/corex/lib/python3/dist-packages/vllm')}"
|
|
|
|
echo "[ix_bridge] VLLM_ROOT=${VLLM_ROOT}"
|
|
echo "[ix_bridge] SCRIPT_DIR=${SCRIPT_DIR}"
|
|
|
|
# =========================================================================
|
|
# Step 1: Deploy prebuilt .so if available
|
|
# =========================================================================
|
|
PREBUILT="${SCRIPT_DIR}/../qwen3_6_scripts/prebuilt/corex-3.2.3-ivcore10"
|
|
BRIDGE_SO=""
|
|
|
|
if [[ -f "${PREBUILT}/ix_full_bridge.so" ]]; then
|
|
cp "${PREBUILT}/ix_full_bridge.so" "${VLLM_ROOT}/ix_full_bridge.so"
|
|
BRIDGE_SO="${VLLM_ROOT}/ix_full_bridge.so"
|
|
echo "[ix_bridge] deployed prebuilt ix_full_bridge.so"
|
|
fi
|
|
|
|
# Deploy all corex_*.so and xllm_*.so
|
|
if [[ -d "$PREBUILT" ]]; then
|
|
for so_file in "${PREBUILT}"/*.so; do
|
|
base=$(basename "$so_file")
|
|
if [[ "$base" != "ix_full_bridge.so" ]]; then
|
|
cp "$so_file" "${VLLM_ROOT}/${base}" 2>/dev/null || true
|
|
echo "[ix_bridge] deployed ${base}"
|
|
fi
|
|
done
|
|
fi
|
|
|
|
# =========================================================================
|
|
# Step 2: Deploy Python integration modules
|
|
# =========================================================================
|
|
# Create ex_engine package in vllm
|
|
EX_PKG="${VLLM_ROOT}/ex_engine"
|
|
mkdir -p "${EX_PKG}"
|
|
|
|
cat > "${EX_PKG}/__init__.py" << 'PYEOF'
|
|
"""ex_engine — Algorithm factor replacement engine for BI-V100."""
|
|
PYEOF
|
|
|
|
# Deploy ix_ops.py
|
|
cp "${SCRIPT_DIR}/python/ix_ops.py" "${EX_PKG}/ix_ops.py"
|
|
echo "[ix_bridge] deployed ix_ops.py"
|
|
|
|
# Deploy patch_vllm_ops.py
|
|
cp "${SCRIPT_DIR}/python/patch_vllm_ops.py" "${EX_PKG}/patch_vllm_ops.py"
|
|
echo "[ix_bridge] deployed patch_vllm_ops.py"
|
|
|
|
# Also make ix_ops importable from vllm.ex_engine
|
|
# and from the top-level ex_engine path
|
|
SITE_EX="${SCRIPT_DIR}/python"
|
|
if [[ -d "$SITE_EX" ]]; then
|
|
# Ensure __init__.py exists
|
|
touch "${SITE_EX}/../__init__.py" 2>/dev/null || true
|
|
fi
|
|
|
|
# =========================================================================
|
|
# Step 3: Create auto-patch entry point
|
|
# =========================================================================
|
|
# This script is sourced by patch_ops.sh to ensure ix_ops patches
|
|
# are applied at vllm startup
|
|
cat > "${VLLM_ROOT}/ix_startup_patch.py" << 'PYEOF'
|
|
"""
|
|
ix_startup_patch.py — Apply ix_ops patches at vllm startup.
|
|
|
|
Import this module early in the vllm startup to replace PyTorch fallbacks
|
|
with fused C++ kernels from the base image.
|
|
|
|
Architecture (CCCL dispatch pattern):
|
|
import vllm → vllm.__init__ → ix_startup_patch → patch_vllm_ops
|
|
"""
|
|
import logging
|
|
logger = logging.getLogger("ix_startup_patch")
|
|
|
|
def apply():
|
|
"""Apply all available ix_ops patches."""
|
|
try:
|
|
from vllm.ex_engine.patch_vllm_ops import apply_all_patches
|
|
n = apply_all_patches()
|
|
if n > 0:
|
|
logger.info("ix_startup_patch: %d patches applied", n)
|
|
return n
|
|
except Exception as e:
|
|
logger.warning("ix_startup_patch failed: %s", e)
|
|
return 0
|
|
|
|
# Auto-apply on import
|
|
_n_patches = apply()
|
|
PYEOF
|
|
echo "[ix_bridge] deployed ix_startup_patch.py"
|
|
|
|
# =========================================================================
|
|
# Step 4: Deploy bridge C++ source for JIT fallback
|
|
# =========================================================================
|
|
CSRC_DEST="${VLLM_ROOT}/ex_engine/csrc"
|
|
mkdir -p "${CSRC_DEST}"
|
|
for cpp in "${SCRIPT_DIR}/csrc/ix_full_bridge_v2.cpp" \
|
|
"${SCRIPT_DIR}/csrc/ix_full_bridge.cpp" \
|
|
"${SCRIPT_DIR}/csrc/ix_moe_bridge.cpp"; do
|
|
if [[ -f "$cpp" ]]; then
|
|
cp "$cpp" "${CSRC_DEST}/"
|
|
echo "[ix_bridge] deployed $(basename $cpp) for JIT fallback"
|
|
fi
|
|
done
|
|
|
|
# =========================================================================
|
|
# Step 5: Verify deployment
|
|
# =========================================================================
|
|
echo ""
|
|
echo "[ix_bridge] === Deployment Summary ==="
|
|
echo "[ix_bridge] Bridge .so: ${BRIDGE_SO:-'(JIT compile at runtime)'}"
|
|
echo "[ix_bridge] Python ops: ${EX_PKG}/ix_ops.py"
|
|
echo "[ix_bridge] vllm patches: ${EX_PKG}/patch_vllm_ops.py"
|
|
echo "[ix_bridge] Startup hook: ${VLLM_ROOT}/ix_startup_patch.py"
|
|
|
|
# Quick Python import test
|
|
python3 -c "
|
|
import sys
|
|
sys.path.insert(0, '${VLLM_ROOT}')
|
|
try:
|
|
from vllm.ex_engine import ix_ops
|
|
print('[ix_bridge] ✓ ix_ops importable')
|
|
except Exception as e:
|
|
print(f'[ix_bridge] ✗ ix_ops import failed: {e}')
|
|
try:
|
|
from vllm.ex_engine import patch_vllm_ops
|
|
print('[ix_bridge] ✓ patch_vllm_ops importable')
|
|
except Exception as e:
|
|
print(f'[ix_bridge] ✗ patch_vllm_ops import failed: {e}')
|
|
" 2>&1 || true
|
|
|
|
echo "[ix_bridge] === Done ==="
|