hamer-p150 / code /scripts /micro /dram_sharded.py
changh95's picture
Optimized build (2026-10-03): model call 3.49 ms, device 3.36 ms
58ba6df verified
Raw History Blame Contribute Delete
3.03 kB
"""DRAM-sharded matmul for the ViT shapes (M=192)."""
import sys
from common import *
dev = open_dev()
torch.manual_seed(0)
L1 = ttnn.L1_MEMORY_CONFIG
nb = dev.dram_grid_size().x
print("dram banks", dev.dram_grid_size())
SHAPES = {"qkv": (1280, 4608), "proj": (1536, 1280), "fc1": (1280, 5120), "fc2": (5120, 1280)}
for name, (K, N) in [(n, SHAPES[n]) for n in (sys.argv[1:] or SHAPES)]:
x_t = torch.randn(1, 1, 192, K); w_t = torch.randn(K, N) / K ** 0.5
ref = x_t @ w_t
Np = -(-N // (32 * nb)) * 32 * nb
w_pad = torch.nn.functional.pad(w_t, (0, Np - N))
for wd, wn in [(ttnn.bfloat16, "bf16"), (ttnn.bfloat8_b, "bfp8")]:
grid = ttnn.CoreRangeSet({ttnn.CoreRange(ttnn.CoreCoord(0, 0), ttnn.CoreCoord(nb - 1, 0))})
wmc = ttnn.MemoryConfig(ttnn.TensorMemoryLayout.WIDTH_SHARDED, ttnn.BufferType.DRAM,
ttnn.ShardSpec(grid, [K, Np // nb], ttnn.ShardOrientation.ROW_MAJOR))
w = ttnn.from_torch(w_pad, dtype=wd, layout=ttnn.TILE_LAYOUT, device=dev, memory_config=wmc)
for ncores in [8, 10, 16, 20, 32, 40, 64, 80]:
Kt = K // 32
if Kt % ncores or (Np // 32) % ncores:
continue
core_grid = ttnn.num_cores_to_corerangeset(ncores, ttnn.CoreCoord(12, 10), row_wise=True)
in0mc = ttnn.MemoryConfig(ttnn.TensorMemoryLayout.WIDTH_SHARDED, ttnn.BufferType.L1,
ttnn.ShardSpec(core_grid, [192, K // ncores], ttnn.ShardOrientation.ROW_MAJOR))
x = ttnn.from_torch(x_t, dtype=ttnn.bfloat16, layout=ttnn.TILE_LAYOUT, device=dev, memory_config=in0mc)
outmc = ttnn.MemoryConfig(ttnn.TensorMemoryLayout.WIDTH_SHARDED, ttnn.BufferType.L1)
for ibw_div in [1, 2, 4]:
ibw = Kt // ncores // ibw_div
if ibw < 1 or (Kt // ncores) % ibw_div:
continue
pc = ttnn.MatmulMultiCoreReuseMultiCastDRAMShardedProgramConfig(
in0_block_w=ibw, per_core_M=6, per_core_N=Np // 32 // ncores, fused_activation=None)
for fid in ["HiFi2", "LoFi"]:
ck = ttnn.init_device_compute_kernel_config(dev.arch(), math_fidelity=getattr(ttnn.MathFidelity, fid),
fp32_dest_acc_en=False, packer_l1_acc=True)
fn = lambda pc=pc, ck=ck, x=x: ttnn.matmul(x, w, program_config=pc, memory_config=outmc, compute_kernel_config=ck)
tag = f"{name} w={wn} cores{ncores} ibw{ibw} {fid}"
try:
o = fn(); p = pcc(ttnn.to_torch(o)[..., :N], ref); ttnn.deallocate(o)
us = time_op(dev, fn)
print(f"{tag:45s} {us:8.1f} us pcc={p:.5f}", flush=True)
except Exception as e:
print(f"{tag:45s} FAIL {str(e).splitlines()[0][:150]}", flush=True)
ttnn.deallocate(x)
ttnn.deallocate(w)
ttnn.close_device(dev)