File size: 3,085 Bytes
d160c10 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 | #!/usr/bin/env python3
# SPDX-License-Identifier: Apache-2.0
"""Device BEVPool kernel timing probe (tt.bevpool_k, OPT_REPORT round 7): the model shape (shipped sample's
calibration) for table variants, timed as a trace of 10 calls (best of 3), plus the error vs the float64 model."""
import sys
import time
from pathlib import Path
import numpy as np
sys.path.insert(0, str(Path(__file__).resolve().parents[1]))
from tt_bevdet.tests import test_bevpool_k_device as T # noqa: E402
from tt_bevdet.tt.bevpool_k import BEVPoolK # noqa: E402
def main():
import ttnn
from tt_bevdet.device import close_device, open_device
from tt_bevdet.host.calib import bevpool_tables
from tt_bevdet.host.inputs import load_sample, prepare_frame
cfg = T.CFG
req = load_sample(Path(__file__).resolve().parents[1] / "tt_bevdet/samples/synthetic_6cam.json")
tables = bevpool_tables(cfg, prepare_frame(req["images"], dict(req["calibration"]), cfg).calib)
hw = 704
rd = tables.ranks_depth.astype(np.int64)
rb, pix, dbin = tables.ranks_bev, tables.ranks_feat, (rd // hw) % cfg.n_depth
src = T._src(4224, 3)
ref = BEVPoolK.reference(src, rb, pix, dbin, 16384, T.DW, T.C)
# argv: variants "nb=4", "nb=4,inexact", "nb=4,BPK_NODEPTH", ... (default: the served form)
variants = []
for a in sys.argv[1:] or ["nb=4"]:
v = dict(distinct=True, nb=4, defines=())
for part in a.split(","):
if part.startswith("nb="):
v["nb"] = int(part[3:])
elif part == "inexact":
v["distinct"] = False
elif part.startswith("BPK_"):
v["defines"] = v["defines"] + (part,)
variants.append(v)
dev = open_device(None, allow_fallback=False)
try:
gx, gy = T._grid(dev)
for v in variants:
k = BEVPoolK(n_cells=16384, n_pix=4224, depth_w=T.DW, channels=T.C, n_cores=gx * gy, grid_x=gx, batch=v.get("nb", 4),
block_cap=40000, defines=v["defines"])
tab = k.table(rb, pix, dbin, exact=v["distinct"])
s_d, t_d = T._to_dev(dev, src, True), T._table_dev(dev, tab)
o = T._out(dev, 16384)
k(s_d, t_d, o)
out = T._read(o)
tid = ttnn.begin_trace_capture(dev, cq_id=0)
for _ in range(10):
k(s_d, t_d, o)
ttnn.end_trace_capture(dev, tid, cq_id=0)
best = 1e9
for _ in range(3):
ttnn.synchronize_device(dev)
t0 = time.perf_counter()
ttnn.execute_trace(dev, tid, cq_id=0, blocking=True)
best = min(best, (time.perf_counter() - t0) / 10 * 1e6)
ttnn.release_trace(dev, tid)
u = T._ulps(out, ref)
print(f"{v}: {k.last_stats} | {best:.1f} us per call | != model {int((u > 0).sum())}, max ulp "
f"{int(u.max())}", flush=True)
for t in (s_d, t_d, o):
ttnn.deallocate(t)
finally:
close_device(dev)
if __name__ == "__main__":
main()
|