LowLatency v2 ngraph transformation (#5160)
* LowLatency 2.0: transformation and unit tests * low latency 2.0: unit tests * documentation and ngraph codestyle * update CNN Interface of LowLatency transformation * fix build on Windows * fix build on Windows * investigation of a failed build on Win OS * ngraph codestyle * fix build (werrors) * New unit tests, refactoring * update functional tests for Memory * update LowLatency functional tests * extend Memory tests to cover LowLatency v2 transformation * clean up, code style * fix unit tests * update and fix unit tests, add feature to apply LLTv2 after LLTv1 * update docs, refactoring * add several gna tests to skip config * fix python api tests * update python api, rename LowLatency_v2 to LowLatency2 * deprecate LowLatency v1 * Deprecate LowLatency v1 in IE * fix wrong merge, codestyle * resolve review comments * fix python test * update skip config * apply online review notes, fix unit tests * clean up, code style * fix docs * Use debug_messages instead of exceptions in llt v2 * fix unit tests * Resolve review remarks
This commit is contained in:
1 parent
f9b27c3714
commit
c1608628d4
33 files changed
+1811
-432
No files matched your search
@@ -11,7 +11,7 @@ def get_available_transformations():
|
||||
try:
|
||||
from openvino.offline_transformations import ApplyLowLatencyTransformation # pylint: disable=import-error,no-name-in-module
|
||||
return {
|
||||
'LowLatency': ApplyLowLatencyTransformation,
|
||||
'LowLatency2': ApplyLowLatencyTransformation,
|
||||
}
|
||||
except Exception as e:
|
||||
return {}
|
||||
|
||||
@@ -8,6 +8,7 @@ import os
|
||||
import re
|
||||
from collections import OrderedDict
|
||||
from itertools import zip_longest
|
||||
from distutils.util import strtobool
|
||||
|
||||
import numpy as np
|
||||
|
||||
@@ -257,9 +258,9 @@ def get_common_cli_parser(parser: argparse.ArgumentParser = None):
|
||||
help='Apply additional transformations. ' +
|
||||
'Usage: "--transform transformation_name1[args],transformation_name2..." ' +
|
||||
'where [args] is key=value pairs separated by semicolon. ' +
|
||||
'Examples: "--transform LowLatency" or ' +
|
||||
' "--transform LowLatency[num_iterations=2]" ' +
|
||||
'Available transformations: "LowLatency"',
|
||||
'Examples: "--transform LowLatency2" or ' +
|
||||
' "--transform LowLatency2[use_const_initializer=False]" ' +
|
||||
'Available transformations: "LowLatency2"',
|
||||
default="")
|
||||
common_group.add_argument('--disable_fusing',
|
||||
help='Turn off fusing of linear operations to Convolution',
|
||||
@@ -1151,6 +1152,14 @@ def isfloat(value):
|
||||
return False
|
||||
|
||||
|
||||
def isbool(value):
|
||||
try:
|
||||
strtobool(value)
|
||||
return True
|
||||
except ValueError:
|
||||
return False
|
||||
|
||||
|
||||
def convert_string_to_real_type(value: str):
|
||||
values = value.split(',')
|
||||
for i in range(len(values)):
|
||||
@@ -1159,6 +1168,8 @@ def convert_string_to_real_type(value: str):
|
||||
values[i] = int(value)
|
||||
elif isfloat(value):
|
||||
values[i] = float(value)
|
||||
elif isbool(value):
|
||||
values[i] = strtobool(value)
|
||||
|
||||
return values[0] if len(values) == 1 else values
|
||||
|
||||
|
||||
@@ -905,64 +905,65 @@ class TransformChecker(unittest.TestCase):
|
||||
self.assertEqual(parse_transform(""), [])
|
||||
|
||||
def test_single_pass(self):
|
||||
self.assertEqual(parse_transform("LowLatency"), [("LowLatency", {})])
|
||||
self.assertEqual(parse_transform("LowLatency2"), [("LowLatency2", {})])
|
||||
|
||||
def test_single_pass_with_args(self):
|
||||
self.assertEqual(parse_transform("LowLatency[num_iterations=2]"),
|
||||
[("LowLatency", {"num_iterations": 2})])
|
||||
self.assertEqual(parse_transform("LowLatency2[use_const_initializer=True]"),
|
||||
[("LowLatency2", {"use_const_initializer": True})])
|
||||
|
||||
def test_single_pass_with_multiple_args(self):
|
||||
self.assertEqual(parse_transform("LowLatency[num_iterations=2;dummy_attr=3.14]"),
|
||||
[("LowLatency", {"num_iterations": 2, "dummy_attr": 3.14})])
|
||||
self.assertEqual(parse_transform("LowLatency2[use_const_initializer=True;dummy_attr=3.14]"),
|
||||
[("LowLatency2", {"use_const_initializer": True, "dummy_attr": 3.14})])
|
||||
|
||||
def test_multiple_passes_with_args(self):
|
||||
self.assertEqual(parse_transform("LowLatency[num_iterations=2],DummyPass[type=ReLU]"),
|
||||
[("LowLatency", {"num_iterations": 2}),
|
||||
self.assertEqual(parse_transform("LowLatency2[use_const_initializer=True],DummyPass[type=ReLU]"),
|
||||
[("LowLatency2", {"use_const_initializer": True}),
|
||||
("DummyPass", {"type": "ReLU"})])
|
||||
|
||||
def test_multiple_passes_with_args2(self):
|
||||
self.assertEqual(parse_transform("LowLatency[num_iterations=2,3,4.15],DummyPass1,DummyPass2[types=ReLU,PReLU;values=1,2,3]"),
|
||||
[("LowLatency", {"num_iterations": [2,3,4.15]}),
|
||||
self.assertEqual(parse_transform("LowLatency2[use_const_initializer=True,False],DummyPass1,"
|
||||
"DummyPass2[types=ReLU,PReLU;values=1,2,3]"),
|
||||
[("LowLatency2", {"use_const_initializer": [True, False]}),
|
||||
("DummyPass1", {}),
|
||||
("DummyPass2", {"types": ["ReLU", "PReLU"], "values": [1,2,3]})])
|
||||
|
||||
def test_multiple_passes_no_args(self):
|
||||
self.assertEqual(parse_transform("DummyPass,LowLatency2"),
|
||||
[("DummyPass", {}), ("LowLatency2", {})])
|
||||
self.assertEqual(parse_transform("DummyPass,LowLatency22"),
|
||||
[("DummyPass", {}), ("LowLatency22", {})])
|
||||
|
||||
def test_single_pass_neg(self):
|
||||
self.assertRaises(Error, parse_transform, "LowLatency!")
|
||||
self.assertRaises(Error, parse_transform, "LowLatency2!")
|
||||
|
||||
def test_multiple_passes_neg(self):
|
||||
self.assertRaises(Error, parse_transform, "LowLatency;DummyPass")
|
||||
self.assertRaises(Error, parse_transform, "LowLatency2;DummyPass")
|
||||
|
||||
def test_single_pass_with_args_neg1(self):
|
||||
self.assertRaises(Error, parse_transform, "LowLatency[=2]")
|
||||
self.assertRaises(Error, parse_transform, "LowLatency2[=2]")
|
||||
|
||||
def test_single_pass_with_args_neg2(self):
|
||||
self.assertRaises(Error, parse_transform, "LowLatency[key=]")
|
||||
self.assertRaises(Error, parse_transform, "LowLatency2[key=]")
|
||||
|
||||
def test_single_pass_with_args_neg3(self):
|
||||
self.assertRaises(Error, parse_transform, "LowLatency[]")
|
||||
self.assertRaises(Error, parse_transform, "LowLatency2[]")
|
||||
|
||||
def test_single_pass_with_args_neg4(self):
|
||||
self.assertRaises(Error, parse_transform, "LowLatency[key=value;]")
|
||||
self.assertRaises(Error, parse_transform, "LowLatency2[key=value;]")
|
||||
|
||||
def test_single_pass_with_args_neg5(self):
|
||||
self.assertRaises(Error, parse_transform, "LowLatency[value]")
|
||||
self.assertRaises(Error, parse_transform, "LowLatency2[value]")
|
||||
|
||||
def test_single_pass_with_args_neg6(self):
|
||||
self.assertRaises(Error, parse_transform, "LowLatency[key=value")
|
||||
self.assertRaises(Error, parse_transform, "LowLatency2[key=value")
|
||||
|
||||
@patch("mo.back.offline_transformations.get_available_transformations")
|
||||
def test_check_low_latency_is_available(self, available_transformations):
|
||||
available_transformations.return_value = {"LowLatency": None}
|
||||
available_transformations.return_value = {"LowLatency2": None}
|
||||
try:
|
||||
check_available_transforms([("LowLatency" ,"")], True)
|
||||
check_available_transforms([("LowLatency2", "")], True)
|
||||
except Error as e:
|
||||
self.assertTrue(False, "Exception \"{}\" is unexpected".format(e))
|
||||
|
||||
@patch("mo.back.offline_transformations.get_available_transformations")
|
||||
def test_check_dummy_pass_is_available(self, available_transformations):
|
||||
available_transformations.return_value = {"LowLatency": None}
|
||||
available_transformations.return_value = {"LowLatency2": None}
|
||||
self.assertRaises(Error, check_available_transforms, [("DummyPass", "")], True)
|
||||
Reference in new issue
Block a user