Skip to content

Commit ac8c2fe

Browse files
Introduce FrameworkAdapter (#2844)
* Add inference adapter * Do not refer directly to model_executor attributes * Move Openvino interface from the demo and AsyncPipeline to Adapter, implement RemoteAdapter, add documentation to ModelAdapter Abstract class * Add the __call__ method to ModelBase class * Refactoring * Update get_input_layers(), get_output_layers(), add Metadata structure, separate the model reading from the loading * Update model wrappers for object_detection_demo, except YOLO wrappers * Update Deblurring, Monodepth demos * Update bert_named_entity_recognition, bert_question_answering demos * Move logging to OpenvinoAdapter, add class Core * Ngraph removed from YOLO * Fix * Update human_pose_estimation_demo + Openpose wrapper * Update hpe_associative_embedding wrapper, bert_question_answering_embedding demo * Fix in object_detection_demo * Delete extra EOF * Update yolo.py * Remove int2float(), add list of openvino precisions * Small fixes * Suggestions * Add ability to read network from byte buffer. * Update demos/common/python/openvino/model_zoo/model_api/adapters/openvino_adapter.py * Update demos/common/python/openvino/model_zoo/model_api/adapters/openvino_adapter.py * Remove trailing whitespaces Co-authored-by: eizamaliev <[email protected]>
1 parent 9d508f1 commit ac8c2fe

File tree

30 files changed

+823
-447
lines changed

30 files changed

+823
-447
lines changed

demos/bert_named_entity_recognition_demo/python/bert_named_entity_recognition_demo.py

Lines changed: 15 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -23,17 +23,15 @@
2323
from pathlib import Path
2424
from time import perf_counter
2525

26-
from openvino.inference_engine import IECore, get_version
27-
2826
sys.path.append(str(Path(__file__).resolve().parents[2] / 'common/python'))
2927
sys.path.append(str(Path(__file__).resolve().parents[2] / 'common/python/openvino/model_zoo'))
3028

3129
from html_reader import get_paragraphs
32-
from helpers import log_runtime_settings
3330

3431
from model_api.models import BertNamedEntityRecognition
3532
from model_api.models.tokens_bert import text_to_tokens, load_vocab_file
36-
from model_api.pipelines import get_user_config, parse_devices, AsyncPipeline
33+
from model_api.pipelines import get_user_config, AsyncPipeline
34+
from model_api.adapters import create_core, OpenvinoAdapter, RemoteAdapter
3735

3836
log.basicConfig(format='[ %(levelname)s ] %(message)s', level=log.DEBUG, stream=sys.stdout)
3937

@@ -52,6 +50,8 @@ def build_argparser():
5250
args.add_argument("-i", "--input", help="Required. URL to a page with context",
5351
action='append',
5452
required=True, type=str)
53+
args.add_argument('--adapter', help='Optional. Specify the model adapter. Default is openvino.',
54+
default='openvino', type=str, choices=('openvino', 'remote'))
5555
args.add_argument("--input_names",
5656
help="Optional. Inputs names for the network. "
5757
"Default values are \"input_ids,attention_mask,token_type_ids\" ",
@@ -105,21 +105,21 @@ def main():
105105
preprocessing_total_time = (perf_counter() - preprocessing_start_time) * 1e3
106106
source = tuple(zip(sentences, preprocessed_sentences))
107107

108-
log.info('OpenVINO Inference Engine')
109-
log.info('\tbuild: {}'.format(get_version()))
110-
ie = IECore()
111-
112-
plugin_config = get_user_config(args.device, args.num_streams, args.num_threads)
108+
if args.adapter == 'openvino':
109+
plugin_config = get_user_config(args.device, args.num_streams, args.num_threads)
110+
model_adapter = OpenvinoAdapter(create_core(), args.model, device=args.device, plugin_config=plugin_config,
111+
max_num_requests=args.num_infer_requests)
112+
elif args.adapter == 'remote':
113+
log.info('Reading model {}'.format(args.model))
114+
serving_config = {"address": "localhost", "port": 9000}
115+
model_adapter = RemoteAdapter(args.model, serving_config)
113116

114-
log.info('Reading model {}'.format(args.model))
115-
model = BertNamedEntityRecognition(ie, args.model, vocab, args.input_names)
117+
model = BertNamedEntityRecognition(model_adapter, vocab, args.input_names)
116118
if max_sentence_length > model.max_length:
117119
model.reshape(max_sentence_length)
120+
model.log_layers_info()
118121

119-
pipeline = AsyncPipeline(ie, model, plugin_config,
120-
device=args.device, max_num_requests=args.num_infer_requests)
121-
log.info('The model {} is loaded to {}'.format(args.model, args.device))
122-
log_runtime_settings(pipeline.exec_net, set(parse_devices(args.device)))
122+
pipeline = AsyncPipeline(model)
123123

124124
next_sentence_id = 0
125125
next_sentence_id_to_show = 0

demos/bert_question_answering_demo/python/bert_question_answering_demo.py

Lines changed: 15 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -23,17 +23,16 @@
2323
from time import perf_counter
2424

2525
import numpy as np
26-
from openvino.inference_engine import IECore, get_version
2726

2827
sys.path.append(str(Path(__file__).resolve().parents[2] / 'common/python'))
2928
sys.path.append(str(Path(__file__).resolve().parents[2] / 'common/python/openvino/model_zoo'))
3029

3130
from html_reader import get_paragraphs
32-
from helpers import log_runtime_settings
3331

3432
from model_api.models import BertQuestionAnswering
3533
from model_api.models.tokens_bert import text_to_tokens, load_vocab_file, ContextWindow
36-
from model_api.pipelines import get_user_config, parse_devices, AsyncPipeline
34+
from model_api.pipelines import get_user_config, AsyncPipeline
35+
from model_api.adapters import create_core, OpenvinoAdapter, RemoteAdapter
3736

3837
log.basicConfig(format='[ %(levelname)s ] %(message)s', level=log.DEBUG, stream=sys.stdout)
3938

@@ -49,6 +48,8 @@ def build_argparser():
4948
args.add_argument("-i", "--input", help="Required. URL to a page with context",
5049
action='append',
5150
required=True, type=str)
51+
args.add_argument('--adapter', help='Optional. Specify the model adapter. Default is openvino.',
52+
default='openvino', type=str, choices=('openvino', 'remote'))
5253
args.add_argument("--questions", type=str, nargs='+', metavar='QUESTION', help="Optional. Prepared questions")
5354
args.add_argument("--input_names",
5455
help="Optional. Inputs names for the network. "
@@ -162,14 +163,16 @@ def main():
162163
c_tokens = text_to_tokens(context.lower(), vocab)
163164
total_latency = (perf_counter() - preprocessing_start_time) * 1e3
164165

165-
log.info('OpenVINO Inference Engine')
166-
log.info('\tbuild: {}'.format(get_version()))
167-
ie = IECore()
166+
if args.adapter == 'openvino':
167+
plugin_config = get_user_config(args.device, args.num_streams, args.num_threads)
168+
model_adapter = OpenvinoAdapter(create_core(), args.model, device=args.device, plugin_config=plugin_config,
169+
max_num_requests=args.num_infer_requests)
170+
elif args.adapter == 'remote':
171+
log.info('Reading model {}'.format(args.model))
172+
serving_config = {"address": "localhost", "port": 9000}
173+
model_adapter = RemoteAdapter(args.model, serving_config)
168174

169-
plugin_config = get_user_config(args.device, args.num_streams, args.num_threads)
170-
171-
log.info('Reading model {}'.format(args.model))
172-
model = BertQuestionAnswering(ie, args.model, vocab, args.input_names, args.output_names,
175+
model = BertQuestionAnswering(model_adapter, vocab, args.input_names, args.output_names,
173176
args.max_answer_token_num, args.model_squad_ver)
174177
if args.reshape:
175178
# find the closest multiple of 64, if it is smaller than current network's sequence length, do reshape
@@ -183,11 +186,9 @@ def main():
183186
else:
184187
log.debug("\tSkipping network reshaping,"
185188
" as (context length + max question length) exceeds the current (input) network sequence length")
189+
model.log_layers_info()
186190

187-
pipeline = AsyncPipeline(ie, model, plugin_config,
188-
device=args.device, max_num_requests=args.num_infer_requests)
189-
log.info('The model {} is loaded to {}'.format(args.model, args.device))
190-
log_runtime_settings(pipeline.exec_net, set(parse_devices(args.device)))
191+
pipeline = AsyncPipeline(model)
191192

192193
if args.questions:
193194
def questions():

demos/bert_question_answering_embedding_demo/python/bert_question_answering_embedding_demo.py

Lines changed: 14 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -23,17 +23,16 @@
2323
from time import perf_counter
2424

2525
import numpy as np
26-
from openvino.inference_engine import IECore, get_version
2726

2827
sys.path.append(str(Path(__file__).resolve().parents[2] / 'common/python'))
2928
sys.path.append(str(Path(__file__).resolve().parents[2] / 'common/python/openvino/model_zoo'))
3029

3130
from html_reader import get_paragraphs
32-
from helpers import log_runtime_settings
3331

3432
from model_api.models import BertEmbedding, BertQuestionAnswering
3533
from model_api.models.tokens_bert import text_to_tokens, load_vocab_file, ContextWindow
36-
from model_api.pipelines import get_user_config, parse_devices, AsyncPipeline
34+
from model_api.pipelines import get_user_config, AsyncPipeline
35+
from model_api.adapters import create_core, OpenvinoAdapter
3736

3837
log.basicConfig(format='[ %(levelname)s ] %(message)s', level=log.DEBUG, stream=sys.stdout)
3938

@@ -169,14 +168,12 @@ def main():
169168
visualizer = Visualizer(args.colors)
170169
total_latency = (perf_counter() - vocab_start_time) * 1e3
171170

172-
log.info('OpenVINO Inference Engine')
173-
log.info('\tbuild: {}'.format(get_version()))
174-
ie = IECore()
175-
171+
ie = create_core()
176172
plugin_config = get_user_config(args.device, args.num_streams, args.num_threads)
177-
178-
log.info('Reading Bert Embedding model {}'.format(args.model_emb))
179-
model_emb = BertEmbedding(ie, args.model_emb, vocab, args.input_names_emb)
173+
model_emb_adapter = OpenvinoAdapter(ie, args.model_emb, device=args.device, plugin_config=plugin_config,
174+
max_num_requests=args.num_infer_requests)
175+
model_emb = BertEmbedding(model_emb_adapter, vocab, args.input_names_emb)
176+
model_emb.log_layers_info()
180177

181178
# reshape BertEmbedding model to infer short questions and long contexts
182179
max_len_context = 384
@@ -185,21 +182,17 @@ def main():
185182
for new_length in [max_len_question, max_len_context]:
186183
model_emb.reshape(new_length)
187184
if new_length == max_len_question:
188-
emb_exec_net = ie.load_network(model_emb.net, args.device)
185+
emb_exec_net = ie.load_network(model_emb_adapter.net, args.device)
189186
else:
190-
emb_pipeline = AsyncPipeline(
191-
ie, model_emb, plugin_config, device=args.device, max_num_requests=args.num_infer_requests
192-
)
193-
log.info('The Bert Embedding model {} is loaded to {}'.format(args.model_emb, args.device))
194-
log_runtime_settings(emb_pipeline.exec_net, set(parse_devices(args.device)))
187+
emb_pipeline = AsyncPipeline(model_emb)
195188

196189
if args.model_qa:
197-
log.info('Reading Question Answering model {}'.format(args.model_qa))
198-
model_qa = BertQuestionAnswering(ie, args.model_qa, vocab, args.input_names_qa, args.output_names_qa,
190+
model_qa_adapter = OpenvinoAdapter(ie, args.model_qa, device=args.device, plugin_config=plugin_config,
191+
max_num_requests=args.num_infer_requests)
192+
model_qa = BertQuestionAnswering(model_qa_adapter, vocab, args.input_names_qa, args.output_names_qa,
199193
args.max_answer_token_num, args.model_qa_squad_ver)
200-
qa_pipeline = AsyncPipeline(ie, model_qa, plugin_config, device=args.device, max_num_requests=args.num_infer_requests)
201-
log_runtime_settings(qa_pipeline.exec_net, set(parse_devices(args.device)))
202-
log.info('The Question Answering model {} is loaded to {}'.format(args.model_qa, args.device))
194+
model_qa.log_layers_info()
195+
qa_pipeline = AsyncPipeline(model_qa)
203196

204197
log.info("\t\tStage 1 (Calc embeddings for the context)")
205198
contexts_all = []

demos/common/python/helpers.py

Lines changed: 0 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -26,26 +26,6 @@ def resolution(value):
2626
raise RuntimeError('Сorrect format of --output_resolution parameter is "width"x"height".')
2727
return result
2828

29-
def log_blobs_info(model):
30-
for name, layer in model.net.input_info.items():
31-
log.info('\tInput blob: {}, shape: {}, precision: {}'.format(name, layer.input_data.shape, layer.precision))
32-
for name, layer in model.net.outputs.items():
33-
log.info('\tOutput blob: {}, shape: {}, precision: {}'.format(name, layer.shape, layer.precision))
34-
35-
def log_runtime_settings(exec_net, devices):
36-
if 'AUTO' not in devices:
37-
for device in devices:
38-
try:
39-
nstreams = exec_net.get_config(device + '_THROUGHPUT_STREAMS')
40-
log.info('\tDevice: {}'.format(device))
41-
log.info('\t\tNumber of streams: {}'.format(nstreams))
42-
if device == 'CPU':
43-
nthreads = exec_net.get_config('CPU_THREADS_NUM')
44-
log.info('\t\tNumber of threads: {}'.format(nthreads if int(nthreads) else 'AUTO'))
45-
except RuntimeError:
46-
pass
47-
log.info('\tNumber of network infer requests: {}'.format(len(exec_net.requests)))
48-
4929
def log_latency_per_stage(*pipeline_metrics):
5030
stages = ('Decoding', 'Preprocessing', 'Inference', 'Postprocessing', 'Rendering')
5131
for stage, latency in zip(stages, pipeline_metrics):
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
"""
2+
Copyright (C) 2021 Intel Corporation
3+
4+
Licensed under the Apache License, Version 2.0 (the "License");
5+
you may not use this file except in compliance with the License.
6+
You may obtain a copy of the License at
7+
8+
http://www.apache.org/licenses/LICENSE-2.0
9+
10+
Unless required by applicable law or agreed to in writing, software
11+
distributed under the License is distributed on an "AS IS" BASIS,
12+
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
See the License for the specific language governing permissions and
14+
limitations under the License.
15+
"""
16+
17+
18+
from .openvino_adapter import create_core, OpenvinoAdapter
19+
from .remote_adapter import RemoteAdapter
20+
21+
__all__ = [
22+
'create_core',
23+
'OpenvinoAdapter',
24+
'RemoteAdapter',
25+
]

0 commit comments

Comments
 (0)