| # Copyright (c) Meta Platforms, Inc. and affiliates. |
| # All rights reserved. |
| # |
| # This source code is licensed under the BSD-style license found in the |
| # LICENSE file in the root directory of this source tree. |
| |
| |
| from collections import namedtuple |
| from typing import Callable |
| |
| from executorch.backends.vulkan.test.op_tests.utils.test_suite import VkTestSuite |
| |
| |
| # Prime numbers dim sizes for testing |
| XL = 113 |
| L = 89 |
| M2 = 41 |
| M1 = 37 |
| M = 29 |
| S2 = 11 |
| S1 = 7 |
| S = 5 |
| XS = 3 |
| |
| test_suites = {} |
| |
| |
| def register_test_suite(aten_op): |
| def test_suite_decorator(fn: Callable) -> Callable: |
| if isinstance(aten_op, str): |
| test_suites[aten_op] = fn() |
| elif isinstance(aten_op, list): |
| for op in aten_op: |
| test_suites[op] = fn() |
| return fn |
| |
| return test_suite_decorator |
| |
| |
| @register_test_suite( |
| ["aten.add.Tensor", "aten.sub.Tensor", "aten.div.Tensor", "aten.mul.Tensor"] |
| ) |
| def get_binary_elementwise_inputs(): |
| test_suite = VkTestSuite( |
| [ |
| ((M1, M2), (M1, M2)), |
| ((M1, M2), (M1, 1), 2.0), |
| ((M1, M2), (1, M2)), |
| ((S, S1, S2), (S, S1, S2)), |
| ((S, S1, S2), (S, S1, 1), 2.0), |
| ((S, S1, S2), (S, 1, S2), 2.0), |
| ((XS, S, S1, S2), (XS, S, 1, 1), 2.0), |
| ] |
| ) |
| test_suite.layouts = [ |
| "utils::kWidthPacked", |
| "utils::kChannelsPacked", |
| ] |
| return test_suite |
| |
| |
| @register_test_suite("aten.mm.default") |
| def get_mm_inputs(): |
| test_suite = VkTestSuite( |
| [ |
| ((M1, L), (L, M2)), |
| ((S1, S2), (S2, M)), |
| ((6, 32), (32, 64)), |
| ], |
| ) |
| test_suite.prepacked_args = ["mat2"] |
| # ATen matmul doesn't support half |
| test_suite.dtypes = ["at::kFloat"] |
| test_suite.storage_types = ["utils::kTexture3D", "utils::kBuffer"] |
| test_suite.layouts = [ |
| "utils::kWidthPacked", |
| "utils::kChannelsPacked", |
| ] |
| return test_suite |
| |
| |
| @register_test_suite("aten.bmm.default") |
| def get_bmm_inputs(): |
| test_suite = VkTestSuite( |
| [ |
| ((S, M1, L), (S, L, M2)), |
| ((M, S1, S2), (M, S2, M)), |
| ((4, 6, 32), (4, 32, 16)), |
| ], |
| ) |
| test_suite.prepacked_args = ["mat2"] |
| # ATen matmul doesn't support half |
| test_suite.dtypes = ["at::kFloat"] |
| test_suite.layouts = [ |
| "utils::kWidthPacked", |
| "utils::kChannelsPacked", |
| ] |
| return test_suite |
| |
| |
| @register_test_suite("aten.addmm.default") |
| def get_addmm_inputs(): |
| test_suite = VkTestSuite( |
| [ |
| ((1, S), (S1, S), (S, S), 1.0, 1.5), |
| ((S, 1), (S, S1), (S1, S1), 1.0, 1.0), |
| ((M1, M2), (M1, M2), (M2, M2)), |
| ((M1, M2), (M1, M2), (M2, M2), 4.2, 2.3), |
| ((M1, 1), (M1, L), (L, L), 2.0, 3.0), |
| ((M2), (M1, M2), (M2, M2)), |
| ((6, M2), (6, M2), (M2, M2)), |
| ] |
| ) |
| # ATen matmul doesn't support half |
| test_suite.dtypes = ["at::kFloat"] |
| test_suite.layouts = [ |
| "utils::kWidthPacked", |
| "utils::kChannelsPacked", |
| ] |
| return test_suite |
| |
| |
| common_MKN_list = [ |
| (S2, M2, M1), |
| (L, L, M1), |
| ] |
| |
| |
| def get_linear_texture_inputs(): |
| MKN_list = common_MKN_list |
| |
| inputs_list = [((M, K), (N, K), None) for M, K, N in MKN_list] |
| inputs_list += [((M, K), (N, K), (N)) for M, K, N in MKN_list] |
| inputs_list += [((3, M, K), (N, K), None) for M, K, N in MKN_list] |
| inputs_list += [((3, M, K), (N, K), (N)) for M, K, N in MKN_list] |
| inputs_list += [((3, 6, K), (N, K), (N)) for M, K, N in MKN_list] |
| |
| test_suite = VkTestSuite(inputs_list) |
| test_suite.dtypes = ["at::kFloat"] |
| test_suite.layouts = [ |
| "utils::kWidthPacked", |
| "utils::kChannelsPacked", |
| ] |
| test_suite.test_name_suffix = "texture" |
| return test_suite |
| |
| |
| def get_linear_buffer_inputs(): |
| MKN_list = common_MKN_list |
| |
| inputs_list = [((M, K), (N, K), None) for M, K, N in MKN_list] |
| inputs_list += [((3, M, K), (N, K), None) for M, K, N in MKN_list] |
| |
| test_suite = VkTestSuite(inputs_list) |
| test_suite.dtypes = ["at::kFloat"] |
| test_suite.layouts = [ |
| "utils::kWidthPacked", |
| "utils::kChannelsPacked", |
| ] |
| test_suite.storage_types = ["utils::kBuffer"] |
| test_suite.test_name_suffix = "buffer" |
| return test_suite |
| |
| |
| @register_test_suite("aten.linear.default") |
| def get_linear_test_suites(): |
| return [get_linear_texture_inputs(), get_linear_buffer_inputs()] |
| |
| |
| @register_test_suite("aten._weight_int8pack_mm.default") |
| def get_weight_int8pack_mm_inputs(): |
| MKN_list = common_MKN_list |
| |
| inputs_list = [((M, K), (N, K), (N)) for M, K, N in MKN_list] |
| |
| test_suite = VkTestSuite(inputs_list) |
| test_suite.dtypes = ["at::kFloat", "at::kHalf"] |
| test_suite.layouts = ["utils::kWidthPacked"] |
| test_suite.storage_types = ["utils::kTexture3D", "utils::kBuffer"] |
| test_suite.prepacked_args = ["mat2", "scales"] |
| test_suite.requires_prepack = True |
| |
| test_suite.arg_dtype["mat2"] = "at::kChar" |
| test_suite.arg_data_range["mat2"] = (0, 100) |
| |
| test_suite.arg_data_range["scales"] = (0.0008, 0.001) |
| |
| return test_suite |
| |
| |
| @register_test_suite("aten.avg_pool2d.default") |
| def get_avg_pool2d_inputs(): |
| Test = namedtuple( |
| "VkAvgPoolTest", |
| [ |
| "self", |
| "kernel_size", |
| "stride", |
| "padding", |
| "ceil_mode", |
| "count_include_pad", |
| "divisor_override", |
| ], |
| ) |
| |
| test_cases = [] |
| for ceil_mode in [True, False]: |
| for count_include_pad in [True, False]: |
| for divisor_override in [None, 5]: |
| test_cases += [ |
| Test( |
| self=(S, M1, M2), |
| kernel_size=[2, 2], |
| stride=[1, 1], |
| padding=[0, 0], |
| ceil_mode=ceil_mode, |
| count_include_pad=count_include_pad, |
| divisor_override=divisor_override, |
| ), |
| ] |
| |
| test_suite = VkTestSuite([tuple(tc) for tc in test_cases]) |
| test_suite.dtypes = ["at::kFloat"] |
| return test_suite |
| |
| |
| @register_test_suite("aten.max_pool2d_with_indices.default") |
| def get_max_pool2d_inputs(): |
| test_suite = VkTestSuite( |
| [ |
| ((S, M1, M2), [2, 2], [1, 1], [0, 0], [1, 1]), |
| ] |
| ) |
| return test_suite |
| |
| |
| @register_test_suite("aten.convolution.default") |
| def get_conv_inputs(): |
| test_suite = VkTestSuite( |
| [ |
| ( |
| (1, 6, 40, 50), |
| (8, 6, 3, 3), |
| (8,), |
| [1, 2], |
| [2, 3], |
| [1, 1], |
| False, |
| [0, 0], |
| 1, |
| ), |
| ( |
| (1, 6, 40, 50), |
| (6, 8, 3, 3), |
| (8,), |
| [1, 2], |
| [2, 3], |
| [1, 1], |
| True, |
| [0, 1], |
| 1, |
| ), |
| ( |
| (1, 8, 72, 96), |
| (8, 1, 3, 3), |
| (8,), |
| [1, 1], |
| [1, 1], |
| [1, 1], |
| False, |
| [0, 0], |
| 8, |
| ), |
| ( |
| (1, 8, 72, 96), |
| (8, 8, 1, 1), |
| (8,), |
| [1, 1], |
| [1, 1], |
| [1, 1], |
| False, |
| [0, 0], |
| 1, |
| ), |
| ( |
| (1, 6, 40, 50), |
| (8, 6, 3, 3), |
| None, |
| [1, 2], |
| [2, 3], |
| [1, 1], |
| False, |
| [0, 0], |
| 1, |
| ), |
| ( |
| (1, 6, 7), |
| (6, 1, 3), |
| (6,), |
| [1], |
| [0], |
| [1], |
| False, |
| [0], |
| 6, |
| ), |
| ( |
| (2, 20, 30), |
| (10, 4, 6), |
| (10,), |
| [5], |
| [5], |
| [3], |
| False, |
| [0], |
| 5, |
| ), |
| ( |
| (1, 9, 11), |
| (9, 1, 3), |
| None, |
| [1], |
| [0], |
| [1], |
| False, |
| [0], |
| 9, |
| ), |
| ( |
| (5, 15, 30), |
| (20, 3, 3), |
| None, |
| [3], |
| [5], |
| [7], |
| False, |
| [0], |
| 5, |
| ), |
| ( |
| (1, 16, 672, 512), |
| (64, 16, 1, 1), |
| (64,), |
| [1, 1], |
| [0, 0], |
| [1, 1], |
| False, |
| [0, 0], |
| 1, |
| ), |
| ] |
| ) |
| return test_suite |
| |
| |
| @register_test_suite("aten.native_layer_norm.default") |
| def get_native_layer_norm_inputs(): |
| test_suite = VkTestSuite( |
| [ |
| ((S1, S2), [S2], (S2), (S2), 0.001), |
| ((M, M1, M2), [M2], (M2), (M2), 0.001), |
| ((S, XL, M1, M2), [M2], (M2), (M2), 0.001), |
| ] |
| ) |
| return test_suite |
| |
| |
| @register_test_suite("aten.upsample_nearest2d.vec") |
| def get_upsample_inputs(): |
| test_suite = VkTestSuite( |
| [ |
| # (input tensor shape, output 2D image size (H, W), output scaling factors) |
| ((2, 2, 2, 2), None, [1, 1]), |
| ((1, 1, 2, 2), None, [2, 2]), |
| ((1, 1, 2, 2), None, [2, 4]), |
| ((1, 1, 2, 2), None, [4, 2]), |
| ((1, 1, 2, 2), [2, 2], None), |
| ((1, 1, 2, 2), [2, 4], None), |
| ((1, 1, 2, 2), [3, 2], None), |
| ] |
| ) |
| return test_suite |
| |
| |
| @register_test_suite(["aten.full.default", "aten.full_like.default"]) |
| def get_full_inputs(): |
| test_suite = VkTestSuite( |
| [ |
| ([S1, S2], 42.0), |
| ([M, M1, M2], 3.14), |
| ([L, M, M1, M2], 2.72), |
| ] |
| ) |
| return test_suite |
| |
| |
| @register_test_suite( |
| [ |
| "aten.zeros.default", |
| "aten.zeros_like.default", |
| "aten.ones.default", |
| "aten.ones_like.default", |
| ] |
| ) |
| def get_ones_inputs(): |
| test_suite = VkTestSuite( |
| [ |
| ([S1, S2]), |
| ([M, M1, M2]), |
| ([L, M, M1, M2]), |
| ] |
| ) |
| return test_suite |
| |
| |
| @register_test_suite(["aten.select.int", "aten.select_copy.int"]) |
| def get_select_int_inputs(): |
| test_suite = VkTestSuite( |
| [ |
| ((6, 2, 7), 0, 3), |
| ((6, 2, 7), 1, 0), |
| ((6, 2, 7), 2, 3), |
| ((6, 10, 7), 0, 3), |
| ((6, 10, 7), 1, 0), |
| ((6, 10, 7), 1, 9), |
| ((6, 10, 7), 2, 6), |
| ((9, 2, 9, 4), 0, 8), |
| ((9, 2, 9, 4), 1, 1), |
| ((9, 2, 9, 4), 2, 0), |
| ((9, 2, 9, 4), 2, 8), |
| ((9, 2, 9, 4), 3, 3), |
| ((8, 6, 1, 1), 0, 4), |
| ((8, 6, 1, 1), 1, 4), |
| ] |
| ) |
| return test_suite |
| |
| |
| @register_test_suite(["aten.permute.default", "aten.permute_copy.default"]) |
| def get_permute_inputs(): |
| test_suite = VkTestSuite( |
| [ |
| ((9, 2, 9, 4), [0, 1, 2, 3]), |
| ((9, 2, 9, 4), [0, 1, 3, 2]), |
| ((9, 2, 9, 4), [0, 2, 1, 3]), |
| ((9, 2, 9, 4), [0, 2, 3, 1]), |
| ((9, 2, 9, 4), [0, 3, 1, 2]), |
| ((9, 2, 9, 4), [0, 3, 2, 1]), |
| ((9, 2, 9, 4), [3, 0, 1, 2]), |
| ((9, 2, 9, 4), [3, 2, 0, 1]), |
| ((9, 2, 9, 4), [2, 3, 0, 1]), |
| ((9, 2, 9, 4), [2, 0, 3, 1]), |
| ((9, 2, 9), [2, 0, 1]), |
| ((9, 2, 9), [1, 2, 0]), |
| ((9, 2), [0, 1]), |
| ((9, 2), [1, 0]), |
| ] |
| ) |
| |
| test_suite.layouts = ["utils::kChannelsPacked"] |
| return test_suite |
| |
| |
| @register_test_suite("aten.view_copy.default") |
| def get_view_inputs(): |
| test_suite = VkTestSuite( |
| [ |
| ((3, 4, 5), [1, 1, -1]), |
| ((3, 4, 5), [1, -1, 1]), |
| ((3, 4, 5), [-1, 1, 1]), |
| ((8, 7, 2, 3), [4, 3, 7, 4]), |
| ((8, 7, 2, 3), [7, -1, 2, 1]), |
| ((8, 7, 2, 3), [1, 1, 1, -1]), |
| ((8, 7, 2, 3), [-1]), |
| ((2, 3, 3, 7), [2, -1, 1, 1]), |
| ((3, 5, 2, 7), [7, -1, 2, 1]), |
| ((2, 2, 8, 6), [2, 6, -1, 1]), |
| ((2, 2, 8, 6), [6, -1, 1]), |
| ((S1, S2, S1, S2), [S2, -1, 1, S1]), |
| ((S1, S2, S1, S2), [S1, 1, -1, S2]), |
| ((S1, S2, S1, S2), [-1, 1, S1, S2]), |
| ] |
| ) |
| test_suite.layouts = [ |
| "utils::kWidthPacked", |
| "utils::kHeightPacked", |
| "utils::kChannelsPacked", |
| ] |
| return test_suite |
| |
| |
| @register_test_suite("aten.slice_copy.Tensor") |
| def get_slice_out_inputs(): |
| Test = namedtuple("VkSliceTest", ["self", "dim", "start", "end", "step"]) |
| Test.__new__.__defaults__ = (None, 0, None, None, 1) |
| |
| # Slice by width and height |
| test_cases = [ |
| Test(self=[1, 1, 4, 10], dim=3, start=3), |
| Test(self=[1, 1, 4, 10], dim=3, start=3, step=2), |
| Test(self=[1, 1, 4, 10], dim=3, start=3, end=4, step=2), |
| Test(self=[1, 1, 4, 10], dim=2, start=3), |
| Test(self=[9, 9, 9, 9], dim=2, start=0, end=9, step=1), |
| Test(self=[9, 9, 9, 9], dim=2, start=1, end=8, step=1), |
| Test(self=[9, 9, 9, 9], dim=2, start=1, end=2, step=1), |
| Test(self=[9, 9, 9, 9], dim=3, start=1, end=5, step=1), |
| Test(self=[9, 9, 9, 9], dim=3, start=1, end=5, step=2), |
| Test(self=[9, 9, 9, 9], dim=-1, start=1, end=5, step=2), |
| Test(self=[9, 9, 9, 9], dim=-2, start=1, end=5, step=2), |
| Test(self=[9, 9, 9], dim=1, start=2, step=1), |
| Test(self=[9, 9, 9], dim=1, start=2, step=2), |
| Test(self=[9, 9, 9], dim=2, start=2, step=1), |
| Test(self=[9, 9, 9], dim=2, start=2, step=2), |
| Test(self=[9, 9], dim=0, start=2, step=1), |
| Test(self=[9, 9], dim=0, start=2, step=2), |
| Test(self=[9, 9], dim=1, start=2, step=1), |
| Test(self=[9, 9], dim=1, start=2, step=2), |
| ] |
| |
| # Slice by batch |
| test_cases += [ |
| Test(self=[6, 5, 3, 2], dim=0), |
| Test(self=[6, 5, 3, 2], dim=0, step=2), |
| Test(self=[13, 13, 3, 2], dim=0, step=2), |
| Test(self=[13, 13, 3, 2], dim=0, start=1, step=2), |
| Test(self=[13, 13, 3, 2], dim=0, start=1, step=5), |
| Test(self=[13, 13, 3, 2], dim=0, start=1, step=20), |
| Test(self=[13, 2, 3, 2], dim=0, start=1, step=2), |
| Test(self=[13, 2, 3, 2], dim=0, start=1, step=5), |
| Test(self=[13, 2, 3, 2], dim=0, start=1, step=20), |
| ] |
| |
| # Slice by channel |
| test_cases += [ |
| Test(self=[2, 5, 1, 10], dim=1), |
| Test(self=[2, 5, 1, 10], dim=1, start=1), |
| Test(self=[2, 5, 1, 10], dim=1, start=1, step=2), |
| Test(self=[5, 13, 1, 10], dim=1), |
| Test(self=[5, 13, 1, 10], dim=1, start=1), |
| Test(self=[5, 13, 1, 10], dim=1, start=1, step=2), |
| Test(self=[5, 13, 1, 10], dim=1, start=1, step=5), |
| Test(self=[5, 13, 1, 10], dim=1, start=1, step=20), |
| Test(self=[13, 1, 10], dim=0), |
| Test(self=[13, 1, 10], dim=0, start=1), |
| Test(self=[13, 1, 10], dim=0, start=1, step=2), |
| Test(self=[13, 1, 10], dim=0, start=1, step=5), |
| Test(self=[13, 1, 10], dim=0, start=1, step=20), |
| ] |
| |
| # Slice by negative/unspecified indices |
| INT64_MAX = 9223372036854775807 # represents arr[:] |
| test_cases += [ |
| Test(self=[8, 9], dim=0, start=-2, step=1), |
| Test(self=[8, 9], dim=0, start=-2, step=2), |
| Test(self=[8, 9], dim=0, end=-2, step=1), |
| Test(self=[8, 9], dim=0, end=-2, step=2), |
| Test(self=[8, 9], dim=0, end=INT64_MAX, step=1), |
| Test(self=[8, 9], dim=0, end=INT64_MAX, step=2), |
| Test(self=[8, 9], dim=1, start=-2, step=1), |
| Test(self=[8, 9], dim=1, start=-2, step=2), |
| Test(self=[8, 9], dim=1, end=-2, step=1), |
| Test(self=[8, 9], dim=1, end=-2, step=2), |
| Test(self=[8, 9], dim=1, end=INT64_MAX, step=1), |
| Test(self=[8, 9], dim=1, end=INT64_MAX, step=2), |
| ] |
| |
| test_suite = VkTestSuite([tuple(tc) for tc in test_cases]) |
| |
| test_suite.dtypes = ["at::kFloat", "at::kHalf"] |
| test_suite.layouts = ["utils::kChannelsPacked"] |
| test_suite.data_gen = "make_seq_tensor" |
| return test_suite |
| |
| |
| def get_slice_view_inputs(): |
| Test = namedtuple("VkSliceTest", ["self", "dim", "start", "end", "step"]) |
| Test.__new__.__defaults__ = (None, 0, None, None, 1) |
| |
| # Slice by channel |
| test_cases = [ |
| Test(self=[1, 17, 1, 10], dim=1, start=0, end=4), |
| Test(self=[1, 17, 1, 10], dim=1, start=0, end=8), |
| Test(self=[1, 17, 3, 7], dim=1, start=0, end=12), |
| ] |
| |
| test_suite = VkTestSuite([tuple(tc) for tc in test_cases]) |
| |
| test_suite.dtypes = ["at::kFloat"] |
| test_suite.storage_types = ["utils::kBuffer", "utils::kTexture3D"] |
| test_suite.layouts = ["utils::kWidthPacked"] |
| test_suite.data_gen = "make_seq_tensor" |
| test_suite.is_view_op = True |
| |
| return test_suite |
| |
| |
| @register_test_suite(["aten.slice.Tensor"]) |
| def get_slice_inputs(): |
| texture_test_suite = get_slice_out_inputs() |
| texture_test_suite.test_name_suffix = "no_view" |
| |
| view_test_suite = get_slice_view_inputs() |
| view_test_suite.test_name_suffix = "view" |
| |
| return [view_test_suite, texture_test_suite] |
| |
| |
| @register_test_suite(["aten.transpose.int"]) |
| def get_transpose_inputs(): |
| Test = namedtuple("VkTransposeViewTest", ["self", "dim0", "dim1"]) |
| Test.__new__.__defaults__ = (None, 0, 1) |
| |
| test_cases = [ |
| Test(self=[M1, M2], dim0=0, dim1=1), |
| Test(self=[M1, S2, M], dim0=0, dim1=1), |
| Test(self=[M1, S2, M], dim0=0, dim1=2), |
| Test(self=[M1, S2, M], dim0=2, dim1=1), |
| Test(self=[S, M, S2, M2], dim0=3, dim1=2), |
| Test(self=[S, M, S2, M2], dim0=1, dim1=2), |
| Test(self=[S, M, S2, M2], dim0=3, dim1=1), |
| ] |
| |
| test_suite = VkTestSuite([tuple(tc) for tc in test_cases]) |
| |
| test_suite.dtypes = ["at::kFloat"] |
| test_suite.storage_types = ["utils::kBuffer", "utils::kTexture3D"] |
| test_suite.layouts = ["utils::kWidthPacked", "utils::kChannelsPacked"] |
| test_suite.data_gen = "make_seq_tensor" |
| test_suite.is_view_op = True |
| return test_suite |
| |
| |
| @register_test_suite("aten.index_select.default") |
| def get_index_select_inputs(): |
| Test = namedtuple("VkIndexSelectTest", ["self", "dim", "index"]) |
| Test.__new__.__defaults__ = (None, 0, None) |
| |
| test_cases = [] |
| |
| for i in range(4): |
| test_cases += [ |
| Test(self=[9, 9, 9, 9], dim=i, index=[0]), |
| Test(self=[9, 9, 9, 9], dim=i, index=[2]), |
| Test(self=[9, 9, 9, 9], dim=i, index=[0, 2]), |
| Test(self=[9, 9, 9, 9], dim=i, index=[3, 1]), |
| Test(self=[9, 9, 9, 9], dim=i, index=[5, 5]), |
| Test(self=[9, 9, 9, 9], dim=i, index=[2, 3, 4, 5, 7]), |
| ] |
| |
| test_suite = VkTestSuite([tuple(tc) for tc in test_cases]) |
| |
| test_suite.dtypes = ["at::kFloat"] |
| test_suite.layouts = ["utils::kChannelsPacked"] |
| return test_suite |
| |
| |
| @register_test_suite("aten.embedding.default") |
| def get_embedding_inputs(): |
| Test = namedtuple("VkEmbeddingTest", ["weight", "indices"]) |
| Test.__new__.__defaults__ = (None, None) |
| |
| test_cases = [ |
| Test(weight=[10, 9], indices=[0, 2]), |
| Test(weight=[10, 9], indices=[2, 3, 4, 5, 7]), |
| Test(weight=[10, 9], indices=[[0, 2], [1, 4], [7, 7]]), |
| Test(weight=[10, 9], indices=[[1, 2, 3], [1, 2, 3], [1, 2, 3], [1, 2, 3]]), |
| Test(weight=[10, 9], indices=[[[3, 1, 4], [1, 5, 9]], [[2, 6, 5], [3, 5, 8]]]), |
| ] |
| |
| test_suite = VkTestSuite([tuple(tc) + (-1, "false", "false") for tc in test_cases]) |
| |
| test_suite.dtypes = ["at::kFloat"] |
| test_suite.layouts = ["utils::kChannelsPacked"] |
| return test_suite |
| |
| |
| @register_test_suite("aten.unsqueeze_copy.default") |
| def get_unsqueeze_inputs(): |
| test_suite = VkTestSuite( |
| [ |
| ((2, 3, 4), 0), |
| ((1, 1, 1), 0), |
| ((1, 1, 1), 1), |
| ((1, 1, 1), 2), |
| ((1, 1, 1), 3), |
| ((9, 9, 9), 0), |
| ((9, 9, 9), 1), |
| ((9, 9, 9), 2), |
| ((9, 9, 9), 3), |
| ((9, 9), 0), |
| ((9, 9), 1), |
| ((9, 9), 2), |
| ((9,), 0), |
| ((9,), 1), |
| ] |
| ) |
| test_suite.layouts = [ |
| "utils::kChannelsPacked", |
| ] |
| test_suite.data_gen = "make_seq_tensor" |
| return test_suite |
| |
| |
| @register_test_suite("aten.clone.default") |
| def get_clone_inputs(): |
| test_suite = VkTestSuite( |
| [ |
| ((S2, S1, S2, S1),), |
| ((S2, S1, S2),), |
| ((S2, S1),), |
| ((S2,),), |
| ((XS, S1, XS, S1),), |
| ((XS, S1, XS),), |
| ((S1, XS, S1),), |
| ((XS, S1),), |
| ((S1, XS),), |
| ((S1,),), |
| ((XS,),), |
| ] |
| ) |
| test_suite.layouts = [ |
| "utils::kChannelsPacked", |
| ] |
| test_suite.data_gen = "make_seq_tensor" |
| return test_suite |
| |
| |
| @register_test_suite("aten.repeat.default") |
| def get_repeat_inputs(): |
| test_suite_2d = VkTestSuite( |
| [ |
| ((2, 3), [1, 4]), |
| ((2, 3), [4, 1]), |
| ((2, 3), [4, 4]), |
| ((2, 3), [3, 1, 4]), |
| ] |
| ) |
| test_suite_2d.layouts = ["utils::kChannelsPacked"] |
| test_suite_2d.storage_types = ["utils::kTexture2D"] |
| test_suite_2d.data_gen = "make_seq_tensor" |
| test_suite_2d.dtypes = ["at::kFloat"] |
| test_suite_2d.test_name_suffix = "2d" |
| |
| test_suite_3d = VkTestSuite( |
| [ |
| # Repeat channels only (most challenging case) |
| ((3, XS, S), [2, 1, 1]), |
| ((7, XS, S), [4, 1, 1]), |
| ((1, 7, XS, S), [1, 4, 1, 1]), |
| ((3, 7, XS, S), [1, 4, 1, 1]), |
| # Repat channels with other dims |
| ((1, 7, XS, S), [1, 4, 1, 3]), |
| ((3, 7, XS, S), [1, 4, 1, 3]), |
| ((3, 7, XS, S), [1, 4, 3, 1]), |
| ((3, 7, XS, S), [1, 4, 3, 3]), |
| # Repeat Batch |
| ((3, 7, XS, S), [3, 4, 3, 3]), |
| ((3, 7, XS, S), [3, 1, 3, 3]), |
| # More other cases |
| ((3, 7, 1, 1), [1, 4, 1, 1]), |
| ((2, 3), [1, 4]), |
| ((2, 3), [4, 1]), |
| ((2, 3), [4, 4]), |
| ((S1, S2, S2), [1, 3, 1]), |
| ((S1, S2, S2), [1, 3, 3]), |
| ((S1, S2, S2), [3, 3, 1]), |
| ((S1, S2, S2), [3, 3, 3]), |
| ((S1, S2, S2, S2), [1, 1, 3, 1]), |
| ((S1, S2, S2, S2), [1, 1, 1, 3]), |
| ((S1, S2, S2, S2), [1, 1, 3, 3]), |
| ((S1, S2, S2, S2), [1, 3, 1, 3]), |
| ((S1, S2, S2, S2), [3, 3, 3, 3]), |
| ((S1, S2, S2, S2), [3, 3, 1, 1]), |
| # Expanding cases |
| ((2, 3), [3, 1, 4]), |
| ((2, 3), [3, 3, 2, 4]), |
| ] |
| ) |
| test_suite_3d.layouts = ["utils::kChannelsPacked"] |
| test_suite_3d.storage_types = ["utils::kTexture3D"] |
| test_suite_3d.data_gen = "make_seq_tensor" |
| test_suite_3d.dtypes = ["at::kFloat"] |
| test_suite_3d.test_name_suffix = "3d" |
| |
| return [test_suite_2d, test_suite_3d] |
| |
| |
| @register_test_suite("aten.repeat_interleave.self_int") |
| def get_repeat_interleave_inputs(): |
| test_suite_W = VkTestSuite( |
| [ |
| ((4, 32, 256), 3, -2), |
| # Test repeat on each non-packed dim |
| ((16, 32, 64), 5, -2), |
| ((16, 32, 64), 5, -3), |
| # Test batched inputs |
| ((3, 5, 32, 64), 4, -2), |
| ((3, 5, 32, 64), 4, -3), |
| ] |
| ) |
| test_suite_W.layouts = [ |
| "utils::kWidthPacked", |
| ] |
| test_suite_W.data_gen = "make_seq_tensor" |
| test_suite_W.dtypes = ["at::kFloat"] |
| test_suite_W.test_name_suffix = "W_packed" |
| |
| test_suite_C = VkTestSuite( |
| [ |
| # Test repeat on each non-packed dim |
| ((32, 32, 16), 5, -1), |
| ((32, 32, 16), 5, -2), |
| # Test batched inputs |
| ((3, 16, 8, 64), 4, -1), |
| ((3, 16, 8, 64), 4, -2), |
| ] |
| ) |
| test_suite_C.layouts = [ |
| "utils::kChannelsPacked", |
| ] |
| test_suite_C.data_gen = "make_seq_tensor" |
| test_suite_C.dtypes = ["at::kFloat"] |
| test_suite_C.test_name_suffix = "C_packed" |
| |
| return [test_suite_W, test_suite_C] |
| |
| |
| @register_test_suite("aten.cat.default") |
| def get_cat_inputs(): |
| # TensorList must be specified as list of tuples |
| test_suite = VkTestSuite( |
| [ |
| # Cat on Height |
| ([(S1, S1, 3, 5), (S1, S1, 0, 5)], 2), |
| ([(S1, S1, 3, 5), (S1, S1, 4, 5)], 2), |
| ([(S1, 3, 5), (S1, 4, 5)], 1), |
| ([(3, 5), (4, 5)], 0), |
| ([(3, 5), (4, 5), (1, 5)], 0), |
| ( |
| [(3, 5)], |
| 0, |
| ), |
| # Cat on Width |
| ([(S1, S1, 5, 3), (S1, S1, 5, 4)], 3), |
| ([(S1, 5, 3), (S1, 5, 4)], 2), |
| ([(5, 0), (5, 4)], 1), |
| ([(5, 3), (5, 4)], 1), |
| ([(5, 3), (5, 4), (5, 1)], 1), |
| ( |
| [(5, 4)], |
| 1, |
| ), |
| ([(5,), (6,)], 0), |
| # Cat on Batch |
| ([(S, S1, 5, 4), (S1, S1, 5, 4)], 0), |
| ([(S, XS, 5, 4), (S1, XS, 5, 4)], 0), |
| ([(S, S2, 5, 4), (S1, S2, 5, 4)], 0), |
| ( |
| [ |
| (3, 1, 2, 5), |
| (3, 1, 2, 5), |
| (3, 1, 2, 5), |
| ], |
| 0, |
| ), |
| # Cat on Channel |
| ([(S, 5, 4), (0, 5, 4), (S2, 5, 4)], 0), |
| ([(S, 5, 4), (S1, 5, 4), (S2, 5, 4)], 0), |
| ([(XS, 5, 4), (XS, 5, 4), (S2, 5, 4)], 0), |
| ([(XS, S, 5, 4), (XS, S1, 5, 4), (XS, S2, 5, 4)], 1), |
| ([(XS, XS, 5, 4), (XS, XS, 5, 4), (XS, S2, 5, 4)], 1), |
| ( |
| [ |
| (XS, 1, 2, 5), |
| (XS, 1, 2, 5), |
| (XS, 1, 2, 5), |
| ], |
| 1, |
| ), |
| ] |
| ) |
| test_suite.layouts = [ |
| "utils::kChannelsPacked", |
| ] |
| test_suite.data_gen = "make_seq_tensor" |
| test_suite.dtypes = ["at::kFloat"] |
| return test_suite |
| |
| |
| @register_test_suite("aten.split_with_sizes_copy.default") |
| def get_split_with_sizes_inputs(): |
| Test = namedtuple("VkSliceTest", ["self", "sizes", "dim"]) |
| test_cases = [ |
| # Split on Width |
| Test(self=(S1, 7, 10, 10), sizes=[1, 2, 3, 4], dim=3), |
| Test(self=(7, 10, 10), sizes=[1, 2, 3, 4], dim=2), |
| Test(self=(7, 10, 10), sizes=[1, 9], dim=2), |
| Test(self=(10, 10), sizes=[1, 9], dim=1), |
| Test(self=(10,), sizes=[1, 9], dim=0), |
| # Split on Height |
| Test(self=(S1, 7, 10, 10), sizes=[1, 2, 3, 4], dim=2), |
| Test(self=(7, 10, 10), sizes=[1, 2, 3, 4], dim=1), |
| Test(self=(7, 10, 10), sizes=[10], dim=1), |
| Test(self=(7, 6, 10), sizes=[1, 1, 1, 1, 1, 1], dim=1), |
| Test(self=(10, 10), sizes=[1, 2, 3, 4], dim=0), |
| # Split on Batch |
| Test(self=(10, 7, 10, 10), sizes=[3, 6, 1], dim=0), |
| Test(self=(10, 7, 10, 10), sizes=[10], dim=0), |
| # Split on Channel |
| Test(self=(7, 13, 4, 8), sizes=[3, 6, 1, 3], dim=1), |
| Test(self=(7, 13, 4, 8), sizes=[3, 3, 3, 3, 1], dim=1), |
| Test(self=(13, 4, 8), sizes=[3, 3, 3, 3, 1], dim=0), |
| Test(self=(13, 4, 8), sizes=[2, 9, 2], dim=0), |
| Test(self=(13, 4, 8), sizes=[13], dim=0), |
| ] |
| test_suite = VkTestSuite([tuple(tc) for tc in test_cases]) |
| |
| test_suite.layouts = [ |
| "utils::kChannelsPacked", |
| ] |
| test_suite.data_gen = "make_seq_tensor" |
| test_suite.dtypes = ["at::kFloat"] |
| return test_suite |
| |
| |
| @register_test_suite("aten.split.Tensor") |
| def get_split_tensor_inputs(): |
| test_suite = VkTestSuite( |
| [ |
| # Split on Width |
| ((S1, 7, 10, 12), 12, 3), |
| ((S1, 7, 10, 12), 3, 3), |
| ((S1, 7, 10, 12), 1, 3), |
| ((7, 10, 12), 12, 2), |
| ((7, 10, 12), 3, 2), |
| ((7, 10, 12), 1, 2), |
| ((10, 12), 12, 1), |
| ((10, 12), 3, 1), |
| ((10, 12), 1, 1), |
| ((12,), 12, 0), |
| ((12,), 3, 0), |
| ((12,), 1, 0), |
| # Split on Height |
| ((S1, 7, 12, 8), 12, 2), |
| ((S1, 7, 12, 8), 3, 2), |
| ((S1, 7, 12, 8), 1, 2), |
| ((7, 12, 8), 12, 1), |
| ((7, 12, 8), 3, 1), |
| ((7, 12, 8), 1, 1), |
| ((12, 8), 12, 0), |
| ((12, 8), 3, 0), |
| ((12, 8), 1, 0), |
| # Split on Batch |
| ((12, 7, 10, 10), 12, 0), |
| ((12, 7, 10, 10), 3, 0), |
| ((12, 7, 10, 10), 1, 0), |
| # Split on Channel |
| ((7, 15, 10, 10), 15, 1), |
| ((7, 15, 10, 10), 5, 1), |
| ((7, 15, 10, 10), 3, 1), |
| ((7, 15, 10, 10), 1, 1), |
| ((15, 10, 10), 15, 0), |
| ((15, 10, 10), 5, 0), |
| ((15, 10, 10), 3, 0), |
| ((15, 10, 10), 1, 0), |
| ] |
| ) |
| |
| test_suite.layouts = [ |
| "utils::kChannelsPacked", |
| ] |
| test_suite.data_gen = "make_seq_tensor" |
| test_suite.dtypes = ["at::kFloat"] |
| return test_suite |
| |
| |
| def get_reduce_inputs(is_softmax: bool = False): |
| bool_arg = False if is_softmax else True |
| return [ |
| ((L), 0, bool_arg), |
| ((L), -1, bool_arg), |
| ((M, L), 0, bool_arg), |
| ((M, L), 1, bool_arg), |
| ((L, M), -1, bool_arg), |
| ((M, L), -2, bool_arg), |
| ((S, S1, S2), 0, bool_arg), |
| ((S, S1, S2), 1, bool_arg), |
| ((S, S1, S2), 2, bool_arg), |
| ((S, S1, S2), -1, bool_arg), |
| ((S, S1, S2), -2, bool_arg), |
| ((S, S1, S2), -3, bool_arg), |
| ((1, S, S1, S2), 1, bool_arg), |
| ((1, S, S1, S2), 2, bool_arg), |
| ((1, S, S1, S2), 3, bool_arg), |
| ((1, S, S1, S2), -1, bool_arg), |
| ((1, S, S1, S2), -2, bool_arg), |
| ((1, S, S1, S2), -3, bool_arg), |
| # Test batches > 1 where the reduction dim is not the concat dim |
| ((S, S2, S1, 128), -1, bool_arg), |
| ] |
| |
| |
| @register_test_suite(["aten._softmax.default", "aten._log_softmax.default"]) |
| def get_softmax_inputs(): |
| test_suite = VkTestSuite(get_reduce_inputs(is_softmax=True)) |
| test_suite.layouts = [ |
| "utils::kWidthPacked", |
| "utils::kChannelsPacked", |
| ] |
| return test_suite |
| |
| |
| @register_test_suite( |
| ["aten.amax.default", "aten.amin.default", "aten.sum.dim_IntList", "aten.mean.dim"] |
| ) |
| def get_reduce_op_inputs(): |
| test_suite = VkTestSuite(get_reduce_inputs()) |
| test_suite.layouts = [ |
| "utils::kChannelsPacked", |
| "utils::kWidthPacked", |
| ] |
| return test_suite |
| |
| |
| @register_test_suite( |
| [ |
| "aten.sqrt.default", |
| "aten.rsqrt.default", |
| "aten.exp.default", |
| "aten.hardshrink.default", |
| "aten.sin.default", |
| "aten.neg.default", |
| "aten.cos.default", |
| "aten.hardswish.default", |
| "aten.hardsigmoid.default", |
| ] |
| ) |
| def get_unary_ops_inputs(): |
| test_suite = VkTestSuite( |
| [ |
| (M1,), |
| (M1, M2), |
| (S1, M1, M2), |
| (S1, S2, S2, M2), |
| ] |
| ) |
| test_suite.storage_types = ["utils::kTexture3D", "utils::kBuffer"] |
| test_suite.atol = "1e-4" |
| test_suite.rtol = "1e-4" |
| return test_suite |
| |
| |
| @register_test_suite("aten._native_batch_norm_legit_no_training.default") |
| def get_native_batch_norm_inputs(): |
| Test = namedtuple( |
| "VkSliceTest", ["self", "weight", "bias", "mean", "var", "momentum", "eps"] |
| ) |
| |
| test_cases = [ |
| Test( |
| self=(1, 1, 2, 5), |
| weight=(1,), |
| bias=(1,), |
| mean=(1,), |
| var=(1,), |
| momentum=0.0, |
| eps=0.001, |
| ), |
| Test( |
| self=(S2, 1, 2, 5), |
| weight=(1,), |
| bias=(1,), |
| mean=(1,), |
| var=(1,), |
| momentum=0.0, |
| eps=0.001, |
| ), |
| Test( |
| self=(1, S2, 2, 5), |
| weight=(S2,), |
| bias=(S2,), |
| mean=(S2,), |
| var=(S2,), |
| momentum=0.0, |
| eps=0.001, |
| ), |
| Test( |
| self=(9, S1, 2, 5), |
| weight=(S1,), |
| bias=(S1,), |
| mean=(S1,), |
| var=(S1,), |
| momentum=0.0, |
| eps=0.01, |
| ), |
| Test( |
| self=(3, S1, 2, 5), |
| weight=(S1,), |
| bias=(S1,), |
| mean=(S1,), |
| var=(S1,), |
| momentum=0.0, |
| eps=0.001, |
| ), |
| Test( |
| self=(3, S2, 2, 5), |
| weight=(S2,), |
| bias=(S2,), |
| mean=(S2,), |
| var=(S2,), |
| momentum=0.0, |
| eps=0.001, |
| ), |
| Test( |
| self=(3, S2, 2, 5), |
| weight=(S2,), |
| bias=(S2,), |
| mean=(S2,), |
| var=(S2,), |
| momentum=0.0, |
| eps=0.000, |
| ), |
| ] |
| |
| test_suite = VkTestSuite(test_cases) |
| test_suite.requires_prepack = True |
| test_suite.prepacked_args = ["weight", "bias", "mean", "var"] |
| |
| return test_suite |
| |
| |
| @register_test_suite("aten.gelu.default") |
| def get_gelu_inputs(): |
| test_suite = VkTestSuite( |
| [ |
| ((M1), "tanh"), |
| ((M1, M2), "tanh"), |
| ((S1, M1, M2), "tanh"), |
| ((S1, S2, S2, M2), "tanh"), |
| ] |
| ) |
| return test_suite |
| |
| |
| @register_test_suite("aten.arange.start_step") |
| def get_arange_inputs(): |
| test_suite = VkTestSuite( |
| [ |
| (1, 13), |
| (1.0, 11), |
| (-13, 3), |
| (-11.0, 2), |
| (3, 15, 3), |
| (3, 23, 2), |
| (3, 23.0, 4), |
| (13, 1, -1), |
| (-3, -13, -2), |
| (13, -2.0, -4), |
| ], |
| ) |
| |
| test_suite.layouts = [ |
| "utils::kChannelsPacked", |
| ] |
| return test_suite |
| |
| |
| @register_test_suite("aten.constant_pad_nd.default") |
| def get_constant_pad_nd_inputs(): |
| test_suite = VkTestSuite( |
| [ |
| ([S1, S2], [1, 1], 24.0), |
| ([M, M1, M2], [2, 2], 23.2), |
| ([L, M, M1, M2], [3, 5], 12.2), |
| ([S1, S2], [1, 1, 1, 1], 24.0), |
| ([M, M1, M2], [2, 2, 2, 2], 23.2), |
| ([L, M, M1, M2], [3, 5, 3, 5], 12.2), |
| ([M, M1, M2], [1, 2, 3, 4, 5, 6], 23.2), |
| ([L, M, M1, M2], [3, 3, 3, 3, 3, 3], 12.2), |
| ] |
| ) |
| return test_suite |
| |
| |
| @register_test_suite("aten.minimum.default") |
| def get_minimum_inputs(): |
| test_suite = VkTestSuite( |
| [ |
| ((M1, M2), (M2)), |
| ((M1, M2), (M1, M2)), |
| ((M1, M2, M), (M2, M)), |
| ((M1, M1, S1, S2), (M1, M1, S1, S2)), |
| ((S1, S1, S2, S), (S1, S2, S)), |
| ((M1, S1, S2), (L, M1, S1, S2)), |
| ((S1, S2), (L, M1, S1, S2)), |
| ] |
| ) |
| return test_suite |
| |
| |
| @register_test_suite("aten.squeeze_copy.dims") |
| def get_squeeze_copy_dim_inputs(): |
| test_suite = VkTestSuite( |
| [ |
| ([S, S, S, 1], 3), |
| ([S, 1, S, S], 1), |
| ([S, 1, 1, S], [1, 2]), |
| ([1, S, S, S], 0), |
| ([S, S, S, S], 3), |
| ([S, S, S, S], 2), |
| ([S, S, S, S], 1), |
| ([M, M1, 1], 2), |
| ([M, 1, M1], 1), |
| ([1, M1, M1], 0), |
| ] |
| ) |
| return test_suite |
| |
| |
| @register_test_suite("aten.flip.default") |
| def get_flip_inputs(): |
| Test = namedtuple("Flip", ["self", "dim"]) |
| Test.__new__.__defaults__ = (None, 0) |
| |
| test_cases = [ |
| Test(self=[9], dim=[0]), |
| Test(self=[9, 9], dim=[0, 1]), |
| Test(self=[9, 9, 9], dim=[0, 2]), |
| Test(self=[9, 9, 9], dim=[0, 1, 2]), |
| Test(self=[9, 9, 9, 9], dim=[0]), |
| Test(self=[9, 9, 9, 9], dim=[0, 2, 3]), |
| Test(self=[9, 9, 9, 9], dim=[1, 3]), |
| Test(self=[9, 9, 9, 9], dim=[0, 1, 2, 3]), |
| ] |
| |
| test_suite = VkTestSuite([tuple(tc) for tc in test_cases]) |
| return test_suite |