aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJeremy Johnson <jeremy.johnson@arm.com>2023-04-12 15:59:01 +0100
committerJeremy Johnson <jeremy.johnson@arm.com>2023-04-25 09:37:06 +0100
commitb2099706b3db022e8c4d85c4ae863086630e0678 (patch)
treee21526274314f87ff47b34d01dcce0bd1bd622f7
parent44eb88db7b601aa18fc7bc77601d6291933bdbb9 (diff)
downloadreference_model-b2099706b3db022e8c4d85c4ae863086630e0678.tar.gz
8K level: RESIZE scaling at 64 maximum
Add support for producing scaling 64 tests in RESIZE and make sure default tests are not generated with scaling greater than 64. Signed-off-by: Jeremy Johnson <jeremy.johnson@arm.com> Change-Id: I3e99cde7e6bec6ea7854a139c6fc2ed151af5b1e
-rw-r--r--verif/conformance/tosa_base_profile_ops_info.json16
-rw-r--r--verif/generator/tosa_arg_gen.py74
-rw-r--r--verif/generator/tosa_test_gen.py1
-rw-r--r--verif/generator/tosa_verif_build_tests.py7
4 files changed, 89 insertions, 9 deletions
diff --git a/verif/conformance/tosa_base_profile_ops_info.json b/verif/conformance/tosa_base_profile_ops_info.json
index 5825719..e40ddfc 100644
--- a/verif/conformance/tosa_base_profile_ops_info.json
+++ b/verif/conformance/tosa_base_profile_ops_info.json
@@ -2958,6 +2958,22 @@
"9500"
]
]
+ },
+ "8k_level": {
+ "no_negative_tests": "true",
+ "generator_args": [
+ [
+ "--target-dtype",
+ "int8",
+ "--target-dtype",
+ "int16",
+ "--level-8k-sizes",
+ "--tensor-dim-range",
+ "2,10",
+ "--num-rand-permutations",
+ "2"
+ ]
+ ]
}
},
"selection": {
diff --git a/verif/generator/tosa_arg_gen.py b/verif/generator/tosa_arg_gen.py
index e2a69f1..b027d34 100644
--- a/verif/generator/tosa_arg_gen.py
+++ b/verif/generator/tosa_arg_gen.py
@@ -1905,6 +1905,15 @@ class TosaArgGen:
return scale, offset, border
def get_rand_params():
+ def fix_scale_to_max_scale(scale_n, scale_d, max_scale):
+ scale = scale_n / scale_d
+ if scale > max_scale:
+ factor = scale / max_scale
+ new_scale_d = math.ceil(scale_d * factor)
+ assert scale_n / new_scale_d <= max_scale
+ scale_d = new_scale_d
+ return scale_d
+
# Scale
scale_y_n = testGen.randInt(low=1, high=(1 << 11))
scale_x_n = testGen.randInt(low=1, high=(1 << 11))
@@ -1912,6 +1921,13 @@ class TosaArgGen:
scale_y_d = testGen.randInt(low=1, high=(16 * scale_y_n))
scale_x_d = testGen.randInt(low=1, high=(16 * scale_x_n))
+ scale_y_d = fix_scale_to_max_scale(
+ scale_y_n, scale_y_d, testGen.TOSA_8K_LEVEL_MAX_SCALE
+ )
+ scale_x_d = fix_scale_to_max_scale(
+ scale_x_n, scale_x_d, testGen.TOSA_8K_LEVEL_MAX_SCALE
+ )
+
# Offsets and border within the scale
offset_y = testGen.randInt(low=-scale_y_n, high=(16 * scale_y_n))
offset_x = testGen.randInt(low=-scale_x_n, high=(16 * scale_x_n))
@@ -1923,6 +1939,29 @@ class TosaArgGen:
border = (border_y, border_x)
return scale, offset, border
+ def get_level_8k_params():
+ # Create 64x scale - 64/1 to 2048/32
+ scale_d = testGen.randInt(
+ low=1, high=(1 << 11) / testGen.TOSA_8K_LEVEL_MAX_SCALE
+ )
+ scale_n = scale_d * testGen.TOSA_8K_LEVEL_MAX_SCALE
+ # Create half to fifth scaling
+ scale_d_alt = testGen.randInt(low=2, high=6)
+ scale_n_alt = 1
+ switch = testGen.rng.choice((False, True))
+ if switch:
+ scale = (scale_n_alt, scale_d_alt, scale_n, scale_d)
+ else:
+ scale = (scale_n, scale_d, scale_n_alt, scale_d_alt)
+
+ offset_y = testGen.rng.choice((-scale[0], 0, (16 * scale[0]) - 1))
+ offset_x = testGen.rng.choice((-scale[2], 0, (16 * scale[2]) - 1))
+ offset = (offset_y, offset_x)
+ border_y = testGen.rng.choice((-16 * scale[0], 0, scale[0] - 1))
+ border_x = testGen.rng.choice((-16 * scale[2], 0, scale[2] - 1))
+ border = (border_y, border_x)
+ return scale, offset, border
+
for mode in [ResizeMode.NEAREST, ResizeMode.BILINEAR]:
# Exclude illegal {mode, type} configurations. Pick legal output types
if mode == ResizeMode.NEAREST and dtype == DType.INT8:
@@ -1952,14 +1991,17 @@ class TosaArgGen:
perm = 0
while perm < testGen.args.num_rand_permutations:
# Random choice of type of params we are testing
- _rnd_param_fn = testGen.rng.choice(
- (
- get_rand_params,
- get_upscale_downscale_params,
- get_aspect_ratio_resize_params,
+ if not testGen.args.level8k:
+ _rnd_param_fn = testGen.rng.choice(
+ (
+ get_rand_params,
+ get_upscale_downscale_params,
+ get_aspect_ratio_resize_params,
+ )
)
- )
- scale, offset, border = _rnd_param_fn()
+ scale, offset, border = _rnd_param_fn()
+ else:
+ scale, offset, border = get_level_8k_params()
# Expand params for bounds-checking
(scale_y_n, scale_y_d, scale_x_n, scale_x_d) = scale
@@ -1974,18 +2016,31 @@ class TosaArgGen:
(ifm_shape[2] - 1) * scale_x_n - offset_x + border_x
)
if error_name == ErrorIf.ResizeOutputShapeNonInteger:
+ # Look for non-integer test
if (
partial_output_y % scale_y_d == 0
and partial_output_x % scale_x_d == 0
):
# Skip this test as it doesn't produce NonInteger output
- perm += 1
+ if perm > 0:
+ perm += 1
continue
else:
+ # Alter the scaling factors to make the output integer
while partial_output_y % scale_y_d != 0:
scale_y_d -= 1
while partial_output_x % scale_x_d != 0:
scale_x_d -= 1
+ # Make sure we are still within max scaling
+ if (
+ scale_y_n / scale_y_d
+ ) > testGen.TOSA_8K_LEVEL_MAX_SCALE or (
+ scale_x_n / scale_x_d
+ ) > testGen.TOSA_8K_LEVEL_MAX_SCALE:
+ # Skip the test as it is using too large a scaling factor
+ if perm > 0:
+ perm += 1
+ continue
output_y = partial_output_y // scale_y_d + 1
output_x = partial_output_x // scale_x_d + 1
@@ -1996,7 +2051,8 @@ class TosaArgGen:
) and error_name is None:
# Skip positive test if output dim will be too high
# Avoid high test latency and OOM issues
- perm += 1
+ if not testGen.args.level8k or perm > 0:
+ perm += 1
continue
if (
diff --git a/verif/generator/tosa_test_gen.py b/verif/generator/tosa_test_gen.py
index c816c6b..5d3984c 100644
--- a/verif/generator/tosa_test_gen.py
+++ b/verif/generator/tosa_test_gen.py
@@ -27,6 +27,7 @@ class TosaTestGen:
# Maximum rank of tensor supported by test generator.
# This currently matches the 8K level defined in the specification.
TOSA_TENSOR_MAX_RANK = 6
+ TOSA_8K_LEVEL_MAX_SCALE = 64
def __init__(self, args):
self.args = args
diff --git a/verif/generator/tosa_verif_build_tests.py b/verif/generator/tosa_verif_build_tests.py
index 68e44da..4d12bb0 100644
--- a/verif/generator/tosa_verif_build_tests.py
+++ b/verif/generator/tosa_verif_build_tests.py
@@ -233,6 +233,13 @@ def parseArgs(argv):
help="output const tensors as numpy files for inspection",
)
+ parser.add_argument(
+ "--level-8k-sizes",
+ dest="level8k",
+ action="store_true",
+ help="create level 8k size tests (RESIZE)",
+ )
+
args = parser.parse_args(argv)
return args