From 101db8774c5d26f19a90931515f6b40d3dfe4eb9 Mon Sep 17 00:00:00 2001 From: Claude Date: Fri, 14 Aug 2026 06:52:52 +0000 Subject: [PATCH] =?UTF-8?q?diag:=20probe=5Fbi100.py=20=E2=80=94=20run=20on?= =?UTF-8?q?=20real=20machine,=20paste=20output=20back?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- probe_bi100.py | 168 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 168 insertions(+) create mode 100644 probe_bi100.py diff --git a/probe_bi100.py b/probe_bi100.py new file mode 100644 index 00000000..09918548 --- /dev/null +++ b/probe_bi100.py @@ -0,0 +1,168 @@ +#!/usr/bin/env python3 +"""probe_bi100.py — Run on BI-V100 real machine, paste output back. +Usage: python3 probe_bi100.py +""" +import os, sys, importlib, struct, pathlib, traceback + +def section(t): + print(f"\n{'='*60}\n {t}\n{'='*60}") + +# 1. ixformer.functions 完整 API 清单 +section("1. ixformer.functions API surface") +try: + import ixformer.functions as ixf_F + names = sorted([n for n in dir(ixf_F) if not n.startswith('_')]) + print(f"total: {len(names)}") + for n in names: + print(f" {n}") +except Exception as e: + print(f"IMPORT FAILED: {e}") + +# 2. ixformer._C.infer API +section("2. ixformer._C.infer API surface") +try: + import ixformer._C as ops + if hasattr(ops, 'infer'): + names = sorted([n for n in dir(ops.infer) if not n.startswith('_')]) + print(f"total: {len(names)}") + for n in names: + print(f" {n}") + else: + print("ops.infer not found") + print(f"ops attrs: {[n for n in dir(ops) if not n.startswith('_')]}") +except Exception as e: + print(f"IMPORT FAILED: {e}") + +# 3. 关键函数存在性 +section("3. Critical function checks") +checks = [ + ("ixformer.functions", "vllm_moe_topk_softmax"), + ("ixformer.functions", "moe_topk_softmax"), + ("ixformer.functions", "moe_compute_token_index"), + ("ixformer.functions", "moe_expand_input"), + ("ixformer.functions", "moe_output_reduce_sum"), + ("ixformer.functions", "moe_w8a8_group_gemm"), + ("ixformer.functions", "silu_and_mul"), + ("ixformer.functions", "rms_norm"), + ("ixformer.functions", "fused_add_rms_norm"), + ("ixformer.functions", "vllm_rotary_embedding_neox"), + ("ixformer.functions", "vllm_paged_attention"), + ("ixformer.functions", "vllm_reshape_and_cache"), + ("ixformer.functions", "flash_attn_varlen_func"), + ("ixformer.functions", "vllm_single_query_cached_kv_attention"), +] +for mod_name, func_name in checks: + try: + mod = importlib.import_module(mod_name) + has = hasattr(mod, func_name) + print(f" {'OK' if has else 'MISSING':7s} {mod_name}.{func_name}") + except Exception as e: + print(f" ERROR {mod_name}.{func_name} — {e}") + +# 4. vllm 路径和已安装的 .so +section("4. vllm install paths + installed .so") +try: + import vllm + vroot = pathlib.Path(vllm.__path__[0]) + print(f"vllm root: {vroot}") + sos = sorted(vroot.glob("*.so")) + print(f".so count: {len(sos)}") + for s in sos: + print(f" {s.name:45s} {s.stat().st_size:>10d} bytes") +except Exception as e: + print(f"ERROR: {e}") + +# 5. _custom_ops.py 实际位置 +section("5. _custom_ops.py location + topk_softmax test") +try: + import vllm._custom_ops as ops + print(f"_custom_ops: {ops.__file__}") + # Try calling topk_softmax + import torch + if torch.cuda.is_available(): + g = torch.randn(4, 8, device='cuda', dtype=torch.float32) + tw = torch.empty(4, 2, device='cuda', dtype=torch.float32) + ti = torch.empty(4, 2, device='cuda', dtype=torch.int32) + tei = torch.empty(4, 2, device='cuda', dtype=torch.int32) + try: + ops.topk_softmax(tw, ti, tei, g) + print(" topk_softmax: OK") + except Exception as e: + print(f" topk_softmax: FAILED — {e}") + else: + print(" no CUDA device") +except Exception as e: + print(f"ERROR: {e}") + +# 6. protocol.py 检查 +section("6. protocol.py max_completion_tokens") +try: + from vllm.entrypoints.openai.protocol import ChatCompletionRequest, OpenAIBaseModel + print(f"protocol: {ChatCompletionRequest.__module__}") + print(f"extra config: {OpenAIBaseModel.model_config.get('extra', 'NOT SET')}") + has_mct = 'max_completion_tokens' in ChatCompletionRequest.model_fields + print(f"max_completion_tokens field: {'YES' if has_mct else 'NO'}") + # Try validation + req = ChatCompletionRequest( + model="llm", + messages=[{"role":"user","content":"test"}], + max_completion_tokens=8192, + ) + print(f" validation OK — max_tokens={req.max_tokens}") +except Exception as e: + print(f"FAILED: {e}") + +# 7. CoreX compiler +section("7. CoreX compiler availability") +for p in ["/usr/local/corex-3.2.3/bin/clang++", "/usr/local/corex/bin/clang++", + "/opt/corex/bin/clang++"]: + exists = os.path.isfile(p) + print(f" {'OK' if exists else '--':2s} {p}") + +# 8. corex prebuilt .so import test +section("8. corex prebuilt .so import test") +try: + import vllm + vroot = pathlib.Path(vllm.__path__[0]) + for name in ["corex_moe_topk_softmax", "corex_gdn_causal_conv", + "corex_moe_direct_routed", "corex_moe_index_combine", + "corex_attn_head_rms_norm", "corex_fused_paged_prefill", + "corex_paged_kv_gather", "ix_full_bridge"]: + so = vroot / f"{name}.so" + if so.exists(): + try: + mod = importlib.import_module(f"vllm.{name}") + funcs = [f for f in dir(mod) if not f.startswith('_')] + print(f" OK {name} — {funcs}") + except Exception as e: + print(f" LOAD_FAIL {name} — {e}") + else: + print(f" MISSING {name}.so") +except Exception as e: + print(f"ERROR: {e}") + +# 9. torch/CUDA info +section("9. torch/CUDA environment") +try: + import torch + print(f"torch: {torch.__version__}") + print(f"CUDA available: {torch.cuda.is_available()}") + if torch.cuda.is_available(): + print(f"device: {torch.cuda.get_device_name(0)}") + print(f"memory: {torch.cuda.get_device_properties(0).total_mem / 1024**3:.1f} GB") +except Exception as e: + print(f"ERROR: {e}") + +# 10. CUB header availability (for building .cu) +section("10. CUB headers for CoreX build") +cub_paths = [ + "/usr/local/corex-3.2.3/include/cub/block/block_scan.cuh", + "/usr/local/corex/include/cub/block/block_scan.cuh", + "/usr/include/cub/block/block_scan.cuh", +] +for p in cub_paths: + print(f" {'OK' if os.path.isfile(p) else '--':2s} {p}") + +print(f"\n{'='*60}") +print(" DONE — paste this entire output back") +print(f"{'='*60}")