From b8a446ddac1c7585af1c33baf519b5de0a745b97 Mon Sep 17 00:00:00 2001 From: Tyler Davis Date: Wed, 16 Dec 2020 15:12:21 -0800 Subject: [PATCH 1/5] Add div_ and is_floating_point operators --- python/tvm/relay/frontend/pytorch.py | 9 +- tests/python/frontend/pytorch/test_forward.py | 366 ++++++++++-------- 2 files changed, 208 insertions(+), 167 deletions(-) diff --git a/python/tvm/relay/frontend/pytorch.py b/python/tvm/relay/frontend/pytorch.py index 091884379e00..6b0254dd2287 100644 --- a/python/tvm/relay/frontend/pytorch.py +++ b/python/tvm/relay/frontend/pytorch.py @@ -146,7 +146,6 @@ def __init__(self, prelude, default_dtype): # above. def infer_type(self, node, mod=None): """An incremental method to infer the type of a node in the relay graph.""" - if node in self.types: return self.types[node] if isinstance(node, tvm.relay.Var): @@ -2059,9 +2058,16 @@ def scatter_add(self, inputs, input_types): src = inputs[3] return _op.scatter_add(data, index, src, axis=axis) + def is_floating_point(self, inputs, input_types): + assert len(input_types) == 1 + is_float = input_types[0] in ['float32', 'float64', 'float16'] + temp = _expr.const(is_float) + return temp + # Operator mappings def create_convert_map(self): self.convert_map = { + "aten::is_floating_point": self.is_floating_point, "aten::pixel_shuffle": self.pixel_shuffle, "aten::device": self.none, "prim::device": self.none, @@ -2077,6 +2083,7 @@ def create_convert_map(self): "aten::div": self.make_elemwise("divide"), "aten::div_": self.make_elemwise("divide"), "aten::floor_divide": self.make_elemwise("floor_divide"), + "aten::floor_divide_": self.make_elemwise("floor_divide"), "aten::true_divide": self.make_elemwise("divide"), "aten::addcdiv": self.addcdiv, "aten::addcmul": self.addcmul, diff --git a/tests/python/frontend/pytorch/test_forward.py b/tests/python/frontend/pytorch/test_forward.py index 2dda675c74f5..1742f1bc1f2d 100644 --- a/tests/python/frontend/pytorch/test_forward.py +++ b/tests/python/frontend/pytorch/test_forward.py @@ -185,10 +185,19 @@ def verify_model(model_name, input_data=[], custom_convert_map={}, rtol=1e-5, at if isinstance(baseline_outputs, tuple): baseline_outputs = tuple(out.cpu().numpy() for out in baseline_outputs) + # If baseline output is a bool, wrap it to make it iterable + elif isinstance(baseline_outputs, bool): + baseline_outputs = np.array(baseline_outputs) + baseline_outputs = np.expand_dims(baseline_outputs, 0) else: baseline_outputs = (baseline_outputs.cpu().numpy(),) - trace = torch.jit.trace(baseline_model, baseline_input) + # If the base model outputs a raw bool, it cannot be traced. + # Use torch.jit.script instead. + try: + trace = torch.jit.trace(baseline_model, baseline_input) + except RuntimeError: + trace = torch.jit.script(baseline_model) if isinstance(baseline_model, torch.nn.Module): trace = trace.float().eval() @@ -196,6 +205,8 @@ def verify_model(model_name, input_data=[], custom_convert_map={}, rtol=1e-5, at trace = trace.cuda() else: trace = trace.cpu() + print('-------------Torch Graph-------------') + print(trace.graph) input_names = ["input{}".format(idx) for idx, inp in enumerate(baseline_input)] input_shapes = list(zip(input_names, [inp.shape for inp in baseline_input])) @@ -205,10 +216,13 @@ def verify_model(model_name, input_data=[], custom_convert_map={}, rtol=1e-5, at with tvm.transform.PassContext(opt_level=3): for target, ctx in tvm.testing.enabled_targets(): relay_graph, relay_lib, relay_params = relay.build(mod, target=target, params=params) + print('--------------Relay Graph----------------') + print(relay_graph) relay_model = graph_runtime.create(relay_graph, relay_lib, ctx) relay_model.set_input(**relay_params) - for name, inp in compiled_input.items(): - relay_model.set_input(name, inp) + # TODO(dvisnty): Model has no inputs, so none need to be set. Figure out how to handle this + # for name, inp in compiled_input.items(): + # relay_model.set_input(name, inp) relay_model.run() for i, baseline_output in enumerate(baseline_outputs): @@ -2949,6 +2963,25 @@ def forward(self, *args): TrueDivide().float().eval(), input_data=[dividend, divisor_scalar], atol=1e-4, rtol=1e-4 ) +# TODO(dvisnty): Test fails when using raw bool not wrapped in Tensor. Is this due to +# the `float()` in `trace.float.eval()`? +@tvm.testing.uses_gpu +def test_forward_is_floating_point(): + torch.set_grad_enabled(False) + + class IsFloatingPoint(Module): + def forward(self, arg): + # Uncomment to wrap Bool in a Tensor, allowing use of + # `torch.jit.trace` + return torch.Tensor([torch.is_floating_point(arg)]) + # Else `torch.jit.script` will be used + # return torch.is_floating_point(arg) + + # Input could be either float or non-float + int_tensor = torch.tensor([[1]]) + float_tensor = torch.tensor([[1.0]]) + verify_model(IsFloatingPoint().float().eval(), input_data=[int_tensor]) + verify_model(IsFloatingPoint().float().eval(), input_data=[float_tensor]) @tvm.testing.uses_gpu def test_forward_traced_function(): @@ -3365,166 +3398,167 @@ def test_fn(x, weights=None): if __name__ == "__main__": # some structural tests - test_forward_traced_function() - test_forward_dtypes() - test_weight_names() - test_duplicate_weight_use() - - # Single operator tests - test_forward_pixel_shuffle() - test_forward_add() - test_forward_subtract() - test_forward_multiply() - test_forward_matmul() - test_forward_rsub() - test_forward_onehot() - test_forward_embedding() - test_forward_reshape() - test_forward_reciprocal() - test_forward_repeat() - test_forward_repeat_interleave() - test_forward_squeeze() - test_forward_unsqueeze() - test_forward_concatenate() - test_forward_reduce_sum() - test_forward_reduce_prod() - test_forward_argmin() - test_forward_argmax() - test_forward_norm() - test_forward_frobenius_norm() - test_forward_std() - test_forward_variance() - test_forward_relu() - test_forward_prelu() - test_forward_leakyrelu() - test_forward_elu() - test_forward_celu() - test_forward_gelu() - test_forward_selu() - test_forward_log_sigmoid() - test_forward_adaptiveavgpool() - test_forward_maxpool2d() - test_forward_maxpool1d() - test_forward_maxpool3d() - test_forward_hardtanh() - test_forward_conv() - test_forward_conv_transpose() - test_forward_threshold() - test_forward_contiguous() - test_forward_batchnorm() - test_forward_instancenorm() - test_forward_layernorm() - test_forward_groupnorm() - test_forward_transpose() - test_forward_size() - test_forward_view() - test_forward_select() - test_forward_take() - test_forward_topk() - test_forward_where() - test_forward_addcdiv() - test_forward_addcmul() - test_forward_true_divide() - test_forward_clone() - test_forward_softplus() - test_forward_softsign() - test_forward_logsoftmax() - test_forward_sigmoid() - test_forward_dense() - test_forward_avgpool() - test_forward_avgpool3d() - test_forward_dropout() - test_forward_slice() - test_forward_mean() - test_forward_expand() - test_forward_pow() - test_forward_unary() - test_forward_clamp() - test_forward_clamp_() - test_forward_logical_not() - test_forward_bitwise_not() - test_forward_bitwise_xor() - test_forward_logical_xor() - test_forward_isfinite() - test_forward_isnan() - test_forward_isinf() - test_forward_ones() - test_forward_ones_like() - test_forward_zeros() - test_forward_zeros_like() - test_forward_full() - test_forward_full_like() - test_forward_linspace() - test_forward_arange() - test_forward_mesh_grid() - test_forward_chunk() - test_forward_split() - test_forward_gather() - test_upsample() - test_forward_upsample3d() - test_forward_nms() - test_forward_roi_align() - test_to() - test_flatten() - test_type_as() - test_forward_functional_pad() - test_forward_zero_pad2d() - test_forward_constant_pad1d() - test_forward_constant_pad2d() - test_forward_constant_pad3d() - test_forward_reflection_pad1d() - test_forward_reflection_pad2d() - test_forward_replication_pad1d() - test_forward_replication_pad2d() - test_forward_replication_pad3d() - test_adaptive_pool3d() - test_conv3d() - test_conv3d_transpose() - test_forward_index() - test_min_max() - test_logsumexp() - test_stack() - test_stack_dynamic() - test_forward_unbind() - test_forward_nonzero() - test_forward_scatter() - test_numel() - test_bincount() - - # Model tests - test_resnet18() - test_squeezenet1_0() - test_squeezenet1_1() - test_densenet121() - # disable inception test for now, since loading it takes ~5min on torchvision-0.5 due to scipy bug - # See https://discuss.pytorch.org/t/torchvisions-inception-v3-takes-much-longer-to-load-than-other-models/68756 - # test_inception_v3() - test_googlenet() - test_mnasnet0_5() - test_mobilenet_v2() - - test_custom_conversion_map() - - test_segmentaton_models() - test_3d_models() - - # Quantization test - from qnn_test import test_quantized_imagenet, test_quantized_modules - - test_quantized_modules() - test_quantized_imagenet() - - # Test simple conditionals and loop - test_control_flow() - test_simple_rnn() - - # More complex recurrent models - from test_lstm import test_custom_lstm - - test_custom_lstm() - - # Test bert model - test_forward_pretrained_bert_base_uncased() - - # Test convert torch script(jit) with specific inputs' types - test_convert_torch_script_with_input_types() + # test_forward_traced_function() + # test_forward_dtypes() + # test_weight_names() + # test_duplicate_weight_use() + + # # Single operator tests + # test_forward_pixel_shuffle() + # test_forward_add() + # test_forward_subtract() + # test_forward_multiply() + # test_forward_matmul() + # test_forward_rsub() + # test_forward_onehot() + # test_forward_embedding() + # test_forward_reshape() + # test_forward_reciprocal() + # test_forward_repeat() + # test_forward_repeat_interleave() + # test_forward_squeeze() + # test_forward_unsqueeze() + # test_forward_concatenate() + # test_forward_reduce_sum() + # test_forward_reduce_prod() + # test_forward_argmin() + # test_forward_argmax() + # test_forward_norm() + # test_forward_frobenius_norm() + # test_forward_std() + # test_forward_variance() + # test_forward_relu() + # test_forward_prelu() + # test_forward_leakyrelu() + # test_forward_elu() + # test_forward_celu() + # test_forward_gelu() + # test_forward_selu() + # test_forward_log_sigmoid() + # test_forward_adaptiveavgpool() + # test_forward_maxpool2d() + # test_forward_maxpool1d() + # test_forward_maxpool3d() + # test_forward_hardtanh() + # test_forward_conv() + # test_forward_conv_transpose() + # test_forward_threshold() + # test_forward_contiguous() + # test_forward_batchnorm() + # test_forward_instancenorm() + # test_forward_layernorm() + # test_forward_groupnorm() + # test_forward_transpose() + # test_forward_size() + # test_forward_view() + # test_forward_select() + # test_forward_take() + # test_forward_topk() + # test_forward_where() + # test_forward_addcdiv() + # test_forward_addcmul() + # test_forward_true_divide() + test_forward_is_floating_point() + # test_forward_clone() + # test_forward_softplus() + # test_forward_softsign() + # test_forward_logsoftmax() + # test_forward_sigmoid() + # test_forward_dense() + # test_forward_avgpool() + # test_forward_avgpool3d() + # test_forward_dropout() + # test_forward_slice() + # test_forward_mean() + # test_forward_expand() + # test_forward_pow() + # test_forward_unary() + # test_forward_clamp() + # test_forward_clamp_() + # test_forward_logical_not() + # test_forward_bitwise_not() + # test_forward_bitwise_xor() + # test_forward_logical_xor() + # test_forward_isfinite() + # test_forward_isnan() + # test_forward_isinf() + # test_forward_ones() + # test_forward_ones_like() + # test_forward_zeros() + # test_forward_zeros_like() + # test_forward_full() + # test_forward_full_like() + # test_forward_linspace() + # test_forward_arange() + # test_forward_mesh_grid() + # test_forward_chunk() + # test_forward_split() + # test_forward_gather() + # test_upsample() + # test_forward_upsample3d() + # test_forward_nms() + # test_forward_roi_align() + # test_to() + # test_flatten() + # test_type_as() + # test_forward_functional_pad() + # test_forward_zero_pad2d() + # test_forward_constant_pad1d() + # test_forward_constant_pad2d() + # test_forward_constant_pad3d() + # test_forward_reflection_pad1d() + # test_forward_reflection_pad2d() + # test_forward_replication_pad1d() + # test_forward_replication_pad2d() + # test_forward_replication_pad3d() + # test_adaptive_pool3d() + # test_conv3d() + # test_conv3d_transpose() + # test_forward_index() + # test_min_max() + # test_logsumexp() + # test_stack() + # test_stack_dynamic() + # test_forward_unbind() + # test_forward_nonzero() + # test_forward_scatter() + # test_numel() + # test_bincount() + + # # Model tests + # test_resnet18() + # test_squeezenet1_0() + # test_squeezenet1_1() + # test_densenet121() + # # disable inception test for now, since loading it takes ~5min on torchvision-0.5 due to scipy bug + # # See https://discuss.pytorch.org/t/torchvisions-inception-v3-takes-much-longer-to-load-than-other-models/68756 + # # test_inception_v3() + # test_googlenet() + # test_mnasnet0_5() + # test_mobilenet_v2() + + # test_custom_conversion_map() + + # test_segmentaton_models() + # test_3d_models() + + # # Quantization test + # from qnn_test import test_quantized_imagenet, test_quantized_modules + + # test_quantized_modules() + # test_quantized_imagenet() + + # # Test simple conditionals and loop + # test_control_flow() + # test_simple_rnn() + + # # More complex recurrent models + # from test_lstm import test_custom_lstm + + # test_custom_lstm() + + # # Test bert model + # test_forward_pretrained_bert_base_uncased() + + # # Test convert torch script(jit) with specific inputs' types + # test_convert_torch_script_with_input_types() From decf8227f2c7d243ea3bb2f65a65ffd6cd1c70fb Mon Sep 17 00:00:00 2001 From: Tyler Davis Date: Thu, 17 Dec 2020 18:12:33 -0800 Subject: [PATCH 2/5] Add handling of exprs to op, update tests --- python/tvm/relay/frontend/pytorch.py | 13 +++-- tests/python/frontend/pytorch/test_forward.py | 49 ++++++++++++++----- 2 files changed, 47 insertions(+), 15 deletions(-) diff --git a/python/tvm/relay/frontend/pytorch.py b/python/tvm/relay/frontend/pytorch.py index 6b0254dd2287..878713a94a3c 100644 --- a/python/tvm/relay/frontend/pytorch.py +++ b/python/tvm/relay/frontend/pytorch.py @@ -2059,10 +2059,15 @@ def scatter_add(self, inputs, input_types): return _op.scatter_add(data, index, src, axis=axis) def is_floating_point(self, inputs, input_types): - assert len(input_types) == 1 - is_float = input_types[0] in ['float32', 'float64', 'float16'] - temp = _expr.const(is_float) - return temp + assert len(inputs) == 1 + + if isinstance(inputs[0], _expr.Expr): + input_type = self.infer_type(inputs[0]).dtype + else: + input_type = input_types[0] + + is_float = input_type in ['float32', 'float64', 'float16'] + return _expr.const(is_float) # Operator mappings def create_convert_map(self): diff --git a/tests/python/frontend/pytorch/test_forward.py b/tests/python/frontend/pytorch/test_forward.py index 1742f1bc1f2d..ca1d57c18ee7 100644 --- a/tests/python/frontend/pytorch/test_forward.py +++ b/tests/python/frontend/pytorch/test_forward.py @@ -205,19 +205,31 @@ def verify_model(model_name, input_data=[], custom_convert_map={}, rtol=1e-5, at trace = trace.cuda() else: trace = trace.cpu() - print('-------------Torch Graph-------------') - print(trace.graph) input_names = ["input{}".format(idx) for idx, inp in enumerate(baseline_input)] - input_shapes = list(zip(input_names, [inp.shape for inp in baseline_input])) + # input_shapes = list(zip(input_names, [inp.shape for inp in baseline_input])) + # input_shapes = [('input0', torch.Size([1, 1]))] + + # Dtype must be set in `input_shape` for scripted models to work properly + if baseline_input[0].dtype == torch.float64: + curr_dtype = 'float64' + elif baseline_input[0].dtype == torch.float32: + curr_dtype = 'float32' + elif baseline_input[0].dtype == torch.float16: + curr_dtype = 'float16' + elif baseline_input[0].dtype == torch.int8: + curr_dtype = 'int' + else: + print('uh oh, other dtype: {}'.format(baseline_input[0].dtype)) + exit(-1) + input_shapes = [('input0', ((1, 1), curr_dtype))] mod, params = relay.frontend.from_pytorch(trace, input_shapes, custom_convert_map) + compiled_input = dict(zip(input_names, [inp.cpu().numpy() for inp in baseline_input])) with tvm.transform.PassContext(opt_level=3): for target, ctx in tvm.testing.enabled_targets(): relay_graph, relay_lib, relay_params = relay.build(mod, target=target, params=params) - print('--------------Relay Graph----------------') - print(relay_graph) relay_model = graph_runtime.create(relay_graph, relay_lib, ctx) relay_model.set_input(**relay_params) # TODO(dvisnty): Model has no inputs, so none need to be set. Figure out how to handle this @@ -2971,17 +2983,32 @@ def test_forward_is_floating_point(): class IsFloatingPoint(Module): def forward(self, arg): - # Uncomment to wrap Bool in a Tensor, allowing use of + # `torch.jit.trace` cannot accept something that outputs + # a Bool, so `torch.jit.script` will be used instead + return torch.is_floating_point(arg) + + class IsFloatingPointWrapped(Module): + def forward(self, arg): + # Wrap Bool in a Tensor, allowing use of # `torch.jit.trace` return torch.Tensor([torch.is_floating_point(arg)]) - # Else `torch.jit.script` will be used - # return torch.is_floating_point(arg) # Input could be either float or non-float - int_tensor = torch.tensor([[1]]) - float_tensor = torch.tensor([[1.0]]) + int_tensor = torch.tensor([[1]], dtype=torch.int8) + float64_tensor = torch.tensor([[1.0]], dtype=torch.float64) + float32_tensor = torch.tensor([[1.0]], dtype=torch.float32) + float16_tensor = torch.tensor([[1.0]], dtype=torch.float16) + verify_model(IsFloatingPoint().float().eval(), input_data=[int_tensor]) - verify_model(IsFloatingPoint().float().eval(), input_data=[float_tensor]) + verify_model(IsFloatingPoint().float().eval(), input_data=[float64_tensor]) + verify_model(IsFloatingPoint().float().eval(), input_data=[float32_tensor]) + verify_model(IsFloatingPoint().float().eval(), input_data=[float16_tensor]) + + verify_model(IsFloatingPointWrapped().float().eval(), input_data=[int_tensor]) + verify_model(IsFloatingPointWrapped().float().eval(), input_data=[float64_tensor]) + verify_model(IsFloatingPointWrapped().float().eval(), input_data=[float32_tensor]) + verify_model(IsFloatingPointWrapped().float().eval(), input_data=[float16_tensor]) + @tvm.testing.uses_gpu def test_forward_traced_function(): From 0d6ef778d86b712a931f27d5ca00998786d72811 Mon Sep 17 00:00:00 2001 From: Tyler Davis Date: Thu, 17 Dec 2020 18:14:32 -0800 Subject: [PATCH 3/5] Revert changes to tests --- tests/python/frontend/pytorch/test_forward.py | 395 ++++++++---------- 1 file changed, 167 insertions(+), 228 deletions(-) diff --git a/tests/python/frontend/pytorch/test_forward.py b/tests/python/frontend/pytorch/test_forward.py index ca1d57c18ee7..2dda675c74f5 100644 --- a/tests/python/frontend/pytorch/test_forward.py +++ b/tests/python/frontend/pytorch/test_forward.py @@ -185,19 +185,10 @@ def verify_model(model_name, input_data=[], custom_convert_map={}, rtol=1e-5, at if isinstance(baseline_outputs, tuple): baseline_outputs = tuple(out.cpu().numpy() for out in baseline_outputs) - # If baseline output is a bool, wrap it to make it iterable - elif isinstance(baseline_outputs, bool): - baseline_outputs = np.array(baseline_outputs) - baseline_outputs = np.expand_dims(baseline_outputs, 0) else: baseline_outputs = (baseline_outputs.cpu().numpy(),) - # If the base model outputs a raw bool, it cannot be traced. - # Use torch.jit.script instead. - try: - trace = torch.jit.trace(baseline_model, baseline_input) - except RuntimeError: - trace = torch.jit.script(baseline_model) + trace = torch.jit.trace(baseline_model, baseline_input) if isinstance(baseline_model, torch.nn.Module): trace = trace.float().eval() @@ -207,24 +198,8 @@ def verify_model(model_name, input_data=[], custom_convert_map={}, rtol=1e-5, at trace = trace.cpu() input_names = ["input{}".format(idx) for idx, inp in enumerate(baseline_input)] - # input_shapes = list(zip(input_names, [inp.shape for inp in baseline_input])) - # input_shapes = [('input0', torch.Size([1, 1]))] - - # Dtype must be set in `input_shape` for scripted models to work properly - if baseline_input[0].dtype == torch.float64: - curr_dtype = 'float64' - elif baseline_input[0].dtype == torch.float32: - curr_dtype = 'float32' - elif baseline_input[0].dtype == torch.float16: - curr_dtype = 'float16' - elif baseline_input[0].dtype == torch.int8: - curr_dtype = 'int' - else: - print('uh oh, other dtype: {}'.format(baseline_input[0].dtype)) - exit(-1) - input_shapes = [('input0', ((1, 1), curr_dtype))] + input_shapes = list(zip(input_names, [inp.shape for inp in baseline_input])) mod, params = relay.frontend.from_pytorch(trace, input_shapes, custom_convert_map) - compiled_input = dict(zip(input_names, [inp.cpu().numpy() for inp in baseline_input])) with tvm.transform.PassContext(opt_level=3): @@ -232,9 +207,8 @@ def verify_model(model_name, input_data=[], custom_convert_map={}, rtol=1e-5, at relay_graph, relay_lib, relay_params = relay.build(mod, target=target, params=params) relay_model = graph_runtime.create(relay_graph, relay_lib, ctx) relay_model.set_input(**relay_params) - # TODO(dvisnty): Model has no inputs, so none need to be set. Figure out how to handle this - # for name, inp in compiled_input.items(): - # relay_model.set_input(name, inp) + for name, inp in compiled_input.items(): + relay_model.set_input(name, inp) relay_model.run() for i, baseline_output in enumerate(baseline_outputs): @@ -2975,40 +2949,6 @@ def forward(self, *args): TrueDivide().float().eval(), input_data=[dividend, divisor_scalar], atol=1e-4, rtol=1e-4 ) -# TODO(dvisnty): Test fails when using raw bool not wrapped in Tensor. Is this due to -# the `float()` in `trace.float.eval()`? -@tvm.testing.uses_gpu -def test_forward_is_floating_point(): - torch.set_grad_enabled(False) - - class IsFloatingPoint(Module): - def forward(self, arg): - # `torch.jit.trace` cannot accept something that outputs - # a Bool, so `torch.jit.script` will be used instead - return torch.is_floating_point(arg) - - class IsFloatingPointWrapped(Module): - def forward(self, arg): - # Wrap Bool in a Tensor, allowing use of - # `torch.jit.trace` - return torch.Tensor([torch.is_floating_point(arg)]) - - # Input could be either float or non-float - int_tensor = torch.tensor([[1]], dtype=torch.int8) - float64_tensor = torch.tensor([[1.0]], dtype=torch.float64) - float32_tensor = torch.tensor([[1.0]], dtype=torch.float32) - float16_tensor = torch.tensor([[1.0]], dtype=torch.float16) - - verify_model(IsFloatingPoint().float().eval(), input_data=[int_tensor]) - verify_model(IsFloatingPoint().float().eval(), input_data=[float64_tensor]) - verify_model(IsFloatingPoint().float().eval(), input_data=[float32_tensor]) - verify_model(IsFloatingPoint().float().eval(), input_data=[float16_tensor]) - - verify_model(IsFloatingPointWrapped().float().eval(), input_data=[int_tensor]) - verify_model(IsFloatingPointWrapped().float().eval(), input_data=[float64_tensor]) - verify_model(IsFloatingPointWrapped().float().eval(), input_data=[float32_tensor]) - verify_model(IsFloatingPointWrapped().float().eval(), input_data=[float16_tensor]) - @tvm.testing.uses_gpu def test_forward_traced_function(): @@ -3425,167 +3365,166 @@ def test_fn(x, weights=None): if __name__ == "__main__": # some structural tests - # test_forward_traced_function() - # test_forward_dtypes() - # test_weight_names() - # test_duplicate_weight_use() - - # # Single operator tests - # test_forward_pixel_shuffle() - # test_forward_add() - # test_forward_subtract() - # test_forward_multiply() - # test_forward_matmul() - # test_forward_rsub() - # test_forward_onehot() - # test_forward_embedding() - # test_forward_reshape() - # test_forward_reciprocal() - # test_forward_repeat() - # test_forward_repeat_interleave() - # test_forward_squeeze() - # test_forward_unsqueeze() - # test_forward_concatenate() - # test_forward_reduce_sum() - # test_forward_reduce_prod() - # test_forward_argmin() - # test_forward_argmax() - # test_forward_norm() - # test_forward_frobenius_norm() - # test_forward_std() - # test_forward_variance() - # test_forward_relu() - # test_forward_prelu() - # test_forward_leakyrelu() - # test_forward_elu() - # test_forward_celu() - # test_forward_gelu() - # test_forward_selu() - # test_forward_log_sigmoid() - # test_forward_adaptiveavgpool() - # test_forward_maxpool2d() - # test_forward_maxpool1d() - # test_forward_maxpool3d() - # test_forward_hardtanh() - # test_forward_conv() - # test_forward_conv_transpose() - # test_forward_threshold() - # test_forward_contiguous() - # test_forward_batchnorm() - # test_forward_instancenorm() - # test_forward_layernorm() - # test_forward_groupnorm() - # test_forward_transpose() - # test_forward_size() - # test_forward_view() - # test_forward_select() - # test_forward_take() - # test_forward_topk() - # test_forward_where() - # test_forward_addcdiv() - # test_forward_addcmul() - # test_forward_true_divide() - test_forward_is_floating_point() - # test_forward_clone() - # test_forward_softplus() - # test_forward_softsign() - # test_forward_logsoftmax() - # test_forward_sigmoid() - # test_forward_dense() - # test_forward_avgpool() - # test_forward_avgpool3d() - # test_forward_dropout() - # test_forward_slice() - # test_forward_mean() - # test_forward_expand() - # test_forward_pow() - # test_forward_unary() - # test_forward_clamp() - # test_forward_clamp_() - # test_forward_logical_not() - # test_forward_bitwise_not() - # test_forward_bitwise_xor() - # test_forward_logical_xor() - # test_forward_isfinite() - # test_forward_isnan() - # test_forward_isinf() - # test_forward_ones() - # test_forward_ones_like() - # test_forward_zeros() - # test_forward_zeros_like() - # test_forward_full() - # test_forward_full_like() - # test_forward_linspace() - # test_forward_arange() - # test_forward_mesh_grid() - # test_forward_chunk() - # test_forward_split() - # test_forward_gather() - # test_upsample() - # test_forward_upsample3d() - # test_forward_nms() - # test_forward_roi_align() - # test_to() - # test_flatten() - # test_type_as() - # test_forward_functional_pad() - # test_forward_zero_pad2d() - # test_forward_constant_pad1d() - # test_forward_constant_pad2d() - # test_forward_constant_pad3d() - # test_forward_reflection_pad1d() - # test_forward_reflection_pad2d() - # test_forward_replication_pad1d() - # test_forward_replication_pad2d() - # test_forward_replication_pad3d() - # test_adaptive_pool3d() - # test_conv3d() - # test_conv3d_transpose() - # test_forward_index() - # test_min_max() - # test_logsumexp() - # test_stack() - # test_stack_dynamic() - # test_forward_unbind() - # test_forward_nonzero() - # test_forward_scatter() - # test_numel() - # test_bincount() - - # # Model tests - # test_resnet18() - # test_squeezenet1_0() - # test_squeezenet1_1() - # test_densenet121() - # # disable inception test for now, since loading it takes ~5min on torchvision-0.5 due to scipy bug - # # See https://discuss.pytorch.org/t/torchvisions-inception-v3-takes-much-longer-to-load-than-other-models/68756 - # # test_inception_v3() - # test_googlenet() - # test_mnasnet0_5() - # test_mobilenet_v2() - - # test_custom_conversion_map() - - # test_segmentaton_models() - # test_3d_models() - - # # Quantization test - # from qnn_test import test_quantized_imagenet, test_quantized_modules - - # test_quantized_modules() - # test_quantized_imagenet() - - # # Test simple conditionals and loop - # test_control_flow() - # test_simple_rnn() - - # # More complex recurrent models - # from test_lstm import test_custom_lstm - - # test_custom_lstm() - - # # Test bert model - # test_forward_pretrained_bert_base_uncased() - - # # Test convert torch script(jit) with specific inputs' types - # test_convert_torch_script_with_input_types() + test_forward_traced_function() + test_forward_dtypes() + test_weight_names() + test_duplicate_weight_use() + + # Single operator tests + test_forward_pixel_shuffle() + test_forward_add() + test_forward_subtract() + test_forward_multiply() + test_forward_matmul() + test_forward_rsub() + test_forward_onehot() + test_forward_embedding() + test_forward_reshape() + test_forward_reciprocal() + test_forward_repeat() + test_forward_repeat_interleave() + test_forward_squeeze() + test_forward_unsqueeze() + test_forward_concatenate() + test_forward_reduce_sum() + test_forward_reduce_prod() + test_forward_argmin() + test_forward_argmax() + test_forward_norm() + test_forward_frobenius_norm() + test_forward_std() + test_forward_variance() + test_forward_relu() + test_forward_prelu() + test_forward_leakyrelu() + test_forward_elu() + test_forward_celu() + test_forward_gelu() + test_forward_selu() + test_forward_log_sigmoid() + test_forward_adaptiveavgpool() + test_forward_maxpool2d() + test_forward_maxpool1d() + test_forward_maxpool3d() + test_forward_hardtanh() + test_forward_conv() + test_forward_conv_transpose() + test_forward_threshold() + test_forward_contiguous() + test_forward_batchnorm() + test_forward_instancenorm() + test_forward_layernorm() + test_forward_groupnorm() + test_forward_transpose() + test_forward_size() + test_forward_view() + test_forward_select() + test_forward_take() + test_forward_topk() + test_forward_where() + test_forward_addcdiv() + test_forward_addcmul() + test_forward_true_divide() + test_forward_clone() + test_forward_softplus() + test_forward_softsign() + test_forward_logsoftmax() + test_forward_sigmoid() + test_forward_dense() + test_forward_avgpool() + test_forward_avgpool3d() + test_forward_dropout() + test_forward_slice() + test_forward_mean() + test_forward_expand() + test_forward_pow() + test_forward_unary() + test_forward_clamp() + test_forward_clamp_() + test_forward_logical_not() + test_forward_bitwise_not() + test_forward_bitwise_xor() + test_forward_logical_xor() + test_forward_isfinite() + test_forward_isnan() + test_forward_isinf() + test_forward_ones() + test_forward_ones_like() + test_forward_zeros() + test_forward_zeros_like() + test_forward_full() + test_forward_full_like() + test_forward_linspace() + test_forward_arange() + test_forward_mesh_grid() + test_forward_chunk() + test_forward_split() + test_forward_gather() + test_upsample() + test_forward_upsample3d() + test_forward_nms() + test_forward_roi_align() + test_to() + test_flatten() + test_type_as() + test_forward_functional_pad() + test_forward_zero_pad2d() + test_forward_constant_pad1d() + test_forward_constant_pad2d() + test_forward_constant_pad3d() + test_forward_reflection_pad1d() + test_forward_reflection_pad2d() + test_forward_replication_pad1d() + test_forward_replication_pad2d() + test_forward_replication_pad3d() + test_adaptive_pool3d() + test_conv3d() + test_conv3d_transpose() + test_forward_index() + test_min_max() + test_logsumexp() + test_stack() + test_stack_dynamic() + test_forward_unbind() + test_forward_nonzero() + test_forward_scatter() + test_numel() + test_bincount() + + # Model tests + test_resnet18() + test_squeezenet1_0() + test_squeezenet1_1() + test_densenet121() + # disable inception test for now, since loading it takes ~5min on torchvision-0.5 due to scipy bug + # See https://discuss.pytorch.org/t/torchvisions-inception-v3-takes-much-longer-to-load-than-other-models/68756 + # test_inception_v3() + test_googlenet() + test_mnasnet0_5() + test_mobilenet_v2() + + test_custom_conversion_map() + + test_segmentaton_models() + test_3d_models() + + # Quantization test + from qnn_test import test_quantized_imagenet, test_quantized_modules + + test_quantized_modules() + test_quantized_imagenet() + + # Test simple conditionals and loop + test_control_flow() + test_simple_rnn() + + # More complex recurrent models + from test_lstm import test_custom_lstm + + test_custom_lstm() + + # Test bert model + test_forward_pretrained_bert_base_uncased() + + # Test convert torch script(jit) with specific inputs' types + test_convert_torch_script_with_input_types() From 4b3228dcfb5bc144781456b648b2ffa28c1d2e35 Mon Sep 17 00:00:00 2001 From: Tyler Davis Date: Thu, 17 Dec 2020 19:08:54 -0800 Subject: [PATCH 4/5] reintroduce newline --- python/tvm/relay/frontend/pytorch.py | 1 + 1 file changed, 1 insertion(+) diff --git a/python/tvm/relay/frontend/pytorch.py b/python/tvm/relay/frontend/pytorch.py index 878713a94a3c..eb2b880c8ae5 100644 --- a/python/tvm/relay/frontend/pytorch.py +++ b/python/tvm/relay/frontend/pytorch.py @@ -146,6 +146,7 @@ def __init__(self, prelude, default_dtype): # above. def infer_type(self, node, mod=None): """An incremental method to infer the type of a node in the relay graph.""" + if node in self.types: return self.types[node] if isinstance(node, tvm.relay.Var): From 656b326b2bca18a4bd25b17dd05061de9a86b376 Mon Sep 17 00:00:00 2001 From: Tyler Davis Date: Thu, 17 Dec 2020 20:03:52 -0800 Subject: [PATCH 5/5] Fix style --- python/tvm/relay/frontend/pytorch.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/python/tvm/relay/frontend/pytorch.py b/python/tvm/relay/frontend/pytorch.py index eb2b880c8ae5..ebc0132435ba 100644 --- a/python/tvm/relay/frontend/pytorch.py +++ b/python/tvm/relay/frontend/pytorch.py @@ -2067,7 +2067,7 @@ def is_floating_point(self, inputs, input_types): else: input_type = input_types[0] - is_float = input_type in ['float32', 'float64', 'float16'] + is_float = input_type in ["float32", "float64", "float16"] return _expr.const(is_float) # Operator mappings