Compare commits

...

11 Commits

Author SHA1 Message Date
Claude
7d6884d15a tool: verify_bridge.sh — 验证prebuilt .so是v1还是v2,缺MoE则自动重编
5步验证流程:
  Step 1: 定位 prebuilt ix_full_bridge.so
  Step 2: nm -D 检查导出符号 (v1=5函数 vs v2=13函数)
  Step 3: 检查编译源文件+工具链+依赖库
  Step 4: 缺MoE函数则调用 build_moe_bridge.sh 重编
  Step 5: Python import 验证最终 .so 的函数列表
2026-08-17 08:49:14 +00:00
root
b81a071f84 merge modelhub: bridge_v2 + patch_vllm_ops fix 2026-08-17 08:34:14 +00:00
root
c044d04509 merge modelhub: dockerignore fix + build_moe_bridge 2026-08-17 07:54:23 +00:00
root
8211a45464 platform test baseline4 2026-08-17 07:22:14 +00:00
dev
be4d661191 revert: undo 2 premature pushes (ee516bd2, 9ea0a1d4) — code needs review first 2026-08-17 07:04:50 +00:00
dev
9ea0a1d4f4 fix: resolve all 8 deployment pipeline breaks
Breaks found and fixed:

1. Dockerfile: COPY 5 individual files → COPY entire ex_engine/
2. patch_ops.sh EX_ENGINE_DIR: /workspace/ex_engine not found → added fallback
3. patch_ops.sh deploy: ix_ops.py to ex_engine/ (flat) → ex_engine/python/ (correct package)
4. ix_startup_patch.py: import from vllm.ex_engine.patch_vllm_ops → vllm.ex_engine.python.patch_vllm_ops
5. ix_moe_bridge.so: only deployed to ex_engine/ → also copy to model_executor/models/ and vllm root
6. ex_engine/__init__.py: missing re-exports → add imports so 'from vllm.ex_engine import x' works
7. gemm_grouped.so: compiled but never imported → add import + flag + prefill GEMM path in qwen3_5.py
8. build_moe_bridge.sh Python heredoc: SCRIPT_DIR not exported + wrong nested path → export + search both layouts

Also added:
- CUTLASS batched GEMM compile step (corex_batched_gemm.so for decode)
- Full ex_engine/python/*.py deployment (was deploying only 2 of 19 files)
- EX_ENGINE_INFRA_AUDIT.md documenting all findings
2026-08-17 07:01:41 +00:00
dev
ee516bd206 fix: connect ex_engine to Docker build pipeline
Path breaks fixed:
1. Dockerfile: COPY entire ex_engine/ instead of 5 individual files
2. patch_ops.sh: EX_ENGINE_DIR fallback to /workspace/ex_engine
3. build_moe_bridge.sh: search csrc/ under both SCRIPT_DIR and SCRIPT_DIR/ex_engine

New build steps added to patch_ops.sh:
- Build gemm_grouped.so (CUTLASS Cu10 grouped GEMM, verified on device)
- Build corex_batched_gemm.so (CUTLASS batched GEMM for decode)
- Build ix_moe_bridge.so (7-step fused MoE pipeline)
- Deploy all ex_engine/python/*.py to VLLM_ROOT/ex_engine/python/

Previously broken: ix_ops.py, patch_vllm_ops.py, ix_startup_patch.py
were never deployed because EX_ENGINE_DIR resolved to nonexistent path.
xllm_activation/norm/rope/cache.so were copied but had no Python caller.
2026-08-17 06:56:11 +00:00
Claude
461addf428 Revert "feat: 10-file algorithm factor system — full 10-layer AST call chain"
This reverts commit 3581dd5435.
2026-08-17 05:32:26 +00:00
project6-dev
79562c342d Revert "feat: build_all.sh — compile 3 .so from 10 algorithm factor files"
This reverts commit 401d33ca6b.
2026-08-17 05:31:17 +00:00
Claude
3581dd5435 feat: 10-file algorithm factor system — full 10-layer AST call chain
Layer 1: hw_config.h (245 lines) — BI-V100 hardware descriptor + tuning tables
Layer 2: moe_pipeline.py (461 lines) — MoE 7-step pipeline orchestrator
Layer 3: attn_dispatch.py (270 lines) — Attention prefill/decode dispatch
Layer 4: ilu_ops_api.h (182 lines) — Dispatch signature contract
Layer 5: kernel_moe_ops.cpp (155 lines) — MoE kernel-level ops wrappers
Layer 6: kernel_elem_ops.cpp (210 lines) — Element-wise kernel wrappers
Layer 7: ixformer_infer.h (246 lines) — ixformer::infer namespace contract
Layer 8: factor_topk_softmax.cu (456 lines) — MoE routing CUDA kernel
Layer 9: factor_moe_compute_index.cu (174 lines) — Token index CUDA kernel
Layer 10: factor_moe_combine.cu (154 lines) — Weighted combine CUDA kernel

Total: 2553 lines across 10 files (h/cpp/cu/py)
Upstream reference: 2787 lines across corresponding 10 xllm AST layers

Each file follows the read-read-read-write pattern from upstream xllm,
ds_vllm, and fla repos. No hand-written inference code — all kernel
logic is cat-migrated from the upstream references.
2026-08-17 05:30:53 +00:00
project6-dev
401d33ca6b feat: build_all.sh — compile 3 .so from 10 algorithm factor files
AST chain (aligned to xllm ILU layer):
  _ixformer_torch.so (base) → ix_full_bridge.so (7 ops) → Python
  moe_ops_impl.cu (5 CUDA kernels) → ix_moe_bridge.so (7-step MoE) → Python
  gemm_grouped.cu (CUTLASS Cu10) → gemm_grouped.so (verified 1.97x) → Python
  cuinfer_gemm_wrapper.cu → cuinferCustomGemm C API → Python

Symbol sources verified from cat_files/symbol_dumps
2026-08-17 05:30:21 +00:00

294
ex_engine/verify_bridge.sh Executable file
View File

@@ -0,0 +1,294 @@
#!/usr/bin/env bash
# verify_bridge.sh — 验证 prebuilt ix_full_bridge.so 并决定是否重编
#
# 在真机上跑: bash ex_engine/verify_bridge.sh
#
# 验证步骤:
# 1. nm -D 检查 prebuilt ix_full_bridge.so 的导出符号
# 2. 对比 v1 (5函数) vs v2 (13函数) 的期望
# 3. 检查 MoE 符号是否缺失
# 4. 如果缺失,用 build_moe_bridge.sh 重编
# 5. 验证新编译的 .so 符号是否完整
set -euo pipefail
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
REPO_ROOT="$(cd "${SCRIPT_DIR}/.." && pwd)"
# =========================================================================
# Step 1: 找到 prebuilt .so
# =========================================================================
echo "========================================="
echo "[verify] Step 1: 定位 prebuilt ix_full_bridge.so"
echo "========================================="
PREBUILT=""
for p in \
"${REPO_ROOT}/qwen3_6_scripts/prebuilt/corex-3.2.3-ivcore10/ix_full_bridge.so" \
"${SCRIPT_DIR}/prebuilt/ix_full_bridge.so" \
"${SCRIPT_DIR}/prebuilt/ix_full_bridge_v2.so" \
"${SCRIPT_DIR}/prebuilt/ix_moe_bridge.so"; do
if [[ -f "$p" ]]; then
PREBUILT="$p"
echo "[verify] 找到: $p ($(stat -c%s "$p" 2>/dev/null || stat -f%z "$p") bytes)"
break
fi
done
if [[ -z "$PREBUILT" ]]; then
echo "[verify] ⚠ 没找到任何 prebuilt .so"
echo "[verify] 直接跳到 Step 4 重编"
NEED_REBUILD=1
else
NEED_REBUILD=0
fi
# =========================================================================
# Step 2: nm -D 检查导出符号
# =========================================================================
if [[ "$NEED_REBUILD" -eq 0 ]]; then
echo ""
echo "========================================="
echo "[verify] Step 2: nm -D 检查导出符号"
echo "========================================="
echo "[verify] 所有 T (text) 符号:"
nm -D "$PREBUILT" 2>/dev/null | grep " T " | while read -r line; do
# c++filt demangle
sym=$(echo "$line" | awk '{print $3}')
demangled=$(echo "$sym" | c++filt 2>/dev/null || echo "$sym")
echo " $demangled"
done
echo ""
echo "[verify] 检查 v1 函数 (5个 base ops):"
V1_FUNCS=("silu_and_mul" "rms_norm" "fused_add_rms_norm" "rotary_embedding" "reshape_and_cache")
V1_COUNT=0
for func in "${V1_FUNCS[@]}"; do
if nm -D "$PREBUILT" 2>/dev/null | grep -q "$func"; then
echo " ✓ $func"
((V1_COUNT++)) || true
else
echo " ✗ $func MISSING"
fi
done
echo ""
echo "[verify] 检查 v2 新增函数 (8个 MoE ops):"
V2_FUNCS=("paged_attention" "topk_softmax" "moe_gen_idx" "moe_expand_input" "group_gemm" "moe_combine_result" "fused_moe_forward" "ix_linear")
V2_COUNT=0
for func in "${V2_FUNCS[@]}"; do
if nm -D "$PREBUILT" 2>/dev/null | grep -q "$func"; then
echo " ✓ $func"
((V2_COUNT++)) || true
else
echo " ✗ $func MISSING"
fi
done
echo ""
echo "[verify] 结果: v1=${V1_COUNT}/5, v2_new=${V2_COUNT}/8"
if [[ "$V2_COUNT" -ge 6 ]]; then
echo "[verify] ✓ 这个 .so 是 v2 编的,MoE 函数完整"
NEED_REBUILD=0
elif [[ "$V1_COUNT" -ge 3 ]]; then
echo "[verify] ⚠ 这个 .so 是 v1 编的(或中间版本),缺少 MoE 函数"
NEED_REBUILD=1
else
echo "[verify] ✗ 这个 .so 符号异常,需要重编"
NEED_REBUILD=1
fi
fi
# =========================================================================
# Step 3: 检查源文件是否就绪
# =========================================================================
echo ""
echo "========================================="
echo "[verify] Step 3: 检查编译源文件"
echo "========================================="
MOE_CU=""
BRIDGE_CPP=""
for base in "${SCRIPT_DIR}" "${SCRIPT_DIR}/ex_engine"; do
[[ -f "${base}/csrc/moe_ops_impl.cu" ]] && MOE_CU="${base}/csrc/moe_ops_impl.cu"
[[ -f "${base}/csrc/ix_full_bridge_v2.cpp" ]] && BRIDGE_CPP="${base}/csrc/ix_full_bridge_v2.cpp"
done
echo "[verify] moe_ops_impl.cu: ${MOE_CU:-NOT FOUND} $([ -n "$MOE_CU" ] && wc -l < "$MOE_CU" || echo 0) lines"
echo "[verify] ix_full_bridge_v2.cpp: ${BRIDGE_CPP:-NOT FOUND} $([ -n "$BRIDGE_CPP" ] && wc -l < "$BRIDGE_CPP" || echo 0) lines"
# 检查v2里的pybind导出数量
if [[ -n "$BRIDGE_CPP" ]]; then
MDEF_COUNT=$(grep -c 'm.def(' "$BRIDGE_CPP" || true)
echo "[verify] v2 m.def() 数量: ${MDEF_COUNT} (期望13)"
fi
# 检查moe_ops_impl里的5个函数
if [[ -n "$MOE_CU" ]]; then
echo "[verify] moe_ops_impl.cu 实现的函数:"
grep -E "^void |^torch::Tensor " "$MOE_CU" | while read -r line; do
echo " → $line"
done
fi
# 检查编译工具链
echo ""
echo "[verify] 编译环境:"
COREX_ROOT="${COREX_ROOT:-/usr/local/corex}"
echo " COREX_ROOT: ${COREX_ROOT}"
echo " clang++: $(command -v clang++ 2>/dev/null || echo 'NOT FOUND') $(${COREX_ROOT}/bin/clang++ --version 2>/dev/null | head -1 || echo '')"
echo " python3: $(python3 --version 2>/dev/null || echo 'NOT FOUND')"
echo " torch: $(python3 -c 'import torch; print(torch.__version__)' 2>/dev/null || echo 'NOT FOUND')"
echo " ixformer: $(python3 -c 'import ixformer; print(ixformer.__version__)' 2>/dev/null || echo 'NOT FOUND')"
# libcuinfer.so
CUINFER=""
for d in "${COREX_ROOT}/lib64" "${COREX_ROOT}/lib" "/usr/lib64" "/usr/lib"; do
if [[ -f "${d}/libcuinfer.so" ]]; then
CUINFER="${d}/libcuinfer.so"
break
fi
done
echo " libcuinfer.so: ${CUINFER:-NOT FOUND}"
# ixformer .so
IX_DIR=""
IX_SO_COUNT=0
for d in \
"${COREX_ROOT}/lib/python3/dist-packages/ixformer" \
"${COREX_ROOT}/lib64/python3/dist-packages/ixformer" \
"$(python3 -c 'import ixformer, os; print(os.path.dirname(ixformer.__file__))' 2>/dev/null || echo '')"; do
if [[ -d "$d" ]]; then
IX_DIR="$d"
IX_SO_COUNT=$(find "$d" -name "*.so" -type f 2>/dev/null | wc -l)
break
fi
done
echo " ixformer dir: ${IX_DIR:-NOT FOUND} (${IX_SO_COUNT} .so files)"
# _ixformer_torch.so — 关键: v2 bridge链接的对象
IX_TORCH=""
if [[ -n "$IX_DIR" ]]; then
IX_TORCH=$(find "$IX_DIR" -name "_ixformer_torch*" -type f 2>/dev/null | head -1)
fi
echo " _ixformer_torch.so: ${IX_TORCH:-NOT FOUND}"
if [[ -n "$IX_TORCH" ]]; then
echo " _ixformer_torch.so 导出 (v2需要的7个):"
for sym in silu_and_mul_forward rms_norm_forward fused_add_rms_norm_forward \
ixformer_linear vllm_rotary_embedding_neox \
vllm_cache_ops_reshape_and_cache vllm_single_query_cached_kv; do
if nm -D "$IX_TORCH" 2>/dev/null | grep -q "$sym"; then
echo " ✓ $sym"
else
echo " ✗ $sym MISSING"
fi
done
fi
# =========================================================================
# Step 4: 重编(如果需要)
# =========================================================================
if [[ "$NEED_REBUILD" -eq 1 ]]; then
echo ""
echo "========================================="
echo "[verify] Step 4: 需要重编 — 调用 build_moe_bridge.sh"
echo "========================================="
if [[ -z "$MOE_CU" ]] || [[ -z "$BRIDGE_CPP" ]]; then
echo "[verify] ✗ 源文件缺失,无法编译"
exit 1
fi
BUILD_SCRIPT="${SCRIPT_DIR}/build_moe_bridge.sh"
if [[ -f "$BUILD_SCRIPT" ]]; then
echo "[verify] 执行: bash ${BUILD_SCRIPT}"
bash "$BUILD_SCRIPT"
echo ""
else
echo "[verify] build_moe_bridge.sh 不存在,尝试用 build_ix_bridge.sh"
ALT_SCRIPT="${SCRIPT_DIR}/build_ix_bridge.sh"
if [[ -f "$ALT_SCRIPT" ]]; then
echo "[verify] 执行: bash ${ALT_SCRIPT}"
bash "$ALT_SCRIPT"
else
echo "[verify] ✗ 没有可用的编译脚本"
exit 1
fi
fi
else
echo ""
echo "========================================="
echo "[verify] Step 4: 跳过 — .so 已经是 v2"
echo "========================================="
fi
# =========================================================================
# Step 5: 验证编译结果
# =========================================================================
echo ""
echo "========================================="
echo "[verify] Step 5: 验证最终 .so"
echo "========================================="
# 找新编译的 .so
FINAL_SO=""
for p in \
"${SCRIPT_DIR}/prebuilt/ix_moe_bridge.so" \
"${SCRIPT_DIR}/prebuilt/ix_full_bridge_v2.so" \
"$PREBUILT"; do
if [[ -f "$p" ]]; then
FINAL_SO="$p"
break
fi
done
if [[ -z "$FINAL_SO" ]]; then
echo "[verify] ✗ 找不到最终 .so"
exit 1
fi
echo "[verify] 验证: $FINAL_SO"
# Python import 测试
python3 << PYTEST
import sys, os, ctypes, importlib
so_path = "${FINAL_SO}"
print(f"[verify] Loading: {so_path}")
# 方法1: ctypes 检查符号
try:
lib = ctypes.CDLL(so_path)
print("[verify] ✓ ctypes.CDLL 加载成功")
except Exception as e:
print(f"[verify] ✗ ctypes.CDLL 失败: {e}")
# 方法2: importlib (pybind11 module)
try:
so_dir = os.path.dirname(so_path)
so_name = os.path.splitext(os.path.basename(so_path))[0]
sys.path.insert(0, so_dir)
mod = importlib.import_module(so_name)
funcs = [f for f in dir(mod) if not f.startswith('_')]
print(f"[verify] ✓ import {so_name} 成功,导出 {len(funcs)} 个函数:")
for f in funcs:
print(f" → {f}")
# 验证关键函数
expected = ['silu_and_mul', 'rms_norm', 'topk_softmax',
'group_gemm', 'moe_combine_result', 'fused_moe_forward']
missing = [f for f in expected if f not in funcs]
if missing:
print(f"[verify] ⚠ 缺少: {missing}")
else:
print(f"[verify] ✓ 所有关键函数都在")
except Exception as e:
print(f"[verify] ✗ import 失败: {e}")
PYTEST
echo ""
echo "========================================="
echo "[verify] 完成"
echo "========================================="