diff options
author | Jeremy Johnson <jeremy.johnson@arm.com> | 2022-09-15 10:38:17 +0100 |
---|---|---|
committer | Eric Kunze <eric.kunze@arm.com> | 2022-11-19 00:42:57 +0000 |
commit | e4b08ffbe457c8932740e3171964cf2e7cd69b4f (patch) | |
tree | eaa7a48d1de8e1819398c63110e99f993c0aa847 /verif/generator | |
parent | 52460a8b21e3691cd56b22e62986fa24012b8e68 (diff) | |
download | reference_model-e4b08ffbe457c8932740e3171964cf2e7cd69b4f.tar.gz |
Initial set up of Main Inference conformance test gen
tosa-verif-build-tests
- option for setting FP values range
- option for recursively finding tests
- change from os.path to Path
tosa_verif_result_check
- option to supply FP tolerance
- output difference and max tolerance on contents mismatch
- change from os.path to Path
MI conformance - contains examples of AVG_POOL2D and CONV2D tests
Signed-off-by: Jeremy Johnson <jeremy.johnson@arm.com>
Change-Id: I8e1645cd8f10308604400ea53eef723ca163eed7
Diffstat (limited to 'verif/generator')
-rw-r--r-- | verif/generator/tosa_test_gen.py | 34 | ||||
-rw-r--r-- | verif/generator/tosa_verif_build_tests.py | 38 |
2 files changed, 62 insertions, 10 deletions
diff --git a/verif/generator/tosa_test_gen.py b/verif/generator/tosa_test_gen.py index 95e06ed..f3ca512 100644 --- a/verif/generator/tosa_test_gen.py +++ b/verif/generator/tosa_test_gen.py @@ -36,6 +36,9 @@ class TosaTestGen: self.quantGen = TosaQuantGen() # Force makeShape to do a specific starting shape self.targetted_shape = None + # Work out floating point range + self.random_fp_low = min(args.tensor_fp_value_range) + self.random_fp_high = max(args.tensor_fp_value_range) def createSerializer(self, opName, testPath): self.testPath = os.path.join(opName, testPath) @@ -84,13 +87,25 @@ class TosaTestGen: self.rng.integers(low=-(1 << 47), high=(1 << 47), size=shape) ) elif dtype == DType.FP16: - return np.float16(self.rng.random(size=shape)) + return np.float16( + self.rng.uniform( + low=self.random_fp_low, high=self.random_fp_high, size=shape + ) + ) elif dtype == DType.BF16: - f32_tensor = np.float32(self.rng.random(size=shape)) + f32_tensor = np.float32( + self.rng.uniform( + low=self.random_fp_low, high=self.random_fp_high, size=shape + ) + ) # Floor the last 16 bits of each f32 value return np.float32(vect_f32_to_bf16(f32_tensor)) elif dtype == DType.FP32: - return np.float32(self.rng.random(size=shape)) + return np.float32( + self.rng.uniform( + low=self.random_fp_low, high=self.random_fp_high, size=shape + ) + ) else: raise Exception("Unrecognized Dtype: {}".format(dtype)) @@ -135,12 +150,17 @@ class TosaTestGen: def getRandNumberDType(self, dtype): if dtype == DType.FP32: - return self.rng.random() + return np.float32( + self.rng.uniform(low=self.random_fp_low, high=self.random_fp_high) + ) elif dtype == DType.FP16: - rand_f32 = self.rng.random() - return np.float16(rand_f32) + return np.float16( + self.rng.uniform(low=self.random_fp_low, high=self.random_fp_high) + ) elif dtype == DType.BF16: - rand_f32 = self.rng.random() + rand_f32 = np.float32( + self.rng.uniform(low=self.random_fp_low, high=self.random_fp_high) + ) return vect_f32_to_bf16(rand_f32) elif dtype == DType.BOOL: return self.rng.choice([False, True]) diff --git a/verif/generator/tosa_verif_build_tests.py b/verif/generator/tosa_verif_build_tests.py index ab78b1a..bc1ec8e 100644 --- a/verif/generator/tosa_verif_build_tests.py +++ b/verif/generator/tosa_verif_build_tests.py @@ -2,20 +2,24 @@ # SPDX-License-Identifier: Apache-2.0 import argparse import re +import sys from generator.tosa_test_gen import TosaTestGen from serializer.tosa_serializer import dtype_str_to_val from serializer.tosa_serializer import DTypeNames +OPTION_FP_VALUES_RANGE = "--fp-values-range" + # Used for parsing a comma-separated list of integers in a string # to an actual list of integers -def str_to_list(in_s): +def str_to_list(in_s, is_float=False): """Converts a comma-separated list of string integers to a python list of ints""" lst = in_s.split(",") out_list = [] for i in lst: - out_list.append(int(i)) + val = float(i) if is_float else int(i) + out_list.append(val) return out_list @@ -25,6 +29,26 @@ def auto_int(x): def parseArgs(argv): + """Parse the command line arguments.""" + if argv is None: + argv = sys.argv[1:] + + if OPTION_FP_VALUES_RANGE in argv: + # Argparse fix for hyphen (minus values) in argument values + # convert "ARG VAL" into "ARG=VAL" + # Example --fp-values-range -2.0,2.0 -> --fp-values-range=-2.0,2.0 + new_argv = [] + idx = 0 + while idx < len(argv): + arg = argv[idx] + if arg == OPTION_FP_VALUES_RANGE and idx + 1 < len(argv): + val = argv[idx + 1] + if val.startswith("-"): + arg = f"{arg}={val}" + idx += 1 + new_argv.append(arg) + idx += 1 + argv = new_argv parser = argparse.ArgumentParser() parser.add_argument( @@ -61,6 +85,14 @@ def parseArgs(argv): ) parser.add_argument( + OPTION_FP_VALUES_RANGE, + dest="tensor_fp_value_range", + default="0.0,1.0", + type=lambda x: str_to_list(x, is_float=True), + help="Min,Max range of floating point tensor values", + ) + + parser.add_argument( "--max-batch-size", dest="max_batch_size", default=1, @@ -132,7 +164,7 @@ def parseArgs(argv): help="Upper limit on width and height output dimensions for `resize` op. Default: 1000", ) - # Targetting a specific shape/rank/dtype + # Targeting a specific shape/rank/dtype parser.add_argument( "--target-shape", dest="target_shapes", |