From e44020797710aaa7fc03d39a56b0d40db91806ec Mon Sep 17 00:00:00 2001 From: claude Date: Tue, 11 Aug 2026 07:35:24 +0000 Subject: [PATCH] =?UTF-8?q?fix(build):=20bridge=E7=BC=96=E8=AF=91=E4=B8=8D?= =?UTF-8?q?=E4=BE=9D=E8=B5=96torch.utils.cpp=5Fextension?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit corex torch精简了cpp_extension模块,改用手动发现torch include/lib路径。 同时确认Tier1 (ixformer.functions) 已在真机验证通过: - silu_and_mul ✓ - rms_norm ✓ - moe_topk_softmax ✓ 即使bridge编不出来,ix_unified也通过Tier1走ixformer硬件加速。 --- ex_engine/build_unified_bridge.sh | 71 +++++++++++-------------------- 1 file changed, 26 insertions(+), 45 deletions(-) diff --git a/ex_engine/build_unified_bridge.sh b/ex_engine/build_unified_bridge.sh index 5c0ae4eb..34026787 100755 --- a/ex_engine/build_unified_bridge.sh +++ b/ex_engine/build_unified_bridge.sh @@ -1,16 +1,6 @@ #!/usr/bin/env bash -# build_unified_bridge.sh — Compile ix_unified_bridge.so on BI-V100 real hardware -# -# This builds a single .so that exposes all 14 ixformer::infer functions -# to Python via pybind11. It links against the base image's existing -# ixformer .so files at runtime (no static linking needed). -# -# Usage: -# cd /tmp/gdn_test/project_6 && bash ex_engine/build_unified_bridge.sh -# -# Output: -# ex_engine/build/ix_unified_bridge.cpython-310-x86_64-linux-gnu.so - +# build_unified_bridge.sh — Compile ix_unified_bridge.so on BI-V100 +# Uses manual compiler flags since torch.utils.cpp_extension is stripped from corex torch. set -euo pipefail SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" @@ -18,58 +8,49 @@ SRC_DIR="${SCRIPT_DIR}/csrc/ilu" BUILD_DIR="${SCRIPT_DIR}/build" mkdir -p "$BUILD_DIR" -# Detect Python PYTHON=${PYTHON:-python3} PY_INC=$($PYTHON -c "import sysconfig; print(sysconfig.get_path('include'))") PY_SUFFIX=$($PYTHON -c "import sysconfig; print(sysconfig.get_config_var('EXT_SUFFIX'))") -# Detect PyTorch -TORCH_DIR=$($PYTHON -c "import torch; print(torch.utils.cmake_prefix_path)") -TORCH_INC=$($PYTHON -c "import torch; print(torch.utils.cpp_extension.include_paths()[0])") -TORCH_LIB=$($PYTHON -c "import torch; print(torch.utils.cpp_extension.library_paths()[0])") +# Torch paths — manual discovery (no cpp_extension) +TORCH_ROOT=$($PYTHON -c "import torch; import os; print(os.path.dirname(torch.__file__))") +TORCH_INC="${TORCH_ROOT}/include" +TORCH_INC2="${TORCH_ROOT}/include/torch/csrc/api/include" +TORCH_LIB="${TORCH_ROOT}/lib" -# Detect corex compiler (prefer) or system g++ -if [ -f /usr/local/corex/bin/clang++ ]; then - CXX=/usr/local/corex/bin/clang++ - echo "[build] Using CoreX clang++: $CXX" -elif [ -f /usr/local/corex/lib64/clang/16/bin/clang++ ]; then - CXX=/usr/local/corex/lib64/clang/16/bin/clang++ - echo "[build] Using CoreX clang/16: $CXX" -else - CXX=g++ - echo "[build] Using system g++: $CXX" -fi +# Compiler: corex clang or system g++ +for _CXX in /usr/local/corex/bin/clang++ /usr/local/corex-3.2.3/bin/clang++ g++; do + [ -x "$_CXX" ] && CXX="$_CXX" && break +done +echo "[build] CXX=$CXX" +echo "[build] TORCH_ROOT=$TORCH_ROOT" +echo "[build] PY_INC=$PY_INC" -echo "[build] Python include: $PY_INC" -echo "[build] Torch include: $TORCH_INC" -echo "[build] Torch lib: $TORCH_LIB" -echo "[build] Output suffix: $PY_SUFFIX" - -# Compile OUT="${BUILD_DIR}/ix_unified_bridge${PY_SUFFIX}" $CXX -shared -fPIC -O2 -std=c++17 \ -I"$SRC_DIR" \ -I"$PY_INC" \ -I"$TORCH_INC" \ - -I"$TORCH_INC/torch/csrc/api/include" \ + -I"$TORCH_INC2" \ -L"$TORCH_LIB" \ -ltorch -ltorch_cpu -ltorch_cuda -lc10 -lc10_cuda \ - -Wl,--no-as-needed \ + -Wl,--no-as-needed,-rpath,"$TORCH_LIB" \ -D_GLIBCXX_USE_CXX11_ABI=0 \ -DTORCH_EXTENSION_NAME=ix_unified_bridge \ "$SRC_DIR/ix_unified_bridge.cpp" \ - -o "$OUT" + -o "$OUT" 2>&1 -echo "[build] SUCCESS: $OUT" -ls -lh "$OUT" - -# Verify -$PYTHON -c " -import importlib.util, sys +if [ -f "$OUT" ]; then + echo "[build] SUCCESS: $OUT ($(du -h "$OUT" | cut -f1))" + $PYTHON -c " +import importlib.util spec = importlib.util.spec_from_file_location('ix_unified_bridge', '$OUT') mod = importlib.util.module_from_spec(spec) spec.loader.exec_module(mod) funcs = [x for x in dir(mod) if not x.startswith('_')] -print(f'[verify] {len(funcs)} functions exported: {funcs}') -" || echo "[verify] Import test requires ixformer runtime (expected on non-BI-V100)" +print(f'[verify] {len(funcs)} functions: {funcs}') +" 2>&1 || echo "[verify] import test needs ixformer runtime symbols" +else + echo "[build] FAILED" +fi