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:
Ivan Tikhonov authored and GitHub committed 2021-06-07 15:13:41 +03:00
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 {}
+14 -3
View File
@@ -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)