feat: bridge加载前pre-load ixformer符号 + 运行时验证脚本
This commit is contained in:
@@ -30,6 +30,19 @@ def _load_bridge():
|
|||||||
if _bridge is not None:
|
if _bridge is not None:
|
||||||
return _bridge
|
return _bridge
|
||||||
|
|
||||||
|
# Pre-load ixformer .so symbols (bridge links against them at runtime)
|
||||||
|
try:
|
||||||
|
import ctypes, glob as _glob
|
||||||
|
for _base in ["/usr/local/corex/lib64/python3/dist-packages/ixformer",
|
||||||
|
"/usr/local/corex/lib/python3/dist-packages/ixformer"]:
|
||||||
|
for _so in _glob.glob(os.path.join(_base, "**/*.so"), recursive=True):
|
||||||
|
try:
|
||||||
|
ctypes.CDLL(_so, mode=ctypes.RTLD_GLOBAL)
|
||||||
|
except Exception:
|
||||||
|
pass
|
||||||
|
except Exception:
|
||||||
|
pass
|
||||||
|
|
||||||
search_paths = []
|
search_paths = []
|
||||||
|
|
||||||
# 1. Same directory as this file
|
# 1. Same directory as this file
|
||||||
|
|||||||
57
ex_engine/verify_bridge_runtime.py
Executable file
57
ex_engine/verify_bridge_runtime.py
Executable file
@@ -0,0 +1,57 @@
|
|||||||
|
#!/usr/bin/env python3
|
||||||
|
"""Verify ix_unified_bridge.so with ixformer symbols pre-loaded."""
|
||||||
|
import ctypes, glob, importlib.util, os, sys, torch
|
||||||
|
|
||||||
|
# Step 1: find and pre-load ixformer .so to resolve symbols
|
||||||
|
ixf_paths = [
|
||||||
|
"/usr/local/corex/lib64/python3/dist-packages/ixformer",
|
||||||
|
"/usr/local/corex/lib/python3/dist-packages/ixformer",
|
||||||
|
]
|
||||||
|
loaded = False
|
||||||
|
for base in ixf_paths:
|
||||||
|
for so in glob.glob(os.path.join(base, "**/*.so"), recursive=True):
|
||||||
|
try:
|
||||||
|
ctypes.CDLL(so, mode=ctypes.RTLD_GLOBAL)
|
||||||
|
except:
|
||||||
|
pass
|
||||||
|
# Try importing ixformer to trigger all symbol loads
|
||||||
|
try:
|
||||||
|
import ixformer.functions
|
||||||
|
loaded = True
|
||||||
|
print(f"✓ ixformer.functions loaded")
|
||||||
|
break
|
||||||
|
except:
|
||||||
|
pass
|
||||||
|
|
||||||
|
if not loaded:
|
||||||
|
print("✗ ixformer not found, bridge will have unresolved symbols")
|
||||||
|
sys.exit(1)
|
||||||
|
|
||||||
|
# Step 2: load our bridge
|
||||||
|
so_files = glob.glob("ex_engine/build/ix_unified_bridge*.so")
|
||||||
|
if not so_files:
|
||||||
|
print("✗ bridge .so not built")
|
||||||
|
sys.exit(1)
|
||||||
|
|
||||||
|
spec = importlib.util.spec_from_file_location("ix_unified_bridge", so_files[0])
|
||||||
|
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"✓ bridge loaded: {len(funcs)} functions: {funcs}")
|
||||||
|
|
||||||
|
# Step 3: smoke test on GPU
|
||||||
|
x = torch.randn(4, 512, device="cuda", dtype=torch.float16)
|
||||||
|
out = mod.silu_and_mul(x)
|
||||||
|
print(f"✓ silu_and_mul via bridge: {x.shape} → {out.shape}")
|
||||||
|
|
||||||
|
inp = torch.randn(2, 2048, device="cuda", dtype=torch.float16)
|
||||||
|
outp = torch.empty_like(inp)
|
||||||
|
w = torch.ones(2048, device="cuda", dtype=torch.float16)
|
||||||
|
mod.rms_norm(outp, inp, w, 1e-6)
|
||||||
|
print(f"✓ rms_norm via bridge: {inp.shape}")
|
||||||
|
|
||||||
|
gate = torch.randn(4, 64, device="cuda", dtype=torch.float16)
|
||||||
|
weights, indices = mod.moe_topk_softmax(gate, 8, True)
|
||||||
|
print(f"✓ moe_topk_softmax via bridge: weights={weights.shape}")
|
||||||
|
|
||||||
|
print("\nALL BRIDGE TESTS PASSED — Tier 0 active")
|
||||||
Reference in New Issue
Block a user