debug: deep probe MoE kernel dispatch in base image
This commit is contained in:
97
probe_moe_detail.py
Normal file
97
probe_moe_detail.py
Normal file
@@ -0,0 +1,97 @@
|
|||||||
|
#!/usr/bin/env python3
|
||||||
|
"""probe_moe_detail.py — Find exactly how to make MoE work on BI-V100"""
|
||||||
|
import os, sys, traceback
|
||||||
|
|
||||||
|
# 1. Check if vllm_moe_topk_softmax exists anywhere
|
||||||
|
print("=== 1. Search for vllm_moe_topk_softmax ===")
|
||||||
|
try:
|
||||||
|
import ixformer.functions as ixf_F
|
||||||
|
if hasattr(ixf_F, 'vllm_moe_topk_softmax'):
|
||||||
|
print(" FOUND in ixf_F!")
|
||||||
|
else:
|
||||||
|
print(" NOT in ixf_F")
|
||||||
|
# Check submodules
|
||||||
|
for attr in dir(ixf_F):
|
||||||
|
mod = getattr(ixf_F, attr)
|
||||||
|
if hasattr(mod, 'vllm_moe_topk_softmax'):
|
||||||
|
print(f" FOUND in ixf_F.{attr}")
|
||||||
|
except Exception as e:
|
||||||
|
print(f" {e}")
|
||||||
|
|
||||||
|
# 2. Read the actual _custom_ops.py from base image (not our copy)
|
||||||
|
print("\n=== 2. Base image _custom_ops.py topk_softmax ===")
|
||||||
|
for p in ["/usr/local/corex/lib64/python3/dist-packages/vllm/_custom_ops.py",
|
||||||
|
"/usr/local/corex/lib/python3/dist-packages/vllm/_custom_ops.py"]:
|
||||||
|
if os.path.exists(p):
|
||||||
|
print(f" File: {p}")
|
||||||
|
with open(p) as f:
|
||||||
|
lines = f.readlines()
|
||||||
|
for i, line in enumerate(lines):
|
||||||
|
if 'topk_softmax' in line or 'moe_topk' in line or 'invoke_fused_moe' in line:
|
||||||
|
# Print context
|
||||||
|
start = max(0, i-2)
|
||||||
|
end = min(len(lines), i+5)
|
||||||
|
for j in range(start, end):
|
||||||
|
marker = ">>>" if j == i else " "
|
||||||
|
print(f" {marker} {j+1}: {lines[j].rstrip()}")
|
||||||
|
print()
|
||||||
|
break
|
||||||
|
|
||||||
|
# 3. Read base image fused_moe.py — the actual kernel dispatch
|
||||||
|
print("\n=== 3. Base image fused_moe.py kernel dispatch ===")
|
||||||
|
for p in ["/usr/local/corex/lib64/python3/dist-packages/vllm/model_executor/layers/fused_moe/fused_moe.py",
|
||||||
|
"/usr/local/corex/lib/python3/dist-packages/vllm/model_executor/layers/fused_moe/fused_moe.py"]:
|
||||||
|
if os.path.exists(p):
|
||||||
|
print(f" File: {p}")
|
||||||
|
with open(p) as f:
|
||||||
|
lines = f.readlines()
|
||||||
|
for i, line in enumerate(lines):
|
||||||
|
if 'invoke_fused_moe' in line or 'triton' in line.lower() or 'kernel' in line.lower() or 'ixf' in line.lower():
|
||||||
|
start = max(0, i-1)
|
||||||
|
end = min(len(lines), i+3)
|
||||||
|
for j in range(start, end):
|
||||||
|
marker = ">>>" if j == i else " "
|
||||||
|
print(f" {marker} {j+1}: {lines[j].rstrip()}")
|
||||||
|
print()
|
||||||
|
break
|
||||||
|
|
||||||
|
# 4. Check _ixformer_torch for topk
|
||||||
|
print("\n=== 4. _ixformer_torch Python bindings ===")
|
||||||
|
try:
|
||||||
|
import ixformer._ixformer_torch as ixt
|
||||||
|
print(f" Module: {ixt}")
|
||||||
|
for attr in sorted(dir(ixt)):
|
||||||
|
if not attr.startswith('__'):
|
||||||
|
print(f" {attr}")
|
||||||
|
except Exception as e:
|
||||||
|
print(f" {e}")
|
||||||
|
|
||||||
|
# 5. Check ixformer.functions.vllm source
|
||||||
|
print("\n=== 5. ixformer.functions.vllm source (for vllm_moe references) ===")
|
||||||
|
try:
|
||||||
|
import ixformer.functions.vllm as ixf_vllm
|
||||||
|
import inspect
|
||||||
|
src = inspect.getsource(ixf_vllm)
|
||||||
|
for i, line in enumerate(src.split('\n')):
|
||||||
|
if 'moe' in line.lower() or 'topk' in line.lower() or 'expert' in line.lower() or 'mlp' in line.lower():
|
||||||
|
print(f" {i+1}: {line}")
|
||||||
|
except Exception as e:
|
||||||
|
print(f" {e}")
|
||||||
|
|
||||||
|
# 6. What does _custom_ops invoke_fused_moe_kernel look like?
|
||||||
|
print("\n=== 6. invoke_fused_moe_kernel in _custom_ops ===")
|
||||||
|
for p in ["/usr/local/corex/lib64/python3/dist-packages/vllm/_custom_ops.py"]:
|
||||||
|
if os.path.exists(p):
|
||||||
|
with open(p) as f:
|
||||||
|
content = f.read()
|
||||||
|
if 'invoke_fused_moe' in content:
|
||||||
|
idx = content.index('invoke_fused_moe')
|
||||||
|
start = max(0, content.rfind('\n', 0, idx-100))
|
||||||
|
end = content.find('\n\n', idx+100)
|
||||||
|
print(content[start:end])
|
||||||
|
else:
|
||||||
|
print(" invoke_fused_moe NOT in _custom_ops.py")
|
||||||
|
# What IS there for MoE?
|
||||||
|
for line in content.split('\n'):
|
||||||
|
if 'moe' in line.lower() or 'expert' in line.lower():
|
||||||
|
print(f" {line.strip()}")
|
||||||
Reference in New Issue
Block a user