Files
project_6/bench_shared.sh
2026-08-20 07:37:26 +00:00

90 lines
3.3 KiB
Bash

#!/bin/bash
set -euo pipefail
cat << 'PYEOF' | CUDA_VISIBLE_DEVICES="${CUDA_VISIBLE_DEVICES:-0}" python3 -u -
import torch, importlib.util, time
torch.cuda.set_device(0)
dev = torch.device("cuda:0")
SO = "qwen3_6_scripts/prebuilt/corex-3.2.3-ivcore10"
def load_so(name):
spec = importlib.util.spec_from_file_location(name, f"{SO}/{name}.so")
m = importlib.util.module_from_spec(spec); spec.loader.exec_module(m); return m
bridge = load_so("ix_moe_bridge")
act_m = load_so("xllm_activation")
H = 2048
I_shared = 128
x = torch.randn(1, H, device=dev, dtype=torch.float16)
w_gu = torch.randn(2*I_shared, H, device=dev, dtype=torch.float16) * 0.01
w_down = torch.randn(H, I_shared, device=dev, dtype=torch.float16) * 0.01
def bench(name, fn, N=1000):
for _ in range(100): fn()
torch.cuda.synchronize()
t0 = time.perf_counter()
for _ in range(N): fn()
torch.cuda.synchronize()
us = (time.perf_counter() - t0) / N * 1e6
print(f" {name:45s}: {us:8.1f} us")
return us
print("=== ix_moe_bridge.linear probe ===")
linear_ok = False
for desc, args in [("(x,w)", (x, w_gu)),
("(x,w,None)", (x, w_gu, None)),
("(x,w,bias0)", (x, w_gu, torch.zeros(2*I_shared,device=dev,dtype=torch.float16)))]:
try:
out = bridge.linear(*args); torch.cuda.synchronize()
print(f" linear{desc}: OK shape={out.shape}")
linear_ok = True; break
except Exception as e:
print(f" linear{desc}: {str(e)[:80]}")
print("\n=== Shared expert benchmarks ===")
act_buf = torch.empty(1, I_shared, device=dev, dtype=torch.float16)
def shared_torch():
gu = torch.nn.functional.linear(x, w_gu)
g, u = gu.chunk(2, dim=-1)
act = torch.sigmoid(g) * g * u
return torch.nn.functional.linear(act, w_down)
bench("A: torch linear + torch silu", shared_torch)
def shared_xllm_silu():
gu = torch.nn.functional.linear(x, w_gu)
act_m.silu_and_mul(act_buf, gu)
return torch.nn.functional.linear(act_buf, w_down)
bench("B: torch linear + xllm silu", shared_xllm_silu)
if linear_ok:
try:
_ = bridge.linear(x, w_gu)
def shared_bridge():
gu = bridge.linear(x, w_gu)
act_m.silu_and_mul(act_buf, gu)
return bridge.linear(act_buf, w_down)
bench("C: bridge linear + xllm silu", shared_bridge)
except:
try:
b_gu = torch.zeros(2*I_shared,device=dev,dtype=torch.float16)
b_dn = torch.zeros(H,device=dev,dtype=torch.float16)
def shared_bridge_b():
gu = bridge.linear(x, w_gu, b_gu)
act_m.silu_and_mul(act_buf, gu)
return bridge.linear(act_buf, w_down, b_dn)
bench("C: bridge linear(bias0) + xllm silu", shared_bridge_b)
except Exception as e:
print(f" C failed: {e}")
print("\n=== Step breakdown ===")
bench("gate_up F.linear (1,2048)@(256,2048)^T", lambda: torch.nn.functional.linear(x, w_gu))
gu_t = torch.nn.functional.linear(x, w_gu)
bench("silu_and_mul", lambda: act_m.silu_and_mul(act_buf, gu_t))
bench("down F.linear (1,128)@(2048,128)^T", lambda: torch.nn.functional.linear(act_buf, w_down))
print("\n=== matmul vs F.linear ===")
bench("torch.mm(x, w_gu.T)", lambda: torch.mm(x, w_gu.t()))
bench("F.linear(x, w_gu)", lambda: torch.nn.functional.linear(x, w_gu))
PYEOF