真机验证发现 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/)
142 lines
4.9 KiB
Python
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()
|