Files
project_6/debug_topk.py
2026-08-10 07:59:06 +00:00

49 lines
1.9 KiB
Python

#!/usr/bin/env python3
"""Debug topk_softmax CUDA kernel mismatch."""
import torch
import os
from torch.utils.cpp_extension import load
ext = load(name="moe_topk_softmax_v3",
sources=[os.path.join(os.path.dirname(os.path.abspath(__file__)),
"ex_engine/csrc/moe_topk_softmax_v3.cu")],
extra_cuda_cflags=["-O3"], verbose=False)
torch.manual_seed(123)
gating = torch.randn(8, 64, device='cuda', dtype=torch.float32)
# CUDA kernel
results = ext.moe_topk_softmax(gating, 8, False)
tw_cuda, ti_cuda = results[0], results[1]
# PyTorch reference
probs = torch.softmax(gating, dim=-1)
tw_ref, ti_ref = torch.topk(probs, 8, dim=-1)
print("=== Per-row comparison ===")
for r in range(8):
ids_match = set(ti_cuda[r].tolist()) == set(ti_ref[r].tolist())
w_diff = (tw_cuda[r].sort()[0] - tw_ref[r].sort()[0]).abs().max().item()
print(f"Row {r}: CUDA ids={ti_cuda[r].tolist()[:4]}... "
f"Ref ids={ti_ref[r].tolist()[:4]}... "
f"ids_match={ids_match} w_diff={w_diff:.6e} "
f"cuda_sum={tw_cuda[r].sum():.4f} ref_sum={tw_ref[r].sum():.4f}")
# Check if consecutive rows are identical
print("\n=== Row duplication check ===")
for r in range(0, 8, 2):
same = (ti_cuda[r] == ti_cuda[r+1]).all().item()
print(f"Row {r} == Row {r+1}: {same}")
# Minimal 2-row test
print("\n=== Minimal 2-row test ===")
g2 = torch.tensor([[1.0, 2.0, 3.0] + [0.0]*61,
[3.0, 2.0, 1.0] + [0.0]*61], device='cuda', dtype=torch.float32)
r2 = ext.moe_topk_softmax(g2, 3, False)
p2 = torch.softmax(g2, dim=-1)
t2w, t2i = torch.topk(p2, 3, dim=-1)
print(f"CUDA row0 ids: {r2[1][0].tolist()[:3]} weights: {r2[0][0].tolist()[:3]}")
print(f"CUDA row1 ids: {r2[1][1].tolist()[:3]} weights: {r2[0][1].tolist()[:3]}")
print(f"Ref row0 ids: {t2i[0].tolist()[:3]} weights: {t2w[0].tolist()[:3]}")
print(f"Ref row1 ids: {t2i[1].tolist()[:3]} weights: {t2w[1].tolist()[:3]}")