Download code/scripts/micro/dram_sharded.py from changh95/hamer-p150: direct link, hf CLI and curl.
- Browser
- Download file 3.03 kB
-
https://huggingface.co/changh95/hamer-p150/resolve/main/code/scripts/micro/dram_sharded.py
- Command line
-
hf download hf://changh95/hamer-p150/code/scripts/micro/dram_sharded.py
-
curl -L -o dram_sharded.py https://huggingface.co/changh95/hamer-p150/resolve/main/code/scripts/micro/dram_sharded.py
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) | |