A error occurred when I run a code snippet which is a small *self-attenion*
implementation.
I also disable 'AlterOpLayout' pass,it doesn't work. Is my code wrong?How to
modify it.
Here is my source code
```
from tvm import relay
from tvm.relay import testing
import tvm
from tvm import te
from tvm.contrib import graph_executor
import numpy as np
def dense(data, weight=None, units=None, **kwargs):
name = kwargs.get("name")
kwargs.pop("name")
if not weight:
weight = relay.var(name + "_weight")
ans = relay.nn.dense(data, weight, units, **kwargs)
return ans
def batch_matmul(data, weight=None,**kwargs):
return relay.nn.batch_matmul(data,weight)
def bert(seq_lenth=64,hidden_dims=1024,heads=64):
data = relay.var("data", shape=(seq_lenth,hidden_dims), dtype='float32')
body = relay.nn.relu(data=data)
# attention
d_k = hidden_dims // heads
q = dense(data,units=hidden_dims,name="q")
k = dense(data,units=hidden_dims,name="k")
v = dense(data,units=hidden_dims,name="v")
q = relay.reshape(q,(-1,heads,d_k))
k = relay.reshape(k,(-1,heads,d_k))
q = relay.reshape(q,(-1,heads,d_k))
q = relay.transpose(q,(1,0,2))
k = relay.transpose(k,(1,0,2))
v = relay.transpose(v,(1,2,0))
logits = batch_matmul(q,k,name='logits')
output = batch_matmul(logits,v,name='output')
output = relay.transpose(output,(1,0,2))
output = relay.reshape(output,(seq_lenth,hidden_dims))
net = dense(output,units=hidden_dims,name='net')
return relay.Function(relay.analysis.free_vars(net), net)
def get_workload():
net = bert()
mod = tvm.IRModule.from_expr(net)
mod = relay.transform.InferType()(mod)
shape_dict = {v.name_hint: v.checked_type for v in mod["main"].params}
np.random.seed(0)
params = {}
for k, v in shape_dict.items():
if k == "data":
continue
init_value = np.random.uniform(-1, 1,
v.concrete_shape).astype(v.dtype)
params[k] = tvm.nd.array(init_value, device=tvm.cpu(0))
return mod,params
if __name__=='__main__':
mod,params = get_workload()
data_shape = (64,1024)
opt_level = 4
target = tvm.target.cuda()
with
tvm.transform.PassContext(opt_level=opt_level,disabled_pass={"AlterOpLayout"}):
lib = relay.build(mod, target, params=params)
dev = tvm.cuda()
data = np.random.uniform(-1, 1, size=data_shape).astype("float32")
# create module
module = graph_executor.GraphModule(lib["default"](dev))
# set input and parameters
module.set_input("data", data)
# run
print(module.benchmark(dev, number=1, repeat=600))
```
And error message
```
Check failed: (!axes.defined() || static_cast<int>(axes.size()) == ndim) is
false: Dimension mismatch: axes has 3 elements, but data.ndim = 2
```
And I think it failed at
```
output = batch_matmul(logits,v,name='output')
```
Thanks a lot!
---
[Visit Topic](https://discuss.tvm.apache.org/t/dimension-mismatch/12183/1) to
respond.
You are receiving this because you enabled mailing list mode.
To unsubscribe from these emails, [click
here](https://discuss.tvm.apache.org/email/unsubscribe/f25a633945cf228a9ea4a8d3e816e6dfe174bcca05916debe334a7ac27290874).