ie_plugin_config.hpp
Go to the documentation of this file.
1 // Copyright (C) 2018-2019 Intel Corporation
2 // SPDX-License-Identifier: Apache-2.0
3 //
4 
5 /**
6  * @brief a header for advanced hardware related properties for IE plugins
7  * To use in SetConfig() method of plugins
8  * LoadNetwork() method overloads that accept config as parameter
9  *
10  * @file ie_plugin_config.hpp
11  */
12 #pragma once
13 
14 #include <string>
15 #include <tuple>
16 #include <vector>
17 
18 namespace InferenceEngine {
19 
20 /**
21  * @brief %Metrics
22  */
23 namespace Metrics {
24 
25 #ifndef DECLARE_METRIC_KEY_IMPL
26 #define DECLARE_METRIC_KEY_IMPL(...)
27 #endif
28 
29 /**
30  * @def METRIC_KEY(name)
31  * @brief shortcut for defining common Inference Engine metrics
32  */
33 #define METRIC_KEY(name) InferenceEngine::Metrics::METRIC_##name
34 
35 /**
36  * @def EXEC_NETWORK_METRIC_KEY(name)
37  * @brief shortcut for defining common Inference Engine ExecutableNetwork metrics
38  */
39 #define EXEC_NETWORK_METRIC_KEY(name) METRIC_KEY(name)
40 
41 #define DECLARE_METRIC_KEY(name, ...) \
42  static constexpr auto METRIC_##name = #name; \
43  DECLARE_METRIC_KEY_IMPL(name, __VA_ARGS__)
44 
45 #define DECLARE_EXEC_NETWORK_METRIC_KEY(name, ...) DECLARE_METRIC_KEY(name, __VA_ARGS__)
46 
47 /**
48  * @def METRIC_VALUE(name)
49  * @brief shortcut for defining metric values
50  */
51 #define METRIC_VALUE(name) InferenceEngine::Metrics::name
52 #define DECLARE_METRIC_VALUE(name) static constexpr auto name = #name
53 
54 /**
55  * @brief Metric to get a std::vector<std::string> of available device IDs. String value is "AVAILABLE_DEVICES"
56  */
57 DECLARE_METRIC_KEY(AVAILABLE_DEVICES, std::vector<std::string>);
58 
59 /**
60  * @brief Metric to get a std::vector<std::string> of supported metrics. String value is "SUPPORTED_METRICS"
61  * This can be used as an executable network metric as well.
62  *
63  * Each of the returned device metrics can be passed to Core::GetMetric, executable network metrics
64  * can be passed to ExecutableNetwork::GetMetric.
65  *
66  */
67 DECLARE_METRIC_KEY(SUPPORTED_METRICS, std::vector<std::string>);
68 
69 /**
70  * @brief Metric to get a std::vector<std::string> of supported config keys. String value is "SUPPORTED_CONFIG_KEYS"
71  * This can be used as an executable network metric as well.
72  *
73  * Each of the returned device configuration keys can be passed to Core::SetConfig, Core::GetConfig, and
74  * Core::LoadNetwork, configuration keys for executable networks can be passed to ExecutableNetwork::SetConfig and
75  * ExecutableNetwork::GetConfig.
76  *
77  */
78 DECLARE_METRIC_KEY(SUPPORTED_CONFIG_KEYS, std::vector<std::string>);
79 
80 /**
81  * @brief Metric to get a std::string value representing a full device name. String value is "FULL_DEVICE_NAME"
82  */
83 DECLARE_METRIC_KEY(FULL_DEVICE_NAME, std::string);
84 
85 /**
86  * @brief Metric to get a std::vector<std::string> of optimization options per device. String value is
87  * "OPTIMIZATION_CAPABILITIES" The possible values:
88  * - "FP32" - device can support FP32 models
89  * - "FP16" - device can support FP16 models
90  * - "INT8" - device can support models with INT8 layers
91  * - "BIN" - device can support models with BIN layers
92  * - "WINOGRAD" - device can support models where convolution implemented via Winograd transformations
93  */
94 DECLARE_METRIC_KEY(OPTIMIZATION_CAPABILITIES, std::vector<std::string>);
95 
96 DECLARE_METRIC_VALUE(FP32);
97 DECLARE_METRIC_VALUE(FP16);
98 DECLARE_METRIC_VALUE(INT8);
99 DECLARE_METRIC_VALUE(BIN);
100 DECLARE_METRIC_VALUE(WINOGRAD);
101 
102 /**
103  * @brief Metric to provide information about a range for streams on platforms where streams are supported.
104  * Metric returns a value of std::tuple<unsigned int, unsigned int> type, where:
105  * - First value is bottom bound.
106  * - Second value is upper bound.
107  * String value for metric name is "RANGE_FOR_STREAMS".
108  */
109 DECLARE_METRIC_KEY(RANGE_FOR_STREAMS, std::tuple<unsigned int, unsigned int>);
110 
111 /**
112  * @brief Metric to provide a hint for a range for number of async infer requests. If device supports streams,
113  * the metric provides range for number of IRs per stream.
114  * Metric returns a value of std::tuple<unsigned int, unsigned int, unsigned int> type, where:
115  * - First value is bottom bound.
116  * - Second value is upper bound.
117  * - Third value is step inside this range.
118  * String value for metric name is "RANGE_FOR_ASYNC_INFER_REQUESTS".
119  */
120 DECLARE_METRIC_KEY(RANGE_FOR_ASYNC_INFER_REQUESTS, std::tuple<unsigned int, unsigned int, unsigned int>);
121 
122 /**
123  * @brief Metric to get an unsigned int value of number of waiting infer request.
124  * String value is "NUMBER_OF_WAITNING_INFER_REQUESTS". This can be used as an executable network metric as well
125  */
126 DECLARE_METRIC_KEY(NUMBER_OF_WAITING_INFER_REQUESTS, unsigned int);
127 
128 /**
129  * @brief Metric to get an unsigned int value of number of infer request in execution stage.
130  * String value is "NUMBER_OF_EXEC_INFER_REQUESTS". This can be used as an executable network metric as well
131  */
132 DECLARE_METRIC_KEY(NUMBER_OF_EXEC_INFER_REQUESTS, unsigned int);
133 
134 /**
135  * @brief Metric to get a name of network. String value is "NETWORK_NAME".
136  */
137 DECLARE_EXEC_NETWORK_METRIC_KEY(NETWORK_NAME, std::string);
138 
139 /**
140  * @brief Metric to get a float of device thermal. String value is "DEVICE_THERMAL"
141  */
142 DECLARE_METRIC_KEY(DEVICE_THERMAL, float);
143 
144 /**
145  * @brief Metric to get an unsigned integer value of optimal number of executable network infer requests.
146  */
147 DECLARE_EXEC_NETWORK_METRIC_KEY(OPTIMAL_NUMBER_OF_INFER_REQUESTS, unsigned int);
148 
149 } // namespace Metrics
150 
151 /**
152  * @brief Generic plugin configuration
153  */
154 namespace PluginConfigParams {
155 
156 /**
157  * @def CONFIG_KEY(name)
158  * @brief shortcut for defining configuration keys
159  */
160 #define CONFIG_KEY(name) InferenceEngine::PluginConfigParams::_CONFIG_KEY(name)
161 #define _CONFIG_KEY(name) KEY_##name
162 #define DECLARE_CONFIG_KEY(name) static constexpr auto _CONFIG_KEY(name) = #name
163 
164 /**
165  * @def CONFIG_VALUE(name)
166  * @brief shortcut for defining configuration values
167  */
168 #define CONFIG_VALUE(name) InferenceEngine::PluginConfigParams::name
169 #define DECLARE_CONFIG_VALUE(name) static constexpr auto name = #name
170 
171 /**
172  * @brief generic boolean values
173  */
174 DECLARE_CONFIG_VALUE(YES);
175 DECLARE_CONFIG_VALUE(NO);
176 
177 /**
178  * @brief Limit #threads that are used by Inference Engine for inference on the CPU.
179  */
180 DECLARE_CONFIG_KEY(CPU_THREADS_NUM);
181 
182 /**
183  * @brief The name for setting CPU affinity per thread option.
184  * It is passed to IInferencePlugin::SetConfig(), this option should be used with values:
185  * PluginConfigParams::YES or PluginConfigParams::NO
186  * Ignored, if the OpenVINO compiled with OpenMP threading and any affinity-related OpenMP's
187  * environment variable is set
188  */
189 DECLARE_CONFIG_KEY(CPU_BIND_THREAD);
190 
191 /**
192  * @brief Optimize CPU execution to maximize throughput.
193  * It is passed to IInferencePlugin::SetConfig(), this option should be used with values:
194  * - KEY_CPU_THROUGHPUT_NUMA creates as many streams as needed to accomodate NUMA and avoid associated penalties
195  * - KEY_CPU_THROUGHPUT_AUTO creates bare minimum of streams to improve the performance,
196  * this is the most portable option if you have no insights into how many cores you target machine will have
197  * (and what is the optimal number of streams)
198  * - finally, specifying the positive integer value creates the requested number of streams
199  */
200 DECLARE_CONFIG_VALUE(CPU_THROUGHPUT_NUMA);
201 DECLARE_CONFIG_VALUE(CPU_THROUGHPUT_AUTO);
202 DECLARE_CONFIG_KEY(CPU_THROUGHPUT_STREAMS);
203 
204 /**
205  * @brief Optimize GPU plugin execution to maximize throughput.
206  * It is passed to IInferencePlugin::SetConfig(), this option should be used with values:
207  * - KEY_GPU_THROUGHPUT_AUTO creates bare minimum of streams that might improve performance in some cases,
208  * this option allows to enable throttle hint for opencl queue thus reduce CPU load without significant performance
209  * drop
210  * - a positive integer value creates the requested number of streams
211  */
212 DECLARE_CONFIG_VALUE(GPU_THROUGHPUT_AUTO);
213 DECLARE_CONFIG_KEY(GPU_THROUGHPUT_STREAMS);
214 
215 /**
216  * @brief The name for setting performance counters option.
217  * It is passed to IInferencePlugin::SetConfig(), this option should be used with values:
218  * PluginConfigParams::YES or PluginConfigParams::NO
219  */
220 DECLARE_CONFIG_KEY(PERF_COUNT);
221 
222 /**
223  * @brief The key defines dynamic limit of batch processing.
224  * Specified value is applied to all following Infer() calls. Inference Engine processes
225  * min(batch_limit, original_batch_size) first pictures from input blob. For example, if input
226  * blob has sizes 32x3x224x224 after applying plugin.SetConfig({KEY_DYN_BATCH_LIMIT, 10})
227  * Inference Engine primitives processes only beginner subblobs with size 10x3x224x224.
228  * This value can be changed before any Infer() call to specify a new batch limit.
229  *
230  * The paired parameter value should be convertible to integer number. Acceptable values:
231  * -1 - Do not limit batch processing
232  * >0 - Direct value of limit. Batch size to process is min(new batch_limit, original_batch)
233  */
234 DECLARE_CONFIG_KEY(DYN_BATCH_LIMIT);
235 
236 DECLARE_CONFIG_KEY(DYN_BATCH_ENABLED);
237 
238 DECLARE_CONFIG_KEY(DUMP_QUANTIZED_GRAPH_AS_DOT);
239 DECLARE_CONFIG_KEY(DUMP_QUANTIZED_GRAPH_AS_IR);
240 
241 /**
242  * @brief The key controls threading inside Inference Engine.
243  * It is passed to IInferencePlugin::SetConfig(), this option should be used with values:
244  * PluginConfigParams::YES or PluginConfigParams::NO
245  */
246 DECLARE_CONFIG_KEY(SINGLE_THREAD);
247 
248 /**
249  * @brief This key directs the plugin to load a configuration file.
250  * The value should be a file name with the plugin specific configuration
251  */
252 DECLARE_CONFIG_KEY(CONFIG_FILE);
253 
254 /**
255  * @brief This key enables dumping of the kernels used by the plugin for custom layers.
256  * This option should be used with values: PluginConfigParams::YES or PluginConfigParams::NO (default)
257  */
258 DECLARE_CONFIG_KEY(DUMP_KERNELS);
259 
260 /**
261  * @brief This key controls performance tuning done or used by the plugin.
262  * This option should be used with values: PluginConfigParams::TUNING_CREATE,
263  * PluginConfigParams::TUNING_USE_EXISTING or PluginConfigParams::TUNING_DISABLED (default)
264  */
265 DECLARE_CONFIG_KEY(TUNING_MODE);
266 
267 DECLARE_CONFIG_VALUE(TUNING_CREATE);
268 DECLARE_CONFIG_VALUE(TUNING_USE_EXISTING);
269 DECLARE_CONFIG_VALUE(TUNING_DISABLED);
270 
271 /**
272  * @brief This key defines the tuning data filename to be created/used
273  */
274 DECLARE_CONFIG_KEY(TUNING_FILE);
275 
276 /**
277  * @brief the key for setting desirable log level.
278  * This option should be used with values: PluginConfigParams::LOG_NONE (default),
279  * PluginConfigParams::LOG_ERROR, PluginConfigParams::LOG_WARNING,
280  * PluginConfigParams::LOG_INFO, PluginConfigParams::LOG_DEBUG, PluginConfigParams::LOG_TRACE
281  */
282 DECLARE_CONFIG_KEY(LOG_LEVEL);
283 
284 DECLARE_CONFIG_VALUE(LOG_NONE); // turn off logging
285 DECLARE_CONFIG_VALUE(LOG_ERROR); // error events that might still allow the application to continue running
286 DECLARE_CONFIG_VALUE(LOG_WARNING); // potentially harmful situations which may further lead to ERROR
287 DECLARE_CONFIG_VALUE(
288  LOG_INFO); // informational messages that display the progress of the application at coarse-grained level
289 DECLARE_CONFIG_VALUE(LOG_DEBUG); // fine-grained events that are most useful to debug an application.
290 DECLARE_CONFIG_VALUE(LOG_TRACE); // finer-grained informational events than the DEBUG
291 
292 /**
293  * @brief the key for setting of required device to execute on
294  * values: device id starts from "0" - first device, "1" - second device, etc
295  */
296 DECLARE_CONFIG_KEY(DEVICE_ID);
297 
298 /**
299  * @brief the key for enabling exclusive mode for async requests of different executable networks and the same plugin.
300  * Sometimes it's necessary to avoid oversubscription requests that are sharing the same device in parallel.
301  * E.g. There 2 task executors for CPU device: one - in the Hetero plugin, another - in pure CPU plugin.
302  * Parallel execution both of them might lead to oversubscription and not optimal CPU usage. More efficient
303  * to run the corresponding tasks one by one via single executor.
304  * By default, the option is set to YES for hetero cases, and to NO for conventional (single-plugin) cases
305  * Notice that setting YES disables the CPU streams feature (see another config key in this file)
306  */
307 DECLARE_CONFIG_KEY(EXCLUSIVE_ASYNC_REQUESTS);
308 
309 /**
310  * @brief This key enables dumping of the internal primitive graph.
311  * Should be passed into LoadNetwork method to enable dumping of internal graph of primitives and
312  * corresponding configuration information. Value is a name of output dot file without extension.
313  * Files <dot_file_name>_init.dot and <dot_file_name>_perf.dot will be produced.
314  */
315 DECLARE_CONFIG_KEY(DUMP_EXEC_GRAPH_AS_DOT);
316 
317 } // namespace PluginConfigParams
318 } // namespace InferenceEngine
static constexpr auto YES
generic boolean values
Definition: ie_plugin_config.hpp:174
static constexpr auto CPU_THROUGHPUT_NUMA
Optimize CPU execution to maximize throughput. It is passed to IInferencePlugin::SetConfig(), this option should be used with values:
Definition: ie_plugin_config.hpp:200
Inference Engine API.
Definition: ie_argmax_layer.hpp:11
static constexpr auto GPU_THROUGHPUT_AUTO
Optimize GPU plugin execution to maximize throughput. It is passed to IInferencePlugin::SetConfig(), this option should be used with values:
Definition: ie_plugin_config.hpp:212