Skip to content

Commit ab64489

Browse files
authored
Implement performance tests in nightly validation to compare read_model and ovc.convert with OVVP output (openvinotoolkit#23303)
### Details: - add nightly performance tests with skip list - [restored PR](openvinotoolkit#21353) - [restored PR #2](openvinotoolkit#22325) - added OVVP support - extend skip list with the models that have unstable results ### Tickets: - 126282
1 parent 91d3d8a commit ab64489

File tree

6 files changed

+391
-27
lines changed

6 files changed

+391
-27
lines changed

tests/model_hub_tests/models_hub_common/constants.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,11 +10,13 @@
1010
loading and heating and includes measurement only one of 2 models - got through convert and read_model.
1111
Both "converted" and "read_model" modes will be 2 * runtime_measure_duration
1212
'''
13-
runtime_measure_duration = os.environ.get('RUNTIME_MEASURE_DURATION', '60')
13+
precommit_runtime_measure_duration = os.environ.get('PRECOMMIT_RUNTIME_MEASURE_DURATION', '60')
14+
nightly_runtime_measure_duration = os.environ.get('NIGHTLY_RUNTIME_MEASURE_DURATION', '15')
1415
'''
1516
@brief Time in seconds of heating before measurement
1617
'''
17-
runtime_heat_duration = os.environ.get('RUNTIME_HEAT_DURATION', '5')
18+
precommit_runtime_heat_duration = os.environ.get('PRECOMMIT_RUNTIME_HEAT_DURATION', '5')
19+
nigtly_runtime_heat_duration = os.environ.get('NIGHTLY_RUNTIME_HEAT_DURATION', '5')
1820

1921
tf_hub_cache_dir = os.environ.get('TFHUB_CACHE_DIR',
2022
os.path.join(tempfile.gettempdir(), "tfhub_modules"))

tests/model_hub_tests/models_hub_common/test_performance_model.py

Lines changed: 18 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,9 @@ def __init__(self):
6161
self.infer_time_ratio = 0.0
6262
self.error_message = ''
6363
self.status = None
64+
self.model_name = ''
65+
self.model_link = ''
66+
self.ie_device = ''
6467

6568

6669
class TestModelPerformance:
@@ -120,14 +123,12 @@ def get_read_model(self, model_path: str):
120123
core = ov.Core()
121124
return core.read_model(model=model_path)
122125

123-
def heat_hardware(self, ov_model, inputs) -> None:
124-
_, heat_n_repeats, _ = utils.measure(utils.nano_secs(const.runtime_heat_duration), ov_model, (inputs,))
126+
def heat_hardware(self, ov_model, inputs, conf) -> None:
127+
_, heat_n_repeats, _ = utils.measure(conf.runtime_heat_duration, ov_model, (inputs,))
125128
print('heat done in {} repeats'.format(heat_n_repeats))
126129

127-
def measure_inference(self, ov_model, inputs) -> ModelResults:
128-
time_slices, infer_n_repeats, real_runtime = utils.measure(utils.nano_secs(const.runtime_measure_duration),
129-
ov_model,
130-
(inputs,))
130+
def measure_inference(self, ov_model, inputs, conf) -> ModelResults:
131+
time_slices, infer_n_repeats, real_runtime = utils.measure(conf.runtime_measure_duration, ov_model, (inputs,))
131132
print('measurement done in {} repeats'.format(infer_n_repeats))
132133
infer_throughput = float(infer_n_repeats * (10 ** 9)) / real_runtime
133134
infer_mean_time_ns = np.mean(time_slices)
@@ -141,16 +142,19 @@ def measure_inference(self, ov_model, inputs) -> ModelResults:
141142
results.infer_variance = infer_variance
142143
return results
143144

144-
def infer_model(self, ov_model, inputs) -> ModelResults:
145-
self.heat_hardware(ov_model, inputs)
146-
return self.measure_inference(ov_model, inputs)
145+
def infer_model(self, ov_model, inputs, conf) -> ModelResults:
146+
self.heat_hardware(ov_model, inputs, conf)
147+
return self.measure_inference(ov_model, inputs, conf)
147148

148149
def compile_model(self, model, ie_device):
149150
core = ov.Core()
150151
return core.compile_model(model, ie_device)
151152

152-
def __run(self, model_name, model_link, ie_device):
153+
def __run(self, model_name, model_link, ie_device, conf):
153154
results = Results()
155+
results.model_name = model_name
156+
results.model_link = model_link
157+
results.ie_device = ie_device
154158
results.status = None
155159
try:
156160
results.status = Status.LOAD_MODEL
@@ -168,11 +172,11 @@ def __run(self, model_name, model_link, ie_device):
168172
results.status = Status.INFER_CONVERTED_MODEL
169173
results.converted_model_results = utils.call_with_timer('Infer converted model',
170174
self.infer_model,
171-
(converted_model, inputs))
175+
(converted_model, inputs, conf))
172176
results.status = Status.INFER_READ_MODEL
173177
results.read_model_results = utils.call_with_timer('Infer read model',
174178
self.infer_model,
175-
(read_model, inputs))
179+
(read_model, inputs, conf))
176180

177181
infer_time_ratio = (results.converted_model_results.infer_mean_time /
178182
results.read_model_results.infer_mean_time)
@@ -196,10 +200,10 @@ def __run(self, model_name, model_link, ie_device):
196200
ex_type=ex_type.__name__, ex_value=ex_value)
197201
return results
198202

199-
def run(self, model_name, model_link, ie_device):
203+
def run(self, model_name, model_link, ie_device, conf):
200204
self.result = Results()
201205
t0 = time.time()
202-
self.result = multiprocessing_run(self.__run, [model_name, model_link, ie_device], model_name,
206+
self.result = multiprocessing_run(self.__run, [model_name, model_link, ie_device, conf], model_name,
203207
self.infer_timeout)
204208
t1 = time.time()
205209
utils.print_stat('test run time {} secs', (t1 - t0))

tests/model_hub_tests/models_hub_common/utils.py

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,28 @@ def get_models_list(file_name: str):
3232
return models
3333

3434

35+
def get_skipped_model_links(filename: str):
36+
links = set()
37+
if not os.path.exists(filename):
38+
return links
39+
with open(filename) as f:
40+
for model_info in f:
41+
model_info = model_info.strip()
42+
model_name, model_link = model_info.split(',')
43+
links.add(model_link)
44+
return links
45+
46+
47+
def get_models_list_not_skipped(model_list_file: str, skip_list_file: str):
48+
skipped_links = get_skipped_model_links(skip_list_file)
49+
not_skipped_models = []
50+
for model_name, model_link, mark, reason in get_models_list(model_list_file):
51+
if model_link in skipped_links:
52+
continue
53+
not_skipped_models.append((model_name, model_link, mark, reason))
54+
return not_skipped_models
55+
56+
3557
def compare_two_tensors(ov_res, fw_res, eps):
3658
is_ok = True
3759
if not np.allclose(ov_res, fw_res, atol=eps, rtol=eps, equal_nan=True):

tests/model_hub_tests/performance_tests/conftest.py

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,39 @@
77
from models_hub_common.utils import get_params
88
from py.xml import html
99
from models_hub_common.utils import round_num
10+
import json
11+
import requests
12+
13+
14+
def pytest_sessionstart(session):
15+
print('pytest_sessionstart')
16+
session.results = []
17+
18+
19+
def pytest_sessionfinish(session, exitstatus):
20+
print('pytest_sessionfinish')
21+
dump_data = []
22+
for item in session.results:
23+
dump_item = dict()
24+
dump_item['version'] = '1'
25+
dump_item['status'] = str(item.status)
26+
dump_item['ie_device'] = item.ie_device
27+
dump_item['model_name'] = item.model_name
28+
dump_item['model_link'] = item.model_link
29+
dump_item['time_infer_conv'] = str(item.converted_model_results.infer_mean_time)
30+
dump_item['time_infer_read'] = str(item.read_model_results.infer_mean_time)
31+
dump_item['infer_time_ratio'] = str(item.infer_time_ratio)
32+
dump_data.append(dump_item)
33+
data = json.dumps(dump_data)
34+
url = 'https://openvino-validation-portal.toolbox.iotg.sclab.intel.com/api/v1/Seeder_Tf_Hub_Compile_Read/seed'
35+
headers = {
36+
'accept': 'application/json',
37+
'Content-Type': 'application/json'
38+
}
39+
try:
40+
requests.post(url, headers=headers, data=data)
41+
except:
42+
print('error while sending data to OVVP')
1043

1144

1245
def pytest_generate_tests(metafunc):
@@ -22,6 +55,8 @@ def pytest_runtest_makereport(item, call):
2255
if getattr(item.obj.__self__, 'result', None) is not None:
2356
results = item.obj.__self__.result
2457
report._results = results
58+
if report.when == 'call':
59+
item.session.results.append(results)
2560

2661

2762
@pytest.mark.optionalhook

0 commit comments

Comments
 (0)