blob: 717259e542aa295c1f0e999e8d16be547e1f932e [file] [log] [blame]
import torch
import numpy as np
import time
from mpact.mpactbackend import mpact_jit_compile, mpact_jit_run
from mpact_benchmark.utils.tensor_generator import generate_tensor
def runbench_eager(tag, sp, net, x, num_iters=1000):
net(x) # warmup
checksum = 0
start = time.time()
for i in range(num_iters):
res = net(x).item()
checksum = checksum + res
end = time.time()
time_ms = (end - start) * 1000 / num_iters
print("%s : %.2f : %8.4f ms. : checksum=%d" % (tag, sp, time_ms, checksum))
def runbench_mpact(tag, sp, net, x, num_iters=1000):
invoker, fn = mpact_jit_compile(net, x)
mpact_jit_run(invoker, fn, x) # warmup
checksum = 0
start = time.time()
for i in range(num_iters):
res = mpact_jit_run(invoker, fn, x)
checksum = checksum + res
end = time.time()
time_ms = (end - start) * 1000 / num_iters
print("%s : %.2f : %8.4f ms. : checksum=%d" % (tag, sp, time_ms, checksum))
class SqSumNet(torch.nn.Module):
def forward(self, x):
# TODO: make this work too: return (x ** 2).sum()
return (x * x).sum()
net = SqSumNet()
h = 1024 * 4
w = 1024 * 4
for d in range(0, 101, 10):
sparsity = 1.0 - (d / 100.0)
x = generate_tensor(
seed=0, shape=(h, w), sparsity=sparsity, dtype=np.float32, drange=(1.0, 1.0)
)
# Note, we don't have binary-valued sparse tensors in PyTorch
# so we are using csr. For now, we have to hack the
# "explicitVal=1.0:f32"
# into the MLIR sparse tensor type to make optimize it fully.
s = x.to_sparse_csr()
runbench_eager("PyTorch (dense) ", sparsity, net, x)
runbench_mpact("MPACT (dense) ", sparsity, net, x)
runbench_eager("PyTorch (sparse)", sparsity, net, s)
runbench_mpact("MPACT (sparse)", sparsity, net, s)