mamba3 / ref /test_ref.py
phanerozoic's picture
Mamba-3 MIMO chunked forward and recurrent decode, native CUDA
d5a6d53 verified
Raw
History Blame
2.67 kB
"""Check the independent reference against the upstream Mamba-3 reference."""
import argparse
import sys
import torch
sys.path.insert(0, str(__import__("pathlib").Path(__file__).parent))
from anchor import build_case, load_upstream_refs, max_rel_err # noqa: E402
from mamba3_ref import mimo_step_ref # noqa: E402
GRID = [
# S H G P N R
(128, 8, 1, 32, 64, 4),
(128, 8, 1, 32, 64, 1),
(256, 4, 1, 64, 128, 4),
(256, 8, 2, 32, 64, 2),
(64, 8, 1, 64, 128, 8),
]
def main():
ap = argparse.ArgumentParser()
ap.add_argument("--mamba-tests", required=True)
ap.add_argument("--device", default="cpu")
args = ap.parse_args()
up = load_upstream_refs(args.mamba_tests)
print(f"torch {torch.__version__} device={args.device}")
print("mimo_step_ref (ours) vs mamba3_MIMO_step_ref (upstream):")
worst = 0.0
for S, H, G, P, N, R in GRID:
B, C = 1, 16
c = build_case(B, S, H, G, P, N, R, C, args.device, torch.float32, seed=0)
ours, _ = mimo_step_ref(
c["q"], c["k"], c["v"], c["ADT"], c["dt"], c["trap"],
c["q_bias"], c["k_bias"], c["angles"], c["mimo_v"], c["mimo_o"],
D=c["D"], z=c["z"], mimo_z=c["mimo_z"],
)
ref, _ = up.mamba3_MIMO_step_ref(
c["q"], c["k"], c["v"], c["ADT"], c["dt"], c["trap"],
c["q_bias"], c["k_bias"], c["angles"], c["mimo_v"], c["mimo_o"],
D=c["D"], Z=c["z"], MIMO_Z=c["mimo_z"],
)
rel = max_rel_err(ours, ref)
worst = max(worst, rel)
print(f" S={S:4d} H={H:2d} G={G} P={P:3d} N={N:3d} R={R} max_rel={rel:.3e}")
# fused-norm variant
c = build_case(1, 128, 8, 1, 32, 64, 4, 16, args.device, torch.float32, seed=3)
w = torch.randn((8, 32), device=args.device, dtype=torch.float32)
ours, _ = mimo_step_ref(
c["q"], c["k"], c["v"], c["ADT"], c["dt"], c["trap"], c["q_bias"], c["k_bias"],
c["angles"], c["mimo_v"], c["mimo_o"], D=c["D"], z=c["z"], mimo_z=c["mimo_z"],
fused_norm=True, outproj_norm_weight=w,
)
ref, _ = up.mamba3_MIMO_step_ref(
c["q"], c["k"], c["v"], c["ADT"], c["dt"], c["trap"], c["q_bias"], c["k_bias"],
c["angles"], c["mimo_v"], c["mimo_o"], D=c["D"], Z=c["z"], MIMO_Z=c["mimo_z"],
fused_norm=True, outproj_norm_weight=w,
)
rel = max_rel_err(ours, ref)
worst = max(worst, rel)
print(f" fused_norm max_rel={rel:.3e}")
print(f"\nworst: {worst:.3e}")
ok = worst < 1e-5
print("PASS" if ok else "FAIL")
return 0 if ok else 1
if __name__ == "__main__":
sys.exit(main())