MCPcopy Index your code
hub / github.com/apache/tvm / test_mlp_blockbuilder

Function test_mlp_blockbuilder

tests/python/relax/test_transform_gradient_numeric.py:86–138  ·  view source on GitHub ↗
(target, dev)

Source from the content-addressed store, hash-verified

84
85@tvm.testing.parametrize_targets("llvm")
86def test_mlp_blockbuilder(target, dev):
87 layers, in_size, out_size, hidden_size, batch_size = 3, 5, 5, 5, 4
88
89 input_list = [relax.Var("x", R.Tensor((batch_size, in_size), "float32"))]
90 w_list = (
91 [relax.Var("w_0", R.Tensor((in_size, hidden_size), "float32"))]
92 + [
93 relax.Var("w_" + str(i + 1), R.Tensor((hidden_size, hidden_size), "float32"))
94 for i in range(layers - 2)
95 ]
96 + [relax.Var("w_" + str(layers - 1), R.Tensor((hidden_size, out_size), "float32"))]
97 )
98 b_list = [
99 relax.Var("b_" + str(i), R.Tensor((hidden_size,), "float32")) for i in range(layers - 1)
100 ] + [relax.Var("b_" + str(layers - 1), R.Tensor((out_size,), "float32"))]
101 label_list = [relax.Var("y", R.Tensor((batch_size,), "int64"))]
102 args_list = input_list + w_list + b_list + label_list
103
104 bb = relax.BlockBuilder()
105 with bb.function("MLP", args_list):
106 with bb.dataflow():
107 current = input_list[0]
108 for i in range(layers):
109 lv0 = bb.emit(R.matmul(current, w_list[i]))
110 lv1 = bb.emit(R.add(lv0, b_list[i]))
111 current = bb.emit(R.nn.relu(lv1) if i < layers - 1 else lv1)
112 logits = R.nn.log_softmax(current)
113 loss = bb.emit(R.nn.nll_loss(logits, label_list[0]))
114 gv0 = bb.emit_output(loss)
115 bb.emit_func_output(gv0)
116
117 Before = bb.get()
118 After = relax.transform.Gradient("MLP", w_list + b_list)(Before)
119 # Check numerical gradients equal
120 args = []
121 for arg in After["MLP_adjoint"].params:
122 shape = [int(l) for l in arg.struct_info.shape]
123 if arg.struct_info.dtype == "int64":
124 args.append(
125 tvm.runtime.tensor(np.random.randint(0, out_size, size=shape).astype(np.int64))
126 )
127 else: # float32
128 args.append(rand("float32", *shape))
129
130 vm_before = _legalize_and_build(Before, target, dev)
131 vm_after = _legalize_and_build(After, target, dev)
132 _, grad = vm_after["MLP_adjoint"](*args)
133
134 def func(*inputs):
135 loss = vm_before["MLP"](args[0], *[tvm.runtime.tensor(i) for i in inputs], args[-1])
136 return loss.numpy()
137
138 check_numerical_grads(func, [i.numpy() for i in args[1:-1]], [i.numpy() for i in grad])
139
140
141@tvm.testing.parametrize_targets("llvm")

Callers

nothing calls this directly

Calls 15

functionMethod · 0.95
dataflowMethod · 0.95
emitMethod · 0.95
emit_outputMethod · 0.95
emit_func_outputMethod · 0.95
getMethod · 0.95
check_numerical_gradsFunction · 0.90
strFunction · 0.85
randFunction · 0.85
TensorMethod · 0.80
log_softmaxMethod · 0.80
nll_lossMethod · 0.80

Tested by

no test coverage detected

Used in the wild real call sites across dependent graphs

searching dependent graphs…