(target, dev)
| 84 | |
| 85 | @tvm.testing.parametrize_targets("llvm") |
| 86 | def 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") |
nothing calls this directly
no test coverage detected
searching dependent graphs…