Files
project_6/test_dlopen_chain.py
Claude 1f69311375 fix: flash_attn import path ixformer.contrib → ixformer.functions
真机验证发现 ixformer.contrib.vllm_flash_attn 不存在。
flash_attn_varlen_func 实际位于 ixformer.functions
(通过 inference.functions.flash_attn_lib 导出)。

签名兼容:q,k,v,cu_seqlens_q/k,max_seqlen_q/k,softmax_scale,causal

test_dlopen_chain.py: 修复 total_mem→total_memory, ctypes.RTLD_LAZY,
系统 vllm 路径检测(避免解析到仓库里的 ./vllm/)
2026-08-14 03:56:23 +00:00

142 lines
4.9 KiB
Python

#!/usr/bin/env python3
"""Test dlopen chain on BI-V100. Run on real machine."""
import sys, os, importlib
VLLM_SYSTEM = "/usr/local/corex/lib/python3/dist-packages/vllm"
VLLM_SYSTEM2 = "/usr/local/corex/lib64/python3/dist-packages/vllm"
PREBUILT = [
"corex_attn_head_rms_norm", "corex_block_major_kv_transfer",
"corex_fused_paged_prefill", "corex_gdn_beta_decay",
"corex_gdn_causal_conv", "corex_gdn_chunk_recurrent",
"corex_gdn_gated_norm", "corex_gdn_packed_decode",
"corex_gdn_qk_map", "corex_moe_direct_routed",
"corex_moe_exact_reduce", "corex_moe_topk_softmax",
"corex_moe_weight_gather", "corex_paged_kv_gather",
]
def find_system_vllm():
for p in [VLLM_SYSTEM, VLLM_SYSTEM2]:
if os.path.isdir(p):
return p
try:
spec = importlib.util.find_spec("vllm")
if spec and spec.origin:
d = os.path.dirname(spec.origin)
if "project_6" not in d:
return d
except:
pass
return None
def main():
total_ok = total_fail = 0
# 1. Torch/CUDA
print("=== 1. Torch/CUDA ===")
try:
import torch
if torch.cuda.is_available():
name = torch.cuda.get_device_name(0)
props = torch.cuda.get_device_properties(0)
mem_gb = getattr(props, 'total_memory', getattr(props, 'total_mem', 0)) / 1e9
print(f" [OK] {name}, {mem_gb:.1f}GB")
total_ok += 1
else:
print(" [FAIL] CUDA not available"); total_fail += 1
except Exception as e:
print(f" [FAIL] {e}"); total_fail += 1
# 2. System vllm location
print("\n=== 2. System vLLM ===")
sys_vllm = find_system_vllm()
if sys_vllm:
print(f" [OK] {sys_vllm}")
total_ok += 1
else:
print(" [FAIL] System vllm not found")
total_fail += 1
# 3. Prebuilt .so: check if install would work
print("\n=== 3. Prebuilt .so (14 modules) ===")
prebuilt_dir = "qwen3_6_scripts/prebuilt/corex-3.2.3-ivcore10"
for name in PREBUILT:
src = os.path.join(prebuilt_dir, f"{name}.so")
if os.path.exists(src):
size = os.path.getsize(src)
# Check if installed in system vllm
if sys_vllm:
dst = os.path.join(sys_vllm, f"{name}.so")
if os.path.exists(dst):
print(f" [INSTALLED] {name} ({size:,}B)")
total_ok += 1
else:
print(f" [PREBUILT] {name} ({size:,}B) → needs install to {dst}")
total_ok += 1 # prebuilt exists, will be installed by patch_ops
else:
print(f" [PREBUILT] {name} ({size:,}B)")
total_ok += 1
else:
print(f" [MISS] {name}: prebuilt not found")
total_fail += 1
# 4. Install prebuilt to system vllm (DRY RUN)
if sys_vllm:
print(f"\n To install: bash qwen3_6_scripts/install_prebuilt_corex.sh {sys_vllm}")
# 5. ixformer dispatch
print("\n=== 4. ixformer dispatch chain ===")
checks = [
("ixformer", None),
("ixformer.functions", "vllm_single_query_cached_kv_attention"),
("ixformer.functions", "flash_attn_varlen_func"),
]
for mod_name, func_name in checks:
try:
mod = importlib.import_module(mod_name)
if func_name:
fn = getattr(mod, func_name, None)
if fn:
print(f" [OK] {mod_name}.{func_name}")
total_ok += 1
else:
avail = [x for x in dir(mod) if 'flash' in x.lower() or 'attn' in x.lower() or 'paged' in x.lower()]
print(f" [MISS] {mod_name}.{func_name}")
if avail:
print(f" available attn funcs: {avail}")
total_fail += 1
else:
ver = getattr(mod, '__version__', '?')
loc = getattr(mod, '__file__', '?')
print(f" [OK] {mod_name} v{ver} @ {loc}")
total_ok += 1
except ImportError as e:
print(f" [FAIL] {mod_name}: {e}")
total_fail += 1
# 6. Base image .so
print("\n=== 5. Base image .so ===")
for p in ["/usr/local/corex/lib64/libcorex_gdn.so", "/usr/local/corex/lib64/libixattn.so"]:
if os.path.exists(p):
print(f" [OK] {p} ({os.path.getsize(p):,}B)")
total_ok += 1
else:
print(f" [MISS] {p}")
total_fail += 1
# 7. libcccl_allocator.so
print("\n=== 6. libcccl_allocator.so ===")
cccl = "qwen3_6_scripts/cccl_preload/libcccl_allocator.so"
if os.path.exists(cccl):
print(f" [OK] {cccl} ({os.path.getsize(cccl):,}B)")
total_ok += 1
else:
print(f" [MISS] {cccl}")
total_fail += 1
print(f"\n{'='*50}")
print(f"OK: {total_ok} FAIL: {total_fail}")
if __name__ == "__main__":
main()