From 5b428f0655713ed3f7a0ef69d4e7aaac9aead2e7 Mon Sep 17 00:00:00 2001 From: Alexey Suhov Date: Wed, 13 May 2020 21:12:22 +0300 Subject: [PATCH] publish master branch snapshot, revision 49482ae3bea0cbaa07474f86f36db11943142687 --- .clang-format | 19 - .coveragerc | 39 - .gitignore | 36 +- CMakeLists.txt | 9 +- cmake/check_features.cmake | 6 +- cmake/developer_package.cmake | 9 +- cmake/fuzzing.cmake | 2 +- cmake/os_flags.cmake | 70 +- cmake/sanitizer.cmake | 7 +- cmake/sdl.cmake | 4 +- cmake/target_flags.cmake | 2 +- .../.editorconfig | 0 inference-engine/CMakeLists.txt | 2 +- inference-engine/cmake/coverage_ie.cmake | 9 +- inference-engine/cmake/cpplint.cmake | 6 +- .../cmake/developer_package_config.cmake.in | 4 +- inference-engine/cmake/features_ie.cmake | 15 +- inference-engine/cmake/models.cmake | 4 + .../share/InferenceEngineConfig.cmake.in | 2 +- .../object_detection_sample_ssd/main.c | 26 +- .../ie_bridges/c/tests/CMakeLists.txt | 2 + .../ie_bridges/c/tests/ie_c_api_test.cpp | 7 +- .../ie_bridges/python/CMakeLists.txt | 7 + .../ie_bridges/python/cmake/FindCython.cmake | 6 +- .../src/openvino/inference_engine/ie_api.pyx | 2 +- .../python/tests/test_InferRequest.py | 8 + inference-engine/include/cpp/ie_cnn_network.h | 22 +- .../include/cpp/ie_executable_network.hpp | 4 +- .../include/cpp/ie_infer_request.hpp | 9 +- .../include/cpp/ie_plugin_cpp.hpp | 2 + .../details/ie_cnn_network_iterator.hpp | 1 + .../include/details/ie_so_pointer.hpp | 6 +- inference-engine/include/ie_core.hpp | 26 +- inference-engine/samples/CMakeLists.txt | 14 +- .../samples/benchmark_app/README.md | 1 + .../samples/benchmark_app/benchmark_app.hpp | 7 + .../samples/benchmark_app/main.cpp | 45 +- .../samples/benchmark_app/utils.cpp | 72 ++ .../samples/benchmark_app/utils.hpp | 6 + .../scripts/create_vs2017_proj_x64.cmd | 31 + inference-engine/scripts/run_code_checks.sh | 2 + .../scripts/run_tests_myriad_multistick.sh | 87 ++ inference-engine/src/CMakeLists.txt | 2 + .../src/cldnn_engine/cldnn_engine.cpp | 12 +- .../src/cldnn_engine/cldnn_engine.h | 8 +- .../src/gna_plugin/backend/am_intel_dnn.cpp | 76 +- .../src/gna_plugin/backend/am_intel_dnn.hpp | 8 +- .../src/gna_plugin/gna_plugin.hpp | 2 +- .../src/gna_plugin/gna_plugin_internal.hpp | 2 +- .../src/gna_plugin/gna_plugin_query_api.cpp | 4 + .../hetero_async_infer_request.cpp | 1 - .../hetero_executable_network.cpp | 100 +- .../hetero_executable_network.hpp | 5 +- .../src/hetero_plugin/hetero_plugin.cpp | 232 ++--- .../src/hetero_plugin/hetero_plugin.hpp | 51 +- .../src/inference_engine/CMakeLists.txt | 6 +- .../cnn_network_ngraph_impl.cpp | 13 +- .../src/inference_engine/dll_main.hpp | 22 - .../src/inference_engine/ie_core.cpp | 338 ++++--- .../threading/ie_cpu_streams_executor.cpp | 344 ++++--- .../threading/ie_istreams_executor.cpp | 2 +- .../src/inference_engine/xml_parse_utils.cpp | 2 +- .../src/ir_readers/ie_ir_parser.cpp | 49 +- .../src/ir_readers/ie_ir_parser.hpp | 12 +- .../src/convert_function_to_cnn_network.cpp | 15 +- .../src/legacy_api/src/ie_deprecated.cpp | 3 +- .../legacy_api/src/ie_layer_validators.cpp | 8 +- .../ie_tensor_iterator_shape_infer.hpp | 1 + .../src/shape_infer/ie_reshaper.hpp | 2 +- .../low_precision_transformations/power.hpp | 24 + .../src/power.cpp | 75 ++ .../src/scaleshift_to_convolution.cpp | 5 +- .../src/transformer.cpp | 4 +- .../src/mkldnn_plugin/CMakeLists.txt | 14 +- .../src/mkldnn_plugin/bf16transformer.cpp | 6 + .../src/mkldnn_plugin/bf16transformer.h | 5 +- .../src/mkldnn_plugin/mkldnn_exec_network.cpp | 64 +- .../mkldnn_plugin/mkldnn_graph_optimizer.cpp | 10 +- .../src/mkldnn_plugin/mkldnn_plugin.cpp | 5 +- .../src/mkldnn_plugin/mkldnn_plugin.h | 7 +- .../src/mkldnn_plugin/nodes/list.hpp | 9 +- .../nodes/mkldnn_permute_node.cpp | 2 +- .../mkldnn_plugin/nodes/mkldnn_permute_node.h | 2 +- .../nodes/mkldnn_pooling_node.cpp | 41 +- .../mkldnn_plugin/nodes/mkldnn_pooling_node.h | 15 +- .../nodes/mkldnn_resample_node.cpp | 16 +- .../src/multi_device/CMakeLists.txt | 26 + .../src/multi_device/multi_device.cpp | 548 +++++++++++ .../src/multi_device/multi_device.hpp | 176 ++++ .../impl/ie_plugin_internal.hpp | 26 +- .../interface/ie_iplugin_internal.hpp | 2 +- inference-engine/src/plugin_api/ie_icore.hpp | 50 + .../src/plugin_api/ie_profiling.hpp | 6 +- .../threading/ie_cpu_streams_executor.hpp | 2 + .../threading/ie_istreams_executor.hpp | 6 + .../src/preprocessing/CMakeLists.txt | 6 +- .../common_optimizations_tbl.hpp | 12 +- .../convert_opset1_to_legacy_tbl.hpp | 2 - .../convert_broadcast3.hpp | 31 + .../convert_opset3_to_opset2/convert_nms3.hpp | 31 + .../convert_opset3_to_opset2.hpp | 26 + .../convert_opset3_to_opset2_tbl.hpp | 21 + .../convert_shapeof3.hpp | 30 + .../convert_topk3.hpp | 31 + .../convert_scatter_elements_to_scatter.hpp | 30 + .../optimize_strided_slice.hpp | 69 ++ .../remove_filtering_boxes_by_size.hpp | 30 + .../common_optimizations.cpp | 12 +- .../convert_opset1_to_legacy.cpp | 2 - .../convert_prior_to_ie_prior.cpp | 47 +- .../convert_broadcast3.cpp | 61 ++ .../convert_opset3_to_opset2/convert_nms3.cpp | 55 ++ .../convert_opset3_to_opset2.cpp | 32 + .../convert_shapeof3.cpp | 45 + .../convert_topk3.cpp | 56 ++ .../convert_scatter_elements_to_scatter.cpp | 211 +++++ .../optimize_strided_slice.cpp | 203 ++++ .../remove_filtering_boxes_by_size.cpp | 106 +++ .../operations/out_shape_of_reshape.hpp | 37 + .../operations/static_shape_broadcast.hpp | 47 + .../operations/static_shape_nonzero.hpp | 13 +- .../dynamic_to_static_shape.hpp | 2 +- .../dynamic_to_static_shape_broadcast.hpp | 15 + .../dynamic_to_static_shape_concat.hpp | 15 + .../dynamic_to_static_shape_gather.hpp | 15 + .../dynamic_to_static_shape_reshape.hpp | 15 + .../dynamic_to_static_shape_shapeof.hpp | 16 + ...dynamic_to_static_shape_variadic_split.hpp | 15 + .../common/include/vpu/utils/simple_math.hpp | 111 ++- .../operations/dynamic_shape_resolver.cpp | 5 +- .../operations/out_shape_of_reshape.cpp | 72 ++ .../operations/static_shape_broadcast.cpp | 147 +++ .../operations/static_shape_nonzero.cpp | 123 ++- .../dynamic_to_static_shape.cpp | 31 +- .../dynamic_to_static_shape_broadcast.cpp | 47 + .../dynamic_to_static_shape_concat.cpp | 116 +++ .../dynamic_to_static_shape_gather.cpp | 78 ++ .../dynamic_to_static_shape_nonzero.cpp | 10 +- .../dynamic_to_static_shape_reshape.cpp | 40 + .../dynamic_to_static_shape_shapeof.cpp | 41 + .../dynamic_to_static_shape_transpose.cpp | 4 +- ...dynamic_to_static_shape_variadic_split.cpp | 77 ++ .../src/vpu/common/src/utils/simple_math.cpp | 220 ++--- .../custom_kernels/binary_convolution1x1.cl | 4 + .../custom_kernels/binary_convolution3x3.cl | 3 + .../src/vpu/custom_kernels/binary_layers.cl | 12 +- .../src/vpu/custom_kernels/convolution1x1.cl | 4 + .../src/vpu/custom_kernels/convolution3x3.cl | 4 + .../src/vpu/custom_kernels/correlate.cl | 449 +++++++++ .../src/vpu/custom_kernels/ctc.cl | 234 +++-- .../custom_kernels/customLayerBindings.xml | 864 ++++++++++-------- .../src/vpu/custom_kernels/cvtf32f16.cl | 12 +- .../src/vpu/custom_kernels/cvtu8f16.cl | 103 ++- .../detectron_prior_grid_gen.cl | 14 +- .../src/vpu/custom_kernels/grn.cl | 101 +- .../src/vpu/custom_kernels/mvn.cl | 4 + .../src/vpu/custom_kernels/quantize.cl | 272 +++--- .../src/vpu/custom_kernels/region.cl | 474 ++++++++++ .../src/vpu/custom_kernels/region_chw.cl | 12 +- .../custom_kernels/region_chw_m7_branch0.cl | 12 +- .../custom_kernels/region_chw_m7_branch1.cl | 12 +- .../src/vpu/custom_kernels/reorg_chw.cl | 136 ++- .../src/vpu/custom_kernels/reorg_chw_local.cl | 12 +- .../src/vpu/custom_kernels/reorg_chw_stack.cl | 12 +- .../src/vpu/custom_kernels/reorg_hwc.cl | 171 +++- .../src/vpu/custom_kernels/resample_nn.cl | 177 +++- .../custom_kernels/resample_with_antialias.cl | 230 ++++- .../vpu/custom_kernels/shuffle_channels.cl | 12 +- inference-engine/src/vpu/custom_kernels/st.cl | 253 +++++ .../include/vpu/frontend/custom_kernel.hpp | 83 ++ .../include/vpu/frontend/custom_layer.hpp | 92 +- .../include/vpu/frontend/frontend.hpp | 10 +- .../include/vpu/graph_transformer.hpp | 1 + .../include/vpu/middleend/pass_manager.hpp | 1 + .../include/vpu/model/data.hpp | 2 +- .../include/vpu/model/model.hpp | 19 +- .../include/vpu/model/stage.hpp | 24 +- .../include/vpu/private_plugin_config.hpp | 6 + .../include/vpu/stage_builder.hpp | 3 +- .../src/backend/serialize.cpp | 36 +- .../src/frontend/custom_kernel.cpp | 426 +++++++++ .../src/frontend/custom_layer.cpp | 854 ++++------------- .../src/frontend/frontend.cpp | 190 +++- .../src/middleend/allocator/allocator.cpp | 57 +- .../src/middleend/pass_manager.cpp | 24 +- .../middleend/passes/adjust_data_location.cpp | 2 +- .../passes/eliminate_const_concat.cpp | 2 +- .../src/middleend/passes/final_check.cpp | 2 +- .../passes/process_special_stages.cpp | 2 +- .../middleend/passes/replace_with_screlu.cpp | 4 +- .../passes/split_large_kernel_conv.cpp | 163 ++++ .../passes/swap_concat_and_hw_ops.cpp | 2 +- .../vpu/graph_transformer/src/model/data.cpp | 54 +- .../vpu/graph_transformer/src/model/model.cpp | 50 +- .../graph_transformer/src/parsed_config.cpp | 5 + .../src/stages/broadcast.cpp | 159 ++++ .../graph_transformer/src/stages/concat.cpp | 247 +++-- .../src/stages/convolution.cpp | 13 +- .../graph_transformer/src/stages/custom.cpp | 426 ++++----- .../src/stages/dynamic_shape_resolver.cpp | 47 +- .../src/stages/out_shape_of_reshape.cpp | 103 +++ .../graph_transformer/src/stages/pooling.cpp | 4 + .../graph_transformer/src/stages/reduce.cpp | 84 +- .../vpu/graph_transformer/src/stages/topk.cpp | 6 +- .../src/vpu/myriad_plugin/myriad_plugin.cpp | 5 +- .../src/vpu/myriad_plugin/myriad_plugin.h | 1 - .../inference_engine/CMakeLists.txt | 7 +- .../inference_engine/caseless_tests.cpp} | 13 +- .../inference_engine/core_threading_tests.cpp | 149 +++ .../inference_engine}/data_test.cpp | 0 .../inference_engine}/debug_tests.cpp | 12 +- .../inference_engine/ie_extension_test.cpp | 30 +- .../ngraph_reader/abs_tests.cpp | 105 +++ .../ngraph_reader/linear_ops_tests.cpp | 2 +- .../inference_engine}/pre_allocator_test.cpp | 9 +- .../inference_engine}/preprocess_test.cpp | 12 +- .../response_buffer_test.cpp | 13 +- .../shared_object_loader_test.cpp | 20 +- .../inference_engine}/so_pointer_tests.cpp | 24 +- .../convert_broadcast3_test.cpp | 157 ++++ .../transformations/convert_nms3_test.cpp | 103 +++ ...nvert_scatter_elements_to_scatter_test.cpp | 131 +++ .../transformations/convert_shapeof3.cpp | 79 ++ .../transformations/convert_topk3_test.cpp | 161 ++++ .../transformations/ngraph_test_utils.cpp | 4 +- .../transformations/ngraph_test_utils.hpp | 3 + .../optimize_strided_slice_test.cpp | 274 ++++++ .../transpose_to_reshape_test.cpp | 137 +++ .../cpu/bfloat16/bf16_network_restoring.cpp | 4 +- .../plugin/cpu/bfloat16/bfloat16_helpers.hpp | 5 +- .../plugin/cpu/bfloat16/concat_in_place.cpp | 160 ++++ .../plugin/cpu/bfloat16/conv_add.cpp | 162 ++++ .../plugin/cpu/bfloat16/conv_conv.cpp | 35 +- .../plugin/cpu/bfloat16/conv_dwconv_relu.cpp | 21 +- .../cpu/bfloat16/conv_eltwise_depthwise.cpp | 256 ++++++ .../conv_relu_pool_conv_relu_pool.cpp | 29 +- .../plugin/cpu/bfloat16/elt_max.cpp | 151 +++ .../functional/plugin/cpu/bfloat16/elt_x3.cpp | 229 +++++ .../cpu/bfloat16/faster_100_5_1_1_conv.cpp | 14 +- .../plugin/cpu/bfloat16/gather_multiply.cpp | 130 +++ .../gather_x2_add_mul_relu_concat_matmul.cpp | 156 ++++ .../plugin/cpu/bfloat16/interpolation.cpp | 146 +++ .../bfloat16/mobilenet_ssd_with_branching.cpp | 20 +- .../plugin/cpu/bfloat16/resample.cpp | 146 +++ .../bfloat16/scaleshift_conv_eltwise_conv.cpp | 22 +- .../scaleshift_conv_eltwise_relu_conv.cpp | 22 +- .../scaleshift_conv_eltwise_scaleshift.cpp | 14 +- .../cpu/bfloat16/scaleshift_conv_elu_conv.cpp | 15 +- .../cpu/bfloat16/scaleshift_conv_relu.cpp | 14 +- .../scaleshift_conv_x2_concat_relu.cpp | 18 +- .../bfloat16/scaleshift_conv_x2_eltwise.cpp | 14 +- .../scaleshift_conv_x2_mixed1_eltwise.cpp | 14 +- .../scaleshift_conv_x2_mixed2_eltwise.cpp | 14 +- .../bfloat16/scaleshift_conv_x3_eltwise.cpp | 23 +- .../scaleshift_x2_conv_x2_eltwise.cpp | 14 +- .../scaleshift_x3_conv_eltwise_relu.cpp | 19 +- .../cpu/bfloat16/tail_fp32_optimization.cpp | 15 +- .../plugin/cpu/bfloat16/topk_inputs_i32.cpp | 17 +- .../behavior/core_threading_tests.cpp | 22 + .../single_layer_tests/pooling.cpp | 32 +- .../skip_tests_config.cpp | 2 + .../single_layer_tests/convolution.cpp | 27 +- .../operations/out_shape_of_reshape.cpp | 175 ++++ .../operations/static_shape_broadcast.cpp | 202 ++++ .../operations/static_shape_nonzero.cpp | 50 +- ...mic_to_static_shape_binary_elementwise.cpp | 4 +- .../dynamic_to_static_shape_broadcast.cpp | 134 +++ .../dynamic_to_static_shape_clamp.cpp | 2 +- .../dynamic_to_static_shape_concat.cpp | 141 +++ .../dynamic_to_static_shape_convert.cpp | 2 +- .../dynamic_to_static_shape_gather.cpp | 320 +++++++ ...ic_to_static_shape_non_max_suppression.cpp | 2 +- .../dynamic_to_static_shape_nonzero.cpp | 29 +- .../dynamic_to_static_shape_reshape.cpp | 113 +++ .../dynamic_to_static_shape_roialign.cpp | 6 +- .../dynamic_to_static_shape_scatter.cpp | 2 +- .../dynamic_to_static_shape_shapeof.cpp | 213 +++++ .../dynamic_to_static_shape_squeeze.cpp | 2 +- .../dynamic_to_static_shape_transpose.cpp | 2 +- ...amic_to_static_shape_unary_elementwise.cpp | 2 +- .../dynamic_to_static_shape_unsqueeze.cpp | 2 +- ...dynamic_to_static_shape_variadic_split.cpp | 151 +++ .../behavior/core_threading_tests.cpp | 22 + .../single_layer_tests/concat.cpp | 19 +- .../single_layer_tests/proposal.cpp | 50 + .../skip_tests_config.cpp | 3 + .../static_shape_nonzero.cpp | 119 +++ .../myriad/subgraph_tests/dsr_concat.cpp | 81 ++ .../myriad/subgraph_tests/dsr_gather.cpp | 143 +++ .../myriad/subgraph_tests/dsr_reshape.cpp | 71 ++ .../subgraph_tests/dsr_variadic_split.cpp | 81 ++ .../subgraph_tests/nonzero_broadcast.cpp | 62 ++ ...sr_transpose.cpp => nonzero_transpose.cpp} | 21 +- .../include/behavior/core_threading_tests.hpp | 198 ++++ .../include/single_layer_tests/concat.hpp | 1 + .../include/single_layer_tests/proposal.hpp | 66 ++ .../src/single_layer_tests/activation.cpp | 11 +- .../shared/src/single_layer_tests/concat.cpp | 4 +- .../src/single_layer_tests/proposal.cpp | 154 ++++ .../shared/src/single_layer_tests/select.cpp | 11 +- .../common_test_utils/data_utils.hpp | 40 +- .../common_test_utils}/test_assertions.hpp | 54 +- .../functional_test_utils/blob_utils.hpp | 254 ++++- .../layer_test_utils.cpp | 20 +- .../layer_test_utils.hpp | 22 +- .../impl/mock_inference_plugin_internal.hpp | 12 +- .../mocks/cpp_interfaces/mock_plugin_impl.hpp | 2 +- .../include/ngraph_functions/builders.hpp | 20 + .../ngraph_functions/src/params_vector.cpp | 15 + .../tests/ngraph_functions/src/proposal.cpp | 52 ++ .../src/utils/ngraph_helpers.cpp | 7 +- .../vpu/split_large_kernel_conv_tests.cpp | 105 +++ .../unit/inference_engine/CMakeLists.txt | 2 +- .../vpu/frontend_tests/dsr_parsing_tests.cpp | 91 +- .../edges_tests/stage_dependency_edge.cpp | 4 +- .../cpp_wrappers/holders_tests.cpp | 2 +- .../plugin_tests/behavior_test_plugin.cpp | 6 +- .../behavior_test_plugin_config.cpp | 6 +- .../behavior_test_plugin_exec_graph_info.cpp | 2 +- .../behavior_test_plugin_infer_request.cpp | 2 +- ...ior_test_plugin_infer_request_callback.cpp | 2 +- ...avior_test_plugin_infer_request_config.cpp | 2 +- ...havior_test_plugin_infer_request_input.cpp | 2 +- ...avior_test_plugin_infer_request_output.cpp | 2 +- .../behavior_test_plugin_layers.cpp | 2 +- .../behavior_test_plugin_layout.cpp | 4 +- .../behavior_test_plugin_perf_counters.cpp | 2 +- .../behavior_test_plugin_set_preprocess.cpp | 2 +- .../behavior_test_plugin_unsupported.cpp | 4 +- .../behavior_test_plugin_version.cpp | 2 +- .../plugin_tests/cldnn_test_data.hpp | 60 ++ .../cpp_wrappers/holders_tests.cpp | 2 +- .../plugin_tests/behavior_test_plugin.cpp | 6 +- .../behavior_test_plugin_config.cpp | 6 +- .../behavior_test_plugin_exec_graph_info.cpp | 2 +- .../behavior_test_plugin_infer_request.cpp | 2 +- ...ior_test_plugin_infer_request_callback.cpp | 2 +- ...avior_test_plugin_infer_request_config.cpp | 6 +- ...havior_test_plugin_infer_request_input.cpp | 2 +- ...avior_test_plugin_infer_request_output.cpp | 2 +- .../behavior_test_plugin_layers.cpp | 8 +- .../behavior_test_plugin_layout.cpp | 2 +- .../behavior_test_plugin_unsupported.cpp | 6 +- .../behavior_test_plugin_version.cpp | 2 +- .../cpp_wrappers/holders_tests.cpp | 2 +- .../plugin_tests/behavior_test_plugin.cpp | 6 +- .../behavior_test_plugin_config.cpp | 8 +- .../behavior_test_plugin_exec_graph_info.cpp | 2 +- .../behavior_test_plugin_infer_request.cpp | 2 +- ...ior_test_plugin_infer_request_callback.cpp | 2 +- ...avior_test_plugin_infer_request_config.cpp | 4 +- ...havior_test_plugin_infer_request_input.cpp | 2 +- ...avior_test_plugin_infer_request_output.cpp | 2 +- .../behavior_test_plugin_layers.cpp | 8 +- .../behavior_test_plugin_layout.cpp | 6 +- .../behavior_test_plugin_set_preprocess.cpp | 2 +- .../behavior_test_plugin_unsupported.cpp | 4 +- .../behavior_test_plugin_version.cpp | 2 +- .../plugin_tests/mkldnn_test_data.hpp | 53 ++ .../behavior/shared_tests/CMakeLists.txt | 2 +- .../plugin_tests/behavior_test_plugin.h | 2 +- .../behavior_test_plugin_config.hpp | 2 +- .../behavior_test_plugin_infer_request.hpp | 16 +- ...ior_test_plugin_infer_request_callback.hpp | 7 +- .../behavior_test_plugin_set_preprocess.hpp | 1 - .../plugin_tests/behavior_test_plugins.hpp | 2 +- .../behavior/vpu/CMakeLists.txt | 4 +- .../vpu/myriad_tests/aot_behavior_tests.cpp | 2 +- .../vpu/myriad_tests/vpu_boot_tests.cpp | 2 +- .../vpu/myriad_tests/vpu_get_metric_tests.cpp | 10 +- .../myriad_tests/vpu_load_network_tests.cpp | 10 +- .../vpu/myriad_tests/vpu_protocol_tests.cpp | 2 +- .../vpu/myriad_tests/vpu_watchdog_tests.cpp | 2 +- .../cpp_wrappers/holders_tests.cpp | 2 +- .../plugin_tests/behavior_test_plugin.cpp | 6 +- .../behavior_test_plugin_config.cpp | 8 +- .../behavior_test_plugin_exec_graph_info.cpp | 2 +- .../behavior_test_plugin_infer_request.cpp | 2 +- ...ior_test_plugin_infer_request_callback.cpp | 2 +- ...avior_test_plugin_infer_request_config.cpp | 4 +- ...havior_test_plugin_infer_request_input.cpp | 2 +- ...avior_test_plugin_infer_request_output.cpp | 2 +- .../behavior_test_plugin_layers.cpp | 4 +- .../behavior_test_plugin_layout.cpp | 6 +- .../behavior_test_plugin_set_preprocess.cpp | 2 +- .../behavior_test_plugin_unsupported.cpp | 6 +- .../behavior_test_plugin_version.cpp | 2 +- .../plugin_tests/vpu_test_data.hpp | 50 +- .../fluid_preproc/CMakeLists.txt | 3 + .../functional/cldnn/CMakeLists.txt | 5 +- .../functional/gna/CMakeLists.txt | 6 +- .../ie_class/ie_class.cpp | 7 +- .../functional/mkldnn/CMakeLists.txt | 5 +- .../config_param_test/config_param_test.cpp | 9 +- .../extensions_tests/extensions_test.cpp | 34 - .../ie_class/ie_class.cpp | 20 +- .../network_tests/network_test.cpp | 44 +- ...ecision_transformer_single_layer_tests.cpp | 30 + .../functional/shared_tests/CMakeLists.txt | 3 +- .../single_layer_tests.hpp | 10 +- .../shared_tests/ie_class/ie_class.hpp | 29 +- .../common_dyn_batch_regression.hpp | 8 +- .../shared_tests/network_tests/network_i8.hpp | 28 +- .../single_layer_tests/ti_tests.hpp | 17 +- .../fake_quantize_and_scaleshift_test.cpp | 3 +- ...ling_test_model_without_constants_test.cpp | 2 +- ...ecision_transformer_single_layer_tests.hpp | 14 + .../transformations/power_test.cpp | 78 ++ .../scaleshift_and_fake_quantize_test.cpp | 2 +- .../scaleshift_to_conv_after_concat_test.cpp | 2 +- ...to_conv_after_fakequantize_ignore_test.cpp | 2 +- .../single_layer_transformations_test.cpp | 9 +- .../functional/vpu/CMakeLists.txt | 2 - .../layers/myriad_layers_CTCDecoder_test.cpp | 12 +- .../layers/myriad_layers_CTCDecoder_test.hpp | 81 +- ...myriad_layers_batch_normalization_test.cpp | 2 +- ...myriad_layers_batch_normalization_test.hpp | 4 +- .../common/layers/myriad_layers_bias_test.cpp | 2 +- .../common/layers/myriad_layers_bias_test.hpp | 4 +- .../common/layers/myriad_layers_blob_test.cpp | 34 +- .../layers/myriad_layers_clamp_test.cpp | 2 +- .../layers/myriad_layers_clamp_test.hpp | 4 +- .../layers/myriad_layers_concat_test.cpp | 4 +- .../layers/myriad_layers_concat_test.hpp | 4 +- .../layers/myriad_layers_conv_nd_test.cpp | 30 +- .../layers/myriad_layers_conv_nd_test.hpp | 4 +- .../layers/myriad_layers_convert_test.cpp | 16 +- .../layers/myriad_layers_convert_test.hpp | 85 +- .../layers/myriad_layers_convolution1x1.cpp | 2 +- .../layers/myriad_layers_convolution1x1.hpp | 28 +- .../layers/myriad_layers_convolution3x3.cpp | 2 +- .../layers/myriad_layers_convolution3x3.hpp | 6 +- .../layers/myriad_layers_convolution_test.cpp | 98 +- .../layers/myriad_layers_convolution_test.hpp | 24 +- .../common/layers/myriad_layers_copy_test.cpp | 2 +- .../common/layers/myriad_layers_copy_test.hpp | 4 +- .../common/layers/myriad_layers_crop_test.cpp | 6 +- .../common/layers/myriad_layers_crop_test.hpp | 12 +- .../layers/myriad_layers_custom_test.cpp | 22 +- .../layers/myriad_layers_custom_test.hpp | 559 ++++++++++- .../myriad_layers_deconvolution_test.cpp | 12 +- .../myriad_layers_deconvolution_test.hpp | 4 +- .../myriad_layers_detection_output_test.cpp | 8 +- .../layers/myriad_layers_eltwise_test.cpp | 48 +- .../layers/myriad_layers_eltwise_test.hpp | 96 +- .../common/layers/myriad_layers_elu_test.cpp | 2 +- .../common/layers/myriad_layers_elu_test.hpp | 4 +- .../common/layers/myriad_layers_erf_test.cpp | 2 +- .../common/layers/myriad_layers_erf_test.hpp | 4 +- ...myriad_layers_exp_detectionoutput_test.cpp | 2 +- ...myriad_layers_exp_detectionoutput_test.hpp | 4 +- .../myriad_layers_exp_generateproposals.cpp | 2 +- ...riad_layers_exp_generateproposals_test.hpp | 4 +- ...iad_layers_exp_priorgridgenerator_test.cpp | 2 +- ...iad_layers_exp_priorgridgenerator_test.hpp | 4 +- .../common/layers/myriad_layers_exp_test.cpp | 2 +- .../common/layers/myriad_layers_exp_test.hpp | 4 +- .../myriad_layers_exp_topkrois_test.cpp | 2 +- .../myriad_layers_exp_topkrois_test.hpp | 4 +- .../layers/myriad_layers_flatten_test.cpp | 2 +- .../layers/myriad_layers_flatten_test.hpp | 4 +- .../layers/myriad_layers_floor_test.cpp | 2 +- .../layers/myriad_layers_floor_test.hpp | 4 +- .../myriad_layers_fully_connected_tests.cpp | 6 +- .../myriad_layers_fully_connected_tests.hpp | 12 +- .../layers/myriad_layers_gather_test.cpp | 2 +- .../layers/myriad_layers_gather_test.hpp | 4 +- .../common/layers/myriad_layers_gemm_test.cpp | 2 +- .../common/layers/myriad_layers_gemm_test.hpp | 4 +- .../common/layers/myriad_layers_grn_test.cpp | 101 +- .../common/layers/myriad_layers_grn_test.hpp | 45 +- .../layers/myriad_layers_interp_test.cpp | 2 +- .../layers/myriad_layers_interp_test.hpp | 4 +- .../common/layers/myriad_layers_log_test.cpp | 2 +- .../common/layers/myriad_layers_log_test.hpp | 4 +- .../common/layers/myriad_layers_lrn_test.cpp | 2 +- .../common/layers/myriad_layers_lrn_test.hpp | 6 +- .../common/layers/myriad_layers_lstm_cell.cpp | 2 +- .../common/layers/myriad_layers_lstm_cell.hpp | 4 +- .../common/layers/myriad_layers_mvn_test.cpp | 3 +- .../common/layers/myriad_layers_mvn_test.hpp | 7 +- .../common/layers/myriad_layers_nms_test.cpp | 2 +- .../common/layers/myriad_layers_nms_test.hpp | 4 +- .../layers/myriad_layers_nonzero_test.cpp | 2 +- .../layers/myriad_layers_nonzero_test.hpp | 12 +- .../layers/myriad_layers_normalize_test.cpp | 4 +- .../layers/myriad_layers_normalize_test.hpp | 4 +- .../layers/myriad_layers_oneHot_test.cpp | 4 +- .../layers/myriad_layers_oneHot_test.hpp | 4 +- .../common/layers/myriad_layers_pad_test.cpp | 2 +- .../common/layers/myriad_layers_pad_test.hpp | 4 +- .../layers/myriad_layers_permute_nd_test.cpp | 14 +- .../layers/myriad_layers_permute_nd_test.hpp | 4 +- .../layers/myriad_layers_permute_test.cpp | 4 +- .../layers/myriad_layers_permute_test.hpp | 4 +- .../layers/myriad_layers_pool_nd_test.cpp | 44 +- .../layers/myriad_layers_pool_nd_test.hpp | 4 +- .../layers/myriad_layers_pooling_test.cpp | 48 +- .../layers/myriad_layers_pooling_test.hpp | 40 +- .../layers/myriad_layers_power_test.cpp | 2 +- .../layers/myriad_layers_power_test.hpp | 4 +- .../layers/myriad_layers_prelu_test.cpp | 16 +- .../layers/myriad_layers_prelu_test.hpp | 20 +- .../layers/myriad_layers_prior_box_test.cpp | 12 +- .../layers/myriad_layers_proposal_test.cpp | 12 +- .../myriad_layers_psroipooling_test.cpp | 2 +- .../myriad_layers_psroipooling_test.hpp | 4 +- .../layers/myriad_layers_reduce_test.cpp | 22 +- .../layers/myriad_layers_reduce_test.hpp | 115 ++- .../layers/myriad_layers_region_test.cpp | 40 +- .../layers/myriad_layers_region_test.hpp | 373 ++------ .../common/layers/myriad_layers_relu_test.cpp | 16 +- .../common/layers/myriad_layers_relu_test.hpp | 22 +- .../layers/myriad_layers_reorg_test.cpp | 29 +- .../layers/myriad_layers_reorg_test.hpp | 174 ++-- .../layers/myriad_layers_resample_test.cpp | 15 +- .../layers/myriad_layers_resample_test.hpp | 167 ++-- .../layers/myriad_layers_reshape_test.cpp | 12 +- .../layers/myriad_layers_reshape_test.hpp | 16 +- .../myriad_layers_reverse_sequence_test.cpp | 2 +- .../myriad_layers_reverse_sequence_test.hpp | 4 +- .../common/layers/myriad_layers_rfcn_test.cpp | 8 +- .../layers/myriad_layers_roi_align_test.cpp | 2 +- .../layers/myriad_layers_roi_align_test.hpp | 4 +- ...riad_layers_roi_feature_extractor_test.cpp | 2 +- ...riad_layers_roi_feature_extractor_test.hpp | 4 +- .../layers/myriad_layers_roi_pooling_test.cpp | 2 +- .../layers/myriad_layers_roi_pooling_test.hpp | 4 +- .../layers/myriad_layers_scale_test.cpp | 2 +- .../layers/myriad_layers_scale_test.hpp | 4 +- ...ad_layers_scatter_elements_update_test.cpp | 4 +- ...ad_layers_scatter_elements_update_test.hpp | 4 +- .../myriad_layers_scatter_update_test.cpp | 4 +- .../myriad_layers_scatter_update_test.hpp | 4 +- .../layers/myriad_layers_select_test.cpp | 2 +- .../layers/myriad_layers_select_test.hpp | 4 +- .../layers/myriad_layers_sigmoid_test.cpp | 10 +- .../layers/myriad_layers_sigmoid_test.hpp | 20 +- .../layers/myriad_layers_slice_test.cpp | 2 +- .../layers/myriad_layers_slice_test.hpp | 4 +- .../layers/myriad_layers_softmax_test.cpp | 2 +- .../layers/myriad_layers_softmax_test.hpp | 8 +- .../layers/myriad_layers_split_test.cpp | 2 +- .../layers/myriad_layers_split_test.hpp | 4 +- .../layers/myriad_layers_squeeze_test.cpp | 10 +- .../layers/myriad_layers_squeeze_test.hpp | 20 +- .../myriad_layers_strided_slice_test.cpp | 2 +- .../layers/myriad_layers_strided_slice_test.h | 4 +- .../common/layers/myriad_layers_tanh_test.cpp | 10 +- .../common/layers/myriad_layers_tanh_test.hpp | 20 +- .../myriad_layers_tensor_iterator_test.cpp | 66 -- .../common/layers/myriad_layers_tile_test.cpp | 4 +- .../common/layers/myriad_layers_tile_test.hpp | 4 +- .../common/layers/myriad_layers_topk_test.cpp | 2 +- .../common/layers/myriad_layers_topk_test.hpp | 31 +- .../layers/myriad_layers_unsqueeze_test.cpp | 2 +- .../layers/myriad_layers_unsqueeze_test.hpp | 4 +- .../myriad_layers_reference_functions.cpp | 80 +- .../myriad_layers_reference_functions.hpp | 4 + .../vpu/vpu_base/vpu_layers_tests.cpp | 15 +- .../vpu/vpu_base/vpu_layers_tests.hpp | 1 + .../tests_deprecated/helpers/CMakeLists.txt | 7 + .../helpers/single_layer_common.hpp | 15 +- .../tests_deprecated/helpers/tests_utils.hpp | 26 - .../mock_engine/mock_plugin.cpp | 1 + .../mock_engine/mock_plugin.hpp | 1 + .../tests_deprecated/unit/CMakeLists.txt | 4 +- .../cnn_network/cnn_net_reader_impl_test.cpp | 1 - .../unit/engines/vpu/eliminate_copy_tests.cpp | 2 +- .../unit/graph_tools/graph_copy_tests.cpp | 2 +- .../cnn_network_test.cpp | 72 +- .../async_infer_request_tests.cpp | 73 ++ .../executable_network_base_tests.cpp | 62 ++ .../iinference_plugin_internal_tests.cpp | 2 +- .../cpp_interfaces/plugin_base_tests.cpp | 40 + .../locked_memory_test.cpp | 24 +- .../thirdparty/clDNN/api/tensor.hpp | 15 + .../kernel_selector/common/tensor_type.cpp | 36 + .../kernel_selector/common/tensor_type.h | 40 +- .../activation/activation_kernel_base.cpp | 13 +- .../activation/activation_kernel_opt.cpp | 32 +- .../activation/activation_kernel_opt.h | 5 + .../activation/activation_kernel_ref.cpp | 12 +- .../activation/activation_kernel_ref.h | 5 + .../convolution_kernel_b_fs_yx_fsv16_1x1.cpp | 3 +- ...olution_kernel_b_fs_yx_fsv16_depthwise.cpp | 4 + .../convolution_kernel_b_fs_zyx_fsv16.cpp | 2 +- .../convolution/convolution_kernel_base.cpp | 3 +- .../convolution_kernel_bfyx_os_iyx_osv16.cpp | 7 +- ...volution_kernel_bfyx_os_iyx_osv16_2_sg.cpp | 9 +- .../convolution/convolution_kernel_imad.cpp | 2 +- .../convolution/convolution_params.cpp | 4 - .../deconvolution_kernel_b_fs_zyx_fsv16.cpp | 64 +- .../deconvolution_kernel_b_fs_zyx_fsv16.h | 11 +- ...deconvolution_kernel_b_fs_zyx_fsv16_dw.cpp | 141 ++- .../deconvolution_kernel_b_fs_zyx_fsv16_dw.h | 28 +- .../deconvolution_kernel_base.cpp | 57 +- .../deconvolution/deconvolution_kernel_base.h | 6 +- .../deconvolution_kernel_bfyx_opt.cpp | 21 +- .../deconvolution_kernel_bfyx_opt.h | 13 +- ...nvolution_kernel_imad_along_f_tile_bfx.cpp | 285 ++++++ ...nvolution_kernel_imad_along_f_tile_bfx.hpp | 51 ++ .../deconvolution_kernel_imad_ref.cpp | 110 +++ .../deconvolution_kernel_imad_ref.hpp | 47 + .../deconvolution_kernel_ref.cpp | 25 + .../deconvolution/deconvolution_kernel_ref.h | 11 +- .../deconvolution_kernel_selector.cpp | 4 + .../eltwise/eltwise_kernel_b_fs_yx_fsv16.cpp | 9 + .../pooling_kernel_gpu_b_fs_yx_fsv16.cpp | 7 + .../quantize/quantize_kernel_params.h | 3 + .../reorder/reorder_kernel_base.cpp | 4 + .../reorder/reorder_kernel_base.h | 5 + .../reorder/reorder_weights_kernel.cpp | 3 +- .../core/cl_kernels/activation_opt.cl | 42 +- .../core/cl_kernels/activation_ref.cl | 36 +- .../convolution_gpu_bfyx_to_bfyx_f16.cl | 6 +- ...volution_gpu_mmad_bfyx_to_b_fs_yx_fsv32.cl | 2 +- .../deconvolution_gpu_b_fs_zyx_fsv16_dw.cl | 218 ++++- .../cl_kernels/deconvolution_gpu_bfyx_opt.cl | 31 +- ...deconvolution_gpu_imad_along_f_tile_bfx.cl | 297 ++++++ .../deconvolution_gpu_imad_common.cl | 245 +++++ .../cl_kernels/deconvolution_gpu_imad_ref.cl | 179 ++++ .../core/cl_kernels/deconvolution_gpu_ref.cl | 91 +- .../cl_kernels/gen9_common_conv_bwd_data.cl | 25 +- .../core/cl_kernels/include/fetch.cl | 95 +- .../core/cl_kernels/include/reshape_dims.cl | 19 +- .../core/cl_kernels/reorder_weights.cl | 77 +- .../kernel_selector/core/common/jitter.cpp | 20 +- .../kernel_selector/core/common/jitter.h | 3 +- .../core/common/kernel_selector_utils.cpp | 21 +- .../core/common/kernel_selector_utils.h | 3 +- .../kernel_selector/core/kernel_base.cpp | 3 +- .../clDNN/kernel_selector/core/kernel_base.h | 1 + .../core/kernel_selector_common.cpp | 6 + .../core/kernel_selector_params.h | 4 +- .../thirdparty/clDNN/src/activation.cpp | 4 + .../thirdparty/clDNN/src/deconvolution.cpp | 13 +- .../thirdparty/clDNN/src/gpu/crop_gpu.cpp | 3 + .../clDNN/src/gpu/deconvolution_gpu.cpp | 76 +- .../thirdparty/clDNN/src/gpu/device_info.cpp | 2 +- .../clDNN/src/gpu/primitive_gpu_base.h | 5 + .../graph_optimizer/post_optimize_weights.cpp | 18 +- .../graph_optimizer/pre_replace_deconv.cpp | 77 +- .../prepare_primitive_fusing.cpp | 102 ++- .../graph_optimizer/prepare_quantization.cpp | 17 + .../clDNN/src/include/pass_manager.h | 2 +- .../clDNN/src/include/primitive_inst.h | 2 +- .../clDNN/src/include/program_node.h | 1 + .../clDNN/src/include/quantize_inst.h | 4 + .../clDNN/src/include/to_string_utils.h | 12 + .../clDNN/src/kernel_selector_helper.cpp | 45 + .../thirdparty/clDNN/src/layout_optimizer.cpp | 14 +- .../thirdparty/clDNN/src/program.cpp | 3 + .../test_cases/activation_grad_gpu_test.cpp | 231 ----- .../test_cases/concatenation_gpu_test.cpp | 274 ++++++ .../clDNN/tests/test_cases/crop_gpu_test.cpp | 82 ++ .../test_cases/deconvolution_gpu_test.cpp | 603 ++++++++++++ .../tests/test_cases/fusings_gpu_test.cpp | 722 +++++++++++++++ .../clDNN/tests/test_utils/test_utils.h | 10 + .../mkl-dnn/src/cpu/gemm_bf16_convolution.cpp | 87 +- .../mkl-dnn/src/cpu/gemm_bf16_convolution.hpp | 48 +- .../src/cpu/gemm_bf16_inner_product.hpp | 26 +- .../src/cpu/jit_avx2_1x1_conv_kernel_f32.cpp | 2 +- .../src/cpu/jit_avx2_conv_kernel_f32.cpp | 4 +- .../jit_avx512_core_bf16_1x1_conv_kernel.cpp | 80 +- .../jit_avx512_core_bf16_1x1_conv_kernel.hpp | 23 +- .../jit_avx512_core_bf16_1x1_convolution.cpp | 1 + .../cpu/jit_avx512_core_bf16_conv_kernel.cpp | 85 +- .../cpu/jit_avx512_core_bf16_conv_kernel.hpp | 20 +- .../cpu/jit_avx512_core_bf16_convolution.cpp | 3 + .../jit_avx512_core_bf16_dw_conv_kernel.cpp | 63 +- .../jit_avx512_core_bf16_dw_conv_kernel.hpp | 26 +- .../src/cpu/jit_uni_dw_conv_kernel_utils.hpp | 37 +- .../mkl-dnn/src/cpu/ref_depthwise.cpp | 43 +- .../mkl-dnn/tests/gtests/CMakeLists.txt | 2 + ..._convolution_depthwise_forward_bf16f32.cpp | 87 ++ ...t_convolution_depthwise_forward_common.hpp | 15 +- .../test_convolution_eltwise_forward_bf16.cpp | 89 ++ ...est_convolution_eltwise_forward_common.hpp | 16 +- inference-engine/thirdparty/mkldnn.cmake | 14 +- .../thirdparty/movidius/CMakeLists.txt | 3 + .../movidius/XLink/pc/Win/src/win_synchapi.c | 7 +- .../thirdparty/movidius/mvnc/CMakeLists.txt | 4 + .../movidius/mvnc/src/watchdog/watchdog.cpp | 77 +- .../movidius/mvnc/tests/CMakeLists.txt | 74 ++ .../tests/cases/mvnc_common_test_cases.cpp | 122 +++ .../mvnc/tests/cases/mvnc_common_test_cases.h | 155 ++++ .../tests/cases/mvnc_no_boot_test_cases.cpp | 27 + .../tests/cases/mvnc_no_boot_test_cases.h | 36 + .../tests/cases/mvnc_stress_test_cases.cpp | 25 + .../mvnc/tests/cases/mvnc_stress_test_cases.h | 22 + .../mvnc/tests/cases/mvnc_usb_test_cases.cpp | 31 + .../mvnc/tests/cases/mvnc_usb_test_cases.h | 43 + .../mvnc/tests/helpers/mvnc_test_helper.cpp | 140 +++ .../mvnc/tests/helpers/mvnc_test_helper.h | 121 +++ .../mvnc/tests/mvnc_no_boot_tests.cpp | 102 +++ .../movidius/mvnc/tests/mvnc_stress_tests.cpp | 157 ++++ .../movidius/mvnc/tests/mvnc_tests_common.cpp | 534 +++++++++++ .../movidius/mvnc/tests/mvnc_tests_usb.cpp | 247 +++++ .../movidius/mvnc/tests/mvnc_utils_tests.cpp | 61 ++ .../thirdparty/movidius/tests/CMakeLists.txt | 1 + .../movidius/tests/XLink/CMakeLists.txt | 34 + .../tests/XLink/XLink_common_tests.cpp | 432 +++++++++ .../tests/XLink/XLink_deprecated_tests.cpp | 47 + .../tests/XLink/XLink_specific_tests.cpp | 154 ++++ .../tests/XLink/cases/XLink_common_cases.cpp | 98 ++ .../tests/XLink/cases/XLink_common_cases.hpp | 110 +++ .../XLink/cases/XLink_specific_cases.hpp | 25 + .../XLink/helpers/XLink_tests_helpers.cpp | 133 +++ .../XLink/helpers/XLink_tests_helpers.hpp | 71 ++ inference-engine/tools/CMakeLists.txt | 2 + .../tools/cross_check_tool/README.md | 281 ++++++ .../tools/cross_check_tool/__init__.py | 15 + .../cross_check_tool/cross_check_tool.py | 297 ++++++ .../tools/cross_check_tool/requirements.txt | 2 + .../tools/cross_check_tool/utils.py | 536 +++++++++++ inference-engine/tools/package_BOM.txt | 8 + model-optimizer/automation/package_BOM.txt | 15 +- .../extensions/back/CorrectName.py | 47 + .../extensions/back/NormalizeToNormalizeL2.py | 27 +- .../extensions/front/ChangeCastOutputType.py | 5 - .../extensions/front/GeLUMerger_Erf.py | 52 +- .../extensions/front/GeLUMerger_Tanh.py | 80 ++ .../extensions/front/GeLUMerger_test.py | 125 +++ model-optimizer/extensions/front/Log1p.py | 9 +- .../extensions/front/LogSoftmax.py | 8 +- .../extensions/front/mxnet/slice_like_ext.py | 10 +- .../front/mxnet/ssd_anchor_reshape.py | 10 +- .../mxnet/ssd_detection_output_replacer.py | 2 +- .../extensions/front/onnx/expand_ext.py | 2 +- .../front/onnx/non_max_suppression_ext.py | 2 + .../extensions/front/onnx/pooling_ext.py | 2 +- .../extensions/front/onnx/shape_ext.py | 3 +- .../front/onnx/softmaxONNX_to_softmax.py | 60 ++ .../extensions/front/onnx/softmax_ext.py | 4 +- .../extensions/front/rank_decomposer.py | 15 +- .../extensions/front/rank_decomposer_test.py | 70 ++ .../extensions/front/tf/SizeReplacer.py | 23 +- .../extensions/front/tf/argmax_ext.py | 7 +- .../front/tf/non_max_suppression_ext.py | 8 +- .../front/tf/reshape_related_ext.py | 6 +- .../extensions/front/tf/size_replacer_test.py | 68 ++ .../extensions/front/tf/topk_ext.py | 6 +- .../extensions/middle/AnchorToPriorBox.py | 6 +- .../extensions/middle/ArgMaxToTopK.py | 7 +- .../middle/SliceLikeToStridedSlice.py | 112 +++ .../middle/SliceLikeToStridedSlice_test.py | 260 ++++++ .../extensions/middle/UselessStridedSlice.py | 92 -- .../middle/UselessStridedSlice_test.py | 282 ------ .../extensions/middle/ssd_anchors_to_const.py | 4 + model-optimizer/extensions/ops/BlockLSTM.py | 2 +- model-optimizer/extensions/ops/Cast.py | 1 + .../extensions/ops/DetectionOutput.py | 1 + model-optimizer/extensions/ops/Enter.py | 2 +- model-optimizer/extensions/ops/Exit.py | 2 +- model-optimizer/extensions/ops/GRUCell.py | 1 + model-optimizer/extensions/ops/GatherTree.py | 1 + model-optimizer/extensions/ops/Log.py | 43 - model-optimizer/extensions/ops/MatMul.py | 1 + .../extensions/ops/NextIteration.py | 2 +- model-optimizer/extensions/ops/RNNCell.py | 1 + model-optimizer/extensions/ops/ReduceOps.py | 1 + model-optimizer/extensions/ops/TensorArray.py | 2 +- .../extensions/ops/TensorArrayGather.py | 2 +- .../extensions/ops/TensorArrayRead.py | 2 +- .../extensions/ops/TensorArrayScatter.py | 2 +- .../extensions/ops/TensorArraySize.py | 2 +- .../extensions/ops/TensorArrayWrite.py | 2 +- model-optimizer/extensions/ops/accum.py | 1 + .../extensions/ops/activation_ops.py | 1 + model-optimizer/extensions/ops/argmax.py | 1 + model-optimizer/extensions/ops/axpy.py | 2 +- model-optimizer/extensions/ops/bn.py | 2 +- model-optimizer/extensions/ops/box_nms.py | 2 +- model-optimizer/extensions/ops/bucketize.py | 1 + .../extensions/ops/constant_fill.py | 2 +- model-optimizer/extensions/ops/copyop.py | 2 +- model-optimizer/extensions/ops/correlation.py | 1 + .../extensions/ops/ctc_greedy_decoder.py | 1 + .../extensions/ops/data_augmentation.py | 1 + .../extensions/ops/depth_to_space.py | 1 + .../extensions/ops/detectionoutput_onnx.py | 1 + model-optimizer/extensions/ops/elementwise.py | 2 + model-optimizer/extensions/ops/exp.py | 44 - model-optimizer/extensions/ops/exp_test.py | 76 -- .../extensions/ops/fakequantize.py | 1 + model-optimizer/extensions/ops/gather.py | 1 + model-optimizer/extensions/ops/grn.py | 1 + .../extensions/ops/hard_sigmoid.py | 1 + model-optimizer/extensions/ops/interpolate.py | 1 + model-optimizer/extensions/ops/lstm_cell.py | 1 + model-optimizer/extensions/ops/mvn.py | 1 + .../extensions/ops/non_max_suppression.py | 30 +- .../ops/non_max_suppression_test.py | 90 ++ model-optimizer/extensions/ops/normalize.py | 1 - .../extensions/ops/normalize_l2.py | 2 +- model-optimizer/extensions/ops/one_hot.py | 1 + model-optimizer/extensions/ops/parameter.py | 1 + model-optimizer/extensions/ops/power_file.py | 1 + .../extensions/ops/prediction_heatmap.py | 1 + model-optimizer/extensions/ops/prelu.py | 1 + model-optimizer/extensions/ops/priorbox.py | 1 + .../extensions/ops/priorbox_clustered.py | 1 + .../extensions/ops/priorgridgenerator_onnx.py | 1 + model-optimizer/extensions/ops/proposal.py | 1 + .../extensions/ops/proposal_onnx.py | 1 + .../extensions/ops/psroipooling.py | 2 + model-optimizer/extensions/ops/range.py | 1 + model-optimizer/extensions/ops/rank.py | 6 +- model-optimizer/extensions/ops/regionyolo.py | 1 + model-optimizer/extensions/ops/reorgyolo.py | 1 + .../extensions/ops/reverse_sequence.py | 1 + .../ops/roifeatureextractor_onnx.py | 1 + model-optimizer/extensions/ops/select.py | 1 + model-optimizer/extensions/ops/simplernms.py | 1 + model-optimizer/extensions/ops/size.py | 32 +- model-optimizer/extensions/ops/slice_like.py | 54 ++ .../extensions/ops/slice_like_test.py | 71 ++ .../extensions/ops/space_to_depth.py | 1 + .../extensions/ops/sparse_fill_empty_rows.py | 1 + .../extensions/ops/sparse_reshape.py | 6 +- .../extensions/ops/sparse_segment_mean.py | 1 + .../extensions/ops/sparse_segment_sqrtn.py | 1 + .../extensions/ops/sparse_segment_sum.py | 1 + .../extensions/ops/sparse_to_dense.py | 2 +- .../extensions/ops/sparse_weighted_sum.py | 3 +- .../extensions/ops/spatial_transformer.py | 1 + model-optimizer/extensions/ops/split.py | 3 + .../extensions/ops/stop_gradient.py | 2 +- .../extensions/ops/tensor_iterator.py | 1 + model-optimizer/extensions/ops/topk.py | 18 +- model-optimizer/extensions/ops/topk_test.py | 101 ++ .../extensions/ops/topkrois_onnx.py | 1 + model-optimizer/extensions/ops/transpose.py | 1 + model-optimizer/extensions/ops/unique.py | 1 + .../protobuf-3.6.1-py3.5-win-amd64.egg | Bin 0 -> 1321224 bytes .../protobuf-3.6.1-py3.6-win-amd64.egg | Bin 0 -> 1304449 bytes .../protobuf-3.6.1-py3.7-win-amd64.egg | Bin 0 -> 1304387 bytes model-optimizer/mo/front/extractor.py | 2 +- model-optimizer/mo/graph/graph.py | 13 + model-optimizer/mo/main.py | 10 +- .../mo/middle/passes/convert_data_type.py | 3 - model-optimizer/mo/ops/broadcast.py | 41 +- model-optimizer/mo/ops/clamp.py | 2 +- model-optimizer/mo/ops/concat.py | 1 + model-optimizer/mo/ops/const.py | 1 + model-optimizer/mo/ops/convolution.py | 2 +- model-optimizer/mo/ops/crop.py | 1 - model-optimizer/mo/ops/deconvolution.py | 4 +- .../mo/ops/deformable_convolution.py | 2 +- model-optimizer/mo/ops/lrn.py | 2 + model-optimizer/mo/ops/op.py | 9 + model-optimizer/mo/ops/pad.py | 1 + model-optimizer/mo/ops/pooling.py | 2 +- model-optimizer/mo/ops/reshape.py | 1 + model-optimizer/mo/ops/result.py | 1 + model-optimizer/mo/ops/roipooling.py | 5 +- model-optimizer/mo/ops/scale_shift.py | 1 - model-optimizer/mo/ops/shape.py | 58 +- model-optimizer/mo/ops/softmax.py | 22 +- model-optimizer/mo/ops/space_to_batch.py | 1 - model-optimizer/mo/ops/squeeze.py | 2 +- model-optimizer/mo/ops/strided_slice.py | 1 + model-optimizer/mo/ops/tile.py | 2 + model-optimizer/mo/ops/unsqueeze.py | 2 +- model-optimizer/mo/pipeline/common.py | 17 - model-optimizer/mo/utils/broadcasting.py | 105 +++ model-optimizer/mo/utils/broadcasting_test.py | 44 + .../mo/utils/get_ov_update_message.py | 29 + .../mo/utils/ir_engine/compare_graphs.py | 3 +- .../extenders/non_max_suppression_extender.py | 27 + .../ir_reader/extenders/shape_of_extender.py | 27 + .../ir_reader/extenders/topk_extender.py | 5 +- model-optimizer/mo/utils/shape.py | 29 +- ngraph | 2 +- scripts/demo/README.txt | 21 +- scripts/demo/demo_benchmark_app.bat | 8 +- scripts/demo/demo_benchmark_app.sh | 2 +- scripts/demo/demo_security_barrier_camera.bat | 4 +- .../demo_squeezenet_download_convert_run.bat | 8 +- .../demo_squeezenet_download_convert_run.sh | 2 +- scripts/setupvars/setupvars.sh | 5 +- .../nightly_configs/desktop_env_config.xml | 6 + .../desktop_references_config.xml | 533 +++++++++++ .../nightly_configs/desktop_test_config.xml | 156 ++++ .../weekly_configs/desktop_env_config.xml | 6 + .../desktop_references_config.xml | 533 +++++++++++ .../weekly_configs/desktop_test_config.xml | 156 ++++ .../nightly_configs/desktop_env_config.xml | 6 + .../desktop_references_config.xml | 529 +---------- .../nightly_configs/desktop_test_config.xml | 323 ++++--- .../desktop_references_config.xml | 32 +- .../weekly_configs/desktop_env_config.xml | 6 + .../desktop_references_config.xml | 529 +---------- .../weekly_configs/desktop_test_config.xml | 323 ++++--- .../nightly_configs/desktop_env_config.xml | 6 + .../nightly_configs/desktop_test_config.xml | 6 +- .../weekly_configs/desktop_env_config.xml | 6 + .../weekly_configs/desktop_test_config.xml | 6 +- .../nightly_configs/desktop_env_config.xml | 6 + .../nightly_configs/desktop_test_config.xml | 6 +- .../weekly_configs/desktop_env_config.xml | 6 + .../weekly_configs/desktop_test_config.xml | 6 +- tests/stress_tests/.gitignore | 5 +- tests/stress_tests/README.md | 10 + tests/stress_tests/common/tests_utils.cpp | 8 + tests/stress_tests/common/tests_utils.h | 4 + tests/stress_tests/memcheck_tests/flags.h | 11 +- .../local_configs/references_config.xml | 16 +- tests/stress_tests/memcheck_tests/main.cpp | 1 + tests/stress_tests/memcheck_tests/tests.cpp | 16 +- .../tests_pipelines/tests_pipelines.cpp | 4 +- .../tests_pipelines/tests_pipelines.cpp | 105 ++- tests/stress_tests/scripts/__init__.py | 0 tests/stress_tests/scripts/get_testdata.py | 61 +- tests/stress_tests/scripts/memcheck_upload.py | 165 ++++ tests/stress_tests/scripts/requirements.txt | 1 + tools/benchmark/README.md | 3 + tools/benchmark/benchmark.py | 20 +- tools/benchmark/main.py | 143 ++- tools/benchmark/parameters.py | 14 +- tools/benchmark/utils/constants.py | 2 + tools/benchmark/utils/inputs_filling.py | 16 - tools/benchmark/utils/utils.py | 37 +- 924 files changed, 30841 insertions(+), 8905 deletions(-) delete mode 100644 .clang-format delete mode 100644 .coveragerc rename .editorconfig => inference-engine/.editorconfig (100%) create mode 100644 inference-engine/scripts/create_vs2017_proj_x64.cmd create mode 100644 inference-engine/scripts/run_tests_myriad_multistick.sh delete mode 100644 inference-engine/src/inference_engine/dll_main.hpp create mode 100644 inference-engine/src/low_precision_transformations/include/low_precision_transformations/power.hpp create mode 100644 inference-engine/src/low_precision_transformations/src/power.cpp create mode 100644 inference-engine/src/multi_device/CMakeLists.txt create mode 100644 inference-engine/src/multi_device/multi_device.cpp create mode 100644 inference-engine/src/multi_device/multi_device.hpp create mode 100644 inference-engine/src/transformations/include/transformations/convert_opset3_to_opset2/convert_broadcast3.hpp create mode 100644 inference-engine/src/transformations/include/transformations/convert_opset3_to_opset2/convert_nms3.hpp create mode 100644 inference-engine/src/transformations/include/transformations/convert_opset3_to_opset2/convert_opset3_to_opset2.hpp create mode 100644 inference-engine/src/transformations/include/transformations/convert_opset3_to_opset2/convert_opset3_to_opset2_tbl.hpp create mode 100644 inference-engine/src/transformations/include/transformations/convert_opset3_to_opset2/convert_shapeof3.hpp create mode 100644 inference-engine/src/transformations/include/transformations/convert_opset3_to_opset2/convert_topk3.hpp create mode 100644 inference-engine/src/transformations/include/transformations/convert_scatter_elements_to_scatter.hpp create mode 100644 inference-engine/src/transformations/include/transformations/optimize_strided_slice.hpp create mode 100644 inference-engine/src/transformations/include/transformations/remove_filtering_boxes_by_size.hpp create mode 100644 inference-engine/src/transformations/src/transformations/convert_opset3_to_opset2/convert_broadcast3.cpp create mode 100644 inference-engine/src/transformations/src/transformations/convert_opset3_to_opset2/convert_nms3.cpp create mode 100644 inference-engine/src/transformations/src/transformations/convert_opset3_to_opset2/convert_opset3_to_opset2.cpp create mode 100644 inference-engine/src/transformations/src/transformations/convert_opset3_to_opset2/convert_shapeof3.cpp create mode 100644 inference-engine/src/transformations/src/transformations/convert_opset3_to_opset2/convert_topk3.cpp create mode 100644 inference-engine/src/transformations/src/transformations/convert_scatter_elements_to_scatter.cpp create mode 100644 inference-engine/src/transformations/src/transformations/optimize_strided_slice.cpp create mode 100644 inference-engine/src/transformations/src/transformations/remove_filtering_boxes_by_size.cpp create mode 100644 inference-engine/src/vpu/common/include/vpu/ngraph/operations/out_shape_of_reshape.hpp create mode 100644 inference-engine/src/vpu/common/include/vpu/ngraph/operations/static_shape_broadcast.hpp create mode 100644 inference-engine/src/vpu/common/include/vpu/ngraph/transformations/dynamic_to_static_shape_broadcast.hpp create mode 100644 inference-engine/src/vpu/common/include/vpu/ngraph/transformations/dynamic_to_static_shape_concat.hpp create mode 100644 inference-engine/src/vpu/common/include/vpu/ngraph/transformations/dynamic_to_static_shape_gather.hpp create mode 100644 inference-engine/src/vpu/common/include/vpu/ngraph/transformations/dynamic_to_static_shape_reshape.hpp create mode 100644 inference-engine/src/vpu/common/include/vpu/ngraph/transformations/dynamic_to_static_shape_shapeof.hpp create mode 100644 inference-engine/src/vpu/common/include/vpu/ngraph/transformations/dynamic_to_static_shape_variadic_split.hpp create mode 100644 inference-engine/src/vpu/common/src/ngraph/operations/out_shape_of_reshape.cpp create mode 100644 inference-engine/src/vpu/common/src/ngraph/operations/static_shape_broadcast.cpp create mode 100644 inference-engine/src/vpu/common/src/ngraph/transformations/dynamic_to_static_shape_broadcast.cpp create mode 100644 inference-engine/src/vpu/common/src/ngraph/transformations/dynamic_to_static_shape_concat.cpp create mode 100644 inference-engine/src/vpu/common/src/ngraph/transformations/dynamic_to_static_shape_gather.cpp create mode 100644 inference-engine/src/vpu/common/src/ngraph/transformations/dynamic_to_static_shape_reshape.cpp create mode 100644 inference-engine/src/vpu/common/src/ngraph/transformations/dynamic_to_static_shape_shapeof.cpp create mode 100644 inference-engine/src/vpu/common/src/ngraph/transformations/dynamic_to_static_shape_variadic_split.cpp create mode 100644 inference-engine/src/vpu/custom_kernels/correlate.cl create mode 100644 inference-engine/src/vpu/custom_kernels/region.cl create mode 100644 inference-engine/src/vpu/custom_kernels/st.cl create mode 100644 inference-engine/src/vpu/graph_transformer/include/vpu/frontend/custom_kernel.hpp create mode 100644 inference-engine/src/vpu/graph_transformer/src/frontend/custom_kernel.cpp create mode 100644 inference-engine/src/vpu/graph_transformer/src/middleend/passes/split_large_kernel_conv.cpp create mode 100644 inference-engine/src/vpu/graph_transformer/src/stages/broadcast.cpp create mode 100644 inference-engine/src/vpu/graph_transformer/src/stages/out_shape_of_reshape.cpp rename inference-engine/{tests_deprecated/unit/inference_engine_tests/caslesseq_tests.cpp => tests/functional/inference_engine/caseless_tests.cpp} (90%) create mode 100644 inference-engine/tests/functional/inference_engine/core_threading_tests.cpp rename inference-engine/{tests_deprecated/unit/inference_engine_tests => tests/functional/inference_engine}/data_test.cpp (100%) rename inference-engine/{tests_deprecated/unit/inference_engine_tests => tests/functional/inference_engine}/debug_tests.cpp (77%) rename inference-engine/{tests_deprecated/unit/inference_engine_tests => tests/functional/inference_engine}/pre_allocator_test.cpp (84%) rename inference-engine/{tests_deprecated/unit/inference_engine_tests => tests/functional/inference_engine}/preprocess_test.cpp (91%) rename inference-engine/{tests_deprecated/unit/inference_engine_tests => tests/functional/inference_engine}/response_buffer_test.cpp (94%) rename inference-engine/{tests_deprecated/unit/inference_engine_tests => tests/functional/inference_engine}/shared_object_loader_test.cpp (81%) rename inference-engine/{tests_deprecated/unit/inference_engine_tests => tests/functional/inference_engine}/so_pointer_tests.cpp (75%) create mode 100644 inference-engine/tests/functional/inference_engine/transformations/convert_broadcast3_test.cpp create mode 100644 inference-engine/tests/functional/inference_engine/transformations/convert_nms3_test.cpp create mode 100644 inference-engine/tests/functional/inference_engine/transformations/convert_scatter_elements_to_scatter_test.cpp create mode 100644 inference-engine/tests/functional/inference_engine/transformations/convert_shapeof3.cpp create mode 100644 inference-engine/tests/functional/inference_engine/transformations/convert_topk3_test.cpp create mode 100644 inference-engine/tests/functional/inference_engine/transformations/optimize_strided_slice_test.cpp create mode 100644 inference-engine/tests/functional/inference_engine/transformations/transpose_to_reshape_test.cpp create mode 100644 inference-engine/tests/functional/plugin/cpu/bfloat16/concat_in_place.cpp create mode 100644 inference-engine/tests/functional/plugin/cpu/bfloat16/conv_add.cpp create mode 100644 inference-engine/tests/functional/plugin/cpu/bfloat16/conv_eltwise_depthwise.cpp create mode 100644 inference-engine/tests/functional/plugin/cpu/bfloat16/elt_max.cpp create mode 100644 inference-engine/tests/functional/plugin/cpu/bfloat16/elt_x3.cpp create mode 100644 inference-engine/tests/functional/plugin/cpu/bfloat16/gather_multiply.cpp create mode 100644 inference-engine/tests/functional/plugin/cpu/bfloat16/gather_x2_add_mul_relu_concat_matmul.cpp create mode 100644 inference-engine/tests/functional/plugin/cpu/bfloat16/interpolation.cpp create mode 100644 inference-engine/tests/functional/plugin/cpu/bfloat16/resample.cpp create mode 100644 inference-engine/tests/functional/plugin/cpu/shared_tests_instances/behavior/core_threading_tests.cpp create mode 100644 inference-engine/tests/functional/plugin/myriad/ngraph/operations/out_shape_of_reshape.cpp create mode 100644 inference-engine/tests/functional/plugin/myriad/ngraph/operations/static_shape_broadcast.cpp create mode 100644 inference-engine/tests/functional/plugin/myriad/ngraph/transformations/dynamic_to_static_shape_broadcast.cpp create mode 100644 inference-engine/tests/functional/plugin/myriad/ngraph/transformations/dynamic_to_static_shape_concat.cpp create mode 100644 inference-engine/tests/functional/plugin/myriad/ngraph/transformations/dynamic_to_static_shape_gather.cpp create mode 100644 inference-engine/tests/functional/plugin/myriad/ngraph/transformations/dynamic_to_static_shape_reshape.cpp create mode 100644 inference-engine/tests/functional/plugin/myriad/ngraph/transformations/dynamic_to_static_shape_shapeof.cpp create mode 100644 inference-engine/tests/functional/plugin/myriad/ngraph/transformations/dynamic_to_static_shape_variadic_split.cpp create mode 100644 inference-engine/tests/functional/plugin/myriad/shared_tests_instances/behavior/core_threading_tests.cpp create mode 100644 inference-engine/tests/functional/plugin/myriad/shared_tests_instances/single_layer_tests/proposal.cpp create mode 100644 inference-engine/tests/functional/plugin/myriad/single_layer_tests/static_shape_nonzero.cpp create mode 100644 inference-engine/tests/functional/plugin/myriad/subgraph_tests/dsr_concat.cpp create mode 100644 inference-engine/tests/functional/plugin/myriad/subgraph_tests/dsr_gather.cpp create mode 100644 inference-engine/tests/functional/plugin/myriad/subgraph_tests/dsr_reshape.cpp create mode 100644 inference-engine/tests/functional/plugin/myriad/subgraph_tests/dsr_variadic_split.cpp create mode 100644 inference-engine/tests/functional/plugin/myriad/subgraph_tests/nonzero_broadcast.cpp rename inference-engine/tests/functional/plugin/myriad/subgraph_tests/{dsr_transpose.cpp => nonzero_transpose.cpp} (71%) create mode 100644 inference-engine/tests/functional/plugin/shared/include/behavior/core_threading_tests.hpp create mode 100644 inference-engine/tests/functional/plugin/shared/include/single_layer_tests/proposal.hpp create mode 100644 inference-engine/tests/functional/plugin/shared/src/single_layer_tests/proposal.cpp rename inference-engine/{tests_deprecated/helpers => tests/ie_test_utils/common_test_utils}/test_assertions.hpp (68%) create mode 100644 inference-engine/tests/ngraph_functions/src/proposal.cpp create mode 100644 inference-engine/tests/unit/engines/vpu/split_large_kernel_conv_tests.cpp create mode 100644 inference-engine/tests_deprecated/functional/shared_tests/transformations/power_test.cpp delete mode 100644 inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_tensor_iterator_test.cpp delete mode 100644 inference-engine/tests_deprecated/helpers/tests_utils.hpp create mode 100644 inference-engine/thirdparty/clDNN/kernel_selector/core/actual_kernels/deconvolution/deconvolution_kernel_imad_along_f_tile_bfx.cpp create mode 100644 inference-engine/thirdparty/clDNN/kernel_selector/core/actual_kernels/deconvolution/deconvolution_kernel_imad_along_f_tile_bfx.hpp create mode 100644 inference-engine/thirdparty/clDNN/kernel_selector/core/actual_kernels/deconvolution/deconvolution_kernel_imad_ref.cpp create mode 100644 inference-engine/thirdparty/clDNN/kernel_selector/core/actual_kernels/deconvolution/deconvolution_kernel_imad_ref.hpp create mode 100644 inference-engine/thirdparty/clDNN/kernel_selector/core/cl_kernels/deconvolution_gpu_imad_along_f_tile_bfx.cl create mode 100644 inference-engine/thirdparty/clDNN/kernel_selector/core/cl_kernels/deconvolution_gpu_imad_common.cl create mode 100644 inference-engine/thirdparty/clDNN/kernel_selector/core/cl_kernels/deconvolution_gpu_imad_ref.cl delete mode 100644 inference-engine/thirdparty/clDNN/tests/test_cases/activation_grad_gpu_test.cpp create mode 100644 inference-engine/thirdparty/mkl-dnn/tests/gtests/test_convolution_depthwise_forward_bf16f32.cpp create mode 100644 inference-engine/thirdparty/mkl-dnn/tests/gtests/test_convolution_eltwise_forward_bf16.cpp create mode 100644 inference-engine/thirdparty/movidius/mvnc/tests/CMakeLists.txt create mode 100644 inference-engine/thirdparty/movidius/mvnc/tests/cases/mvnc_common_test_cases.cpp create mode 100644 inference-engine/thirdparty/movidius/mvnc/tests/cases/mvnc_common_test_cases.h create mode 100644 inference-engine/thirdparty/movidius/mvnc/tests/cases/mvnc_no_boot_test_cases.cpp create mode 100644 inference-engine/thirdparty/movidius/mvnc/tests/cases/mvnc_no_boot_test_cases.h create mode 100644 inference-engine/thirdparty/movidius/mvnc/tests/cases/mvnc_stress_test_cases.cpp create mode 100644 inference-engine/thirdparty/movidius/mvnc/tests/cases/mvnc_stress_test_cases.h create mode 100644 inference-engine/thirdparty/movidius/mvnc/tests/cases/mvnc_usb_test_cases.cpp create mode 100644 inference-engine/thirdparty/movidius/mvnc/tests/cases/mvnc_usb_test_cases.h create mode 100644 inference-engine/thirdparty/movidius/mvnc/tests/helpers/mvnc_test_helper.cpp create mode 100644 inference-engine/thirdparty/movidius/mvnc/tests/helpers/mvnc_test_helper.h create mode 100644 inference-engine/thirdparty/movidius/mvnc/tests/mvnc_no_boot_tests.cpp create mode 100644 inference-engine/thirdparty/movidius/mvnc/tests/mvnc_stress_tests.cpp create mode 100644 inference-engine/thirdparty/movidius/mvnc/tests/mvnc_tests_common.cpp create mode 100644 inference-engine/thirdparty/movidius/mvnc/tests/mvnc_tests_usb.cpp create mode 100644 inference-engine/thirdparty/movidius/mvnc/tests/mvnc_utils_tests.cpp create mode 100644 inference-engine/thirdparty/movidius/tests/CMakeLists.txt create mode 100644 inference-engine/thirdparty/movidius/tests/XLink/CMakeLists.txt create mode 100644 inference-engine/thirdparty/movidius/tests/XLink/XLink_common_tests.cpp create mode 100644 inference-engine/thirdparty/movidius/tests/XLink/XLink_deprecated_tests.cpp create mode 100644 inference-engine/thirdparty/movidius/tests/XLink/XLink_specific_tests.cpp create mode 100644 inference-engine/thirdparty/movidius/tests/XLink/cases/XLink_common_cases.cpp create mode 100644 inference-engine/thirdparty/movidius/tests/XLink/cases/XLink_common_cases.hpp create mode 100644 inference-engine/thirdparty/movidius/tests/XLink/cases/XLink_specific_cases.hpp create mode 100644 inference-engine/thirdparty/movidius/tests/XLink/helpers/XLink_tests_helpers.cpp create mode 100644 inference-engine/thirdparty/movidius/tests/XLink/helpers/XLink_tests_helpers.hpp create mode 100644 inference-engine/tools/cross_check_tool/README.md create mode 100644 inference-engine/tools/cross_check_tool/__init__.py create mode 100644 inference-engine/tools/cross_check_tool/cross_check_tool.py create mode 100644 inference-engine/tools/cross_check_tool/requirements.txt create mode 100644 inference-engine/tools/cross_check_tool/utils.py create mode 100644 inference-engine/tools/package_BOM.txt create mode 100644 model-optimizer/extensions/back/CorrectName.py create mode 100644 model-optimizer/extensions/front/GeLUMerger_Tanh.py create mode 100644 model-optimizer/extensions/front/GeLUMerger_test.py create mode 100644 model-optimizer/extensions/front/onnx/softmaxONNX_to_softmax.py create mode 100644 model-optimizer/extensions/front/rank_decomposer_test.py create mode 100644 model-optimizer/extensions/front/tf/size_replacer_test.py create mode 100644 model-optimizer/extensions/middle/SliceLikeToStridedSlice.py create mode 100644 model-optimizer/extensions/middle/SliceLikeToStridedSlice_test.py delete mode 100644 model-optimizer/extensions/middle/UselessStridedSlice.py delete mode 100644 model-optimizer/extensions/middle/UselessStridedSlice_test.py delete mode 100644 model-optimizer/extensions/ops/Log.py delete mode 100644 model-optimizer/extensions/ops/exp.py delete mode 100644 model-optimizer/extensions/ops/exp_test.py create mode 100644 model-optimizer/extensions/ops/non_max_suppression_test.py create mode 100644 model-optimizer/extensions/ops/slice_like.py create mode 100644 model-optimizer/extensions/ops/slice_like_test.py create mode 100644 model-optimizer/extensions/ops/topk_test.py create mode 100644 model-optimizer/install_prerequisites/protobuf-3.6.1-py3.5-win-amd64.egg create mode 100644 model-optimizer/install_prerequisites/protobuf-3.6.1-py3.6-win-amd64.egg create mode 100644 model-optimizer/install_prerequisites/protobuf-3.6.1-py3.7-win-amd64.egg create mode 100644 model-optimizer/mo/utils/broadcasting.py create mode 100644 model-optimizer/mo/utils/broadcasting_test.py create mode 100644 model-optimizer/mo/utils/get_ov_update_message.py create mode 100644 model-optimizer/mo/utils/ir_reader/extenders/non_max_suppression_extender.py create mode 100644 model-optimizer/mo/utils/ir_reader/extenders/shape_of_extender.py create mode 100644 tests/stress_tests/.automation/memcheck_pregen_irs_tests/nightly_configs/desktop_env_config.xml create mode 100644 tests/stress_tests/.automation/memcheck_pregen_irs_tests/nightly_configs/desktop_references_config.xml create mode 100644 tests/stress_tests/.automation/memcheck_pregen_irs_tests/nightly_configs/desktop_test_config.xml create mode 100644 tests/stress_tests/.automation/memcheck_pregen_irs_tests/weekly_configs/desktop_env_config.xml create mode 100644 tests/stress_tests/.automation/memcheck_pregen_irs_tests/weekly_configs/desktop_references_config.xml create mode 100644 tests/stress_tests/.automation/memcheck_pregen_irs_tests/weekly_configs/desktop_test_config.xml create mode 100644 tests/stress_tests/.automation/memcheck_tests/nightly_configs/desktop_env_config.xml create mode 100644 tests/stress_tests/.automation/memcheck_tests/weekly_configs/desktop_env_config.xml create mode 100644 tests/stress_tests/.automation/memleaks_tests/nightly_configs/desktop_env_config.xml create mode 100644 tests/stress_tests/.automation/memleaks_tests/weekly_configs/desktop_env_config.xml create mode 100644 tests/stress_tests/.automation/unittests/nightly_configs/desktop_env_config.xml create mode 100644 tests/stress_tests/.automation/unittests/weekly_configs/desktop_env_config.xml create mode 100644 tests/stress_tests/scripts/__init__.py create mode 100644 tests/stress_tests/scripts/memcheck_upload.py create mode 100644 tests/stress_tests/scripts/requirements.txt diff --git a/.clang-format b/.clang-format deleted file mode 100644 index b78e96de1d4..00000000000 --- a/.clang-format +++ /dev/null @@ -1,19 +0,0 @@ -BasedOnStyle: Google -IndentWidth: 4 -UseTab: Never ---- -Language: Cpp -Standard: Cpp11 - -AccessModifierOffset: -4 -AllowAllArgumentsOnNextLine: false -AllowShortFunctionsOnASingleLine: Empty -AllowShortLambdasOnASingleLine: Empty -AlwaysBreakBeforeMultilineStrings: false -ColumnLimit: 120 -DerivePointerAlignment: false -FixNamespaceComments: true -IndentCaseLabels: false -SpaceBeforeCpp11BracedList: true -SpaceBeforeCtorInitializerColon: false ---- diff --git a/.coveragerc b/.coveragerc deleted file mode 100644 index ce0be58aa66..00000000000 --- a/.coveragerc +++ /dev/null @@ -1,39 +0,0 @@ -# .coveragerc to control coverage.py -[run] -branch = True - -source = - mo/ - mo.py - -omit = - # omit anything in a .local directory anywhere - */.local/* - # omit everything in /usr - /usr/* - # omit tests - */test_*.py - # init scripts - */__init__.py - -[report] -# Regexes for lines to exclude from consideration -exclude_lines = - # Have to re-enable the standard pragma - pragma: no cover - - # Don't complain about missing debug-only code: - def __repr__ - - # Don't complain if tests don't hit defensive assertion code: - raise AssertionError - raise NotImplementedError - - # Don't complain if non-runnable code isn't run: - if 0: - if __name__ == .__main__.: - -ignore_errors = True - -[html] -directory = htmlcov \ No newline at end of file diff --git a/.gitignore b/.gitignore index 547ae62881b..867e60e941b 100644 --- a/.gitignore +++ b/.gitignore @@ -3,7 +3,7 @@ _* # but ensure we don't skip __init__.py !__init__.py # developer tools -.idea +*.idea .vscode cmake-build-debug cmake-build-release @@ -18,7 +18,41 @@ build/ doc/ docs/build_documentation/work_dir/ inference-engine/plugins/ +inference-engine/temp +inference-engine/report .repo/ docs/template_plugin/html/ CMakeLists.txt.user docs/IE_PLUGIN_DG/html/ + +*.project +*.cproject +*.pydevproject +*.settings +*/gen/ +__pycache__ +*.swp +/config.xml + +# Python-specific +*.env3 +*.pyc + +# Tests-specific +*.coverage +*htmlcov +*pylint_report.txt +*pylint_report_comments.txt + +# Artifacts +/model-optimizer/*.bin +/model-optimizer/*.xml +/model-optimizer/*.json +/model-optimizer/*.so +/model-optimizer/*.txt +/model-optimizer/*.pb +/model-optimizer/*.pbtxt +/model-optimizer/!CMakeLists.txt +/model-optimizer/*.mapping +/model-optimizer/*.dat +/model-optimizer/*.svg \ No newline at end of file diff --git a/CMakeLists.txt b/CMakeLists.txt index 08cb5ab4574..a90c0100684 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -15,7 +15,6 @@ else() cmake_minimum_required(VERSION 3.7.2 FATAL_ERROR) endif() - project(OpenVINO) set(OpenVINO_MAIN_SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}) @@ -26,7 +25,7 @@ include(CTest) include(features) # include developer package -include(developer_package NO_POLICY_SCOPE) +include(developer_package) # These options are shared with 3rdparty plugins # by means of developer package @@ -37,7 +36,7 @@ include(dependencies) message (STATUS "PROJECT ............................... " ${PROJECT_NAME}) message (STATUS "CMAKE_BINARY_DIR ...................... " ${CMAKE_BINARY_DIR}) message (STATUS "OpenVINO_MAIN_SOURCE_DIR .............. " ${OpenVINO_MAIN_SOURCE_DIR}) -message (STATUS "IE_MAIN_SOURCE_DIR .............. " ${IE_MAIN_SOURCE_DIR}) +message (STATUS "IE_MAIN_SOURCE_DIR .................... " ${IE_MAIN_SOURCE_DIR}) message (STATUS "CMAKE_GENERATOR ....................... " ${CMAKE_GENERATOR}) message (STATUS "CMAKE_C_COMPILER_ID ................... " ${CMAKE_C_COMPILER_ID}) message (STATUS "CMAKE_BUILD_TYPE ...................... " ${CMAKE_BUILD_TYPE}) @@ -76,7 +75,7 @@ function(build_ngraph) if (NOT ANDROID) ngraph_set(NGRAPH_UNIT_TEST_ENABLE TRUE) - ngraph_set(NGRAPH_UNIT_TEST_OPENVINO_ENABLE TRUE) + ngraph_set(NGRAPH_IE_ENABLE TRUE) ngraph_set(NGRAPH_ONNX_IMPORT_ENABLE TRUE) else() ngraph_set(NGRAPH_UNIT_TEST_ENABLE FALSE) @@ -85,7 +84,7 @@ function(build_ngraph) ngraph_set(NGRAPH_ONNX_IMPORT_ENABLE FALSE) endif() - if(CMAKE_CXX_COMPILER_ID MATCHES "Clang") + if(CMAKE_CXX_COMPILER_ID MATCHES "^(Apple)?Clang$") ie_add_compiler_flags(-Wno-error=uninitialized -Wno-error=literal-conversion) elseif(UNIX) ie_add_compiler_flags(-Wno-error=maybe-uninitialized -Wno-error=return-type -fPIC) diff --git a/cmake/check_features.cmake b/cmake/check_features.cmake index eef993fa598..319bc8877f3 100644 --- a/cmake/check_features.cmake +++ b/cmake/check_features.cmake @@ -20,14 +20,14 @@ if (NOT ENABLE_MKL_DNN) endif() if(ENABLE_AVX512F) - if ((CMAKE_CXX_COMPILER_ID MATCHES MSVC) AND (MSVC_VERSION VERSION_LESS 1920)) + if ((CMAKE_CXX_COMPILER_ID STREQUAL "MSVC") AND (MSVC_VERSION VERSION_LESS 1920)) # 1920 version of MSVC 2019. In MSVC 2017 AVX512F not work set(ENABLE_AVX512F OFF CACHE BOOL "" FORCE) endif() - if (CMAKE_CXX_COMPILER_ID MATCHES Clang) + if (CMAKE_CXX_COMPILER_ID MATCHES "^(Apple)?Clang$") set(ENABLE_AVX512F OFF CACHE BOOL "" FORCE) endif() - if ((CMAKE_CXX_COMPILER_ID STREQUAL GNU) AND (NOT (CMAKE_CXX_COMPILER_VERSION VERSION_GREATER 4.9))) + if ((CMAKE_CXX_COMPILER_ID STREQUAL "GNU") AND (NOT (CMAKE_CXX_COMPILER_VERSION VERSION_GREATER 4.9))) set(ENABLE_AVX512F OFF CACHE BOOL "" FORCE) endif() endif() diff --git a/cmake/developer_package.cmake b/cmake/developer_package.cmake index c7a43b40b0e..58f80add212 100644 --- a/cmake/developer_package.cmake +++ b/cmake/developer_package.cmake @@ -143,7 +143,10 @@ if("${CMAKE_BUILD_TYPE}" STREQUAL "") set(CMAKE_BUILD_TYPE "Release") endif() -set(OUTPUT_ROOT ${OpenVINO_MAIN_SOURCE_DIR}) +# allow to override default OUTPUT_ROOT root +if(NOT DEFINED OUTPUT_ROOT) + set(OUTPUT_ROOT ${OpenVINO_MAIN_SOURCE_DIR}) +endif() # Enable postfixes for Debug/Release builds set(IE_DEBUG_POSTFIX_WIN "d") @@ -206,8 +209,10 @@ endif() # Use solution folders set_property(GLOBAL PROPERTY USE_FOLDERS ON) +set(CMAKE_POLICY_DEFAULT_CMP0054 NEW) + include(sdl) -include(os_flags NO_POLICY_SCOPE) +include(os_flags) include(sanitizer) function(set_ci_build_number) diff --git a/cmake/fuzzing.cmake b/cmake/fuzzing.cmake index abc9114e2a7..4e62429f9a6 100644 --- a/cmake/fuzzing.cmake +++ b/cmake/fuzzing.cmake @@ -4,7 +4,7 @@ function(enable_fuzzing) # Enable (libFuzzer)[https://llvm.org/docs/LibFuzzer.html] if supported. - if(CMAKE_CXX_COMPILER_ID MATCHES "Clang" AND NOT WIN32) + if(CMAKE_CXX_COMPILER_ID MATCHES "^(Apple)?Clang$" AND NOT WIN32) # Communicate libfuzzer is enabled set(WITH_LIBFUZZER ON PARENT_SCOPE) add_compile_definitions(WITH_LIBFUZZER) diff --git a/cmake/os_flags.cmake b/cmake/os_flags.cmake index a91c4641ee9..72ca685a8a1 100644 --- a/cmake/os_flags.cmake +++ b/cmake/os_flags.cmake @@ -8,13 +8,13 @@ # macro(disable_deprecated_warnings) if(WIN32) - if(CMAKE_CXX_COMPILER_ID MATCHES Intel) + if(CMAKE_CXX_COMPILER_ID STREQUAL "Intel") set(ie_c_cxx_deprecated "/Qdiag-disable:1478,1786") - elseif(CMAKE_CXX_COMPILER_ID MATCHES MSVC) + elseif(CMAKE_CXX_COMPILER_ID STREQUAL "MSVC") set(ie_c_cxx_deprecated "/wd4996") endif() else() - if(CMAKE_CXX_COMPILER_ID STREQUAL Intel) + if(CMAKE_CXX_COMPILER_ID STREQUAL "Intel") set(ie_c_cxx_deprecated "-diag-disable=1478,1786") else() set(ie_c_cxx_deprecated "-Wno-deprecated-declarations") @@ -35,13 +35,13 @@ endmacro() # macro(ie_deprecated_no_errors) if(WIN32) - if(CMAKE_CXX_COMPILER_ID MATCHES Intel) + if(CMAKE_CXX_COMPILER_ID STREQUAL "Intel") set(ie_c_cxx_deprecated "/Qdiag-warning:1478,1786") - elseif(CMAKE_CXX_COMPILER_ID MATCHES MSVC) + elseif(CMAKE_CXX_COMPILER_ID STREQUAL "MSVC") set(ie_c_cxx_deprecated "/wd4996") endif() else() - if(CMAKE_CXX_COMPILER_ID MATCHES Intel) + if(CMAKE_CXX_COMPILER_ID STREQUAL "Intel") set(ie_c_cxx_deprecated_no_errors "-diag-warning=1478,1786") else() set(ie_c_cxx_deprecated_no_errors "-Wno-error=deprecated-declarations") @@ -61,15 +61,15 @@ endmacro() # function(ie_sse42_optimization_flags flags) if(WIN32) - if(CMAKE_CXX_COMPILER_ID MATCHES MSVC) + if(CMAKE_CXX_COMPILER_ID STREQUAL "MSVC") # No such option for MSVC 2019 - elseif(CMAKE_CXX_COMPILER_ID STREQUAL Intel) + elseif(CMAKE_CXX_COMPILER_ID STREQUAL "Intel") set(${flags} "/arch:SSE4.2 /QxSSE4.2" PARENT_SCOPE) else() message(WARNING "Unsupported CXX compiler ${CMAKE_CXX_COMPILER_ID}") endif() else() - if(CMAKE_CXX_COMPILER_ID STREQUAL Intel) + if(CMAKE_CXX_COMPILER_ID STREQUAL "Intel") set(${flags} "-msse4.2 -xSSE4.2" PARENT_SCOPE) else() set(${flags} "-msse4.2" PARENT_SCOPE) @@ -82,15 +82,15 @@ endfunction() # function(ie_avx2_optimization_flags flags) if(WIN32) - if(CMAKE_CXX_COMPILER_ID STREQUAL Intel) + if(CMAKE_CXX_COMPILER_ID STREQUAL "Intel") set(${flags} "/QxCORE-AVX2" PARENT_SCOPE) - elseif(CMAKE_CXX_COMPILER_ID MATCHES MSVC) + elseif(CMAKE_CXX_COMPILER_ID STREQUAL "MSVC") set(${flags} "/arch:AVX2" PARENT_SCOPE) else() message(WARNING "Unsupported CXX compiler ${CMAKE_CXX_COMPILER_ID}") endif() else() - if(CMAKE_CXX_COMPILER_ID STREQUAL Intel) + if(CMAKE_CXX_COMPILER_ID STREQUAL "Intel") set(${flags} "-march=core-avx2 -xCORE-AVX2 -mtune=core-avx2" PARENT_SCOPE) else() set(${flags} "-mavx2 -mfma" PARENT_SCOPE) @@ -104,18 +104,18 @@ endfunction() # function(ie_avx512_optimization_flags flags) if(WIN32) - if(CMAKE_CXX_COMPILER_ID STREQUAL Intel) + if(CMAKE_CXX_COMPILER_ID STREQUAL "Intel") set(${flags} "/QxCOMMON-AVX512" PARENT_SCOPE) - elseif(CMAKE_CXX_COMPILER_ID MATCHES MSVC) + elseif(CMAKE_CXX_COMPILER_ID STREQUAL "MSVC") set(${flags} "/arch:AVX512" PARENT_SCOPE) else() message(WARNING "Unsupported CXX compiler ${CMAKE_CXX_COMPILER_ID}") endif() else() - if(CMAKE_CXX_COMPILER_ID STREQUAL Intel) + if(CMAKE_CXX_COMPILER_ID STREQUAL "Intel") set(${flags} "-xCOMMON-AVX512" PARENT_SCOPE) endif() - if(CMAKE_CXX_COMPILER_ID STREQUAL GNU) + if(CMAKE_CXX_COMPILER_ID STREQUAL "GNU") set(${flags} "-mavx512f -mfma" PARENT_SCOPE) endif() endif() @@ -138,12 +138,12 @@ macro(ie_enable_lto) set(CMAKE_RANLIB "gcc-ranlib") endif() elseif(WIN32) - if(CMAKE_BUILD_TYPE STREQUAL Release) - # set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /GL") - # set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} /GL") - # set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} /LTCG:STATUS") - # set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} /LTCG:STATUS") - # set(CMAKE_MODULE_LINKER_FLAGS "${CMAKE_MODULE_LINKER_FLAGS} /LTCG:STATUS") + if(CMAKE_BUILD_TYPE STREQUAL "Release") + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /GL") + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} /GL") + set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} /LTCG:STATUS") + set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} /LTCG:STATUS") + set(CMAKE_MODULE_LINKER_FLAGS "${CMAKE_MODULE_LINKER_FLAGS} /LTCG:STATUS") endif() endif() endmacro() @@ -167,7 +167,7 @@ set(THREADS_PREFER_PTHREAD_FLAG ON) # to allows to override CMAKE_CXX_STANDARD from command line if(NOT DEFINED CMAKE_CXX_STANDARD) - if(CMAKE_CXX_COMPILER_ID MATCHES MSVC) + if(CMAKE_CXX_COMPILER_ID STREQUAL "MSVC") set(CMAKE_CXX_STANDARD 14) else() set(CMAKE_CXX_STANDARD 11) @@ -176,7 +176,7 @@ if(NOT DEFINED CMAKE_CXX_STANDARD) set(CMAKE_CXX_STANDARD_REQUIRED ON) endif() -if(COVERAGE) +if(ENABLE_COVERAGE) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} --coverage") set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} --coverage") set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} --coverage") @@ -198,10 +198,10 @@ if(WIN32) set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} /LARGEADDRESSAWARE") if (TREAT_WARNING_AS_ERROR) - if(CMAKE_CXX_COMPILER_ID MATCHES Intel) + if(CMAKE_CXX_COMPILER_ID STREQUAL "Intel") ie_add_compiler_flags(/WX) ie_add_compiler_flags(/Qdiag-warning:47,1740,1786) - elseif (CMAKE_CXX_COMPILER_ID MATCHES MSVC) + elseif (CMAKE_CXX_COMPILER_ID STREQUAL "MSVC") # ie_add_compiler_flags(/WX) # Too many warnings endif() endif() @@ -212,14 +212,14 @@ if(WIN32) # Disable noisy warnings - if(CMAKE_CXX_COMPILER_ID MATCHES MSVC) + if(CMAKE_CXX_COMPILER_ID STREQUAL "MSVC") # C4251 needs to have dll-interface to be used by clients of class ie_add_compiler_flags(/wd4251) # C4275 non dll-interface class used as base for dll-interface class ie_add_compiler_flags(/wd4275) endif() - if(CMAKE_CXX_COMPILER_ID MATCHES Intel) + if(CMAKE_CXX_COMPILER_ID STREQUAL "Intel") # 161 unrecognized pragma # 177 variable was declared but never referenced # 556 not matched type of assigned function pointer @@ -236,20 +236,6 @@ if(WIN32) set(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} /Z7") set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} /Z7") - - if(ENABLE_DEBUG_SYMBOLS) - ie_add_compiler_flags(/Z7) - - set(DEBUG_SYMBOLS_LINKER_FLAGS "/DEBUG") - if (CMAKE_BUILD_TYPE STREQUAL "Release") - # Keep default /OPT values. See /DEBUG reference for details. - set(DEBUG_SYMBOLS_LINKER_FLAGS "${DEBUG_SYMBOLS_LINKER_FLAGS} /OPT:REF /OPT:ICF") - endif() - - set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} ${DEBUG_SYMBOLS_LINKER_FLAGS}") - set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} ${DEBUG_SYMBOLS_LINKER_FLAGS}") - set(CMAKE_MODULE_LINKER_FLAGS "${CMAKE_MODULE_LINKER_FLAGS} ${DEBUG_SYMBOLS_LINKER_FLAGS}") - endif() else() # TODO: enable for C sources as well # ie_add_compiler_flags(-Werror) diff --git a/cmake/sanitizer.cmake b/cmake/sanitizer.cmake index 047f370befe..a0103788a1c 100644 --- a/cmake/sanitizer.cmake +++ b/cmake/sanitizer.cmake @@ -14,7 +14,7 @@ if (ENABLE_SANITIZER) set(SANITIZER_LINKER_FLAGS "-fsanitize=address") if(CMAKE_CXX_COMPILER_ID STREQUAL "GNU") set(SANITIZER_LINKER_FLAGS "${SANITIZER_LINKER_FLAGS} -fuse-ld=gold") - elseif(CMAKE_CXX_COMPILER_ID MATCHES "Clang" AND NOT WIN32) + elseif(CMAKE_CXX_COMPILER_ID MATCHES "^(Apple)?Clang$" AND NOT WIN32) set(SANITIZER_LINKER_FLAGS "${SANITIZER_LINKER_FLAGS} -fuse-ld=lld") endif() @@ -26,9 +26,8 @@ if (ENABLE_SANITIZER) endif() if (ENABLE_THREAD_SANITIZER) - set(SANITIZER_COMPILER_FLAGS "-g -fsanitize=thread") - - set(SANITIZER_LINKER_FLAGS "-fsanitize=thread") + set(SANITIZER_COMPILER_FLAGS "-g -fsanitize=thread -fno-omit-frame-pointer") + set(SANITIZER_LINKER_FLAGS "-fsanitize=thread -static-libsan") set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${SANITIZER_COMPILER_FLAGS}") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${SANITIZER_COMPILER_FLAGS}") diff --git a/cmake/sdl.cmake b/cmake/sdl.cmake index 5c56528576b..27ed08a4d12 100644 --- a/cmake/sdl.cmake +++ b/cmake/sdl.cmake @@ -25,7 +25,7 @@ if (CMAKE_BUILD_TYPE STREQUAL "Release") if (NOT ENABLE_SANITIZER) set(IE_C_CXX_FLAGS "${IE_C_CXX_FLAGS} -s") endif() - elseif(CMAKE_CXX_COMPILER_ID MATCHES "Clang") + elseif(CMAKE_CXX_COMPILER_ID MATCHES "^(Apple)?Clang$") set(IE_C_CXX_FLAGS "${IE_C_CXX_FLAGS} -fstack-protector-all") elseif(CMAKE_CXX_COMPILER_ID STREQUAL "Intel") if (NOT ENABLE_SANITIZER) @@ -36,7 +36,7 @@ if (CMAKE_BUILD_TYPE STREQUAL "Release") set(CMAKE_MODULE_LINKER_FLAGS_RELEASE "${CMAKE_MODULE_LINKER_FLAGS_RELEASE} -z noexecstack -z relro -z now") set(CMAKE_EXE_LINKER_FLAGS_RELEASE "${CMAKE_EXE_LINKER_FLAGS_RELEASE} -z noexecstack -z relro -z now") endif() - elseif(CMAKE_CXX_COMPILER_ID MATCHES MSVC) + elseif(CMAKE_CXX_COMPILER_ID STREQUAL "MSVC") set(IE_C_CXX_FLAGS "${IE_C_CXX_FLAGS} /sdl") endif() diff --git a/cmake/target_flags.cmake b/cmake/target_flags.cmake index 1c89c096486..506f7d8728b 100644 --- a/cmake/target_flags.cmake +++ b/cmake/target_flags.cmake @@ -7,7 +7,7 @@ if(CMAKE_CL_64) set(MSVC64 ON) endif() -if(WIN32 AND CMAKE_CXX_COMPILER_ID MATCHES "GNU") +if(WIN32 AND CMAKE_CXX_COMPILER_ID STREQUAL "GNU") execute_process(COMMAND ${CMAKE_CXX_COMPILER} -dumpmachine OUTPUT_VARIABLE OPENVINO_GCC_TARGET_MACHINE OUTPUT_STRIP_TRAILING_WHITESPACE) diff --git a/.editorconfig b/inference-engine/.editorconfig similarity index 100% rename from .editorconfig rename to inference-engine/.editorconfig diff --git a/inference-engine/CMakeLists.txt b/inference-engine/CMakeLists.txt index efdb2635f79..52b94b11d42 100644 --- a/inference-engine/CMakeLists.txt +++ b/inference-engine/CMakeLists.txt @@ -188,7 +188,7 @@ configure_file( # Coverage # -if(COVERAGE) +if(ENABLE_COVERAGE) include(coverage_ie) endif() diff --git a/inference-engine/cmake/coverage_ie.cmake b/inference-engine/cmake/coverage_ie.cmake index 79eb496b16b..f288246bde2 100644 --- a/inference-engine/cmake/coverage_ie.cmake +++ b/inference-engine/cmake/coverage_ie.cmake @@ -13,14 +13,17 @@ ie_coverage_capture(INFO_FILE "dldt" # Generate reports -ie_coverage_extract(INPUT "dldt" OUTPUT "inference_engine_with_builders" +ie_coverage_extract(INPUT "dldt" OUTPUT "inference_engine" PATTERNS "${DLDT_COVERAGE_BASE_DIRECTORY}/inference_engine/*" "${DLDT_COVERAGE_BASE_DIRECTORY}/plugin_api/*") -ie_coverage_remove(INPUT "inference_engine_with_builders" OUTPUT "inference_engine" - PATTERNS "${DLDT_COVERAGE_BASE_DIRECTORY}/inference_engine/builders/*") ie_coverage_genhtml(INFO_FILE "inference_engine" PREFIX "${DLDT_COVERAGE_BASE_DIRECTORY}") +ie_coverage_extract(INPUT "dldt" OUTPUT "inference_engine_ir_reader" + PATTERNS "${DLDT_COVERAGE_BASE_DIRECTORY}/ir_readers/*") +ie_coverage_genhtml(INFO_FILE "inference_engine_ir_reader" + PREFIX "${DLDT_COVERAGE_BASE_DIRECTORY}") + ie_coverage_extract(INPUT "dldt" OUTPUT "inference_engine_legacy" PATTERNS "${DLDT_COVERAGE_BASE_DIRECTORY}/legacy_api/*") ie_coverage_genhtml(INFO_FILE "inference_engine_legacy" diff --git a/inference-engine/cmake/cpplint.cmake b/inference-engine/cmake/cpplint.cmake index 9e279ff239d..6c58d4aa532 100644 --- a/inference-engine/cmake/cpplint.cmake +++ b/inference-engine/cmake/cpplint.cmake @@ -3,10 +3,10 @@ # if(ENABLE_CPPLINT) - find_host_package(PythonInterp) + find_package(Python3 COMPONENTS Interpreter) - if(NOT PYTHONINTERP_FOUND) - message(WARNING "Python interpreter was not found (required for cpplint check)") + if(NOT Python3_Interpreter_FOUND) + message(WARNING "Python3 interpreter was not found (required for cpplint check)") set(ENABLE_CPPLINT OFF) endif() endif() diff --git a/inference-engine/cmake/developer_package_config.cmake.in b/inference-engine/cmake/developer_package_config.cmake.in index 93a27cb0e35..5600af6dfb8 100644 --- a/inference-engine/cmake/developer_package_config.cmake.in +++ b/inference-engine/cmake/developer_package_config.cmake.in @@ -25,6 +25,8 @@ endforeach() message("") set(gflags_DIR "@gflags_BINARY_DIR@") +# GNA lib dir +set(GNA "@GNA@") # Targets @@ -43,7 +45,7 @@ list(APPEND CMAKE_MODULE_PATH "${OpenVINO_MAIN_SOURCE_DIR}/cmake") list(APPEND CMAKE_MODULE_PATH "${IE_MAIN_SOURCE_DIR}/cmake") # generic stuff from developer package -include(developer_package NO_POLICY_SCOPE) +include(developer_package) include(developer_package_ie) # Don't threat deprecated API warnings as errors in 3rd party apps diff --git a/inference-engine/cmake/features_ie.cmake b/inference-engine/cmake/features_ie.cmake index 82f1a850ba7..e5b022c4a7b 100644 --- a/inference-engine/cmake/features_ie.cmake +++ b/inference-engine/cmake/features_ie.cmake @@ -62,8 +62,6 @@ if (ENABLE_GNA) endif() endif() -ie_option (ENABLE_IR_READER "Compile with IR readers / parsers" ON) - ie_option (ENABLE_VPU "vpu targeted plugins for inference engine" ON) ie_dependent_option (ENABLE_MYRIAD "myriad targeted plugin for inference engine" ON "ENABLE_VPU" OFF) @@ -72,7 +70,7 @@ ie_dependent_option (ENABLE_MYRIAD_NO_BOOT "myriad plugin will skip device boot" ie_option (ENABLE_TESTS "unit, behavior and functional tests" OFF) -ie_dependent_option (ENABLE_GAPI_TESTS "tests for GAPI kernels" OFF "ENABLE_TESTS" OFF) +ie_dependent_option (ENABLE_GAPI_TESTS "tests for GAPI kernels" ON "ENABLE_TESTS" OFF) ie_dependent_option (GAPI_TEST_PERF "if GAPI unit tests should examine performance" OFF "ENABLE_GAPI_TESTS" OFF) @@ -84,7 +82,7 @@ ie_dependent_option (ENABLE_SAME_BRANCH_FOR_MODELS "uses same branch for models ie_dependent_option (ENABLE_BEH_TESTS "tests oriented to check inference engine API corecteness" ON "ENABLE_TESTS" OFF) -ie_dependent_option (ENABLE_FUNCTIONAL_TESTS "functional tests" ON "ENABLE_TESTS;ENABLE_IR_READER" OFF) +ie_dependent_option (ENABLE_FUNCTIONAL_TESTS "functional tests" ON "ENABLE_TESTS" OFF) ie_dependent_option (ENABLE_SAMPLES "console samples are part of inference engine package" ON "NOT MINGW" OFF) @@ -98,18 +96,15 @@ ie_option (ENABLE_ALTERNATIVE_TEMP "in case of dependency conflict, to avoid mod ie_option (ENABLE_OPENCV "enables OpenCV" ON) -ie_option (ENABLE_DEBUG_SYMBOLS "generates symbols for debugging" OFF) - ie_option (ENABLE_PYTHON "enables ie python bridge build" OFF) -ie_option (ENABLE_CPP_CCT "enables C++ version of Cross Check Tool" OFF) - ie_option (ENABLE_C "enables ie c bridge build" ON) -ie_dependent_option(ENABLE_CPPLINT "Enable cpplint checks during the build" OFF "UNIX;NOT APPLE;NOT ANDROID" OFF) +ie_dependent_option(ENABLE_CPPLINT "Enable cpplint checks during the build" ON "UNIX;NOT APPLE;NOT ANDROID" OFF) + ie_dependent_option(ENABLE_CPPLINT_REPORT "Build cpplint report instead of failing the build" OFF "ENABLE_CPPLINT" OFF) -ie_option(ENABLE_CLANG_FORMAT "Enable clang-format checks during the build" OFF) +ie_option(ENABLE_CLANG_FORMAT "Enable clang-format checks during the build" ON) set(IE_EXTRA_PLUGINS "" CACHE STRING "Extra paths for plugins to include into DLDT build tree") diff --git a/inference-engine/cmake/models.cmake b/inference-engine/cmake/models.cmake index 3203068c86a..cb705dc1e1a 100644 --- a/inference-engine/cmake/models.cmake +++ b/inference-engine/cmake/models.cmake @@ -34,6 +34,10 @@ function (add_models_repo add_to_fetcher model_name) endfunction() function(add_lfs_repo name prefix url tag) + if(TARGET ${name}) + return() + endif() + ExternalProject_Add(${name} PREFIX ${prefix} GIT_REPOSITORY ${url} diff --git a/inference-engine/cmake/share/InferenceEngineConfig.cmake.in b/inference-engine/cmake/share/InferenceEngineConfig.cmake.in index ff273104bee..d3fc9f88304 100644 --- a/inference-engine/cmake/share/InferenceEngineConfig.cmake.in +++ b/inference-engine/cmake/share/InferenceEngineConfig.cmake.in @@ -150,7 +150,7 @@ else() set_target_properties(IE::inference_engine${ie_library_suffix} PROPERTIES IMPORTED_LOCATION "${IE${ie_library_usuffix}_RELEASE_LIBRARY}" INTERFACE_INCLUDE_DIRECTORIES "${IE_INCLUDE_DIR}") - if(CMAKE_CXX_COMPILER_ID MATCHES Intel) + if(CMAKE_CXX_COMPILER_ID STREQUAL "Intel") set_target_properties(IE::inference_engine${ie_library_suffix} PROPERTIES INTERFACE_COMPILE_OPTIONS "-diag-warning=1786") else() diff --git a/inference-engine/ie_bridges/c/samples/object_detection_sample_ssd/main.c b/inference-engine/ie_bridges/c/samples/object_detection_sample_ssd/main.c index f8699893080..3ac570fe401 100644 --- a/inference-engine/ie_bridges/c/samples/object_detection_sample_ssd/main.c +++ b/inference-engine/ie_bridges/c/samples/object_detection_sample_ssd/main.c @@ -105,9 +105,9 @@ void readInputFilesArgument(const char *arg) { const char *fileName = ep->d_name; if (strcmp(fileName, ".") == 0 || strcmp(fileName, "..") == 0) continue; char *file_path = (char *)calloc(strlen(arg) + strlen(ep->d_name) + 2, sizeof(char)); - strcpy(file_path, arg); - strcat(file_path, "/"); - strcat(file_path, ep->d_name); + memcpy(file_path, arg, strlen(arg)); + memcpy(file_path + strlen(arg), "/", strlen("/")); + memcpy(file_path + strlen(arg) + strlen("/"), ep->d_name, strlen(ep->d_name) + 1); if (file_num == 0) { file_paths = (char **)calloc(1, sizeof(char *)); @@ -131,7 +131,7 @@ void readInputFilesArgument(const char *arg) { dp = NULL; } else { char *file_path = (char *)calloc(strlen(arg) + 1, sizeof(char)); - strcpy(file_path, arg); + memcpy(file_path, arg, strlen(arg) + 1); if (file_num == 0) { file_paths = (char **)calloc(1, sizeof(char *)); } @@ -187,8 +187,8 @@ ie_config_t *parseConfig(const char *config_file, char comment) { if (fscanf(file, "%s", key)!= EOF && fscanf(file, "%s", value) != EOF) { char *cfg_name = (char *)calloc(strlen(key) + 1, sizeof(char)); char *cfg_value = (char *)calloc(strlen(value) + 1, sizeof(char)); - strcpy(cfg_name, key); - strcpy(cfg_value, value); + memcpy(cfg_name, key, strlen(key) + 1); + memcpy(cfg_value, value, strlen(value) + 1); ie_config_t *cfg_t = (ie_config_t *)calloc(1, sizeof(ie_config_t)); cfg_t->name = cfg_name; cfg_t->value = cfg_value; @@ -203,8 +203,8 @@ ie_config_t *parseConfig(const char *config_file, char comment) { } char *cfg_name = (char *)calloc(strlen(key) + 1, sizeof(char)); char *cfg_value = (char *)calloc(strlen(value) + 1, sizeof(char)); - strcpy(cfg_name, key); - strcpy(cfg_value, value); + memcpy(cfg_name, key, strlen(key) + 1); + memcpy(cfg_value, value, strlen(value) + 1); ie_config_t *cfg_t = (ie_config_t *)calloc(1, sizeof(ie_config_t)); cfg_t->name = cfg_name; cfg_t->value = cfg_value; @@ -345,8 +345,8 @@ int main(int argc, char **argv) { // --------------------------- 4. Read IR Generated by ModelOptimizer (.xml and .bin files) ------------ input_weight = (char *)calloc(strlen(input_model) + 1, sizeof(char)); - strncpy(input_weight, input_model, strlen(input_model)-4); - strcat(input_weight, ".bin"); + memcpy(input_weight, input_model, strlen(input_model) - 4); + memcpy(input_weight + strlen(input_model) - 4, ".bin", strlen(".bin") + 1); printf("%sLoading network files:\n", info); printf("\t%s\n", input_model); printf("\t%s\n", input_weight); @@ -680,9 +680,9 @@ int main(int argc, char **argv) { char str_num[16] = {0}; int2str(str_num, batch_id); char *img_path = (char *)calloc(strlen(out) + strlen(str_num) + strlen(".bmp") + 1, sizeof(char)); - strcpy(img_path, out); - strcat(img_path, str_num); - strcat(img_path, ".bmp"); + memcpy(img_path, out, strlen(out)); + memcpy(img_path + strlen(out), str_num, strlen(str_num)); + memcpy(img_path + strlen(out) + strlen(str_num), ".bmp", strlen(".bmp") + 1); image_save(img_path, &originalImages[batch_id]); printf("%sImage %s created!\n", info, img_path); free(img_path); diff --git a/inference-engine/ie_bridges/c/tests/CMakeLists.txt b/inference-engine/ie_bridges/c/tests/CMakeLists.txt index 8bd1169efc7..4feae6bd93a 100644 --- a/inference-engine/ie_bridges/c/tests/CMakeLists.txt +++ b/inference-engine/ie_bridges/c/tests/CMakeLists.txt @@ -27,6 +27,8 @@ target_compile_definitions(${TARGET_NAME} DATA_PATH=\"${DATA_PATH}\" MODELS_PATH=\"${MODELS_PATH}\" ) +add_dependencies(${TARGET_NAME} MultiDevicePlugin) + if(ENABLE_MKL_DNN) add_dependencies(${TARGET_NAME} MKLDNNPlugin) endif() diff --git a/inference-engine/ie_bridges/c/tests/ie_c_api_test.cpp b/inference-engine/ie_bridges/c/tests/ie_c_api_test.cpp index 25c0972b7ad..752b24075b7 100644 --- a/inference-engine/ie_bridges/c/tests/ie_c_api_test.cpp +++ b/inference-engine/ie_bridges/c/tests/ie_c_api_test.cpp @@ -816,10 +816,8 @@ TEST(ie_exec_network_set_config, setConfig) { IE_ASSERT_OK(ie_core_create("", &core)); ASSERT_NE(nullptr, core); - ie_core_versions_t ie_core_versions_multi; ie_param_t param; - if (ie_core_get_versions(core, "MULTI", &ie_core_versions_multi) != IEStatusCode::OK || - ie_core_get_metric(core, "GPU", "AVAILABLE_DEVICES", ¶m) != IEStatusCode::OK) { + if (ie_core_get_metric(core, "GPU", "AVAILABLE_DEVICES", ¶m) != IEStatusCode::OK) { ie_core_free(&core); GTEST_SKIP(); } @@ -837,11 +835,10 @@ TEST(ie_exec_network_set_config, setConfig) { ie_config_t config_param = {"MULTI_DEVICE_PRIORITIES", "GPU,CPU", nullptr}; IE_EXPECT_OK(ie_exec_network_set_config(exe_network, &config_param)); - ie_core_versions_free(&ie_core_versions_multi); - ie_param_free(¶m); ie_exec_network_free(&exe_network); ie_network_free(&network); ie_core_free(&core); + ie_param_free(¶m); } TEST(ie_exec_network_get_metric, getMetric) { diff --git a/inference-engine/ie_bridges/python/CMakeLists.txt b/inference-engine/ie_bridges/python/CMakeLists.txt index 80db79f65ef..519a5c64338 100644 --- a/inference-engine/ie_bridges/python/CMakeLists.txt +++ b/inference-engine/ie_bridges/python/CMakeLists.txt @@ -55,6 +55,13 @@ endif() set (PYTHON_BRIDGE_SRC_ROOT ${CMAKE_CURRENT_SOURCE_DIR}) add_subdirectory (src/openvino/inference_engine) +# Check Cython version +if("${CYTHON_VERSION}" VERSION_LESS "0.29") + message(FATAL_ERROR "OpenVINO Python API needs at least Cython version 0.29, found verson ${CYTHON_VERSION}") +else() + message(STATUS "Found Cython version ${CYTHON_VERSION}") +endif() + # install ie_cpack_add_component(${PYTHON_VERSION} REQUIRED) diff --git a/inference-engine/ie_bridges/python/cmake/FindCython.cmake b/inference-engine/ie_bridges/python/cmake/FindCython.cmake index ae97e2417f5..f960fe20998 100644 --- a/inference-engine/ie_bridges/python/cmake/FindCython.cmake +++ b/inference-engine/ie_bridges/python/cmake/FindCython.cmake @@ -56,4 +56,8 @@ endif() include( FindPackageHandleStandardArgs ) FIND_PACKAGE_HANDLE_STANDARD_ARGS( Cython REQUIRED_VARS CYTHON_EXECUTABLE ) -mark_as_advanced( CYTHON_EXECUTABLE ) +# Find Cython version +execute_process(COMMAND ${CYTHON_EXECUTABLE} -V ERROR_VARIABLE CYTHON_OUTPUT OUTPUT_QUIET) +string(REGEX REPLACE "^Cython version ([0-9]+\\.[0-9]+\\.[0-9]+).*" "\\1" CYTHON_VERSION "${CYTHON_OUTPUT}") + +mark_as_advanced( CYTHON_EXECUTABLE CYTHON_VERSION ) diff --git a/inference-engine/ie_bridges/python/src/openvino/inference_engine/ie_api.pyx b/inference-engine/ie_bridges/python/src/openvino/inference_engine/ie_api.pyx index f60fd43ca0e..06bf8b106a0 100644 --- a/inference-engine/ie_bridges/python/src/openvino/inference_engine/ie_api.pyx +++ b/inference-engine/ie_bridges/python/src/openvino/inference_engine/ie_api.pyx @@ -1439,7 +1439,7 @@ cdef class IENetwork: # net = ie.read_network(model=path_to_xml_file, weights=path_to_bin_file) # input_layer = next(iter(net.inputs)) # n, c, h, w = net.inputs[input_layer] - # net.reshape({input_layer: (n, c, h*2, w*2)}] + # net.reshape({input_layer: (n, c, h*2, w*2)}) # ``` def reshape(self, input_shapes: dict): cdef map[string, vector[size_t]] c_input_shapes; diff --git a/inference-engine/ie_bridges/python/tests/test_InferRequest.py b/inference-engine/ie_bridges/python/tests/test_InferRequest.py index b68b8373e84..0dd7ef2a33c 100644 --- a/inference-engine/ie_bridges/python/tests/test_InferRequest.py +++ b/inference-engine/ie_bridges/python/tests/test_InferRequest.py @@ -2,6 +2,7 @@ import numpy as np import os import pytest import warnings +import threading from openvino.inference_engine import ie_api as ie from conftest import model_path, image_path @@ -324,15 +325,22 @@ def test_async_infer_callback_wait_in_callback(device): class InferReqWrap: def __init__(self, request): self.request = request + self.cv = threading.Condition() self.request.set_completion_callback(self.callback) self.status_code = self.request.wait(ie.WaitMode.STATUS_ONLY) assert self.status_code == ie.StatusCode.INFER_NOT_STARTED def callback(self, statusCode, userdata): self.status_code = self.request.wait(ie.WaitMode.STATUS_ONLY) + self.cv.acquire() + self.cv.notify() + self.cv.release() def execute(self, input_data): self.request.async_infer(input_data) + self.cv.acquire() + self.cv.wait() + self.cv.release() status = self.request.wait(ie.WaitMode.RESULT_READY) assert status == ie.StatusCode.OK assert self.status_code == ie.StatusCode.OK diff --git a/inference-engine/include/cpp/ie_cnn_network.h b/inference-engine/include/cpp/ie_cnn_network.h index 16fb7cd0b05..bcf850fa8b6 100644 --- a/inference-engine/include/cpp/ie_cnn_network.h +++ b/inference-engine/include/cpp/ie_cnn_network.h @@ -49,9 +49,7 @@ public: */ explicit CNNNetwork(std::shared_ptr network): network(network) { actual = network.get(); - if (actual == nullptr) { - THROW_IE_EXCEPTION << "CNNNetwork was not initialized."; - } + if (actual == nullptr) THROW_IE_EXCEPTION << "CNNNetwork was not initialized."; } /** @@ -100,6 +98,7 @@ public: * @return outputs Reference to the OutputsDataMap object */ virtual OutputsDataMap getOutputsInfo() const { + if (actual == nullptr) THROW_IE_EXCEPTION << "CNNNetwork was not initialized."; OutputsDataMap outputs; actual->getOutputsInfo(outputs); return outputs; @@ -113,6 +112,7 @@ public: * @return inputs Reference to InputsDataMap object */ virtual InputsDataMap getInputsInfo() const { + if (actual == nullptr) THROW_IE_EXCEPTION << "CNNNetwork was not initialized."; InputsDataMap inputs; actual->getInputsInfo(inputs); return inputs; @@ -126,6 +126,7 @@ public: * @return The number of layers as an integer value */ size_t layerCount() const { + if (actual == nullptr) THROW_IE_EXCEPTION << "CNNNetwork was not initialized."; return actual->layerCount(); } @@ -136,7 +137,8 @@ public: * * @return Network name */ - const std::string& getName() const noexcept { + const std::string& getName() const { + if (actual == nullptr) THROW_IE_EXCEPTION << "CNNNetwork was not initialized."; return actual->getName(); } @@ -160,6 +162,7 @@ public: * @return The size of batch as a size_t value */ virtual size_t getBatchSize() const { + if (actual == nullptr) THROW_IE_EXCEPTION << "CNNNetwork was not initialized."; return actual->getBatchSize(); } @@ -168,7 +171,7 @@ public: * * @return A shared pointer of the current network */ - operator std::shared_ptr() { + operator ICNNNetwork::Ptr() { return network; } @@ -178,6 +181,7 @@ public: * @return An instance of the current network */ operator ICNNNetwork&() { + if (actual == nullptr) THROW_IE_EXCEPTION << "CNNNetwork was not initialized."; return *actual; } @@ -187,6 +191,7 @@ public: * @return A const reference of the current network */ operator const ICNNNetwork&() const { + if (actual == nullptr) THROW_IE_EXCEPTION << "CNNNetwork was not initialized."; return *actual; } @@ -195,7 +200,8 @@ public: * * @return constant nGraph function */ - std::shared_ptr getFunction() noexcept { + std::shared_ptr getFunction() { + if (actual == nullptr) THROW_IE_EXCEPTION << "CNNNetwork was not initialized."; return actual->getFunction(); } @@ -204,7 +210,8 @@ public: * * @return constant nGraph function */ - std::shared_ptr getFunction() const noexcept { + std::shared_ptr getFunction() const { + if (actual == nullptr) THROW_IE_EXCEPTION << "CNNNetwork was not initialized."; return actual->getFunction(); } @@ -278,6 +285,7 @@ public: * @return Map of pairs: input name and its dimension. */ virtual ICNNNetwork::InputShapes getInputShapes() const { + if (actual == nullptr) THROW_IE_EXCEPTION << "CNNNetwork was not initialized."; ICNNNetwork::InputShapes shapes; InputsDataMap inputs; actual->getInputsInfo(inputs); diff --git a/inference-engine/include/cpp/ie_executable_network.hpp b/inference-engine/include/cpp/ie_executable_network.hpp index b6ec009ac0d..c88a645b2de 100644 --- a/inference-engine/include/cpp/ie_executable_network.hpp +++ b/inference-engine/include/cpp/ie_executable_network.hpp @@ -190,9 +190,7 @@ public: * @return A vector of Memory State objects */ std::vector QueryState() { - if (actual == nullptr) { - THROW_IE_EXCEPTION << "ExecutableNetwork wrapper was not initialized."; - } + if (actual == nullptr) THROW_IE_EXCEPTION << "ExecutableNetwork was not initialized."; IMemoryState::Ptr pState = nullptr; auto res = OK; std::vector controller; diff --git a/inference-engine/include/cpp/ie_infer_request.hpp b/inference-engine/include/cpp/ie_infer_request.hpp index 6c5ff95b080..f89d75e54d5 100644 --- a/inference-engine/include/cpp/ie_infer_request.hpp +++ b/inference-engine/include/cpp/ie_infer_request.hpp @@ -88,9 +88,7 @@ public: InferenceEngine::details::SharedObjectLoader::Ptr splg = {}): actual(request), plg(splg) { // plg can be null, but not the actual - if (actual == nullptr) { - THROW_IE_EXCEPTION << "InferRequest wrapper was not initialized."; - } + if (actual == nullptr) THROW_IE_EXCEPTION << "InferRequest was not initialized."; } /** @@ -230,9 +228,7 @@ public: */ StatusCode Wait(int64_t millis_timeout) { ResponseDesc resp; - if (actual == nullptr) { - THROW_IE_EXCEPTION << "InferRequest wrapper was not initialized."; - } + if (actual == nullptr) THROW_IE_EXCEPTION << "InferRequest was not initialized."; auto res = actual->Wait(millis_timeout, &resp); if (res != OK && res != RESULT_NOT_READY && res != INFER_NOT_STARTED) { InferenceEngine::details::extract_exception(res, resp.msg); @@ -259,6 +255,7 @@ public: * @return A shared pointer to underlying IInferRequest interface */ operator IInferRequest::Ptr&() { + if (actual == nullptr) THROW_IE_EXCEPTION << "InferRequest was not initialized."; return actual; } diff --git a/inference-engine/include/cpp/ie_plugin_cpp.hpp b/inference-engine/include/cpp/ie_plugin_cpp.hpp index e75fdff6110..db56c01d6bf 100644 --- a/inference-engine/include/cpp/ie_plugin_cpp.hpp +++ b/inference-engine/include/cpp/ie_plugin_cpp.hpp @@ -57,6 +57,7 @@ public: const Version* GetVersion() { const Version* versionInfo = nullptr; IE_SUPPRESS_DEPRECATED_START + if (actual == nullptr) THROW_IE_EXCEPTION << "InferencePlugin wrapper was not initialized"; actual->GetVersion(versionInfo); IE_SUPPRESS_DEPRECATED_END if (versionInfo == nullptr) { @@ -153,6 +154,7 @@ public: void QueryNetwork(const ICNNNetwork& network, const std::map& config, QueryNetworkResult& res) const { IE_SUPPRESS_DEPRECATED_START + if (actual == nullptr) THROW_IE_EXCEPTION << "InferencePlugin wrapper was not initialized"; actual->QueryNetwork(network, config, res); IE_SUPPRESS_DEPRECATED_END if (res.rc != OK) THROW_IE_EXCEPTION << res.resp.msg; diff --git a/inference-engine/include/details/ie_cnn_network_iterator.hpp b/inference-engine/include/details/ie_cnn_network_iterator.hpp index e5f1af39c62..4bbc93c67b2 100644 --- a/inference-engine/include/details/ie_cnn_network_iterator.hpp +++ b/inference-engine/include/details/ie_cnn_network_iterator.hpp @@ -53,6 +53,7 @@ public: * scope. */ explicit CNNNetworkIterator(const ICNNNetwork* network) { + if (network == nullptr) THROW_IE_EXCEPTION << "ICNNNetwork object is nullptr"; InputsDataMap inputs; network->getInputsInfo(inputs); if (!inputs.empty()) { diff --git a/inference-engine/include/details/ie_so_pointer.hpp b/inference-engine/include/details/ie_so_pointer.hpp index 643c8367930..4854aa0da09 100644 --- a/inference-engine/include/details/ie_so_pointer.hpp +++ b/inference-engine/include/details/ie_so_pointer.hpp @@ -38,7 +38,11 @@ public: * @brief The main constructor * @param loader Library to load from */ - explicit SymbolLoader(std::shared_ptr loader): _so_loader(loader) {} + explicit SymbolLoader(std::shared_ptr loader): _so_loader(loader) { + if (_so_loader == nullptr) { + THROW_IE_EXCEPTION << "SymbolLoader cannot be created with nullptr"; + } + } /** * @brief Calls a function from the library that creates an object and returns StatusCode diff --git a/inference-engine/include/ie_core.hpp b/inference-engine/include/ie_core.hpp index 50307e28ad2..eadfbca702f 100644 --- a/inference-engine/include/ie_core.hpp +++ b/inference-engine/include/ie_core.hpp @@ -38,7 +38,7 @@ struct QueryNetworkResult { StatusCode rc = OK; /** - * @brief Response mssage + * @brief Response message */ ResponseDesc resp; }; @@ -61,7 +61,7 @@ public: * @param xmlConfigFile A path to .xml file with plugins to load from. If XML configuration file is not specified, * then default Inference Engine plugins are loaded from the default plugin.xml file. */ - explicit Core(const std::string& xmlConfigFile = std::string()); + explicit Core(const std::string& xmlConfigFile = {}); /** * @brief Returns plugins version information @@ -92,7 +92,7 @@ public: * if bin file with the same name was not found, will load IR without weights. * @return CNNNetwork */ - CNNNetwork ReadNetwork(const std::wstring& modelPath, const std::wstring& binPath = std::wstring()) const { + CNNNetwork ReadNetwork(const std::wstring& modelPath, const std::wstring& binPath = {}) const { return ReadNetwork(details::wStringtoMBCSstringChar(modelPath), details::wStringtoMBCSstringChar(binPath)); } #endif @@ -104,7 +104,7 @@ public: * if bin file with the same name was not found, will load IR without weights. * @return CNNNetwork */ - CNNNetwork ReadNetwork(const std::string& modelPath, const std::string& binPath = "") const; + CNNNetwork ReadNetwork(const std::string& modelPath, const std::string& binPath = {}) const; /** * @brief Reads IR xml and bin (with the same name) files * @param model string with IR @@ -126,8 +126,8 @@ public: * @return An executable network reference */ ExecutableNetwork LoadNetwork( - const CNNNetwork network, const std::string& deviceName, - const std::map& config = std::map()); + const CNNNetwork& network, const std::string& deviceName, + const std::map& config = {}); /** * @brief Registers extension @@ -141,11 +141,11 @@ public: * @param context Pointer to RemoteContext object * @param config Optional map of pairs: (config parameter name, config parameter value) relevant only for this load * operation - * @return An executable network reference + * @return An executable network object */ ExecutableNetwork LoadNetwork( - const CNNNetwork network, RemoteContext::Ptr context, - const std::map& config = std::map()); + const CNNNetwork& network, RemoteContext::Ptr context, + const std::map& config = {}); /** * @brief Registers extension for the specified plugin @@ -166,7 +166,7 @@ public: */ ExecutableNetwork ImportNetwork( const std::string& modelFileName, const std::string& deviceName, - const std::map& config = std::map()); + const std::map& config = {}); /** * @brief Creates an executable network from a previously exported network @@ -199,11 +199,11 @@ public: * @param deviceName A name of a device to query * @param network Network object to query * @param config Optional map of pairs: (config parameter name, config parameter value) - * @return Pointer to the response message that holds a description of an error if any occurred + * @return An object containing a map of pairs a layer name -> a device name supporting this layer. */ QueryNetworkResult QueryNetwork( const ICNNNetwork& network, const std::string& deviceName, - const std::map& config = std::map()) const; + const std::map& config = {}) const; /** * @brief Sets configuration for device, acceptable keys can be found in ie_plugin_config.hpp @@ -213,7 +213,7 @@ public: * * @param config Map of pairs: (config parameter name, config parameter value) */ - void SetConfig(const std::map& config, const std::string& deviceName = std::string()); + void SetConfig(const std::map& config, const std::string& deviceName = {}); /** * @brief Gets configuration dedicated to device behaviour. diff --git a/inference-engine/samples/CMakeLists.txt b/inference-engine/samples/CMakeLists.txt index 3c00465c42c..9de36cf72ac 100644 --- a/inference-engine/samples/CMakeLists.txt +++ b/inference-engine/samples/CMakeLists.txt @@ -6,6 +6,10 @@ cmake_minimum_required (VERSION 2.8.12) project(Samples) +if(POLICY CMP0054) + cmake_policy(SET CMP0054 NEW) +endif() + if(POLICY CMP0063) cmake_policy(SET CMP0063 NEW) endif() @@ -66,7 +70,7 @@ if (WIN32) set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /WX") #treating warnings as errors endif () - if (CMAKE_CXX_COMPILER_ID MATCHES MSVC) + if (CMAKE_CXX_COMPILER_ID STREQUAL "MSVC") set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /wd4251 /wd4275 /wd4267") #disable some warnings endif() else() @@ -78,7 +82,7 @@ else() set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-error=unused-command-line-argument") elseif(UNIX) set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wuninitialized -Winit-self") - if(NOT CMAKE_CXX_COMPILER_ID STREQUAL Clang) + if(NOT CMAKE_CXX_COMPILER_ID STREQUAL "Clang") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wmaybe-uninitialized") endif() endif() @@ -100,7 +104,7 @@ if(NOT DEFINED CMAKE_CXX_STANDARD) set (CMAKE_CXX_STANDARD 11) set (CMAKE_CXX_EXTENSIONS OFF) set (CMAKE_CXX_STANDARD_REQUIRED ON) - if (CMAKE_CXX_COMPILER_ID STREQUAL GNU) + if (CMAKE_CXX_COMPILER_ID STREQUAL "GNU") set (CMAKE_CXX_FLAGS "-std=c++11 ${CMAKE_CXX_FLAGS}") endif() endif() @@ -117,7 +121,7 @@ if(EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/thirdparty/gflags") set_target_properties(gflags_nothreads_static PROPERTIES FOLDER thirdparty) endif() -if (CMAKE_CXX_COMPILER_ID STREQUAL GNU) +if (CMAKE_CXX_COMPILER_ID STREQUAL "GNU") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall") endif() @@ -228,7 +232,7 @@ macro(ie_add_sample) if(COMMAND add_cpplint_target AND NOT IE_SAMPLE_EXCLUDE_CPPLINT) if(folder_name STREQUAL "c_samples") - set(custom_filters "-readability/casting,-runtime/printf") + set(custom_filters "-readability/casting") endif() add_cpplint_target(${IE_SAMPLE_NAME}_cpplint FOR_TARGETS ${IE_SAMPLE_NAME} CUSTOM_FILTERS ${custom_filters}) diff --git a/inference-engine/samples/benchmark_app/README.md b/inference-engine/samples/benchmark_app/README.md index 7f675a7198f..04cf851fc4c 100644 --- a/inference-engine/samples/benchmark_app/README.md +++ b/inference-engine/samples/benchmark_app/README.md @@ -84,6 +84,7 @@ Options: -stream_output Optional. Print progress as a plain text. When specified, an interactive progress bar is replaced with a multiline output. -t Optional. Time in seconds to execute topology. -progress Optional. Show progress bar (can affect performance measurement). Default values is "false". + -shape Optional. Set shape for input. For example, "input1[1,3,224,224],input2[1,4]" or "[1,3,224,224]" in case of one input size. CPU-specific performance options: -nstreams "" Optional. Number of streams to use for inference on the CPU or/and GPU in throughput mode diff --git a/inference-engine/samples/benchmark_app/benchmark_app.hpp b/inference-engine/samples/benchmark_app/benchmark_app.hpp index cefff685c83..9affebbd8bf 100644 --- a/inference-engine/samples/benchmark_app/benchmark_app.hpp +++ b/inference-engine/samples/benchmark_app/benchmark_app.hpp @@ -97,6 +97,9 @@ static const char load_config_message[] = "Optional. Path to XML/YAML/JSON file static const char dump_config_message[] = "Optional. Path to XML/YAML/JSON file to dump IE parameters, which were set by application."; #endif +static const char shape_message[] = "Optional. Set shape for input. For example, \"input1[1,3,224,224],input2[1,4]\" or \"[1,3,224,224]\"" + " in case of one input size."; + /// @brief Define flag for showing help message
DEFINE_bool(h, false, help_message); @@ -178,6 +181,9 @@ DEFINE_string(load_config, "", load_config_message); DEFINE_string(dump_config, "", dump_config_message); #endif +/// @brief Define flag for input shape
+DEFINE_string(shape, "", shape_message); + /** * @brief This function show a help message */ @@ -200,6 +206,7 @@ static void showUsage() { std::cout << " -stream_output " << stream_output_message << std::endl; std::cout << " -t " << execution_time_message << std::endl; std::cout << " -progress " << progress_message << std::endl; + std::cout << " -shape " << shape_message << std::endl; std::cout << std::endl << " device-specific performance options:" << std::endl; std::cout << " -nstreams \"\" " << infer_num_streams_message << std::endl; std::cout << " -nthreads \"\" " << infer_num_threads_message << std::endl; diff --git a/inference-engine/samples/benchmark_app/main.cpp b/inference-engine/samples/benchmark_app/main.cpp index 800e0f70a55..684753b8b55 100644 --- a/inference-engine/samples/benchmark_app/main.cpp +++ b/inference-engine/samples/benchmark_app/main.cpp @@ -316,33 +316,28 @@ int main(int argc, char *argv[]) { // ----------------- 5. Resizing network to match image sizes and given batch ---------------------------------- next_step(); - batchSize = cnnNetwork.getBatchSize(); - if ((FLAGS_b != 0) && (batchSize != FLAGS_b)) { - ICNNNetwork::InputShapes shapes = cnnNetwork.getInputShapes(); - bool reshape = false; - for (const InputsDataMap::value_type& item : inputInfo) { - auto layout = item.second->getTensorDesc().getLayout(); - - int batchIndex = -1; - if ((layout == Layout::NCHW) || (layout == Layout::NCDHW) || - (layout == Layout::NHWC) || (layout == Layout::NDHWC) || - (layout == Layout::NC)) { - batchIndex = 0; - } else if (layout == CN) { - batchIndex = 1; - } - if ((batchIndex != -1) && (shapes[item.first][batchIndex] != FLAGS_b)) { - shapes[item.first][batchIndex] = FLAGS_b; - reshape = true; - } - } - if (reshape) { - slog::info << "Resizing network to batch = " << FLAGS_b << slog::endl; - cnnNetwork.reshape(shapes); - } + // Parse input shapes if specified + InferenceEngine::ICNNNetwork::InputShapes shapes = cnnNetwork.getInputShapes(); + bool reshape = false; + if (!FLAGS_shape.empty()) { + reshape |= updateShapes(shapes, FLAGS_shape, inputInfo); + } + if ((FLAGS_b != 0) && (batchSize != FLAGS_b)) { + reshape |= adjustShapesBatch(shapes, FLAGS_b, inputInfo); + } + if (reshape) { + slog::info << "Reshaping network: " << getShapesString(shapes) << slog::endl; + startTime = Time::now(); + cnnNetwork.reshape(shapes); + auto duration_ms = double_to_string(get_total_ms_time(startTime)); + slog::info << "Reshape network took " << duration_ms << " ms" << slog::endl; + if (statistics) + statistics->addParameters(StatisticsReport::Category::EXECUTION_RESULTS, + { + {"reshape network time (ms)", duration_ms} + }); } - batchSize = cnnNetwork.getBatchSize(); topology_name = cnnNetwork.getName(); slog::info << (FLAGS_b != 0 ? "Network batch size was changed to: " : "Network batch size: ") << batchSize << slog::endl; diff --git a/inference-engine/samples/benchmark_app/utils.cpp b/inference-engine/samples/benchmark_app/utils.cpp index d0820bccbab..1c1186baa5e 100644 --- a/inference-engine/samples/benchmark_app/utils.cpp +++ b/inference-engine/samples/benchmark_app/utils.cpp @@ -7,6 +7,7 @@ #include #include #include +#include #include #include @@ -101,6 +102,77 @@ std::map parseNStreamsValuePerDevice(const std::vector return result; } +bool adjustShapesBatch(InferenceEngine::ICNNNetwork::InputShapes& shapes, + const size_t batch_size, const InferenceEngine::InputsDataMap& input_info) { + bool updated = false; + for (auto& item : input_info) { + auto layout = item.second->getTensorDesc().getLayout(); + + int batch_index = -1; + if ((layout == InferenceEngine::Layout::NCHW) || (layout == InferenceEngine::Layout::NCDHW) || + (layout == InferenceEngine::Layout::NHWC) || (layout == InferenceEngine::Layout::NDHWC) || + (layout == InferenceEngine::Layout::NC)) { + batch_index = 0; + } else if (layout == InferenceEngine::Layout::CN) { + batch_index = 1; + } + if ((batch_index != -1) && (shapes.at(item.first).at(batch_index) != batch_size)) { + shapes[item.first][batch_index] = batch_size; + updated = true; + } + } + return updated; +} + +bool updateShapes(InferenceEngine::ICNNNetwork::InputShapes& shapes, + const std::string shapes_string, const InferenceEngine::InputsDataMap& input_info) { + bool updated = false; + std::string search_string = shapes_string; + auto start_pos = search_string.find_first_of('['); + while (start_pos != std::string::npos) { + auto end_pos = search_string.find_first_of(']'); + if (end_pos == std::string::npos) + break; + auto input_name = search_string.substr(0, start_pos); + auto input_shape = search_string.substr(start_pos + 1, end_pos - start_pos - 1); + std::vector parsed_shape; + for (auto& dim : split(input_shape, ',')) { + parsed_shape.push_back(std::stoi(dim)); + } + if (!input_name.empty()) { + shapes[input_name] = parsed_shape; + updated = true; + } else { + for (auto& item : input_info) { + shapes[item.first] = parsed_shape; + } + updated = true; + } + search_string = search_string.substr(end_pos + 1); + if (search_string.empty() || search_string.front() != ',') + break; + search_string = search_string.substr(1); + start_pos = search_string.find_first_of('['); + } + if (!search_string.empty()) + throw std::logic_error("Can't parse `shape` parameter: " + shapes_string); + return updated; +} + +std::string getShapesString(const InferenceEngine::ICNNNetwork::InputShapes& shapes) { + std::stringstream ss; + for (auto& shape : shapes) { + if (!ss.str().empty()) ss << ", "; + ss << "\'" << shape.first << "': ["; + for (size_t i = 0; i < shape.second.size(); i++) { + if (i > 0) ss << ", "; + ss << shape.second.at(i); + } + ss << "]"; + } + return ss.str(); +} + #ifdef USE_OPENCV void dump_config(const std::string& filename, const std::map>& config) { diff --git a/inference-engine/samples/benchmark_app/utils.hpp b/inference-engine/samples/benchmark_app/utils.hpp index 70c2ce7747c..75b10257160 100644 --- a/inference-engine/samples/benchmark_app/utils.hpp +++ b/inference-engine/samples/benchmark_app/utils.hpp @@ -12,6 +12,12 @@ std::vector parseDevices(const std::string& device_string); uint32_t deviceDefaultDeviceDurationInSeconds(const std::string& device); std::map parseNStreamsValuePerDevice(const std::vector& devices, const std::string& values_string); +bool updateShapes(InferenceEngine::ICNNNetwork::InputShapes& shapes, + const std::string shapes_string, const InferenceEngine::InputsDataMap& input_info); +bool adjustShapesBatch(InferenceEngine::ICNNNetwork::InputShapes& shapes, + const size_t batch_size, const InferenceEngine::InputsDataMap& input_info); +std::string getShapesString(const InferenceEngine::ICNNNetwork::InputShapes& shapes); + #ifdef USE_OPENCV void dump_config(const std::string& filename, const std::map>& config); diff --git a/inference-engine/scripts/create_vs2017_proj_x64.cmd b/inference-engine/scripts/create_vs2017_proj_x64.cmd new file mode 100644 index 00000000000..ff91c5945a5 --- /dev/null +++ b/inference-engine/scripts/create_vs2017_proj_x64.cmd @@ -0,0 +1,31 @@ +@echo off +:: Copyright (C) 2018-2020 Intel Corporation +:: SPDX-License-Identifier: Apache-2.0 + +pushd ..\.. +if not exist "vs2017x64" ( + mkdir "vs2017x64" +) + +cmake -E chdir "vs2017x64" cmake -G "Visual Studio 15 2017 Win64" -T "Intel C++ Compiler 18.0" -DOS_FOLDER=ON ^ + -DENABLE_MYRIAD=OFF -DENABLE_VPU=OFF -DENABLE_GNA=ON -DENABLE_CLDNN=OFF ^ + -DENABLE_OPENCV=ON -DENABLE_MKL_DNN=ON ^ + -DVERBOSE_BUILD=ON -DENABLE_TESTS=ON -DTHREADING=TBB .. + + +chdir +cd "vs2017x64\thirdparty\" +"C:\Program Files (x86)\Common Files\Intel\shared files\ia32\Bin\ICProjConvert180.exe" mkldnn.vcxproj /IC + +chdir +cd "..\src\mkldnn_plugin" +"C:\Program Files (x86)\Common Files\Intel\shared files\ia32\Bin\ICProjConvert180.exe" MKLDNNPlugin.vcxproj /IC +"C:\Program Files (x86)\Common Files\Intel\shared files\ia32\Bin\ICProjConvert180.exe" test_MKLDNNPlugin.vcxproj /IC + +chdir +cd "..\..\tests\unit" +"C:\Program Files (x86)\Common Files\Intel\shared files\ia32\Bin\ICProjConvert180.exe" InferenceEngineUnitTests.vcxproj /IC + + +popd +pause diff --git a/inference-engine/scripts/run_code_checks.sh b/inference-engine/scripts/run_code_checks.sh index 11689b7cc75..d3bdb355cce 100644 --- a/inference-engine/scripts/run_code_checks.sh +++ b/inference-engine/scripts/run_code_checks.sh @@ -1,4 +1,6 @@ #!/bin/bash +# Copyright (C) 2018-2020 Intel Corporation +# SPDX-License-Identifier: Apache-2.0 CURRENT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" command -v realpath >/dev/null 2>&1 || { echo >&2 "cpplint require realpath executable but it's not installed. Aborting."; exit 1; } diff --git a/inference-engine/scripts/run_tests_myriad_multistick.sh b/inference-engine/scripts/run_tests_myriad_multistick.sh new file mode 100644 index 00000000000..c6082a9f336 --- /dev/null +++ b/inference-engine/scripts/run_tests_myriad_multistick.sh @@ -0,0 +1,87 @@ +#!/bin/bash +# Copyright (C) 2018-2020 Intel Corporation +# SPDX-License-Identifier: Apache-2.0 + +APP_NAME="MyriadFunctionalTests" +APPS_TO_RUN=$1 +APPS_TO_RUN=${APPS_TO_RUN:=4} + +echo "Run in parallel ${APPS_TO_RUN} applications" + +TEST_DIR=../../bin/intel64 + +# Path to test dir is provided +if [[ -n "$2" ]]; then + TEST_DIR=$2 +# Search for test dir with binaries +else + # Windows default + if [[ -f "${TEST_DIR}/${APP_NAME}" ]]; then + TEST_DIR=${TEST_DIR} + # Search for Release or Debug config + elif [[ -f "${TEST_DIR}/Release/${APP_NAME}" ]]; then + TEST_DIR="$TEST_DIR/Release/" + elif [[ -f "${TEST_DIR}/Debug/${APP_NAME}" ]]; then + TEST_DIR="$TEST_DIR/Debug/" + else + echo "Directory with binaries not found!" + exit -1 + fi + +fi + +echo "Test directory: ${TEST_DIR}" +cd ${TEST_DIR} + +export IE_VPU_MYRIADX=1 + +pids="" + +if [[ "${APPS_TO_RUN}" -ge 1 ]] ; then + ./${APP_NAME} --gtest_filter=*VPURegTest*SSD*myriad* & + pids+=" $!" +fi + +if [[ "${APPS_TO_RUN}" -ge 2 ]] ; then + ./${APP_NAME} --gtest_filter=*VPURegTest*VGG*myriad* & + pids+=" $!" +fi + +if [[ "${APPS_TO_RUN}" -ge 3 ]] ; then + ./${APP_NAME} --gtest_filter=*VPURegTest*VGG*myriad* & + pids+=" $!" +fi + +if [[ "${APPS_TO_RUN}" -ge 4 ]] ; then + # For more then 4 multidevice testing + for (( VAR = 4; VAR <= ${APPS_TO_RUN}; ++VAR )); do + ./${APP_NAME} --gtest_filter=*VPURegTest*YOLO*myriad* & + pids+=" $!" + done +fi + + +# Wait for all processes to finish +sts="" +for p in ${pids}; do + if wait ${p}; then + sts+=" 1" + else + sts+=" 0" + fi + echo "--- Process $p finished" +done + +idx=0 +exit_code=0 +for s in ${sts}; do + if [[ ${s} -eq 1 ]]; then + echo "Task $idx PASSED" + else + echo "Task $idx FAILED" + exit_code=1 + fi + ((idx+=1)) +done + +exit ${exit_code} diff --git a/inference-engine/src/CMakeLists.txt b/inference-engine/src/CMakeLists.txt index 5774f02d239..a97e1c780ee 100644 --- a/inference-engine/src/CMakeLists.txt +++ b/inference-engine/src/CMakeLists.txt @@ -26,6 +26,8 @@ endif() add_subdirectory(hetero_plugin) +add_subdirectory(multi_device) + add_subdirectory(transformations) add_subdirectory(inference_engine) diff --git a/inference-engine/src/cldnn_engine/cldnn_engine.cpp b/inference-engine/src/cldnn_engine/cldnn_engine.cpp index e41e649431e..e728ea6be68 100644 --- a/inference-engine/src/cldnn_engine/cldnn_engine.cpp +++ b/inference-engine/src/cldnn_engine/cldnn_engine.cpp @@ -26,8 +26,10 @@ #include #include #include +#include #include #include +#include #include "convert_function_to_cnn_network.hpp" #undef min @@ -79,6 +81,8 @@ InferenceEngine::ICNNNetwork::Ptr clDNNEngine::CloneNetwork(const InferenceEngin ::ngraph::op::GenericIE::DisableReshape noReshape(nGraphFunc); // Note: instead of running all Conversion Transformations you can make up your own transformation pipeline + ngraph::pass::CommonOptimizations().run_on_function(nGraphFunc); + ngraph::pass::ConvertOpSet3ToOpSet2(transformations_callback).run_on_function(nGraphFunc); ngraph::pass::ConvertOpSet2ToOpSet1(transformations_callback).run_on_function(nGraphFunc); ngraph::pass::ConvertOpSet1ToLegacy(transformations_callback).run_on_function(nGraphFunc); clonedNetwork = InferenceEngine::details::convertFunctionToICNNNetwork(nGraphFunc, network); @@ -143,7 +147,7 @@ auto check_inputs = [](InferenceEngine::InputsDataMap _networkInputs) { } }; -ExecutableNetworkInternal::Ptr clDNNEngine::LoadExeNetworkImpl(const InferenceEngine::ICore * /*core*/, const InferenceEngine::ICNNNetwork &network, +ExecutableNetworkInternal::Ptr clDNNEngine::LoadExeNetworkImpl(const InferenceEngine::ICNNNetwork &network, const std::map &config) { // verification of supported input InferenceEngine::InputsDataMap _networkInputs; @@ -189,9 +193,9 @@ ExecutableNetworkInternal::Ptr clDNNEngine::LoadExeNetworkImpl(const InferenceEn return std::make_shared(*CloneNetwork(network), context, conf); } -ExecutableNetworkInternal::Ptr clDNNEngine::LoadExeNetworkImpl(const InferenceEngine::ICore * /*core*/, const InferenceEngine::ICNNNetwork &network, - RemoteContext::Ptr context, - const std::map &config) { +ExecutableNetworkInternal::Ptr clDNNEngine::LoadExeNetworkImpl(const InferenceEngine::ICNNNetwork &network, + RemoteContext::Ptr context, + const std::map &config) { InferenceEngine::InputsDataMap _networkInputs; network.getInputsInfo(_networkInputs); check_inputs(_networkInputs); diff --git a/inference-engine/src/cldnn_engine/cldnn_engine.h b/inference-engine/src/cldnn_engine/cldnn_engine.h index 50c06c81ea9..b1cf24b4a54 100644 --- a/inference-engine/src/cldnn_engine/cldnn_engine.h +++ b/inference-engine/src/cldnn_engine/cldnn_engine.h @@ -30,12 +30,12 @@ class clDNNEngine : public InferenceEngine::InferencePluginInternal, public: clDNNEngine(); - InferenceEngine::ExecutableNetworkInternal::Ptr LoadExeNetworkImpl(const InferenceEngine::ICore * core, const InferenceEngine::ICNNNetwork &network, + InferenceEngine::ExecutableNetworkInternal::Ptr LoadExeNetworkImpl(const InferenceEngine::ICNNNetwork &network, const std::map &config) override; - InferenceEngine::ExecutableNetworkInternal::Ptr LoadExeNetworkImpl(const InferenceEngine::ICore * core, const InferenceEngine::ICNNNetwork &network, - InferenceEngine::RemoteContext::Ptr context, - const std::map &config) override; + InferenceEngine::ExecutableNetworkInternal::Ptr LoadExeNetworkImpl(const InferenceEngine::ICNNNetwork &network, + InferenceEngine::RemoteContext::Ptr context, + const std::map &config) override; void SetConfig(const std::map &config) override; InferenceEngine::Parameter GetConfig(const std::string& name, const std::map& options) const override; diff --git a/inference-engine/src/gna_plugin/backend/am_intel_dnn.cpp b/inference-engine/src/gna_plugin/backend/am_intel_dnn.cpp index 6825717fc76..8c7d8f22255 100644 --- a/inference-engine/src/gna_plugin/backend/am_intel_dnn.cpp +++ b/inference-engine/src/gna_plugin/backend/am_intel_dnn.cpp @@ -42,11 +42,11 @@ void GNAPluginNS::backend::AMIntelDNN::BeginNewWrite(uint32_t index) { void GNAPluginNS::backend::AMIntelDNN::Init(void *ptr_memory, uint32_t num_memory_bytes, - intel_dnn_number_type_t number_type, + intel_dnn_number_type_t compute_precision, float scale_factor) { ptr_dnn_memory_ = ptr_memory; num_bytes_dnn_memory_ = num_memory_bytes; - number_type_ = number_type; + compute_precision_ = compute_precision; input_scale_factor_ = scale_factor; ptr_active_outputs_ = nullptr; @@ -342,7 +342,7 @@ void GNAPluginNS::backend::AMIntelDNN::Propagate() { reinterpret_cast(reinterpret_cast(comp->op.recurrent.ptr_feedbacks) + j * comp_pwl->num_columns_out); ApplyRecurrentTransform(comp, j, ptr_feedbacks); // PrintOutputs(i); - ApplyPiecewiseLinearTransform(comp_pwl, number_type_, num_active_outputs, j); + ApplyPiecewiseLinearTransform(comp_pwl, compute_precision_, num_active_outputs, j); } i++; // skip next component } else { @@ -352,9 +352,9 @@ void GNAPluginNS::backend::AMIntelDNN::Propagate() { break; case kDnnConvolutional1dOp:ApplyConvolutional1DTransform(comp); break; - case kDnnPiecewiselinearOp:ApplyPiecewiseLinearTransform(comp, number_type_, num_active_outputs); + case kDnnPiecewiselinearOp:ApplyPiecewiseLinearTransform(comp, compute_precision_, num_active_outputs); break; - case kDnnMaxPoolOp:ApplyMaxPoolTransform(comp, number_type_); + case kDnnMaxPoolOp:ApplyMaxPoolTransform(comp, compute_precision_); break; case kDnnInterleaveOp:ApplyTranspose(comp); break; @@ -633,8 +633,8 @@ void GNAPluginNS::backend::AMIntelDNN::WriteGraphWizModel(const char *filename) graph << "}"; } -void GNAPluginNS::backend::AMIntelDNN::WriteDnnText(const char *filename, intel_dnn_number_type_t number_type) { - if ((number_type_ == kDnnFloat) && (number_type == kDnnInt)) { +void GNAPluginNS::backend::AMIntelDNN::WriteDnnText(const char *filename, intel_dnn_number_type_t logging_precision) { + if ((compute_precision_ == kDnnFloat) && (logging_precision == kDnnInt)) { fprintf(stderr, "Error trying to write floating point DNN as integer in GNAPluginNS::backend::AMIntelDNN::WriteDnnText().\n"); fprintf(stderr, " Please convert to integer first.\n"); throw -1; @@ -653,7 +653,7 @@ void GNAPluginNS::backend::AMIntelDNN::WriteDnnText(const char *filename, intel_ uint32_t layer = 0; out_file << "\n"; - out_file << " " << intel_dnn_number_type_name[number_type] << "\n"; + out_file << " " << intel_dnn_number_type_name[logging_precision] << "\n"; out_file << " " << intel_dnn_softmax_name[softmax_type] << "\n"; out_file << " " << std::dec << num_bytes_dnn_memory_ << "\n"; out_file << " " << std::dec << num_group << "\n"; @@ -701,7 +701,7 @@ void GNAPluginNS::backend::AMIntelDNN::WriteDnnText(const char *filename, intel_ out_file << " " << std::dec << (component[i].orientation_out == kDnnInterleavedOrientation ? "interleaved" : "deinterleaved") << "\n"; - if ((number_type_ == kDnnInt) && (number_type == kDnnFloat)) { + if ((compute_precision_ == kDnnInt) && (logging_precision == kDnnFloat)) { out_file << " " << std::dec << sizeof(float) << "\n"; out_file << " " << std::dec << sizeof(float) << "\n"; } else { @@ -721,14 +721,14 @@ void GNAPluginNS::backend::AMIntelDNN::WriteDnnText(const char *filename, intel_ float output_scale_factor = component[i].output_scale_factor; uint32_t num_weight_rows = (component[i].operation == kDnnDiagonalOp) ? 1 : num_rows_out; uint32_t num_weight_columns = num_rows_in; - if ((number_type_ == kDnnInt) && (number_type == kDnnFloat)) { + if ((compute_precision_ == kDnnInt) && (logging_precision == kDnnFloat)) { out_file << " " << std::dec << 4 << "\n"; out_file << " " << std::dec << 4 << "\n"; } else { out_file << " " << std::dec << num_bytes_per_weight << "\n"; out_file << " " << std::dec << num_bytes_per_bias << "\n"; } - if ((number_type_ == kDnnInt) && (number_type == kDnnFloat)) { + if ((compute_precision_ == kDnnInt) && (logging_precision == kDnnFloat)) { out_file << std::setprecision(12) << std::scientific << " " << 1.0 << "\n"; out_file << std::setprecision(12) << std::scientific << " " << 1.0 << "\n"; } else { @@ -751,7 +751,7 @@ void GNAPluginNS::backend::AMIntelDNN::WriteDnnText(const char *filename, intel_ #ifdef DUMP_WB for (uint32_t row = 0; row < num_weight_rows; row++) { for (uint32_t col = 0; col < num_weight_columns; col++) { - if (number_type == kDnnFloat) { + if (logging_precision == kDnnFloat) { float val = static_cast(ptr_weight[row * num_weight_columns + col]) * ptr_bias[row].multiplier / weight_scale_factor; @@ -768,7 +768,7 @@ void GNAPluginNS::backend::AMIntelDNN::WriteDnnText(const char *filename, intel_ #ifdef DUMP_WB for (uint32_t row = 0; row < num_weight_rows; row++) { for (uint32_t col = 0; col < num_weight_columns; col++) { - if (number_type == kDnnFloat) { + if (logging_precision == kDnnFloat) { out_wfile << std::setprecision(12) << ptr_weight[row * num_weight_columns + col] / weight_scale_factor << " "; } else { @@ -778,7 +778,7 @@ void GNAPluginNS::backend::AMIntelDNN::WriteDnnText(const char *filename, intel_ } } #endif - } else if (number_type_ == kDnnFloat) { + } else if (compute_precision_ == kDnnFloat) { float *ptr_weight = reinterpret_cast(component[i].op.affine.ptr_weights); #ifdef DUMP_WB for (uint32_t row = 0; row < num_weight_rows; row++) { @@ -793,21 +793,25 @@ void GNAPluginNS::backend::AMIntelDNN::WriteDnnText(const char *filename, intel_ fprintf(stderr, "Unsupported weight type in WriteDnnText!\n"); throw -1; } - if (number_type_ == kDnnInt) { + if (compute_precision_ == kDnnInt) { if (num_bytes_per_weight == 1) { intel_compound_bias_t *ptr_biases = reinterpret_cast(component[i].op.affine.ptr_biases); #ifdef DUMP_WB for (uint32_t row = 0; row < num_rows_out; row++) { - out_bfile << std::setw(8) << ptr_biases[row].bias << ", "; - out_bfile << std::setw(8) << int(ptr_biases[row].multiplier) << "\n"; + if (logging_precision == kDnnInt) { + out_bfile << std::setw(8) << ptr_biases[row].bias << ", "; + out_bfile << std::setw(8) << int(ptr_biases[row].multiplier) << "\n"; + } else { + out_bfile << std::setw(8) << ptr_biases[row].bias / output_scale_factor << "\n"; + } } #endif } else { int32_t *ptr_biases = reinterpret_cast(component[i].op.affine.ptr_biases); #ifdef DUMP_WB for (uint32_t row = 0; row < num_rows_out; row++) { - if (number_type == kDnnInt) { + if (logging_precision == kDnnInt) { out_bfile << std::setw(8) << ptr_biases[row] << "\n"; } else { out_bfile << std::setw(8) << ptr_biases[row] / output_scale_factor << "\n"; @@ -844,14 +848,14 @@ void GNAPluginNS::backend::AMIntelDNN::WriteDnnText(const char *filename, intel_ out_file << " " << std::dec << num_feature_maps << "\n"; out_file << " " << std::dec << num_feature_map_rows << "\n"; out_file << " " << std::dec << num_feature_map_columns << "\n"; - if ((number_type_ == kDnnInt) && (number_type == kDnnFloat)) { + if ((compute_precision_ == kDnnInt) && (logging_precision == kDnnFloat)) { out_file << " " << std::dec << 4 << "\n"; out_file << " " << std::dec << 4 << "\n"; } else { out_file << " " << std::dec << num_bytes_per_weight << "\n"; out_file << " " << std::dec << num_bytes_per_bias << "\n"; } - if ((number_type_ == kDnnInt) && (number_type == kDnnFloat)) { + if ((compute_precision_ == kDnnInt) && (logging_precision == kDnnFloat)) { out_file << std::setprecision(12) << std::scientific << " " << 1.0 << "\n"; out_file << std::setprecision(12) << std::scientific << " " << 1.0 << "\n"; } else { @@ -876,7 +880,7 @@ void GNAPluginNS::backend::AMIntelDNN::WriteDnnText(const char *filename, intel_ #ifdef DUMP_WB for (uint32_t row = 0; row < num_filters; row++) { for (uint32_t col = 0; col < num_filter_coefficients; col++) { - if (number_type == kDnnFloat) { + if (logging_precision == kDnnFloat) { float val = static_cast(ptr_weight[row * num_filter_coefficients + col]) * ptr_bias[row].multiplier / weight_scale_factor; out_wfile << std::setprecision(12) <(component[i].op.conv1D.ptr_filters); #ifdef DUMP_WB for (uint32_t row = 0; row < num_filters; row++) { @@ -918,8 +922,8 @@ void GNAPluginNS::backend::AMIntelDNN::WriteDnnText(const char *filename, intel_ throw -1; } - if (number_type_ == kDnnInt) { - if (number_type == kDnnInt) { + if (compute_precision_ == kDnnInt) { + if (logging_precision == kDnnInt) { if (num_bytes_per_weight == 1) { intel_compound_bias_t *ptr_biases = reinterpret_cast(component[i].op.conv1D.ptr_biases); @@ -969,14 +973,14 @@ void GNAPluginNS::backend::AMIntelDNN::WriteDnnText(const char *filename, intel_ uint32_t num_weight_rows = num_columns_out; uint32_t num_weight_columns = num_columns_in + num_columns_out; out_file << " " << std::dec << num_vector_delay << "\n"; - if ((number_type_ == kDnnInt) && (number_type == kDnnFloat)) { + if ((compute_precision_ == kDnnInt) && (logging_precision == kDnnFloat)) { out_file << " " << std::dec << 4 << "\n"; out_file << " " << std::dec << 4 << "\n"; } else { out_file << " " << std::dec << num_bytes_per_weight << "\n"; out_file << " " << std::dec << num_bytes_per_bias << "\n"; } - if ((number_type_ == kDnnInt) && (number_type == kDnnFloat)) { + if ((compute_precision_ == kDnnInt) && (logging_precision == kDnnFloat)) { out_file << std::setprecision(12) << std::scientific << " " << 1.0 << "\n"; out_file << std::setprecision(12) << std::scientific << " " << 1.0 << "\n"; } else { @@ -999,7 +1003,7 @@ void GNAPluginNS::backend::AMIntelDNN::WriteDnnText(const char *filename, intel_ for (uint32_t row = 0; row < num_weight_rows; row++) { out_file << " "; for (uint32_t col = 0; col < num_weight_columns; col++) { - if (number_type == kDnnFloat) { + if (logging_precision == kDnnFloat) { float val = static_cast(ptr_weight[row * num_weight_columns + col]) * ptr_bias[col].multiplier / weight_scale_factor; @@ -1018,7 +1022,7 @@ void GNAPluginNS::backend::AMIntelDNN::WriteDnnText(const char *filename, intel_ for (uint32_t row = 0; row < num_weight_rows; row++) { out_file << " "; for (uint32_t col = 0; col < num_weight_columns; col++) { - if (number_type == kDnnFloat) { + if (logging_precision == kDnnFloat) { out_file << std::setprecision(12) << std::scientific << ptr_weight[row * num_weight_columns + col] / weight_scale_factor << " "; } else { @@ -1029,7 +1033,7 @@ void GNAPluginNS::backend::AMIntelDNN::WriteDnnText(const char *filename, intel_ out_file << "\n"; } #endif - } else if (number_type_ == kDnnFloat) { + } else if (compute_precision_ == kDnnFloat) { float *ptr_weight = reinterpret_cast(component[i].op.recurrent.ptr_weights); #ifdef DUMP_WB for (uint32_t row = 0; row < num_weight_rows; row++) { @@ -1045,8 +1049,8 @@ void GNAPluginNS::backend::AMIntelDNN::WriteDnnText(const char *filename, intel_ fprintf(stderr, "Unsupported weight type in WriteDnnText!\n"); throw -1; } - if (number_type_ == kDnnInt) { - if (number_type == kDnnInt) { + if (compute_precision_ == kDnnInt) { + if (logging_precision == kDnnInt) { if (num_bytes_per_weight == 1) { intel_compound_bias_t *ptr_biases = reinterpret_cast(component[i].op.recurrent.ptr_biases); @@ -1110,7 +1114,7 @@ void GNAPluginNS::backend::AMIntelDNN::WriteDnnText(const char *filename, intel_ out_file << " " << std::dec << sizeof(int16_t) << "\n"; out_file << " " << std::dec << sizeof(int16_t) << "\n"; out_file << " " << std::dec << sizeof(int32_t) << "\n"; - if (number_type == kDnnFloat) { + if (logging_precision == kDnnFloat) { out_file << std::setprecision(12) << std::scientific << " " << 1.0 << "\n"; out_file << " " << std::dec << 0 << "\n"; out_file << " " << "0x" << std::setfill('0') << std::setw(8) << std::hex @@ -1121,7 +1125,7 @@ void GNAPluginNS::backend::AMIntelDNN::WriteDnnText(const char *filename, intel_ out_file << " " << std::dec << num_segments << "\n"; out_file << " " << "0x" << std::setfill('0') << std::setw(8) << std::hex << GNAPluginNS::memory::MemoryOffset(component[i].op.pwl.ptr_segments, ptr_dnn_memory_) << "\n"; - if (number_type_ == kDnnInt) { + if (compute_precision_ == kDnnInt) { out_file << " "; for (int segment = 0; segment < num_segments; segment++) { out_file << "0x" << std::setfill('0') << std::setw(4) << std::hex @@ -1862,7 +1866,7 @@ void GNAPluginNS::backend::AMIntelDNN::WriteInputAndOutputText() { for (int j = 0; j < component[i].num_columns_out; j++) { float floatValue = 0.f; if (component[i].num_bytes_per_output == 4) { - if (number_type_ == kDnnInt) { + if (compute_precision_ == kDnnInt) { auto value = reinterpret_cast(component[i].ptr_outputs)[k * component[i].num_columns_out+ j]; floatValue = static_cast(value); @@ -1903,7 +1907,7 @@ void GNAPluginNS::backend::AMIntelDNN::WriteInputAndOutputText() { for (int j = 0; j < component[i].num_columns_in; j++) { float floatValue = 0.f; if (component[i].num_bytes_per_input == 4) { - if (number_type_ == kDnnInt) { + if (compute_precision_ == kDnnInt) { auto value = reinterpret_cast(component[i].ptr_inputs)[k * component[i].num_columns_in + j]; floatValue = static_cast(value); } else { diff --git a/inference-engine/src/gna_plugin/backend/am_intel_dnn.hpp b/inference-engine/src/gna_plugin/backend/am_intel_dnn.hpp index fd8e347b20d..66536ff519e 100644 --- a/inference-engine/src/gna_plugin/backend/am_intel_dnn.hpp +++ b/inference-engine/src/gna_plugin/backend/am_intel_dnn.hpp @@ -36,14 +36,14 @@ public: ptr_priors(NULL), ptr_dnn_memory_(NULL), num_bytes_dnn_memory_(0), - number_type_(kDnnNumNumberType) { + compute_precision_(kDnnNumNumberType) { } ~AMIntelDNN(); void Init(void *ptr_memory, uint32_t num_memory_bytes, - intel_dnn_number_type_t number_type, + intel_dnn_number_type_t compute_precision, float scale_factor); void InitActiveList(uint32_t *ptr_active_list); @@ -235,7 +235,7 @@ public: void WriteGraphWizModel(const char *filename); - void WriteDnnText(const char *filename, intel_dnn_number_type_t number_type); + void WriteDnnText(const char *filename, intel_dnn_number_type_t logging_precision); #if GNA_LIB_VER == 2 @@ -291,7 +291,7 @@ private: uint32_t num_bytes_dnn_memory_; uint32_t *ptr_active_outputs_; uint32_t num_active_outputs_; - intel_dnn_number_type_t number_type_; + intel_dnn_number_type_t compute_precision_; float input_scale_factor_; uint32_t dump_write_index = 0; diff --git a/inference-engine/src/gna_plugin/gna_plugin.hpp b/inference-engine/src/gna_plugin/gna_plugin.hpp index f59d525a295..64a47467431 100644 --- a/inference-engine/src/gna_plugin/gna_plugin.hpp +++ b/inference-engine/src/gna_plugin/gna_plugin.hpp @@ -109,7 +109,7 @@ class GNAPlugin : public InferenceEngine::IInferencePluginInternal, public std:: InferenceEngine::RemoteContext::Ptr context) override { THROW_GNA_EXCEPTION << "Not implemented"; } void Infer(const InferenceEngine::Blob &input, InferenceEngine::Blob &result); void SetCore(InferenceEngine::ICore*) noexcept override {} - const InferenceEngine::ICore* GetCore() const noexcept override {return nullptr;} + InferenceEngine::ICore* GetCore() const noexcept override {return nullptr;} void Reset(); void QueryNetwork(const InferenceEngine::ICNNNetwork &network, const std::map& config, diff --git a/inference-engine/src/gna_plugin/gna_plugin_internal.hpp b/inference-engine/src/gna_plugin/gna_plugin_internal.hpp index dc5a5840035..0f9ec354f83 100644 --- a/inference-engine/src/gna_plugin/gna_plugin_internal.hpp +++ b/inference-engine/src/gna_plugin/gna_plugin_internal.hpp @@ -28,7 +28,7 @@ private: } public: - InferenceEngine::ExecutableNetworkInternal::Ptr LoadExeNetworkImpl(const InferenceEngine::ICore * core, + InferenceEngine::ExecutableNetworkInternal::Ptr LoadExeNetworkImpl( const InferenceEngine::ICNNNetwork &network, const std::map &config) override { Config updated_config(defaultConfig); diff --git a/inference-engine/src/gna_plugin/gna_plugin_query_api.cpp b/inference-engine/src/gna_plugin/gna_plugin_query_api.cpp index 9d1664217d1..ec7aad5b036 100644 --- a/inference-engine/src/gna_plugin/gna_plugin_query_api.cpp +++ b/inference-engine/src/gna_plugin/gna_plugin_query_api.cpp @@ -24,6 +24,10 @@ Parameter GNAPlugin::GetMetric(const std::string& name, const std::map> queryApiSupported = { {METRIC_KEY(AVAILABLE_DEVICES), [this]() {return GetAvailableDevices();}}, {METRIC_KEY(SUPPORTED_CONFIG_KEYS), [this]() {return config.GetSupportedKeys();}}, + {METRIC_KEY(OPTIMAL_NUMBER_OF_INFER_REQUESTS), [this]() { + uint32_t nireq = 1; + return nireq; + }}, {METRIC_KEY(FULL_DEVICE_NAME), [&options, this]() { auto availableDevices = GetAvailableDevices().as>(); diff --git a/inference-engine/src/hetero_plugin/hetero_async_infer_request.cpp b/inference-engine/src/hetero_plugin/hetero_async_infer_request.cpp index 24c091ef856..0ad2023f48f 100644 --- a/inference-engine/src/hetero_plugin/hetero_async_infer_request.cpp +++ b/inference-engine/src/hetero_plugin/hetero_async_infer_request.cpp @@ -5,7 +5,6 @@ #include #include #include "hetero_async_infer_request.hpp" -#include #include using namespace HeteroPlugin; diff --git a/inference-engine/src/hetero_plugin/hetero_executable_network.cpp b/inference-engine/src/hetero_plugin/hetero_executable_network.cpp index e9660bbebb1..686f728cf05 100644 --- a/inference-engine/src/hetero_plugin/hetero_executable_network.cpp +++ b/inference-engine/src/hetero_plugin/hetero_executable_network.cpp @@ -7,7 +7,6 @@ #include "hetero_async_infer_request.hpp" #include "ie_util_internal.hpp" #include "hetero_graph_splitter.hpp" -#include "file_utils.h" #include "xml_parse_utils.h" #include @@ -22,12 +21,9 @@ #include #include -#include "details/caseless.hpp" #include "ie_plugin_config.hpp" #include "cpp_interfaces/interface/ie_internal_plugin_config.hpp" -#include "cpp_interfaces/base/ie_inference_plugin_api.hpp" #include "hetero/hetero_plugin_config.hpp" -#include "precision_utils.h" #include "hetero_plugin.hpp" #include "network_serializer.h" @@ -141,10 +137,10 @@ void dumpGraph(InferenceEngine::ICNNNetwork &network, HeteroExecutableNetwork::HeteroExecutableNetwork(const InferenceEngine::ICNNNetwork& network_, const Engine::Configs& config, - Engine* plugin): + Engine* heteroPlugin): InferenceEngine::ExecutableNetworkThreadSafeDefault( nullptr, std::make_shared()), - _plugin{plugin}, + _heteroPlugin(heteroPlugin), _name{network_.getName()}, _config{config} { auto networkPtr = cloneNet(network_); @@ -171,7 +167,7 @@ HeteroExecutableNetwork::HeteroExecutableNetwork(const InferenceEngine::ICNNNetw if (allEmpty) { auto it = _config.find("TARGET_FALLBACK"); if (it != _config.end()) { - plugin->SetAffinity(network, _config); + _heteroPlugin->SetAffinity(network, _config); } else { THROW_IE_EXCEPTION << "The 'TARGET_FALLBACK' option was not defined for heterogeneous plugin"; } @@ -230,25 +226,8 @@ HeteroExecutableNetwork::HeteroExecutableNetwork(const InferenceEngine::ICNNNetw network.getOutputsInfo(externalOutputsData); auto subgraphs = splitGraph(network, getAffinities(network)); - sortSubgraphs(subgraphs); - - std::vector descs; - std::vector tempLayers; - - for (auto &&subgraph : subgraphs) { - assert(!subgraph.empty()); - auto affinity = (*subgraph.begin())->affinity; - assert(!affinity.empty()); - _affinities.push_back(affinity); - if (_plugin->_plugins.end() == _plugin->_plugins.find(affinity)) { - IE_SUPPRESS_DEPRECATED_START - _plugin->_plugins[affinity] = _plugin->GetDevicePlugin(affinity); - IE_SUPPRESS_DEPRECATED_END - } - } - if (dumpDotFile) { std::stringstream stream(std::stringstream::out); stream << "hetero_subgraphs_" << network.getName() << ".dot"; @@ -262,6 +241,8 @@ HeteroExecutableNetwork::HeteroExecutableNetwork(const InferenceEngine::ICNNNetw networkStats = nullptr; } + std::vector descs; + std::vector tempLayers; for (auto &&subgraph : subgraphs) { auto affinity = (*subgraph.begin())->affinity; tempLayers.assign(subgraph.begin(), subgraph.end()); @@ -289,11 +270,9 @@ HeteroExecutableNetwork::HeteroExecutableNetwork(const InferenceEngine::ICNNNetw inp->second->getPreProcess() = it.second->getPreProcess(); } } + // go over all inputs/outputs and right now // set precision for intermediate data (not for external) to FP32 - // later on we have to add Plugin::getPreferableInputPrecision(network) and - // Plugin::getPreferableOutputPrecision(network) and set precision based on this info - // TODO(amalyshe) add clever selectino of precision for intermediate blobs for (auto &&it : clonedInputs) { if (externalInputsData.find(it.first) == externalInputsData.end()) { it.second->setPrecision(Precision::FP32); @@ -327,36 +306,24 @@ HeteroExecutableNetwork::HeteroExecutableNetwork(const InferenceEngine::ICNNNetw })); auto cfg = _config; - cfg[PluginConfigInternalParams::KEY_SUBNETWORK_WITH_NETWORK_INPUTS] = isInputSubnetwork - ? CONFIG_VALUE(YES) - : CONFIG_VALUE(NO); - IE_SUPPRESS_DEPRECATED_START - auto plugin = _plugin->_plugins[d._device]; - d._network = plugin._ref.LoadNetwork(d._clonedNetwork, Engine::GetSupportedConfig(plugin._config, cfg, plugin._ref)); - IE_SUPPRESS_DEPRECATED_END + cfg[PluginConfigInternalParams::KEY_SUBNETWORK_WITH_NETWORK_INPUTS] = + isInputSubnetwork ? CONFIG_VALUE(YES) : CONFIG_VALUE(NO); + + auto deviceName = d._device; + auto metaDevices = _heteroPlugin->GetDevicePlugins(deviceName, cfg); + assert(metaDevices.size() == 1); + + auto loadConfig = metaDevices[deviceName]; + d._network = _heteroPlugin->GetCore()->LoadNetwork(d._clonedNetwork, deviceName, loadConfig); } networks = std::move(descs); } -namespace { - -IE_SUPPRESS_DEPRECATED_START -IInferencePluginAPI * getInferencePluginAPIInterface(IInferencePlugin * iplugin) { - return dynamic_cast(iplugin); -} - -IInferencePluginAPI * getInferencePluginAPIInterface(InferenceEnginePluginPtr iplugin) { - return getInferencePluginAPIInterface(static_cast(iplugin.operator->())); -} -IE_SUPPRESS_DEPRECATED_END - -} // namespace - HeteroExecutableNetwork::HeteroExecutableNetwork(std::istream& heteroModel, const std::map& configs, - Engine* plugin) : - _plugin(plugin) { + Engine* heteroPlugin) : + _heteroPlugin(heteroPlugin) { std::string heteroXmlStr; std::getline(heteroModel, heteroXmlStr); @@ -400,26 +367,17 @@ HeteroExecutableNetwork::HeteroExecutableNetwork(std::istream& pugi::xml_node subnetworksNode = heteroNode.child("subnetworks"); for (auto subnetworkNode = subnetworksNode.child("subnetwork"); !subnetworkNode.empty(); subnetworkNode = subnetworkNode.next_sibling("subnetwork")) { - auto device = GetStrAttr(subnetworkNode, "device"); - _affinities.push_back(device); + auto deviceName = GetStrAttr(subnetworkNode, "device"); - if (_plugin->_plugins.end() == _plugin->_plugins.find(device)) { - IE_SUPPRESS_DEPRECATED_START - _plugin->_plugins[device] = _plugin->GetDevicePlugin(device); - IE_SUPPRESS_DEPRECATED_END - } - - auto& plugin = _plugin->_plugins[device]; - auto supportedConfig = Engine::GetSupportedConfig(plugin._config, importedConfigs, plugin._ref); - IE_SUPPRESS_DEPRECATED_START - auto pluginAPI = getInferencePluginAPIInterface(plugin._ref); - IE_SUPPRESS_DEPRECATED_END + auto metaDevices = _heteroPlugin->GetDevicePlugins(deviceName, importedConfigs); + assert(metaDevices.size() == 1); + auto& loadConfig = metaDevices[deviceName]; InferenceEngine::ExecutableNetwork executableNetwork; CNNNetwork cnnnetwork; bool loaded = false; try { - executableNetwork = pluginAPI->ImportNetwork(heteroModel, supportedConfig); + executableNetwork = _heteroPlugin->GetCore()->ImportNetwork(heteroModel, deviceName, loadConfig); } catch(InferenceEngine::details::InferenceEngineException& ie_ex) { if (std::string::npos != std::string{ie_ex.what()}.find(NOT_IMPLEMENTED_str)) { // read XML content @@ -439,7 +397,7 @@ HeteroExecutableNetwork::HeteroExecutableNetwork(std::istream& heteroModel.read(dataBlob->buffer(), dataSize); } - cnnnetwork = _plugin->GetCore()->ReadNetwork(xmlString, std::move(dataBlob)); + cnnnetwork = _heteroPlugin->GetCore()->ReadNetwork(xmlString, std::move(dataBlob)); auto inputs = cnnnetwork.getInputsInfo(); auto inputsNode = subnetworkNode.child("inputs"); for (auto inputNode = inputsNode.child("input"); !inputNode.empty(); inputNode = inputNode.next_sibling("input")) { @@ -455,9 +413,7 @@ HeteroExecutableNetwork::HeteroExecutableNetwork(std::istream& for (auto outputNode = outputsNode.child("output"); !outputNode.empty(); outputNode = outputNode.next_sibling("output")) { outputs[GetStrAttr(outputNode, "name")]->setPrecision(Precision::FromStr(GetStrAttr(outputNode, "precision"))); } - IE_SUPPRESS_DEPRECATED_START - executableNetwork = plugin._ref.LoadNetwork(cnnnetwork, supportedConfig); - IE_SUPPRESS_DEPRECATED_END + executableNetwork = _heteroPlugin->GetCore()->LoadNetwork(cnnnetwork, deviceName, loadConfig); loaded = true; } else { throw; @@ -477,7 +433,7 @@ HeteroExecutableNetwork::HeteroExecutableNetwork(std::istream& } descs.emplace_back(NetworkDesc{ - device, + deviceName, loaded ? CNNNetwork{cloneNet(static_cast(cnnnetwork))} : CNNNetwork{}, executableNetwork, }); @@ -578,10 +534,10 @@ void HeteroExecutableNetwork::CreateInferRequest(IInferRequest::Ptr &asyncReques auto heteroInferRequest = std::dynamic_pointer_cast( CreateInferRequestImpl(_networkInputs, _networkOutputs)); heteroInferRequest->setPointerToExecutableNetworkInternal(shared_from_this()); - auto asyncTreadSafeImpl = std::make_shared(heteroInferRequest, _taskExecutor, _callbackExecutor); - asyncRequest.reset(new InferRequestBase(asyncTreadSafeImpl), + auto asyncThreadSafeImpl = std::make_shared(heteroInferRequest, _taskExecutor, _callbackExecutor); + asyncRequest.reset(new InferRequestBase(asyncThreadSafeImpl), [](IInferRequest *p) { p->Release(); }); - asyncTreadSafeImpl->SetPointerToPublicInterface(asyncRequest); + asyncThreadSafeImpl->SetPointerToPublicInterface(asyncRequest); } void HeteroExecutableNetwork::GetConfig(const std::string &name, InferenceEngine::Parameter &result, InferenceEngine::ResponseDesc *) const { diff --git a/inference-engine/src/hetero_plugin/hetero_executable_network.hpp b/inference-engine/src/hetero_plugin/hetero_executable_network.hpp index a27570a699c..736cdd162b2 100644 --- a/inference-engine/src/hetero_plugin/hetero_executable_network.hpp +++ b/inference-engine/src/hetero_plugin/hetero_executable_network.hpp @@ -39,7 +39,7 @@ public: /** * @brief constructor */ - HeteroExecutableNetwork(const InferenceEngine::ICNNNetwork& network, + HeteroExecutableNetwork(const InferenceEngine::ICNNNetwork& network, const std::map& config, Engine* plugin); @@ -71,9 +71,8 @@ private: }; std::vector networks; - Engine* _plugin; + Engine* _heteroPlugin; std::string _name; - std::vector _affinities; std::map _config; }; diff --git a/inference-engine/src/hetero_plugin/hetero_plugin.cpp b/inference-engine/src/hetero_plugin/hetero_plugin.cpp index 953fa9049ed..0e7d4b995ec 100644 --- a/inference-engine/src/hetero_plugin/hetero_plugin.cpp +++ b/inference-engine/src/hetero_plugin/hetero_plugin.cpp @@ -3,9 +3,7 @@ // #include "ie_metric_helpers.hpp" -#include "ie_plugin_dispatcher.hpp" #include "hetero_plugin.hpp" -#include "ie_util_internal.hpp" #include #include #include @@ -17,7 +15,6 @@ #include "hetero/hetero_plugin_config.hpp" #include #include "hetero_executable_network.hpp" -#include "cpp_interfaces/base/ie_inference_plugin_api.hpp" using namespace InferenceEngine; using namespace InferenceEngine::PluginConfigParams; @@ -31,163 +28,88 @@ static Version heteroPluginDescription = { "heteroPlugin" // plugin description message }; -void Engine::GetVersion(const Version *&versionInfo)noexcept { - versionInfo = &heteroPluginDescription; -} - Engine::Engine() { _pluginName = "HETERO"; - _config[InferenceEngine::PluginConfigParams::KEY_EXCLUSIVE_ASYNC_REQUESTS] = "YES"; + _config[KEY_EXCLUSIVE_ASYNC_REQUESTS] = YES; _config[HETERO_CONFIG_KEY(DUMP_GRAPH_DOT)] = NO; } -InferenceEngine::ExecutableNetworkInternal::Ptr Engine::LoadExeNetworkImpl(const ICore* /*core*/, - const InferenceEngine::ICNNNetwork& network, - const Configs& config) { - // TODO(amalyshe) do we need here verification of input precisions? - Configs tconfig; - tconfig = config; +namespace { - // we must not override the parameter, but need to copy everything from plugin config - for (auto && c : _config) { - if (tconfig.find(c.first) == tconfig.end()) { - tconfig[c.first] = c.second; - } +Engine::Configs mergeConfigs(Engine::Configs config, const Engine::Configs & local) { + for (auto && kvp : local) { + config[kvp.first] = kvp.second; + } + return config; +} + +} // namespace + +InferenceEngine::ExecutableNetworkInternal::Ptr Engine::LoadExeNetworkImpl(const InferenceEngine::ICNNNetwork& network, + const Configs& config) { + if (GetCore() == nullptr) { + THROW_IE_EXCEPTION << "Please, work with HETERO device via InferencEngine::Core object"; } - return std::make_shared(*cloneNet(network), tconfig, this); + return std::make_shared(*cloneNet(network), mergeConfigs(_config, config), this); } ExecutableNetwork Engine::ImportNetworkImpl(std::istream& heteroModel, const Configs& config) { - Configs tconfig; - tconfig = config; - - // we must not override the parameter, but need to copy everything from plugin config - for (auto && c : _config) { - if (tconfig.find(c.first) == tconfig.end()) { - tconfig[c.first] = c.second; - } + if (GetCore() == nullptr) { + THROW_IE_EXCEPTION << "Please, work with HETERO device via InferencEngine::Core object"; } IExecutableNetwork::Ptr executableNetwork; - // Use config provided by an user ignoring default config executableNetwork.reset(new ExecutableNetworkBase( - std::make_shared(heteroModel, tconfig, this)), + std::make_shared(heteroModel, mergeConfigs(_config, config), this)), [](InferenceEngine::details::IRelease *p) {p->Release();}); return ExecutableNetwork{executableNetwork}; } -namespace { - -IE_SUPPRESS_DEPRECATED_START - -IInferencePluginAPI * getInferencePluginAPIInterface(IInferencePlugin * iplugin) { - return dynamic_cast(iplugin); -} - -IInferencePluginAPI * getInferencePluginAPIInterface(InferenceEnginePluginPtr iplugin) { - return getInferencePluginAPIInterface(static_cast(iplugin.operator->())); -} - -IInferencePluginAPI * getInferencePluginAPIInterface(InferencePlugin plugin) { - return getInferencePluginAPIInterface(static_cast(plugin)); -} - -} // namespace - -Engine::Configs Engine::GetSupportedConfig(const Engine::Configs& globalConfig, - const Engine::Configs& localConfig, - const InferenceEngine::InferencePlugin& plugin) { - auto pluginApi = getInferencePluginAPIInterface(plugin); - std::vector supportedConfigKeys = pluginApi->GetMetric(METRIC_KEY(SUPPORTED_CONFIG_KEYS), {}); +Engine::Configs Engine::GetSupportedConfig(const Engine::Configs& config, const std::string & deviceName) const { + std::vector supportedConfigKeys = GetCore()->GetMetric(deviceName, METRIC_KEY(SUPPORTED_CONFIG_KEYS)); Engine::Configs supportedConfig; for (auto&& key : supportedConfigKeys) { - auto itKey = localConfig.find(key); - if (localConfig.end() != itKey) { + auto itKey = config.find(key); + if (config.end() != itKey) { supportedConfig[key] = itKey->second; - } else { - itKey = globalConfig.find(key); - if (globalConfig.end() != itKey) { - supportedConfig[key] = itKey->second; - } } } return supportedConfig; } -Engine::PluginEntry Engine::GetDevicePlugin(const std::string& deviceWithID) const { - InferenceEngine::InferencePlugin plugin; - DeviceIDParser deviceParser(deviceWithID); - std::string deviceName = deviceParser.getDeviceName(); +Engine::DeviceMetaInformationMap Engine::GetDevicePlugins(const std::string& targetFallback, + const Configs & localConfig) const { + auto getDeviceConfig = [&](const std::string & deviceWithID) { + DeviceIDParser deviceParser(deviceWithID); + std::string deviceName = deviceParser.getDeviceName(); + Configs tconfig = mergeConfigs(_config, localConfig); - if (nullptr == _core) { - IE_SUPPRESS_DEPRECATED_START - // try to create plugin - PluginDispatcher dispatcher({file_name_t()}); - plugin = dispatcher.getPluginByDevice(deviceName); - IE_SUPPRESS_DEPRECATED_END - } else { - plugin = InferencePlugin{_core->GetPluginByName(deviceName)}; - } - - try { - for (auto&& ext : _extensions) { - plugin.AddExtension(ext); + // set device ID if any + std::string deviceIDLocal = deviceParser.getDeviceID(); + if (!deviceIDLocal.empty()) { + tconfig[KEY_DEVICE_ID] = deviceIDLocal; } - } catch (InferenceEngine::details::InferenceEngineException &) {} - Configs pluginConfig = GetSupportedConfig(_config, {}, plugin); + return GetSupportedConfig(tconfig, deviceName); + }; - // set device ID if any - std::string deviceIDLocal = deviceParser.getDeviceID(); - if (!deviceIDLocal.empty()) { - pluginConfig = GetSupportedConfig(pluginConfig, { { KEY_DEVICE_ID, deviceIDLocal } }, plugin); - } - - return { plugin, pluginConfig }; -} - -IE_SUPPRESS_DEPRECATED_END - -Engine::Plugins Engine::GetDevicePlugins(const std::string& targetFallback) const { - auto devices = InferenceEngine::DeviceIDParser::getHeteroDevices(targetFallback); - Engine::Plugins plugins = _plugins; - for (auto&& device : devices) { - auto itPlugin = plugins.find(device); - if (plugins.end() == itPlugin) { - IE_SUPPRESS_DEPRECATED_START - plugins[device] = GetDevicePlugin(device); - IE_SUPPRESS_DEPRECATED_END + auto fallbackDevices = InferenceEngine::DeviceIDParser::getHeteroDevices(targetFallback); + Engine::DeviceMetaInformationMap metaDevices; + for (auto&& deviceName : fallbackDevices) { + auto itPlugin = metaDevices.find(deviceName); + if (metaDevices.end() == itPlugin) { + metaDevices[deviceName] = getDeviceConfig(deviceName); } } - return plugins; -} - -Engine::Plugins Engine::GetDevicePlugins(const std::string& targetFallback) { - _plugins = const_cast(this)->GetDevicePlugins(targetFallback); - return _plugins; + return metaDevices; } void Engine::SetConfig(const Configs &configs) { for (auto&& config : configs) { _config[config.first] = config.second; } - - for (auto&& plugin : _plugins) { - plugin.second._config = GetSupportedConfig(plugin.second._config, configs, plugin.second._ref); - } -} - -void Engine::AddExtension(InferenceEngine::IExtensionPtr extension) { - _extensions.emplace_back(extension); - try { - for (auto&& plugin : _plugins) { - IE_SUPPRESS_DEPRECATED_START - plugin.second._ref.AddExtension(extension); - IE_SUPPRESS_DEPRECATED_END - } - } catch (InferenceEngine::details::InferenceEngineException &) {} } HeteroLayerColorer::HeteroLayerColorer(const std::vector& devices) { @@ -206,19 +128,8 @@ void HeteroLayerColorer::operator()(const CNNLayerPtr layer, } void Engine::SetAffinity(InferenceEngine::ICNNNetwork &network, const Configs &config) { - Configs tconfig = _config; - for (auto && value : config) { - tconfig[value.first] = value.second; - } - - auto it = tconfig.find("TARGET_FALLBACK"); - if (it == tconfig.end()) { - THROW_IE_EXCEPTION << "The 'TARGET_FALLBACK' option was not defined for heterogeneous plugin"; - } - - GetDevicePlugins(it->second); QueryNetworkResult qr; - QueryNetwork(network, tconfig, qr); + QueryNetwork(network, config, qr); details::CNNNetworkIterator i(&network); while (i != details::CNNNetworkIterator()) { @@ -230,7 +141,12 @@ void Engine::SetAffinity(InferenceEngine::ICNNNetwork &network, const Configs &c i++; } - if (YES == tconfig[HETERO_CONFIG_KEY(DUMP_GRAPH_DOT)]) { + auto dumpDot = [](const Configs & config) { + auto it = config.find(HETERO_CONFIG_KEY(DUMP_GRAPH_DOT)); + return it != config.end() ? it->second == YES : false; + }; + + if (dumpDot(config) || dumpDot(_config)) { std::unordered_set devicesSet; details::CNNNetworkIterator i(&network); while (i != details::CNNNetworkIterator()) { @@ -245,52 +161,49 @@ void Engine::SetAffinity(InferenceEngine::ICNNNetwork &network, const Configs &c stream << "hetero_affinity_" << network.getName() << ".dot"; std::ofstream file(stream.str()); - saveGraphToDot(network, file, HeteroLayerColorer{devices}); } } void Engine::QueryNetwork(const ICNNNetwork &network, const Configs& config, QueryNetworkResult &qr) const { - auto it = config.find("TARGET_FALLBACK"); - if (it == config.end()) { - it = _config.find("TARGET_FALLBACK"); - - if (it == _config.end()) { - THROW_IE_EXCEPTION << "The 'TARGET_FALLBACK' option was not defined for heterogeneous plugin"; - } + if (GetCore() == nullptr) { + THROW_IE_EXCEPTION << "Please, work with HETERO device via InferencEngine::Core object"; } - Plugins plugins = GetDevicePlugins(it->second); + auto tconfig = mergeConfigs(_config, config); + auto it = tconfig.find("TARGET_FALLBACK"); + if (it == tconfig.end()) { + THROW_IE_EXCEPTION << "The 'TARGET_FALLBACK' option was not defined for heterogeneous plugin"; + } - qr.rc = StatusCode::OK; + std::string fallbackDevicesStr = it->second; + DeviceMetaInformationMap metaDevices = GetDevicePlugins(fallbackDevicesStr, tconfig); std::map queryResults; - // go over devices, create appropriate plugins and - for (auto&& value : plugins) { - auto& device = value.first; - auto& plugin = value.second; - QueryNetworkResult r; - IE_SUPPRESS_DEPRECATED_START - plugin._ref.QueryNetwork(network, GetSupportedConfig(plugin._config, config, plugin._ref), r); - IE_SUPPRESS_DEPRECATED_END - queryResults[device] = r; + // go over devices and call query network + for (auto&& metaDevice : metaDevices) { + auto& deviceName = metaDevice.first; + queryResults[deviceName] = GetCore()->QueryNetwork(network, deviceName, metaDevice.second); } // WARNING: Here is devices with user set priority - auto falbackDevices = InferenceEngine::DeviceIDParser::getHeteroDevices(it->second); + auto fallbackDevices = InferenceEngine::DeviceIDParser::getHeteroDevices(fallbackDevicesStr); details::CNNNetworkIterator i(&network); while (i != details::CNNNetworkIterator()) { CNNLayer::Ptr layer = *i; - for (auto&& device : falbackDevices) { - auto& deviceQueryResult = queryResults[device]; + for (auto&& deviceName : fallbackDevices) { + auto& deviceQueryResult = queryResults[deviceName]; if (deviceQueryResult.supportedLayersMap.find(layer->name) != deviceQueryResult.supportedLayersMap.end()) { - qr.supportedLayersMap[layer->name] = device; + qr.supportedLayersMap[layer->name] = deviceName; break; } } i++; } + + // set OK status + qr.rc = StatusCode::OK; } Parameter Engine::GetMetric(const std::string& name, const std::map & /*options*/) const { @@ -317,6 +230,13 @@ Parameter Engine::GetConfig(const std::string& name, const std::mapsecond == YES; return { dump }; + } else if (name == "TARGET_FALLBACK") { + auto it = _config.find("TARGET_FALLBACK"); + if (it == _config.end()) { + THROW_IE_EXCEPTION << "Value for TARGET_FALLBACK is not set"; + } else { + return { it->second }; + } } else { THROW_IE_EXCEPTION << "Unsupported config key: " << name; } diff --git a/inference-engine/src/hetero_plugin/hetero_plugin.hpp b/inference-engine/src/hetero_plugin/hetero_plugin.hpp index 030dc76abe5..9b6cbd6043e 100644 --- a/inference-engine/src/hetero_plugin/hetero_plugin.hpp +++ b/inference-engine/src/hetero_plugin/hetero_plugin.hpp @@ -21,55 +21,34 @@ namespace HeteroPlugin { class Engine : public InferenceEngine::InferencePluginInternal { public: using Configs = std::map; - - struct PluginEntry { - IE_SUPPRESS_DEPRECATED_START - InferenceEngine::InferencePlugin _ref; - IE_SUPPRESS_DEPRECATED_END - Configs _config; - }; - - using Plugins = std::unordered_map; - - using Devices = std::vector; + using DeviceMetaInformationMap = std::unordered_map; Engine(); - void GetVersion(const InferenceEngine::Version *&versionInfo) noexcept; - InferenceEngine::ExecutableNetworkInternal::Ptr - LoadExeNetworkImpl(const InferenceEngine::ICore * core, const InferenceEngine::ICNNNetwork &network, const Configs &config) override; + LoadExeNetworkImpl(const InferenceEngine::ICNNNetwork &network, const Configs &config) override; + void SetConfig(const Configs &config) override; - void SetAffinity(InferenceEngine::ICNNNetwork& network, const Configs &config); - - void AddExtension(InferenceEngine::IExtensionPtr extension)override; - void QueryNetwork(const InferenceEngine::ICNNNetwork &network, const Configs& config, InferenceEngine::QueryNetworkResult &res) const override; - InferenceEngine::Parameter GetMetric(const std::string& name, - const std::map & options) const override; + InferenceEngine::Parameter GetMetric(const std::string& name, const std::map & options) const override; - InferenceEngine::Parameter GetConfig(const std::string& name, - const std::map & options) const override; - - IE_SUPPRESS_DEPRECATED_START - - PluginEntry GetDevicePlugin(const std::string& device) const; - - static Configs GetSupportedConfig(const Configs& globalConfig, const Configs& localConfig, const InferenceEngine::InferencePlugin& plugin); - - IE_SUPPRESS_DEPRECATED_END - - Plugins GetDevicePlugins(const std::string& targetFallback); - - Plugins GetDevicePlugins(const std::string& targetFallback) const; + InferenceEngine::Parameter GetConfig(const std::string& name, const std::map & options) const override; ExecutableNetwork ImportNetworkImpl(std::istream& heteroModel, const Configs& config) override; - Plugins _plugins; - std::vector _extensions; + + void SetAffinity(InferenceEngine::ICNNNetwork& network, const Configs &config); + + DeviceMetaInformationMap GetDevicePlugins(const std::string& targetFallback, + const Configs & localConfig) const; + +private: + Configs GetSupportedConfig(const Configs& config, const std::string & deviceName) const; }; struct HeteroLayerColorer { diff --git a/inference-engine/src/inference_engine/CMakeLists.txt b/inference-engine/src/inference_engine/CMakeLists.txt index 832d69c495f..091e68f1972 100644 --- a/inference-engine/src/inference_engine/CMakeLists.txt +++ b/inference-engine/src/inference_engine/CMakeLists.txt @@ -131,10 +131,6 @@ if(ENABLE_PROFILING_ITT AND INTEL_ITT_LIBS) target_compile_definitions(${TARGET_NAME}_obj PRIVATE $) endif() -if(ENABLE_IR_READER) - target_compile_definitions(${TARGET_NAME}_obj PRIVATE ENABLE_IR_READER) -endif() - target_include_directories(${TARGET_NAME}_obj PRIVATE $) if(ENABLE_MKL_DNN) @@ -172,7 +168,7 @@ endif() target_compile_definitions(${TARGET_NAME} PRIVATE IMPLEMENT_INFERENCE_ENGINE_API) ie_register_plugins(MAIN_TARGET ${TARGET_NAME} - POSSIBLE_PLUGINS HeteroPlugin clDNNPlugin GNAPlugin MKLDNNPlugin myriadPlugin) + POSSIBLE_PLUGINS MultiDevicePlugin HeteroPlugin clDNNPlugin GNAPlugin MKLDNNPlugin myriadPlugin) # Static library used for unit tests which are always built diff --git a/inference-engine/src/inference_engine/cnn_network_ngraph_impl.cpp b/inference-engine/src/inference_engine/cnn_network_ngraph_impl.cpp index 9b460bcbb04..16190983511 100644 --- a/inference-engine/src/inference_engine/cnn_network_ngraph_impl.cpp +++ b/inference-engine/src/inference_engine/cnn_network_ngraph_impl.cpp @@ -23,6 +23,7 @@ #include #include #include +#include #include #include "ngraph_ops/eltwise.hpp" @@ -76,6 +77,10 @@ static std::shared_ptr copyFunction(const std::shared_ptr& graph) { + if (graph == nullptr) { + THROW_IE_EXCEPTION << "CNNNetwork was not initialized: 'graph' object is empty"; + } + // Copy nGraph function network = std::make_shared(copyFunction(graph, false, {})); actual = network.get(); @@ -141,8 +146,10 @@ CNNNetworkNGraphImpl::CNNNetworkNGraphImpl(const std::shared_ptr& nGra keep_input_info(*this, ptr); } for (auto& output : _outputData) { - // Convert precision into native format. Be consistent with possible convertation to CNNNetwork later. - if (output.second->getPrecision() != Precision::FP32 && + // Convert precision into native format. Be consistent with possible conversion to CNNNetwork later. + if (output.second->getPrecision() == Precision::I64) { + output.second->setPrecision(Precision::I32); + } else if (output.second->getPrecision() != Precision::FP32 && output.second->getPrecision() != Precision::I32) { output.second->setPrecision(Precision::FP32); } @@ -456,6 +463,7 @@ StatusCode CNNNetworkNGraphImpl::serialize(const std::string& xmlPath, const std ::ngraph::op::GenericIE::DisableReshape noReshape(graph); ::ngraph::pass::CommonOptimizations().run_on_function(graph); + ::ngraph::pass::ConvertOpSet3ToOpSet2().run_on_function(graph); ::ngraph::pass::ConvertOpSet2ToOpSet1().run_on_function(graph); ::ngraph::pass::ConvertOpSet1ToLegacy().run_on_function(graph); network = InferenceEngine::details::convertFunctionToICNNNetwork(graph, *this); @@ -519,6 +527,7 @@ void CNNNetworkNGraphImpl::convertToCNNNetworkImpl() { ::ngraph::op::GenericIE::DisableReshape noReshape(graph); ::ngraph::pass::CommonOptimizations().run_on_function(graph); + ::ngraph::pass::ConvertOpSet3ToOpSet2().run_on_function(graph); ::ngraph::pass::ConvertOpSet2ToOpSet1().run_on_function(graph); ::ngraph::pass::ConvertOpSet1ToLegacy().run_on_function(graph); cnnNetwork = InferenceEngine::details::convertFunctionToICNNNetwork(graph, *this); diff --git a/inference-engine/src/inference_engine/dll_main.hpp b/inference-engine/src/inference_engine/dll_main.hpp deleted file mode 100644 index d433e136be2..00000000000 --- a/inference-engine/src/inference_engine/dll_main.hpp +++ /dev/null @@ -1,22 +0,0 @@ -// Copyright (C) 2018-2020 Intel Corporation -// SPDX-License-Identifier: Apache-2.0 -// - -#pragma once - -#ifdef _WIN32 -#define _WINSOCKAPI_ -#include - -BOOL APIENTRY DllMain(HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved) { - switch (ul_reason_for_call) { - case DLL_PROCESS_ATTACH: - case DLL_THREAD_ATTACH: - case DLL_THREAD_DETACH: - case DLL_PROCESS_DETACH: - break; - } - return TRUE; -} - -#endif diff --git a/inference-engine/src/inference_engine/ie_core.cpp b/inference-engine/src/inference_engine/ie_core.cpp index cfb68abba21..7508696029b 100644 --- a/inference-engine/src/inference_engine/ie_core.cpp +++ b/inference-engine/src/inference_engine/ie_core.cpp @@ -14,6 +14,7 @@ #include #include #include +#include #include #include "cpp/ie_cnn_net_reader.h" @@ -70,6 +71,62 @@ IInferencePluginAPI* getInferencePluginAPIInterface(InferencePlugin plugin) { return getInferencePluginAPIInterface(static_cast(plugin)); } +template +struct Parsed { + std::string _deviceName; + std::map _config; +}; + +template +Parsed parseDeviceNameIntoConfig(const std::string& deviceName, const std::map& config = {}) { + auto config_ = config; + auto deviceName_ = deviceName; + if (deviceName_.find("HETERO:") == 0) { + deviceName_ = "HETERO"; + config_["TARGET_FALLBACK"] = deviceName.substr(7); + } else if (deviceName_.find("MULTI:") == 0) { + deviceName_ = "MULTI"; + config_[InferenceEngine::MultiDeviceConfigParams::KEY_MULTI_DEVICE_PRIORITIES] = deviceName.substr(6); + } else { + DeviceIDParser parser(deviceName_); + deviceName_ = parser.getDeviceName(); + std::string deviceIDLocal = parser.getDeviceID(); + + if (!deviceIDLocal.empty()) { + config_[KEY_DEVICE_ID] = deviceIDLocal; + } + } + return {deviceName_, config_}; +} + +Parameter copyParameterValue(const Parameter & value) { + if (value.is()) { + return { value.as() }; + } else if (value.is()) { + return { value.as() }; + } else if (value.is()) { + return { value.as() }; + } else if (value.is()) { + return { value.as() }; + } else if (value.is()) { + return { value.as() }; + } else if (value.is >()) { + return { value.as >() }; + } else if (value.is >()) { + return { value.as >() }; + } else if (value.is >()) { + return { value.as >() }; + } else if (value.is >()) { + return { value.as >() }; + } else if (value.is >()) { + return { value.as >() }; + } else if (value.is >()) { + return { value.as >() }; + } + + return std::move(value); +} + } // namespace CNNNetReaderPtr CreateCNNNetReaderPtr() noexcept { @@ -151,7 +208,8 @@ class Core::Impl : public ICore { }; /** - * Hold original blob in order to avoid situations when original blob is allocated on stack + * @brief Holds original blob in order to avoid situations + * when original blob is allocated on stack */ class WeightsHolderBlob : public TBlob { Blob::CPtr originBlob; @@ -167,6 +225,7 @@ class Core::Impl : public ICore { std::vector extensions; std::map pluginRegistry; + mutable std::mutex pluginsMutex; // to lock parallel access to pluginRegistry and plugins public: Impl(); @@ -174,9 +233,11 @@ public: /** * @brief Register plugins for devices which are located in .xml configuration file. The function supports UNICODE path - * @param xmlConfigFile - an .xml configuraion with device / plugin information + * @param xmlConfigFile An .xml configuraion with device / plugin information */ void RegisterPluginsInRegistry(const std::string& xmlConfigFile) { + std::lock_guard lock(pluginsMutex); + auto parse_result = ParseXml(xmlConfigFile.c_str()); if (!parse_result.error_msg.empty()) { THROW_IE_EXCEPTION << parse_result.error_msg; @@ -256,7 +317,8 @@ public: StatusCode rt = cnnReader->ReadNetwork(modelPath.c_str(), &desc); if (rt != OK) THROW_IE_EXCEPTION << desc.msg; if (cnnReader->getVersion(&desc) >= 10) { - cnnReader->addExtensions(getExtensions()); + std::lock_guard lock(pluginsMutex); + cnnReader->addExtensions(GetExtensions()); } std::string bPath = binPath; if (bPath.empty()) { @@ -289,7 +351,8 @@ public: StatusCode rt = cnnReader->ReadNetwork(model.data(), model.length(), &desc); if (rt != OK) THROW_IE_EXCEPTION << desc.msg; if (cnnReader->getVersion(&desc) >= 10) { - cnnReader->addExtensions(getExtensions()); + std::lock_guard lock(pluginsMutex); + cnnReader->addExtensions(GetExtensions()); } TBlob::Ptr weights_ptr; if (weights) { @@ -302,11 +365,90 @@ public: return CNNNetwork(cnnReader); } + ExecutableNetwork LoadNetwork(const CNNNetwork& network, const std::string& deviceName, + const std::map& config) override { + IE_PROFILING_AUTO_SCOPE(Core::LoadNetwork) + auto parsed = parseDeviceNameIntoConfig(deviceName, config); + IE_SUPPRESS_DEPRECATED_START + return GetCPPPluginByName(parsed._deviceName).LoadNetwork(network, parsed._config); + IE_SUPPRESS_DEPRECATED_END + } + IE_SUPPRESS_DEPRECATED_START + ExecutableNetwork ImportNetwork(std::istream& networkModel, const std::string& deviceName, + const std::map& config) override { + auto parsed = parseDeviceNameIntoConfig(deviceName, config); + + if (parsed._deviceName.empty()) { + ExportMagic magic = {}; + auto currentPos = networkModel.tellg(); + networkModel.read(magic.data(), magic.size()); + auto exportedWithName = (exportMagic == magic); + if (exportedWithName) { + std::getline(networkModel, parsed._deviceName); + } + networkModel.seekg(currentPos, networkModel.beg); + } + + auto cppPlugin = GetCPPPluginByName(parsed._deviceName); + auto pluginAPIInterface = getInferencePluginAPIInterface(cppPlugin); + if (pluginAPIInterface == nullptr) { + THROW_IE_EXCEPTION << parsed._deviceName << " does not implement the ImportNetwork method"; + } + + return pluginAPIInterface->ImportNetwork(networkModel, parsed._config); + } + + QueryNetworkResult QueryNetwork(const ICNNNetwork& network, const std::string& deviceName, + const std::map& config) const override { + QueryNetworkResult res; + auto parsed = parseDeviceNameIntoConfig(deviceName, config); + IE_SUPPRESS_DEPRECATED_START + GetCPPPluginByName(parsed._deviceName).QueryNetwork(network, parsed._config, res); + IE_SUPPRESS_DEPRECATED_END + return res; + } + + Parameter GetMetric(const std::string& deviceName, const std::string& name) const override { + // HETERO case + { + if (deviceName.find("HETERO:") == 0) { + THROW_IE_EXCEPTION + << "You can get specific metrics with the GetMetric only for the HETERO itself (without devices). " + "To get individual devices's metrics call GetMetric for each device separately"; + } + } + + // MULTI case + { + if (deviceName.find("MULTI:") == 0) { + THROW_IE_EXCEPTION + << "You can get specific metrics with the GetMetric only for the MULTI itself (without devices). " + "To get individual devices's metrics call GetMetric for each device separately"; + } + } + + auto parsed = parseDeviceNameIntoConfig(deviceName); + IE_SUPPRESS_DEPRECATED_START + InferencePlugin cppPlugin = GetCPPPluginByName(parsed._deviceName); + auto pluginAPIInterface = getInferencePluginAPIInterface(cppPlugin); + IE_SUPPRESS_DEPRECATED_END + + if (pluginAPIInterface == nullptr) { + THROW_IE_EXCEPTION << parsed._deviceName << " does not implement the GetMetric method"; + } + + // we need to return a copy of Parameter object which is created on Core side, + // not in InferenceEngine plugin side, which can be unloaded from Core in a parallel thread + // TODO: remove this WA after *-31417 is resolved + return copyParameterValue(pluginAPIInterface->GetMetric(name, parsed._config)); + } + /** + * @deprecated Use ICore::LoadNetwork, ICore::QueryNetwork, ICore::GetMetric instead * @brief Returns reference to plugin by a device name - * @param deviceName - a name of device + * @param deviceName A name of device * @return Reference to a plugin */ InferenceEnginePluginPtr GetPluginByName(const std::string& deviceName) const override { @@ -314,11 +456,14 @@ public: } /** + * @deprecated * @brief Returns reference to CPP plugin wrapper by a device name - * @param deviceName - a name of device + * @param deviceName A name of device * @return Reference to a CPP plugin wrapper */ InferencePlugin GetCPPPluginByName(const std::string& deviceName) const { + std::lock_guard lock(pluginsMutex); + IE_SUPPRESS_DEPRECATED_START auto it = pluginRegistry.find(deviceName); @@ -379,10 +524,11 @@ public: IE_SUPPRESS_DEPRECATED_END /** - * @brief Unregisters plugin for specified device - * @param deviceName - a name of device + * @brief Unload plugin for specified device, but plugin meta-data is still in plugin registry + * @param deviceName A name of device */ - void UnregisterPluginByName(const std::string& deviceName) { + void UnloadPluginByName(const std::string& deviceName) { + std::lock_guard lock(pluginsMutex); auto it = plugins.find(deviceName); if (it == plugins.end()) { THROW_IE_EXCEPTION << "Device with \"" << deviceName << "\" name is not registered in the InferenceEngine"; @@ -392,10 +538,12 @@ public: } /** - * @brief Registers plugin in registry for specified device - * @param deviceName - a name of device + * @brief Registers plugin meta-data in registry for specified device + * @param deviceName A name of device */ void RegisterPluginByName(const std::string& pluginName, const std::string& deviceName) { + std::lock_guard lock(pluginsMutex); + auto it = pluginRegistry.find(deviceName); if (it != pluginRegistry.end()) { THROW_IE_EXCEPTION << "Device with \"" << deviceName << "\" is already registered in the InferenceEngine"; @@ -418,7 +566,13 @@ public: pluginRegistry[deviceName] = desc; } + /** + * @brief Porvides a list of plugin names in registry; physically such plugins may not be created + * @return A list of plugin names + */ std::vector GetListOfDevicesInRegistry() const { + std::lock_guard lock(pluginsMutex); + std::vector listOfDevices; for (auto&& pluginDesc : pluginRegistry) { listOfDevices.push_back(pluginDesc.first); @@ -427,7 +581,14 @@ public: return listOfDevices; } + /** + * @brief Sets config values for a plugin or set of plugins + * @param deviceName A device name to set config to + * If empty, config is set for all the plugins / plugin's meta-data + */ void SetConfigForPlugins(const std::map& config, const std::string& deviceName) { + std::lock_guard lock(pluginsMutex); + // set config for plugins in registry bool configIsSet = false; for (auto& desc : pluginRegistry) { @@ -453,7 +614,13 @@ public: } } - void addExtension(const IExtensionPtr& extension) { + /** + * @brief Registers the extension in a Core object + * Such extensions can be used for both CNNNetwork readers and device plugins + */ + void AddExtension(const IExtensionPtr& extension) { + std::lock_guard lock(pluginsMutex); + std::map opsets = extension->getOpSets(); for (const auto& it : opsets) { if (opsetNames.find(it.first) != opsetNames.end()) @@ -461,6 +628,7 @@ public: opsetNames.insert(it.first); } + // add extensions for already created plugins for (auto& plugin : plugins) { IE_SUPPRESS_DEPRECATED_START try { @@ -471,7 +639,11 @@ public: extensions.emplace_back(extension); } - const std::vector& getExtensions() const { + /** + * @brief Provides a list of extensions + * @return A list of registered extensions + */ + const std::vector& GetExtensions() const { return extensions; } }; @@ -525,7 +697,8 @@ std::map Core::GetVersions(const std::string& deviceName) std::string deviceNameLocal = parser.getDeviceName(); IE_SUPPRESS_DEPRECATED_START - const Version* version = _impl->GetCPPPluginByName(deviceNameLocal).GetVersion(); + InferenceEngine::InferencePlugin cppPlugin = _impl->GetCPPPluginByName(deviceNameLocal); + const Version * version = cppPlugin.GetVersion(); IE_SUPPRESS_DEPRECATED_END versions[deviceNameLocal] = *version; } @@ -538,36 +711,6 @@ void Core::SetLogCallback(IErrorListener&) const { } IE_SUPPRESS_DEPRECATED_END -namespace { -template -struct Parsed { - std::string _deviceName; - std::map _config; -}; - -template -Parsed parseDeviceNameIntoConfig(const std::string& deviceName, const std::map& config = {}) { - auto config_ = config; - auto deviceName_ = deviceName; - if (deviceName_.find("HETERO:") == 0) { - deviceName_ = "HETERO"; - config_["TARGET_FALLBACK"] = deviceName.substr(7); - } else if (deviceName_.find("MULTI:") == 0) { - deviceName_ = "MULTI"; - config_[InferenceEngine::MultiDeviceConfigParams::KEY_MULTI_DEVICE_PRIORITIES] = deviceName.substr(6); - } else { - DeviceIDParser parser(deviceName_); - deviceName_ = parser.getDeviceName(); - std::string deviceIDLocal = parser.getDeviceID(); - - if (!deviceIDLocal.empty()) { - config_[KEY_DEVICE_ID] = deviceIDLocal; - } - } - return {deviceName_, config_}; -} -} // namespace - CNNNetwork Core::ReadNetwork(const std::string& modelPath, const std::string& binPath) const { return _impl->ReadNetwork(modelPath, binPath); } @@ -576,20 +719,16 @@ CNNNetwork Core::ReadNetwork(const std::string& model, const Blob::CPtr& weights return _impl->ReadNetwork(model, weights); } -ExecutableNetwork Core::LoadNetwork(const CNNNetwork network, const std::string& deviceName, +ExecutableNetwork Core::LoadNetwork(const CNNNetwork& network, const std::string& deviceName, const std::map& config) { - IE_PROFILING_AUTO_SCOPE(Core::LoadNetwork) - auto parsed = parseDeviceNameIntoConfig(deviceName, config); - IE_SUPPRESS_DEPRECATED_START - return _impl->GetCPPPluginByName(parsed._deviceName).LoadNetwork(network, parsed._config); - IE_SUPPRESS_DEPRECATED_END + return _impl->LoadNetwork(network, deviceName, config); } void Core::AddExtension(const IExtensionPtr& extension) { - _impl->addExtension(extension); + _impl->AddExtension(extension); } -ExecutableNetwork Core::LoadNetwork(const CNNNetwork network, RemoteContext::Ptr context, +ExecutableNetwork Core::LoadNetwork(const CNNNetwork& network, RemoteContext::Ptr context, const std::map& config) { IE_PROFILING_AUTO_SCOPE(Core::LoadNetwork) std::map config_ = config; @@ -603,7 +742,8 @@ ExecutableNetwork Core::LoadNetwork(const CNNNetwork network, RemoteContext::Ptr std::string deviceName = device.getDeviceName(); IE_SUPPRESS_DEPRECATED_START - auto pluginAPIInterface = getInferencePluginAPIInterface(_impl->GetCPPPluginByName(deviceName)); + auto cppPlugin = _impl->GetCPPPluginByName(deviceName); + auto pluginAPIInterface = getInferencePluginAPIInterface(cppPlugin); if (pluginAPIInterface == nullptr) { THROW_IE_EXCEPTION << deviceName << " does not implement the LoadNetwork method"; @@ -625,7 +765,8 @@ RemoteContext::Ptr Core::CreateContext(const std::string& deviceName_, const Par std::string deviceName = device.getDeviceName(); IE_SUPPRESS_DEPRECATED_START - auto pluginAPIInterface = getInferencePluginAPIInterface(_impl->GetCPPPluginByName(deviceName)); + auto cppPlugin = _impl->GetCPPPluginByName(deviceName); + auto pluginAPIInterface = getInferencePluginAPIInterface(cppPlugin); if (pluginAPIInterface == nullptr) { THROW_IE_EXCEPTION << deviceName << " does not implement the CreateContext method"; @@ -647,7 +788,8 @@ RemoteContext::Ptr Core::GetDefaultContext(const std::string& deviceName_) { std::string deviceName = device.getDeviceName(); IE_SUPPRESS_DEPRECATED_START - auto pluginAPIInterface = getInferencePluginAPIInterface(_impl->GetCPPPluginByName(deviceName)); + auto cppPlugin = _impl->GetCPPPluginByName(deviceName); + auto pluginAPIInterface = getInferencePluginAPIInterface(cppPlugin); if (pluginAPIInterface == nullptr) { THROW_IE_EXCEPTION << deviceName << " does not implement the CreateContext method"; @@ -667,13 +809,7 @@ void Core::AddExtension(IExtensionPtr extension, const std::string& deviceName_) << "MULTI device does not support extensions. Please, set extensions directly to fallback devices"; } - DeviceIDParser parser(deviceName_); - std::string deviceName = parser.getDeviceName(); - - IE_SUPPRESS_DEPRECATED_START - _impl->GetCPPPluginByName(deviceName).AddExtension(extension); - _impl->addExtension(extension); - IE_SUPPRESS_DEPRECATED_END + _impl->AddExtension(extension); } ExecutableNetwork Core::ImportNetwork(const std::string& modelFileName, const std::string& deviceName, @@ -692,32 +828,11 @@ ExecutableNetwork Core::ImportNetwork(const std::string& modelFileName, const st IE_SUPPRESS_DEPRECATED_END } -IE_SUPPRESS_DEPRECATED_START - ExecutableNetwork Core::ImportNetwork(std::istream& networkModel, const std::string& deviceName, const std::map& config) { - auto parsed = parseDeviceNameIntoConfig(deviceName, config); - - if (parsed._deviceName.empty()) { - ExportMagic magic = {}; - networkModel.read(magic.data(), magic.size()); - auto exportedWithName = (exportMagic == magic); - if (exportedWithName) { - std::getline(networkModel, parsed._deviceName); - } - networkModel.seekg(0, networkModel.beg); - } - - auto pluginAPIInterface = getInferencePluginAPIInterface(_impl->GetCPPPluginByName(parsed._deviceName)); - if (pluginAPIInterface == nullptr) { - THROW_IE_EXCEPTION << parsed._deviceName << " does not implement the ImportNetwork method"; - } - - return pluginAPIInterface->ImportNetwork(networkModel, parsed._config); + return _impl->ImportNetwork(networkModel, deviceName, config); } -IE_SUPPRESS_DEPRECATED_END - ExecutableNetwork Core::ImportNetwork(std::istream& networkModel, const RemoteContext::Ptr& context, const std::map& config) { @@ -734,7 +849,8 @@ ExecutableNetwork Core::ImportNetwork(std::istream& networkModel, auto parsed = parseDeviceNameIntoConfig(deviceName, config); IE_SUPPRESS_DEPRECATED_START - auto pluginAPIInterface = getInferencePluginAPIInterface(_impl->GetCPPPluginByName(parsed._deviceName)); + auto cppPlugin = _impl->GetCPPPluginByName(deviceName); + auto pluginAPIInterface = getInferencePluginAPIInterface(cppPlugin); if (pluginAPIInterface == nullptr) { THROW_IE_EXCEPTION << deviceName << " does not implement the ImportNetwork method"; @@ -745,12 +861,7 @@ ExecutableNetwork Core::ImportNetwork(std::istream& networkModel, QueryNetworkResult Core::QueryNetwork(const ICNNNetwork& network, const std::string& deviceName, const std::map& config) const { - QueryNetworkResult res; - auto parsed = parseDeviceNameIntoConfig(deviceName, config); - IE_SUPPRESS_DEPRECATED_START - _impl->GetCPPPluginByName(parsed._deviceName).QueryNetwork(network, parsed._config, res); - IE_SUPPRESS_DEPRECATED_END - return res; + return _impl->QueryNetwork(network, deviceName, config); } void Core::SetConfig(const std::map& config, const std::string& deviceName) { @@ -798,42 +909,22 @@ Parameter Core::GetConfig(const std::string& deviceName, const std::string& name auto parsed = parseDeviceNameIntoConfig(deviceName); IE_SUPPRESS_DEPRECATED_START - auto pluginAPIInterface = getInferencePluginAPIInterface(_impl->GetCPPPluginByName(parsed._deviceName)); + auto cppPlugin = _impl->GetCPPPluginByName(parsed._deviceName); + auto pluginAPIInterface = getInferencePluginAPIInterface(cppPlugin); IE_SUPPRESS_DEPRECATED_END + if (pluginAPIInterface == nullptr) { THROW_IE_EXCEPTION << parsed._deviceName << " does not implement the GetConfig method"; } - return pluginAPIInterface->GetConfig(name, parsed._config); + + // we need to return a copy of Parameter object which is created on Core side, + // not in InferenceEngine plugin side, which can be unloaded from Core in a parallel thread + // TODO: remove this WA after *-31417 is resolved + return copyParameterValue(pluginAPIInterface->GetConfig(name, parsed._config)); } Parameter Core::GetMetric(const std::string& deviceName, const std::string& name) const { - // HETERO case - { - if (deviceName.find("HETERO:") == 0) { - THROW_IE_EXCEPTION - << "You can get specific metrics with the GetMetric only for the HETERO itself (without devices). " - "To get individual devices's metrics call GetMetric for each device separately"; - } - } - - // MULTI case - { - if (deviceName.find("MULTI:") == 0) { - THROW_IE_EXCEPTION - << "You can get specific metrics with the GetMetric only for the MULTI itself (without devices). " - "To get individual devices's metrics call GetMetric for each device separately"; - } - } - - auto parsed = parseDeviceNameIntoConfig(deviceName); - IE_SUPPRESS_DEPRECATED_START - auto pluginAPIInterface = getInferencePluginAPIInterface(_impl->GetCPPPluginByName(parsed._deviceName)); - IE_SUPPRESS_DEPRECATED_END - if (pluginAPIInterface == nullptr) { - THROW_IE_EXCEPTION << parsed._deviceName << " does not implement the GetMetric method"; - } - - return pluginAPIInterface->GetMetric(name, parsed._config); + return _impl->GetMetric(deviceName, name); } std::vector Core::GetAvailableDevices() const { @@ -842,11 +933,11 @@ std::vector Core::GetAvailableDevices() const { std::string propertyName = METRIC_KEY(AVAILABLE_DEVICES); for (auto&& deviceName : _impl->GetListOfDevicesInRegistry()) { - Parameter p; std::vector devicesIDs; + IE_SUPPRESS_DEPRECATED_START try { - p = GetMetric(deviceName, propertyName); + Parameter p = GetMetric(deviceName, propertyName); devicesIDs = p.as>(); } catch (details::InferenceEngineException&) { // plugin is not created by e.g. invalid env @@ -857,6 +948,7 @@ std::vector Core::GetAvailableDevices() const { THROW_IE_EXCEPTION << "Unknown exception is thrown while trying to create the " << deviceName << " device and call GetMetric"; } + IE_SUPPRESS_DEPRECATED_END if (devicesIDs.size() > 1) { for (auto&& deviceID : devicesIDs) { @@ -882,7 +974,7 @@ void Core::UnregisterPlugin(const std::string& deviceName_) { DeviceIDParser parser(deviceName_); std::string deviceName = parser.getDeviceName(); - _impl->UnregisterPluginByName(deviceName); + _impl->UnloadPluginByName(deviceName); } } // namespace InferenceEngine diff --git a/inference-engine/src/inference_engine/threading/ie_cpu_streams_executor.cpp b/inference-engine/src/inference_engine/threading/ie_cpu_streams_executor.cpp index 6467b6bccf0..6ba200246ae 100644 --- a/inference-engine/src/inference_engine/threading/ie_cpu_streams_executor.cpp +++ b/inference-engine/src/inference_engine/threading/ie_cpu_streams_executor.cpp @@ -23,159 +23,215 @@ #include "threading/ie_cpu_streams_executor.hpp" namespace InferenceEngine { -#if IE_THREAD == IE_THREAD_TBB || IE_THREAD == IE_THREAD_TBB_AUTO -struct PinningObserver: public tbb::task_scheduler_observer { - CpuSet& _mask; - int _ncpus = 0; - int _streamId = 0; - int _threadsPerStream = 0; - int _threadBindingStep = 0; - int _threadBindingOffset = 0; - - PinningObserver(tbb::task_arena& arena, - CpuSet& mask, - int ncpus, - const int streamId, - const int threadsPerStream, - const int threadBindingStep, - const int threadBindingOffset) : - tbb::task_scheduler_observer(arena), - _mask(mask), - _ncpus(ncpus), - _streamId(streamId), - _threadsPerStream(threadsPerStream), - _threadBindingStep(threadBindingStep), - _threadBindingOffset(threadBindingOffset) { - observe(true); - } - - void on_scheduler_entry(bool) override { - int threadIdx = tbb::task_arena::current_thread_index(); - int thrIdx = _streamId * _threadsPerStream + threadIdx + _threadBindingOffset; - // pin thread to the vacant slot - PinThreadToVacantCore(thrIdx, _threadBindingStep, _ncpus, _mask); - } - - void on_scheduler_exit(bool) override { - // reset the thread's mask (to the original process mask) - PinCurrentThreadByMask(_ncpus, _mask); - } - - ~PinningObserver() { - observe(false); - } -}; -#endif // IE_THREAD != IE_THREAD_TBB - -struct Stream { - int _streamId = 0; - int _numaNodeId = 0; -#if IE_THREAD == IE_THREAD_TBB || IE_THREAD == IE_THREAD_TBB_AUTO - std::unique_ptr _taskArena; - std::unique_ptr _pinningObserver; -#endif -}; - struct CPUStreamsExecutor::Impl { - std::string _name; - std::vector _threads; - std::mutex _mutex; - std::condition_variable _queueCondVar; - std::queue _taskQueue; - bool _isStopped = false; - int _ncpus = 0; - CpuSet _processMask; - ThreadLocal _localStream; -}; - -int CPUStreamsExecutor::GetStreamId() { - auto stream = _impl->_localStream.local(); - if (nullptr == stream) THROW_IE_EXCEPTION << "Not in the stream thread"; - return stream->_streamId; -} - -int CPUStreamsExecutor::GetNumaNodeId() { - auto stream = _impl->_localStream.local(); - if (nullptr == stream) THROW_IE_EXCEPTION << "Not in the stream thread"; - return stream->_numaNodeId; -} - -CPUStreamsExecutor::CPUStreamsExecutor(const IStreamsExecutor::Config& config) : - _impl{new Impl} { - IE_ASSERT(config._streams > 0); - _impl->_name = config._name; - auto numaNodes = getAvailableNUMANodes(); - IE_ASSERT(!numaNodes.empty()); - if (ThreadBindingType::CORES == config._threadBindingType) { - std::tie(_impl->_processMask, _impl->_ncpus) = GetProcessMask(); - } - for (auto streamId = 0; streamId < config._streams; ++streamId) { - _impl->_threads.emplace_back([=] { - annotateSetThreadName((_impl->_name + "_" + std::to_string(streamId)).c_str()); - Stream stream; - stream._streamId = streamId; - stream._numaNodeId = numaNodes.at(streamId/((config._streams + numaNodes.size() - 1)/numaNodes.size())); + struct Stream { #if IE_THREAD == IE_THREAD_TBB || IE_THREAD == IE_THREAD_TBB_AUTO - auto concurrency = (0 == config._threadsPerStream) ? tbb::task_arena::automatic : config._threadsPerStream; - if (ThreadBindingType::NUMA == config._threadBindingType) { - stream._taskArena.reset(new tbb::task_arena(tbb::task_arena::constraints(stream._numaNodeId, concurrency))); - } else if ((0 != config._threadsPerStream) || ThreadBindingType::CORES == config._threadBindingType) { - stream._taskArena.reset(new tbb::task_arena(concurrency)); - if (ThreadBindingType::CORES == config._threadBindingType) { - if (nullptr != _impl->_processMask) { - stream._pinningObserver.reset(new PinningObserver{*stream._taskArena, - _impl->_processMask, - _impl->_ncpus, - stream._streamId, - config._threadsPerStream, - config._threadBindingStep, - config._threadBindingOffset}); + struct Observer: public tbb::task_scheduler_observer { + CpuSet _mask; + int _ncpus = 0; + int _threadBindingStep = 0; + int _offset = 0; + Observer(tbb::task_arena& arena, + CpuSet mask, + int ncpus, + const int streamId, + const int threadsPerStream, + const int threadBindingStep, + const int threadBindingOffset) : + tbb::task_scheduler_observer(arena), + _mask{std::move(mask)}, + _ncpus(ncpus), + _threadBindingStep(threadBindingStep), + _offset{streamId * threadsPerStream + threadBindingOffset} { + } + void on_scheduler_entry(bool) override { + PinThreadToVacantCore(_offset + tbb::task_arena::current_thread_index(), _threadBindingStep, _ncpus, _mask); + } + void on_scheduler_exit(bool) override { + PinCurrentThreadByMask(_ncpus, _mask); + } + ~Observer() override = default; + }; +#endif + explicit Stream(Impl* impl) : + _impl(impl) { + { + std::lock_guard lock{_impl->_streamIdMutex}; + if (_impl->_streamIdQueue.empty()) { + _streamId = _impl->_streamId++; + } else { + _streamId = _impl->_streamIdQueue.front(); + _impl->_streamIdQueue.pop(); + } + } + _numaNodeId = _impl->_usedNumaNodes.at( + (_streamId % _impl->_config._streams)/ + ((_impl->_config._streams + _impl->_usedNumaNodes.size() - 1)/_impl->_usedNumaNodes.size())); +#if IE_THREAD == IE_THREAD_TBB || IE_THREAD == IE_THREAD_TBB_AUTO + auto concurrency = (0 == _impl->_config._threadsPerStream) ? tbb::task_arena::automatic : _impl->_config._threadsPerStream; + if (ThreadBindingType::NUMA == _impl->_config._threadBindingType) { + _taskArena.reset(new tbb::task_arena{tbb::task_arena::constraints{_numaNodeId, concurrency}}); + } else if ((0 != _impl->_config._threadsPerStream) || (ThreadBindingType::CORES == _impl->_config._threadBindingType)) { + _taskArena.reset(new tbb::task_arena{concurrency}); + if (ThreadBindingType::CORES == _impl->_config._threadBindingType) { + CpuSet processMask; + int ncpus = 0; + std::tie(processMask, ncpus) = GetProcessMask(); + if (nullptr != processMask) { + _observer.reset(new Observer{*_taskArena, + std::move(processMask), + ncpus, + _streamId, + _impl->_config._threadsPerStream, + _impl->_config._threadBindingStep, + _impl->_config._threadBindingOffset}); + _observer->observe(true); } } } #elif IE_THREAD == IE_THREAD_OMP - omp_set_num_threads(config._threadsPerStream); - if (!checkOpenMpEnvVars(false) && (ThreadBindingType::NONE != config._threadBindingType)) { - if (nullptr != _impl->_processMask) { - parallel_nt(config._threadsPerStream, [&] (int threadIndex, int threadsPerStream) { - int thrIdx = stream._streamId * threadsPerStream + threadIndex + config._threadBindingOffset; - PinThreadToVacantCore(thrIdx, config._threadBindingStep, _impl->_ncpus, _impl->_processMask); + omp_set_num_threads(_impl->_config._threadsPerStream); + if (!checkOpenMpEnvVars(false) && (ThreadBindingType::NONE != _impl->_config._threadBindingType)) { + CpuSet processMask; + int ncpus = 0; + std::tie(processMask, ncpus) = GetProcessMask(); + if (nullptr != processMask) { + parallel_nt(_impl->_config._threadsPerStream, [&] (int threadIndex, int threadsPerStream) { + int thrIdx = _streamId * _impl->_config._threadsPerStream + threadIndex + _impl->_config._threadBindingOffset; + PinThreadToVacantCore(thrIdx, _impl->_config._threadBindingStep, ncpus, processMask); }); } } #elif IE_THREAD == IE_THREAD_SEQ - if (ThreadBindingType::NUMA == config._threadBindingType) { - PinCurrentThreadToSocket(stream._numaNodeId); - } else if (ThreadBindingType::CORES == config._threadBindingType) { - PinThreadToVacantCore(stream._streamId + config._threadBindingOffset, config._threadBindingStep, _impl->_ncpus, _impl->_processMask); + if (ThreadBindingType::NUMA == _impl->_config._threadBindingType) { + PinCurrentThreadToSocket(_numaNodeId); + } else if (ThreadBindingType::CORES == _impl->_config._threadBindingType) { + CpuSet processMask; + int ncpus = 0; + std::tie(processMask, ncpus) = GetProcessMask(); + if (nullptr != processMask) { + PinThreadToVacantCore(_streamId + _impl->_config._threadBindingOffset, _impl->_config._threadBindingStep, ncpus, processMask); + } } #endif - _impl->_localStream.local() = &stream; - for (bool stopped = false; !stopped;) { - Task currentTask; - { // waiting for the new task or for stop signal - std::unique_lock lock(_impl->_mutex); - _impl->_queueCondVar.wait(lock, [&] { return !_impl->_taskQueue.empty() || (stopped = _impl->_isStopped); }); - if (!_impl->_taskQueue.empty()) { - currentTask = std::move(_impl->_taskQueue.front()); - _impl->_taskQueue.pop(); - } - } - - if (currentTask) { + } + ~Stream() { + { + std::lock_guard lock{_impl->_streamIdMutex}; + _impl->_streamIdQueue.push(_streamId); + } #if IE_THREAD == IE_THREAD_TBB || IE_THREAD == IE_THREAD_TBB_AUTO - if (nullptr != stream._taskArena) { - stream._taskArena->execute(std::move(currentTask)); - } else { - currentTask(); - } -#else - currentTask(); -#endif - } + if (nullptr != _observer) { + _observer->observe(false); } - }); +#endif + } + + Impl* _impl = nullptr; + int _streamId = 0; + int _numaNodeId = 0; + bool _execute = false; + std::queue _taskQueue; +#if IE_THREAD == IE_THREAD_TBB || IE_THREAD == IE_THREAD_TBB_AUTO + std::unique_ptr _taskArena; + std::unique_ptr _observer; +#endif + }; + + explicit Impl(const Config& config) : + _config{config}, + _streams([this] { + return std::make_shared(this); + }) { + auto numaNodes = getAvailableNUMANodes(); + std::copy_n(std::begin(numaNodes), + std::min(std::max(static_cast(1), + static_cast(_config._streams)), + numaNodes.size()), + std::back_inserter(_usedNumaNodes)); + for (auto streamId = 0; streamId < _config._streams; ++streamId) { + _threads.emplace_back([this, streamId] { + annotateSetThreadName((_config._name + "_" + std::to_string(streamId)).c_str()); + for (bool stopped = false; !stopped;) { + Task task; + { + std::unique_lock lock(_mutex); + _queueCondVar.wait(lock, [&] { return !_taskQueue.empty() || (stopped = _isStopped); }); + if (!_taskQueue.empty()) { + task = std::move(_taskQueue.front()); + _taskQueue.pop(); + } + } + if (task) { + Execute(task, *(_streams.local())); + } + } + }); + } } + + void Enqueue(Task task) { + { + std::lock_guard lock(_mutex); + _taskQueue.emplace(std::move(task)); + } + _queueCondVar.notify_one(); + } + + void Execute(const Task& task, Stream& stream) { +#if IE_THREAD == IE_THREAD_TBB || IE_THREAD == IE_THREAD_TBB_AUTO + auto& arena = stream._taskArena; + if (nullptr != arena) { + arena->execute(std::move(task)); + } else { + task(); + } +#else + task(); +#endif + } + + void Defer(Task task) { + auto& stream = *(_streams.local()); + stream._taskQueue.push(std::move(task)); + if (!stream._execute) { + stream._execute = true; + try { + while (!stream._taskQueue.empty()) { + Execute(stream._taskQueue.front(), stream); + stream._taskQueue.pop(); + } + } catch(...) {} + stream._execute = false; + } + } + + Config _config; + std::mutex _streamIdMutex; + int _streamId = 0; + std::queue _streamIdQueue; + std::vector _threads; + std::mutex _mutex; + std::condition_variable _queueCondVar; + std::queue _taskQueue; + bool _isStopped = false; + std::vector _usedNumaNodes; + ThreadLocal> _streams; +}; + + +int CPUStreamsExecutor::GetStreamId() { + auto stream = _impl->_streams.local(); + return stream->_streamId; +} + +int CPUStreamsExecutor::GetNumaNodeId() { + auto stream = _impl->_streams.local(); + return stream->_numaNodeId; +} + +CPUStreamsExecutor::CPUStreamsExecutor(const IStreamsExecutor::Config& config) : + _impl{new Impl{config}} { } CPUStreamsExecutor::~CPUStreamsExecutor() { @@ -191,12 +247,16 @@ CPUStreamsExecutor::~CPUStreamsExecutor() { } } +void CPUStreamsExecutor::Execute(Task task) { + _impl->Defer(std::move(task)); +} + void CPUStreamsExecutor::run(Task task) { - { - std::lock_guard lock(_impl->_mutex); - _impl->_taskQueue.emplace(std::move(task)); + if (0 == _impl->_config._streams) { + _impl->Defer(std::move(task)); + } else { + _impl->Enqueue(std::move(task)); } - _impl->_queueCondVar.notify_one(); } } // namespace InferenceEngine diff --git a/inference-engine/src/inference_engine/threading/ie_istreams_executor.cpp b/inference-engine/src/inference_engine/threading/ie_istreams_executor.cpp index c2ca71e25e4..81b26cc057f 100644 --- a/inference-engine/src/inference_engine/threading/ie_istreams_executor.cpp +++ b/inference-engine/src/inference_engine/threading/ie_istreams_executor.cpp @@ -126,4 +126,4 @@ Parameter IStreamsExecutor::Config::GetConfig(const std::string& key) { return {}; } -} // namespace InferenceEngine +} // namespace InferenceEngine \ No newline at end of file diff --git a/inference-engine/src/inference_engine/xml_parse_utils.cpp b/inference-engine/src/inference_engine/xml_parse_utils.cpp index df75d6453e8..1a5cfd8a266 100644 --- a/inference-engine/src/inference_engine/xml_parse_utils.cpp +++ b/inference-engine/src/inference_engine/xml_parse_utils.cpp @@ -76,7 +76,7 @@ unsigned int XMLParseUtils::GetUIntAttr(const pugi::xml_node& node, const char* std::string XMLParseUtils::GetStrAttr(const pugi::xml_node& node, const char* str) { auto attr = node.attribute(str); if (attr.empty()) - THROW_IE_EXCEPTION << "node <" << node.name() << "> is missing mandatory attribute: " << str << " at offset " + THROW_IE_EXCEPTION << "node <" << node.name() << "> is missing mandatory attribute: '" << str << "' at offset " << node.offset_debug(); return attr.value(); } diff --git a/inference-engine/src/ir_readers/ie_ir_parser.cpp b/inference-engine/src/ir_readers/ie_ir_parser.cpp index 04cb4ef059f..d33ebb4b3fc 100644 --- a/inference-engine/src/ir_readers/ie_ir_parser.cpp +++ b/inference-engine/src/ir_readers/ie_ir_parser.cpp @@ -344,29 +344,40 @@ std::shared_ptr V10Parser::createNode(const std::vector ngraphNode; - if (opsets.count(params.version)) { - auto opset = opsets.at(params.version); - - for (const auto& creator : creators) { - if (creator->shouldCreate(params.type)) { + // Try to create operation from creators + for (const auto& creator : creators) { + if (creator->shouldCreate(params.type)) { + bool useCreator = false; + // Check that opset is registered + useCreator |= opsets.find(params.version) == opsets.end(); + if (!useCreator) { + // Check that creator can create operation with the version from opset + const auto opset = opsets.at(params.version); + // Opset should contains the same version of operation or doesn't contain operation with current type + useCreator |= opset.contains_type(creator->getNodeType()) || !opset.contains_type(params.type); + } + if (useCreator) ngraphNode = creator->createLayer(inputs, node, weights, params); - break; - } - } - - if (!ngraphNode) { - if (!opset.contains_type(params.type)) { - THROW_IE_EXCEPTION << "Opset " << params.version << " doesn't contain the operation with type: " << params.type; - } - - ngraphNode = std::shared_ptr(opset.create(params.type)); - ngraphNode->set_arguments(inputs); - XmlDeserializer visitor(node); - if (ngraphNode->visit_attributes(visitor)) - ngraphNode->constructor_validate_and_infer_types(); + break; } } + // Try to create operation from loaded opsets + if (!ngraphNode && opsets.count(params.version)) { + auto opset = opsets.at(params.version); + + if (!opset.contains_type(params.type)) { + THROW_IE_EXCEPTION << "Opset " << params.version << " doesn't contain the operation with type: " << params.type; + } + + ngraphNode = std::shared_ptr(opset.create(params.type)); + ngraphNode->set_arguments(inputs); + XmlDeserializer visitor(node); + if (ngraphNode->visit_attributes(visitor)) + ngraphNode->constructor_validate_and_infer_types(); + } + + // Create GenericIE operation for backward compatibility if (!ngraphNode && (params.version == "experimental" || params.version == "extension")) { // Try to create Generic node for backward compatibility std::map parameters; diff --git a/inference-engine/src/ir_readers/ie_ir_parser.hpp b/inference-engine/src/ir_readers/ie_ir_parser.hpp index 9e095be42ac..95256ddb52d 100644 --- a/inference-engine/src/ir_readers/ie_ir_parser.hpp +++ b/inference-engine/src/ir_readers/ie_ir_parser.hpp @@ -140,8 +140,7 @@ private: const GenericLayerParams& layerParsePrms) = 0; bool shouldCreate(const std::string& nodeType) const; - - std::shared_ptr createOptionalParameter(const GenericLayerParams::LayerPortData& port); + virtual ngraph::NodeTypeInfo getNodeType() const = 0; }; template @@ -151,6 +150,9 @@ private: std::shared_ptr createLayer(const ngraph::OutputVector& inputs, const pugi::xml_node& node, const Blob::CPtr& weights, const GenericLayerParams& layerParsePrms) override; + ngraph::NodeTypeInfo getNodeType() const override { + return T::type_info; + } }; std::shared_ptr createNode(const ngraph::OutputVector& inputs, const pugi::xml_node& node, @@ -203,6 +205,12 @@ private: std::vector shape; if (!getParameters(node.child("data"), name, shape)) return; static_cast(*a) = ngraph::Strides(shape); + } else if (auto a = ngraph::as_type>(&adapter)) { + if (!getStrAttribute(node.child("data"), name, val)) return; + static_cast(*a) = ngraph::as_enum(val); + } else if (auto a = ngraph::as_type>(&adapter)) { + if (!getStrAttribute(node.child("data"), name, val)) return; + static_cast(*a) = ngraph::as_enum(val); } } void on_adapter(const std::string& name, ngraph::ValueAccessor& adapter) override { diff --git a/inference-engine/src/legacy_api/src/convert_function_to_cnn_network.cpp b/inference-engine/src/legacy_api/src/convert_function_to_cnn_network.cpp index 941b3e8154a..adc66807b22 100644 --- a/inference-engine/src/legacy_api/src/convert_function_to_cnn_network.cpp +++ b/inference-engine/src/legacy_api/src/convert_function_to_cnn_network.cpp @@ -334,6 +334,15 @@ InferenceEngine::details::CNNLayerCreator::CNNLayerCreator(const std::shared_ptr res->params = params; return res; }); + + addSpecificCreator({"ScatterElementsUpdate"}, [](const std::shared_ptr<::ngraph::Node>& node, + const std::map params) -> CNNLayerPtr { + LayerParams attrs = {node->get_friendly_name(), node->description(), + details::convertPrecision(node->get_output_element_type(0))}; + auto res = std::make_shared(attrs); + res->params = params; + return res; + }); } CNNLayerPtr InferenceEngine::details::CNNLayerCreator::create() { @@ -599,8 +608,10 @@ std::shared_ptr convertFunctionToICNNNetwork(const std::shared_p } size_t inputCount(0); for (size_t i = 0; i < layer->get_input_size(); i++) { - const auto &input = layer->get_inputs()[i]; - if (isInternalLayer(input.get_output().get_node(), op_names, keep_constants)) continue; + const auto &constant = ngraph::as_type_ptr(layer->get_inputs()[i].get_output().get_node()); + if (constant && isInternalConstLayer(constant, layer, keep_constants)) { + continue; + } inputCount++; } cnnLayer->insData.resize(inputCount); diff --git a/inference-engine/src/legacy_api/src/ie_deprecated.cpp b/inference-engine/src/legacy_api/src/ie_deprecated.cpp index 8084da35c19..dc886c9038f 100644 --- a/inference-engine/src/legacy_api/src/ie_deprecated.cpp +++ b/inference-engine/src/legacy_api/src/ie_deprecated.cpp @@ -13,6 +13,7 @@ IE_SUPPRESS_DEPRECATED_START namespace InferenceEngine { Precision CNNNetwork::getPrecision() const { + if (actual == nullptr) THROW_IE_EXCEPTION << "CNNNetwork was not initialized."; return actual->getPrecision(); } @@ -41,7 +42,7 @@ StatusCode ICNNNetwork::AddExtension(const IShapeInferExtensionPtr& extension, R }; void CNNNetwork::AddExtension(InferenceEngine::IShapeInferExtensionPtr extension) { - CALL_STATUS_FNC(AddExtension, extension); + CALL_STATUS_FNC(AddExtension, extension); } CNNLayer::CNNLayer(const LayerParams& prms) diff --git a/inference-engine/src/legacy_api/src/ie_layer_validators.cpp b/inference-engine/src/legacy_api/src/ie_layer_validators.cpp index d1266e1146b..a2030f92f6e 100644 --- a/inference-engine/src/legacy_api/src/ie_layer_validators.cpp +++ b/inference-engine/src/legacy_api/src/ie_layer_validators.cpp @@ -3163,12 +3163,12 @@ void ScatterElementsUpdateValidator::checkShapes(const CNNLayer* layer, const ve THROW_IE_EXCEPTION << layer->name << " Incorrect number of 'updates' tensors dimension"; Precision inIdxPrecision = layer->insData[INDICES].lock()->getTensorDesc().getPrecision(); - if (inIdxPrecision != Precision::FP32 && inIdxPrecision != Precision::I32) - THROW_IE_EXCEPTION << layer->name << " Incorrect input 'Indices' precision. Only FP32 or I32 are supported!"; + if (inIdxPrecision != Precision::FP32 && inIdxPrecision != Precision::I32 && inIdxPrecision != Precision::I64) + THROW_IE_EXCEPTION << layer->name << " Incorrect input 'Indices' precision. Only FP32 or I32 or I64 are supported!"; Precision inAxisPrecision = layer->insData[AXIS].lock()->getTensorDesc().getPrecision(); - if (inAxisPrecision != Precision::FP32 && inAxisPrecision != Precision::I32) - THROW_IE_EXCEPTION << layer->name << " Incorrect input 'Axis' precision. Only FP32 or I32 are supported!"; + if (inAxisPrecision != Precision::FP32 && inAxisPrecision != Precision::I32 && inIdxPrecision != Precision::I64) + THROW_IE_EXCEPTION << layer->name << " Incorrect input 'Axis' precision. Only FP32 or I32 or I64 are supported!"; if (layer->insData[DATA].lock()->getTensorDesc().getPrecision() != layer->insData[UPDATES].lock()->getTensorDesc().getPrecision()) diff --git a/inference-engine/src/legacy_api/src/shape_infer/built-in/ie_tensor_iterator_shape_infer.hpp b/inference-engine/src/legacy_api/src/shape_infer/built-in/ie_tensor_iterator_shape_infer.hpp index 257cec36ce3..169296a06cd 100644 --- a/inference-engine/src/legacy_api/src/shape_infer/built-in/ie_tensor_iterator_shape_infer.hpp +++ b/inference-engine/src/legacy_api/src/shape_infer/built-in/ie_tensor_iterator_shape_infer.hpp @@ -92,6 +92,7 @@ public: if (!_body_reshaper) THROW_IE_EXCEPTION << "Request of apply reshape results while shape infer was not finished"; _body_reshaper->apply(); + _body_reshaper.reset(); // WA: reset _body_reshaper to release ownership for input data } private: diff --git a/inference-engine/src/legacy_api/src/shape_infer/ie_reshaper.hpp b/inference-engine/src/legacy_api/src/shape_infer/ie_reshaper.hpp index b9d904521a8..144e25f775c 100644 --- a/inference-engine/src/legacy_api/src/shape_infer/ie_reshaper.hpp +++ b/inference-engine/src/legacy_api/src/shape_infer/ie_reshaper.hpp @@ -80,7 +80,7 @@ public: /** * @brief Perform shape inference for the given input shapes but not apply it. - * In case of cusses call apply() method. + * In case of success call apply() method. * @param inputShapes - Map of input names (data) to their input shapes. * @throws exception if shape infer failed without corruption of original shapes */ diff --git a/inference-engine/src/low_precision_transformations/include/low_precision_transformations/power.hpp b/inference-engine/src/low_precision_transformations/include/low_precision_transformations/power.hpp new file mode 100644 index 00000000000..b7edd023b19 --- /dev/null +++ b/inference-engine/src/low_precision_transformations/include/low_precision_transformations/power.hpp @@ -0,0 +1,24 @@ +// Copyright (C) 2020 Intel Corporation +// SPDX-License-Identifier: Apache-2.0 +// + +#pragma once + +#include +#include "ie_layers.h" +#include "low_precision_transformations/transformation_context.hpp" +#include "low_precision_transformations/layer_transformation.hpp" + +namespace InferenceEngine { +namespace details { + +class INFERENCE_ENGINE_API_CLASS(PowerTransformation) : public LayerTransformation { +public: + PowerTransformation(const Params& params) : LayerTransformation(params) {} + ~PowerTransformation() override {} + void transform(TransformationContext& context, CNNLayer& layer) const override; + bool canBeTransformed(const TransformationContext& context, const CNNLayer& layer) const override; +}; + +} // namespace details +} // namespace InferenceEngine diff --git a/inference-engine/src/low_precision_transformations/src/power.cpp b/inference-engine/src/low_precision_transformations/src/power.cpp new file mode 100644 index 00000000000..2f9824018a1 --- /dev/null +++ b/inference-engine/src/low_precision_transformations/src/power.cpp @@ -0,0 +1,75 @@ +// Copyright (C) 2020 Intel Corporation +// SPDX-License-Identifier: Apache-2.0 +// + +#include "low_precision_transformations/power.hpp" + +#include +#include
+#include +#include +#include + +#include "low_precision_transformations/common/ie_lpt_exception.hpp" +#include "low_precision_transformations/network_helper.hpp" + +using namespace InferenceEngine; +using namespace InferenceEngine::details; + +bool PowerTransformation::canBeTransformed(const TransformationContext& context, const CNNLayer& layer) const { + if (!LayerTransformation::canBeTransformed(context, layer)) { + return false; + } + + if (layer.insData.size() != 1) { + THROW_IE_LPT_EXCEPTION(layer) << "layer inputs '" << layer.insData.size() << "' is not correct"; + } + + if (!CaselessEq()(layer.type, "Power")) { + THROW_IE_LPT_EXCEPTION(layer) << "layer '" << layer.name << "' is not correct"; + } + + const PowerLayer* powerLayer = dynamic_cast(&layer); + if (powerLayer == nullptr) { + THROW_IE_LPT_EXCEPTION(layer) << "unexpected Power layer type"; + } + if (powerLayer->power != 1.f) { + return false; + } + + const CNNLayerPtr parent = CNNNetworkHelper::getParent(layer, 0); + return !(parent->type != "ScaleShift"); +} + +void PowerTransformation::transform(TransformationContext& context, CNNLayer& layer) const { + if (!canBeTransformed(context, layer)) { + return; + } + + const PowerLayer* powerLayer = dynamic_cast(&layer); + if (powerLayer == nullptr) { + THROW_IE_LPT_EXCEPTION(layer) << "unexpected Power layer type"; + } + + const CNNLayerPtr parent = CNNNetworkHelper::getParent(layer, 0); + + Blob::Ptr weightsBlob = CNNNetworkHelper::getBlob(parent, "weights"); + auto wBuffer = weightsBlob->buffer().as(); + for (size_t channel = 0ul; channel < weightsBlob->size(); ++channel) { + wBuffer[channel] = wBuffer[channel] * powerLayer->scale; + } + + Blob::Ptr shiftsBlob = CNNNetworkHelper::getBlob(parent, "biases"); + auto sBuffer = shiftsBlob->buffer().as(); + for (size_t channel = 0ul; channel < shiftsBlob->size(); ++channel) { + sBuffer[channel] = sBuffer[channel] * powerLayer->scale + powerLayer->offset; + } + + const std::vector children = CNNNetworkHelper::getChildren(layer); + CNNNetworkHelper::removeLayer(context.network, std::make_shared(layer)); + context.removeLayer(layer); + if (children.empty()) { + const std::string originalName = layer.name; + CNNNetworkHelper::renameLayer(context.network, parent->name, layer.name); + } +} diff --git a/inference-engine/src/low_precision_transformations/src/scaleshift_to_convolution.cpp b/inference-engine/src/low_precision_transformations/src/scaleshift_to_convolution.cpp index 70b7ae7fc45..e712803a874 100644 --- a/inference-engine/src/low_precision_transformations/src/scaleshift_to_convolution.cpp +++ b/inference-engine/src/low_precision_transformations/src/scaleshift_to_convolution.cpp @@ -17,7 +17,7 @@ using namespace InferenceEngine; using namespace InferenceEngine::details; -static const std::unordered_set defaultIgnoreWithParents = { +static const char * defaultIgnoreWithParents[] = { "Convolution", "FakeQuantize" }; @@ -25,7 +25,8 @@ static const std::unordered_set defaultIgnoreWithParents = { ScaleShiftToConvolutionTransformation::ScaleShiftToConvolutionTransformation(const Params& params) : WeightableLayerTransformation(params), groupSize(1ul), - ignoreWithParents(defaultIgnoreWithParents) { + ignoreWithParents(defaultIgnoreWithParents, defaultIgnoreWithParents + + sizeof(defaultIgnoreWithParents) / sizeof(defaultIgnoreWithParents[0])) { } void ScaleShiftToConvolutionTransformation::transform(TransformationContext& context, CNNLayer& layer) const { diff --git a/inference-engine/src/low_precision_transformations/src/transformer.cpp b/inference-engine/src/low_precision_transformations/src/transformer.cpp index 100f5a8a65d..c5910499f5f 100644 --- a/inference-engine/src/low_precision_transformations/src/transformer.cpp +++ b/inference-engine/src/low_precision_transformations/src/transformer.cpp @@ -34,6 +34,7 @@ #include "low_precision_transformations/permute.hpp" #include "low_precision_transformations/pooling.hpp" #include "low_precision_transformations/resample.hpp" +#include "low_precision_transformations/power.hpp" #include "low_precision_transformations/reshape.hpp" #include "low_precision_transformations/scaleshift_to_convolution.hpp" #include "low_precision_transformations/squeeze.hpp" @@ -186,7 +187,8 @@ LowPrecisionTransformations LowPrecisionTransformer::getAllTransformations(const { "ReLU", LayerTransformationPtr(new ActivationTransformation(params)) }, { "MVN", LayerTransformationPtr(new MvnTransformation(params)) }, { "Eltwise", LayerTransformationPtr(new EltwiseTransformation(params)) }, - { "Resample", LayerTransformationPtr(new ResampleTransformation(params)) } + { "Resample", LayerTransformationPtr(new ResampleTransformation(params)) }, + { "Power", LayerTransformationPtr(new PowerTransformation(params)) } }), std::map({ { "FakeQuantize", LayerTransformationPtr(new FuseFakeQuantizeAndScaleShiftTransformation(params)) }, diff --git a/inference-engine/src/mkldnn_plugin/CMakeLists.txt b/inference-engine/src/mkldnn_plugin/CMakeLists.txt index 40abb8cd530..465be27eaf3 100644 --- a/inference-engine/src/mkldnn_plugin/CMakeLists.txt +++ b/inference-engine/src/mkldnn_plugin/CMakeLists.txt @@ -133,15 +133,15 @@ file(GLOB HEADERS addVersionDefines(mkldnn_plugin.cpp CI_BUILD_NUMBER MKL_VERSION) include_directories( - ${IE_MAIN_SOURCE_DIR}/include $ - ${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_CURRENT_SOURCE_DIR}/mkldnn + ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_BINARY_DIR}/include) + +include_directories(SYSTEM ${IE_MAIN_SOURCE_DIR}/thirdparty/mkl-dnn/src/common ${IE_MAIN_SOURCE_DIR}/thirdparty/mkl-dnn/src/cpu - ${IE_MAIN_SOURCE_DIR}/thirdparty/mkl-dnn/include - ${CMAKE_BINARY_DIR}/include/ -) + ${IE_MAIN_SOURCE_DIR}/thirdparty/mkl-dnn/include) if (GEMM STREQUAL "MKL") log_rpath_from_dir(MKL "${MKL}/lib") @@ -167,8 +167,8 @@ add_library(mkldnn_plugin_layers_no_opt_s OBJECT ${CROSS_COMPILED_SOURCES}) set_ie_threading_interface_for(mkldnn_plugin_layers_no_opt_s) target_compile_definitions(mkldnn_plugin_layers_no_opt_s PRIVATE "USE_STATIC_IE;IMPLEMENT_INFERENCE_ENGINE_PLUGIN") -set(object_libraries mkldnn_plugin_layers_no_opt) -set(mkldnn_plugin_object_libraries mkldnn_plugin_layers_no_opt_s) +list(APPEND object_libraries mkldnn_plugin_layers_no_opt) +list(APPEND mkldnn_plugin_object_libraries mkldnn_plugin_layers_no_opt_s) # SSE 4.2 optimized layers diff --git a/inference-engine/src/mkldnn_plugin/bf16transformer.cpp b/inference-engine/src/mkldnn_plugin/bf16transformer.cpp index 0558bd1e51a..d1d27d4a52b 100644 --- a/inference-engine/src/mkldnn_plugin/bf16transformer.cpp +++ b/inference-engine/src/mkldnn_plugin/bf16transformer.cpp @@ -55,6 +55,9 @@ void BF16Transformer::convertToBFloat16(InferenceEngine::CNNNetwork &network) { InputsDataMap inputs = network.getInputsInfo(); OutputsDataMap outputs = network.getOutputsInfo(); for (auto iter : sortedLayers) { + if (_skipmarking.find(iter->type) != _skipmarking.end()) { + continue; + } for (size_t o = 0; o < iter->outData.size(); o++) { if (inputs.find(iter->outData[o]->getName()) == inputs.end() && outputs.find(iter->outData[o]->getName()) == outputs.end() @@ -109,6 +112,9 @@ void BF16Transformer::optimizeToFloat(InferenceEngine::CNNNetwork &network) { // 2b. go over all unknown layers for this algo and mark them as fp32 and add to the toAnalyzeTensors // 2c. go over all inputs to _initbf16 and if they are fp32 - add them to the toAnalyzeTensors for (auto iter : sortedLayers) { + if (_skipmarking.find(iter->type) != _skipmarking.end()) { + continue; + } if (_initbf16.find(iter->type) == _initbf16.end() && _complementbf16.find(iter->type) == _complementbf16.end() && _multiinput.find(iter->type) == _multiinput.end()) { diff --git a/inference-engine/src/mkldnn_plugin/bf16transformer.h b/inference-engine/src/mkldnn_plugin/bf16transformer.h index 22becc6e860..536338316df 100644 --- a/inference-engine/src/mkldnn_plugin/bf16transformer.h +++ b/inference-engine/src/mkldnn_plugin/bf16transformer.h @@ -15,9 +15,12 @@ class BF16Transformer { const InferenceEngine::details::caseless_set _initbf16 = { "convolution", "fullyconnected", "innerproduct" }; const InferenceEngine::details::caseless_set _complementbf16 = - { "relu", "pooling", "norm", "gather" }; + { "relu", "tanh", "elu", "square", "abs", "sqrt", "linear", "bounded_relu", "soft_relu", "logistic", + "exp", "gelu", "clamp", "swish", "prelu", "pooling", "norm", "gather" }; const InferenceEngine::details::caseless_set _multiinput = { "concat", "eltwise" }; + const InferenceEngine::details::caseless_set _skipmarking = + { "const" }; /** * Tries to mark tensor as FP32 by analyzing of local consumers of the tensor. Do not mark if diff --git a/inference-engine/src/mkldnn_plugin/mkldnn_exec_network.cpp b/inference-engine/src/mkldnn_plugin/mkldnn_exec_network.cpp index f444ff56074..f6f2284c51f 100644 --- a/inference-engine/src/mkldnn_plugin/mkldnn_exec_network.cpp +++ b/inference-engine/src/mkldnn_plugin/mkldnn_exec_network.cpp @@ -41,25 +41,7 @@ MKLDNNExecNetwork::CreateInferRequestImpl(InferenceEngine::InputsDataMap network MKLDNNExecNetwork::MKLDNNExecNetwork(const InferenceEngine::ICNNNetwork &network, const Config &cfg, const MKLDNNExtensionManager::Ptr& extMgr) : - InferenceEngine::ExecutableNetworkThreadSafeDefault([&] ()->ITaskExecutor::Ptr { - ExecutorManager *executorManager = ExecutorManager::getInstance(); - - if (cfg.exclusiveAsyncRequests) { - // special case when all InferRequests are muxed into a single queue - return executorManager->getExecutor("CPU");; - } else { - const int env_threads = parallel_get_env_threads(); - const auto& numa_nodes = getAvailableNUMANodes(); - const auto numa_nodes_num = numa_nodes.size(); - auto streamExecutorConfig = cfg.streamExecutorConfig; - // use logical cores only for single-socket targets in throughput mode - const int hw_cores = streamExecutorConfig._streams > 1 && numa_nodes_num == 1 ? parallel_get_max_threads() : getNumberOfCPUCores(); - const int threads = streamExecutorConfig._threads ? streamExecutorConfig._threads : (env_threads ? env_threads : hw_cores); - streamExecutorConfig._threadsPerStream = std::max(1, threads/streamExecutorConfig._streams); - streamExecutorConfig._name = "CPUStreamsExecutor"; - return executorManager->getIdleCPUStreamsExecutor(streamExecutorConfig); - } - } ()), + InferenceEngine::ExecutableNetworkThreadSafeDefault{nullptr, nullptr}, extensionManager(extMgr), _cfg{cfg}, _name{network.getName()} { @@ -101,7 +83,21 @@ MKLDNNExecNetwork::MKLDNNExecNetwork(const InferenceEngine::ICNNNetwork &network LayerTransformation::Params(params).setPrecisionsOnActivations({ Precision::U8 }), "ScaleShift")); transformer.transform(*_clonedNetwork); - if (with_cpu_x86_bfloat16()) { + + // Check if network is INT8 or Binary. + // BF16 transformations were disabled since CPU plug-in doesn't support mixed precision execution: + // BF16 + INT8 or BF16 + BIN. + bool isFloatModel = true; + CNNNetworkIterator i(&network); + while (i != CNNNetworkIterator()) { + if (CaselessEq()((*i)->type, "FakeQuantize")) { + isFloatModel = false; + break; + } + i++; + } + + if (with_cpu_x86_bfloat16() && isFloatModel) { BF16Transformer bf16Transformer; CNNNetwork cnnetwork(_clonedNetwork); if (cfg.enforceBF16 == true) { @@ -126,6 +122,30 @@ MKLDNNExecNetwork::MKLDNNExecNetwork(const InferenceEngine::ICNNNetwork &network } } + if (cfg.exclusiveAsyncRequests) { + // special case when all InferRequests are muxed into a single queue + _taskExecutor = ExecutorManager::getInstance()->getExecutor("CPU"); + } else { + const int env_threads = parallel_get_env_threads(); + const auto& numa_nodes = getAvailableNUMANodes(); + const auto numa_nodes_num = numa_nodes.size(); + auto streamExecutorConfig = cfg.streamExecutorConfig; + // use logical cores only for single-socket targets in throughput mode + const int hw_cores = streamExecutorConfig._streams > 1 && numa_nodes_num == 1 ? parallel_get_max_threads() : getNumberOfCPUCores(); + const int threads = streamExecutorConfig._threads ? streamExecutorConfig._threads : (env_threads ? env_threads : hw_cores); + streamExecutorConfig._threadsPerStream = streamExecutorConfig._streams + ? std::max(1, threads/streamExecutorConfig._streams) + : threads; + streamExecutorConfig._name = "CPUStreamsExecutor"; + _taskExecutor = ExecutorManager::getInstance()->getIdleCPUStreamsExecutor(streamExecutorConfig); + } + if (0 != cfg.streamExecutorConfig._streams) { + _callbackExecutor = ExecutorManager::getInstance()->getIdleCPUStreamsExecutor( + IStreamsExecutor::Config{"CPUCallbackExecutor", 1, 0, IStreamsExecutor::ThreadBindingType::NONE}); + } else { + _callbackExecutor = _taskExecutor; + } + _graphs = decltype(_graphs){[&] { // TODO: Remove `cloneNet` to `localNetwork` when `MKLDNNGraph::CreateGraph` // is fixed and does not change content of network passed (CVS-26420) @@ -230,7 +250,9 @@ void MKLDNNExecNetwork::GetMetric(const std::string &name, Parameter &result, Re Config engConfig = _graphs.begin()->get()->getProperty(); auto option = engConfig._config.find(CONFIG_KEY(CPU_THROUGHPUT_STREAMS)); IE_ASSERT(option != engConfig._config.end()); - result = IE_SET_METRIC(OPTIMAL_NUMBER_OF_INFER_REQUESTS, static_cast(std::stoi(option->second))); + auto streams = std::stoi(option->second); + result = IE_SET_METRIC(OPTIMAL_NUMBER_OF_INFER_REQUESTS, static_cast( + streams ? streams : 1)); } else { THROW_IE_EXCEPTION << "Unsupported ExecutableNetwork metric: " << name; } diff --git a/inference-engine/src/mkldnn_plugin/mkldnn_graph_optimizer.cpp b/inference-engine/src/mkldnn_plugin/mkldnn_graph_optimizer.cpp index 83435236563..6442c5bf757 100644 --- a/inference-engine/src/mkldnn_plugin/mkldnn_graph_optimizer.cpp +++ b/inference-engine/src/mkldnn_plugin/mkldnn_graph_optimizer.cpp @@ -704,7 +704,6 @@ void MKLDNNGraphOptimizer::FuseConvolutionAndActivation(MKLDNNGraph &graph) { return activationNode && (activationNode->getAlgorithm() == eltwise_relu || (conv->getCnnLayer()->precision == Precision::FP32 && - conv->getCnnLayer()->insData[0].lock()->getPrecision() != Precision::BF16 && isOneOf(activationNode->getAlgorithm(), {eltwise_elu, eltwise_logistic, eltwise_bounded_relu, eltwise_clamp, eltwise_swish}))); }; @@ -778,7 +777,6 @@ void MKLDNNGraphOptimizer::FuseFullyConnectedAndSimpleOperation(MKLDNNGraph &gra auto isSutableParentNode = [](MKLDNNNodePtr node) { return node->getType() == FullyConnected && - node->getCnnLayer()->insData[0].lock()->getPrecision() != Precision::BF16 && node->getChildEdges().size() == 1; }; @@ -850,9 +848,7 @@ void MKLDNNGraphOptimizer::FuseConvolutionAndDepthwise(MKLDNNGraph &graph) { bool isSutableConv = (node->getType() == Convolution) && node->getCnnLayer()->precision == Precision::FP32; bool isSutableBinConv = node->getType() == BinaryConvolution; - return (isSutableConv || isSutableBinConv) && node->getChildEdges().size() == 1 && - !(node->getCnnLayer()->insData[0].lock()->getPrecision() == Precision::BF16 && - node->getCnnLayer()->outData[0]->getPrecision() == Precision::FP32); + return (isSutableConv || isSutableBinConv) && node->getChildEdges().size() == 1; }; auto isSutableChildNode = [](MKLDNNNodePtr node) { @@ -1125,9 +1121,7 @@ void MKLDNNGraphOptimizer::FuseConvolutionAndSimpleOperation(MKLDNNGraph &graph) auto isSutableParentNode = [](MKLDNNNodePtr node) { return node->getType() == Convolution && node->getChildEdges().size() == 1 && - node->getCnnLayer()->precision == Precision::FP32 && - !(node->getCnnLayer()->insData[0].lock()->getPrecision() == Precision::BF16 && - node->getCnnLayer()->outData[0]->getPrecision() == Precision::FP32); + node->getCnnLayer()->precision == Precision::FP32; }; auto isSutableChildNode = [&](MKLDNNNodePtr node) { diff --git a/inference-engine/src/mkldnn_plugin/mkldnn_plugin.cpp b/inference-engine/src/mkldnn_plugin/mkldnn_plugin.cpp index f97d71fe625..35261ce2834 100644 --- a/inference-engine/src/mkldnn_plugin/mkldnn_plugin.cpp +++ b/inference-engine/src/mkldnn_plugin/mkldnn_plugin.cpp @@ -19,6 +19,7 @@ #include #include #include +#include #include #include #include @@ -55,10 +56,11 @@ Engine::Engine() { Engine::~Engine() { ExecutorManager::getInstance()->clear("CPUStreamsExecutor"); + ExecutorManager::getInstance()->clear("CPUCallbackExecutor"); } InferenceEngine::ExecutableNetworkInternal::Ptr -Engine::LoadExeNetworkImpl(const ICore * /*core*/, const InferenceEngine::ICNNNetwork &network, const std::map &config) { +Engine::LoadExeNetworkImpl(const InferenceEngine::ICNNNetwork &network, const std::map &config) { // verification of supported input InferenceEngine::InputsDataMap _networkInputs; network.getInputsInfo(_networkInputs); @@ -100,6 +102,7 @@ Engine::LoadExeNetworkImpl(const ICore * /*core*/, const InferenceEngine::ICNNNe // Note: instead of running all Conversion Transformations you can make up your own transformation pipeline ngraph::pass::CommonOptimizations().run_on_function(nGraphFunc); + ngraph::pass::ConvertOpSet3ToOpSet2(transformations_callback).run_on_function(nGraphFunc); ngraph::pass::ConvertOpSet2ToOpSet1(transformations_callback).run_on_function(nGraphFunc); ngraph::pass::ConvertOpSet1ToLegacy(transformations_callback).run_on_function(nGraphFunc); clonedNetwork = InferenceEngine::details::convertFunctionToICNNNetwork(nGraphFunc, *clonedNetwork); diff --git a/inference-engine/src/mkldnn_plugin/mkldnn_plugin.h b/inference-engine/src/mkldnn_plugin/mkldnn_plugin.h index a95698a36d0..310aef43304 100644 --- a/inference-engine/src/mkldnn_plugin/mkldnn_plugin.h +++ b/inference-engine/src/mkldnn_plugin/mkldnn_plugin.h @@ -71,14 +71,11 @@ public: ~Engine() override; InferenceEngine::ExecutableNetworkInternal::Ptr - LoadExeNetworkImpl(const InferenceEngine::ICore * core, const InferenceEngine::ICNNNetwork &network, + LoadExeNetworkImpl(const InferenceEngine::ICNNNetwork &network, const std::map &config) override; void AddExtension(InferenceEngine::IExtensionPtr extension) override; - /** - * @deprecated - * @param config - */ + void SetConfig(const std::map &config) override; InferenceEngine::Parameter GetConfig(const std::string& name, const std::map& options) const override; diff --git a/inference-engine/src/mkldnn_plugin/nodes/list.hpp b/inference-engine/src/mkldnn_plugin/nodes/list.hpp index 7ffa7494c44..b83108cde4f 100644 --- a/inference-engine/src/mkldnn_plugin/nodes/list.hpp +++ b/inference-engine/src/mkldnn_plugin/nodes/list.hpp @@ -35,9 +35,6 @@ struct ExtensionsHolder { std::map si_list; }; -template -class TExtensionsHolder : public ExtensionsHolder {}; - template class MKLDNNExtensions : public IExtension { public: @@ -89,11 +86,11 @@ public: } static std::shared_ptr GetExtensionsHolder() { - static std::shared_ptr> localHolder; + static std::shared_ptr localHolder; if (localHolder == nullptr) { - localHolder = std::make_shared>(); + localHolder = std::make_shared(); } - return std::dynamic_pointer_cast(localHolder); + return localHolder; } private: diff --git a/inference-engine/src/mkldnn_plugin/nodes/mkldnn_permute_node.cpp b/inference-engine/src/mkldnn_plugin/nodes/mkldnn_permute_node.cpp index 025957133b5..ce62371cb08 100644 --- a/inference-engine/src/mkldnn_plugin/nodes/mkldnn_permute_node.cpp +++ b/inference-engine/src/mkldnn_plugin/nodes/mkldnn_permute_node.cpp @@ -812,7 +812,7 @@ static void permute_to_04123(int MB, MKLDNNMemoryPtr& srcMemPtr, MKLDNNMemoryPtr }); } -std::multimap MKLDNNPermuteNode::OptimizedCases = { +const std::multimap MKLDNNPermuteNode::OptimizedCases = { {{0, 2, 3, 1}, MKLDNNPermuteNode::PermuteImpl(permute_to_0231, [](int MB, MKLDNNMemoryPtr& srcMemPtr, MKLDNNMemoryPtr& dstMemPtr) { return true; })}, // NCHW -> NHWC case diff --git a/inference-engine/src/mkldnn_plugin/nodes/mkldnn_permute_node.h b/inference-engine/src/mkldnn_plugin/nodes/mkldnn_permute_node.h index edfeb875690..2097b323190 100644 --- a/inference-engine/src/mkldnn_plugin/nodes/mkldnn_permute_node.h +++ b/inference-engine/src/mkldnn_plugin/nodes/mkldnn_permute_node.h @@ -68,7 +68,7 @@ private: isApplicable isValidParams; }; - static std::multimap OptimizedCases; + static const std::multimap OptimizedCases; std::shared_ptr permute_kernel; }; diff --git a/inference-engine/src/mkldnn_plugin/nodes/mkldnn_pooling_node.cpp b/inference-engine/src/mkldnn_plugin/nodes/mkldnn_pooling_node.cpp index 870a8f67b1c..63e4e7b7387 100644 --- a/inference-engine/src/mkldnn_plugin/nodes/mkldnn_pooling_node.cpp +++ b/inference-engine/src/mkldnn_plugin/nodes/mkldnn_pooling_node.cpp @@ -67,21 +67,23 @@ void MKLDNNPoolingNode::getSupportedDescriptors() { invertVectorCopyUtoI(poolingLayer->_stride, stride); invertVectorCopyUtoI(poolingLayer->_kernel, kernel); auto allPads = getPaddings(*poolingLayer); - invertVectorCopyUtoI(allPads.begin, paddingL); - invertVectorCopyUtoI(allPads.end, paddingR); + invertVectorCopyUtoI(allPads.begin, data_pad_begin); + invertVectorCopyUtoI(allPads.end, data_pad_end); + effective_pad_begin = data_pad_begin; + effective_pad_end.resize(data_pad_end.size()); auto parentDims = getParentEdgeAt(0)->getDims(); auto childDims = getChildEdgeAt(0)->getDims(); if ((parentDims.ndims() < 4) || (parentDims.ndims() > 5)) THROW_IE_EXCEPTION << "Pooling layer. Unsupported mode. Only 4D and 5D blobs are supported as input."; - for (int i = 0; i < paddingR.size(); i++) { + for (int i = 0; i < effective_pad_end.size(); i++) { int krn = kernel[i]; int src = getParentEdgeAt(0)->getDims()[2 + i]; int dst = getChildEdgeAt(0)->getDims()[2 + i]; - int calc_dst = (src - krn + paddingL[i]) / stride[i] + 1; - paddingR[i] = (dst - calc_dst) * stride[i]; + int calc_dst = (src - krn + data_pad_begin[i]) / stride[i] + 1; + effective_pad_end[i] = (dst - calc_dst) * stride[i]; } if (inputPrecision == Precision::I8 || inputPrecision == Precision::U8) { // i8 layers supports only ndhwc and nhwc layouts @@ -138,13 +140,20 @@ void MKLDNNPoolingNode::createDescriptor(const std::vector desc_ptr( new pooling_forward::desc(prop_kind::forward_scoring, alg, in_candidate, out_candidate, - stride, kernel, paddingL, paddingR, + stride, kernel, effective_pad_begin, effective_pad_end, mkldnn::padding_kind::zero)); - bool not_zero_r = false; - for (auto pr : paddingR) { - if (pr) { - not_zero_r = true; - break; - } - } - if (alg == pooling_avg_include_padding && not_zero_r) { + if (alg == pooling_avg_include_padding) { // In case of AVG including paddings the norm coeff should be calculated // with tacking into account original pads. So we need to restore - // original values (R_padding = L_padding). + // original values for end paddings. // // WA. Because mkldnn uses different formula to calculate AVG norm coeff // in compare with Caffe. In mkldnn coeff is always 1/(KH*KW) - for (int i = 0; i < paddingL.size(); i++) desc_ptr->data.padding[1][i] = paddingL[i]; + for (int i = 0; i < data_pad_end.size(); i++) { + if (data_pad_end[i] != effective_pad_end[i]) + desc_ptr->data.padding[1][i] = static_cast(data_pad_end[i]); + } } descs.emplace_back(desc_ptr); diff --git a/inference-engine/src/mkldnn_plugin/nodes/mkldnn_pooling_node.h b/inference-engine/src/mkldnn_plugin/nodes/mkldnn_pooling_node.h index 764af52bda6..92208d1671b 100644 --- a/inference-engine/src/mkldnn_plugin/nodes/mkldnn_pooling_node.h +++ b/inference-engine/src/mkldnn_plugin/nodes/mkldnn_pooling_node.h @@ -34,10 +34,21 @@ private: InferenceEngine::PoolingLayer::PoolType type = InferenceEngine::PoolingLayer::MAX; bool exclude_pad = false; std::vector stride; - std::vector paddingL; - std::vector paddingR; std::vector kernel; + /// Effective padding. Used to define correct output shape by MKLDNN + /// reshape formula: (iw - kernel + pad_l + pad_r) / strides[i - 2] + 1 + /// should be passed into pooling desc constructor. + std::vector effective_pad_begin; + std::vector effective_pad_end; + + /// Effective pad value. Describe how much zero element added to input + /// data tensor. May be less than "Effective padding" values. + /// If pooling window is out of this padding, the region of averaging + /// is decreased. + std::vector data_pad_begin; + std::vector data_pad_end; + InferenceEngine::Precision inputPrecision = InferenceEngine::Precision::FP32; InferenceEngine::Precision outputPrecision = InferenceEngine::Precision::FP32; diff --git a/inference-engine/src/mkldnn_plugin/nodes/mkldnn_resample_node.cpp b/inference-engine/src/mkldnn_plugin/nodes/mkldnn_resample_node.cpp index 9d7c188411e..a85ba1a615e 100644 --- a/inference-engine/src/mkldnn_plugin/nodes/mkldnn_resample_node.cpp +++ b/inference-engine/src/mkldnn_plugin/nodes/mkldnn_resample_node.cpp @@ -39,7 +39,7 @@ struct jit_uni_resample_nearest_kernel_f32 : public jit_uni_resample_nearest_ker DECLARE_CPU_JIT_AUX_FUNCTIONS(jit_uni_resample_nearest_kernel_f32) explicit jit_uni_resample_nearest_kernel_f32(jit_resample_config_params jcp, const mkldnn_primitive_attr &attr) - : jit_uni_resample_nearest_kernel(jcp, attr), jit_generator() { + : jit_uni_resample_nearest_kernel(jcp, attr), jit_generator() { const auto &p = attr_.post_ops_; for (int i = 0; i < p.len_; i++) { auto &post_op = p.entry_[i]; @@ -321,6 +321,14 @@ void MKLDNNResampleNode::initSupportedPrimitiveDescriptors() { } } + if (inputPrecision == Precision::BF16) { + inputPrecision = Precision::FP32; + } + + if (outputPrecision == Precision::BF16) { + outputPrecision = Precision::FP32; + } + auto inputDataType = MKLDNNExtensionUtils::IEPrecisionToDataType(inputPrecision); auto outputDataType = MKLDNNExtensionUtils::IEPrecisionToDataType(outputPrecision); @@ -587,7 +595,7 @@ void MKLDNNResampleNode::execute(mkldnn::stream strm) { // f32 and no fused, f32->input is f32, no fuse->output is f32 void MKLDNNResampleNode::NearestNeighbor_PLN(const float *in_ptr_, float *out_ptr_, int B, int C, int ID, int IH, int IW, - float fx, float fy, float fz, int OD, int OH, int OW) { + float fx, float fy, float fz, int OD, int OH, int OW) { std::vector index_buffer(OD * OH * OW); for (int oz = 0; oz < OD; oz++) { float iz = oz * fz; @@ -640,7 +648,7 @@ void MKLDNNResampleNode::NearestNeighbor_PLN(const float *in_ptr_, float *out_pt // int8->input may be int8, fused->output may be int8 template void MKLDNNResampleNode::NearestNeighbor_BLK(const in_data_t *in_ptr_, out_data_t *out_ptr_, int B, int C, int ID, int IH, int IW, - float fx, float fy, float fz, int OD, int OH, int OW) { + float fx, float fy, float fz, int OD, int OH, int OW) { std::vector index_d(OD); std::vector index_h(OH); std::vector index_w(OW); @@ -792,7 +800,7 @@ static inline float triangleCoeff(float x) { template void MKLDNNResampleNode::LinearInterpolation(const in_data_t *in_ptr_, out_data_t *out_ptr_, int B, int C, int ID, int IH, int IW, - float fx, float fy, float fz, int OD, int OH, int OW, int kernel_width, bool antialias) { + float fx, float fy, float fz, int OD, int OH, int OW, int kernel_width, bool antialias) { if (IW == OW && IH == OH && ID == OD) { size_t size = B * C * ID * IH * IW; if (input_prec == Precision::FP32) { diff --git a/inference-engine/src/multi_device/CMakeLists.txt b/inference-engine/src/multi_device/CMakeLists.txt new file mode 100644 index 00000000000..d38f95289ef --- /dev/null +++ b/inference-engine/src/multi_device/CMakeLists.txt @@ -0,0 +1,26 @@ +# Copyright (C) 2018-2020 Intel Corporation +# SPDX-License-Identifier: Apache-2.0 +# + +set (TARGET_NAME "MultiDevicePlugin") + +if(ENABLE_LTO) + ie_enable_lto() +endif() + +file(GLOB SOURCES + ${CMAKE_CURRENT_SOURCE_DIR}/*.cpp +) + +file(GLOB HEADERS + ${CMAKE_CURRENT_SOURCE_DIR}/*.hpp +) + +ie_add_plugin(NAME ${TARGET_NAME} + DEVICE_NAME "MULTI" + SOURCES ${SOURCES} ${HEADERS} + VERSION_DEFINES_FOR multi_device.cpp) + +target_link_libraries(${TARGET_NAME} PRIVATE inference_engine) + +set_ie_threading_interface_for(${TARGET_NAME}) diff --git a/inference-engine/src/multi_device/multi_device.cpp b/inference-engine/src/multi_device/multi_device.cpp new file mode 100644 index 00000000000..2f09d28b11c --- /dev/null +++ b/inference-engine/src/multi_device/multi_device.cpp @@ -0,0 +1,548 @@ +// Copyright (C) 2018-2020 Intel Corporation +// SPDX-License-Identifier: Apache-2.0 +// + +/////////////////////////////////////////////////////////////////////////////////////////////////// +#include +#include +#include +#include +#include +#include +#include + +#include "ie_metric_helpers.hpp" +#include +#include +#include +#include +#include +#include "multi_device.hpp" + +namespace MultiDevicePlugin { + using namespace InferenceEngine; +// ------------------------------MultiDeviceInferRequest---------------------------- +MultiDeviceInferRequest::MultiDeviceInferRequest(const InputsDataMap& networkInputs, + const OutputsDataMap& networkOutputs) + : InferRequestInternal(networkInputs, networkOutputs) { + // Allocate all input blobs + for (const auto &it : networkInputs) { + Layout l = it.second->getLayout(); + Precision p = it.second->getPrecision(); + SizeVector dims = it.second->getTensorDesc().getDims(); + + TensorDesc desc = TensorDesc(p, dims, l); + _inputs[it.first] = make_blob_with_precision(desc); + _inputs[it.first]->allocate(); + } + // Allocate all output blobs + for (const auto &it : networkOutputs) { + Layout l = it.second->getLayout(); + Precision p = it.second->getPrecision(); + SizeVector dims = it.second->getTensorDesc().getDims(); + + TensorDesc desc = TensorDesc(p, dims, l); + _outputs[it.first] = make_blob_with_precision(desc); + _outputs[it.first]->allocate(); + } +} + +void MultiDeviceInferRequest::SetBlobsToAnotherRequest(InferRequest& req) { + for (const auto &it : _networkInputs) { + Blob::Ptr blob; + auto &name = it.first; + // this request is already in BUSY state, so using the internal functions safely + GetBlob(name.c_str(), blob); + req.SetBlob(name.c_str(), blob); + } + for (const auto &it : _networkOutputs) { + Blob::Ptr blob; + auto &name = it.first; + // this request is already in BUSY state, so using the internal functions safely + GetBlob(name.c_str(), blob); + req.SetBlob(name.c_str(), blob); + } +} + +MultiDeviceAsyncInferRequest::MultiDeviceAsyncInferRequest( + const MultiDeviceInferRequest::Ptr& inferRequest, + const bool needPerfCounters, + const MultiDeviceExecutableNetwork::Ptr& multiDeviceExecutableNetwork, + const ITaskExecutor::Ptr& callbackExecutor) : + AsyncInferRequestThreadSafeDefault(inferRequest, nullptr, callbackExecutor), + _multiDeviceExecutableNetwork{multiDeviceExecutableNetwork}, + _inferRequest{inferRequest}, + _needPerfCounters{needPerfCounters} { + struct ThisRequestExecutor : public ITaskExecutor { + explicit ThisRequestExecutor(MultiDeviceAsyncInferRequest* _this_) : _this{_this_} {} + void run(Task task) override { + auto workerInferRequest = _this->_workerInferRequest; + workerInferRequest->_task = std::move(task); + workerInferRequest->_inferRequest.StartAsync(); + }; + MultiDeviceAsyncInferRequest* _this = nullptr; + }; + _pipeline = { + {_multiDeviceExecutableNetwork, [this] { + _workerInferRequest = MultiDeviceExecutableNetwork::_thisWorkerInferRequest; + _inferRequest->SetBlobsToAnotherRequest(_workerInferRequest->_inferRequest); + }}, + {std::make_shared(this), [this] { + auto status = _workerInferRequest->_status; + if (InferenceEngine::StatusCode::OK != status) { + if (nullptr != InferenceEngine::CurrentException()) { + std::rethrow_exception(InferenceEngine::CurrentException()); + } else { + THROW_IE_EXCEPTION << InferenceEngine::details::as_status << status; + } + } + if (_needPerfCounters) { + _perfMap = _workerInferRequest->_inferRequest.GetPerformanceCounts(); + } + }} + }; +} + +void MultiDeviceAsyncInferRequest::Infer_ThreadUnsafe() { + InferUsingAsync(); +} + +void MultiDeviceAsyncInferRequest::GetPerformanceCounts_ThreadUnsafe(std::map &perfMap) const { + perfMap = std::move(_perfMap); +} + +MultiDeviceAsyncInferRequest::~MultiDeviceAsyncInferRequest() { + StopAndWait(); +} + +// ------------------------------MultiDeviceExecutableNetwork---------------------------- + +thread_local MultiDeviceExecutableNetwork::WorkerInferRequest* MultiDeviceExecutableNetwork::_thisWorkerInferRequest = nullptr; + +struct IdleGuard { + explicit IdleGuard(MultiDeviceExecutableNetwork::WorkerInferRequest* workerInferRequestPtr, + MultiDeviceExecutableNetwork::NotBusyWorkerRequests& notBusyWorkerRequests) : + _workerInferRequestPtr{workerInferRequestPtr}, + _notBusyWorkerRequests{¬BusyWorkerRequests} { + } + ~IdleGuard() { + if (nullptr != _notBusyWorkerRequests) { + _notBusyWorkerRequests->push(_workerInferRequestPtr); + } + } + MultiDeviceExecutableNetwork::NotBusyWorkerRequests* Release() { + auto notBusyWorkerRequests = _notBusyWorkerRequests; + _notBusyWorkerRequests = nullptr; + return notBusyWorkerRequests; + } + MultiDeviceExecutableNetwork::WorkerInferRequest* _workerInferRequestPtr = nullptr; + MultiDeviceExecutableNetwork::NotBusyWorkerRequests* _notBusyWorkerRequests = nullptr; +}; + +MultiDeviceExecutableNetwork::MultiDeviceExecutableNetwork(const DeviceMap& networksPerDevice, + const DeviceMap& networkDevices, + const std::unordered_map& config, + const bool needPerfCounters) : + InferenceEngine::ExecutableNetworkThreadSafeDefault(nullptr, std::make_shared()), + _devicePriorities{networkDevices}, + _networksPerDevice{networksPerDevice}, + _config{config}, + _needPerfCounters{needPerfCounters} { + _taskExecutor.reset(); + for (auto&& networkValue : _networksPerDevice) { + auto& device = networkValue.first; + auto& network = networkValue.second; + + auto itNumRequests = _devicePriorities.find(device); + unsigned int optimalNum = 0; + try { + optimalNum = network.GetMetric(METRIC_KEY(OPTIMAL_NUMBER_OF_INFER_REQUESTS)).as(); + } catch (const details::InferenceEngineException &iie) { + THROW_IE_EXCEPTION + << "Every device used with the Multi-Device should " + << "support OPTIMAL_NUMBER_OF_INFER_REQUESTS ExecutableNetwork metric. " + << "Failed to query the metric for the " << device << " with error:" << iie.what(); + } + const auto numRequests = (_devicePriorities.end() == itNumRequests || + itNumRequests->second.numRequestsPerDevices == -1) ? optimalNum : itNumRequests->second.numRequestsPerDevices; + auto& workerRequests = _workerRequests[device]; + auto& idleWorkerRequests = _idleWorkerRequests[device]; + workerRequests.resize(numRequests); + auto* idleWorkerRequestsPtr = &(idleWorkerRequests); + for (auto&& workerRequest : workerRequests) { + workerRequest._inferRequest = network.CreateInferRequest(); + auto* workerRequestPtr = &workerRequest; + idleWorkerRequests.push(workerRequestPtr); + workerRequest._inferRequest.SetCompletionCallback>( + [workerRequestPtr, this, device, idleWorkerRequestsPtr] (InferRequest , StatusCode status) mutable { + IdleGuard idleGuard{workerRequestPtr, *idleWorkerRequestsPtr}; + workerRequestPtr->_status = status; + { + auto capturedTask = std::move(workerRequestPtr->_task); + capturedTask(); + } + if (!_terminate) { + idleGuard.Release()->push(workerRequestPtr); + ScheduleToWorkerInferRequest(); + } + }); + } + } +} + +void MultiDeviceExecutableNetwork::ScheduleToWorkerInferRequest() { + auto devices = [&] { + std::lock_guard lock(_mutex); + return _devicePriorities; + }(); + for (auto&& device : devices) { + auto& idleWorkerRequests = _idleWorkerRequests[device.first]; + WorkerInferRequest* workerRequestPtr = nullptr; + if (idleWorkerRequests.try_pop(workerRequestPtr)) { + IdleGuard idleGuard{workerRequestPtr, idleWorkerRequests}; + Task inferPipelineTask; + if (_inferPipelineTasks.try_pop(inferPipelineTask)) { + _thisWorkerInferRequest = workerRequestPtr; + inferPipelineTask(); + idleGuard.Release(); + break; + } + } + } +} + +void MultiDeviceExecutableNetwork::run(Task inferPipelineTask) { + if (!_terminate) { + _inferPipelineTasks.push(std::move(inferPipelineTask)); + ScheduleToWorkerInferRequest(); + } +} + +MultiDeviceExecutableNetwork::~MultiDeviceExecutableNetwork() { + { + std::lock_guard lock(_mutex); + _devicePriorities.clear(); + } + _terminate = true; + /* NOTE: The only threads that use `MultiDeviceExecutableNetwork` Context are those that are used by Worker infer requests. + * But AsyncInferRequest destructor should waits for all asynchronous tasks that are used by the request + */ + _workerRequests.clear(); +} + +InferenceEngine::InferRequestInternal::Ptr MultiDeviceExecutableNetwork::CreateInferRequestImpl(InferenceEngine::InputsDataMap networkInputs, + InferenceEngine::OutputsDataMap networkOutputs) { + return std::make_shared(networkInputs, networkOutputs); +} + +void MultiDeviceExecutableNetwork::CreateInferRequest(IInferRequest::Ptr& asyncRequest) { + auto syncRequestImpl = CreateInferRequestImpl(_networkInputs, _networkOutputs); + syncRequestImpl->setPointerToExecutableNetworkInternal(shared_from_this()); + auto asyncTreadSafeImpl = std::make_shared(std::static_pointer_cast(syncRequestImpl), + _needPerfCounters, + std::static_pointer_cast(shared_from_this()), + _callbackExecutor); + asyncRequest.reset(new InferRequestBase(asyncTreadSafeImpl), [](IInferRequest *p) { p->Release(); }); + asyncTreadSafeImpl->SetPointerToPublicInterface(asyncRequest); +} + +void MultiDeviceExecutableNetwork::SetConfig(const std::map &config, + InferenceEngine::ResponseDesc * /* resp */) { + auto priorities = config.find(MultiDeviceConfigParams::KEY_MULTI_DEVICE_PRIORITIES); + if (priorities == config.end() || config.size() > 1) { + THROW_IE_EXCEPTION << NOT_IMPLEMENTED_str << + "The only config supported for the Network's SetConfig is MultiDeviceConfigParams::KEY_MULTI_DEVICE_PRIORITIES"; + } else { + auto multiPlugin = std::dynamic_pointer_cast(this->_plugin); + assert(multiPlugin != nullptr); + auto metaDevices = multiPlugin->ParseMetaDevices(priorities->second, {}); + + if (std::any_of(metaDevices.begin(), metaDevices.end(), [](const std::pair & kvp) { + return kvp.second.numRequestsPerDevices != -1; + })) { + THROW_IE_EXCEPTION << NOT_IMPLEMENTED_str << "You can only change device priorities but not number of requests" + <<" with the Network's SetConfig(MultiDeviceConfigParams::KEY_MULTI_DEVICE_PRIORITIES!"; + } + + { + std::lock_guard lock{_mutex}; + for (auto && device : metaDevices) { + if (_devicePriorities.find(device.first) == _devicePriorities.end()) { + THROW_IE_EXCEPTION << NOT_FOUND_str << "You can only change device priorities but not add new devices with" + << " the Network's SetConfig(MultiDeviceConfigParams::KEY_MULTI_DEVICE_PRIORITIES." << device.first << + " device was not in the original device list!"; + } + } + _devicePriorities = metaDevices; + + // update value in config + _config[MultiDeviceConfigParams::KEY_MULTI_DEVICE_PRIORITIES] = priorities->second; + } + } +} + +void MultiDeviceExecutableNetwork::GetConfig(const std::string &name, InferenceEngine::Parameter &result, + InferenceEngine::ResponseDesc * /* resp */) const { + auto res = _config.find(name); + if (res != _config.end()) { + result = res->second; + } else { + THROW_IE_EXCEPTION << NOT_FOUND_str << name <<" not found in the ExecutableNetwork config"; + } +} + +void MultiDeviceExecutableNetwork::GetMetric(const std::string &name, Parameter &result, ResponseDesc *resp) const { + if (name == METRIC_KEY(OPTIMAL_NUMBER_OF_INFER_REQUESTS)) { + unsigned int res = 0u; + for (auto n : _networksPerDevice) { + try { + res += n.second.GetMetric(METRIC_KEY(OPTIMAL_NUMBER_OF_INFER_REQUESTS)).as(); + } catch (const details::InferenceEngineException &iie) { + THROW_IE_EXCEPTION + << "Every device used with the Multi-Device should " + << "support OPTIMAL_NUMBER_OF_INFER_REQUESTS ExecutableNetwork metric. " + << "Failed to query the metric for the " << n.first << " with error:" << iie.what(); + } + } + result = IE_SET_METRIC(OPTIMAL_NUMBER_OF_INFER_REQUESTS, res); + } else if (name == METRIC_KEY(NETWORK_NAME)) { + auto it = _networksPerDevice.begin(); + IE_ASSERT(it != _networksPerDevice.end()); + result = IE_SET_METRIC(NETWORK_NAME, it->second.GetMetric( + METRIC_KEY(NETWORK_NAME)).as()); + } else if (name == METRIC_KEY(SUPPORTED_METRICS)) { + result = IE_SET_METRIC(SUPPORTED_METRICS, { + METRIC_KEY(OPTIMAL_NUMBER_OF_INFER_REQUESTS), + METRIC_KEY(SUPPORTED_METRICS), + METRIC_KEY(NETWORK_NAME), + METRIC_KEY(SUPPORTED_CONFIG_KEYS) + }); + } else if (name == METRIC_KEY(SUPPORTED_CONFIG_KEYS)) { + std::vector configKeys = { MultiDeviceConfigParams::KEY_MULTI_DEVICE_PRIORITIES }; + result = IE_SET_METRIC(SUPPORTED_CONFIG_KEYS, configKeys); + } else { + THROW_IE_EXCEPTION << "Unsupported Network metric: " << name; + } +} + +// ------------------------------MultiDeviceInferencePlugin---------------------------- + +namespace { + +std::map mergeConfigs(std::map config, + const std::map & local) { + for (auto && kvp : local) { + config[kvp.first] = kvp.second; + } + return config; +} + +} // namespace + +std::map MultiDeviceInferencePlugin::GetSupportedConfig( + const std::map & config, const std::string & deviceName) const { + std::vector supportedConfigKeys = GetCore()->GetMetric(deviceName, METRIC_KEY(SUPPORTED_CONFIG_KEYS)); + std::map supportedConfig; + for (auto&& key : supportedConfigKeys) { + auto itKey = config.find(key); + if (config.end() != itKey) { + supportedConfig[key] = itKey->second; + } + } + return supportedConfig; +} + +DeviceMap MultiDeviceInferencePlugin::ParseMetaDevices(const std::string& priorities, + const std::map & config) const { + DeviceMap metaDevices; + + // parsing the string and splitting to tokens + std::vector devicesWithRequests; + // parsing the string and splitting the comma-separated tokens + std::string::size_type i = 0; + std::string::size_type idelimeter; + while ((idelimeter = priorities.find(',', i)) != std::string::npos) { + devicesWithRequests.push_back(priorities.substr(i, idelimeter - i)); + i = idelimeter + 1; + } + // last token in the string (which has no comma after that) + devicesWithRequests.push_back(priorities.substr(i, priorities.length() - i)); + + auto getDeviceConfig = [&] (const DeviceName & deviceWithID) { + DeviceIDParser deviceParser(deviceWithID); + std::string deviceName = deviceParser.getDeviceName(); + std::map tconfig = mergeConfigs(_config, config); + + // set device ID if any + std::string deviceIDLocal = deviceParser.getDeviceID(); + if (!deviceIDLocal.empty()) { + tconfig[PluginConfigParams::KEY_DEVICE_ID] = deviceIDLocal; + } + + return GetSupportedConfig(tconfig, deviceName); + }; + + for (auto && d : devicesWithRequests) { + auto openingBracket = d.find_first_of('('); + auto closingBracket = d.find_first_of(')', openingBracket); + auto device_name = d.substr(0, openingBracket); + + int numRequests = -1; + if (closingBracket != std::string::npos && openingBracket < closingBracket) { + numRequests = std::stol(d.substr(openingBracket + 1, closingBracket - 1)); + + if (numRequests <= 0) { + THROW_IE_EXCEPTION << "Priority value for '" << device_name << "' must be > 0, while " << numRequests + << "is passed"; + } + } + + // create meta device + metaDevices[device_name] = { getDeviceConfig(device_name), numRequests }; + } + + return metaDevices; +} + +Parameter MultiDeviceInferencePlugin::GetConfig(const std::string& name, + const std::map & options) const { + if (name == MULTI_CONFIG_KEY(DEVICE_PRIORITIES)) { + auto it = _config.find(MULTI_CONFIG_KEY(DEVICE_PRIORITIES)); + if (it == _config.end()) { + THROW_IE_EXCEPTION << "Value for KEY_MULTI_DEVICE_PRIORITIES is not set"; + } else { + return { it->second }; + } + } else { + THROW_IE_EXCEPTION << "Unsupported config key: " << name; + } +} + +void MultiDeviceInferencePlugin::SetConfig(const std::map & config) { + for (auto && kvp : config) { + _config[kvp.first] = kvp.second; + } +} + +IE_SUPPRESS_DEPRECATED_START + +INFERENCE_PLUGIN_API(InferenceEngine::StatusCode) CreatePluginEngine( + InferenceEngine::IInferencePlugin *&plugin, + InferenceEngine::ResponseDesc *resp) noexcept { + try { + plugin = make_ie_compatible_plugin( + {{2, 1}, + CI_BUILD_NUMBER, + "MultiDevicePlugin"}, std::make_shared()); + return OK; + } + catch (std::exception &ex) { + return DescriptionBuffer(GENERAL_ERROR, resp) << ex.what(); + } +} + +IE_SUPPRESS_DEPRECATED_END + +MultiDeviceInferencePlugin::MultiDeviceInferencePlugin() { + _pluginName = "MULTI"; +} + +InferenceEngine::Parameter MultiDeviceInferencePlugin::GetMetric(const std::string& name, + const std::map & options) const { + if (name == METRIC_KEY(SUPPORTED_METRICS)) { + std::vector metrics; + metrics.push_back(METRIC_KEY(SUPPORTED_METRICS)); + metrics.push_back(METRIC_KEY(FULL_DEVICE_NAME)); + metrics.push_back(METRIC_KEY(SUPPORTED_CONFIG_KEYS)); + IE_SET_METRIC_RETURN(SUPPORTED_METRICS, metrics); + } else if (name == METRIC_KEY(FULL_DEVICE_NAME)) { + std::string name = { "MULTI" }; + IE_SET_METRIC_RETURN(FULL_DEVICE_NAME, name); + } else if (name == METRIC_KEY(SUPPORTED_CONFIG_KEYS)) { + std::vector configKeys = { MultiDeviceConfigParams::KEY_MULTI_DEVICE_PRIORITIES }; + IE_SET_METRIC_RETURN(SUPPORTED_CONFIG_KEYS, configKeys); + } else { + THROW_IE_EXCEPTION << "Unsupported metric key " << name; + } +} + +ExecutableNetworkInternal::Ptr MultiDeviceInferencePlugin::LoadExeNetworkImpl(const ICNNNetwork &network, + const std::map& config) { + if (GetCore() == nullptr) { + THROW_IE_EXCEPTION << "Please, work with MULTI device via InferencEngine::Core object"; + } + + // TODO: do we really need a clone? + ICNNNetwork::Ptr clonedNetwork = cloneNet(network); + + auto fullConfig = mergeConfigs(_config, config); + auto priorities = fullConfig.find(MultiDeviceConfigParams::KEY_MULTI_DEVICE_PRIORITIES); + if (priorities == fullConfig.end()) { + THROW_IE_EXCEPTION << "KEY_MULTI_DEVICE_PRIORITIES key is not set for MULTI device"; + } + + DeviceMap metaDevices = ParseMetaDevices(priorities->second, fullConfig); + + // collect the settings that are applicable to the devices we are loading the network to + std::unordered_map multiNetworkConfig; + multiNetworkConfig.insert(*priorities); + + DeviceMap executableNetworkPerDevice; + for (auto& p : metaDevices) { + auto & deviceName = p.first; + auto & metaDevice = p.second; + auto & deviceConfig = metaDevice.config; + executableNetworkPerDevice.insert({ deviceName, GetCore()->LoadNetwork(CNNNetwork{clonedNetwork}, deviceName, deviceConfig) }); + multiNetworkConfig.insert(deviceConfig.begin(), deviceConfig.end()); + } + if (executableNetworkPerDevice.empty()) + THROW_IE_EXCEPTION << NOT_FOUND_str << "Failed to load Executable network to any device " + << "that the MULTI device is initialized to work with"; + + auto perfConfig = fullConfig.find(PluginConfigParams::KEY_PERF_COUNT); + bool enablePerfCounters = (fullConfig.end() != perfConfig) && (perfConfig->second == PluginConfigParams::YES); + + return std::make_shared(executableNetworkPerDevice, + metaDevices, + multiNetworkConfig, + enablePerfCounters); +} + +void MultiDeviceInferencePlugin::QueryNetwork(const ICNNNetwork& network, + const std::map& config, + QueryNetworkResult& queryResult) const { + if (GetCore() == nullptr) { + THROW_IE_EXCEPTION << "Please, work with MULTI device via InferencEngine::Core object"; + } + + queryResult.rc = StatusCode::OK; + queryResult.supportedLayersMap.clear(); + + auto fullConfig = mergeConfigs(_config, config); + auto priorities = fullConfig.find(MultiDeviceConfigParams::KEY_MULTI_DEVICE_PRIORITIES); + if (priorities == fullConfig.end()) { + THROW_IE_EXCEPTION << "KEY_MULTI_DEVICE_PRIORITIES key is not set for MULTI device"; + } + + DeviceMap metaDevices = ParseMetaDevices(priorities->second, fullConfig); + std::map queryResults; + + for (auto&& value : metaDevices) { + auto& deviceName = value.first; + auto& metaDevice = value.second; + queryResults[deviceName] = GetCore()->QueryNetwork(network, deviceName, metaDevice.config); + } + + details::CNNNetworkIterator i(&network); + while (i != details::CNNNetworkIterator()) { + CNNLayer::Ptr layer = *i; + bool layerIsInQueryResultsForAllDevices = std::all_of(std::begin(queryResults), std::end(queryResults), + [&](const std::map::value_type& qr) { + return qr.second.supportedLayersMap.end() != qr.second.supportedLayersMap.find(layer->name);}); + if (layerIsInQueryResultsForAllDevices) { + queryResult.supportedLayersMap[layer->name] = GetName(); + } + i++; + } +} +} // namespace MultiDevicePlugin diff --git a/inference-engine/src/multi_device/multi_device.hpp b/inference-engine/src/multi_device/multi_device.hpp new file mode 100644 index 00000000000..29a40218a9f --- /dev/null +++ b/inference-engine/src/multi_device/multi_device.hpp @@ -0,0 +1,176 @@ +// Copyright (C) 2018-2020 Intel Corporation +// SPDX-License-Identifier: Apache-2.0 +// + +/////////////////////////////////////////////////////////////////////////////////////////////////// +#pragma once + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include "ie_iinfer_request.hpp" +#include "details/ie_exception_conversion.hpp" +#include + +#if (IE_THREAD == IE_THREAD_TBB || IE_THREAD == IE_THREAD_TBB_AUTO) +#include +#endif + +namespace MultiDevicePlugin { + +using DeviceName = std::string; + +struct DeviceInformation { + std::map config; + int numRequestsPerDevices; +}; + +template +using DeviceMap = std::unordered_map; + +class MultiDeviceInferRequest : public InferenceEngine::InferRequestInternal { +public: + using Ptr = std::shared_ptr; + explicit MultiDeviceInferRequest(const InferenceEngine::InputsDataMap& networkInputs, + const InferenceEngine::OutputsDataMap& networkOutputs); + void GetPerformanceCounts(std::map&) const override { + THROW_IE_EXCEPTION << NOT_IMPLEMENTED_str; + } + void InferImpl() override { + THROW_IE_EXCEPTION << NOT_IMPLEMENTED_str; + } + // Multi-Device impl specific: sets the data (blobs from the device-less requets to the specific device request) + void SetBlobsToAnotherRequest(InferenceEngine::InferRequest& req); +}; + +#if ((IE_THREAD == IE_THREAD_TBB) || (IE_THREAD == IE_THREAD_TBB_AUTO)) +template +using ThreadSafeQueue = tbb::concurrent_queue; +#else +template +class ThreadSafeQueue { +public: + void push(T value) { + std::lock_guard lock(_mutex); + _queue.push(std::move(value)); + } + + bool try_pop(T& value) { + std::lock_guard lock(_mutex); + if (!_queue.empty()) { + value = std::move(_queue.front()); + _queue.pop(); + return true; + } else { + return false; + } + } + + bool empty() { + std::lock_guard lock(_mutex); + return _queue.empty(); + } + +protected: + std::queue _queue; + std::mutex _mutex; +}; +#endif + +class MultiDeviceExecutableNetwork : public InferenceEngine::ExecutableNetworkThreadSafeDefault, + public ITaskExecutor { +public: + using Ptr = std::shared_ptr; + struct WorkerInferRequest { + InferenceEngine::InferRequest _inferRequest; + Task _task; + InferenceEngine::StatusCode _status = InferenceEngine::StatusCode::OK; + }; + using NotBusyWorkerRequests = ThreadSafeQueue; + + explicit MultiDeviceExecutableNetwork(const DeviceMap& networksPerDevice, + const DeviceMap& networkDevices, + const std::unordered_map& config, + const bool needPerfCounters = false); + + void SetConfig(const std::map &config, InferenceEngine::ResponseDesc *resp) override; + void GetConfig(const std::string &name, InferenceEngine::Parameter &result, InferenceEngine::ResponseDesc *resp) const override; + void GetMetric(const std::string &name, InferenceEngine::Parameter &result, InferenceEngine::ResponseDesc *resp) const override; + void run(Task inferTask) override; + void CreateInferRequest(InferenceEngine::IInferRequest::Ptr& asyncRequest) override; + InferenceEngine::InferRequestInternal::Ptr CreateInferRequestImpl(InferenceEngine::InputsDataMap networkInputs, + InferenceEngine::OutputsDataMap networkOutputs) override; + ~MultiDeviceExecutableNetwork() override; + + void ScheduleToWorkerInferRequest(); + + static thread_local WorkerInferRequest* _thisWorkerInferRequest; + std::atomic_bool _terminate = {false}; + std::mutex _mutex; + DeviceMap _devicePriorities; + DeviceMap _networksPerDevice; + ThreadSafeQueue _inferPipelineTasks; + DeviceMap _idleWorkerRequests; + DeviceMap> _workerRequests; + std::unordered_map _config; + bool _needPerfCounters = false; +}; + +class MultiDeviceAsyncInferRequest : public InferenceEngine::AsyncInferRequestThreadSafeDefault { +public: + using Ptr = std::shared_ptr; + + explicit MultiDeviceAsyncInferRequest(const MultiDeviceInferRequest::Ptr& inferRequest, + const bool needPerfCounters, + const MultiDeviceExecutableNetwork::Ptr& multiDeviceExecutableNetwork, + const InferenceEngine::ITaskExecutor::Ptr& callbackExecutor); + void Infer_ThreadUnsafe() override; + void GetPerformanceCounts_ThreadUnsafe(std::map &_perfMap) const override; + ~MultiDeviceAsyncInferRequest() override; + +protected: + MultiDeviceExecutableNetwork::Ptr _multiDeviceExecutableNetwork; + MultiDeviceInferRequest::Ptr _inferRequest; + std::map _perfMap; + bool _needPerfCounters = false; + MultiDeviceExecutableNetwork::WorkerInferRequest* _workerInferRequest = nullptr; +}; + +class MultiDeviceInferencePlugin : public InferenceEngine::InferencePluginInternal { +public: + MultiDeviceInferencePlugin(); + ~MultiDeviceInferencePlugin() override = default; + + InferenceEngine::ExecutableNetworkInternal::Ptr LoadExeNetworkImpl(const InferenceEngine::ICNNNetwork& network, + const std::map& config) override; + + void SetConfig(const std::map& config) override; + Parameter GetConfig(const std::string& name, + const std::map & options) const override; + void QueryNetwork(const InferenceEngine::ICNNNetwork& network, + const std::map& config, + InferenceEngine::QueryNetworkResult& res) const override; + InferenceEngine::Parameter GetMetric(const std::string& name, + const std::map& options) const override; + + DeviceMap ParseMetaDevices(const std::string & devicesRequestsCfg, + const std::map & config) const; + +protected: + std::map GetSupportedConfig(const std::map& config, + const DeviceName & deviceName) const; +}; + +} // namespace MultiDevicePlugin diff --git a/inference-engine/src/plugin_api/cpp_interfaces/impl/ie_plugin_internal.hpp b/inference-engine/src/plugin_api/cpp_interfaces/impl/ie_plugin_internal.hpp index 907ff109b69..fb0221b025f 100644 --- a/inference-engine/src/plugin_api/cpp_interfaces/impl/ie_plugin_internal.hpp +++ b/inference-engine/src/plugin_api/cpp_interfaces/impl/ie_plugin_internal.hpp @@ -102,7 +102,7 @@ public: _core = core; } - const ICore* GetCore() const noexcept override { + ICore* GetCore() const noexcept override { return _core; } @@ -137,7 +137,6 @@ public: THROW_IE_EXCEPTION << NOT_IMPLEMENTED_str; } - RemoteContext::Ptr GetDefaultContext() override { THROW_IE_EXCEPTION << NOT_IMPLEMENTED_str; } @@ -154,7 +153,7 @@ protected: * @param config string-string map of config parameters relevant only for this load operation * @return Shared pointer to the ExecutableNetwork object */ - virtual ExecutableNetworkInternal::Ptr LoadExeNetworkImpl(const ICore* core, const ICNNNetwork& network, + virtual ExecutableNetworkInternal::Ptr LoadExeNetworkImpl(const ICNNNetwork& network, const std::map& config) = 0; /** @@ -163,16 +162,13 @@ protected: * @note The function is used in * InferencePluginInternal::LoadNetwork(const ICNNNetwork&, const std::map&, RemoteContext::Ptr) * which performs common steps first and calls this plugin-dependent method implementation after. - * @param core A pointer to ICore interface. * @param network A network object * @param context A remote context * @param config string-string map of config parameters relevant only for this load operation * @return Shared pointer to the ExecutableNetwork object */ - virtual ExecutableNetworkInternal::Ptr LoadExeNetworkImpl(const ICore* core, const ICNNNetwork& network, - RemoteContext::Ptr context, + virtual ExecutableNetworkInternal::Ptr LoadExeNetworkImpl(const ICNNNetwork& network, RemoteContext::Ptr context, const std::map& config) { - (void)core; (void)network; (void)context; (void)config; @@ -190,21 +186,21 @@ protected: void cloneAndCreateExecutableNetwork(IExecutableNetwork::Ptr& executableNetwork, const ICNNNetwork& network, const std::map& config, RemoteContext::Ptr context = nullptr) { - InputsDataMap networkInputs; - OutputsDataMap networkOutputs; + InputsDataMap networkInputs, networkInputsCloned; + OutputsDataMap networkOutputs, networkOutputsCloned; network.getInputsInfo(networkInputs); network.getOutputsInfo(networkOutputs); - copyInputOutputInfo(networkInputs, networkOutputs, _networkInputs, _networkOutputs); + copyInputOutputInfo(networkInputs, networkOutputs, networkInputsCloned, networkOutputsCloned); ExecutableNetworkInternal::Ptr impl; if (nullptr == context) { - impl = LoadExeNetworkImpl(GetCore(), network, config); + impl = LoadExeNetworkImpl(network, config); } else { - impl = LoadExeNetworkImpl(GetCore(), network, context, config); + impl = LoadExeNetworkImpl(network, context, config); } - impl->setNetworkInputs(_networkInputs); - impl->setNetworkOutputs(_networkOutputs); + impl->setNetworkInputs(networkInputsCloned); + impl->setNetworkOutputs(networkOutputsCloned); impl->SetPointerToPluginInternal(shared_from_this()); executableNetwork.reset(new ExecutableNetworkBase(impl), [](details::IRelease* p) { @@ -243,8 +239,6 @@ protected: } std::string _pluginName; //!< A device name that plugins enables - InferenceEngine::InputsDataMap _networkInputs; //!< Holds information about network inputs info - InferenceEngine::OutputsDataMap _networkOutputs; //!< Holds information about network outputs data std::map _config; //!< A map config keys -> values ICore* _core = nullptr; //!< A pointer to ICore interface }; diff --git a/inference-engine/src/plugin_api/cpp_interfaces/interface/ie_iplugin_internal.hpp b/inference-engine/src/plugin_api/cpp_interfaces/interface/ie_iplugin_internal.hpp index bf80615f0c9..b82758be4a4 100644 --- a/inference-engine/src/plugin_api/cpp_interfaces/interface/ie_iplugin_internal.hpp +++ b/inference-engine/src/plugin_api/cpp_interfaces/interface/ie_iplugin_internal.hpp @@ -217,7 +217,7 @@ public: * @brief Gets reference to ICore interface * @return Reference to ICore interface */ - virtual const ICore* GetCore() const noexcept = 0; + virtual ICore* GetCore() const noexcept = 0; /** * @brief Queries a plugin about support layers in network diff --git a/inference-engine/src/plugin_api/ie_icore.hpp b/inference-engine/src/plugin_api/ie_icore.hpp index 40dcf887f49..d773a3e42d5 100644 --- a/inference-engine/src/plugin_api/ie_icore.hpp +++ b/inference-engine/src/plugin_api/ie_icore.hpp @@ -32,6 +32,7 @@ public: virtual std::shared_ptr GetTaskExecutor() const = 0; /** + * @deprecated Use ICore::GetMetric, ICore::LoadNetwork, ICore::QueryNetwork instead * @brief Returns reference to plugin by a device name * @param deviceName - a name of device * @return Reference to plugin @@ -55,6 +56,55 @@ public: */ virtual CNNNetwork ReadNetwork(const std::string& modelPath, const std::string& binPath) const = 0; + /** + * @brief Creates an executable network from a network object. + * + * Users can create as many networks as they need and use + * them simultaneously (up to the limitation of the hardware resources) + * + * @param network CNNNetwork object acquired from Core::ReadNetwork + * @param deviceName Name of device to load network to + * @param config Optional map of pairs: (config parameter name, config parameter value) relevant only for this load + * operation + * @return An executable network reference + */ + virtual ExecutableNetwork LoadNetwork(const CNNNetwork& network, const std::string& deviceName, + const std::map& config = {}) = 0; + + /** + * @brief Creates an executable network from a previously exported network + * @param deviceName Name of device load executable network on + * @param networkModel network model stream + * @param config Optional map of pairs: (config parameter name, config parameter value) relevant only for this load + * operation* + * @return An executable network reference + */ + virtual ExecutableNetwork ImportNetwork(std::istream& networkModel, const std::string& deviceName = {}, + const std::map& config = {}) = 0; + + /** + * @brief Query device if it supports specified network with specified configuration + * + * @param deviceName A name of a device to query + * @param network Network object to query + * @param config Optional map of pairs: (config parameter name, config parameter value) + * @return An object containing a map of pairs a layer name -> a device name supporting this layer. + */ + virtual QueryNetworkResult QueryNetwork(const ICNNNetwork& network, const std::string& deviceName, + const std::map& config) const = 0; + + /** + * @brief Gets general runtime metric for dedicated hardware. + * + * The method is needed to request common device properties + * which are executable network agnostic. It can be device name, temperature, other devices-specific values. + * + * @param deviceName - A name of a device to get a metric value. + * @param name - metric name to request. + * @return Metric value corresponding to metric key. + */ + virtual Parameter GetMetric(const std::string& deviceName, const std::string& name) const = 0; + /** * @brief Default virtual destructor */ diff --git a/inference-engine/src/plugin_api/ie_profiling.hpp b/inference-engine/src/plugin_api/ie_profiling.hpp index 74ee2f2b811..aee0bbe732f 100644 --- a/inference-engine/src/plugin_api/ie_profiling.hpp +++ b/inference-engine/src/plugin_api/ie_profiling.hpp @@ -138,7 +138,7 @@ inline static void annotateEnd(IttTaskHandles& h, IttBlock&) { #define IE_STR(x) IE_STR_(x) #define IE_STR_(x) #x -class ProfilingTask; +struct ProfilingTask; struct IttStatic {}; @@ -179,8 +179,8 @@ struct ProfilingTask { } private: -friend void annotateBegin(IttStatic&, IttProfilingTask& t); -friend void annotateEnd(IttStatic&, IttProfilingTask& t); + friend void annotateBegin(IttStatic&, IttProfilingTask& t); + friend void annotateEnd(IttStatic&, IttProfilingTask& t); std::string name; #ifdef ENABLE_PROFILING_ITT diff --git a/inference-engine/src/plugin_api/threading/ie_cpu_streams_executor.hpp b/inference-engine/src/plugin_api/threading/ie_cpu_streams_executor.hpp index 6f1525bbb5a..f5e53cc6917 100644 --- a/inference-engine/src/plugin_api/threading/ie_cpu_streams_executor.hpp +++ b/inference-engine/src/plugin_api/threading/ie_cpu_streams_executor.hpp @@ -44,6 +44,8 @@ public: void run(Task task) override; + void Execute(Task task) override; + int GetStreamId() override; int GetNumaNodeId() override; diff --git a/inference-engine/src/plugin_api/threading/ie_istreams_executor.hpp b/inference-engine/src/plugin_api/threading/ie_istreams_executor.hpp index d53c6e48ccc..449ab526d11 100644 --- a/inference-engine/src/plugin_api/threading/ie_istreams_executor.hpp +++ b/inference-engine/src/plugin_api/threading/ie_istreams_executor.hpp @@ -121,6 +121,12 @@ public: * @return `ID` of current NUMA Node, or throws exceptions if called not from stream thread */ virtual int GetNumaNodeId() = 0; + + /** + * @brief Execute the task in the current thread using streams executor configuration and constraints + * @param task A task to start + */ + virtual void Execute(Task task) = 0; }; diff --git a/inference-engine/src/preprocessing/CMakeLists.txt b/inference-engine/src/preprocessing/CMakeLists.txt index 5943b295a4b..4c78228e3c5 100644 --- a/inference-engine/src/preprocessing/CMakeLists.txt +++ b/inference-engine/src/preprocessing/CMakeLists.txt @@ -17,15 +17,15 @@ file(GLOB LIBRARY_HEADERS ${CMAKE_CURRENT_SOURCE_DIR}/*.hpp) # function(ie_avx512_core_optimization_flags flags) if(WIN32) - if(CMAKE_CXX_COMPILER_ID STREQUAL Intel) + if(CMAKE_CXX_COMPILER_ID STREQUAL "Intel") set(${flags} "/QxCORE-AVX512" PARENT_SCOPE) - elseif(CMAKE_CXX_COMPILER_ID MATCHES MSVC) + elseif(CMAKE_CXX_COMPILER_ID STREQUAL "MSVC") set(${flags} "/arch:AVX512" PARENT_SCOPE) else() message(WARNING "Unsupported CXX compiler ${CMAKE_CXX_COMPILER_ID}") endif() else() - if(CMAKE_CXX_COMPILER_ID STREQUAL Intel) + if(CMAKE_CXX_COMPILER_ID STREQUAL "Intel") set(${flags} "-xCORE-AVX512" PARENT_SCOPE) else() set(${flags} "-mavx512f -mavx512bw -mavx512dq -mfma" PARENT_SCOPE) diff --git a/inference-engine/src/transformations/include/transformations/common_optimizations/common_optimizations_tbl.hpp b/inference-engine/src/transformations/include/transformations/common_optimizations/common_optimizations_tbl.hpp index 53103c4f6a2..c0a53fcf5f7 100644 --- a/inference-engine/src/transformations/include/transformations/common_optimizations/common_optimizations_tbl.hpp +++ b/inference-engine/src/transformations/include/transformations/common_optimizations/common_optimizations_tbl.hpp @@ -14,4 +14,14 @@ // #include // #undef NGRAPH_PASS -NGRAPH_PASS(NopElimination, ::ngraph::pass) +// This pass must be called first in pipeline +NGRAPH_PASS(InitNodeInfo, ::ngraph::pass) +NGRAPH_PASS(ConvertPriorBox, ::ngraph::pass) // WA: ConvertPriorBox must be executed before CF +NGRAPH_PASS(ConstantFolding, ::ngraph::pass) +NGRAPH_PASS(RemoveFilteringBoxesBySize, ::ngraph::pass) // Resolves dynamism (replaces NonZero), CF needed +NGRAPH_PASS(ConstantFolding, ::ngraph::pass) +NGRAPH_PASS(StridedSliceOptimization, ::ngraph::pass) // depends on CF +NGRAPH_PASS(NopElimination, ::ngraph::pass) // may introduce fake dynamism +NGRAPH_PASS(AlgebraicSimplification, ::ngraph::pass) // may introduce fake dynamism +NGRAPH_PASS(ConstantFolding, ::ngraph::pass) +NGRAPH_PASS(ConvertScatterElementsToScatter, ::ngraph::pass) // partially depends on CF diff --git a/inference-engine/src/transformations/include/transformations/convert_opset1_to_legacy/convert_opset1_to_legacy_tbl.hpp b/inference-engine/src/transformations/include/transformations/convert_opset1_to_legacy/convert_opset1_to_legacy_tbl.hpp index 8fc8839afbc..49f115d90f0 100644 --- a/inference-engine/src/transformations/include/transformations/convert_opset1_to_legacy/convert_opset1_to_legacy_tbl.hpp +++ b/inference-engine/src/transformations/include/transformations/convert_opset1_to_legacy/convert_opset1_to_legacy_tbl.hpp @@ -14,8 +14,6 @@ // #include // #undef NGRAPH_PASS -NGRAPH_PASS(InitNodeInfo, ::ngraph::pass) -NGRAPH_PASS(ConvertPriorBox, ::ngraph::pass) NGRAPH_PASS(ConstantFolding, ::ngraph::pass) NGRAPH_PASS(ConvertReduceToPooling, ::ngraph::pass) NGRAPH_PASS(ConvertMod, ::ngraph::pass) diff --git a/inference-engine/src/transformations/include/transformations/convert_opset3_to_opset2/convert_broadcast3.hpp b/inference-engine/src/transformations/include/transformations/convert_opset3_to_opset2/convert_broadcast3.hpp new file mode 100644 index 00000000000..45ca68c78ac --- /dev/null +++ b/inference-engine/src/transformations/include/transformations/convert_opset3_to_opset2/convert_broadcast3.hpp @@ -0,0 +1,31 @@ +// Copyright (C) 2018-2020 Intel Corporation +// SPDX-License-Identifier: Apache-2.0 +// + +#pragma once + +#include +#include + +#include + +#include +#include "transformations/utils/pass_param.hpp" + +namespace ngraph { +namespace pass { + + class INFERENCE_ENGINE_API_CLASS(ConvertBroadcast3); + +} // namespace pass +} // namespace ngraph + +class ngraph::pass::ConvertBroadcast3: public ngraph::pass::GraphRewrite, public ngraph::pass::PassParam { +public: + ConvertBroadcast3() : GraphRewrite() { + convert_broadcast3(); + } + +private: + void convert_broadcast3(); +}; diff --git a/inference-engine/src/transformations/include/transformations/convert_opset3_to_opset2/convert_nms3.hpp b/inference-engine/src/transformations/include/transformations/convert_opset3_to_opset2/convert_nms3.hpp new file mode 100644 index 00000000000..22df5fcaf28 --- /dev/null +++ b/inference-engine/src/transformations/include/transformations/convert_opset3_to_opset2/convert_nms3.hpp @@ -0,0 +1,31 @@ +// Copyright (C) 2018-2020 Intel Corporation +// SPDX-License-Identifier: Apache-2.0 +// + +#pragma once + +#include +#include + +#include + +#include +#include "transformations/utils/pass_param.hpp" + +namespace ngraph { +namespace pass { + + class INFERENCE_ENGINE_API_CLASS(ConvertNMS3); + +} // namespace pass +} // namespace ngraph + +class ngraph::pass::ConvertNMS3: public ngraph::pass::GraphRewrite, public ngraph::pass::PassParam { +public: + ConvertNMS3() : GraphRewrite() { + convert_nms3(); + } + +private: + void convert_nms3(); +}; diff --git a/inference-engine/src/transformations/include/transformations/convert_opset3_to_opset2/convert_opset3_to_opset2.hpp b/inference-engine/src/transformations/include/transformations/convert_opset3_to_opset2/convert_opset3_to_opset2.hpp new file mode 100644 index 00000000000..b7c6b983167 --- /dev/null +++ b/inference-engine/src/transformations/include/transformations/convert_opset3_to_opset2/convert_opset3_to_opset2.hpp @@ -0,0 +1,26 @@ +// Copyright (C) 2020 Intel Corporation +// SPDX-License-Identifier: Apache-2.0 +// + +#pragma once + +#include +#include +#include +#include "transformations/utils/pass_param.hpp" + +namespace ngraph { +namespace pass { + + class INFERENCE_ENGINE_API_CLASS(ConvertOpSet3ToOpSet2); + +} // namespace pass +} // namespace ngraph + +class ngraph::pass::ConvertOpSet3ToOpSet2: public ngraph::pass::FunctionPass, public ngraph::pass::PassParam { +public: + explicit ConvertOpSet3ToOpSet2(const PassParam::param_callback & callback = PassParam::getDefaultCallback()) + : FunctionPass(), PassParam(callback) {} + + bool run_on_function(std::shared_ptr f) override; +}; diff --git a/inference-engine/src/transformations/include/transformations/convert_opset3_to_opset2/convert_opset3_to_opset2_tbl.hpp b/inference-engine/src/transformations/include/transformations/convert_opset3_to_opset2/convert_opset3_to_opset2_tbl.hpp new file mode 100644 index 00000000000..796642e3488 --- /dev/null +++ b/inference-engine/src/transformations/include/transformations/convert_opset3_to_opset2/convert_opset3_to_opset2_tbl.hpp @@ -0,0 +1,21 @@ +// Copyright (C) 2020 Intel Corporation +// SPDX-License-Identifier: Apache-2.0 +// + +#ifndef NGRAPH_PASS +#warning "NGRAPH_PASS is not defined" +#define NGRAPH_PASS(A, B) +#endif + +// To register new pass you need to define NGRAPH_PASS +// Usage example: +// ngraph::pass:Manager pm; +// #define NGRAPH_PASS(NAME, NAMESPACE) pm.register_pass(); +// #include +// #undef NGRAPH_PASS + +NGRAPH_PASS(ConvertBroadcast3, ::ngraph::pass) +NGRAPH_PASS(ConvertNMS3, ::ngraph::pass) +NGRAPH_PASS(ConvertShapeOf3, ::ngraph::pass) +NGRAPH_PASS(ConvertTopK3, ::ngraph::pass) + diff --git a/inference-engine/src/transformations/include/transformations/convert_opset3_to_opset2/convert_shapeof3.hpp b/inference-engine/src/transformations/include/transformations/convert_opset3_to_opset2/convert_shapeof3.hpp new file mode 100644 index 00000000000..781c7103d46 --- /dev/null +++ b/inference-engine/src/transformations/include/transformations/convert_opset3_to_opset2/convert_shapeof3.hpp @@ -0,0 +1,30 @@ +// Copyright (C) 2018-2020 Intel Corporation +// SPDX-License-Identifier: Apache-2.0 +// + +#pragma once + +#include +#include + +#include + +#include + +namespace ngraph { +namespace pass { + + class INFERENCE_ENGINE_API_CLASS(ConvertShapeOf3); + +} // namespace pass +} // namespace ngraph + +class ngraph::pass::ConvertShapeOf3: public ngraph::pass::GraphRewrite { +public: + ConvertShapeOf3() : GraphRewrite() { + convert_shapeof3(); + } + +private: + void convert_shapeof3(); +}; diff --git a/inference-engine/src/transformations/include/transformations/convert_opset3_to_opset2/convert_topk3.hpp b/inference-engine/src/transformations/include/transformations/convert_opset3_to_opset2/convert_topk3.hpp new file mode 100644 index 00000000000..0fff6edd097 --- /dev/null +++ b/inference-engine/src/transformations/include/transformations/convert_opset3_to_opset2/convert_topk3.hpp @@ -0,0 +1,31 @@ +// Copyright (C) 2018-2020 Intel Corporation +// SPDX-License-Identifier: Apache-2.0 +// + +#pragma once + +#include +#include + +#include + +#include +#include "transformations/utils/pass_param.hpp" + +namespace ngraph { +namespace pass { + + class INFERENCE_ENGINE_API_CLASS(ConvertTopK3); + +} // namespace pass +} // namespace ngraph + +class ngraph::pass::ConvertTopK3: public ngraph::pass::GraphRewrite, public ngraph::pass::PassParam { +public: + ConvertTopK3() : GraphRewrite() { + convert_topk3(); + } + +private: + void convert_topk3(); +}; diff --git a/inference-engine/src/transformations/include/transformations/convert_scatter_elements_to_scatter.hpp b/inference-engine/src/transformations/include/transformations/convert_scatter_elements_to_scatter.hpp new file mode 100644 index 00000000000..f89d3c490b6 --- /dev/null +++ b/inference-engine/src/transformations/include/transformations/convert_scatter_elements_to_scatter.hpp @@ -0,0 +1,30 @@ +// Copyright (C) 2018-2020 Intel Corporation +// SPDX-License-Identifier: Apache-2.0 +// + +#pragma once + +#include +#include + +#include + +#include + +namespace ngraph { +namespace pass { + +class INFERENCE_ENGINE_API_CLASS(ConvertScatterElementsToScatter); + +} // namespace pass +} // namespace ngraph + +class ngraph::pass::ConvertScatterElementsToScatter: public ngraph::pass::GraphRewrite { +public: + ConvertScatterElementsToScatter() : GraphRewrite() { + convert_scatter_elements_to_scatter(); + } + +private: + void convert_scatter_elements_to_scatter(); +}; diff --git a/inference-engine/src/transformations/include/transformations/optimize_strided_slice.hpp b/inference-engine/src/transformations/include/transformations/optimize_strided_slice.hpp new file mode 100644 index 00000000000..13741adeaec --- /dev/null +++ b/inference-engine/src/transformations/include/transformations/optimize_strided_slice.hpp @@ -0,0 +1,69 @@ +// Copyright (C) 2018-2020 Intel Corporation +// SPDX-License-Identifier: Apache-2.0 +// + +#pragma once + +#include +#include + +#include + +#include +#include +#include + +namespace ngraph { +namespace pass { + + class INFERENCE_ENGINE_API_CLASS(StridedSliceOptimization); + class INFERENCE_ENGINE_API_CLASS(UselessStridedSliceEraser); + class INFERENCE_ENGINE_API_CLASS(SharedStridedSliceEraser); + class INFERENCE_ENGINE_API_CLASS(GroupedStridedSliceOptimizer); + } // namespace pass +} // namespace ngraph + + +/* + * Description: + * UselessStridedSliceEraser transformation removes StridedSlice operations + * with equal input and output shapes. + */ + +class ngraph::pass::UselessStridedSliceEraser: public ngraph::pass::FunctionPass { +public: + bool run_on_function(std::shared_ptr f) override; +}; + +/* + * Description: + * SharedStridedSliceEraser replaces group of StridedSlice operations with first + * StridedSlice in this group. All SrtideSluces in this group must be equal and + * consume the same output port. + */ + +class ngraph::pass::SharedStridedSliceEraser: public ngraph::pass::FunctionPass { +public: + bool run_on_function(std::shared_ptr f) override; +}; + +/* + * Description: + * GroupedStridedSliceOptimizer replaces group of StridedSlice operations with VariadicSplit + * All StridedSlice operations must slice data with the same axis and stride = 1. + */ + +class ngraph::pass::GroupedStridedSliceOptimizer: public ngraph::pass::FunctionPass { +public: + bool run_on_function(std::shared_ptr f) override; +}; + +class ngraph::pass::StridedSliceOptimization: public ngraph::pass::FunctionPass { +public: + bool run_on_function(std::shared_ptr f) override { + bool rewritten = UselessStridedSliceEraser().run_on_function(f); + rewritten |= SharedStridedSliceEraser().run_on_function(f); + rewritten |= GroupedStridedSliceOptimizer().run_on_function(f); + return rewritten; + } +}; diff --git a/inference-engine/src/transformations/include/transformations/remove_filtering_boxes_by_size.hpp b/inference-engine/src/transformations/include/transformations/remove_filtering_boxes_by_size.hpp new file mode 100644 index 00000000000..316c7995307 --- /dev/null +++ b/inference-engine/src/transformations/include/transformations/remove_filtering_boxes_by_size.hpp @@ -0,0 +1,30 @@ +// Copyright (C) 2018-2020 Intel Corporation +// SPDX-License-Identifier: Apache-2.0 +// + +#pragma once + +#include +#include + +#include + +#include + +namespace ngraph { +namespace pass { + + class INFERENCE_ENGINE_API_CLASS(RemoveFilteringBoxesBySize); + +} // namespace pass +} // namespace ngraph + +class ngraph::pass::RemoveFilteringBoxesBySize: public ngraph::pass::GraphRewrite { +public: + RemoveFilteringBoxesBySize() : GraphRewrite() { + remove_filtering_boxes_by_size(); + } + +private: + void remove_filtering_boxes_by_size(); +}; diff --git a/inference-engine/src/transformations/src/transformations/common_optimizations/common_optimizations.cpp b/inference-engine/src/transformations/src/transformations/common_optimizations/common_optimizations.cpp index f791470a7bb..467f0766d59 100644 --- a/inference-engine/src/transformations/src/transformations/common_optimizations/common_optimizations.cpp +++ b/inference-engine/src/transformations/src/transformations/common_optimizations/common_optimizations.cpp @@ -2,12 +2,20 @@ // SPDX-License-Identifier: Apache-2.0 // -#include "transformations/common_optimizations/common_optimizations.hpp" - #include +#include "transformations/common_optimizations/common_optimizations.hpp" +#include "transformations/convert_opset1_to_legacy/convert_prior_to_ie_prior.hpp" +#include "transformations/optimize_strided_slice.hpp" +#include "transformations/convert_scatter_elements_to_scatter.hpp" +#include "transformations/remove_filtering_boxes_by_size.hpp" +#include "transformations/init_node_info.hpp" + #include #include +#include +#include + bool ngraph::pass::CommonOptimizations::run_on_function(std::shared_ptr f) { ngraph::pass::Manager CommonOptimizations; diff --git a/inference-engine/src/transformations/src/transformations/convert_opset1_to_legacy/convert_opset1_to_legacy.cpp b/inference-engine/src/transformations/src/transformations/convert_opset1_to_legacy/convert_opset1_to_legacy.cpp index 09857f080b6..28dbb08c70e 100644 --- a/inference-engine/src/transformations/src/transformations/convert_opset1_to_legacy/convert_opset1_to_legacy.cpp +++ b/inference-engine/src/transformations/src/transformations/convert_opset1_to_legacy/convert_opset1_to_legacy.cpp @@ -27,7 +27,6 @@ #include #include #include -#include #include #include #include @@ -47,7 +46,6 @@ #include #include #include -#include #include #include diff --git a/inference-engine/src/transformations/src/transformations/convert_opset1_to_legacy/convert_prior_to_ie_prior.cpp b/inference-engine/src/transformations/src/transformations/convert_opset1_to_legacy/convert_prior_to_ie_prior.cpp index 01954ec632c..d0bbcc1307a 100644 --- a/inference-engine/src/transformations/src/transformations/convert_opset1_to_legacy/convert_prior_to_ie_prior.cpp +++ b/inference-engine/src/transformations/src/transformations/convert_opset1_to_legacy/convert_prior_to_ie_prior.cpp @@ -7,6 +7,7 @@ #include #include +#include #include #include @@ -108,12 +109,31 @@ void ngraph::pass::ConvertPriorBox::convert_prior_box() { input_2 = convert2->input_value(0).get_node_shared_ptr(); } - auto shape_of1 = std::dynamic_pointer_cast (input_1); - auto shape_of2 = std::dynamic_pointer_cast (input_2); + // the input can be either ShapeOf-1 or ShapeOf-3 + std::shared_ptr shape_of1 = std::dynamic_pointer_cast (input_1); + std::shared_ptr shape_of2 = std::dynamic_pointer_cast (input_2); + if (!shape_of1 || !shape_of2) { + shape_of1 = std::dynamic_pointer_cast(input_1); + shape_of2 = std::dynamic_pointer_cast(input_2); + } if (!shape_of1 || !shape_of2) { return false; } + // keep this code for a while if will decide to run this transformation again in the opset1->legacy + // the input can be either ShapeOf or Convert(ShapeOf) +// if (!shape_of1 || !shape_of2) { +// auto shapeof1_convert = std::dynamic_pointer_cast (input_1); +// auto shapeof2_convert = std::dynamic_pointer_cast (input_2); +// if (!shapeof1_convert || !shapeof2_convert) +// return false; +// shape_of1 = std::dynamic_pointer_cast(shapeof1_convert->input_value(0).get_node_shared_ptr()); +// shape_of2 = std::dynamic_pointer_cast(shapeof2_convert->input_value(0).get_node_shared_ptr()); +// if (!shape_of1 || !shape_of2) +// return false; +// ops_to_replace.push_back(shapeof1_convert); +// ops_to_replace.push_back(shapeof2_convert); +// } ops_to_replace.push_back(shape_of1); ops_to_replace.push_back(shape_of2); @@ -228,12 +248,31 @@ void ngraph::pass::ConvertPriorBox::convert_prior_box_clustered() { input_2 = convert2->input_value(0).get_node_shared_ptr(); } - auto shape_of1 = std::dynamic_pointer_cast (input_1); - auto shape_of2 = std::dynamic_pointer_cast (input_2); + // the input can be either ShapeOf-1 or ShapeOf-3 + std::shared_ptr shape_of1 = std::dynamic_pointer_cast (input_1); + std::shared_ptr shape_of2 = std::dynamic_pointer_cast (input_2); + if (!shape_of1 || !shape_of2) { + shape_of1 = std::dynamic_pointer_cast(input_1); + shape_of2 = std::dynamic_pointer_cast(input_2); + } if (!shape_of1 || !shape_of2) { return false; } + // keep this code for a while if will decide to run this transformation again in the opset1->legacy + // the input can be either ShapeOf or Convert(ShapeOf) +// if (!shape_of1 || !shape_of2) { +// auto shapeof1_convert = std::dynamic_pointer_cast (input_1); +// auto shapeof2_convert = std::dynamic_pointer_cast (input_2); +// if (!shapeof1_convert || !shapeof2_convert) +// return false; +// shape_of1 = std::dynamic_pointer_cast(shapeof1_convert->input_value(0).get_node_shared_ptr()); +// shape_of2 = std::dynamic_pointer_cast(shapeof2_convert->input_value(0).get_node_shared_ptr()); +// if (!shape_of1 || !shape_of2) +// return false; +// ops_to_replace.push_back(shapeof1_convert); +// ops_to_replace.push_back(shapeof2_convert); +// } ops_to_replace.push_back(shape_of1); ops_to_replace.push_back(shape_of2); diff --git a/inference-engine/src/transformations/src/transformations/convert_opset3_to_opset2/convert_broadcast3.cpp b/inference-engine/src/transformations/src/transformations/convert_opset3_to_opset2/convert_broadcast3.cpp new file mode 100644 index 00000000000..7e78ba6901a --- /dev/null +++ b/inference-engine/src/transformations/src/transformations/convert_opset3_to_opset2/convert_broadcast3.cpp @@ -0,0 +1,61 @@ +// Copyright (C) 2018-2020 Intel Corporation +// SPDX-License-Identifier: Apache-2.0 +// + +#include "transformations/convert_opset3_to_opset2/convert_broadcast3.hpp" + +#include +#include + +#include + +#include +#include + +void ngraph::pass::ConvertBroadcast3::convert_broadcast3() { + auto weights = std::make_shared(element::f32, Shape {1}); + auto shp = std::make_shared(element::i64, Shape {1}); + auto axes = std::make_shared(element::i64, Shape {1}); + auto broadcast = std::make_shared(weights, shp, axes); + + auto broadcast_no_axes = std::make_shared(weights, shp); + + ngraph::graph_rewrite_callback callback = [](pattern::Matcher& m) { + auto broadcast = std::dynamic_pointer_cast(m.get_match_root()); + if (!broadcast) { + return false; + } + + auto input = broadcast->input_value(0); + auto target_shape = broadcast->input_value(1); + + auto last_node = input.get_node_shared_ptr(); + auto broadcast_type = broadcast->get_broadcast_spec(); + + if (broadcast_type == op::BroadcastType::NUMPY) { + last_node = std::make_shared(input, target_shape, op::AutoBroadcastType::NUMPY); + ngraph::copy_runtime_info(broadcast, last_node); + } else if (broadcast_type == op::BroadcastType::PDPD) { + last_node = std::make_shared(input, target_shape, op::AutoBroadcastType::PDPD); + ngraph::copy_runtime_info(broadcast, last_node); + } else if (broadcast_type == op::BroadcastType::NONE) { + last_node = std::make_shared(input, target_shape, broadcast->input_value(2), op::AutoBroadcastType::NONE); + ngraph::copy_runtime_info(broadcast, last_node); + } else if (broadcast_type == op::BroadcastType::BIDIRECTIONAL) { + auto constant_one = std::make_shared(input.get_element_type(), Shape({1}), std::vector{1}); + auto broadcast_ones = std::make_shared(constant_one, target_shape, op::AutoBroadcastType::NUMPY); + last_node = std::make_shared(input, broadcast_ones); + ngraph::copy_runtime_info(broadcast, {last_node, broadcast_ones, constant_one}); + } + + last_node->set_friendly_name(broadcast->get_friendly_name()); + + ngraph::replace_node(m.get_match_root(), last_node); + return true; + }; + + auto m = std::make_shared(broadcast, "ConvertBroadcast3"); + auto m_no_axes = std::make_shared(broadcast_no_axes, "ConvertBroadcast3NoAxes"); + this->add_matcher(m, callback, PassProperty::CHANGE_DYNAMIC_STATE); + this->add_matcher(m_no_axes, callback, PassProperty::CHANGE_DYNAMIC_STATE); +} diff --git a/inference-engine/src/transformations/src/transformations/convert_opset3_to_opset2/convert_nms3.cpp b/inference-engine/src/transformations/src/transformations/convert_opset3_to_opset2/convert_nms3.cpp new file mode 100644 index 00000000000..eebef00df32 --- /dev/null +++ b/inference-engine/src/transformations/src/transformations/convert_opset3_to_opset2/convert_nms3.cpp @@ -0,0 +1,55 @@ +// Copyright (C) 2018-2020 Intel Corporation +// SPDX-License-Identifier: Apache-2.0 +// + +#include "transformations/convert_opset3_to_opset2/convert_nms3.hpp" + +#include +#include + +#include +#include +#include +#include + +void ngraph::pass::ConvertNMS3::convert_nms3() { + auto boxes = std::make_shared(element::f32, Shape{1, 1000, 4}); + auto scores = std::make_shared(element::f32, Shape{1, 1, 1000}); + auto max_output_boxes_per_class = ngraph::opset3::Constant::create(element::i64, Shape{}, {10}); + auto iou_threshold = ngraph::opset3::Constant::create(element::f32, Shape{}, {0.75}); + auto score_threshold = ngraph::opset3::Constant::create(element::f32, Shape{}, {0.7}); + auto nms = std::make_shared(boxes, scores, max_output_boxes_per_class, + iou_threshold, score_threshold); + + ngraph::graph_rewrite_callback callback = [](pattern::Matcher &m) { + auto nms = std::dynamic_pointer_cast(m.get_match_root()); + if (!nms) { + return false; + } + + Output last; + ngraph::NodeVector new_ops; + + auto new_nms = std::make_shared(nms->input_value(0), nms->input_value(1), + nms->input_value(2), nms->input_value(3), nms->input_value(4), + static_cast(nms->get_box_encoding()), + nms->get_sort_result_descending()); + + new_ops.push_back(new_nms); + // if the output is the i32 then it matches behavior of the v1::NonMaxSuppression otherwise need to insert Convert + if (nms->get_output_type() == element::i32) { + last = new_nms; + } else { + last = std::make_shared(new_nms, nms->get_output_type()); + new_ops.push_back(last.get_node_shared_ptr()); + } + + last.get_node_shared_ptr()->set_friendly_name(nms->get_friendly_name()); + ngraph::copy_runtime_info(nms, new_ops); + ngraph::replace_node(nms, last.get_node_shared_ptr()); + return true; + }; + + auto m = std::make_shared(nms, "ConvertNMS3"); + this->add_matcher(m, callback, PassProperty::CHANGE_DYNAMIC_STATE); +} diff --git a/inference-engine/src/transformations/src/transformations/convert_opset3_to_opset2/convert_opset3_to_opset2.cpp b/inference-engine/src/transformations/src/transformations/convert_opset3_to_opset2/convert_opset3_to_opset2.cpp new file mode 100644 index 00000000000..0e6af43fc44 --- /dev/null +++ b/inference-engine/src/transformations/src/transformations/convert_opset3_to_opset2/convert_opset3_to_opset2.cpp @@ -0,0 +1,32 @@ +// Copyright (C) 2020 Intel Corporation +// SPDX-License-Identifier: Apache-2.0 +// + +#include "transformations/convert_opset3_to_opset2/convert_opset3_to_opset2.hpp" + +#include "transformations/convert_opset3_to_opset2/convert_broadcast3.hpp" +#include "transformations/convert_opset3_to_opset2/convert_nms3.hpp" +#include "transformations/convert_opset3_to_opset2/convert_shapeof3.hpp" +#include "transformations/convert_opset3_to_opset2/convert_topk3.hpp" + +#include +#include + +#include + +bool ngraph::pass::ConvertOpSet3ToOpSet2::run_on_function(std::shared_ptr f) { + ngraph::pass::Manager OpSet3ToOpSet2; + std::vector > transforms; + +#define NGRAPH_PASS(NAME, NAMESPACE) transforms.push_back(OpSet3ToOpSet2.register_pass()); +#include +#undef NGRAPH_PASS + + for (auto & t : transforms) { + if (auto t_param = std::dynamic_pointer_cast(t)) { + t_param->setCallback(transformation_callback); + } + } + OpSet3ToOpSet2.run_passes(f); + return true; +} diff --git a/inference-engine/src/transformations/src/transformations/convert_opset3_to_opset2/convert_shapeof3.cpp b/inference-engine/src/transformations/src/transformations/convert_opset3_to_opset2/convert_shapeof3.cpp new file mode 100644 index 00000000000..609ac2002ac --- /dev/null +++ b/inference-engine/src/transformations/src/transformations/convert_opset3_to_opset2/convert_shapeof3.cpp @@ -0,0 +1,45 @@ +// Copyright (C) 2018-2020 Intel Corporation +// SPDX-License-Identifier: Apache-2.0 +// + +#include "transformations/convert_opset3_to_opset2/convert_shapeof3.hpp" + +#include +#include + +#include +#include +#include + +void ngraph::pass::ConvertShapeOf3::convert_shapeof3() { + auto input = std::make_shared(element::i64, Shape{1, 1, 1, 1}); + auto shapeof = std::make_shared(input); + + ngraph::graph_rewrite_callback callback = [](pattern::Matcher& m) { + auto shapeof = std::dynamic_pointer_cast (m.get_match_root()); + if (!shapeof) { + return false; + } + + Output last; + ngraph::NodeVector new_ops; + + auto new_shapeof = std::make_shared(shapeof->input_value(0)); + new_ops.push_back(new_shapeof); + // if the output is the i64 then it matches behavior of the v1::ShapeOf otherwise need to insert Convert + if (shapeof->get_output_type() == element::i64) { + last = new_shapeof; + } else { + last = std::make_shared(new_shapeof, shapeof->get_output_type()); + new_ops.push_back(last.get_node_shared_ptr()); + } + + last.get_node_shared_ptr()->set_friendly_name(shapeof->get_friendly_name()); + ngraph::copy_runtime_info(shapeof, new_ops); + ngraph::replace_node(shapeof, last.get_node_shared_ptr()); + return true; + }; + + auto m = std::make_shared(shapeof, "ConvertShapeOf3"); + this->add_matcher(m, callback, PassProperty::CHANGE_DYNAMIC_STATE); +} \ No newline at end of file diff --git a/inference-engine/src/transformations/src/transformations/convert_opset3_to_opset2/convert_topk3.cpp b/inference-engine/src/transformations/src/transformations/convert_opset3_to_opset2/convert_topk3.cpp new file mode 100644 index 00000000000..08197aadcdb --- /dev/null +++ b/inference-engine/src/transformations/src/transformations/convert_opset3_to_opset2/convert_topk3.cpp @@ -0,0 +1,56 @@ +// Copyright (C) 2018-2020 Intel Corporation +// SPDX-License-Identifier: Apache-2.0 +// + +#include "transformations/convert_opset3_to_opset2/convert_topk3.hpp" + +#include +#include + +#include +#include +#include +#include + +void ngraph::pass::ConvertTopK3::convert_topk3() { + auto input = std::make_shared(element::i64, Shape{1, 1, 1, 1}); + auto k = ngraph::opset3::Constant::create(element::i64, Shape{}, {10}); + auto topk = std::make_shared(input, k, 0, "min", "value", element::i64); + // this is a temporary workaround to avoid bug that TopK-3 does not have clone_with_new_inputs so the TopK-3 clone + // generates TopK-1 operation + auto topk_v1 = std::make_shared(input, k, 0, "min", "value", element::i64); + + ngraph::graph_rewrite_callback callback = [](pattern::Matcher& m) { + std::shared_ptr topk = std::dynamic_pointer_cast (m.get_match_root()); + if (!topk) { + topk = std::dynamic_pointer_cast (m.get_match_root()); + } + if (!topk) { + return false; + } + Output last; + ngraph::NodeVector new_ops; + + auto new_topk = std::make_shared(topk->input_value(0), topk->input_value(1), + topk->get_axis(), topk->get_mode(), topk->get_sort_type(), element::i32); + new_ops.push_back(new_topk); + // if the output is the i32 then it matches behavior of the v1::TopK otherwise need to insert Convert + if (topk->get_index_element_type() == element::i32) { + last = new_topk->output(1); + } else { + last = std::make_shared(new_topk->output(1), topk->get_index_element_type()); + new_ops.push_back(last.get_node_shared_ptr()); + } + + new_topk->set_friendly_name(topk->get_friendly_name()); + ngraph::copy_runtime_info(topk, new_ops); + topk->output(0).replace(new_topk->output(0)); + topk->output(1).replace(last); + return true; + }; + + auto m = std::make_shared(topk, "ConvertTopK3"); + this->add_matcher(m, callback, PassProperty::CHANGE_DYNAMIC_STATE); + auto m2 = std::make_shared(topk_v1, "ConvertTopK3"); + this->add_matcher(m2, callback, PassProperty::CHANGE_DYNAMIC_STATE); +} diff --git a/inference-engine/src/transformations/src/transformations/convert_scatter_elements_to_scatter.cpp b/inference-engine/src/transformations/src/transformations/convert_scatter_elements_to_scatter.cpp new file mode 100644 index 00000000000..42154e4868e --- /dev/null +++ b/inference-engine/src/transformations/src/transformations/convert_scatter_elements_to_scatter.cpp @@ -0,0 +1,211 @@ +// Copyright (C) 2020 Intel Corporation +// SPDX-License-Identifier: Apache-2.0 +// + +#include "transformations/convert_scatter_elements_to_scatter.hpp" + +#include +#include +#include + +#include +#include +#include + +void ngraph::pass::ConvertScatterElementsToScatter::convert_scatter_elements_to_scatter() { + auto data = std::make_shared(element::f32, Shape{1}); + auto indices = std::make_shared(element::i64, Shape{1}); + auto updates = std::make_shared(element::f32, Shape{1}); + auto axis = ngraph::opset3::Constant::create(element::i64, {1}, {0}); + + auto broadcast_shape = std::make_shared(element::i64, Shape{1}); + auto broadcast = std::make_shared(indices, broadcast_shape); + + auto scatter = std::make_shared(data, broadcast, updates, axis); + + ngraph::graph_rewrite_callback callback = [](pattern::Matcher& m) { + auto scatter = m.get_match_root(); + auto broadcast = scatter->input_value(1).get_node_shared_ptr(); + auto axis_const = std::dynamic_pointer_cast(scatter->input_value(3).get_node_shared_ptr()); + + if (!axis_const) { + return false; + } + + auto indices_input = broadcast->input_value(0); + + const auto data_pshape = scatter->input(0).get_partial_shape(); + const auto indices_pshape = indices_input.get_partial_shape(); + const auto updates_pshape = scatter->input(2).get_partial_shape(); + + // Check that ScatterElementsUpdate and Broadcast inputs has static shapes + if (data_pshape.rank().is_dynamic() || indices_pshape.rank().is_dynamic() || updates_pshape.rank().is_dynamic()) { + return false; + } + + const uint64_t data_rank = data_pshape.rank().get_length(); + const uint64_t updates_rank = updates_pshape.rank().get_length(); + const uint64_t indices_rank = indices_pshape.rank().get_length(); + + + // Check that axis Constant has {} or {1} shape + if (shape_size(axis_const->get_shape()) > 1) { + return false; + } + + const size_t axis = ngraph::normalize_axes(scatter->get_friendly_name(), + axis_const->cast_vector(), + data_pshape.rank())[0]; + + struct Range { + uint64_t l, r; + Range(const uint64_t & l, const uint64_t & r) : l(l), r(r) { + if (l > r) throw ngraph_error("Range values are inconsistent"); + } + + uint64_t size() const { + return r - l; + } + + bool operator!= (const Range & rhs) const { + return (r - l != rhs.r - rhs.l); + } + + static + bool is_valid(const int64_t & l, const int64_t & r) { + return (l >= 0 && l <= r); + } + + static + bool is_empty(const uint64_t & l, const uint64_t & r) { + return l == r; + } + }; + + auto compare_shapes_ranges = [](const PartialShape & lhsShape, const PartialShape & rhsShape, const Range & lhsRange, const Range & rhsRange) -> bool { + // Check that ranges are equal and suits to Shapes sizes + if (lhsRange != rhsRange || + lhsRange.r > lhsShape.rank().get_length() || + rhsRange.r > rhsShape.rank().get_length()) { + return false; + } + + // Check that Shape values in ranges are equal + for (size_t lhsIndex = lhsRange.l, rhsIndex = rhsRange.l; lhsIndex < lhsRange.r; ++lhsIndex, ++rhsIndex) { + if (lhsShape[lhsIndex].is_dynamic() || rhsShape[rhsIndex].is_dynamic() || + lhsShape[lhsIndex] != rhsShape[rhsIndex]) { + return false; + } + } + + return true; + }; + + auto product = [](const Shape & shape, const Range & range) -> uint64_t { + uint64_t prod(1); + for (size_t dim = range.l; dim < range.r; ++dim) { + prod *= shape[dim]; + } + return prod; + }; + + /* To transform ScatterElementsUpdate to ScatterUpdate input shapes must match this rules: + * + * data_shape[d_0, d_1, ... , d_n] + * + * indices_shape[i_0, i_1, ... , i_n] + * + * updates_shape[d_0, d_1, i_0(axis), i_1, ... , i_n, d_axis + 1, ... , d_n] + * + * EXAMPLE: + * In this example the input shapes are suits the rules above and ScatterElementsUpdate can be replaced with ScatterUpdate + * + * axis = 1 | (axis) + * \/ + * + * data_shape [1000, 256, 10, 15] + * + * index_shape [ 125, 2 ] + * + * updates_shape [1000, 125, 2, 10, 15] + * + */ + + // data_shape and updates_shape dims must be equal up to axis dimension + if (!compare_shapes_ranges(data_pshape, updates_pshape, {0, axis}, {0, axis})) { + return false; + } + + // data_shape dims starting right after axis dim must match last updates_shape dimensions + if (!Range::is_valid(updates_rank - (data_rank - (axis + 1)), updates_rank)) { + return false; + } + + const Range updates_last{updates_rank - (data_rank - (axis + 1)), updates_rank}; + if (!compare_shapes_ranges(data_pshape, updates_pshape, {axis + 1, data_rank}, updates_last)) { + return false; + } + + // indices_shape dims product must match updates_shape dims starting from axis dimension + if (!Range::is_valid(axis, updates_last.l) && !Range::is_empty(axis, updates_last.l)) { + return false; + } + + NodeVector new_ops; + + // In case of static shapes we check that indices dims product match with updates dims + if (updates_pshape.is_static() && indices_pshape.is_static()) { + const auto updated_range_prod = product(updates_pshape.get_shape(), {axis, updates_last.l}); + const auto indices_range_prod = product(indices_pshape.get_shape(), {0, indices_rank}); + + if (updated_range_prod != indices_range_prod) { + return false; + } + + // if indices_shape do not match updates_shape dims{axis, updates_last.l} + // we reshape indices to updates_shape + const auto updates_shape = updates_pshape.get_shape(); + const auto indices_shape = indices_pshape.get_shape(); + Shape indices_new_shape(updates_shape.begin() + axis, updates_shape.begin() + updates_last.l); + if (indices_shape != indices_new_shape) { + indices_input = std::make_shared(indices_input, + opset3::Constant::create(element::i64, Shape{indices_new_shape.size()}, indices_new_shape), false); + new_ops.push_back(indices_input.get_node_shared_ptr()); + } + } else { + // Tight constrain for dynamic case: + // 1. indices_pshape 1...N dimensions must be equal to 1 + // 2. updates_pshape axis interval size = 1 + + for (size_t dim = 1; dim < indices_rank; ++dim) { + if (indices_pshape[dim] != 1) return false; + } + + if (Range(axis, updates_last.l).size() != 1) { + return false; + } + + // Squeeze 1 dims for indices input + if (indices_rank > 1) { + std::vector squeeze_axes(indices_rank - 1ul); + std::iota(squeeze_axes.begin(), squeeze_axes.end(), 1); + indices_input = std::make_shared(indices_input, + opset3::Constant::create(element::i64, Shape{squeeze_axes.size()}, squeeze_axes)); + new_ops.push_back(indices_input.get_node_shared_ptr()); + } + } + + auto scatter_update = std::make_shared(scatter->input_value(0), + indices_input, + scatter->input_value(2), + scatter->input_value(3)); + new_ops.push_back(scatter_update); + scatter_update->set_friendly_name(scatter->get_friendly_name()); + ngraph::copy_runtime_info({scatter, broadcast}, {new_ops}); + ngraph::replace_node(scatter, scatter_update); + return true; + }; + + auto m = std::make_shared(scatter, "ConvertScatterElementsToScatter"); + this->add_matcher(m, callback, PassProperty::CHANGE_DYNAMIC_STATE); +} \ No newline at end of file diff --git a/inference-engine/src/transformations/src/transformations/optimize_strided_slice.cpp b/inference-engine/src/transformations/src/transformations/optimize_strided_slice.cpp new file mode 100644 index 00000000000..c03d5f4129c --- /dev/null +++ b/inference-engine/src/transformations/src/transformations/optimize_strided_slice.cpp @@ -0,0 +1,203 @@ +// Copyright (C) 2018-2020 Intel Corporation +// SPDX-License-Identifier: Apache-2.0 +// + +#include +#include + +#include +#include +#include +#include + +bool ngraph::pass::UselessStridedSliceEraser::run_on_function(std::shared_ptr f) { + bool rewritten = false; + for (auto & node : f->get_ordered_ops()) { + auto ss = std::dynamic_pointer_cast(node); + if (!ss || ss->get_output_partial_shape(0).is_dynamic() || ss->get_input_partial_shape(0).is_dynamic()) + continue; + if (ss->input(0).get_shape() != ss->output(0).get_shape()) + continue; + rewritten |= replace_output_update_name(ss->output(0), ss->input_value(0)); + } + return rewritten; +} + +ngraph::SlicePlan get_slice_plan(std::shared_ptr slice) { + auto convert_mask_to_axis_set = [](const std::vector& mask) { + ngraph::AxisSet axis_set{}; + for (size_t i = 0; i < static_cast(mask.size()); ++i) { + if (mask[i] == 1) + axis_set.emplace(i); + } + return axis_set; + }; + + auto data = slice->input_value(0).get_node_shared_ptr(); + auto begin = std::dynamic_pointer_cast(slice->input_value(1).get_node_shared_ptr()); + auto end = std::dynamic_pointer_cast(slice->input_value(2).get_node_shared_ptr()); + auto strides = std::dynamic_pointer_cast(slice->input_value(3).get_node_shared_ptr()); + if (!begin || !end || !strides || slice->input(0).get_partial_shape().is_dynamic()) + return ngraph::SlicePlan(); + + auto begin_vec = begin->cast_vector(); + auto end_vec = end->cast_vector(); + auto strides_vec = strides->cast_vector(); + const auto begin_mask = convert_mask_to_axis_set(slice->get_begin_mask()); + const auto end_mask = convert_mask_to_axis_set(slice->get_end_mask()); + + ngraph::SlicePlan plan = ngraph::make_slice_plan(slice->input(0).get_shape(), + begin_vec, + end_vec, + strides_vec, + begin_mask, + end_mask, + convert_mask_to_axis_set(slice->get_new_axis_mask()), + convert_mask_to_axis_set(slice->get_shrink_axis_mask()), + convert_mask_to_axis_set(slice->get_ellipsis_mask())); + return plan; +} + + +bool strided_slices_perform_the_same(std::shared_ptr lhs, + std::shared_ptr rhs) { + auto lhs_plan = get_slice_plan(lhs); + auto rhs_plan = get_slice_plan(rhs); + + auto empty_plan = ngraph::SlicePlan(); + if (lhs_plan == empty_plan || rhs_plan == empty_plan) + return false; + return lhs_plan == rhs_plan; +} + +bool ngraph::pass::SharedStridedSliceEraser::run_on_function(std::shared_ptr f) { + bool graph_rewritten = false; + + std::map, std::vector>> source_to_ss; + for (const auto & node : f->get_ordered_ops()) { + if (auto ss = std::dynamic_pointer_cast(node)) { + source_to_ss[ss->input_value(0)].push_back(ss); + } + } + + for (auto& pair : source_to_ss) { + if (pair.second.size() < 2) + continue; + auto root_ss = pair.second[0]; + for (auto& child_ss : pair.second) { + if (root_ss->get_instance_id() != child_ss->get_instance_id() && strided_slices_perform_the_same(root_ss, child_ss)) { + graph_rewritten |= replace_output_update_name(child_ss->output(0), root_ss->output(0)); + } + } + } + return graph_rewritten; +} + +bool ngraph::pass::GroupedStridedSliceOptimizer::run_on_function(std::shared_ptr f) { + bool graph_rewritten = false; + using planned_slice = std::pair, ngraph::SlicePlan>; + + std::map, std::vector> source_to_ss_with_plan; + for (const auto & node : f->get_ordered_ops()) { + if (auto ss = std::dynamic_pointer_cast(node)) { + auto slice_plan = get_slice_plan(ss); + if (slice_plan == ngraph::SlicePlan()) + continue; + source_to_ss_with_plan[ss->input_value(0)].push_back({ss, slice_plan}); + } + } + + for (auto& pair : source_to_ss_with_plan) { + if (pair.second.size() < 2) + continue; + + bool valid_for_replacement = true; + + auto root_plan = pair.second[0].second; + for (const auto & ss_plan : pair.second) { + valid_for_replacement &= (ss_plan.second.begins.size() == root_plan.begins.size()); + valid_for_replacement &= (ss_plan.first->get_ellipsis_mask().empty() && + ss_plan.first->get_new_axis_mask().empty() && + ss_plan.first->get_shrink_axis_mask().empty()); + } + + if (!valid_for_replacement) continue; + + auto input_shape = pair.first.get_shape(); + auto axis = -1; + + using OutputToPatrition = struct { + Output output; + int64_t begin; + int64_t end; + }; + + std::vector output_to_partition; + for (size_t i = 0; i < input_shape.size(); ++i) { + for (const auto & ss_plan : pair.second) { + if (ss_plan.second.begins[i] != 0 || ss_plan.second.ends[i] != input_shape[i]) { + if (axis == -1 || axis == i) + axis = i; + else + valid_for_replacement = false; + if (ss_plan.second.strides[i] != 1) + valid_for_replacement = false; + output_to_partition.push_back({ss_plan.first->output(0), ss_plan.second.begins[i], ss_plan.second.ends[i]}); + } + if (!valid_for_replacement) break; + } + if (!valid_for_replacement) break; + } + + if (!valid_for_replacement) continue; + if (output_to_partition.size() < 2) continue; + + std::sort(output_to_partition.begin(), output_to_partition.end(), + [](OutputToPatrition lhs, OutputToPatrition rhs) + {return lhs.begin < rhs.begin;}); + + std::vector, uint64_t>> output_to_size; + uint64_t prev_r = 0; + for (auto & record : output_to_partition) { + valid_for_replacement &= (record.begin >= prev_r); + prev_r = record.end; + } + valid_for_replacement &= (prev_r <= input_shape[axis]); + if (!valid_for_replacement) continue; + + prev_r = 0; + Output fake_output; + for (auto & record : output_to_partition) { + if (record.begin > prev_r) + output_to_size.emplace_back(fake_output, record.begin - prev_r); + prev_r = record.end; + output_to_size.emplace_back(record.output, record.end - record.begin); + } + if (prev_r < input_shape[axis]) { + output_to_size.emplace_back(fake_output, input_shape[axis] - prev_r); + } + + auto axis_const = ngraph::opset1::Constant::create(ngraph::element::i64, ngraph::Shape{}, {axis}); + + std::vector size_splits; + for (const auto & item : output_to_size) + size_splits.push_back(item.second); + auto size_splits_const = ngraph::opset1::Constant::create(ngraph::element::i64, ngraph::Shape{size_splits.size()}, size_splits); + auto variadic_split = std::make_shared(pair.first, axis_const, size_splits_const); + + auto i = 0; + NodeVector ops_to_replace; + for (auto & record : output_to_size) { + if (record.first == fake_output) { + std::make_shared(variadic_split->output(i)); + } else { + record.first.replace(variadic_split->output(i)); + ops_to_replace.push_back(record.first.get_node_shared_ptr()); + } + ++i; + } + copy_runtime_info(ops_to_replace, variadic_split); + } + return graph_rewritten; +} + diff --git a/inference-engine/src/transformations/src/transformations/remove_filtering_boxes_by_size.cpp b/inference-engine/src/transformations/src/transformations/remove_filtering_boxes_by_size.cpp new file mode 100644 index 00000000000..58e2d61971d --- /dev/null +++ b/inference-engine/src/transformations/src/transformations/remove_filtering_boxes_by_size.cpp @@ -0,0 +1,106 @@ +// Copyright (C) 2018-2020 Intel Corporation +// SPDX-License-Identifier: Apache-2.0 +// + +#include +#include + +#include +#include + +#include "transformations/remove_filtering_boxes_by_size.hpp" + +void ngraph::pass::RemoveFilteringBoxesBySize::remove_filtering_boxes_by_size() { + // variadic split + auto data = std::make_shared(element::f32, Shape{1000, 4}); + auto sizes = opset3::Constant::create(element::i64, Shape{4}, std::vector({1, 1, 1, 1})); + auto axis = opset3::Constant::create(element::i64, Shape{1}, std::vector({1})); + auto split = std::make_shared(data, axis, sizes); + + // sub -> add + auto sub_2_0 = std::make_shared(split->output(2), split->output(0)); + auto term_1 = std::make_shared(element::f32, Shape{1}); + auto add_1 = std::make_shared(sub_2_0, term_1); + + auto sub_3_1 = std::make_shared(split->output(3), split->output(1)); + auto term_2 = std::make_shared(element::f32, Shape{1}); + auto add_2 = std::make_shared(sub_3_1, term_2); + + // concat + auto concat = std::make_shared(ngraph::OutputVector({split->output(0), split->output(1), add_1->output(0), add_2->output(0)}), 1); + + // second variadic split + auto sizes_1 = opset3::Constant::create(element::i64, Shape{4}, std::vector({1, 1, 1, 1})); + auto axis_1 = opset3::Constant::create(element::i64, Shape{1}, std::vector({1})); + auto split_1 = std::make_shared(concat, axis_1, sizes_1); + + // squeeze + auto squeeze_1_axis = opset3::Constant::create(element::i64, Shape{1}, std::vector({1})); + auto squeeze_1 = std::make_shared(split_1->output(2), squeeze_1_axis); + + auto squeeze_2_axis = opset3::Constant::create(element::i64, Shape{1}, std::vector({1})); + auto squeeze_2 = std::make_shared(split_1->output(3), squeeze_2_axis); + + // less + auto less_1_constant = opset3::Constant::create(element::f32, Shape{1}, std::vector({0})); + auto less_1 = std::make_shared(squeeze_1, less_1_constant); + + auto less_2_constant = opset3::Constant::create(element::f32, Shape{1}, std::vector({0})); + auto less_2 = std::make_shared(squeeze_2, less_2_constant); + + // Logical Not + auto not_1 = std::make_shared(less_1); + auto not_2 = std::make_shared(less_2); + + // cast + auto cast_11 = std::make_shared(not_1, ngraph::element::u8); + auto cast_12 = std::make_shared(cast_11, ngraph::element::boolean); + + auto cast_21 = std::make_shared(not_2, ngraph::element::u8); + auto cast_22 = std::make_shared(cast_21, ngraph::element::boolean); + + // logical and + auto and_1 = std::make_shared(cast_12, cast_22); + + // cast + auto cast_31 = std::make_shared(and_1, ngraph::element::u8); + auto cast_32 = std::make_shared(cast_31, ngraph::element::f32); + + // nonzero + auto non_zero = std::make_shared(cast_32); + + auto order = opset3::Constant::create(element::i64, Shape{2}, std::vector({1, 0})); + auto transpose = std::make_shared(non_zero, order); + + auto squeeze_3_axis = opset3::Constant::create(element::i64, Shape{1}, std::vector({1})); + auto squeeze_3 = std::make_shared(transpose, squeeze_3_axis); + + auto cast = std::make_shared(squeeze_3, ngraph::element::i64); + + ngraph::graph_rewrite_callback callback = [data](pattern::Matcher& m) { + auto start = opset3::Constant::create(element::i64, Shape{}, std::vector({0})); + auto step = opset3::Constant::create(element::i64, Shape{}, std::vector({1})); + + auto pattern_map = m.get_pattern_map(); + + auto input = pattern_map[data]; + auto output = m.get_match_root(); + + auto input_shape = std::make_shared(input); + + auto axis = opset3::Constant::create(element::i64, Shape{}, std::vector({0})); + auto index = opset3::Constant::create(element::i64, Shape{}, std::vector({0})); + auto stop = std::make_shared(input_shape, index, axis); + + auto range = std::make_shared(start, stop, step); + + range->set_friendly_name(output->get_friendly_name()); + // TODO: add copy_runtime_info + ngraph::replace_node(output, range); + + return true; + }; + + auto m = std::make_shared(cast, "RemoveFilteringBoxesBySize"); + this->add_matcher(m, callback, PassProperty::CHANGE_DYNAMIC_STATE); +} \ No newline at end of file diff --git a/inference-engine/src/vpu/common/include/vpu/ngraph/operations/out_shape_of_reshape.hpp b/inference-engine/src/vpu/common/include/vpu/ngraph/operations/out_shape_of_reshape.hpp new file mode 100644 index 00000000000..6bb56c16f02 --- /dev/null +++ b/inference-engine/src/vpu/common/include/vpu/ngraph/operations/out_shape_of_reshape.hpp @@ -0,0 +1,37 @@ +// Copyright (C) 2020 Intel Corporation +// SPDX-License-Identifier: Apache-2.0 +// + +#pragma once + +#include +#include + +namespace ngraph { namespace vpu { namespace op { + +class OutShapeOfReshape : public ngraph::op::Op { +public: + static constexpr NodeTypeInfo type_info{"OutShapeOfReshape", 1}; + const NodeTypeInfo& get_type_info() const override { return type_info; } + + OutShapeOfReshape( + const Output& inDataShape, + const Output& outShapeDescriptor, + bool specialZero); + + void validate_and_infer_types() override; + + std::shared_ptr clone_with_new_inputs(const OutputVector& new_args) const override; + + bool visit_attributes(ngraph::AttributeVisitor& visitor) override; + + bool getSpecialZero() const { return m_specialZero; } + void setSpecialZero(bool special_zero) { m_specialZero = special_zero; } + +private: + bool m_specialZero; +}; + +} // namespace op +} // namespace vpu +} // namespace ngraph diff --git a/inference-engine/src/vpu/common/include/vpu/ngraph/operations/static_shape_broadcast.hpp b/inference-engine/src/vpu/common/include/vpu/ngraph/operations/static_shape_broadcast.hpp new file mode 100644 index 00000000000..9fc45c71caf --- /dev/null +++ b/inference-engine/src/vpu/common/include/vpu/ngraph/operations/static_shape_broadcast.hpp @@ -0,0 +1,47 @@ +// Copyright (C) 2020 Intel Corporation +// SPDX-License-Identifier: Apache-2.0 +// + +#pragma once + +#include "ngraph/node.hpp" +#include "ngraph/op/op.hpp" +#include "ngraph/op/util/broadcast_base.hpp" +#include "ngraph/op/util/attr_types.hpp" + +#include +#include + +namespace ngraph { namespace vpu { namespace op { + +class StaticShapeBroadcast : public ::ngraph::op::util::BroadcastBase { +public: + static constexpr NodeTypeInfo type_info{"StaticShapeBroadcast", 0}; + + const NodeTypeInfo& get_type_info() const override { return type_info; } + + StaticShapeBroadcast(const Output& arg, + const Output& targetShape, + const Output& axesMapping, + const ngraph::op::BroadcastModeSpec& broadcastSpec = ngraph::op::BroadcastType::EXPLICIT); + + StaticShapeBroadcast(const Output& arg, + const Output& targetShape, + const ngraph::op::BroadcastModeSpec& broadcastSpec = ngraph::op::BroadcastType::NUMPY); + + void validate_and_infer_types() override; + + std::shared_ptr clone_with_new_inputs(const OutputVector& newInputs) const override; + + bool visit_attributes(ngraph::AttributeVisitor& visitor) override; + + PartialShape getEvaluatedShape() const { return m_evaluatedOutputShape; } + void setEvaluatedShape(const PartialShape& shape) { m_evaluatedOutputShape = shape; } + +private: + PartialShape m_evaluatedOutputShape; +}; + +} // namespace op +} // namespace vpu +} // namespace ngraph diff --git a/inference-engine/src/vpu/common/include/vpu/ngraph/operations/static_shape_nonzero.hpp b/inference-engine/src/vpu/common/include/vpu/ngraph/operations/static_shape_nonzero.hpp index eb28ba452a4..5a9c75240c9 100644 --- a/inference-engine/src/vpu/common/include/vpu/ngraph/operations/static_shape_nonzero.hpp +++ b/inference-engine/src/vpu/common/include/vpu/ngraph/operations/static_shape_nonzero.hpp @@ -18,13 +18,24 @@ public: const NodeTypeInfo& get_type_info() const override { return type_info; } - explicit StaticShapeNonZero(const Output& input); + explicit StaticShapeNonZero(const Output& input, const element::Type& output_type = element::i64); void validate_and_infer_types() override; std::shared_ptr copy_with_new_args(const NodeVector& new_args) const override; bool visit_attributes(ngraph::AttributeVisitor& visitor) override; + + bool evaluate(const HostTensorVector& output_values, + const HostTensorVector& input_values) override; + + element::Type get_output_type() const { return m_output_type; } + void set_output_type(element::Type output_type) { m_output_type = output_type; } + // Overload collision with method on Node + using Node::set_output_type; + +protected: + element::Type m_output_type; }; } // namespace op diff --git a/inference-engine/src/vpu/common/include/vpu/ngraph/transformations/dynamic_to_static_shape.hpp b/inference-engine/src/vpu/common/include/vpu/ngraph/transformations/dynamic_to_static_shape.hpp index 0ab93a4cb8e..f61ad57f2b1 100644 --- a/inference-engine/src/vpu/common/include/vpu/ngraph/transformations/dynamic_to_static_shape.hpp +++ b/inference-engine/src/vpu/common/include/vpu/ngraph/transformations/dynamic_to_static_shape.hpp @@ -16,7 +16,7 @@ using Transformations = std::unordered_map function) const; private: Transformations transformations; diff --git a/inference-engine/src/vpu/common/include/vpu/ngraph/transformations/dynamic_to_static_shape_broadcast.hpp b/inference-engine/src/vpu/common/include/vpu/ngraph/transformations/dynamic_to_static_shape_broadcast.hpp new file mode 100644 index 00000000000..2ef7bbbecde --- /dev/null +++ b/inference-engine/src/vpu/common/include/vpu/ngraph/transformations/dynamic_to_static_shape_broadcast.hpp @@ -0,0 +1,15 @@ +// Copyright (C) 2020 Intel Corporation +// SPDX-License-Identifier: Apache-2.0 +// + +#pragma once + +#include "ngraph/node.hpp" + +#include + +namespace vpu { + +void dynamicToStaticShapeBroadcast(std::shared_ptr target); + +} // namespace vpu diff --git a/inference-engine/src/vpu/common/include/vpu/ngraph/transformations/dynamic_to_static_shape_concat.hpp b/inference-engine/src/vpu/common/include/vpu/ngraph/transformations/dynamic_to_static_shape_concat.hpp new file mode 100644 index 00000000000..43dd69ee0ac --- /dev/null +++ b/inference-engine/src/vpu/common/include/vpu/ngraph/transformations/dynamic_to_static_shape_concat.hpp @@ -0,0 +1,15 @@ +// Copyright (C) 2020 Intel Corporation +// SPDX-License-Identifier: Apache-2.0 +// + +#pragma once + +#include "ngraph/node.hpp" + +#include + +namespace vpu { + +void dynamicToStaticShapeConcat(std::shared_ptr target); + +} // namespace vpu diff --git a/inference-engine/src/vpu/common/include/vpu/ngraph/transformations/dynamic_to_static_shape_gather.hpp b/inference-engine/src/vpu/common/include/vpu/ngraph/transformations/dynamic_to_static_shape_gather.hpp new file mode 100644 index 00000000000..467f3ff1753 --- /dev/null +++ b/inference-engine/src/vpu/common/include/vpu/ngraph/transformations/dynamic_to_static_shape_gather.hpp @@ -0,0 +1,15 @@ +// Copyright (C) 2020 Intel Corporation +// SPDX-License-Identifier: Apache-2.0 +// + +#pragma once + +#include "ngraph/node.hpp" + +#include + +namespace vpu { + +void dynamicToStaticShapeGather(std::shared_ptr node); + +} // namespace vpu diff --git a/inference-engine/src/vpu/common/include/vpu/ngraph/transformations/dynamic_to_static_shape_reshape.hpp b/inference-engine/src/vpu/common/include/vpu/ngraph/transformations/dynamic_to_static_shape_reshape.hpp new file mode 100644 index 00000000000..6771ade69fe --- /dev/null +++ b/inference-engine/src/vpu/common/include/vpu/ngraph/transformations/dynamic_to_static_shape_reshape.hpp @@ -0,0 +1,15 @@ +// Copyright (C) 2020 Intel Corporation +// SPDX-License-Identifier: Apache-2.0 +// + +#pragma once + +#include "ngraph/node.hpp" + +#include + +namespace vpu { + +void dynamicToStaticShapeReshape(std::shared_ptr transpose); + +} // namespace vpu diff --git a/inference-engine/src/vpu/common/include/vpu/ngraph/transformations/dynamic_to_static_shape_shapeof.hpp b/inference-engine/src/vpu/common/include/vpu/ngraph/transformations/dynamic_to_static_shape_shapeof.hpp new file mode 100644 index 00000000000..a8be57aee02 --- /dev/null +++ b/inference-engine/src/vpu/common/include/vpu/ngraph/transformations/dynamic_to_static_shape_shapeof.hpp @@ -0,0 +1,16 @@ +// Copyright (C) 2020 Intel Corporation +// SPDX-License-Identifier: Apache-2.0 +// + +#pragma once + +#include + +namespace vpu { + +class DynamicToStaticShapeShapeOf : public ngraph::pass::GraphRewrite { +public: + DynamicToStaticShapeShapeOf(); +}; + +} //namespace vpu diff --git a/inference-engine/src/vpu/common/include/vpu/ngraph/transformations/dynamic_to_static_shape_variadic_split.hpp b/inference-engine/src/vpu/common/include/vpu/ngraph/transformations/dynamic_to_static_shape_variadic_split.hpp new file mode 100644 index 00000000000..6c89afa6281 --- /dev/null +++ b/inference-engine/src/vpu/common/include/vpu/ngraph/transformations/dynamic_to_static_shape_variadic_split.hpp @@ -0,0 +1,15 @@ +// Copyright (C) 2020 Intel Corporation +// SPDX-License-Identifier: Apache-2.0 +// + +#pragma once + +#include "ngraph/node.hpp" + +#include + +namespace vpu { + +void dynamicToStaticShapeVariadicSplit(std::shared_ptr node); + +} // namespace vpu diff --git a/inference-engine/src/vpu/common/include/vpu/utils/simple_math.hpp b/inference-engine/src/vpu/common/include/vpu/utils/simple_math.hpp index e2df86e9a2c..aafe6888561 100644 --- a/inference-engine/src/vpu/common/include/vpu/utils/simple_math.hpp +++ b/inference-engine/src/vpu/common/include/vpu/utils/simple_math.hpp @@ -11,6 +11,8 @@ #include #include +#include "error.hpp" +#include #include // @@ -22,30 +24,107 @@ namespace vpu { -class SimpleMathExpression final { +template +Optional parseNumber(const std::string& s) { + T value; + if ((std::istringstream(s) >> value >> std::ws).eof()) { + return {value}; + } + return {}; +} + +namespace details { + +#define OPERATOR(OP) \ + IntOrFloat operator OP(const IntOrFloat &other) const { \ + if (isInt && other.isInt) { \ + return IntOrFloat{value.i OP other.value.i}; \ + } \ + const float lhs = isInt ? value.i : value.f; \ + const float rhs = other.isInt ? other.value.i : other.value.f; \ + return IntOrFloat{lhs OP rhs}; \ + } + +class IntOrFloat final { + union { + int i; + float f; + } value{}; + bool isInt = true; + public: - void setVariables(const std::map& vars) { _vars = vars; } + explicit IntOrFloat(int x) : isInt{true} { + value.i = x; + } + explicit IntOrFloat(float x) : isInt{false} { + value.f = x; + } + explicit IntOrFloat(const std::string& x) { + const auto integer = parseNumber(x); + if (integer.hasValue()) { + *this = IntOrFloat(integer.get()); + return; + } + const auto fp = parseNumber(x); + if (fp.hasValue()) { + *this = IntOrFloat(fp.get()); + return; + } + VPU_THROW_FORMAT("Failed to convert string to number: '%s'", x); + } + + explicit operator std::string() const { + return isInt ? std::to_string(value.i) : std::to_string(value.f); + } + + float toFloat() const { return isInt ? static_cast(value.i) : value.f; } + + OPERATOR(+) + OPERATOR(-) + OPERATOR(*) + OPERATOR(/) + + IntOrFloat operator %(const IntOrFloat & other) const { + if (isInt && other.isInt) { + return IntOrFloat{value.i % other.value.i}; + } + THROW_IE_EXCEPTION << "Can't apply modulus operation to floating point value"; + } +}; + +} // namespace details + +class MathExpression final { +public: + void setVariables(const std::map& variables) { + for (const auto& var : variables) { + // if string converts to float, it also will be able to convert to int + if (parseNumber(var.second).hasValue()) { + _vars.emplace(var.first, details::IntOrFloat{var.second}); + } + } + } void parse(const std::string& expression); - int evaluate() const; private: - struct Token final { - enum TokenType { - Value, - Operator, - }; - - TokenType type; - int value; - char op; - - explicit Token(TokenType t = Value, int v = 0, char o = 0) : type(t), value(v), op(o) {} + enum class TokenType { + Value, + Operator, + Function }; -private: - std::map _vars; + struct Token { + TokenType type; + details::IntOrFloat value; + std::string opName; + + explicit Token(TokenType type, details::IntOrFloat value, std::string name) + : type(type), value(value), opName(std::move(name)) {} + }; + + std::map _vars; SmallVector _parsedTokens; }; diff --git a/inference-engine/src/vpu/common/src/ngraph/operations/dynamic_shape_resolver.cpp b/inference-engine/src/vpu/common/src/ngraph/operations/dynamic_shape_resolver.cpp index a33c37e00ee..1a29f8efb4d 100644 --- a/inference-engine/src/vpu/common/src/ngraph/operations/dynamic_shape_resolver.cpp +++ b/inference-engine/src/vpu/common/src/ngraph/operations/dynamic_shape_resolver.cpp @@ -26,8 +26,9 @@ void DynamicShapeResolver::validate_and_infer_types() { const auto& dataElementType = get_input_element_type(0); NODE_VALIDATION_CHECK(this, dataElementType.is_static(), "(", get_friendly_name(), ") does not support dynamic element type for data tensor"); const auto& dimsElementType = get_input_element_type(1); - NODE_VALIDATION_CHECK(this, dimsElementType.is_static() && dimsElementType.compatible(ngraph::element::i64), "(", get_friendly_name(), - ") supports only i64 number type for dims tensor, but ", dimsElementType, " provided"); + NODE_VALIDATION_CHECK(this, dimsElementType.is_static() && (dimsElementType.compatible(ngraph::element::i64) || + dimsElementType.compatible(ngraph::element::i32)), + "(", get_friendly_name(), ") supports only i64 and i32 number type for dims tensor, but ", dimsElementType, " provided"); const auto& dataShape = get_input_shape(0); const auto& dimsShape = get_input_shape(1); diff --git a/inference-engine/src/vpu/common/src/ngraph/operations/out_shape_of_reshape.cpp b/inference-engine/src/vpu/common/src/ngraph/operations/out_shape_of_reshape.cpp new file mode 100644 index 00000000000..4688e7c1852 --- /dev/null +++ b/inference-engine/src/vpu/common/src/ngraph/operations/out_shape_of_reshape.cpp @@ -0,0 +1,72 @@ +// Copyright (C) 2020 Intel Corporation +// SPDX-License-Identifier: Apache-2.0 +// + +#include "vpu/ngraph/operations/out_shape_of_reshape.hpp" + +namespace ngraph { namespace vpu { namespace op { + +constexpr NodeTypeInfo OutShapeOfReshape::type_info; + +OutShapeOfReshape::OutShapeOfReshape( + const Output& inDataShape, + const Output& outShapeDescriptor, + bool specialZero) : Op({inDataShape, outShapeDescriptor}), m_specialZero(specialZero) { + constructor_validate_and_infer_types(); +} + +void OutShapeOfReshape::validate_and_infer_types() { + NODE_VALIDATION_CHECK(this, get_input_size() == 2, + "OutShapeOfReshape (", get_friendly_name(), + ") must have only 2 inputs, provided: ", get_input_size()); + + const auto& inDataShapeTensorShape = get_input_partial_shape(0); + NODE_VALIDATION_CHECK(this, inDataShapeTensorShape.is_static(), + "OutShapeOfReshape (", get_friendly_name(), + ") doesn't support dynamic input data shape"); + NODE_VALIDATION_CHECK(this, inDataShapeTensorShape.rank().get_length() == 1, + "OutShapeOfReshape (", get_friendly_name(), + ") must have input data shape tensor with rank 1, provided: ", + inDataShapeTensorShape.rank().get_length()); + + const auto& outShapeDescriptorTensorShape = get_input_partial_shape(1); + NODE_VALIDATION_CHECK(this, outShapeDescriptorTensorShape.is_static(), + "OutShapeOfReshape (", get_friendly_name(), + ") doesn't support dynamic output shape descriptor"); + NODE_VALIDATION_CHECK(this, outShapeDescriptorTensorShape.rank().get_length() == 1, + "OutShapeOfReshape (", get_friendly_name(), + ") must have output shape descriptor tensor with rank 1, provided: ", + outShapeDescriptorTensorShape.rank().get_length()); + + const auto& inDataShapeTensorType = get_input_element_type(0); + NODE_VALIDATION_CHECK(this, + inDataShapeTensorType.is_static() && + inDataShapeTensorType.is_integral_number(), + "OutShapeOfReshape (", get_friendly_name(), + ") input data type needs to be an integral type. Got: ", + inDataShapeTensorType); + const auto& outShapeDescriptorTensorType = get_input_element_type(1); + NODE_VALIDATION_CHECK(this, + outShapeDescriptorTensorType.is_static() && + outShapeDescriptorTensorType.is_integral_number(), + "OutShapeOfReshape (", get_friendly_name(), + ") shape descriptor type needs to be an integral type. Got: ", + outShapeDescriptorTensorType); + + set_output_type(0, element::i64, outShapeDescriptorTensorShape); +} + +std::shared_ptr OutShapeOfReshape::clone_with_new_inputs(const OutputVector& new_args) const { + check_new_args_count(this, new_args); + return std::make_shared(new_args.at(0), new_args.at(1), m_specialZero); +} + +bool OutShapeOfReshape::visit_attributes(ngraph::AttributeVisitor& visitor) { + visitor.on_attribute("special_zero", m_specialZero); + return true; +} + + +} // namespace op +} // namespace vpu +} // namespace ngraph diff --git a/inference-engine/src/vpu/common/src/ngraph/operations/static_shape_broadcast.cpp b/inference-engine/src/vpu/common/src/ngraph/operations/static_shape_broadcast.cpp new file mode 100644 index 00000000000..333947c7589 --- /dev/null +++ b/inference-engine/src/vpu/common/src/ngraph/operations/static_shape_broadcast.cpp @@ -0,0 +1,147 @@ +// Copyright (C) 2020 Intel Corporation +// SPDX-License-Identifier: Apache-2.0 +// + +#include "vpu/ngraph/operations/static_shape_broadcast.hpp" + +#include "vpu/utils/error.hpp" + +#include "ngraph/opsets/opset3.hpp" +#include "ngraph/evaluator.hpp" + +namespace ngraph { namespace vpu { namespace op { + +namespace { + +HostTensorVector evaluateShapeOf(Node* node, const HostTensorVector&) { + auto shapeOf = as_type(node); + const auto inputValue = shapeOf->input_value(0); + const auto outputValue = shapeOf->output(0); + const auto inputTensors = + HostTensorVector{std::make_shared(inputValue)}; + const auto outputTensors = + HostTensorVector{std::make_shared(outputValue)}; + + shapeOf->evaluate(outputTensors, inputTensors); + return outputTensors; +} + +HostTensorVector evaluateConstant(Node* node, const HostTensorVector&) { + const auto constantNode = as_type(node); + const auto constant = std::make_shared(*constantNode); + + const auto outputTensor = std::make_shared(constant); + + return {outputTensor}; +} + +HostTensorVector evaluateOp(Node* node, const HostTensorVector& inputTensors) { + HostTensorVector outputTensors; + for (const auto& output : node->outputs()) { + outputTensors.push_back(std::make_shared(output)); + } + + node->evaluate(outputTensors, inputTensors); + return outputTensors; +} + +PartialShape evaluateTargetShape(const Output& value) { + static Evaluator::op_handler_map handlers = { + {opset3::ShapeOf::type_info, evaluateShapeOf}, + {opset3::Constant::type_info, evaluateConstant}, + {opset3::Gather::type_info, evaluateOp}, + {opset3::Concat::type_info, evaluateOp}}; + Evaluator::value_map value_map; + Evaluator evaluator(handlers, value_map); + + const auto shapeTensor = evaluator.evaluate(value); + if (!shapeTensor || !shapeTensor->get_is_allocated()) { + return PartialShape::dynamic(); + } + const auto shapeConstNode = std::make_shared(shapeTensor); + const auto resultShape = Shape{shapeConstNode->cast_vector()}; + + return resultShape; +} + +} // namespace + +constexpr NodeTypeInfo StaticShapeBroadcast::type_info; + +StaticShapeBroadcast::StaticShapeBroadcast(const Output& arg, + const Output& targetShape, + const Output& axesMapping, + const ngraph::op::BroadcastModeSpec& broadcastSpec) + : ::ngraph::op::util::BroadcastBase{arg, targetShape, axesMapping, broadcastSpec}, + m_evaluatedOutputShape{PartialShape::dynamic()} { + constructor_validate_and_infer_types(); +} + +StaticShapeBroadcast::StaticShapeBroadcast(const Output& arg, + const Output& targetShape, + const ngraph::op::BroadcastModeSpec& broadcastSpec) + : ::ngraph::op::util::BroadcastBase{arg, targetShape, broadcastSpec}, + m_evaluatedOutputShape{PartialShape::dynamic()} { + constructor_validate_and_infer_types(); +} + +void StaticShapeBroadcast::validate_and_infer_types() { + if (m_mode.m_type == ngraph::op::BroadcastType::EXPLICIT) { + NODE_VALIDATION_CHECK(this, get_input_size() == 3, + "StaticShapeBroadcast (", get_friendly_name(), ") ", + "with explicit mode must have 3 inputs, provided: ", + get_input_size()); + } else if (m_mode.m_type == ngraph::op::BroadcastType::NUMPY) { + NODE_VALIDATION_CHECK(this, get_input_size() == 2, + "StaticShapeBroadcast (", get_friendly_name(), ") ", + "with numpy mode must have 2 inputs, provided: ", + get_input_size()); + } else { + NODE_VALIDATION_CHECK(this, false, + "StaticShapeBroadcast (", get_friendly_name(), ") ", + "doesn't support ", m_mode.m_type, " mode"); + } + + ::ngraph::op::util::BroadcastBase::validate_and_infer_types(); + + if (get_output_partial_shape(0).is_dynamic()) { + // Try to evaluate output shape. After some transformations further, we may not be able + // to evaluate the target shape again, then we will leave the evaluated shape unchanged. + // For example, DynamicToStaticShapeShapeOf remove ShapeOf and pass the second input of DSR. + const auto evaluatedTargetShape = evaluateTargetShape(input_value(1)); + if (evaluatedTargetShape.is_static()) { + m_evaluatedOutputShape = evaluatedTargetShape; + } + NODE_VALIDATION_CHECK(this, m_evaluatedOutputShape.is_static(), + "StaticShapeBroadcast (", get_friendly_name(), ") ", + "can't evaluate output shape, got: ", m_evaluatedOutputShape); + set_output_type(0, get_input_element_type(0), m_evaluatedOutputShape); + } +} + +std::shared_ptr StaticShapeBroadcast::clone_with_new_inputs(const OutputVector& newInputs) const { + check_new_args_count(this, newInputs); + if (newInputs.size() == 2) { + return std::make_shared( + newInputs.at(0), newInputs.at(1), m_mode); + } else { + return std::make_shared( + newInputs.at(0), newInputs.at(1), newInputs.at(2), m_mode); + } +} + +bool StaticShapeBroadcast::visit_attributes(ngraph::AttributeVisitor& visitor) { + std::string mode; + if (m_mode.m_type == ngraph::op::BroadcastType::EXPLICIT) { + mode = "explicit"; + } else if (m_mode.m_type == ngraph::op::BroadcastType::NUMPY) { + mode = "numpy"; + } + visitor.on_attribute("mode", mode); + + return true; +} + +} // namespace op +} // namespace vpu +} // namespace ngraph diff --git a/inference-engine/src/vpu/common/src/ngraph/operations/static_shape_nonzero.cpp b/inference-engine/src/vpu/common/src/ngraph/operations/static_shape_nonzero.cpp index a694274e2cd..eff8a6dba0b 100644 --- a/inference-engine/src/vpu/common/src/ngraph/operations/static_shape_nonzero.cpp +++ b/inference-engine/src/vpu/common/src/ngraph/operations/static_shape_nonzero.cpp @@ -4,12 +4,14 @@ #include "vpu/ngraph/operations/static_shape_nonzero.hpp" +#include "ngraph/runtime/host_tensor.hpp" + namespace ngraph { namespace vpu { namespace op { constexpr NodeTypeInfo StaticShapeNonZero::type_info; -StaticShapeNonZero::StaticShapeNonZero(const Output& input) - : Op({input}) { +StaticShapeNonZero::StaticShapeNonZero(const Output& input, const element::Type& output_type) + : Op({input}), m_output_type(output_type) { constructor_validate_and_infer_types(); } @@ -28,21 +30,132 @@ void StaticShapeNonZero::validate_and_infer_types() { "StaticShapeNonZero input data type needs to be a numeric type. Got: ", input_et); + NODE_VALIDATION_CHECK(this, + m_output_type == element::i32 || m_output_type == element::i64, + "StaticShapeNonZero output data type can be either i32 or i64"); + const auto total_dim_size = Dimension(shape_size(arg_shape.to_shape())); - set_output_type(0, element::i64, {arg_shape.rank(), total_dim_size}); - set_output_type(1, element::i64, {Dimension(2)}); + set_output_type(0, m_output_type, {arg_shape.rank(), total_dim_size}); + set_output_type(1, m_output_type, {Dimension(2)}); } std::shared_ptr StaticShapeNonZero::copy_with_new_args( const NodeVector& new_args) const { check_new_args_count(this, new_args); - return std::make_shared(new_args.at(0)); + return std::make_shared(new_args.at(0), m_output_type); } bool StaticShapeNonZero::visit_attributes(ngraph::AttributeVisitor& visitor) { + visitor.on_attribute("output_type", m_output_type); return true; } +namespace { + +template +void staticShapeNonZeroReference(const InType* input, OutType* outIndices, OutType* outShape, const Shape& inputShape) { + auto strides = row_major_strides(inputShape); + auto totalDimSize = shape_size(inputShape); + + const auto getCoord = [&strides](int offset){ + std::vector coord; + for (const size_t& stride : strides) { + coord.insert(coord.begin(), offset / stride); + offset %= stride; + } + + return coord; + }; + + const auto addCoordToIndices = [&outIndices, &totalDimSize](const std::vector &coord, + size_t nonZeroCount) { + for (int j = 0; j < coord.size(); ++j) { + outIndices[j * totalDimSize + nonZeroCount] = coord[j]; + } + }; + + const InType zeroValue = InType{0}; + const auto isNonZero = [&input, &zeroValue](size_t i) { + return input[i] != zeroValue; + }; + + size_t nonZeroCount = 0; + for (size_t i = 0; i < totalDimSize; ++i) { + if (isNonZero(i)) { + addCoordToIndices(getCoord(i), nonZeroCount++); + } + } + + outShape[0] = nonZeroCount; + outShape[1] = inputShape.size(); +} + +template +bool evaluate(const HostTensorPtr& input, + const HostTensorPtr& outIndices, + const HostTensorPtr& outShape) { + bool rc = true; + + switch (outIndices->get_element_type()) { + case element::Type_t::i64: + staticShapeNonZeroReference(input->get_data_ptr(), + outIndices->get_data_ptr(), + outShape->get_data_ptr(), + input->get_shape()); + break; + case element::Type_t::i32: + staticShapeNonZeroReference(input->get_data_ptr(), + outIndices->get_data_ptr(), + outShape->get_data_ptr(), + input->get_shape()); + break; + default: rc = false; break; + } + + return rc; +} + +bool evaluateStaticShapeNonZero(const HostTensorPtr& input, + const HostTensorPtr& outIndices, + const HostTensorPtr& outShape) { + bool rc = true; + + switch (input->get_element_type()) { + TYPE_CASE(i8)(input, outIndices, outShape); + break; + TYPE_CASE(i16)(input, outIndices, outShape); + break; + TYPE_CASE(i32)(input, outIndices, outShape); + break; + TYPE_CASE(i64)(input, outIndices, outShape); + break; + TYPE_CASE(u8)(input, outIndices, outShape); + break; + TYPE_CASE(u16)(input, outIndices, outShape); + break; + TYPE_CASE(u32)(input, outIndices, outShape); + break; + TYPE_CASE(u64)(input, outIndices, outShape); + break; + TYPE_CASE(bf16)(input, outIndices, outShape); + break; + TYPE_CASE(f32)(input, outIndices, outShape); + break; + TYPE_CASE(f64)(input, outIndices, outShape); + break; + default: rc = false; break; + } + + return rc; +} + +} // namespace + +bool StaticShapeNonZero::evaluate(const HostTensorVector& outputs, + const HostTensorVector& inputs) { + return evaluateStaticShapeNonZero(inputs[0], outputs[0], outputs[1]); +} + } // namespace op } // namespace vpu } // namespace ngraph diff --git a/inference-engine/src/vpu/common/src/ngraph/transformations/dynamic_to_static_shape.cpp b/inference-engine/src/vpu/common/src/ngraph/transformations/dynamic_to_static_shape.cpp index b7d4a8af364..a412e773d7a 100644 --- a/inference-engine/src/vpu/common/src/ngraph/transformations/dynamic_to_static_shape.cpp +++ b/inference-engine/src/vpu/common/src/ngraph/transformations/dynamic_to_static_shape.cpp @@ -2,15 +2,22 @@ // SPDX-License-Identifier: Apache-2.0 // +#include "vpu/ngraph/transformations/dynamic_to_static_shape_broadcast.hpp" +#include "vpu/ngraph/transformations/dynamic_to_static_shape_concat.hpp" #include "vpu/ngraph/transformations/dynamic_to_static_shape_unary_elementwise.hpp" #include "vpu/ngraph/transformations/dynamic_to_static_shape_roialign.hpp" #include "vpu/ngraph/transformations/dynamic_to_static_shape_transpose.hpp" +#include "vpu/ngraph/transformations/dynamic_to_static_shape_variadic_split.hpp" #include "vpu/ngraph/transformations/dynamic_to_static_shape_non_max_suppression.hpp" #include "vpu/ngraph/transformations/dynamic_to_static_shape_nonzero.hpp" #include "vpu/ngraph/transformations/dynamic_to_static_shape_binary_elementwise.hpp" #include "vpu/ngraph/transformations/dynamic_to_static_shape.hpp" #include "vpu/ngraph/transformations/dynamic_to_static_shape_squeeze.hpp" #include "vpu/ngraph/transformations/dynamic_to_static_shape_unsqueeze.hpp" +#include "vpu/ngraph/transformations/dynamic_to_static_shape_gather.hpp" +#include "vpu/ngraph/transformations/dynamic_to_static_shape_shapeof.hpp" +#include "vpu/ngraph/transformations/dynamic_to_static_shape_reshape.hpp" + #include "vpu/utils/error.hpp" #include "ngraph/opsets/opset3.hpp" @@ -27,7 +34,13 @@ using namespace ngraph; bool isDynamic(const Node& node) { const auto& outputs = node.outputs(); - return std::any_of(outputs.cbegin(), outputs.cend(), [](const Output& output) { return output.get_partial_shape().is_dynamic(); }); + return std::any_of(outputs.cbegin(), outputs.cend(), [](const Output& output) { + VPU_THROW_UNLESS(output.get_partial_shape().rank() != ngraph::Rank::dynamic(), + "DynamicToStaticShape transformation: got dynamic rank for {} with type {} while only static is supported", + output.get_node_shared_ptr()->get_friendly_name(), output.get_node_shared_ptr()->get_type_name()); + + return output.get_partial_shape().is_dynamic(); + }); } bool validateStaticShapes(const ngraph::Function& function) { @@ -44,12 +57,14 @@ const Transformations& getDefaultTransformations() { {ngraph::opset3::Add::type_info, dynamicToStaticShapeBinaryEltwise}, {ngraph::opset3::Multiply::type_info, dynamicToStaticShapeBinaryEltwise}, {ngraph::opset3::Subtract::type_info, dynamicToStaticShapeBinaryEltwise}, + {ngraph::opset3::VariadicSplit::type_info, dynamicToStaticShapeVariadicSplit}, {ngraph::opset3::Divide::type_info, dynamicToStaticShapeBinaryEltwise}, {ngraph::opset3::Equal::type_info, dynamicToStaticShapeBinaryEltwise}, {ngraph::opset3::Power::type_info, dynamicToStaticShapeBinaryEltwise}, {ngraph::opset3::NonMaxSuppression::type_info, dynamicToStaticNonMaxSuppression}, {ngraph::opset3::NonZero::type_info, dynamicToStaticShapeNonZero}, {ngraph::opset3::Transpose::type_info, dynamicToStaticShapeTranspose}, + {ngraph::opset3::Concat::type_info, dynamicToStaticShapeConcat}, {ngraph::opset3::Convert::type_info, dynamicToStaticUnaryElementwise}, {ngraph::opset3::Clamp::type_info, dynamicToStaticUnaryElementwise}, {ngraph::opset3::Floor::type_info, dynamicToStaticUnaryElementwise}, @@ -59,8 +74,11 @@ const Transformations& getDefaultTransformations() { {ngraph::opset3::Sigmoid::type_info, dynamicToStaticUnaryElementwise}, {ngraph::opset3::Sqrt::type_info, dynamicToStaticUnaryElementwise}, {ngraph::opset3::Squeeze::type_info, dynamicToStaticShapeSqueeze}, + {ngraph::opset3::Gather::type_info, dynamicToStaticShapeGather}, {ngraph::opset3::Unsqueeze::type_info, dynamicToStaticShapeUnsqueeze}, {ngraph::opset3::ROIAlign::type_info, dynamicToStaticShapeROIAlign}, + {ngraph::opset3::Reshape::type_info, dynamicToStaticShapeReshape}, + {ngraph::opset3::Broadcast::type_info, dynamicToStaticShapeBroadcast}, }; return transformations; } @@ -80,8 +98,8 @@ DynamicToStaticShape::DynamicToStaticShape(const Transformations& specificTransf transformations.emplace(ngraph::opset3::Result::type_info, [](const std::shared_ptr&){}); } -void DynamicToStaticShape::transform(ngraph::Function& function) const { - for (const auto& operation : function.get_ordered_ops()) { +void DynamicToStaticShape::transform(std::shared_ptr function) const { + for (const auto& operation : function->get_ordered_ops()) { if (!isDynamic(*operation)) { continue; } @@ -94,8 +112,11 @@ void DynamicToStaticShape::transform(ngraph::Function& function) const { transformation->second(operation); } - function.validate_nodes_and_infer_types(); - validateStaticShapes(function); + // Should be executed after all dynamic-to-static transformations + DynamicToStaticShapeShapeOf().run_on_function(function); + + function->validate_nodes_and_infer_types(); + validateStaticShapes(*function); } } // namespace vpu diff --git a/inference-engine/src/vpu/common/src/ngraph/transformations/dynamic_to_static_shape_broadcast.cpp b/inference-engine/src/vpu/common/src/ngraph/transformations/dynamic_to_static_shape_broadcast.cpp new file mode 100644 index 00000000000..122002591c6 --- /dev/null +++ b/inference-engine/src/vpu/common/src/ngraph/transformations/dynamic_to_static_shape_broadcast.cpp @@ -0,0 +1,47 @@ +// Copyright (C) 2020 Intel Corporation +// SPDX-License-Identifier: Apache-2.0 +// + +#include "vpu/ngraph/transformations/dynamic_to_static_shape_broadcast.hpp" + +#include "vpu/ngraph/operations/static_shape_broadcast.hpp" +#include "vpu/ngraph/operations/dynamic_shape_resolver.hpp" +#include "vpu/utils/error.hpp" + +#include "ngraph/graph_util.hpp" +#include "ngraph/opsets/opset3.hpp" + +#include + +namespace vpu { + +void dynamicToStaticShapeBroadcast(std::shared_ptr target) { + const auto broadcast = ngraph::as_type_ptr(target); + VPU_THROW_UNLESS(broadcast, + "dynamicToStaticShapeBroadcast transformation is not applicable for {}, " + "it should be {} instead", + target, ngraph::opset3::Broadcast::type_info.name); + + std::shared_ptr staticShapeBroadcast; + if (broadcast->get_broadcast_spec() == ngraph::op::BroadcastType::EXPLICIT) { + staticShapeBroadcast = std::make_shared( + broadcast->input_value(0), + broadcast->input_value(1), + broadcast->input_value(2)); + } else if (broadcast->get_broadcast_spec() == ngraph::op::BroadcastType::NUMPY) { + staticShapeBroadcast = std::make_shared( + broadcast->input_value(0), + broadcast->input_value(1)); + } else { + VPU_THROW_FORMAT("dynamicToStaticShapeBroadcast supports only explicit and numpy modes," + "provided {}", broadcast->get_broadcast_spec().m_type); + } + + auto dsr = std::make_shared( + staticShapeBroadcast->output(0), broadcast->input_value(1)); + + ngraph::replace_node(std::move(target), std::move(dsr)); +} + +} // namespace vpu + diff --git a/inference-engine/src/vpu/common/src/ngraph/transformations/dynamic_to_static_shape_concat.cpp b/inference-engine/src/vpu/common/src/ngraph/transformations/dynamic_to_static_shape_concat.cpp new file mode 100644 index 00000000000..ae111b13b81 --- /dev/null +++ b/inference-engine/src/vpu/common/src/ngraph/transformations/dynamic_to_static_shape_concat.cpp @@ -0,0 +1,116 @@ +// Copyright (C) 2020 Intel Corporation +// SPDX-License-Identifier: Apache-2.0 +// + +#include "vpu/ngraph/transformations/dynamic_to_static_shape_concat.hpp" + +#include "vpu/ngraph/operations/dynamic_shape_resolver.hpp" +#include + +#include "ngraph/graph_util.hpp" +#include "ngraph/opsets/opset3.hpp" + +#include +#include +#include + +namespace vpu { + +void dynamicToStaticShapeConcat(std::shared_ptr target) { + const auto inputs = target->input_values(); + + ngraph::OutputVector dsrInputs; + ngraph::OutputVector staticInputs; + for (const auto& input : inputs) { + const auto inputNode = input.get_node_shared_ptr(); + if (ngraph::as_type_ptr(inputNode)) { + dsrInputs.emplace_back(input); + } else { + staticInputs.emplace_back(input); + } + } + + VPU_THROW_UNLESS(!dsrInputs.empty(), + "DynamicToStaticShape transformation for {} of type {} expects at least " + "one {} as input, actual types: {}", target->get_friendly_name(), + target->get_type_info().name, ngraph::vpu::op::DynamicShapeResolver::type_info.name, + std::accumulate(inputs.begin(), inputs.end(), std::string(), []( + const std::string& typesStr, const ngraph::Output& input) { + return typesStr + input.get_node_shared_ptr()->get_type_info().name + ", "; + })); + + const auto firstDSRInputNode = dsrInputs.front().get_node_shared_ptr(); + const auto shapeDataType = firstDSRInputNode->input(1).get_element_type(); + const auto dataRank = firstDSRInputNode->get_output_partial_shape(0).rank().get_length(); + const auto axis = ngraph::as_type_ptr(target)->get_concatenation_axis(); + + const auto shapeToConstant = [&shapeDataType, &dataRank](const ngraph::Shape& shape) { + return ngraph::opset3::Constant::create( + shapeDataType, {static_cast(dataRank)}, shape)->output(0); + }; + + const auto getShapeFromDSR = [&target, &shapeDataType](const ngraph::Output& dsrOutput) { + const auto dsrNode = dsrOutput.get_node_shared_ptr(); + const auto dsrShapeInputValue = dsrNode->input_value(1); + VPU_THROW_UNLESS(dsrShapeInputValue.get_element_type() == shapeDataType, + "DynamicToStaticShape transformation for {} of type {} expects input " + "shape with {} type from {} argument of type {}, provided {}", + target->get_friendly_name(), target->get_type_info().name, + shapeDataType, dsrNode->get_friendly_name(), dsrNode->get_type_info().name, + dsrShapeInputValue.get_element_type()); + return dsrShapeInputValue; + }; + + const auto sumOfShapes = [](const ngraph::Output& shape1, + const ngraph::Output& shape2) { + const auto shapeAccumulatorOp = std::make_shared(shape1, shape2); + return shapeAccumulatorOp->output(0); + }; + + const auto divideDimsByNumOfInputsExceptAxis = [&target, &dataRank, &axis, + &shapeDataType, &shapeToConstant]( + const ngraph::Output& shape) { + ngraph::Shape dividerValues(dataRank, target->get_input_size()); + dividerValues[axis] = 1; + const auto divider = shapeToConstant(dividerValues); + const auto divide = std::make_shared(shape, divider); + return divide->output(0); + }; + + const auto getAdditionalShapeFromStatic = [&target, &dataRank, &axis]( + const ngraph::OutputVector& staticInputs) { + ngraph::Shape accumulatedStaticShapeValue(dataRank, 0); + for (const auto& staticInput : staticInputs) { + const auto& staticInputPartialShape = staticInput.get_partial_shape(); + VPU_THROW_UNLESS(staticInputPartialShape.is_static(), + "DynamicToStaticShape transformation for {} of type {} expects static " + "shape on inputs without DSR", target->get_friendly_name(), + target->get_type_info().name); + accumulatedStaticShapeValue[axis] += static_cast(staticInputPartialShape[axis]); + } + return accumulatedStaticShapeValue; + }; + + auto accumulatedShape = getShapeFromDSR(dsrInputs.front()); + for (size_t dsrInputIdx = 1; dsrInputIdx < dsrInputs.size(); ++dsrInputIdx) { + const auto dsrInputShape = getShapeFromDSR(dsrInputs[dsrInputIdx]); + accumulatedShape = sumOfShapes(accumulatedShape, dsrInputShape); + } + + if (dsrInputs.size() > 1) { + accumulatedShape = divideDimsByNumOfInputsExceptAxis(accumulatedShape); + } + + if (!staticInputs.empty()) { + const auto accumulatedStaticShape = shapeToConstant(getAdditionalShapeFromStatic(staticInputs)); + accumulatedShape = sumOfShapes(accumulatedShape, accumulatedStaticShape); + } + + const auto copied = target->clone_with_new_inputs(target->input_values()); + const auto outDsr = std::make_shared( + copied, accumulatedShape); + + ngraph::replace_node(std::move(target), outDsr); +} + +} // namespace vpu diff --git a/inference-engine/src/vpu/common/src/ngraph/transformations/dynamic_to_static_shape_gather.cpp b/inference-engine/src/vpu/common/src/ngraph/transformations/dynamic_to_static_shape_gather.cpp new file mode 100644 index 00000000000..88e30df027c --- /dev/null +++ b/inference-engine/src/vpu/common/src/ngraph/transformations/dynamic_to_static_shape_gather.cpp @@ -0,0 +1,78 @@ +// Copyright (C) 2020 Intel Corporation +// SPDX-License-Identifier: Apache-2.0 +// + +#include "vpu/ngraph/transformations/dynamic_to_static_shape_gather.hpp" + +#include "vpu/ngraph/operations/dynamic_shape_resolver.hpp" +#include + +#include "ngraph/graph_util.hpp" +#include "ngraph/opsets/opset3.hpp" + +#include +#include + +namespace vpu { + +void dynamicToStaticShapeGather(std::shared_ptr target) { + const auto gather = ngraph::as_type_ptr(target); + VPU_THROW_UNLESS(gather, "dynamicToStaticShapeGather transformation is not applicable for {}, it should be {} instead", + target, ngraph::opset3::Gather::type_info); + + int64_t axis = gather->get_axis(); + VPU_THROW_UNLESS(axis != std::numeric_limits::max() && axis >= 0, + "dynamicToStaticShapeGather: Unsupported Gather axis {} for node {}", axis, gather); + + auto shapeToConstant = [&gather](const ngraph::Output & output) -> std::shared_ptr { + VPU_THROW_UNLESS(output.get_partial_shape().is_static(), + "DynamicToStaticShape transformation for {} of type {} expects static shape on inputs without DSR", + gather->get_friendly_name(), gather->get_type_info()); + return ngraph::opset3::Constant::create(ngraph::element::i64, {output.get_shape().size()}, output.get_shape()); + }; + + const auto dataDSR = ngraph::as_type_ptr(gather->input_value(0).get_node_shared_ptr()); + const auto idxDSR = ngraph::as_type_ptr(gather->input_value(1).get_node_shared_ptr()); + + VPU_THROW_UNLESS(dataDSR || idxDSR, "DynamicToStaticShape transformation for {} of type {} expects at least one DSR as input", + gather->get_friendly_name(), gather->get_type_info()); + + const auto data_shape = dataDSR ? dataDSR->input_value(1) : shapeToConstant(gather->input_value(0)); + const auto indices_shape = idxDSR ? idxDSR->input_value(1) : shapeToConstant(gather->input_value(1)); + + const auto copied = target->clone_with_new_inputs(target->input_values()); + + + const auto & data_rank = data_shape.get_partial_shape(); + const auto & indices_rank = indices_shape.get_partial_shape(); + VPU_THROW_UNLESS(data_rank.is_static() && indices_rank.is_static(), + "DynamicToStaticShape transformation for {} doesn't support dynamic rank", gather); + + const auto data_rank_value = data_rank[0].get_length(); + const auto indices_rank_value = indices_rank[0].get_length(); + ngraph::OutputVector output_dims; + if (axis) { + std::vector first_data_shape_part_indices(axis); + std::iota(first_data_shape_part_indices.begin(), first_data_shape_part_indices.end(), 0); + const auto first_data_shape_part = std::make_shared( + data_shape, + ngraph::opset3::Constant::create(ngraph::element::i64, {first_data_shape_part_indices.size()}, first_data_shape_part_indices), + ngraph::opset3::Constant::create(ngraph::element::i64, {1}, {0})); + output_dims.push_back(first_data_shape_part); + } + if (indices_rank_value) + output_dims.push_back(indices_shape); + if (axis + 1 < data_rank_value) { + std::vector second_data_shape_part_indices(data_rank_value - axis - 1); + std::iota(second_data_shape_part_indices.begin(), second_data_shape_part_indices.end(), axis + 1); + const auto second_data_shape_part = std::make_shared( + data_shape, + ngraph::opset3::Constant::create(ngraph::element::i64, {second_data_shape_part_indices.size()}, second_data_shape_part_indices), + ngraph::opset3::Constant::create(ngraph::element::i64, {1}, {0})); + output_dims.push_back(second_data_shape_part); + } + const auto output_shape = std::make_shared(output_dims, 0); + ngraph::replace_node(target, std::make_shared(copied, output_shape)); +} + +} // namespace vpu diff --git a/inference-engine/src/vpu/common/src/ngraph/transformations/dynamic_to_static_shape_nonzero.cpp b/inference-engine/src/vpu/common/src/ngraph/transformations/dynamic_to_static_shape_nonzero.cpp index 570a68b164e..abc82a02cb6 100644 --- a/inference-engine/src/vpu/common/src/ngraph/transformations/dynamic_to_static_shape_nonzero.cpp +++ b/inference-engine/src/vpu/common/src/ngraph/transformations/dynamic_to_static_shape_nonzero.cpp @@ -6,15 +6,21 @@ #include "vpu/ngraph/operations/static_shape_nonzero.hpp" #include "vpu/ngraph/operations/dynamic_shape_resolver.hpp" +#include "vpu/utils/error.hpp" #include "ngraph/graph_util.hpp" +#include "ngraph/ops.hpp" #include namespace vpu { -void dynamicToStaticShapeNonZero(std::shared_ptr nonZero) { - auto staticShapeNonZero = std::make_shared(nonZero->input(0).get_source_output()); +void dynamicToStaticShapeNonZero(std::shared_ptr node) { + auto nonZero = std::dynamic_pointer_cast(node); + VPU_THROW_UNLESS(nonZero, "dynamicToStaticShapeNonZero transformation for {} of type {} expects {} as node for replacement", + node->get_friendly_name(), node->get_type_info(), ngraph::op::v3::NonZero::type_info); + + auto staticShapeNonZero = std::make_shared(nonZero->input(0).get_source_output(), nonZero->get_output_type()); staticShapeNonZero->set_friendly_name(nonZero->get_friendly_name() + "/static_shape"); auto dynamicShapeResolver = std::make_shared( diff --git a/inference-engine/src/vpu/common/src/ngraph/transformations/dynamic_to_static_shape_reshape.cpp b/inference-engine/src/vpu/common/src/ngraph/transformations/dynamic_to_static_shape_reshape.cpp new file mode 100644 index 00000000000..c1267f581a3 --- /dev/null +++ b/inference-engine/src/vpu/common/src/ngraph/transformations/dynamic_to_static_shape_reshape.cpp @@ -0,0 +1,40 @@ +// Copyright (C) 2020 Intel Corporation +// SPDX-License-Identifier: Apache-2.0 +// + +#include "vpu/ngraph/transformations/dynamic_to_static_shape_reshape.hpp" + +#include "vpu/ngraph/operations/dynamic_shape_resolver.hpp" +#include "vpu/ngraph/operations/out_shape_of_reshape.hpp" +#include + +#include "ngraph/graph_util.hpp" +#include "ngraph/opsets/opset3.hpp" + +#include + +namespace vpu { + +void dynamicToStaticShapeReshape(std::shared_ptr target) { + const auto dsr = target->get_argument(0); + VPU_THROW_UNLESS(ngraph::as_type_ptr(dsr), + "DynamicToStaticShape transformation for {} of type {} expects {} as input with index {}", + target->get_friendly_name(), target->get_type_info(), ngraph::vpu::op::DynamicShapeResolver::type_info, 0); + + const auto outShapeDescriptor = target->get_argument(1); + VPU_THROW_UNLESS(ngraph::as_type_ptr(outShapeDescriptor), + "DynamicToStaticShape transformation for {] of type {} expects {} as input with index {}", + target->get_friendly_name(), target->get_type_info(), ngraph::opset3::Constant::type_info, 1); + + const auto reshape = std::dynamic_pointer_cast(target); + const auto copied = reshape->clone_with_new_inputs(target->input_values()); + const auto inDataShape = dsr->input(1).get_source_output(); + + const auto outShapeOfReshape = std::make_shared( + inDataShape, outShapeDescriptor, reshape->get_special_zero()); + + ngraph::replace_node(std::move(target), std::make_shared( + copied, outShapeOfReshape)); +} + +} // namespace vpu diff --git a/inference-engine/src/vpu/common/src/ngraph/transformations/dynamic_to_static_shape_shapeof.cpp b/inference-engine/src/vpu/common/src/ngraph/transformations/dynamic_to_static_shape_shapeof.cpp new file mode 100644 index 00000000000..2157883fe76 --- /dev/null +++ b/inference-engine/src/vpu/common/src/ngraph/transformations/dynamic_to_static_shape_shapeof.cpp @@ -0,0 +1,41 @@ +// Copyright (C) 2020 Intel Corporation +// SPDX-License-Identifier: Apache-2.0 +// + +#include "vpu/ngraph/transformations/dynamic_to_static_shape_shapeof.hpp" + +#include +#include + +#include + +namespace vpu { + +DynamicToStaticShapeShapeOf::DynamicToStaticShapeShapeOf() : GraphRewrite() { + // We don't set strict_mode when use pattern Matcher, + // so we can set any type and shape for input. + auto inputWithAnyTypeAndShape = std::make_shared( + ngraph::element::dynamic, ngraph::PartialShape{}); + auto shapeOfPattern = std::make_shared(inputWithAnyTypeAndShape); + + ngraph::graph_rewrite_callback callback = [](ngraph::pattern::Matcher &m) { + auto shapeOfNode = std::dynamic_pointer_cast(m.get_match_root()); + if (!shapeOfNode) { + return false; + } + + auto dsr = shapeOfNode->input_value(0).get_node_shared_ptr(); + if (!ngraph::as_type_ptr(dsr)) { + return false; + } + + ngraph::replace_node(shapeOfNode, dsr->input_value(1).get_node_shared_ptr()); + + return true; + }; + + auto m = std::make_shared(shapeOfPattern, "DynamicToStaticShapeShapeOf"); + this->add_matcher(m, callback, ngraph::pass::PassProperty::CHANGE_DYNAMIC_STATE); +} + +} // namespace vpu diff --git a/inference-engine/src/vpu/common/src/ngraph/transformations/dynamic_to_static_shape_transpose.cpp b/inference-engine/src/vpu/common/src/ngraph/transformations/dynamic_to_static_shape_transpose.cpp index 3fa3dad6aa8..ac1bb3a6c1d 100644 --- a/inference-engine/src/vpu/common/src/ngraph/transformations/dynamic_to_static_shape_transpose.cpp +++ b/inference-engine/src/vpu/common/src/ngraph/transformations/dynamic_to_static_shape_transpose.cpp @@ -30,9 +30,9 @@ void dynamicToStaticShapeTranspose(std::shared_ptr target) { const auto shape = dsr->input(1).get_source_output(); const auto axis = std::make_shared( - ngraph::element::u64, + ngraph::element::i64, ngraph::Shape{std::initializer_list{1}}, - std::vector{0}); + std::vector{0}); const auto scatterElementsUpdate = std::make_shared(shape, transposition, shape, axis); ngraph::replace_node(std::move(target), std::make_shared(copied, scatterElementsUpdate)); } diff --git a/inference-engine/src/vpu/common/src/ngraph/transformations/dynamic_to_static_shape_variadic_split.cpp b/inference-engine/src/vpu/common/src/ngraph/transformations/dynamic_to_static_shape_variadic_split.cpp new file mode 100644 index 00000000000..9828c00c04f --- /dev/null +++ b/inference-engine/src/vpu/common/src/ngraph/transformations/dynamic_to_static_shape_variadic_split.cpp @@ -0,0 +1,77 @@ +// Copyright (C) 2020 Intel Corporation +// SPDX-License-Identifier: Apache-2.0 +// + +#include "vpu/ngraph/transformations/dynamic_to_static_shape_variadic_split.hpp" + +#include "vpu/ngraph/operations/dynamic_shape_resolver.hpp" +#include + +#include "ngraph/graph_util.hpp" +#include "ngraph/opsets/opset3.hpp" + +#include +#include +#include + +namespace vpu { + +void dynamicToStaticShapeVariadicSplit(std::shared_ptr target) { + const auto dsr = ngraph::as_type_ptr(target->input_value(0).get_node_shared_ptr()); + VPU_THROW_UNLESS(dsr, "DynamicToStaticShape transformation for {} of type {} expects {} as input with index {}", + target->get_friendly_name(), target->get_type_info(), ngraph::vpu::op::DynamicShapeResolver::type_info, 0); + + const auto axis_node = ngraph::as_type_ptr(target->input_value(1).get_node_shared_ptr()); + VPU_THROW_UNLESS(axis_node, "dynamicToStaticShapeVariadic transformation is not applicable for {}, dynamic axis is not supported", target); + + const auto data_rank = target->get_input_partial_shape(0).rank(); + VPU_THROW_UNLESS(data_rank.is_static(), "dynamicToStaticShapeVariadic transformation for {} doesn't support dynamic rank", target); + + int64_t axis = ngraph::normalize_axis(target->description(), axis_node->cast_vector()[0], data_rank); + + const auto split_lengths_node = ngraph::as_type_ptr(target->input_value(2).get_node_shared_ptr()); + VPU_THROW_UNLESS(split_lengths_node, "dynamicToStaticShapeVariadic transformation is not applicable for {}, dynamic split_length is not supported", target); + const auto split_lengths = split_lengths_node->cast_vector(); + + for (const auto & i : split_lengths) { + VPU_THROW_UNLESS(i != -1, "dynamicToStaticShapeVariadic transformation is not applicable for {}, split_length with -1 is not supported", target); + VPU_THROW_UNLESS(i > 0, "dynamicToStaticShapeVariadic transformation is not applicable for {}, non-positive split_length is not supported", target); + } + + const auto data_shape = dsr->input_value(1).get_node_shared_ptr(); + const auto copied = target->clone_with_new_inputs(target->input_values()); + const auto data_rank_value = data_rank.get_length(); + ngraph::OutputVector first_shape_part, second_shape_part; + if (axis) { + std::vector first_data_shape_part_indices(axis); + std::iota(first_data_shape_part_indices.begin(), first_data_shape_part_indices.end(), 0); + const auto first_data_shape_part = std::make_shared( + data_shape, + ngraph::opset3::Constant::create(ngraph::element::i64, {first_data_shape_part_indices.size()}, first_data_shape_part_indices), + ngraph::opset3::Constant::create(ngraph::element::i64, {1}, {0})); + first_shape_part.push_back(first_data_shape_part); + } + if (axis + 1 < data_rank_value) { + std::vector second_data_shape_part_indices(data_rank_value - axis - 1); + std::iota(second_data_shape_part_indices.begin(), second_data_shape_part_indices.end(), axis + 1); + const auto second_data_shape_part = std::make_shared( + data_shape, + ngraph::opset3::Constant::create(ngraph::element::i64, {second_data_shape_part_indices.size()}, second_data_shape_part_indices), + ngraph::opset3::Constant::create(ngraph::element::i64, {1}, {0})); + second_shape_part.push_back(second_data_shape_part); + } + for (auto i = 0; i < split_lengths.size(); ++i) { + const auto dim = ngraph::opset3::Constant::create(data_shape->get_element_type(), {1}, {split_lengths[i]}); + if (!first_shape_part.empty() || !second_shape_part.empty()) { + ngraph::OutputVector output_dims{dim}; + output_dims.insert(output_dims.begin(), first_shape_part.begin(), first_shape_part.end()); + output_dims.insert(output_dims.end(), second_shape_part.begin(), second_shape_part.end()); + const auto output_shape = std::make_shared(output_dims, 0); + target->output(i).replace(std::make_shared(copied->output(i), output_shape)); + } else { + target->output(i).replace(std::make_shared(copied->output(i), dim)); + } + } +} + +} // namespace vpu diff --git a/inference-engine/src/vpu/common/src/utils/simple_math.cpp b/inference-engine/src/vpu/common/src/utils/simple_math.cpp index 4b9917c0bf2..79a8179cefb 100644 --- a/inference-engine/src/vpu/common/src/utils/simple_math.cpp +++ b/inference-engine/src/vpu/common/src/utils/simple_math.cpp @@ -10,8 +10,6 @@ #include #include #include -#include -#include #include #include @@ -20,102 +18,109 @@ namespace vpu { namespace { -const std::set whitespaces = { - ' ', - '\t', +using ValueType = details::IntOrFloat; + +struct Operator { + int priority; + std::function op; }; -// priority, function -using Operator = std::pair>; - -const std::map operators = { - { '+', { 0, std::plus() } }, - { '-', { 0, std::minus() } }, - { '*', { 1, std::multiplies() } }, - { '/', { 1, std::divides() } }, - { '%', { 1, std::modulus() } }, +static const std::map operators = { + { "+", { 0, std::plus() }}, + { "-", { 0, std::minus() }}, + { "*", { 1, std::multiplies() }}, + { "/", { 1, std::divides() }}, + { "%", { 1, std::modulus() }} }; +static const std::map> function = { + {"floor", [](ValueType x) { return ValueType{std::floor(x.toFloat())}; }}, + {"ceil" , [](ValueType x) { return ValueType{std::ceil(x.toFloat())}; }}, + {"round", [](ValueType x) { return ValueType{std::round(x.toFloat())}; }}, + {"abs" , [](ValueType x) { return ValueType{std::abs(x.toFloat())}; }}, + {"sqrt" , [](ValueType x) { return ValueType{std::sqrt(x.toFloat())}; }} +}; + +bool isFunction(const std::string& token) { + return function.find(token) != function.end(); +} +bool isOperator(const std::string& token) { + return operators.find(token) != operators.end(); +} +int opPriority(const std::string& token) { + return operators.at(token).priority; +} + } // namespace -void SimpleMathExpression::parse(const std::string& expression) { +void MathExpression::parse(const std::string& expression) { _parsedTokens.clear(); + std::stack tokenStack; - std::stack operatorStack; - - // While there are tokens to be read. - for (size_t i = 0; i != expression.length(); i++) { - // Ignore whitespaces; - while (whitespaces.find(expression[i]) != whitespaces.end()) { - i++; + for (auto it = begin(expression); it != end(expression); ++it) { + if (*it == ' ' || *it == '\t') { + continue; } - // Read a token. - auto curr = expression[i]; - - // If the token is a number, then push it to the output queue. - if (std::isdigit(curr)) { + // parse number + if (std::isdigit(*it)) { size_t len = 0; - auto value = std::stoi(expression.substr(i), &len); + const auto value = std::stof(&*it, &len); - _parsedTokens.emplace_back(Token(Token::Value, value, 0)); - - i += (len - 1); + _parsedTokens.emplace_back(TokenType::Value, ValueType{value}, ""); + std::advance(it, len - 1); continue; } - // If the token is a variable, then push it's value to the output queue. - if (_vars.find(curr) != _vars.end()) { - _parsedTokens.emplace_back(Token(Token::Value, _vars.at(curr), 0)); + // parse variable/function + if (std::isalpha(*it)) { + const auto end_token = std::find_if_not(it, end(expression), + [](char c) { return std::isalnum(c) || c == '_'; }); + const auto token = std::string(it, end_token); + std::advance(it, token.length() - 1); - continue; + if (isFunction(token)) { + tokenStack.push(token); + continue; + } + if (_vars.find(token) != _vars.end()) { + _parsedTokens.emplace_back(TokenType::Value, ValueType{_vars.at(token)}, ""); + continue; + } } - // If the token is an operator, then: - if (operators.find(curr) != operators.end()) { - // While there is an operator at the top of the operator stack with - // greater than or equal to precedence: - // pop operators from the operator stack, onto the output queue; - while (!operatorStack.empty() && - (operators.find(operatorStack.top()) != operators.end()) && - (operators.at(operatorStack.top()).first >= operators.at(curr).first)) { - auto op = operatorStack.top(); - operatorStack.pop(); - - _parsedTokens.emplace_back(Token(Token::Operator, 0, op)); + // parse operator + if (isOperator(std::string(1, *it))) { + while (!tokenStack.empty() + && (isFunction(tokenStack.top()) + || (isOperator(tokenStack.top()) + && opPriority(tokenStack.top()) >= opPriority(std::string(1, *it))))) { + const auto tokenType = isOperator(tokenStack.top()) ? TokenType::Operator + : TokenType::Function; + _parsedTokens.emplace_back(tokenType, ValueType{0}, tokenStack.top()); + tokenStack.pop(); } - // push the read operator onto the operator stack. - operatorStack.push(curr); - + tokenStack.push(std::string(1, *it)); continue; } - // If the token is a left bracket (i.e. "("), then: - // push it onto the operator stack. - if (curr == '(') { - operatorStack.push(curr); - + if (*it == '(') { + tokenStack.push("("); continue; } - // If the token is a right bracket (i.e. ")"), then: - if (curr == ')') { - // While the operator at the top of the operator stack is not a left bracket: - // pop operators from the operator stack onto the output queue; - while (!operatorStack.empty() && - operatorStack.top() != '(') { - _parsedTokens.emplace_back(Token(Token::Operator, 0, operatorStack.top())); - - operatorStack.pop(); + if (*it == ')') { + while (!tokenStack.empty() && tokenStack.top() != "(") { + const auto tokenType = isOperator(tokenStack.top()) ? TokenType::Operator + : TokenType::Function; + _parsedTokens.emplace_back(tokenType, ValueType{0}, tokenStack.top()); + tokenStack.pop(); } - // pop the left bracket from the stack. - // If the stack runs out without finding a left bracket, then there are mismatched parentheses. - if (!operatorStack.empty() && - operatorStack.top() == '(') { - operatorStack.pop(); + if (!tokenStack.empty()) { + tokenStack.pop(); } else { VPU_THROW_EXCEPTION << "Mismatched parentheses in " << expression; } @@ -123,51 +128,54 @@ void SimpleMathExpression::parse(const std::string& expression) { continue; } - // Unknown token - VPU_THROW_EXCEPTION << "Unknown token " << curr << " in " << expression; + VPU_THROW_EXCEPTION << "Unknown token " << *it << " in " << expression; } - // If there are no more tokens to read: - // while there are still operator tokens on the stack: - // if the operator token on the top of the stack is a bracket, then - // there are mismatched parentheses; - // pop the operator onto the output queue. - while (!operatorStack.empty()) { - if (operatorStack.top() == '(') { + while (!tokenStack.empty()) { + if (tokenStack.top() == "(") { VPU_THROW_EXCEPTION << "Mismatched parentheses in " << expression; } - - _parsedTokens.emplace_back(Token(Token::Operator, 0, operatorStack.top())); - - operatorStack.pop(); + const auto tokenType = isOperator(tokenStack.top()) ? TokenType::Operator + : TokenType::Function; + _parsedTokens.emplace_back(tokenType, ValueType{0}, tokenStack.top()); + tokenStack.pop(); } } -int SimpleMathExpression::evaluate() const { - std::stack values; - for (const auto& t : _parsedTokens) { - switch (t.type) { - case Token::Value: - values.push(t.value); - break; - case Token::Operator: { - if (values.size() < 2) { - VPU_THROW_EXCEPTION << "Illegal expression: not enough values for operator evaluation"; +int MathExpression::evaluate() const { + std::stack values; + + for (const auto& token : _parsedTokens) { + switch (token.type) { + case TokenType::Value: + values.push(token.value); + break; + case TokenType::Operator: { + if (values.size() < 2) { + VPU_THROW_EXCEPTION << "Illegal expression: not enough values for operator evaluation"; + } + + auto val2 = values.top(); + values.pop(); + + auto val1 = values.top(); + values.pop(); + + values.push(operators.at(token.opName).op(val1, val2)); + break; } + case TokenType::Function: { + if (values.empty()) { + VPU_THROW_EXCEPTION << "Illegal expression: not enough values for function evaluation"; + } + auto val1 = values.top(); + values.pop(); - // pop last 2 values and apply operand - auto val2 = values.top(); - values.pop(); - - auto val1 = values.top(); - values.pop(); - - values.push(operators.at(t.op).second(val1, val2)); - - break; - } - default: - VPU_THROW_EXCEPTION << "Illegal expression: unhandled token"; + values.push(function.at(token.opName)(val1)); + break; + } + default: + VPU_THROW_EXCEPTION << "Illegal expression: unhandled token"; } } @@ -175,7 +183,7 @@ int SimpleMathExpression::evaluate() const { VPU_THROW_EXCEPTION << "Illegal expression: not enough operators"; } - return values.top(); + return values.top().toFloat(); } } // namespace vpu diff --git a/inference-engine/src/vpu/custom_kernels/binary_convolution1x1.cl b/inference-engine/src/vpu/custom_kernels/binary_convolution1x1.cl index 5954902cdfe..05bd7e75785 100644 --- a/inference-engine/src/vpu/custom_kernels/binary_convolution1x1.cl +++ b/inference-engine/src/vpu/custom_kernels/binary_convolution1x1.cl @@ -1,3 +1,7 @@ +// Copyright (C) 2018-2020 Intel Corporation +// SPDX-License-Identifier: Apache-2.0 +// + #pragma OPENCL EXTENSION cl_khr_fp16 : enable ushort extract_weights(uchar val, int bit) diff --git a/inference-engine/src/vpu/custom_kernels/binary_convolution3x3.cl b/inference-engine/src/vpu/custom_kernels/binary_convolution3x3.cl index 6e242228bb2..db23c37f4dd 100644 --- a/inference-engine/src/vpu/custom_kernels/binary_convolution3x3.cl +++ b/inference-engine/src/vpu/custom_kernels/binary_convolution3x3.cl @@ -1,3 +1,6 @@ +// Copyright (C) 2018-2020 Intel Corporation +// SPDX-License-Identifier: Apache-2.0 +// #pragma OPENCL EXTENSION cl_khr_fp16 : enable diff --git a/inference-engine/src/vpu/custom_kernels/binary_layers.cl b/inference-engine/src/vpu/custom_kernels/binary_layers.cl index 5a8122181f2..1924f335b22 100644 --- a/inference-engine/src/vpu/custom_kernels/binary_layers.cl +++ b/inference-engine/src/vpu/custom_kernels/binary_layers.cl @@ -1,16 +1,6 @@ // Copyright (C) 2018-2020 Intel Corporation +// SPDX-License-Identifier: Apache-2.0 // -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. #pragma OPENCL EXTENSION cl_khr_fp16 : enable diff --git a/inference-engine/src/vpu/custom_kernels/convolution1x1.cl b/inference-engine/src/vpu/custom_kernels/convolution1x1.cl index b9e2bef158d..6ae0e2cfab4 100644 --- a/inference-engine/src/vpu/custom_kernels/convolution1x1.cl +++ b/inference-engine/src/vpu/custom_kernels/convolution1x1.cl @@ -1,3 +1,7 @@ +// Copyright (C) 2018-2020 Intel Corporation +// SPDX-License-Identifier: Apache-2.0 +// + #pragma OPENCL EXTENSION cl_khr_fp16 : enable __kernel void Convolution1x1_NCHW( diff --git a/inference-engine/src/vpu/custom_kernels/convolution3x3.cl b/inference-engine/src/vpu/custom_kernels/convolution3x3.cl index c1d2970d0c2..5c054ed1c81 100644 --- a/inference-engine/src/vpu/custom_kernels/convolution3x3.cl +++ b/inference-engine/src/vpu/custom_kernels/convolution3x3.cl @@ -1,3 +1,7 @@ +// Copyright (C) 2018-2020 Intel Corporation +// SPDX-License-Identifier: Apache-2.0 +// + #pragma OPENCL EXTENSION cl_khr_fp16 : enable __kernel void Convolution3x3(const __global half* in_param, diff --git a/inference-engine/src/vpu/custom_kernels/correlate.cl b/inference-engine/src/vpu/custom_kernels/correlate.cl new file mode 100644 index 00000000000..0a7b3aeeabe --- /dev/null +++ b/inference-engine/src/vpu/custom_kernels/correlate.cl @@ -0,0 +1,449 @@ +// Copyright (C) 2018-2020 Intel Corporation +// SPDX-License-Identifier: Apache-2.0 +// + +#pragma OPENCL EXTENSION cl_khr_fp16 : enable + +#define MAX_OPENCL_BUFF_SIZE 64*1024 + +// Define if runtime supports it. MX runtime is compatible, KMB is in WIP state +#define USE_MANUAL_DMA 1 + +#if defined (USE_MANUAL_DMA) +void dmacpyLineSrcStrideStart(global half* from, private half* to, int size, int src_width, int src_stride) +{ + item_dma_event_t copyEvent = WorkItemDmaCreateStrideTransaction(from, to, src_width, src_width, src_stride, src_width, size, 0); + WaitWorkItemDmaEvents(1, ©Event); +} + +void dmacpyLineDstStrideStart(private half* from, global half* to, int size, int src_width, int src_stride) +{ + item_dma_event_t copyEvent = WorkItemDmaCreateStrideTransaction(from, to, src_width, src_width, src_width, src_stride, size, 0); + WaitWorkItemDmaEvents(1, ©Event); +} +#endif + +void memzero(void * ptr, size_t num) +{ + float4* line0_ = (float4*) ptr; + #pragma unroll 16 + for (int i = 0; i < num/16; i++) + { + line0_[i] = (float4){0.f, 0.f, 0.f, 0.f}; + } + uchar* ptr_ = (uchar*) ptr; + for (int i = num/16*16; i < num; i++) + { + ptr_[i] = 0; + } +} + +void __attribute__((noinline)) crosscorrh(__private const half* restrict line0, + __private const half* restrict line1, + __private half* restrict dline, + int topwidth, + int max_displacement, + int neighborhood_grid_radius, + int kernel_size, + int padding, + int bottomwidth, + int stride1, + int stride2, + int max_channels, + int cur_subchannels) +{ + if (max_channels == 64) + { + for (int i = 0; i < kernel_size; i++) + { + int x1 = max_displacement - padding + i; + int offset1 = x1 >= 0 ? 0 : (-x1 + stride1 - 1)/stride1; + x1 += offset1*stride1; + + for (int blockIdx_x = offset1; blockIdx_x < topwidth && x1 < bottomwidth; blockIdx_x++, x1 += stride1) + { + int x2 = x1 - neighborhood_grid_radius*stride2; + int offset2 = x2 >= 0 ? 0 : (-x2 + stride2 - 1)/stride2; + x2 += offset2*stride2; + + for (int top_channel_x = offset2 - neighborhood_grid_radius; + top_channel_x <= neighborhood_grid_radius && x2 < bottomwidth; + top_channel_x++, x2 += stride2) + { + half8 sum4 = (half8){0.f, 0.f, 0.f, 0.f, 0.f, 0.f, 0.f, 0.f}; + + half8* src0 = (half8*)(line0 + x1*max_channels); + half8* src1 = (half8*)(line1 + x2*max_channels); + + #pragma unroll 8 + for (int ch = 0; ch < max_channels/8; ch++) + sum4 += (src0[ch])*(src1[ch]); + + half sum = __builtin_shave_sau_sumx_f16_r(sum4); + dline[(top_channel_x + neighborhood_grid_radius)*topwidth + blockIdx_x] += (sum); + } + } + } + } + else + { + int neighborhood_grid_width = 2*neighborhood_grid_radius + 1; + + for (int blockIdx_x = 0; blockIdx_x < topwidth; blockIdx_x++) + { + for (int i = 0; i < kernel_size; i++) + { + int x1 = blockIdx_x*stride1 + max_displacement + i - padding; + + if ((x1 >= 0) && (x1 < bottomwidth)) + { + int o_min = - neighborhood_grid_radius*stride2; + int o_max = neighborhood_grid_width*stride2 - neighborhood_grid_radius*stride2; + if ((o_min) < ( - x1)) o_min -= ((x1 + o_min - (stride2 - 1))/stride2)*stride2; + if ((o_max) >= (bottomwidth+stride2 - x1)) o_max -= ((x1 + o_max - bottomwidth )/stride2)*stride2; + + int o = o_min; + for (; o <= o_max - 4*stride2; o += 4*stride2) + { + half8* bottom0 = (half8*)(line0 + x1*max_channels); + half8* bottom1_0 = (half8*)(line1 + (x1 + o + 0*stride2)*max_channels); + half8* bottom1_1 = (half8*)(line1 + (x1 + o + 1*stride2)*max_channels); + half8* bottom1_2 = (half8*)(line1 + (x1 + o + 2*stride2)*max_channels); + half8* bottom1_3 = (half8*)(line1 + (x1 + o + 3*stride2)*max_channels); + + int c = 0; + + half8 sum40 = 0; + half8 sum41 = 0; + half8 sum42 = 0; + half8 sum43 = 0; + + for (; c <= cur_subchannels/8 - 4; c += 4) + { + sum40 += bottom0[c + 0] * bottom1_0[c + 0]; + sum40 += bottom0[c + 1] * bottom1_0[c + 1]; + sum40 += bottom0[c + 2] * bottom1_0[c + 2]; + sum40 += bottom0[c + 3] * bottom1_0[c + 3]; + + sum41 += bottom0[c + 0] * bottom1_1[c + 0]; + sum41 += bottom0[c + 1] * bottom1_1[c + 1]; + sum41 += bottom0[c + 2] * bottom1_1[c + 2]; + sum41 += bottom0[c + 3] * bottom1_1[c + 3]; + + sum42 += bottom0[c + 0] * bottom1_2[c + 0]; + sum42 += bottom0[c + 1] * bottom1_2[c + 1]; + sum42 += bottom0[c + 2] * bottom1_2[c + 2]; + sum42 += bottom0[c + 3] * bottom1_2[c + 3]; + + sum43 += bottom0[c + 0] * bottom1_3[c + 0]; + sum43 += bottom0[c + 1] * bottom1_3[c + 1]; + sum43 += bottom0[c + 2] * bottom1_3[c + 2]; + sum43 += bottom0[c + 3] * bottom1_3[c + 3]; + } + + for (; c < cur_subchannels/8; c++) + { + sum40 += bottom0[c] * bottom1_0[c]; + sum41 += bottom0[c] * bottom1_1[c]; + sum42 += bottom0[c] * bottom1_2[c]; + sum43 += bottom0[c] * bottom1_3[c]; + } + + half sum0 = __builtin_shave_sau_sumx_f16_r(sum40); + half sum1 = __builtin_shave_sau_sumx_f16_r(sum41); + half sum2 = __builtin_shave_sau_sumx_f16_r(sum42); + half sum3 = __builtin_shave_sau_sumx_f16_r(sum43); + + for (c = c*8; c < cur_subchannels; c++) + { + sum0 += line0[x1*max_channels + c] * line1[(x1 + o + 0*stride2)*max_channels + c]; + sum1 += line0[x1*max_channels + c] * line1[(x1 + o + 1*stride2)*max_channels + c]; + sum2 += line0[x1*max_channels + c] * line1[(x1 + o + 2*stride2)*max_channels + c]; + sum3 += line0[x1*max_channels + c] * line1[(x1 + o + 3*stride2)*max_channels + c]; + } + + dline[blockIdx_x + (((o/stride2) + 0)*topwidth + neighborhood_grid_radius*topwidth)] += sum0; + dline[blockIdx_x + (((o/stride2) + 1)*topwidth + neighborhood_grid_radius*topwidth)] += sum1; + dline[blockIdx_x + (((o/stride2) + 2)*topwidth + neighborhood_grid_radius*topwidth)] += sum2; + dline[blockIdx_x + (((o/stride2) + 3)*topwidth + neighborhood_grid_radius*topwidth)] += sum3; + } + + for (; o < o_max; o += 1*stride2) + { + half8* bottom0 = (half8*)(line0 + x1*max_channels); + half8* bottom1 = (half8*)(line1 + (x1 + o)*max_channels); + + int c = 0; + + half8 sum4 = 0; + for (; c <= cur_subchannels/8 - 4; c += 4) + { + sum4 += bottom0[c + 0] * bottom1[c + 0]; + sum4 += bottom0[c + 1] * bottom1[c + 1]; + sum4 += bottom0[c + 2] * bottom1[c + 2]; + sum4 += bottom0[c + 3] * bottom1[c + 3]; + } + for (; c < cur_subchannels/8; c++) + { + sum4 += bottom0[c] * bottom1[c]; + } + + half sum = __builtin_shave_sau_sumx_f16_r(sum4); + + for (c = c*8; c < cur_subchannels; c++) + { + sum += line0[x1*max_channels + c] * line1[(x1 + o)*max_channels + c]; + } + + dline[blockIdx_x + (((o + neighborhood_grid_radius*stride2)/stride2)*topwidth)] += sum; + } + } + } + } + } +} + + +__kernel void correlate2_half(__global const half* restrict bottom0, + __global const half* restrict bottom1, + __global half* restrict top, + int topwidth, + int topheight, + int bottomwidth, + int bottomheight, + int bottomchannels, + int max_displacement, + int padding, + int neighborhood_grid_radius, + int neighborhood_grid_width, + int kernel_size, + int stride1, + int stride2) +{ + int max_channels = (MAX_OPENCL_BUFF_SIZE/sizeof(half) - topwidth*neighborhood_grid_width) / (3*bottomwidth); + if (max_channels > 64) max_channels = 64; + int subchannels_count = (bottomchannels + max_channels - 1) / max_channels; + int subchannels = (bottomchannels + subchannels_count-1) / subchannels_count; + if (subchannels < max_channels) subchannels = max_channels; + + const int sumelems = kernel_size*kernel_size*bottomchannels; + + __private half cmx[MAX_OPENCL_BUFF_SIZE/sizeof(half)]; + + __private half* line0 = cmx; + __private half* line1 = line0 + bottomwidth*subchannels; + __private half* dline = line1 + bottomwidth*subchannels; + + int blockIdx_y = get_global_id(0); + +#if defined(USE_MANUAL_DMA) + __private half* dmabuf = dline + topwidth*neighborhood_grid_width; +#endif + + int y1 = blockIdx_y*stride1 + max_displacement; + + for (int j = 0; j < kernel_size; j++) + { + for (int bottomchannel = 0; bottomchannel < bottomchannels; bottomchannel += subchannels) + { + // configure channel batching + int startchannel = bottomchannel; + int endchannel = startchannel + subchannels > bottomchannels ? bottomchannels : startchannel + subchannels; + int deltachannels = endchannel-startchannel; + + // load line form blob 0 with repackaging + if (y1+j-padding >= 0 && y1+j-padding < bottomheight) + { +#if defined(USE_MANUAL_DMA) + __global const half* curr = bottom0 + startchannel*bottomheight*bottomwidth + (y1+j-padding)*bottomwidth; + dmacpyLineSrcStrideStart(curr, + dmabuf, + bottomwidth*deltachannels*sizeof(half), + bottomwidth*sizeof(half), + bottomwidth*bottomheight*sizeof(half)); + + for (int ch = 0; ch < deltachannels; ch++) + { + for (int blockIdx_x = 0; blockIdx_x < bottomwidth/8; blockIdx_x++) + { + half8 val = ((half8*)(dmabuf + ch*bottomwidth))[blockIdx_x]; + line0[(blockIdx_x*8 + 0)*max_channels+ch] = val[0]; + line0[(blockIdx_x*8 + 1)*max_channels+ch] = val[1]; + line0[(blockIdx_x*8 + 2)*max_channels+ch] = val[2]; + line0[(blockIdx_x*8 + 3)*max_channels+ch] = val[3]; + + line0[(blockIdx_x*8 + 4)*max_channels+ch] = val[4]; + line0[(blockIdx_x*8 + 5)*max_channels+ch] = val[5]; + line0[(blockIdx_x*8 + 6)*max_channels+ch] = val[6]; + line0[(blockIdx_x*8 + 7)*max_channels+ch] = val[7]; + } + + for (int blockIdx_x = bottomwidth/8*8; blockIdx_x < bottomwidth; blockIdx_x++) + { + line0[(blockIdx_x)*max_channels+ch] = dmabuf[blockIdx_x + ch*bottomwidth]; + } + } + + if (deltachannels < subchannels) + for (int blockIdx_x = 0; blockIdx_x < bottomwidth; blockIdx_x++) + memzero(line0 + blockIdx_x*max_channels+deltachannels, (subchannels-deltachannels)*sizeof(half)); +#else + for (int blockIdx_x = 0; blockIdx_x < bottomwidth; blockIdx_x++) + { + for (int ch = 0; ch < deltachannels; ch++) + line0[blockIdx_x*max_channels+ch] + = bottom0[(ch+startchannel)*bottomheight*bottomwidth + (y1+j-padding)*bottomwidth + blockIdx_x]; + + if (deltachannels < subchannels) + memzero(line0 + blockIdx_x*max_channels+deltachannels, (subchannels-deltachannels)*sizeof(half)); + } +#endif + } + else + memzero(line0, max_channels*bottomwidth*sizeof(half)); + + for (int top_channel_y = 0; top_channel_y < neighborhood_grid_width; top_channel_y++) + { + int y2 = y1 + (top_channel_y - neighborhood_grid_radius) * stride2; + + // load line form blob 1 with repackaging according to the line we work on now + if (y2+j-padding >= 0 && y2+j-padding < bottomheight) + { +#if defined(USE_MANUAL_DMA) + __global const half* curr = bottom1 + startchannel*bottomheight*bottomwidth + (y2+j-padding)*bottomwidth; + dmacpyLineSrcStrideStart(curr, + dmabuf, + bottomwidth*deltachannels*sizeof(half), + bottomwidth*sizeof(half), + bottomwidth*bottomheight*sizeof(half)); + + for (int ch = 0; ch < deltachannels; ch++) + { + for (int blockIdx_x = 0; blockIdx_x < bottomwidth/8; blockIdx_x++) + { + half8 val = ((half8*)(dmabuf + ch*bottomwidth))[blockIdx_x]; + line1[(blockIdx_x*8 + 0)*max_channels+ch] = val[0]; + line1[(blockIdx_x*8 + 1)*max_channels+ch] = val[1]; + line1[(blockIdx_x*8 + 2)*max_channels+ch] = val[2]; + line1[(blockIdx_x*8 + 3)*max_channels+ch] = val[3]; + + line1[(blockIdx_x*8 + 4)*max_channels+ch] = val[4]; + line1[(blockIdx_x*8 + 5)*max_channels+ch] = val[5]; + line1[(blockIdx_x*8 + 6)*max_channels+ch] = val[6]; + line1[(blockIdx_x*8 + 7)*max_channels+ch] = val[7]; + } + + for (int blockIdx_x = bottomwidth/8*8; blockIdx_x < bottomwidth; blockIdx_x++) + { + line1[(blockIdx_x)*max_channels+ch] = dmabuf[blockIdx_x + ch*bottomwidth]; + } + } +#else + for (int ch = 0; ch < deltachannels; ch++) + { + for (int blockIdx_x = 0; blockIdx_x < bottomwidth/8; blockIdx_x++) + { + half8 val = ((__global half8*)(bottom1 + (ch+startchannel)*bottomheight*bottomwidth + (y2+j-padding)*bottomwidth))[blockIdx_x]; + line1[(blockIdx_x*8 + 0)*max_channels+ch] = val[0]; + line1[(blockIdx_x*8 + 1)*max_channels+ch] = val[1]; + line1[(blockIdx_x*8 + 2)*max_channels+ch] = val[2]; + line1[(blockIdx_x*8 + 3)*max_channels+ch] = val[3]; + + line1[(blockIdx_x*8 + 4)*max_channels+ch] = val[4]; + line1[(blockIdx_x*8 + 5)*max_channels+ch] = val[5]; + line1[(blockIdx_x*8 + 6)*max_channels+ch] = val[6]; + line1[(blockIdx_x*8 + 7)*max_channels+ch] = val[7]; + } + for (int blockIdx_x = bottomwidth/8*8; blockIdx_x < bottomwidth; blockIdx_x++) + { + half val = (bottom1 + (ch+startchannel)*bottomheight*bottomwidth + (y2+j-padding)*bottomwidth)[blockIdx_x]; + line1[(blockIdx_x)*max_channels+ch] = val; + } + } +#endif + for (int blockIdx_x = 0; blockIdx_x < bottomwidth; blockIdx_x++) + { + if (deltachannels < subchannels) + memzero(line1 + blockIdx_x*max_channels+deltachannels, (subchannels-deltachannels)*sizeof(half)); + } + } + else + memzero(line1, max_channels*bottomwidth*sizeof(half)); + + if(j == 0 && startchannel == 0) + { + memzero(dline, neighborhood_grid_width*topwidth*sizeof(half)); + } + else + { +#if defined(USE_MANUAL_DMA) + dmacpyLineSrcStrideStart(top + top_channel_y*neighborhood_grid_width*topheight*topwidth + blockIdx_y*topwidth, + dline, + topwidth*neighborhood_grid_width*sizeof(half), + topwidth*sizeof(half), + topwidth*topheight*sizeof(half)); +#else + for (int top_channel_x = 0; top_channel_x < neighborhood_grid_width; top_channel_x++) + { + for (int blockIdx_x = 0; blockIdx_x < topwidth/8; blockIdx_x++) + { + half8 val = ((__global half8*)(top + ((top_channel_y*neighborhood_grid_width+top_channel_x)*topheight*topwidth + blockIdx_y*topwidth)))[blockIdx_x]; + ((half8*)(dline + top_channel_x*topwidth))[blockIdx_x] = val; + } + for (int blockIdx_x = (topwidth/8)*8; blockIdx_x < topwidth; blockIdx_x++) + { + dline[top_channel_x*topwidth+blockIdx_x] = + top[(top_channel_y*neighborhood_grid_width+top_channel_x)*topheight*topwidth + blockIdx_y*topwidth+blockIdx_x]; + } + } +#endif + } + + if (y1+j-padding >= 0 && y1+j-padding < bottomheight && y2+j-padding >= 0 && y2+j-padding < bottomheight) + { + crosscorrh(line0, line1, dline, topwidth, max_displacement, neighborhood_grid_radius, + kernel_size, padding, bottomwidth, stride1, stride2, max_channels, subchannels); + } + + if (j == kernel_size-1 && endchannel == bottomchannels) + { + half8 scale = (half8){(half)sumelems, (half)sumelems, (half)sumelems, (half)sumelems, (half)sumelems, (half)sumelems, (half)sumelems, (half)sumelems}; + for (int top_channel_x = 0; top_channel_x < neighborhood_grid_width; top_channel_x++) + { + for (int blockIdx_x = 0; blockIdx_x < topwidth/8; blockIdx_x++) + { + ((half8*)(dline + top_channel_x*topwidth))[blockIdx_x] = + ((half8*)(dline + top_channel_x*topwidth))[blockIdx_x] / scale; + } + for (int blockIdx_x = (topwidth/8)*8; blockIdx_x < topwidth; blockIdx_x++) + { + dline[top_channel_x*topwidth+blockIdx_x] = dline[top_channel_x*topwidth+blockIdx_x]/(half)sumelems; + } + } + } + +#if defined(USE_MANUAL_DMA) + dmacpyLineDstStrideStart(dline, + top + top_channel_y*neighborhood_grid_width*topheight*topwidth + blockIdx_y*topwidth, + topwidth*neighborhood_grid_width*sizeof(half), + topwidth*sizeof(half), + topwidth*topheight*sizeof(half)); +#else + for (int top_channel_x = 0; top_channel_x < neighborhood_grid_width; top_channel_x++) + { + for (int blockIdx_x = 0; blockIdx_x < topwidth/8; blockIdx_x++) + { + ((__global half8*)(top + ((top_channel_y*neighborhood_grid_width+top_channel_x)*topheight*topwidth + blockIdx_y*topwidth)))[blockIdx_x] = + ((half8*)(dline + top_channel_x*topwidth))[blockIdx_x] + (half8) {0, 0, 0, 0, 0, 0, 0, 0}; + } + for (int blockIdx_x = (topwidth/8)*8; blockIdx_x < topwidth; blockIdx_x++) + { + top[(top_channel_y*neighborhood_grid_width+top_channel_x)*topheight*topwidth + blockIdx_y*topwidth+blockIdx_x] + = dline[top_channel_x*topwidth+blockIdx_x] + (half)0; + } + } +#endif + } + } + } +} diff --git a/inference-engine/src/vpu/custom_kernels/ctc.cl b/inference-engine/src/vpu/custom_kernels/ctc.cl index 0197e702616..609fc00251e 100644 --- a/inference-engine/src/vpu/custom_kernels/ctc.cl +++ b/inference-engine/src/vpu/custom_kernels/ctc.cl @@ -1,137 +1,173 @@ // Copyright (C) 2018-2020 Intel Corporation +// SPDX-License-Identifier: Apache-2.0 // -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. #pragma OPENCL EXTENSION cl_khr_fp16 : enable -__kernel void ctc_ocl(__global half* probabilities, - __global half* output_sequences, - int C_) -{ - size_t t = get_global_id(0); - - __global half* probs = probabilities + t * C_; - - int max_class_idx = 0; - half max_prob = probs[0]; - ++probs; - for (int c = 1 ; c < C_ ; c++, ++probs) - { - if (*probs > max_prob) - { - max_prob = *probs; - max_class_idx = c; +__global half *find(__global const half *begin, __global const half *end, half value) { + while (begin != end) { + if (*begin == value) { + return begin; } + ++begin; } - output_sequences[t] = (half)max_class_idx; + return end; } -__kernel void postProcess(__global half* input, - __global half* output, - __global half* seq_ind, - int height, - int width, - int classes) +#define USE_MANUAL_DMA + +#ifdef USE_MANUAL_DMA + +__kernel void __dma_preload_CTCDecoder(__global half *probabilities, + __global half *sequence_indicators, + __global half *output_sequences, + int width, + int height, + int channels, + __local half *local_src, + __local half *local_dst) { - int wr_index = 0; - int rd_index = 0; - - half update_data; - int update_index; - - for (int i = 0; i < classes; i++) - { - output[i] = (half)(-1); - } - - for (int n = 0; n < height; ++n) - { - int prev_class_id = -1; - for (int t = 0; t < classes; ++t) - { - int class_id = (int)input[rd_index++]; - update_index = wr_index; - update_data = output[update_index]; - - if ((class_id < (width - 1)) && !(1 && class_id == prev_class_id)) - { - update_data = (half)class_id; - wr_index++; - - } - output[update_index] = update_data; - prev_class_id = class_id; - - if (seq_ind[t + 1] == 0 ) { - break; - } - } - } + WorkGroupDmaCreateStrideTransaction( + probabilities, // src + local_src, // dst + width * sizeof(half), // src_width, + width * sizeof(half), // dst_width, + width * height * sizeof(half), // src_stride, + width * sizeof(half), // dst_stride, + width * height * channels * sizeof(half), // size + 0); } -__kernel void ctc_ref_fp16(__global half* probabilities, __global half* seq_ind, __global half* output_sequences, int C, int H, int W) +__kernel void __dma_postwrite_CTCDecoder(__global half *probabilities, + __global half *sequence_indicators, + __global half *output_sequences, + int width, + int height, + int channels, + __local half *local_src, + __local half *local_dst) { - int T_ = C; - int N_ = H; - int C_ = W; + WorkGroupDmaCreateStrideTransaction( + local_dst, // src + output_sequences, // dst + channels * sizeof(half), // src_width, + channels * sizeof(half), // dst_width, + channels * sizeof(half), // src_stride, + channels * sizeof(half), // dst_stride, + channels * height * sizeof(half), // size + 0); +} - // Fill output_sequences with -1 - for (int i = 0; i < T_; i++) +__kernel void CTCDecoder(__global half *probabilities, + __global half *sequence_indicators, + __global half *output_sequences, + int width, + int height, + int channels, + __local half *local_src, + __local half *local_dst) +{ + const int T = channels; + const int B = height; + const int C = width; + + for (int i = 0; i < B*T; i++) { - output_sequences[i] = (half)(-1.0); + local_dst[i] = -1.h; } + int output_index = 0; - // Caffe impl - for(int n = 0; n < N_; ++n) + for (int b = 0; b < B; ++b) { + __global const half *seq_ind = sequence_indicators + b*T; + const int seq_len = find(seq_ind + 1, seq_ind + T, 0.h) - seq_ind; + const int time = min(seq_len, T); + int prev_class_idx = -1; - for (int t = 0; t < T_; ++t) + for (int t = 0; t < time; ++t) { - // get maximum probability and its index + __local const half *probs = local_src + b*C + t*C*B; int max_class_idx = 0; - __global half* probs; - half max_prob; + half max_prob = probs[0]; - probs = probabilities + t*C_; - max_prob = probs[0]; - ++probs; - - for (int c = 1; c < C_; ++c, ++probs) + for (int c = 1; c < C; ++c) { - if (*probs > max_prob) + const half prob = probs[c]; + if (prob > max_prob) { max_class_idx = c; - max_prob = *probs; + max_prob = prob; } } - //if (max_class_idx != blank_index_ - // && !(merge_repeated_&& max_class_idx == prev_class_idx)) - if (max_class_idx < C_-1 && !(1 && max_class_idx == prev_class_idx)) + if (max_class_idx < C-1 && max_class_idx != prev_class_idx) { - output_sequences[output_index] = (half)max_class_idx; + local_dst[b*T + output_index] = (half)max_class_idx; output_index++; } prev_class_idx = max_class_idx; - - // Assume sequence_indicators is always 1 - if (seq_ind[t + 1] == 0) - { - break; - } } } } + +#else + +__kernel void CTCDecoder(__global half *probabilities, + __global half *sequence_indicators, + __global half *output_sequences, + int width, + int height, + int channels, + __local half *local_src, + __local half *local_dst) +{ + const int T = channels; + const int B = height; + const int C = width; + + for (int i = 0; i < B*T; i++) + { + output_sequences[i] = -1.h; + } + + int output_index = 0; + + for (int b = 0; b < B; ++b) + { + __global const half *seq_ind = sequence_indicators + b*T; + const int seq_len = find(seq_ind + 1, seq_ind + T, 0.h) - seq_ind; + const int time = min(seq_len, T); + + int prev_class_idx = -1; + + for (int t = 0; t < time; ++t) + { + __global const half *probs = probabilities + b*C + t*C*B; + int max_class_idx = 0; + half max_prob = probs[0]; + + for (int c = 1; c < C; ++c) + { + const half prob = probs[c]; + if (prob > max_prob) + { + max_class_idx = c; + max_prob = prob; + } + } + + if (max_class_idx < C-1 && max_class_idx != prev_class_idx) + { + output_sequences[b*T + output_index] = (half)max_class_idx; + output_index++; + } + + prev_class_idx = max_class_idx; + } + } +} + +#endif diff --git a/inference-engine/src/vpu/custom_kernels/customLayerBindings.xml b/inference-engine/src/vpu/custom_kernels/customLayerBindings.xml index 78ade2b651a..929be758fdf 100644 --- a/inference-engine/src/vpu/custom_kernels/customLayerBindings.xml +++ b/inference-engine/src/vpu/custom_kernels/customLayerBindings.xml @@ -1,177 +1,188 @@ - - + - + + + + + + + + + + + + + - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - + + + + + + + + + - - - - - - - - - - - + + + + + + + + + + + + - - - - - - - - - - - - - + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - + + + + + + + + + + + + - - - - - - - - - @@ -179,16 +190,16 @@ + + + + + + + + + - - - - - - - - - @@ -196,25 +207,25 @@ + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - @@ -222,110 +233,110 @@ + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - + - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + - - - - + + + + + - + - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + - - - - + + + + + @@ -333,183 +344,234 @@ + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - + + + + + + + + + + + + + - - - - - - - - + + + + + + + + - - + + - - + + + - - - - - - - - - - - - - - + + + + + + + + + + + + + - - - - - - - - + + + + + + + + - - - - + + + + + - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - + + + + + + - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/inference-engine/src/vpu/custom_kernels/cvtf32f16.cl b/inference-engine/src/vpu/custom_kernels/cvtf32f16.cl index e592f14ae60..081a74ddc56 100644 --- a/inference-engine/src/vpu/custom_kernels/cvtf32f16.cl +++ b/inference-engine/src/vpu/custom_kernels/cvtf32f16.cl @@ -1,16 +1,6 @@ // Copyright (C) 2018-2020 Intel Corporation +// SPDX-License-Identifier: Apache-2.0 // -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. #pragma OPENCL EXTENSION cl_khr_fp16 : enable diff --git a/inference-engine/src/vpu/custom_kernels/cvtu8f16.cl b/inference-engine/src/vpu/custom_kernels/cvtu8f16.cl index 622621dbf0b..33d7d2f891e 100644 --- a/inference-engine/src/vpu/custom_kernels/cvtu8f16.cl +++ b/inference-engine/src/vpu/custom_kernels/cvtu8f16.cl @@ -1,27 +1,90 @@ // Copyright (C) 2018-2020 Intel Corporation +// SPDX-License-Identifier: Apache-2.0 // -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. #pragma OPENCL EXTENSION cl_khr_fp16 : enable -__kernel void cvtu8f16(const __global uchar* restrict src, - __global half* restrict dst, - float scale, - float bais) -{ - int idx = get_global_id(0) - + get_global_id(1) * get_global_size(0) - + get_global_id(2) * get_global_size(0) * get_global_size(1); +#define USE_MANUAL_DMA 1 - dst[idx] = convert_half(src[idx])*(half)scale+(half)bais; +#if defined (USE_MANUAL_DMA) + +__kernel void __dma_preload_cvtu8f16( + __global uchar* restrict src, + __global half* restrict dst, + float scale, + float bias, + __local uchar* restrict local_src, + __local half* restrict local_dst) +{ + WorkGroupDmaCreate3DTransaction( + src + get_group_id(0)*get_local_size(0) + + get_group_id(1)*get_local_size(1)*get_global_size(0) + + get_group_id(2)*get_local_size(2)*get_global_size(0)*get_global_size(1), // src + local_src, // dst + get_local_size(0) * sizeof(uchar), // src width + get_local_size(0) * sizeof(uchar), // dst width + get_global_size(0) * sizeof(uchar), // src stride + get_local_size(0) * sizeof(uchar), // dst stride + get_local_size(2), // num planes + get_global_size(0) * get_global_size(1) * sizeof(uchar), // src plane stride + get_local_size(0) * get_local_size(1) * sizeof(uchar), // dst plane stride + get_local_size(0) * get_local_size(1) * sizeof(uchar), // plane size + 0); } + +__kernel void __dma_postwrite_cvtu8f16( + __global uchar* restrict src, + __global half* restrict dst, + float scale, + float bias, + __local uchar* restrict local_src, + __local half* restrict local_dst) +{ + WorkGroupDmaCreate3DTransaction( + local_dst, // src + dst + get_group_id(0)*get_local_size(0) + + get_group_id(1)*get_local_size(1)*get_global_size(0) + + get_group_id(2)*get_local_size(2)*get_global_size(0)*get_global_size(1), // dst + get_local_size(0) * sizeof(half), // src width + get_local_size(0) * sizeof(half), // dst width + get_local_size(0) * sizeof(half), // src stride + get_global_size(0) * sizeof(half), // dst stride + get_local_size(2), // num planes + get_local_size(0) * get_local_size(1) * sizeof(half), // src plane stride + get_global_size(0) * get_global_size(1) * sizeof(half), // dst plane stride + get_local_size(0) * get_local_size(1) * sizeof(half), // plane size + 0); +} + +__kernel void cvtu8f16( + __global uchar* restrict src, + __global half* restrict dst, + float scale, + float bias, + __local uchar* restrict local_src, + __local half* restrict local_dst) +{ + size_t idx = get_local_id(0) + + get_local_id(1)*get_local_size(0) + + get_local_id(2)*get_local_size(0)*get_local_size(1); + local_dst[idx] = convert_half(local_src[idx])*(half)scale+(half)bias; +} + +#else // defined (USE_MANUAL_DMA) + +__kernel void cvtu8f16( + __global uchar* restrict src, + __global half* restrict dst, + float scale, + float bias, + __local uchar* restrict local_src, // unused, added for compatibility with DMA variant + __local half* restrict local_dst) // unused, added for compatibility with DMA variant +{ + int idx = get_global_id(0) + + get_global_id(1) * get_global_size(0) + + get_global_id(2) * get_global_size(0) * get_global_size(1); + dst[idx] = convert_half(src[idx])*(half)scale+(half)bias; +} + +#endif // defined (USE_MANUAL_DMA) + diff --git a/inference-engine/src/vpu/custom_kernels/detectron_prior_grid_gen.cl b/inference-engine/src/vpu/custom_kernels/detectron_prior_grid_gen.cl index ca0ad884a93..e92d3c6afb7 100644 --- a/inference-engine/src/vpu/custom_kernels/detectron_prior_grid_gen.cl +++ b/inference-engine/src/vpu/custom_kernels/detectron_prior_grid_gen.cl @@ -1,16 +1,6 @@ -// Copyright (C) 2019 Intel Corporation +// Copyright (C) 2018-2020 Intel Corporation +// SPDX-License-Identifier: Apache-2.0 // -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. #pragma OPENCL EXTENSION cl_khr_fp16 : enable diff --git a/inference-engine/src/vpu/custom_kernels/grn.cl b/inference-engine/src/vpu/custom_kernels/grn.cl index 96df0417633..88cebb83caa 100644 --- a/inference-engine/src/vpu/custom_kernels/grn.cl +++ b/inference-engine/src/vpu/custom_kernels/grn.cl @@ -1,6 +1,9 @@ +// Copyright (C) 2018-2020 Intel Corporation +// SPDX-License-Identifier: Apache-2.0 +// + #pragma OPENCL EXTENSION cl_khr_fp16 : enable -// Define if runtime supports it. MX runtime is compatible, KMB is in WIP state #define USE_MANUAL_DMA 1 #if defined (USE_MANUAL_DMA) @@ -52,10 +55,10 @@ __kernel void __dma_postwrite_grn_NCHW( } __kernel void grn_NCHW( - __global const half* restrict src_data, - __global half* restrict dst_data, - __local half* restrict src, - __local half* restrict dst, + __global const half* restrict src, + __global half* restrict dst, + __local half* restrict local_src, + __local half* restrict local_dst, int C, float bias) { @@ -64,7 +67,7 @@ __kernel void grn_NCHW( #pragma unroll 8 for (int c = 0; c < C; c++) { - float val = (float) src[c*get_local_size(1)*get_local_size(0) + get_local_id(1)*get_local_size(0) + get_local_id(0)]; + float val = (float) local_src[c*get_local_size(1)*get_local_size(0) + get_local_id(1)*get_local_size(0) + get_local_id(0)]; variance += val*val; } @@ -73,18 +76,18 @@ __kernel void grn_NCHW( #pragma unroll 8 for (int c = 0; c < C; c++) { - dst[c*get_local_size(1)*get_local_size(0) + get_local_id(1)*get_local_size(0) + get_local_id(0)] - = src[c*get_local_size(1)*get_local_size(0) + get_local_id(1)*get_local_size(0) + get_local_id(0)] * hvariance; + local_dst[c*get_local_size(1)*get_local_size(0) + get_local_id(1)*get_local_size(0) + get_local_id(0)] + = local_src[c*get_local_size(1)*get_local_size(0) + get_local_id(1)*get_local_size(0) + get_local_id(0)] * hvariance; } } #else // defined (USE_MANUAL_DMA) __kernel void grn_NCHW( - __global const half* restrict src_data, - __global half* restrict dst_data, - __local half* restrict src, // unused, added for compatibility with DMA variant - __local half* restrict dst, // unused, added for compatibility with DMA variant + __global const half* restrict src, + __global half* restrict dst, + __local half* restrict local_src, // unused, added for compatibility with DMA variant + __local half* restrict local_dst, // unused, added for compatibility with DMA variant int C, float bias) { @@ -93,7 +96,7 @@ __kernel void grn_NCHW( #pragma unroll 4 for (int c = 0; c < C; c++) { - float val = (float) src_data[c*get_global_size(1)*get_global_size(0) + get_global_id(1)*get_global_size(0) + get_global_id(0)]; + float val = (float) src[c*get_global_size(1)*get_global_size(0) + get_global_id(1)*get_global_size(0) + get_global_id(0)]; variance += val*val; } @@ -102,77 +105,9 @@ __kernel void grn_NCHW( #pragma unroll 4 for (int c = 0; c < C; c++) { - dst_data[c*get_global_size(1)*get_global_size(0) + get_global_id(1)*get_global_size(0) + get_global_id(0)] - = src_data[c*get_global_size(1)*get_global_size(0) + get_global_id(1)*get_global_size(0) + get_global_id(0)] * hvariance; + dst[c*get_global_size(1)*get_global_size(0) + get_global_id(1)*get_global_size(0) + get_global_id(0)] + = src[c*get_global_size(1)*get_global_size(0) + get_global_id(1)*get_global_size(0) + get_global_id(0)] * hvariance; } } #endif // defined (USE_MANUAL_DMA) - -// doesn't work right now due to compiler limitation -// ToDo: fix compiler -#if defined(IN_KERNEL_DMA) - -#define MAX_LOCAL_W 224 -#define MAX_LOCAL_H 2 -#define MAX_LOCAL_C 24 - -__kernel void grn_NCHW(__global const half* restrict src_data, - __global half* restrict dst_data, - int C, - float bias) -{ - __local half src[MAX_LOCAL_W*MAX_LOCAL_H*MAX_LOCAL_C]; // get_local_size(0)*get_local_size(1)*C - __local half dst[MAX_LOCAL_W*MAX_LOCAL_H*MAX_LOCAL_C]; // get_local_size(0)*get_local_size(1)*C - - const size_t index = get_group_id(0)*get_local_size(0) + get_group_id(1)*get_local_size(1)*get_global_size(0); - - event_t e1 = async_work_group_copy_3D3D( - src, // dst - src_data + index, // src - get_local_size(0), // num_elements_per_line, - get_local_size(1), // num_lines, - get_global_size(0) - get_local_size(0), // src_line_stride, - 0, // dst_line_stride, - C, // num_planes, - get_global_size(0)*get_global_size(1) - get_local_size(0) * get_local_size(1), // src_plane_stride - 0, // dst_plane_stride - 0); // event - wait_group_events(1, &e1); - - //////////////////////// - - float variance = bias + 1e-9f; - - #pragma unroll 8 - for (int c = 0; c < C; c++) - { - float val = (float) src[c*get_local_size(1)*get_local_size(0) + get_local_id(1)*get_local_size(0) + get_local_id(0)]; - variance += val*val; - } - - half hvariance = (half)(native_rsqrt((half)(variance/16.f))*0.25f); - - #pragma unroll 8 - for (int c = 0; c < C; c++) - { - dst[c*get_local_size(1)*get_local_size(0) + get_local_id(1)*get_local_size(0) + get_local_id(0)] - = src[c*get_local_size(1)*get_local_size(0) + get_local_id(1)*get_local_size(0) + get_local_id(0)] * hvariance; - } - - //////////////////// - - event_t e2 = async_work_group_copy_3D3D( - dst_data + index, // src - dst, // dst - get_local_size(0), // num_elements_per_line, - get_local_size(1), // num_lines, - 0, // src_line_stride, - get_global_size(0) - get_local_size(0), // dst_line_stride, - C, // num_planes, - 0, // src_plane_stride - get_global_size(0)*get_global_size(1) - get_local_size(0) * get_local_size(1), // dst_plane_stride - 0); // event - wait_group_events(1, &e2); -} -#endif diff --git a/inference-engine/src/vpu/custom_kernels/mvn.cl b/inference-engine/src/vpu/custom_kernels/mvn.cl index ab595bb0f32..9c5499c3848 100644 --- a/inference-engine/src/vpu/custom_kernels/mvn.cl +++ b/inference-engine/src/vpu/custom_kernels/mvn.cl @@ -1,3 +1,7 @@ +// Copyright (C) 2018-2020 Intel Corporation +// SPDX-License-Identifier: Apache-2.0 +// + #pragma OPENCL EXTENSION cl_khr_fp16 : enable // Define if runtime supports it. MX runtime is compatible, KMB is in WIP state diff --git a/inference-engine/src/vpu/custom_kernels/quantize.cl b/inference-engine/src/vpu/custom_kernels/quantize.cl index 0b5d414260e..dd225877bff 100644 --- a/inference-engine/src/vpu/custom_kernels/quantize.cl +++ b/inference-engine/src/vpu/custom_kernels/quantize.cl @@ -1,154 +1,176 @@ +// Copyright (C) 2018-2020 Intel Corporation +// SPDX-License-Identifier: Apache-2.0 +// + #pragma OPENCL EXTENSION cl_khr_fp16 : enable -__kernel void __dma_preload_quantize(const __global half* __restrict src, - const __global half* __restrict input_low, - const __global half* __restrict input_high, - const __global half* __restrict output_low, - const __global half* __restrict output_high, - const __global half* __restrict dst, - int levels, - int input_low_size, - int input_high_size, - int output_low_size, - int output_high_size, - int W, - int H, - __local half* __restrict src_local, - const __local half* __restrict dst_local) +__kernel void __dma_preload_quantize(__global half const *const restrict src, + __global half const *const restrict input_low, + __global half const *const restrict input_high, + __global half const *const restrict output_low, + __global half const *const restrict output_high, + __global half *const restrict dst, + int levels, + int input_low_size, + int input_high_size, + int output_low_size, + int output_high_size, + int W, + int C, + __local half *const restrict local_src, + __local half const *const restrict local_dst) { - const int sizePlane = W*H; - async_work_group_copy(src_local ,src + get_group_id(0)*sizePlane, sizePlane, 0); + WorkGroupDmaCreateStrideTransaction( + src + get_group_id(1) * get_local_size(1) * W, // src + local_src, // dst + W * sizeof(half), // src_width, + W * sizeof(half), // dst_width, + get_global_size(1) * W * sizeof(half), // src_stride, + W * sizeof(half), // dst_stride, + W * C * sizeof(half), // size + 0); } -__kernel void __dma_postwrite_quantize( const __global half* __restrict src, - const __global half* __restrict input_low, - const __global half* __restrict input_high, - const __global half* __restrict output_low, - const __global half* __restrict output_high, - __global half* __restrict dst, - int levels, - int input_low_size, - int input_high_size, - int output_low_size, - int output_high_size, - int W, - int H, - const __local half* __restrict src_local, - const __local half* __restrict dst_local) +__kernel void __dma_postwrite_quantize(__global half const *const restrict src, + __global half const *const restrict input_low, + __global half const *const restrict input_high, + __global half const *const restrict output_low, + __global half const *const restrict output_high, + __global half *const restrict dst, + int levels, + int input_low_size, + int input_high_size, + int output_low_size, + int output_high_size, + int W, + int C, + __local half const *const restrict local_src, + __local half const *const restrict local_dst) { - const int sizePlane = W*H; - async_work_group_copy(dst + get_group_id(0)*sizePlane ,dst_local, sizePlane, 0); + WorkGroupDmaCreateStrideTransaction( + local_dst, // src + dst + get_group_id(1) * get_local_size(1) * W, // dst + W * sizeof(half), // src_width, + W * sizeof(half), // dst_width, + W * sizeof(half), // src_stride, + get_global_size(1) * W * sizeof(half), // dst_stride, + W * C * sizeof(half), // size + 0); } -__kernel void quantize(const __global half* __restrict src, - const __global half* __restrict input_low, - const __global half* __restrict input_high, - const __global half* __restrict output_low, - const __global half* __restrict output_high, - const __global half* __restrict dst, - int levels, - int input_low_size, - int input_high_size, - int output_low_size, - int output_high_size, - int W, - int H, - const __local half* __restrict src_local, - __local half* __restrict dst_local) +__kernel void quantize(__global half const *const restrict src, + __global half const *const restrict input_low, + __global half const *const restrict input_high, + __global half const *const restrict output_low, + __global half const *const restrict output_high, + __global half const *const restrict dst, + int levels, + int input_low_size, + int input_high_size, + int output_low_size, + int output_high_size, + int W, + int C, + __local half const *const restrict local_src, + __local half *const restrict local_dst) { + int h = get_global_id(1); + int H = get_global_size(1); - int c = get_global_id(0); + for (int c = 0; c < C; c++) + { + half h_ilow = (input_low_size == 1 ? input_low[0] : input_low[c]); + half h_ihigh = (input_high_size == 1 ? input_high[0] : input_high[c]); + half h_olow = (output_low_size == 1 ? output_low[0] : output_low[c]); + half h_ohigh = (output_high_size == 1 ? output_high[0] : output_high[c]); - int C = get_global_size(0); + half const1 = (half)(!(h_ihigh - h_ilow) ? 0.0f : convert_float(levels - 1) / (convert_float(h_ihigh) - convert_float(h_ilow))); + half const2 = (half)(!(levels - 1) ? 0.0f : (convert_float(h_ohigh) - convert_float(h_olow)) / convert_float(levels - 1)); - half h_ilow = (input_low_size == 1 ? input_low[0] : input_low[c]); - half h_ihigh = (input_high_size == 1 ? input_high[0] : input_high[c]); - half h_olow = (output_low_size == 1 ? output_low[0] : output_low[c]); - half h_ohigh = (output_high_size == 1 ? output_high[0] : output_high[c]); + __local const half* restrict addr_src = local_src + c*W; + __local half* restrict addr_dst = local_dst + c*W; - half8 h_ilow8 = h_ilow; - half8 h_ihigh8 = h_ihigh; - half8 h_olow8 = h_olow; - half8 h_ohigh8 = h_ohigh; + for (int w = 0; w < W / 8; w++) + { + half8 val = *((__local half8*)addr_src + w); +#if 1 + // round is too slow =( 902 b of code + //half8 aux = round((val - (half8)h_ilow) * (half8)const1); - float f_ilow = convert_float(h_ilow); - float f_ihigh = convert_float(h_ihigh); - float f_olow = convert_float(h_olow); - float f_ohigh = convert_float(h_ohigh); + half8 aux = (val - (half8)h_ilow) * (half8)const1 + (half8)0.5h; - float8 f_ilow8 = f_ilow; - float8 f_ihigh8 = f_ihigh; - float8 f_olow8 = f_olow; - float8 f_ohigh8 = f_ohigh; + aux = (half8){ + (half)(short)(aux.s0), + (half)(short)(aux.s1), + (half)(short)(aux.s2), + (half)(short)(aux.s3), + (half)(short)(aux.s4), + (half)(short)(aux.s5), + (half)(short)(aux.s6), + (half)(short)(aux.s7) + }; - float const1 = !(f_ihigh - f_ilow) ? 0.0f : convert_float(levels - 1) / (f_ihigh - f_ilow); - float const2 = !(levels - 1) ? 0.0f : (f_ohigh - f_olow) / convert_float(levels - 1); - - for (int h = 0; h < H; h++) { - int idx = h*W; + aux = aux * (half8)const2 + (half8)h_olow; - __local half* addr_src = (__local half*)src_local + idx; - __local half* addr_dst = (__local half*)dst_local + idx; + // vector comparison add 756 b of assembly, so do in manually + // short8 a = val <= (half8)h_olow; + // short8 b = val > (half8)h_ohigh; - for (int w = 0; w < W / 8; w++) { - half8 h_src_val8 = (*((__local half8*)addr_src + w)); - float8 f_src_val8 = convert_float8(h_src_val8); + short8 a; + short8 b; + a.s0 = (val.s0 <= h_ilow); + a.s1 = (val.s1 <= h_ilow); + a.s2 = (val.s2 <= h_ilow); + a.s3 = (val.s3 <= h_ilow); + a.s4 = (val.s4 <= h_ilow); + a.s5 = (val.s5 <= h_ilow); + a.s6 = (val.s6 <= h_ilow); + a.s7 = (val.s7 <= h_ilow); - short8 aux_cond1; - aux_cond1.s0 = (h_src_val8.s0 <= h_ilow); - aux_cond1.s1 = (h_src_val8.s1 <= h_ilow); - aux_cond1.s2 = (h_src_val8.s2 <= h_ilow); - aux_cond1.s3 = (h_src_val8.s3 <= h_ilow); - aux_cond1.s4 = (h_src_val8.s4 <= h_ilow); - aux_cond1.s5 = (h_src_val8.s5 <= h_ilow); - aux_cond1.s6 = (h_src_val8.s6 <= h_ilow); - aux_cond1.s7 = (h_src_val8.s7 <= h_ilow); - aux_cond1 *= aux_cond1; + b.s0 = (val.s0 > h_ihigh); + b.s1 = (val.s1 > h_ihigh); + b.s2 = (val.s2 > h_ihigh); + b.s3 = (val.s3 > h_ihigh); + b.s4 = (val.s4 > h_ihigh); + b.s5 = (val.s5 > h_ihigh); + b.s6 = (val.s6 > h_ihigh); + b.s7 = (val.s7 > h_ihigh); - short8 aux_cond2; - aux_cond2.s0 = (h_src_val8.s0 > h_ihigh); - aux_cond2.s1 = (h_src_val8.s1 > h_ihigh); - aux_cond2.s2 = (h_src_val8.s2 > h_ihigh); - aux_cond2.s3 = (h_src_val8.s3 > h_ihigh); - aux_cond2.s4 = (h_src_val8.s4 > h_ihigh); - aux_cond2.s5 = (h_src_val8.s5 > h_ihigh); - aux_cond2.s6 = (h_src_val8.s6 > h_ihigh); - aux_cond2.s7 = (h_src_val8.s7 > h_ihigh); - aux_cond2 *= aux_cond2; + a = ~(a-(short8)1); + b = ~(b-(short8)1); - short8 aux_cond3 = (!aux_cond1 & aux_cond2); - short8 aux_cond4 = (!aux_cond1 & !aux_cond2); - aux_cond3 *= aux_cond3; - aux_cond4 *= aux_cond4; + short8 c1 = (~a & b); + short8 c2 = (~a & ~b); - half8 cond1 = convert_half8(aux_cond1); - half8 cond2 = convert_half8(aux_cond2); - half8 cond3 = convert_half8(aux_cond3); - half8 cond4 = convert_half8(aux_cond4); + short8 res = a & as_short8((half8)h_olow) + | c1 & as_short8((half8)h_ohigh) + | c2 & as_short8(aux); - half8 aux; - aux = convert_half8(round(((f_src_val8 - f_ilow8) * (float8)const1)) * (float8)const2 + f_olow8); - half8 dst_val = ( - (h_olow8 * cond1) + - (h_ohigh8 * cond3) + - (aux * cond4) - ); - *((__local half8*)addr_dst + w) = dst_val; + *((__local half8*)addr_dst + w) = as_half8(res); +#else + *((__local half8*)addr_dst + w) = val; +#endif } - for (int w = W & (~0x7); w < W; w++) { - half h_src_val = addr_src[w]; - float f_src_val = convert_float(h_src_val); - half dst_val; + for (int w = W & (~0x7); w < W; w++) + //for (int w = 0 ; w < W; w++) + { + half val = addr_src[w]; +#if 1 + short a = val <= h_ilow; a = ~(a-1); + short b = val > h_ihigh; b = ~(b-1); - if (h_src_val <= h_ilow) { - dst_val = h_olow; - } else if (h_src_val > h_ihigh) { - dst_val = h_ohigh; - } else { - dst_val = convert_half(round((f_src_val - f_ilow) * const1) * const2 + f_olow); - } - addr_dst[w] = dst_val; + short c1 = (~a & b); + short c2 = (~a & ~b); + + short res = a & as_short(h_olow) + | c1 & as_short(h_ohigh) + | c2 & as_short(((half)(round( (val - h_ilow) * const1) * const2) + h_olow)); + + addr_dst[w] = as_half(res); +#else + addr_dst[w] = val; +#endif } } } diff --git a/inference-engine/src/vpu/custom_kernels/region.cl b/inference-engine/src/vpu/custom_kernels/region.cl new file mode 100644 index 00000000000..d04b7383c60 --- /dev/null +++ b/inference-engine/src/vpu/custom_kernels/region.cl @@ -0,0 +1,474 @@ +// Copyright (C) 2018-2020 Intel Corporation +// SPDX-License-Identifier: Apache-2.0 +// + +#pragma OPENCL EXTENSION cl_khr_fp16 : enable + +__constant static half log_2_e = (half)1.442695040888963; // log2(exp(1.0)) + +#define ALLOW_EARLY_RETURN 1 + +#define USE_MANUAL_DMA 1 + +#if USE_MANUAL_DMA + +static void inline logistic_activate(__local const half* restrict src, + __local half* restrict dst, + int offset) +{ + half val = src[offset]; + val = 1.0h / (1.0h + exp2(val * -log_2_e)); + dst[offset] = val; +} + +__kernel void __dma_preload_region_chw( + __global const half* restrict src, + __global half* restrict _0, + __local half* restrict local_src, + __local half* restrict _1, + int W, /* 13 */ + int H, /* 13 */ + int classes, /* 20 */ + int coords, /* 4 */ + int num, /* 5 */ + int maskSize, + int doSoftmax + ) +{ + const int local_C = classes + coords + 1; + const int c = get_group_id(1)*local_C; + const int h = get_group_id(0); + + WorkGroupDmaCreateStrideTransaction( + src + c*H*W + h*W, // src + local_src, // dst + W*sizeof(half), // src_width, + W*sizeof(half), // dst_width, + W*H*sizeof(half), // src_stride, + W*sizeof(half), // dst_stride, + W*local_C*sizeof(half), // size + 0); +} + +__kernel void __dma_postwrite_region_chw( + __global half* restrict _0, + __global half* restrict dst, + __local half* restrict _1, + __local const half* restrict local_dst, + int W, /* 13 */ + int H, /* 13 */ + int classes, /* 20 */ + int coords, /* 4 */ + int num, /* 5 */ + int maskSize, + int doSoftmax + ) +{ + const int local_C = classes + coords + 1; + const int c = get_group_id(1)*local_C; + const int h = get_group_id(0); + + WorkGroupDmaCreateStrideTransaction( + local_dst, // src + dst + c*H*W + h*W, // dst + W*sizeof(half), // src_width, + W*sizeof(half), // dst_width, + W*sizeof(half), // src_stride, + W*H*sizeof(half), // dst_stride, + W*local_C*sizeof(half), // size + 0); +} + +__kernel void region_chw( + __global half* restrict src_data, + __global half* restrict dst_data, + __local const half* restrict local_src, + __local half* restrict local_dst, + int W, /* 13 */ + int H, /* 13 */ + int classes, /* 20 */ + int coords, /* 4 */ + int num, /* 5 */ + int maskSize, + int doSoftmax + ) +{ + const int w = get_local_id(0); + +#if ALLOW_EARLY_RETURN + if (w >= W) return; +#endif + + __local const half *restrict src = local_src + w; + __local half *restrict dst = local_dst + w; + + const int stride = W; + logistic_activate(src, dst, 0*stride); + logistic_activate(src, dst, 1*stride); + + //copy plane 2 and 3 + dst[2*stride] = src[2*stride]; + dst[3*stride] = src[3*stride]; + + logistic_activate(src, dst, 4*stride); + + src += (coords + 1)*stride; + dst += (coords + 1)*stride; + + if (doSoftmax) + { + half max_val = src[0]; + #pragma unroll 4 + for (int c = 0; c < classes; c++) + { + max_val = max(max_val, src[c*stride]); + } + + half expSum = 0.0h; + #pragma unroll 4 + for (int c = 0; c < classes; c++) + { + const half e = src[c*stride] - max_val; + const half tmp = exp2(e * log_2_e); + dst[c*stride] = tmp; + expSum += tmp; + } + + const half invExpSum = 1.0h / expSum; + #pragma unroll 4 + for (int c = 0; c < classes; c++) + { + dst[c*stride] *= invExpSum; + } + } + else + { + #pragma unroll 4 + for (int c = 0; c < classes; c++) + { + logistic_activate(src, dst, c*stride); + } + } +} + +__kernel void __dma_preload_region_hwc( + __global const half* restrict src, + __global half* restrict _0, + __local half* restrict local_src, + __local half* restrict _1, + int W, /* 13 */ + int H, /* 13 */ + int classes, /* 20 */ + int coords, /* 4 */ + int num, /* 5 */ + int maskSize, + int doSoftmax + ) +{ + const int local_C = classes + coords + 1; + const int c = get_group_id(1)*local_C; + const int h = get_group_id(0); + if (!doSoftmax) num = maskSize; + const int C = local_C*num; + + WorkGroupDmaCreateStrideTransaction( + src + h*W*C + c, // src + local_src, // dst + local_C*sizeof(half), // src_width, + local_C*sizeof(half), // dst_width, + C*sizeof(half), // src_stride, + local_C*sizeof(half), // dst_stride, + local_C*W*sizeof(half), // size + 0); +} + +__kernel void __dma_postwrite_region_hwc( + __global half* restrict _0, + __global half* restrict dst, + __local half* restrict _1, + __local const half* restrict local_dst, + int W, /* 13 */ + int H, /* 13 */ + int classes, /* 20 */ + int coords, /* 4 */ + int num, /* 5 */ + int maskSize, + int doSoftmax + ) +{ + // Region always outputs in CHW layout; same as postwrite_chw + const int local_C = classes + coords + 1; + const int c = get_group_id(1)*local_C; + const int h = get_group_id(0); + + WorkGroupDmaCreateStrideTransaction( + local_dst, // src + dst + c*H*W + h*W, // dst + W*sizeof(half), // src_width, + W*sizeof(half), // dst_width, + W*sizeof(half), // src_stride, + W*H*sizeof(half), // dst_stride, + W*local_C*sizeof(half), // size + 0); +} + +static void inline logistic_activate_hwc(__local const half* restrict src, + __local half* restrict dst, + int offset, + int stride) +{ + half val = src[offset]; + val = 1.0h / (1.0h + exp2(val * -log_2_e)); + dst[offset*stride] = val; +} + +__kernel void region_hwc( + __global half* restrict src_data, + __global half* restrict dst_data, + __local const half* restrict local_src, + __local half* restrict local_dst, + int W, /* 13 */ + int H, /* 13 */ + int classes, /* 20 */ + int coords, /* 4 */ + int num, /* 5 */ + int maskSize, + int doSoftmax + ) +{ + const int w = get_local_id(0); + +#if ALLOW_EARLY_RETURN + if (w >= W) return; +#endif + + const int local_C = classes + coords + 1; + + __local const half *restrict src = local_src + w*local_C; + __local half *restrict dst = local_dst + w; + + const int stride = W; + logistic_activate_hwc(src, dst, 0, stride); + logistic_activate_hwc(src, dst, 1, stride); + + //copy plane 2 and 3 + dst[2*stride] = src[2]; + dst[3*stride] = src[3]; + + logistic_activate_hwc(src, dst, 4, stride); + + src += coords + 1; + dst += (coords + 1)*stride; + + if (doSoftmax) + { + half max_val = src[0]; + #pragma unroll 4 + for (int c = 0; c < classes; c++) + { + max_val = max(max_val, src[c]); + } + + half expSum = 0.0h; + #pragma unroll 4 + for (int c = 0; c < classes; c++) + { + const half e = src[c] - max_val; + const half tmp = exp2(e * log_2_e); + dst[c*stride] = tmp; + expSum += tmp; + } + + const half invExpSum = 1.0h / expSum; + #pragma unroll 4 + for (int c = 0; c < classes; c++) + { + dst[c*stride] *= invExpSum; + } + } + else + { + #pragma unroll 4 + for (int c = 0; c < classes; c++) + { + logistic_activate_hwc(src, dst, c, stride); + } + } +} + +#else // defined (USE_MANUAL_DMA) + +#define NUM_CLASSES 80 + +static void inline logistic_activate(__global const half* restrict src, + __global half* restrict dst, + int offset) +{ + half val = src[offset]; + val = 1.0h / (1.0h + exp2(val * -log_2_e)); + dst[offset] = val; +} + +__kernel void region_chw( + __global const half* restrict global_src, + __global half* restrict global_dst, + __local half* restrict _0, + __local half* restrict _1, + int W, /* 13 */ + int H, /* 13 */ + int classes, /* 20 */ + int coords, /* 4 */ + int num, /* 5 */ + int maskSize, + int doSoftmax + ) +{ + const int w = get_local_id(0); + +#if ALLOW_EARLY_RETURN + if (w >= W) return; +#endif + + const int local_C = classes + coords + 1; + const int c = get_group_id(1)*local_C; + const int h = get_group_id(0); + + __global const half *restrict src = global_src + c*H*W + h*W + w; + __global half *restrict dst = global_dst + c*H*W + h*W + w; + + const int stride = H*W; + logistic_activate(src, dst, 0*stride); + logistic_activate(src, dst, 1*stride); + + //copy plane 2 and 3 + dst[2*stride] = src[2*stride]; + dst[3*stride] = src[3*stride]; + + logistic_activate(src, dst, 4*stride); + + src += (coords + 1)*stride; + dst += (coords + 1)*stride; + + if (doSoftmax) + { + __private half data[NUM_CLASSES]; + + half max_val = src[0]; + for (int c = 0; c < classes; c++) + { + half tmp = src[c*stride]; + data[c] = tmp; + max_val = max(max_val, tmp); + } + + half expSum = 0.0h; + for (int c = 0; c < classes; c++) + { + half tmp = half_exp(data[c] - max_val); + data[c] = tmp; + expSum += tmp; + } + + for (int c = 0; c < classes; c++) + { + dst[c*stride] = data[c] / expSum; + } + } + else + { + #pragma unroll 4 + for (int c = 0; c < classes; c++) + { + logistic_activate(src, dst, c*stride); + } + } +} + +static void inline logistic_activate_hwc(__global const half* restrict src, + __global half* restrict dst, + int offset, + int stride) +{ + half val = src[offset]; + val = 1.0h / (1.0h + exp2(val * -log_2_e)); + dst[offset*stride] = val; +} + + +__kernel void region_hwc( + __global const half* restrict global_src, + __global half* restrict global_dst, + __local half* restrict _0, + __local half* restrict _1, + int W, /* 13 */ + int H, /* 13 */ + int classes, /* 20 */ + int coords, /* 4 */ + int num, /* 5 */ + int maskSize, + int doSoftmax + ) +{ + const int w = get_local_id(0); + +#if ALLOW_EARLY_RETURN + if (w >= W) return; +#endif + + const int local_C = classes + coords + 1; + const int c = get_group_id(1)*local_C; + const int h = get_group_id(0); + const int C = num*local_C; + + __global const half *restrict src = global_src + h*W*C + w*C + c; + __global half *restrict dst = global_dst + c*H*W + h*W + w; + + const int stride = H*W; + logistic_activate_hwc(src, dst, 0, stride); + logistic_activate_hwc(src, dst, 1, stride); + + //copy plane 2 and 3 + dst[2*stride] = src[2]; + dst[3*stride] = src[3]; + + logistic_activate_hwc(src, dst, 4, stride); + + src += coords + 1; + dst += (coords + 1)*stride; + + if (doSoftmax) + { + __private half data[NUM_CLASSES]; + + half max_val = src[0]; + for (int c = 0; c < classes; c++) + { + half tmp = src[c]; + data[c] = tmp; + max_val = max(max_val, tmp); + } + + half expSum = 0.0h; + for (int c = 0; c < classes; c++) + { + half tmp = half_exp(data[c] - max_val); + data[c] = tmp; + expSum += tmp; + } + + for (int c = 0; c < classes; c++) + { + dst[c*stride] = data[c] / expSum; + } + } + else + { + #pragma unroll 4 + for (int c = 0; c < classes; c++) + { + logistic_activate_hwc(src, dst, c, stride); + } + } +} + +#endif // defined (USE_MANUAL_DMA) diff --git a/inference-engine/src/vpu/custom_kernels/region_chw.cl b/inference-engine/src/vpu/custom_kernels/region_chw.cl index 650d8f418de..c728042fe85 100644 --- a/inference-engine/src/vpu/custom_kernels/region_chw.cl +++ b/inference-engine/src/vpu/custom_kernels/region_chw.cl @@ -1,16 +1,6 @@ // Copyright (C) 2018-2020 Intel Corporation +// SPDX-License-Identifier: Apache-2.0 // -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. #pragma OPENCL EXTENSION cl_khr_fp16 : enable diff --git a/inference-engine/src/vpu/custom_kernels/region_chw_m7_branch0.cl b/inference-engine/src/vpu/custom_kernels/region_chw_m7_branch0.cl index 12fb6911cda..f83e8149cad 100644 --- a/inference-engine/src/vpu/custom_kernels/region_chw_m7_branch0.cl +++ b/inference-engine/src/vpu/custom_kernels/region_chw_m7_branch0.cl @@ -1,16 +1,6 @@ // Copyright (C) 2018-2020 Intel Corporation +// SPDX-License-Identifier: Apache-2.0 // -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. #pragma OPENCL EXTENSION cl_khr_fp16 : enable diff --git a/inference-engine/src/vpu/custom_kernels/region_chw_m7_branch1.cl b/inference-engine/src/vpu/custom_kernels/region_chw_m7_branch1.cl index f88df7815fb..16298d53beb 100644 --- a/inference-engine/src/vpu/custom_kernels/region_chw_m7_branch1.cl +++ b/inference-engine/src/vpu/custom_kernels/region_chw_m7_branch1.cl @@ -1,16 +1,6 @@ // Copyright (C) 2018-2020 Intel Corporation +// SPDX-License-Identifier: Apache-2.0 // -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. #pragma OPENCL EXTENSION cl_khr_fp16 : enable diff --git a/inference-engine/src/vpu/custom_kernels/reorg_chw.cl b/inference-engine/src/vpu/custom_kernels/reorg_chw.cl index 59df994f080..6cd2b7890e6 100644 --- a/inference-engine/src/vpu/custom_kernels/reorg_chw.cl +++ b/inference-engine/src/vpu/custom_kernels/reorg_chw.cl @@ -1,43 +1,121 @@ // Copyright (C) 2018-2020 Intel Corporation +// SPDX-License-Identifier: Apache-2.0 // -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. #pragma OPENCL EXTENSION cl_khr_fp16 : enable -__kernel void reorg_NCHW(__global const half* restrict src, - __global half* restrict out, - int H, - int W, - int stride) +#define USE_MANUAL_DMA + +#if defined (USE_MANUAL_DMA) + +__kernel void __dma_preload_reorg_chw(__global half const *restrict src, + __global half *restrict dst, + int W, + int H, + int C, + int stride, + __local half *restrict local_src, + __local half *restrict local_dst + ) { - int h = min((int)get_global_id(0), H-1); + const int stride_y = get_group_id(1); - int c = get_global_id(1); - int C = get_global_size(1); - int C2 = C/(stride*stride); + const int srcIdx = stride_y*W*stride + W*stride*stride*get_group_id(0); - int offset = c / C2; + WorkGroupDmaCreateStrideTransaction( + src + srcIdx, // src + local_src, // dst + W * stride * sizeof(half), // src width + W * stride * sizeof(half), // dst width + W * stride * stride * get_num_groups(0) * sizeof(half), // src stride + W * stride * sizeof(half), // dst stride + W * stride * get_local_size(0) * sizeof(half), //total size + 0); +} - int c2 = c - C2 * offset; +__kernel void __dma_postwrite_reorg_chw(__global half const *restrict src, + __global half *restrict dst, + int W, + int H, + int C, + int stride, + __local half *restrict local_src, + __local half const *restrict local_dst + ) +{ + const int stride_y = get_group_id(1); - int H2 = H*stride; - int W2 = W*stride; + const int dstIdx = stride_y*W*stride*get_global_size(0) + get_group_id(0)*W; - for (int w = 0; w < W; ++w) - { - int h2 = h*stride + offset / stride; - int w2 = w*stride + offset - stride * (offset / stride); + WorkGroupDmaCreateStrideTransaction( + local_dst, // src + dst + dstIdx, // dst + W * sizeof(half), // src width + W * sizeof(half), // dst width + W * sizeof(half), // src stride + W * get_num_groups(0) * sizeof(half), // dst stride + get_local_size(0) * W * stride * sizeof(half), //total size + 0); +} - out[W*H*c + W*h + w] = src[W2*H2*c2 + W2*h2 + w2]; +__kernel void reorg_chw(__global half const *restrict src, + __global half *restrict dst, + int W, + int H, + int C, + int stride, + __local half *restrict local_src, + __local half *restrict local_dst + ) +{ + const int c = get_local_id(0); + const int stride_x = get_local_id(1); + + const int srcIdx = stride_x + c*W*stride; + const int dstIdx = stride_x*W*get_local_size(0) + c*W; + + int x = 0; + for (; x <= W - 8; x += 8) { + half8 data = (half8) { + local_src[srcIdx + (x + 0)*stride], local_src[srcIdx + (x + 1)*stride], + local_src[srcIdx + (x + 2)*stride], local_src[srcIdx + (x + 3)*stride], + local_src[srcIdx + (x + 4)*stride], local_src[srcIdx + (x + 5)*stride], + local_src[srcIdx + (x + 6)*stride], local_src[srcIdx + (x + 7)*stride] + }; + + *((__local half8*)(&local_dst[dstIdx + x])) = data; + } + + for (; x < W; x++) { + local_dst[dstIdx + x] = local_src[srcIdx + x*stride]; } } + +#else + +__kernel void reorg_chw(__global half const *restrict src, + __global half *restrict dst, + int W, + int H, + int C, + int stride, + __local half const *restrict _0, + __local half *restrict _1 + ) +{ + const int stride_x = get_local_id(1); + const int stride_y = get_group_id(1); + const int N = get_global_size(0); + const int c = get_local_id(0)*get_num_groups(0) + get_group_id(0); + + const int srcIdx = c*W*stride*stride + stride_x + stride_y*W*stride; + const int dstIdx = c*W + stride_x*W*N + stride_y*W*N*stride; + + #pragma unroll 8 + for (int x = 0; x < W; x++) { + dst[dstIdx + x] = src[srcIdx + x*stride]; + } +} + +#endif + diff --git a/inference-engine/src/vpu/custom_kernels/reorg_chw_local.cl b/inference-engine/src/vpu/custom_kernels/reorg_chw_local.cl index 62b9c579ca7..35032cf9223 100644 --- a/inference-engine/src/vpu/custom_kernels/reorg_chw_local.cl +++ b/inference-engine/src/vpu/custom_kernels/reorg_chw_local.cl @@ -1,16 +1,6 @@ // Copyright (C) 2018-2020 Intel Corporation +// SPDX-License-Identifier: Apache-2.0 // -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. #pragma OPENCL EXTENSION cl_khr_fp16 : enable diff --git a/inference-engine/src/vpu/custom_kernels/reorg_chw_stack.cl b/inference-engine/src/vpu/custom_kernels/reorg_chw_stack.cl index 3482649b5e7..3e0932e7cd6 100644 --- a/inference-engine/src/vpu/custom_kernels/reorg_chw_stack.cl +++ b/inference-engine/src/vpu/custom_kernels/reorg_chw_stack.cl @@ -1,16 +1,6 @@ // Copyright (C) 2018-2020 Intel Corporation +// SPDX-License-Identifier: Apache-2.0 // -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. #pragma OPENCL EXTENSION cl_khr_fp16 : enable diff --git a/inference-engine/src/vpu/custom_kernels/reorg_hwc.cl b/inference-engine/src/vpu/custom_kernels/reorg_hwc.cl index 56b3c86f6aa..6bbddc08f9a 100644 --- a/inference-engine/src/vpu/custom_kernels/reorg_hwc.cl +++ b/inference-engine/src/vpu/custom_kernels/reorg_hwc.cl @@ -1,64 +1,139 @@ // Copyright (C) 2018-2020 Intel Corporation +// SPDX-License-Identifier: Apache-2.0 // -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -#define MIN(v1, v2) ((v1) < (v2) ? (v1) : (v2)) #pragma OPENCL EXTENSION cl_khr_fp16 : enable -__kernel void reorg(__global half* restrict src, - __global half* restrict out, - int h, - int w, - int stride) +__kernel void __dma_preload_reorg_hwc(__global half const *restrict src, + __global half *restrict _0, + int W, + int H, + int C, + int stride, + __local half *restrict local_src, + __local half *restrict _1 + ) { - int j = MIN(get_global_id(0), h-1); + const int stride_x = get_group_id(1); - int k = get_global_id(1); - int c = get_global_size(1); + WorkGroupDmaCreateStrideTransaction( + src + get_group_id(0) * stride + stride_x * C, // src + local_src, // dst + stride * sizeof(half), // src_width, + stride * sizeof(half), // dst_width, + C * stride * sizeof(half), // src_stride, + stride * sizeof(half), // dst_stride, + H * W * sizeof(half), // size + 0); +} - int out_c = c / (stride * stride); - int oc = c * (stride * stride); - int oh = h / stride; - int ow = w / stride; +__kernel void __dma_postwrite_reorg_hwc(__global half const *restrict _0, + __global half *restrict dst, + int W, + int H, + int C, + int stride, + __local half *restrict _1, + __local half *restrict local_dst + ) +{ + const int stride_x = get_group_id(1); - int in_index = w * (j + h*k); + WorkGroupDmaCreateStrideTransaction( + local_dst, // src + dst + stride_x * C + get_group_id(0) * stride, // dst + stride * sizeof(half), // src_width, + stride * sizeof(half), // dst_width, + stride * sizeof(half), // src_stride, + C * stride * sizeof(half), // dst_stride, + W * H * sizeof(half), // size + 0); +} - int new_z = in_index / (oh*ow); - int new_y = (in_index %(oh*ow)) / ow; - int new_x = (in_index %(oh*ow)) % ow; - int new_index = new_z + new_x * oc + new_y * oc * ow; +__kernel void reorg_hwc(__global half const *restrict src, + __global half *restrict dst, + int W, + int H, + int C, + int stride, + __local half *restrict local_src, + __local half *restrict local_dst + ) +{ + const int stride_y = get_local_id(1); + const int blocks = get_local_size(0); + const int b = get_local_id(0); - in_index++; + const int OC = stride * stride; + const int OH = H / stride; + const int OW = W / stride; + const int IC = stride; + const int IH = H; + const int IW = W / stride; - int c2 = k % out_c; - int offset = k / out_c; - int w2 = 0 * stride + offset % stride; - int h2 = j * stride + offset / stride; - int out_index = w2 + w * stride * (h2 + h * stride * c2); + for (int block_h = 0; block_h < stride; block_h++) { + const int src_line = b * stride * stride + stride_y * stride + block_h; + const int c = src_line / IH; + const int h = src_line % IH; - for (int i = 0; i < w; ++i, out_index+=stride, in_index++) - { - // repacking coordinates - int k0 = out_index / (h*w); - int j0 = (out_index % (h*w)) / w; - int i0 = (out_index % (h*w)) % w; - int out_index_repack = k0 + c * i0 + c * w * j0; - out[new_index] = src[out_index_repack]; + const int dst_line = b * stride + stride_y * blocks * stride + block_h; + const int oc = dst_line / OH; + const int oh = dst_line % OH; - int new_z = in_index / (oh*ow); - int new_y = (in_index %(oh*ow)) / ow; - int new_x = (in_index %(oh*ow)) % ow; - new_index = new_z + new_x * oc + new_y * oc * ow; + for (int w = 0; w < W / stride; w++) { + local_dst[oh*OW*OC + w*OC + oc] = local_src[h*IW*IC + w*IC + c]; + } + } +} + +__kernel void reorg_hwc_naive(__global half const *restrict src, + __global half *restrict dst, + int W, + int H, + int C, + int stride, + __local half *restrict local_src, + __local half *restrict local_dst + ) +{ + const int out_c = C / (stride * stride); + const int oc = C * (stride * stride); + const int oh = H / stride; + const int ow = W / stride; + + const int c = get_global_id(0); + + for (int h = 0; h < H; ++h) + { + int in_index = W * (h + H*c) + (0); + int new_z = in_index / (oh*ow); + int new_y = (in_index %(oh*ow)) / ow; + int new_x = (in_index %(oh*ow)) % ow; + int new_index = new_z + new_x * oc + new_y * oc * ow; + + in_index++; + + int c2 = c % out_c; + int offset = c / out_c; + int w2 = 0 * stride + offset % stride; + int h2 = h * stride + offset / stride; + int out_index = w2 + W * stride * (h2 + H * stride * c2); + + #pragma unroll 2 + for(int i = 0; i < W; ++i, out_index+=stride, in_index++) + { + // repacking coordinates + int k0 = out_index / (H*W); + int j0 = (out_index % (H*W)) / W; + int i0 = (out_index % (H*W)) % W; + int out_index_repack = k0 + C * i0 + C * W * j0; + + dst[new_index] = src[out_index_repack]; + + int new_z = in_index / (oh*ow); + int new_y = (in_index %(oh*ow)) / ow; + int new_x = (in_index %(oh*ow)) % ow; + new_index = new_z + new_x * oc + new_y * oc * ow; + } } } diff --git a/inference-engine/src/vpu/custom_kernels/resample_nn.cl b/inference-engine/src/vpu/custom_kernels/resample_nn.cl index 49a741a0585..9584cb2518f 100644 --- a/inference-engine/src/vpu/custom_kernels/resample_nn.cl +++ b/inference-engine/src/vpu/custom_kernels/resample_nn.cl @@ -1,16 +1,6 @@ // Copyright (C) 2018-2020 Intel Corporation +// SPDX-License-Identifier: Apache-2.0 // -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. #pragma OPENCL EXTENSION cl_khr_fp16 : enable @@ -22,8 +12,126 @@ #define ROUND(x) (int)(round(x)) #endif +inline int out_to_in(float ox, float f) { + return (int)((ox + 0.5f) * f); +} + +#define USE_MANUAL_DMA + +#if defined (USE_MANUAL_DMA) + +void interpolationCHW_nn(__local half* psrc, __local half* pdst, int OW, int IW, int C, float rw, float rh) +{ + float alpha = rh / 2.0f - 0.5f; + + for (int w = 0; w < OW/8; w++) + { + float fw0 = rw*(w*8+0) + alpha; + float fw1 = rw*(w*8+1) + alpha; + float fw2 = rw*(w*8+2) + alpha; + float fw3 = rw*(w*8+3) + alpha; + + float fw4 = rw*(w*8+4) + alpha; + float fw5 = rw*(w*8+5) + alpha; + float fw6 = rw*(w*8+6) + alpha; + float fw7 = rw*(w*8+7) + alpha; + + int iw0 = __builtin_shave_cmu_min_i32_rr_int((int)ROUND(fw0), IW-1); + int iw1 = __builtin_shave_cmu_min_i32_rr_int((int)ROUND(fw1), IW-1); + int iw2 = __builtin_shave_cmu_min_i32_rr_int((int)ROUND(fw2), IW-1); + int iw3 = __builtin_shave_cmu_min_i32_rr_int((int)ROUND(fw3), IW-1); + + int iw4 = __builtin_shave_cmu_min_i32_rr_int((int)ROUND(fw4), IW-1); + int iw5 = __builtin_shave_cmu_min_i32_rr_int((int)ROUND(fw5), IW-1); + int iw6 = __builtin_shave_cmu_min_i32_rr_int((int)ROUND(fw6), IW-1); + int iw7 = __builtin_shave_cmu_min_i32_rr_int((int)ROUND(fw7), IW-1); + + for (int c = 0; c < C; c++) + { + half8 val = { + *((__local half*)(psrc + c * IW + iw0)), + *((__local half*)(psrc + c * IW + iw1)), + + *((__local half*)(psrc + c * IW + iw2)), + *((__local half*)(psrc + c * IW + iw3)), + + *((__local half*)(psrc + c * IW + iw4)), + *((__local half*)(psrc + c * IW + iw5)), + + *((__local half*)(psrc + c * IW + iw6)), + *((__local half*)(psrc + c * IW + iw7)), + }; + *((__local half8*)(pdst + c * OW + w*8)) = val; + } + } + + for (int w = OW/8*8; w < OW; w++) + { + float fw = rw*w + alpha; + int iw0 = __builtin_shave_cmu_min_i32_rr_int((int)ROUND(fw), IW-1); + + for (int c = 0; c < C; c++) + { + *((__local half*)(pdst + c * OW + w)) = *((__local half*)(psrc + c * IW + iw0)); + } + } +} + +__kernel void __dma_preload_resample_nearest(__global const half* restrict src, + __global half* restrict _0, + __local half* restrict local_src, + __local half* restrict _1, + int iw, + int ih, + float factor, + int ow, + int oh, + int channels) +{ + const int oy_first = get_group_id(1) * get_local_size(1); + const int oy_last = (get_group_id(1) + 1) * get_local_size(1) - 1; + const int iy_first = out_to_in(oy_first, 1.0 / factor); + const int iy_last = out_to_in(oy_last, 1.0 /factor); + const int iy_size = iy_last - iy_first + 1; + + WorkGroupDmaCreateStrideTransaction( + src + get_group_id(2)*channels*ih*iw + iy_first*iw, // src + local_src, // dst + iy_size * iw * sizeof(half), // src_width, + iy_size * iw * sizeof(half), // dst_width, + ih * iw * sizeof(half), // src_stride, + iy_size * iw * sizeof(half), // dst_stride, + channels * iy_size * iw * sizeof(half), // size + 0); +} + +__kernel void __dma_postwrite_resample_nearest(__global const half* restrict _0, + __global half* restrict dst, + __local half* restrict _1, + __local half* restrict local_dst, + int iw, + int ih, + float factor, + int ow, + int oh, + int channels) +{ + + WorkGroupDmaCreateStrideTransaction( + local_dst, // src + dst + get_group_id(2)*channels*get_global_size(1)*ow + get_group_id(1)*get_local_size(1)*ow, // dst + get_local_size(1) * ow * sizeof(half), // src_width, + get_local_size(1) * ow * sizeof(half), // dst_width, + get_local_size(1) * ow * sizeof(half), // src_stride, + get_global_size(1) * ow * sizeof(half), // dst_stride, + channels * get_local_size(1) * ow * sizeof(half), // size + 0); +} + kernel void resample_nearest(__global const half* restrict src, __global half* restrict dst, + __local half* restrict local_src, + __local half* restrict local_dst, int iw, int ih, float factor, @@ -31,30 +139,35 @@ kernel void resample_nearest(__global const half* restrict src, int oh, int channels) { - int oy = min((int)get_global_id(0), oh-1); - int c = get_global_id(1); - int b = get_global_id(2); + interpolationCHW_nn(local_src, local_dst, ow, iw, channels, 1.0 / factor, 1.0 / factor); +} - float fx = 1.f / factor; - float fy = 1.f / factor; +#else // defined (USE_MANUAL_DMA) - __global const half* start_src = src + b * iw * ih * channels + iw * ih * c; - __global half* start_dst = dst + b * ow * oh * channels + ow * oh * c; +kernel void resample_nearest(__global const half* restrict src, + __global half* restrict dst, + __local half* restrict local_src, + __local half* restrict local_dst, + int iw, + int ih, + float factor, + int ow, + int oh, + int channels) +{ + const float inv_factor = 1.0f / factor; + const int iy = out_to_in(get_global_id(1), inv_factor); - for (int ox = 0; ox < ow; ox++) + __global half* dst_data = dst + get_global_id(1)*ow; + __global half* src_data = src + iy*iw; + + for (int ox = 0; ox < ow; ++ox) { - float ix_r0 = ox*fx + fx / 2.0f - 0.5f; - float iy_r0 = oy*fy + fy / 2.0f - 0.5f; - - int ix_r1 = ROUND(ix_r0); - int iy_r1 = ROUND(iy_r0); - - ix_r1 = max(ix_r1, 0); - ix_r1 = min(ix_r1, iw - 1); - - iy_r1 = max(iy_r1, 0); - iy_r1 = min(iy_r1, ih - 1); - - start_dst[oy * ow + ox] = start_src[iy_r1 * iw + ix_r1]; + const int ix = out_to_in(ox, inv_factor); + for (int c = 0; c < channels; c++) { + dst_data[c*oh*ow + ox] = src_data[c*ih*iw + ix]; + } } } + +#endif // defined (USE_MANUAL_DMA) diff --git a/inference-engine/src/vpu/custom_kernels/resample_with_antialias.cl b/inference-engine/src/vpu/custom_kernels/resample_with_antialias.cl index 621633c7e41..26d310dc340 100644 --- a/inference-engine/src/vpu/custom_kernels/resample_with_antialias.cl +++ b/inference-engine/src/vpu/custom_kernels/resample_with_antialias.cl @@ -1,31 +1,110 @@ // Copyright (C) 2018-2020 Intel Corporation +// SPDX-License-Identifier: Apache-2.0 // -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. #pragma OPENCL EXTENSION cl_khr_fp16 : enable +#define USE_OPTIMIZED_ROUND + +#ifdef USE_OPTIMIZED_ROUND + #define ROUND(x) ((int)((x) + 0.5f)) +#else + #define ROUND(x) (int)(round(x)) +#endif + + +inline int out_to_in(float ox, float f) { +#ifdef USE_OPTIMIZED_ROUND + return (int)((ox + 0.5f) / f); +#else + return ROUND((ox + 0.5f) / f - 0.5f); +#endif +} + static inline float triangleCoeff(float x) { - return 1.0f - fabs(x);//fmax(0.0f, 1 - fabs(x)); + return 1.0f - fabs(x); } static inline float4 triangleCoeff4(float4 x) { - return 1.0f - fabs(x);//fmax(0.0f, 1 - fabs(x)); + return 1.0f - fabs(x); +} + +static inline half triangleCoeffHalf(half x) +{ + return 1.0h - fabs(x); +} + +static inline half4 triangleCoeffHalf4(half4 x) +{ + return 1.0h - fabs(x); +} + +static inline half8 triangleCoeffHalf8(half8 x) +{ + return 1.0h - fabs(x); +} + +#define USE_MANUAL_DMA + +#if defined (USE_MANUAL_DMA) + +__kernel void __dma_preload_resample_with_antialias(__global const half* restrict src, + __global half* restrict _0, + __local half* restrict local_src, + __local half* restrict _1, + int iw, + int ih, + float factor, + int ow, + int oh, + int channels) +{ + const int r = (factor > 1.0f) ? 2 : ceil(1.0f / factor); + const int oy_first = get_group_id(1) * get_local_size(1); + const int oy_last = (get_group_id(1) + 1) * get_local_size(1) - 1; + const int iy_first = max(out_to_in(oy_first, factor) - r, 0); + const int iy_last = min(out_to_in(oy_last, factor) + r, ih - 1); + const int iy_size = iy_last - iy_first + 1; + + WorkGroupDmaCreateStrideTransaction( + src + get_group_id(2)*get_local_size(2)*ih*iw + iy_first*iw, // src + local_src, // dst + iy_size * iw * sizeof(half), // src_width, + iy_size * iw * sizeof(half), // dst_width, + ih * iw * sizeof(half), // src_stride, + iy_size * iw * sizeof(half), // dst_stride, + get_local_size(2) * iy_size * iw * sizeof(half), // size + 0); +} + +__kernel void __dma_postwrite_resample_with_antialias(__global const half* restrict _0, + __global half* restrict dst, + __local half* restrict _1, + __local half* restrict dst_local, + int iw, + int ih, + float factor, + int ow, + int oh, + int channels) +{ + WorkGroupDmaCreateStrideTransaction( + dst_local, // src + dst + get_group_id(2)*get_local_size(2)*get_global_size(1)*ow + get_group_id(1)*get_local_size(1)*ow, // dst + get_local_size(1) * ow * sizeof(half), // src_width, + get_local_size(1) * ow * sizeof(half), // dst_width, + get_local_size(1) * ow * sizeof(half), // src_stride, + get_global_size(1) * ow * sizeof(half), // dst_stride, + get_local_size(2) * get_local_size(1) * ow * sizeof(half), // size + 0); } __kernel void resample_with_antialias(const __global half* restrict src, __global half* restrict dst, + __local half* restrict local_src, + __local half* restrict local_dst, int iw, int ih, float factor, @@ -33,47 +112,39 @@ __kernel void resample_with_antialias(const __global half* restrict src, int oh, int channels) { - int oy = min((int)get_global_id(0), oh-1); - int c = get_global_id(1); - int b = get_global_id(2); + const int r = (factor > 1.0f) ? 2 : ceil(1.0f / factor); + const int oy_first = get_group_id(1) * get_local_size(1); + const int oy_last = (get_group_id(1) + 1) * get_local_size(1) - 1; + const int iy_first = max(out_to_in(oy_first, factor) - r, 0); + const int iy_last = min(out_to_in(oy_last, factor) + r, ih - 1); + const int iy_size = iy_last - iy_first + 1; + const int oy = get_global_id(1); + const float iy_f = ((oy + 0.5f) / factor - 0.5f) - iy_first; + const int iy = ROUND(iy_f); - float fx = 1.f / factor; - float fy = 1.f / factor; - - float ax = 1.0f / fx; - float ay = 1.0f / fy; - - int rx = (fx < 1.0f) ? 2 : ceil((1.0f)/ax); - int ry = (fy < 1.0f) ? 2 : ceil((1.0f)/ay); - - const __global half* restrict start_src = src + b * iw * ih * channels + iw * ih * c; - __global half* restrict start_dst = dst + b * ow * oh * channels + ow * oh * c; - - float iy_r0 = oy*fy + fy / 2.0f - 0.5f; - int iy_r1 = (int)(round(iy_r0)); + __local half const *restrict start_src = local_src + iw * get_local_id(1) + iw * iy_size * get_local_id(2); + __local half *restrict start_dst = local_dst + ow * get_local_id(1) + ow * get_local_size(1) * get_local_id(2); for (int ox = 0; ox < ow; ox++) { - float ix_r0 = ox*fx + fx / 2.0f - 0.5f; - int ix_r1 = (int)(round(ix_r0)); + const float ix_f = (float)((ox + 0.5f) / factor) - 0.5f; + const int ix_i = ROUND(ix_f); float4 v_sum = 0.f; float4 v_wsum = 0.f; - - for (int y = max(iy_r1 - ry, 0); - y <= min(iy_r1 + ry, (int)ih - 1); y++) + for (int y = 0; y < iy_size; y++) { - float dy = iy_r0 - y; - int x = max(ix_r1 - rx, 0); - int end_x = min(ix_r1 + rx, (int)iw - 1); + float dy = iy_f - y; + int x = max(ix_i - r, 0); + int end_x = min(ix_i + r, iw - 1); float4 dx; for (int i = 0; i < 4; i++) - dx[i] = ix_r0 - x - i; + dx[i] = ix_f - x - i; - for (; x <= end_x - 3; x += 4, dx -= 4) + for (; x < end_x - 3; x += 4, dx -= 4) { - float4 w = ax*triangleCoeff4(ax*dx) * ay*triangleCoeff(ay*dy); + float4 w = factor*triangleCoeff4(factor*dx) * factor*triangleCoeff(factor*dy); float4 src_vec = { start_src[y*iw + x + 0], start_src[y*iw + x + 1], start_src[y*iw + x + 2], @@ -85,8 +156,79 @@ __kernel void resample_with_antialias(const __global half* restrict src, for (; x <= end_x; x++) { - float dx = ix_r0 - x; - float w = ax*triangleCoeff(ax*dx) * ay*triangleCoeff(ay*dy); + float dx = ix_f - x; + float w = factor*triangleCoeff(factor*dx) * factor*triangleCoeff(factor*dy); + + v_sum[0] += w * start_src[y*iw + x]; + v_wsum[0] += w; + } + } + + v_sum[0] = v_sum[0] + v_sum[1] + v_sum[2] + v_sum[3]; + v_wsum[0] = v_wsum[0] + v_wsum[1] + v_wsum[2] + v_wsum[3]; + + start_dst[get_local_id(1)*ow + ox] = (!v_wsum[0]) ? 0.0f : (half)(v_sum[0] / v_wsum[0]); + } +} + +#else + +__kernel void resample_with_antialias(const __global half* restrict src, + __global half* restrict dst, + __local half* restrict _0, + __local half* restrict _1, + int iw, + int ih, + float factor, + int ow, + int oh, + int channels) +{ + int oy = get_global_id(1); + int c = get_global_id(2); + + int r = (factor > 1.0f) ? 2 : ceil((1.0f)/factor); + + const __global half* restrict start_src = src + iw * ih * c; + __global half* restrict start_dst = dst + ow * oh * c; + + float iy_f = (oy + 0.5) / factor - 0.5f; + int iy_i = ROUND(iy_f); + + for (int ox = 0; ox < ow; ox++) + { + float ix_f = (ox + 0.5) / factor - 0.5f; + int ix_i = ROUND(ix_f); + + float4 v_sum = 0.f; + float4 v_wsum = 0.f; + + for (int y = max(iy_i - r, 0); y <= min(iy_i + r, (int)ih - 1); y++) + { + float dy = iy_f - y; + int x = max(ix_i - r, 0); + int end_x = min(ix_i + r, (int)iw - 1); + + float4 dx; + for (int i = 0; i < 4; i++) + dx[i] = ix_f - x - i; + + for (; x <= end_x - 3; x += 4, dx -= 4) + { + float4 w = factor*triangleCoeff4(factor*dx) * factor*triangleCoeff(factor*dy); + float4 src_vec = { start_src[y*iw + x + 0], + start_src[y*iw + x + 1], + start_src[y*iw + x + 2], + start_src[y*iw + x + 3] }; + + v_sum += w * src_vec; + v_wsum += w; + } + + for (; x <= end_x; x++) + { + float dx = ix_f - x; + float w = factor*triangleCoeff(factor*dx) * factor*triangleCoeff(factor*dy); v_sum[0] += w * start_src[y*iw + x]; v_wsum[0] += w; @@ -99,3 +241,5 @@ __kernel void resample_with_antialias(const __global half* restrict src, start_dst[oy*ow + ox] = (!v_wsum[0]) ? (half)0.0f : (half)(v_sum[0] / v_wsum[0]); } } + +#endif diff --git a/inference-engine/src/vpu/custom_kernels/shuffle_channels.cl b/inference-engine/src/vpu/custom_kernels/shuffle_channels.cl index 48afd02f5a5..237e26fe4d6 100644 --- a/inference-engine/src/vpu/custom_kernels/shuffle_channels.cl +++ b/inference-engine/src/vpu/custom_kernels/shuffle_channels.cl @@ -1,16 +1,6 @@ // Copyright (C) 2018-2020 Intel Corporation +// SPDX-License-Identifier: Apache-2.0 // -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. #pragma OPENCL EXTENSION cl_khr_fp16 : enable diff --git a/inference-engine/src/vpu/custom_kernels/st.cl b/inference-engine/src/vpu/custom_kernels/st.cl new file mode 100644 index 00000000000..bac1606edbc --- /dev/null +++ b/inference-engine/src/vpu/custom_kernels/st.cl @@ -0,0 +1,253 @@ +// Copyright (C) 2018-2020 Intel Corporation +// SPDX-License-Identifier: Apache-2.0 +// + +#pragma OPENCL EXTENSION cl_khr_fp16 : enable + +#define MAX_WIDTH 512 +#define MIN(a, b) ((a) < (b)) ? (a) : (b); + +__kernel void __dma_postwrite_ocl_st(__global half const *const restrict src_data, + __global half const *const restrict theta, + __global half *const restrict dst_data, + int C, + int W, + __local half const *const restrict local_dst) +{ + const int x0 = get_global_id(0) * MAX_WIDTH; + const int x1 = MIN(x0 + MAX_WIDTH, W); + const int length = x1 - x0; + + WorkGroupDmaCreate3DTransaction( + local_dst, // src + dst_data + get_global_id(1) * W + x0, // dst + length * sizeof(half), // src width + length * sizeof(half), // dst width + length * sizeof(half), // src stride + W * sizeof(half), // dst stride + C, // num planes + get_local_size(1) * length * sizeof(half), // src plane stride + get_global_size(1) * W * sizeof(half), // dst plane stride + get_local_size(1) * length * sizeof(half), // plane size + 0); +} + +__attribute__((noinline)) +void calcInd(__global half const *const restrict theta, + half *const restrict weight, + int *const restrict ind, + int y, int H, int x0, int length, int step, int W) +{ + float a = (float)y * 1.0f / H * 2 - 1; + + int x = 0; + + float8 va = (float8) {a, a, a, a, a, a, a, a}; + float8 vxy = (float8) {x0 + 0, x0 + 1, x0 + 2, x0 + 3, + x0 + 4, x0 + 5, x0 + 6, x0 + 7}; + + for (; x <= length - 8; x += 8, vxy += 8) + { + float8 va1 = vxy * 1.0f / W * 2 - 1.f; + + float8 vx = (va * theta[0] + va1 * theta[1] + theta[2] + 1.f) / 2.f * H; + float8 vy = (va * theta[3] + va1 * theta[4] + theta[5] + 1.f) / 2.f * W; + + const int8 ix = convert_int8(vx) - ((vx < 0) & 1); + const int8 iy = convert_int8(vy) - ((vy < 0) & 1); + + float8 ax = vx - convert_float8(ix); + float8 ay = vy - convert_float8(iy); + float8 bx = 1.f - ax; + float8 by = 1.f - ay; + + union {int8 d; uint8 i; } check_x; + + check_x.d = ix; + int8 b01 = check_x.i < (uint8)H; + + check_x.d = ix + 1; + int8 b45 = check_x.i < (uint8)H; + + union {int8 d; uint8 i; } check_y; + + check_y.d = iy; + int8 b23 = check_y.i < (uint8)W; + + check_y.d = iy + 1; + int8 b67 = check_y.i < (uint8)W; + + int8 b0123 = b01 & b23; + int8 b0167 = b01 & b67; + int8 b4523 = b45 & b23; + int8 b4567 = b45 & b67; + + int8 TL_id = ((ix + 0) * W + (iy + 0)) * (b0123 & 1); + int8 BL_id = ((ix + 1) * W + (iy + 0)) * (b4523 & 1); + int8 TR_id = ((ix + 0) * W + (iy + 1)) * (b0167 & 1); + int8 BR_id = ((ix + 1) * W + (iy + 1)) * (b4567 & 1); + + union {float8 f; int8 i;} w0; w0.f = bx * by; + union {float8 f; int8 i;} w1; w1.f = ax * by; + union {float8 f; int8 i;} w2; w2.f = bx * ay; + union {float8 f; int8 i;} w3; w3.f = ax * ay; + + w0.i = w0.i & b0123; + w1.i = w1.i & b4523; + w2.i = w2.i & b0167; + w3.i = w3.i & b4567; + + *((half8*)(weight + x + 0*step)) = convert_half8(w0.f); + *((half8*)(weight + x + 1*step)) = convert_half8(w1.f); + *((half8*)(weight + x + 2*step)) = convert_half8(w2.f); + *((half8*)(weight + x + 3*step)) = convert_half8(w3.f); + + *((int8*)(ind + x + 0*step)) = TL_id; + *((int8*)(ind + x + 1*step)) = BL_id; + *((int8*)(ind + x + 2*step)) = TR_id; + *((int8*)(ind + x + 3*step)) = BR_id; + } + + for (; x < length; x++) + { + float a1 = (float)(x0 + x) * 1.0f / W * 2 - 1; + + float fx = (a * theta[0] + a1 * theta[1] + theta[2] + 1)/2 * H; + float fy = (a * theta[3] + a1 * theta[4] + theta[5] + 1)/2 * W; + + const int ix = (int)(fx) - (fx < 0); + const int iy = (int)(fy) - (fy < 0); + + float ax = fx - ix; + float ay = fy - iy; + float bx = 1 - ax; + float by = 1 - ay; + + int b0 = ix >= 0; + int b4 = ix >= -1; + int b1 = ix < H; + int b5 = ix < H-1; + + int b2 = iy >= 0; + int b6 = iy >= -1; + int b3 = iy < W; + int b7 = iy < W-1; + + int b01 = b0 & b1; + int b23 = b2 & b3; + int b45 = b4 & b5; + int b67 = b6 & b7; + + int b0123 = b01 & b23; + int b0167 = b01 & b67; + int b4523 = b45 & b23; + int b4567 = b45 & b67; + + int TL_id = ((ix + 0) * W + (iy + 0)) * b0123; + int BL_id = ((ix + 1) * W + (iy + 0)) * b4523; + int TR_id = ((ix + 0) * W + (iy + 1)) * b0167; + int BR_id = ((ix + 1) * W + (iy + 1)) * b4567; + + half w0 = bx*by*b0123; + half w1 = ax*by*b4523; + half w2 = bx*ay*b0167; + half w3 = ax*ay*b4567; + + weight[x + 0*step] = w0; + weight[x + 1*step] = w1; + weight[x + 2*step] = w2; + weight[x + 3*step] = w3; + + ind[x + 0*step] = TL_id; + ind[x + 1*step] = BL_id; + ind[x + 2*step] = TR_id; + ind[x + 3*step] = BR_id; + } +} + +__attribute__((noinline)) +void apply(__global half const *const restrict src, + half const *const restrict weight, + int const *const restrict ind, + __local half *const restrict dst, + int length, + int step) +{ + int x = 0; + for(; x <= length - 8; x += 8) + { + int8 TL_id = *((int8*)(ind + x + 0*step)); + int8 BL_id = *((int8*)(ind + x + 1*step)); + int8 TR_id = *((int8*)(ind + x + 2*step)); + int8 BR_id = *((int8*)(ind + x + 3*step)); + + half8 w00 = *((half8*)(weight + x + 0*step)); + half8 w01 = *((half8*)(weight + x + 1*step)); + half8 w02 = *((half8*)(weight + x + 2*step)); + half8 w03 = *((half8*)(weight + x + 3*step)); + + half8 TL = (half8){src[TL_id[0]], src[TL_id[1]], src[TL_id[2]], src[TL_id[3]], + src[TL_id[4]], src[TL_id[5]], src[TL_id[6]], src[TL_id[7]]}; + half8 TR = (half8){src[TR_id[0]], src[TR_id[1]], src[TR_id[2]], src[TR_id[3]], + src[TR_id[4]], src[TR_id[5]], src[TR_id[6]], src[TR_id[7]]}; + half8 BL = (half8){src[BL_id[0]], src[BL_id[1]], src[BL_id[2]], src[BL_id[3]], + src[BL_id[4]], src[BL_id[5]], src[BL_id[6]], src[BL_id[7]]}; + half8 BR = (half8){src[BR_id[0]], src[BR_id[1]], src[BR_id[2]], src[BR_id[3]], + src[BR_id[4]], src[BR_id[5]], src[BR_id[6]], src[BR_id[7]]}; + + half8 res = w00 * TL + w01 * BL + w02 * TR + w03 * BR; + + *((__local half8*)(dst + x)) = res; + } + + for (; x < length; x++) + { + int TL_id = ind[x + 0*step]; + int BL_id = ind[x + 1*step]; + int TR_id = ind[x + 2*step]; + int BR_id = ind[x + 3*step]; + + half w00 = weight[x + 0*step]; + half w01 = weight[x + 1*step]; + half w02 = weight[x + 2*step]; + half w03 = weight[x + 3*step]; + + half TL = src[TL_id]; + half TR = src[TR_id]; + half BL = src[BL_id]; + half BR = src[BR_id]; + + half res = w00 * TL + w01 * BL + w02 * TR + w03 * BR; + dst[x] = res; + } +} + +__kernel void ocl_st(__global half const *const restrict src_data, + __global half const *const restrict theta, + __global half const *const restrict dst_data, + int C, + int W, + __local half *const restrict local_dst) +{ + int w = get_group_id(0); + + int y = get_global_id(1); + int H = get_global_size(1); + + __private int ind[4][MAX_WIDTH] __attribute__((aligned(16))); + __private half weight[4][MAX_WIDTH] __attribute__((aligned(16))); + + const int x0 = w * MAX_WIDTH; + const int x1 = MIN(x0 + MAX_WIDTH, W); + const int length = x1 - x0; + + calcInd(theta, weight, ind, y, H, x0, length, MAX_WIDTH, W); + + for (int c = 0; c < C; c++) + { + __global half const *const restrict src = src_data + c*H*W; + __local half *const restrict dst = local_dst + c*get_local_size(1)*length + get_local_id(1)*length; + + apply(src, weight, ind, dst, length, MAX_WIDTH); + } +} diff --git a/inference-engine/src/vpu/graph_transformer/include/vpu/frontend/custom_kernel.hpp b/inference-engine/src/vpu/graph_transformer/include/vpu/frontend/custom_kernel.hpp new file mode 100644 index 00000000000..fd5e33984be --- /dev/null +++ b/inference-engine/src/vpu/graph_transformer/include/vpu/frontend/custom_kernel.hpp @@ -0,0 +1,83 @@ +// Copyright (C) 2018-2020 Intel Corporation +// SPDX-License-Identifier: Apache-2.0 +// + +#pragma once + +#include +#include + +#include +#include + +namespace vpu { + +namespace ie = InferenceEngine; + +VPU_DECLARE_ENUM(CustomParamType, + Input, + Output, + Data, + LocalData, + InputBuffer, + OutputBuffer, + Int, + Float) + +VPU_DECLARE_ENUM(CustomDataFormat, + BYXF = 0, // NHWC used in most software layers + BFYX = 1, // NCHW used if HW module is enabled + YXF = 2, // HWC used in most software layers + FYX = 3, // CHW used if HW module is enabled + BF = 4, // NC layout + Any = 5, // doesn't really matter + None = 6) + +VPU_DECLARE_ENUM(CustomDimSource, Input, Output) + +struct CustomKernel final { + struct KernelParam final { + CustomParamType type = CustomParamType::Input; + CustomDataFormat format = CustomDataFormat::Any; + std::string argName; + int portIndex = -1; + std::string irSource; + std::string bufferSizeRule; + CustomDimSource dimSource; + int dimIdx = -1; + }; + +private: + std::string _configDir; + int _maxShaves = 0; + std::string _kernelBinary; + SmallVector _kernelParams; + SmallVector _globalGridSizeRules; + SmallVector _localGridSizeRules; + SmallVector _parameters; + int _kernelId = 0; + + CustomDimSource _wgDimSource = CustomDimSource::Input; + int _wgDimIdx = -1; + + int _inputDataCount = 0; + +public: + explicit CustomKernel(const pugi::xml_node& node, std::string configDir); + + void processParametersNode(const pugi::xml_node& node); + void processWorkSizesNode(const pugi::xml_node& node); + + int maxShaves() const { return _maxShaves; } + const std::string& kernelBinary() const { return _kernelBinary; } + SmallVector bindings() const { return _kernelParams; } + SmallVector globalGridSizeRules() const { return _globalGridSizeRules; } + SmallVector localGridSizeRules() const { return _localGridSizeRules; } + SmallVector parameters() const { return _parameters; } + int kernelId() const { return _kernelId; } + CustomDimSource dimSource() const { return _wgDimSource; } + int dimSourceIndex() const { return _wgDimIdx; } + int inputDataCount() const { return _inputDataCount; } +}; + +} // namespace vpu diff --git a/inference-engine/src/vpu/graph_transformer/include/vpu/frontend/custom_layer.hpp b/inference-engine/src/vpu/graph_transformer/include/vpu/frontend/custom_layer.hpp index 3f1e90df393..10b7b97b8cc 100644 --- a/inference-engine/src/vpu/graph_transformer/include/vpu/frontend/custom_layer.hpp +++ b/inference-engine/src/vpu/graph_transformer/include/vpu/frontend/custom_layer.hpp @@ -12,109 +12,45 @@ #include #include
- #include #include #include +#include + +#include namespace vpu { namespace ie = InferenceEngine; -VPU_DECLARE_ENUM(CustomDataFormat, - BYXF = 0, // NHWC used in most software layers - BFYX = 1, // NCHW used if HW module is enabled - YXF = 2, // HWC used in most software layers - FYX = 3, // CHW used if HW module is enabled - Any = 4, // doesn't really matter - None = 5 -) - -VPU_DECLARE_ENUM(CustomParamType, - Input, - Output, - Data, - LocalData, - InputBuffer, - OutputBuffer, - Int, - Float -) - -VPU_DECLARE_ENUM(CustomDimSource, - Input, - Output -) - class CustomLayer final { public: using Ptr = std::shared_ptr; + explicit CustomLayer(std::string configDir, const pugi::xml_node& customLayer); - struct KernelParam final { - CustomParamType type = CustomParamType::Input; - CustomDataFormat format = CustomDataFormat::Any; - std::string argName; - int portIndex = -1; - std::string irSource; - SmallVector bufferSizeRules; - CustomDimSource dimSource; - int dimIdx = -1; - }; + std::vector kernels() const { return _kernels; } + std::string layerName() const { return _layerName; } + std::map inputs() { return _inputs; } + std::map outputs() { return _outputs; } static ie::details::caseless_map> loadFromFile( const std::string& configFile, bool canBeMissed = false); - const std::string& kernelBinary() const { return _kernelBinary; } - - void setStageNumInputs(int id); - int stageNumInputs() const; - uint32_t kernelAddress(int idx = 1) const; - int kernelId() const; - int maxShaves() const; - const std::map& whereParams() const { return _whereParams; } - - const SmallVector& bindings() const { return _kernelParams; } - const SmallVector& parameters() const { return _parameters; } - - const SmallVector& globalSizeRules() const { return _globalSizeRules; } - const SmallVector& localSizeRules() const { return _localSizeRules; } - - CustomDimSource dimSource() const { return _wgDimSource; } - int dimSourceIndex() const { return _wgDimIdx; } - -private: - explicit CustomLayer(const std::string& dirname) : _configDir(dirname) {} - - void loadSingleLayer(const pugi::xml_node& node); - void processWhere(const pugi::xml_node& node); - void processKernelNode(const pugi::xml_node& node); - void processParametersNode(const pugi::xml_node& node); - void processWorkSizesNode(const pugi::xml_node& node); - - static bool isLegalSizeRule(const std::string& rule); - static CustomDataFormat formatFromString(const std::string& str); + bool meetsWhereRestrictions(const std::map& params) const; + static bool isLegalSizeRule(const std::string& rule, std::map layerParams); + static CustomDataFormat formatFromLayout(const InferenceEngine::Layout& layout); private: std::string _configDir; std::string _layerName; - std::string _kernelEntry; - std::string _kernelBinary; std::map _whereParams; - int _maxShaves = 0; - int _stageNumInputs = -1; + std::vector _kernels; - SmallVector _kernelParams; - SmallVector _globalSizeRules; - SmallVector _localSizeRules; - SmallVector _parameters; - - std::map> _kernelAddress; - - CustomDimSource _wgDimSource = CustomDimSource::Input; - int _wgDimIdx = -1; + std::map _inputs; + std::map _outputs; }; }; // namespace vpu diff --git a/inference-engine/src/vpu/graph_transformer/include/vpu/frontend/frontend.hpp b/inference-engine/src/vpu/graph_transformer/include/vpu/frontend/frontend.hpp index 76ee331fdaa..462ecc9ac6b 100644 --- a/inference-engine/src/vpu/graph_transformer/include/vpu/frontend/frontend.hpp +++ b/inference-engine/src/vpu/graph_transformer/include/vpu/frontend/frontend.hpp @@ -151,6 +151,8 @@ public: void parseExpTopKROIs(const Model& model, const ie::CNNLayerPtr& layer, const DataVector& inputs, const DataVector& outputs) const; void parseNonZero(const Model& model, const ie::CNNLayerPtr& layer, const DataVector& inputs, const DataVector& outputs) const; void parseROIAlign(const Model& model, const ie::CNNLayerPtr& layer, const DataVector& inputs, const DataVector& outputs) const; + void parseOutShapeOfReshape(const Model& model, const ie::CNNLayerPtr& layer, const DataVector& inputs, const DataVector& outputs) const; + void parseBroadcast(const Model& model, const ie::CNNLayerPtr& layer, const DataVector& inputs, const DataVector& outputs) const; // // Special layers @@ -172,9 +174,11 @@ public: void parseLSTMCell(const Model& model, const ie::CNNLayerPtr& layer, const DataVector& inputs, const DataVector& outputs); void parseTensorIterator(const Model& model, const ie::CNNLayerPtr& layer, const DataVector& inputs, const DataVector& outputs); -// -// Utility -// + // + // Utility + // + + static CustomLayer::Ptr getSuitableCustomLayer(const std::vector& customLayers, const ie::CNNLayerPtr&cnnLayer); private: Data getVpuData(const ie::DataPtr& ieData) const; diff --git a/inference-engine/src/vpu/graph_transformer/include/vpu/graph_transformer.hpp b/inference-engine/src/vpu/graph_transformer/include/vpu/graph_transformer.hpp index d3449cf815c..2692e67c1a9 100644 --- a/inference-engine/src/vpu/graph_transformer/include/vpu/graph_transformer.hpp +++ b/inference-engine/src/vpu/graph_transformer/include/vpu/graph_transformer.hpp @@ -103,6 +103,7 @@ struct CompilationConfig final { bool dumpAllPasses; bool disableReorder = false; // TODO: rename to enableReorder and switch logic. + bool disableConvertStages = false; bool enablePermuteMerging = true; bool enableReplWithSCRelu = false; bool enableReplaceWithReduceMean = true; diff --git a/inference-engine/src/vpu/graph_transformer/include/vpu/middleend/pass_manager.hpp b/inference-engine/src/vpu/graph_transformer/include/vpu/middleend/pass_manager.hpp index bd734a32570..c8c26c5fa55 100644 --- a/inference-engine/src/vpu/graph_transformer/include/vpu/middleend/pass_manager.hpp +++ b/inference-engine/src/vpu/graph_transformer/include/vpu/middleend/pass_manager.hpp @@ -110,6 +110,7 @@ public: Pass::Ptr splitHwDepthConv(); Pass::Ptr splitHwConvAndPool(); Pass::Ptr hwPadding(); + Pass::Ptr splitLargeKernelConv(); // // Batch support diff --git a/inference-engine/src/vpu/graph_transformer/include/vpu/model/data.hpp b/inference-engine/src/vpu/graph_transformer/include/vpu/model/data.hpp index b59bbfa2c25..8c33d522c4d 100644 --- a/inference-engine/src/vpu/graph_transformer/include/vpu/model/data.hpp +++ b/inference-engine/src/vpu/graph_transformer/include/vpu/model/data.hpp @@ -264,7 +264,7 @@ private: void serializeDescImpl( BlobSerializer& serializer, const DataDesc& storedDesc, - const DimValues& storedStrides) const; + const ShapeLocation& shapeLocation) const; private: inline DataNode() : diff --git a/inference-engine/src/vpu/graph_transformer/include/vpu/model/model.hpp b/inference-engine/src/vpu/graph_transformer/include/vpu/model/model.hpp index ea11234bab7..4554fc6853d 100644 --- a/inference-engine/src/vpu/graph_transformer/include/vpu/model/model.hpp +++ b/inference-engine/src/vpu/graph_transformer/include/vpu/model/model.hpp @@ -241,18 +241,25 @@ public: friend ModelObj; }; - inline DataToDataEdgeHelper connectDataWithData() { - return DataToDataEdgeHelper(this); - } - DataToShapeAllocation connectDataWithShape( const Data& parent, const Data& child); - void replaceParentData( + void replaceDataToShapeParent( + const DataToShapeAllocation& edge, + const Data& newParent); + void replaceDataToShapeChild( + const DataToShapeAllocation& edge, + const Data& newChild); + + inline DataToDataEdgeHelper connectDataWithData() { + return DataToDataEdgeHelper(this); + } + + void replaceDataToDataParent( const DataToDataAllocation& edge, const Data& newParent); - void replaceChildData( + void replaceDataToDataChild( const DataToDataAllocation& edge, const Data& newChild); diff --git a/inference-engine/src/vpu/graph_transformer/include/vpu/model/stage.hpp b/inference-engine/src/vpu/graph_transformer/include/vpu/model/stage.hpp index 0f6136f136f..76b5aa07f38 100644 --- a/inference-engine/src/vpu/graph_transformer/include/vpu/model/stage.hpp +++ b/inference-engine/src/vpu/graph_transformer/include/vpu/model/stage.hpp @@ -53,7 +53,7 @@ VPU_DECLARE_ENUM(StageType, StubPriorBox, StubPriorBoxClustered, - Concat, + StubConcat, Split, Reshape, Expand, @@ -119,7 +119,6 @@ VPU_DECLARE_ENUM(StageType, Pad = 71, Resample = 72, Upsampling = 73, - ArgMax = 74, Div = 75, Min = 76, Squared_diff = 77, @@ -166,6 +165,9 @@ VPU_DECLARE_ENUM(StageType, ExpGenerateProposals = 124, ExpTopKROIs = 125, ScatterElementsUpdate = 126, + OutShapeOfReshape = 127, + Concat = 128, + Broadcast = 129, ) // @@ -240,6 +242,24 @@ VPU_DECLARE_ENUM(TopKOutputs, ValueOnly = 1, IndexOnly = 2) +// +// ConcatInferRequirement +// + +// Requirement whether to infer Concat stage on the device side +VPU_DECLARE_ENUM(ConcatInferRequirement, + NeedToInfer = 0, + CanBeReplaced = 1) + +// +// ConcatInferRequirement +// + +// Modes for Broadcast operation according to specification +VPU_DECLARE_ENUM(BroadcastMode, + NUMPY = 0, + EXPLICIT = 1) + // // StageDataInfo // diff --git a/inference-engine/src/vpu/graph_transformer/include/vpu/private_plugin_config.hpp b/inference-engine/src/vpu/graph_transformer/include/vpu/private_plugin_config.hpp index 06b7c95425f..253a995f47b 100644 --- a/inference-engine/src/vpu/graph_transformer/include/vpu/private_plugin_config.hpp +++ b/inference-engine/src/vpu/graph_transformer/include/vpu/private_plugin_config.hpp @@ -56,6 +56,12 @@ DECLARE_VPU_CONFIG_KEY(DUMP_ALL_PASSES); */ DECLARE_VPU_CONFIG_KEY(DISABLE_REORDER); +/** + * @brief Used to disable convert stages in tests to be able to insert + * convert layer with desired precision. + */ +DECLARE_VPU_CONFIG_KEY(DISABLE_CONVERT_STAGES); + /** * @brief Used to disable permute merging pass (with setting "NO") in tests to check it preserves behaviour. Default = "YES" */ diff --git a/inference-engine/src/vpu/graph_transformer/include/vpu/stage_builder.hpp b/inference-engine/src/vpu/graph_transformer/include/vpu/stage_builder.hpp index 419179df5f9..29fb772c462 100644 --- a/inference-engine/src/vpu/graph_transformer/include/vpu/stage_builder.hpp +++ b/inference-engine/src/vpu/graph_transformer/include/vpu/stage_builder.hpp @@ -116,7 +116,8 @@ public: const ie::CNNLayerPtr& layer, Dim axis, const DataVector& inputs, - const Data& output); + const Data& output, + ConcatInferRequirement inferRequirement = ConcatInferRequirement::CanBeReplaced); Stage addConcatStage( const Model& model, diff --git a/inference-engine/src/vpu/graph_transformer/src/backend/serialize.cpp b/inference-engine/src/vpu/graph_transformer/src/backend/serialize.cpp index 783fd0db00f..c533a1411f7 100644 --- a/inference-engine/src/vpu/graph_transformer/src/backend/serialize.cpp +++ b/inference-engine/src/vpu/graph_transformer/src/backend/serialize.cpp @@ -132,33 +132,33 @@ void BackEnd::serializeConstData(const Model& model, const mv_blob_header& blobH void BackEnd::serializeConstShapes(const Model& model, const mv_blob_header& blobHdr, std::vector& blob) { for (const auto& data : model->datas()) { - const auto serializeToBlob = [&data, &blob, &blobHdr](const BlobSerializer& serializer, int offset) { - std::copy_n(serializer.data(), data->desc().numDims() * sizeof(uint32_t), blob.data() + blobHdr.const_data_section_offset + offset); - }; - const auto dimsOrder = data->desc().dimsOrder(); const auto storedPerm = dimsOrder.toPermutation(); + const auto serializeToBlob = [&data, &blob, &blobHdr, &storedPerm](const DimValues& values, int offset) { + BlobSerializer serializer; + + for (const auto& d : storedPerm) { + serializer.append(checked_cast(values[d])); + } + + std::copy_n(serializer.data(), data->desc().numDims() * sizeof(uint32_t), blob.data() + blobHdr.const_data_section_offset + offset); + }; + const auto shapeLocation = data->shapeLocation(); if (shapeLocation.dimsLocation == Location::Blob) { - BlobSerializer dimsSerializer; - const auto dims = data->desc().dims(); - - for (const auto& d : storedPerm) { - dimsSerializer.append(checked_cast(dims[d])); - } - serializeToBlob(dimsSerializer, shapeLocation.dimsOffset); + serializeToBlob(data->desc().dims(), shapeLocation.dimsOffset); + } else if (data->usage() == DataUsage::Output) { + auto ioDimsUpperBoundOffset = data->attrs().get("ioDimsUpperBoundOffset"); + serializeToBlob(data->desc().dims(), ioDimsUpperBoundOffset); } if (shapeLocation.stridesLocation == Location::Blob) { - BlobSerializer stridesSerializer; - const auto strides = data->strides(); - - for (const auto& d : storedPerm) { - stridesSerializer.append(checked_cast(strides[d])); - } - serializeToBlob(stridesSerializer, shapeLocation.stridesOffset); + serializeToBlob(data->strides(), shapeLocation.stridesOffset); + } else if (data->usage() == DataUsage::Output) { + auto ioStridesUpperBoundOffset = data->attrs().get("ioStridesUpperBoundOffset"); + serializeToBlob(data->strides(), ioStridesUpperBoundOffset); } } } diff --git a/inference-engine/src/vpu/graph_transformer/src/frontend/custom_kernel.cpp b/inference-engine/src/vpu/graph_transformer/src/frontend/custom_kernel.cpp new file mode 100644 index 00000000000..c7ad6f6cc8f --- /dev/null +++ b/inference-engine/src/vpu/graph_transformer/src/frontend/custom_kernel.cpp @@ -0,0 +1,426 @@ +// Copyright (C) 2018-2020 Intel Corporation +// SPDX-License-Identifier: Apache-2.0 +// + +#include +#include +#include
+#include + +namespace vpu { + +VPU_PACKED(Elf32Ehdr { + uint8_t offs1[28]; + uint32_t ePhoff; // Program header offset + uint32_t eShoff; // Section header offset + uint8_t offs2[12]; + uint16_t eShnum; // Number of sections + uint16_t offs3; +};) + +VPU_PACKED(Elf32Section { + uint32_t shName; + uint32_t shType; + uint32_t shFlags; + uint32_t shAddr; + uint32_t shOffset; + uint32_t shSize; + uint32_t shLink; + uint32_t shInfo; + uint32_t shAddralign; + uint32_t shEntsize; +};) + +VPU_PACKED(Elf32Phdr { + uint32_t pType; // Identifies program segment type + uint32_t pOffset; // Segment file offset + uint32_t pVaddr; // Segment virtual address + uint32_t pPaddr; // Segment physical address + uint32_t pFilesz; // Segment size in file + uint32_t pMemsz; // Segment size in memory + uint32_t pFlags; // Flags position from ELF standard spec + uint32_t pAlign; // Segment alignment, file & memory +};) + +VPU_PACKED(Elf32Sym { + uint32_t stName; + uint32_t stValue; + uint32_t stSize; + uint8_t stInfo; + uint8_t stOther; + uint16_t stShndx; +};) + +VPU_PACKED(KernelHdr { + uint32_t address; // Kernel address + uint32_t flags; // Should be 0 for now + uint32_t sectionSize; // Section size, offset to the next kernel + uint32_t argOffset; // offset to arguments + uint32_t stackSize; // Size of the stack required for kernel + uint32_t stackSizeWI; // Size of the stack required for kernel per WI +};) + +VPU_PACKED(KernelArgHdr { + uint32_t stringOffset; + uint32_t addressSpace; + uint32_t typeOffset; + uint32_t size; + uint32_t laneSize; +};) + +std::pair findSymbolTable( + const char* ELFData) { + const uint32_t SYMTAB = 2; // Link editing symbol table + const uint32_t STRTAB = 3; // A string table + + IE_ASSERT(ELFData != nullptr); + + auto ehdr = reinterpret_cast(ELFData); + auto shdr = reinterpret_cast(ELFData + ehdr->eShoff); + + const Elf32Section* strShdr = nullptr; + const Elf32Section* symShdr = nullptr; + for (size_t i = 0; i < ehdr->eShnum; i++) { + if (shdr[i].shType == STRTAB && strShdr == nullptr) { + strShdr = &shdr[i]; + } else if (shdr[i].shType == SYMTAB && symShdr == nullptr) { + symShdr = &shdr[i]; + } + + if (symShdr != nullptr && strShdr != nullptr) + break; + } + IE_ASSERT(symShdr != nullptr && strShdr != nullptr); + + return std::make_pair(strShdr, symShdr); +} + +SmallVector deduceKernelParameters( + const char* ELFData, + uint32_t kernelAddress) { + IE_ASSERT(ELFData != nullptr); + const auto cmp = ie::details::CaselessEq{}; + + auto ehdr = reinterpret_cast(ELFData); + auto phdr = reinterpret_cast(ELFData + ehdr->ePhoff); + auto shdr = reinterpret_cast(ELFData + ehdr->eShoff); + + const Elf32Section* strShdr = nullptr; + const Elf32Section* symShdr = nullptr; + std::tie(strShdr, symShdr) = findSymbolTable(ELFData); + IE_ASSERT(symShdr != nullptr && strShdr != nullptr); + + auto numSymEntries = symShdr->shSize / symShdr->shEntsize; + auto sym = reinterpret_cast(ELFData + symShdr->shOffset); + auto firstStr = ELFData + strShdr->shOffset; + + const char* kernelArgStrings = nullptr; + for (size_t i = 0; i < numSymEntries; i++) { + if (cmp(firstStr + sym[i].stName, "opencl.kernelArgs.strings")) { + kernelArgStrings = ELFData + shdr[sym[i].stShndx].shOffset; + break; + } + } + IE_ASSERT(kernelArgStrings != nullptr); + + SmallVector parameters; + for (size_t i = 0; i < numSymEntries; i++) { + if (cmp(firstStr + sym[i].stName, "opencl.kernelArgs.info")) { + auto ptr = ELFData + shdr[sym[i].stShndx].shOffset; + auto numKernels = *reinterpret_cast(ptr); + + auto metaOffset = sizeof(int); + for (int k = 0; k < numKernels; k++) { + auto kHdr = reinterpret_cast(ptr + metaOffset); + + if (kHdr->address-phdr->pVaddr == kernelAddress) { + auto aHdr = reinterpret_cast( + reinterpret_cast(&(kHdr->argOffset)) + sizeof(kHdr->argOffset) + kHdr->argOffset); + + auto numArgs = reinterpret_cast(aHdr)[-1]; + for (int n = 0; n < numArgs; n++, aHdr++) { + parameters.push_back(kernelArgStrings + aHdr->stringOffset); + } + + break; + } + + metaOffset += kHdr->sectionSize + sizeof(kHdr->address) + sizeof(kHdr->flags); + } + } + } + + return parameters; +} + +int32_t getKernelId( + const char* ELFData, + uint32_t kernelAddress) { + IE_ASSERT(ELFData != nullptr); + const auto cmp = ie::details::CaselessEq{}; + + auto ehdr = reinterpret_cast(ELFData); + auto phdr = reinterpret_cast(ELFData + ehdr->ePhoff); + auto shdr = reinterpret_cast(ELFData + ehdr->eShoff); + + const Elf32Section* strShdr = nullptr; + const Elf32Section* symShdr = nullptr; + std::tie(strShdr, symShdr) = findSymbolTable(ELFData); + IE_ASSERT(symShdr != nullptr && strShdr != nullptr); + + auto numSymEntries = symShdr->shSize / symShdr->shEntsize; + auto sym = reinterpret_cast(ELFData + symShdr->shOffset); + auto firstStr = ELFData + strShdr->shOffset; + + const char* kernelArgStrings = nullptr; + for (size_t i = 0; i < numSymEntries; i++) { + if (cmp(firstStr + sym[i].stName, "opencl.kernelArgs.strings")) { + kernelArgStrings = ELFData + shdr[sym[i].stShndx].shOffset; + break; + } + } + IE_ASSERT(kernelArgStrings != nullptr); + + for (size_t i = 0; i < numSymEntries; i++) { + if (cmp(firstStr + sym[i].stName, "opencl.kernelArgs.info")) { + auto ptr = ELFData + shdr[sym[i].stShndx].shOffset; + auto numKernels = *reinterpret_cast(ptr); + + auto metaOffset = sizeof(int); + for (int k = 0; k < numKernels; k++) { + auto kHdr = reinterpret_cast(ptr + metaOffset); + + if (kHdr->address-phdr->pVaddr == kernelAddress) { + return k; + } + + metaOffset += kHdr->sectionSize + sizeof(kHdr->address) + sizeof(kHdr->flags); + } + } + } + + return -1; +} + +uint32_t getKernelEntry(const char* ELFData, const std::string& kernelName) { + IE_ASSERT(ELFData != nullptr); + const auto cmp = ie::details::CaselessEq{}; + + auto ehdr = reinterpret_cast(ELFData); + auto phdr = reinterpret_cast(ELFData + ehdr->ePhoff); + + const Elf32Section* strShdr = nullptr; + const Elf32Section* symShdr = nullptr; + std::tie(strShdr, symShdr) = findSymbolTable(ELFData); + IE_ASSERT(symShdr != nullptr && strShdr != nullptr); + + auto numSymEntries = symShdr->shSize / symShdr->shEntsize; + auto sym = reinterpret_cast(ELFData + symShdr->shOffset); + auto firstStr = ELFData + strShdr->shOffset; + + for (size_t i = 0; i < numSymEntries; i++) { + if (cmp(firstStr + sym[i].stName, kernelName)) { + return sym[i].stValue - phdr->pVaddr; + } + } + + THROW_IE_EXCEPTION << "Cannot find kernel entry point for custom kernel " << kernelName; +} + +CustomKernel::CustomKernel(const pugi::xml_node& kernel, std::string configDir): _configDir {std::move(configDir)} { + _maxShaves = XMLParseUtils::GetIntAttr(kernel, "max-shaves", 0); + + for (auto source = kernel.child("Source"); !source.empty(); source = source.next_sibling("Source")) { + auto fileName = _configDir + "/" + XMLParseUtils::GetStrAttr(source, "filename", ""); + + std::ifstream inputFile(fileName, std::ios::binary); + if (!inputFile.is_open()) { + THROW_IE_EXCEPTION << "Couldn't open kernel file " << fileName; + } + + std::ostringstream contentStream; + contentStream << inputFile.rdbuf(); + _kernelBinary.append(contentStream.str()); + } + + const auto kernelEntryName = XMLParseUtils::GetStrAttr(kernel, "entry"); + const auto kernelEntry = getKernelEntry(&_kernelBinary[0], kernelEntryName); + _parameters = deduceKernelParameters(&_kernelBinary[0], kernelEntry); + _kernelId = getKernelId(&_kernelBinary[0], kernelEntry); + + processParametersNode(kernel); + processWorkSizesNode(kernel); + + const auto isInputData = [&](const CustomKernel::KernelParam& param) { + return param.type == CustomParamType::Input || param.type == CustomParamType::InputBuffer || + param.type == CustomParamType::Data; + }; + + _inputDataCount = std::count_if(begin(_kernelParams), end(_kernelParams), isInputData); +} + +std::pair parseDimSource(const std::string& dims) { + const auto cmp = ie::details::CaselessEq{}; + const auto pos = dims.find_first_of(','); + const auto source = dims.substr(0, pos); + const auto dimSource = [&] { + if (cmp(source, "input")) { + return CustomDimSource::Input; + } else if (cmp(source, "output")) { + return CustomDimSource::Output; + } else { + THROW_IE_EXCEPTION << "Invalid dim source argument" << source; + } + }(); + + const auto idx = [&] { + if (pos == std::string::npos) { + return -1; + } + const auto idxString = dims.substr(pos + 1, std::string::npos); + return std::stoi(idxString); + }(); + + return std::make_pair(dimSource, idx); +} + + +CustomDataFormat formatFromString(const std::string& str) { + static const ie::details::caseless_map FormatNameToType = { + { "BFYX" , CustomDataFormat::BFYX }, + { "BYXF" , CustomDataFormat::BYXF }, + { "FYX" , CustomDataFormat::FYX }, + { "YXF" , CustomDataFormat::YXF }, + { "BF" , CustomDataFormat::BF }, + { "ANY" , CustomDataFormat::Any } + }; + + auto it = FormatNameToType.find(str); + if (it != FormatNameToType.end()) { + return it->second; + } + + THROW_IE_EXCEPTION << "Tensor node has an invalid format '" << str << "'"; +} + +SmallVector parseSizeRule(const std::string& size) { + auto result = SmallVector(); + result.reserve(std::count(begin(size), end(size), ',') + 1); + std::stringstream sizeRules{size}; + std::string bufferSize; + + while (std::getline(sizeRules, bufferSize, ',')) { + result.push_back(bufferSize); + } + + return result; +} + +void CustomKernel::processParametersNode(const pugi::xml_node& node) { + const auto cmp = ie::details::CaselessEq {}; + const auto parameters = node.child("Parameters"); + + for (auto tensor = parameters.child("Tensor"); !tensor.empty(); tensor = tensor.next_sibling("Tensor")) { + KernelParam kp; + + auto typeStr = XMLParseUtils::GetStrAttr(tensor, "type"); + if (cmp(typeStr, "input")) { + kp.type = CustomParamType::Input; + } else if (cmp(typeStr, "output")) { + kp.type = CustomParamType::Output; + } else if (cmp(typeStr, "input_buffer")) { + kp.type = CustomParamType::InputBuffer; + } else if (cmp(typeStr, "output_buffer")) { + kp.type = CustomParamType::OutputBuffer; + } else if (cmp(typeStr, "data")) { + kp.type = CustomParamType::Data; + } else { + THROW_IE_EXCEPTION << "Tensor node has an invalid type '" << typeStr << "'"; + } + + if (kp.type == CustomParamType::InputBuffer || kp.type == CustomParamType::OutputBuffer) { + const auto sizeRule = XMLParseUtils::GetStrAttr(tensor, "size"); + kp.bufferSizeRule = parseSizeRule(sizeRule)[0]; + + const auto dimString = XMLParseUtils::GetStrAttr(tensor, "dim"); + std::tie(kp.dimSource, kp.dimIdx) = parseDimSource(dimString); + } + + kp.format = formatFromString(XMLParseUtils::GetStrAttr(tensor, "format", "BFYX")); + kp.argName = XMLParseUtils::GetStrAttr(tensor, "arg-name"); + kp.portIndex = XMLParseUtils::GetIntAttr(tensor, "port-index"); + + _kernelParams.push_back(std::move(kp)); + } + + for (auto data = parameters.child("Data"); !data.empty(); data = data.next_sibling("Data")) { + KernelParam kp; + + auto typeStr = XMLParseUtils::GetStrAttr(data, "type"); + if (cmp(typeStr, "data")) { + kp.type = CustomParamType::Data; + } else if (cmp(typeStr, "local_data")) { + kp.type = CustomParamType::LocalData; + } else { + THROW_IE_EXCEPTION << "Data node has an invalid type '" << typeStr << "'"; + } + + kp.argName = XMLParseUtils::GetStrAttr(data, "arg-name"); + + kp.irSource = XMLParseUtils::GetStrAttr(data, "source", ""); + const auto dimString = XMLParseUtils::GetStrAttr(data, "dim", ""); + + if (kp.irSource.empty() && dimString.empty()) { + THROW_IE_EXCEPTION << "Data node has no source or dim"; + } + + if (!kp.irSource.empty() && !dimString.empty()) { + THROW_IE_EXCEPTION << "Data node can only have source or dim"; + } + + if (kp.type == CustomParamType::LocalData) { + const auto bufferSize = XMLParseUtils::GetStrAttr(data, "size", ""); + kp.bufferSizeRule = bufferSize; + + if (!dimString.empty()) { + std::tie(kp.dimSource, kp.dimIdx) = parseDimSource(dimString); + } + } + + _kernelParams.push_back(std::move(kp)); + } + + for (auto scalar = parameters.child("Scalar"); !scalar.empty(); scalar = scalar.next_sibling("Scalar")) { + KernelParam kp; + + const auto type = XMLParseUtils::GetStrAttr(scalar, "type"); + if (cmp(type, "int")) { + kp.type = CustomParamType::Int; + } else if (cmp(type, "float")) { + kp.type = CustomParamType::Float; + } else { + THROW_IE_EXCEPTION << "Scalar node has an invalid type " << type; + } + + kp.argName = XMLParseUtils::GetStrAttr(scalar, "arg-name"); + kp.portIndex = XMLParseUtils::GetIntAttr(scalar, "port-index", -1); + kp.irSource = XMLParseUtils::GetStrAttr(scalar, "source", ""); + + _kernelParams.push_back(std::move(kp)); + } +} + +void CustomKernel::processWorkSizesNode(const pugi::xml_node& node) { + const auto workSizes = node.child("WorkSizes"); + + const auto dims = XMLParseUtils::GetStrAttr(workSizes, "dim"); + std::tie(_wgDimSource, _wgDimIdx) = parseDimSource(dims); + + const auto gwgs = XMLParseUtils::GetStrAttr(workSizes, "global"); + _globalGridSizeRules = parseSizeRule(gwgs); + + const auto lwgs = XMLParseUtils::GetStrAttr(workSizes, "local"); + _localGridSizeRules = parseSizeRule(lwgs); +} + +} // namespace vpu diff --git a/inference-engine/src/vpu/graph_transformer/src/frontend/custom_layer.cpp b/inference-engine/src/vpu/graph_transformer/src/frontend/custom_layer.cpp index 6feed7781aa..ee1aa84c20f 100644 --- a/inference-engine/src/vpu/graph_transformer/src/frontend/custom_layer.cpp +++ b/inference-engine/src/vpu/graph_transformer/src/frontend/custom_layer.cpp @@ -3,6 +3,7 @@ // #include +#include #include @@ -11,7 +12,6 @@ #include #include #include -#include #include #include @@ -31,289 +31,51 @@ #include #include -#include +#include namespace vpu { namespace { -VPU_PACKED(Elf32Ehdr { - uint8_t offs1[28]; - uint32_t ePhoff; // Program header offset - uint32_t eShoff; // Section header offset - uint8_t offs2[12]; - uint16_t eShnum; // Number of sections - uint16_t offs3; -};) - -VPU_PACKED(Elf32Section { - uint32_t shName; - uint32_t shType; - uint32_t shFlags; - uint32_t shAddr; - uint32_t shOffset; - uint32_t shSize; - uint32_t shLink; - uint32_t shInfo; - uint32_t shAddralign; - uint32_t shEntsize; -};) - -VPU_PACKED(Elf32Phdr { - uint32_t pType; // Identifies program segment type - uint32_t pOffset; // Segment file offset - uint32_t pVaddr; // Segment virtual address - uint32_t pPaddr; // Segment physical address - uint32_t pFilesz; // Segment size in file - uint32_t pMemsz; // Segment size in memory - uint32_t pFlags; // Flags position from ELF standard spec - uint32_t pAlign; // Segment alignment, file & memory -};) - -VPU_PACKED(Elf32Sym { - uint32_t stName; - uint32_t stValue; - uint32_t stSize; - uint8_t stInfo; - uint8_t stOther; - uint16_t stShndx; -};) - -VPU_PACKED(KernelHdr { - uint32_t address; // Kernel address - uint32_t flags; // Should be 0 for now - uint32_t sectionSize; // Section size, offset to the next kernel - uint32_t argOffset; // offset to arguments - uint32_t stackSize; // Size of the stack required for kernel - uint32_t stackSizeWI; // Size of the stack required for kernel per WI -};) - -VPU_PACKED(KernelArgHdr { - uint32_t stringOffset; - uint32_t addressSpace; - uint32_t typeOffset; - uint32_t size; - uint32_t laneSize; -};) - -enum Flags { - CL_Vecz = 0x01, - CL_Unrolled = 0x02, - CL_Predicated = 0x04, - CL_Dma = 0x08, - CL_VeczDma = 0x10 -}; - -std::pair findSymbolTable( - const char* ELFData) { - const uint32_t SYMTAB = 2; // Link editing symbol table - const uint32_t STRTAB = 3; // A string table - - IE_ASSERT(ELFData != nullptr); - - auto ehdr = reinterpret_cast(ELFData); - auto shdr = reinterpret_cast(ELFData + ehdr->eShoff); - - const Elf32Section* strShdr = nullptr; - const Elf32Section* symShdr = nullptr; - for (size_t i = 0; i < ehdr->eShnum; i++) { - if (shdr[i].shType == STRTAB && strShdr == nullptr) { - strShdr = &shdr[i]; - } else if (shdr[i].shType == SYMTAB && symShdr == nullptr) { - symShdr = &shdr[i]; - } - - if (symShdr != nullptr && strShdr != nullptr) - break; +void assertExactlyOneOccurrence(const pugi::xml_node &node, const SmallVector& childs) { + for (const auto &name : childs) { + const auto& child = node.child(name.c_str()); + VPU_THROW_UNLESS(!child.empty(), "Required parameter %s is not found", name); + VPU_THROW_UNLESS(child.next_sibling(name.c_str()).empty(), + "Found several definitions of the parameter %s", name); } - IE_ASSERT(symShdr != nullptr && strShdr != nullptr); - - return std::make_pair(strShdr, symShdr); } -uint32_t getKernelEntry(const char* ELFData, const std::string& kernelName) { - ie::details::CaselessEq cmp; - - IE_ASSERT(ELFData != nullptr); - - auto ehdr = reinterpret_cast(ELFData); - auto phdr = reinterpret_cast(ELFData + ehdr->ePhoff); - - const Elf32Section* strShdr = nullptr; - const Elf32Section* symShdr = nullptr; - std::tie(strShdr, symShdr) = findSymbolTable(ELFData); - IE_ASSERT(symShdr != nullptr && strShdr != nullptr); - - auto numSymEntries = symShdr->shSize / symShdr->shEntsize; - auto sym = reinterpret_cast(ELFData + symShdr->shOffset); - auto firstStr = ELFData + strShdr->shOffset; - - for (size_t i = 0; i < numSymEntries; i++) { - if (cmp(firstStr + sym[i].stName, kernelName)) { - return sym[i].stValue - phdr->pVaddr; - } +void assertOneOrMoreOccurrence(const pugi::xml_node &node, const SmallVector& childs) { + for (const auto& name : childs) { + const auto& child = node.child(name.c_str()); + VPU_THROW_UNLESS(!child.empty(), + "Required parameter %s is not found", name); } - - VPU_THROW_EXCEPTION << "Cannot find kernel entry point for custom kernel " << kernelName; } -SmallVector deduceKernelParameters( - const char* ELFData, - uint32_t kernelAddress) { - ie::details::CaselessEq cmp; - IE_ASSERT(ELFData != nullptr); - - auto ehdr = reinterpret_cast(ELFData); - auto phdr = reinterpret_cast(ELFData + ehdr->ePhoff); - auto shdr = reinterpret_cast(ELFData + ehdr->eShoff); - - const Elf32Section* strShdr = nullptr; - const Elf32Section* symShdr = nullptr; - std::tie(strShdr, symShdr) = findSymbolTable(ELFData); - IE_ASSERT(symShdr != nullptr && strShdr != nullptr); - - auto numSymEntries = symShdr->shSize / symShdr->shEntsize; - auto sym = reinterpret_cast(ELFData + symShdr->shOffset); - auto firstStr = ELFData + strShdr->shOffset; - - const char* kernelArgStrings = nullptr; - for (size_t i = 0; i < numSymEntries; i++) { - if (cmp(firstStr + sym[i].stName, "opencl.kernelArgs.strings")) { - kernelArgStrings = ELFData + shdr[sym[i].stShndx].shOffset; - break; - } +void assertZeroOrOneOccurrence(const pugi::xml_node& node, const SmallVector& childNames) { + for (const auto& name : childNames) { + const auto& child = node.child(name.c_str()); + VPU_THROW_UNLESS(!child.empty() || child.next_sibling(name.c_str()).empty(), + "Found several definitions of the parameter %s", name); } - IE_ASSERT(kernelArgStrings != nullptr); - - SmallVector parameters; - for (size_t i = 0; i < numSymEntries; i++) { - if (cmp(firstStr + sym[i].stName, "opencl.kernelArgs.info")) { - auto ptr = ELFData + shdr[sym[i].stShndx].shOffset; - auto numKernels = *reinterpret_cast(ptr); - - auto metaOffset = sizeof(int); - for (int k = 0; k < numKernels; k++) { - auto kHdr = reinterpret_cast(ptr + metaOffset); - - if (kHdr->address-phdr->pVaddr == kernelAddress) { - auto aHdr = reinterpret_cast( - reinterpret_cast(&(kHdr->argOffset)) + sizeof(kHdr->argOffset) + kHdr->argOffset); - - auto numArgs = reinterpret_cast(aHdr)[-1]; - for (int n = 0; n < numArgs; n++, aHdr++) { - parameters.push_back(kernelArgStrings + aHdr->stringOffset); - } - - break; - } - - metaOffset += kHdr->sectionSize + sizeof(kHdr->address) + sizeof(kHdr->flags); - } - } - } - - return parameters; } -std::pair deduceVectorized( - const char* ELFData, - uint32_t kernelAddress) { - ie::details::CaselessEq cmp; - - IE_ASSERT(ELFData != nullptr); - - auto ehdr = reinterpret_cast(ELFData); - auto phdr = reinterpret_cast(ELFData + ehdr->ePhoff); - auto shdr = reinterpret_cast(ELFData + ehdr->eShoff); - - const Elf32Section* strShdr = nullptr; - const Elf32Section* symShdr = nullptr; - std::tie(strShdr, symShdr) = findSymbolTable(ELFData); - IE_ASSERT(symShdr != nullptr && strShdr != nullptr); - - auto numSymEntries = symShdr->shSize / symShdr->shEntsize; - auto sym = reinterpret_cast(ELFData + symShdr->shOffset); - auto firstStr = ELFData + strShdr->shOffset; - - const char* kernelArgStrings = nullptr; - for (size_t i = 0; i < numSymEntries; i++) { - if (cmp(firstStr + sym[i].stName, "opencl.kernelArgs.strings")) { - kernelArgStrings = ELFData + shdr[sym[i].stShndx].shOffset; - break; +void assertNoEmptyAttributes(const pugi::xml_node& customLayer) { + const auto checkAttributes = [&customLayer](const pugi::xml_node& node) { + for (const auto& attr : node.attributes()) { + VPU_THROW_UNLESS(strlen(attr.value()) != 0, + "Wrong custom layer XML: Custom layer %s has node <%s> with an empty attribute %s", + customLayer.attribute("name").value(), node.name(), attr.name()); } + }; + + checkAttributes(customLayer); + + for (const auto& child : customLayer.children()) { + assertNoEmptyAttributes(child); } - IE_ASSERT(kernelArgStrings != nullptr); - - for (size_t i = 0; i < numSymEntries; i++) { - if (cmp(firstStr + sym[i].stName, "opencl.kernelArgs.info")) { - auto ptr = ELFData + shdr[sym[i].stShndx].shOffset; - auto numKernels = *reinterpret_cast(ptr); - - auto metaOffset = sizeof(int); - for (int k = 0; k < numKernels; k++) { - auto kHdr = reinterpret_cast(ptr + metaOffset); - - if (kHdr->address-phdr->pVaddr == kernelAddress && kHdr->flags == 1) { - auto vecInfo = reinterpret_cast(kHdr + 1); - return std::make_pair(vecInfo[1], vecInfo[0]-phdr->pVaddr); - } - - metaOffset += kHdr->sectionSize + sizeof(kHdr->address) + sizeof(kHdr->flags); - } - } - } - - return std::make_pair(0, 0); -} - -int32_t getKernelId( - const char* ELFData, - uint32_t kernelAddress) { - ie::details::CaselessEq cmp; - - IE_ASSERT(ELFData != nullptr); - - auto ehdr = reinterpret_cast(ELFData); - auto phdr = reinterpret_cast(ELFData + ehdr->ePhoff); - auto shdr = reinterpret_cast(ELFData + ehdr->eShoff); - - const Elf32Section* strShdr = nullptr; - const Elf32Section* symShdr = nullptr; - std::tie(strShdr, symShdr) = findSymbolTable(ELFData); - IE_ASSERT(symShdr != nullptr && strShdr != nullptr); - - auto numSymEntries = symShdr->shSize / symShdr->shEntsize; - auto sym = reinterpret_cast(ELFData + symShdr->shOffset); - auto firstStr = ELFData + strShdr->shOffset; - - const char* kernelArgStrings = nullptr; - for (size_t i = 0; i < numSymEntries; i++) { - if (cmp(firstStr + sym[i].stName, "opencl.kernelArgs.strings")) { - kernelArgStrings = ELFData + shdr[sym[i].stShndx].shOffset; - break; - } - } - IE_ASSERT(kernelArgStrings != nullptr); - - for (size_t i = 0; i < numSymEntries; i++) { - if (cmp(firstStr + sym[i].stName, "opencl.kernelArgs.info")) { - auto ptr = ELFData + shdr[sym[i].stShndx].shOffset; - auto numKernels = *reinterpret_cast(ptr); - - auto metaOffset = sizeof(int); - for (int k = 0; k < numKernels; k++) { - auto kHdr = reinterpret_cast(ptr + metaOffset); - - if (kHdr->address-phdr->pVaddr == kernelAddress) { - return k; - } - - metaOffset += kHdr->sectionSize + sizeof(kHdr->address) + sizeof(kHdr->flags); - } - } - } - - return -1; } } // namespace @@ -321,20 +83,16 @@ int32_t getKernelId( ie::details::caseless_map> CustomLayer::loadFromFile( const std::string& configFile, bool canBeMissed) { - ie::details::caseless_map> out; - pugi::xml_document xmlDoc; pugi::xml_parse_result res = xmlDoc.load_file(configFile.c_str()); if (res.status != pugi::status_ok) { if (canBeMissed) { // Config file might not exist - like global config, for example. - return out; + return {}; } else { - VPU_THROW_EXCEPTION - << "Failed to load custom layer configuration file " << configFile - << " : " << res.description() - << " at offset " << res.offset; + VPU_THROW_FORMAT("Failed to load custom layer configuration file %s : %s at offset %s", + configFile, res.description(), res.offset); } } @@ -346,18 +104,15 @@ ie::details::caseless_map> CustomLaye auto abs_path_ptr = realpath(configFile.c_str(), path); #endif - if (abs_path_ptr == nullptr) { - VPU_THROW_EXCEPTION - << "Failed to load custom layer configuration file " << configFile - << " : can't get canonicalized absolute path"; - } + VPU_THROW_UNLESS(abs_path_ptr != nullptr, + "Failed to load custom layer configuration file %s : can't get canonicalized absolute path", configFile); std::string abs_file_name(path); // Try extracting directory from config path. auto dir_split_pos = abs_file_name.find_last_of("/\\"); - auto colon_pos = abs_file_name.find_first_of(":"); - auto first_slash_pos = abs_file_name.find_first_of("/"); + auto colon_pos = abs_file_name.find_first_of(':'); + auto first_slash_pos = abs_file_name.find_first_of('/'); // If path is absolute. std::string dir_path; @@ -369,411 +124,113 @@ ie::details::caseless_map> CustomLaye << " : path is not valid"; } + auto out = ie::details::caseless_map> {}; for (auto r = xmlDoc.document_element(); r; r = r.next_sibling()) { - CustomLayer::Ptr layer(new CustomLayer(dir_path)); - - layer->loadSingleLayer(r); - - out[layer->_layerName].push_back(layer); + auto layerPtr = std::make_shared(dir_path, r); + out[layerPtr->_layerName].push_back(std::move(layerPtr)); } return out; } -int CustomLayer::maxShaves() const { - return _maxShaves; -} -void CustomLayer::setStageNumInputs(int id) { - _stageNumInputs = id; -} +CustomLayer::CustomLayer(std::string configDir, const pugi::xml_node& customLayer) : _configDir(std::move(configDir)) { + const auto cmp = ie::details::CaselessEq{}; + const auto nodeName = customLayer.name(); + VPU_THROW_UNLESS(cmp(nodeName, "CustomLayer"), + "Wrong custom layer XML : Node is not CustomLayer, but %s", nodeName); -int CustomLayer::stageNumInputs() const { - return _stageNumInputs; -} + const auto nodeType = XMLParseUtils::GetStrAttr(customLayer, "type"); + VPU_THROW_UNLESS(cmp(nodeType, "MVCL"), + "Wrong custom layer XML : Type is not MVCL, but %s", nodeType); -uint32_t CustomLayer::kernelAddress(int idx) const { - for (const auto& x : _kernelAddress) { - if ((checked_cast(idx) % x.first) == 0) { - return x.second; + const auto version = XMLParseUtils::GetIntAttr(customLayer, "version"); + VPU_THROW_UNLESS(version == 1, "Wrong custom layer XML : only version 1 is supported"); + + _layerName = XMLParseUtils::GetStrAttr(customLayer, "name"); + + assertNoEmptyAttributes(customLayer); + + assertZeroOrOneOccurrence(customLayer, {"Where"}); + const auto whereNode = customLayer.child("Where"); + for (auto where : whereNode.attributes()) { + _whereParams[where.name()] = where.value(); + } + + assertOneOrMoreOccurrence(customLayer, {"Kernel"}); + auto kernelNodes = [&] { + auto nodes = SmallVector{}; + for (auto kernel = customLayer.child("Kernel"); !kernel.empty(); kernel = kernel.next_sibling("Kernel")) { + assertExactlyOneOccurrence(kernel, {"Parameters", "WorkSizes"}); + assertOneOrMoreOccurrence(kernel, {"Source"}); + nodes.push_back(kernel); + } + return nodes; + }(); + + if (kernelNodes.size() == 1) { + _kernels.emplace_back(kernelNodes.front(), _configDir); + } else { + auto stageOrder = std::map{}; + for (auto& kernel : kernelNodes) { + const auto stageAttr = kernel.attribute("stage"); + VPU_THROW_UNLESS(stageAttr, "Error while binding %s custom layer: for multi-kernel binding, " + "each kernel should be provided with 'stage' attribute.", _layerName); + + const auto stageNum = std::stod(stageAttr.value()); + VPU_THROW_UNLESS(stageOrder.find(stageNum) == stageOrder.end(), + "Error while binding %s custom layer: found duplicating stage id.", _layerName); + + stageOrder.emplace(stageNum, CustomKernel{kernel, _configDir}); + } + + VPU_THROW_UNLESS(stageOrder.begin()->first == 0, + "Error while binding %s custom layer: Stage 0 is not found.", _layerName); + VPU_THROW_UNLESS(stageOrder.rbegin()->first == stageOrder.size() - 1, + "Error while binding %s custom layer: Kernels should have stage id from 0 to N.", _layerName); + + for (auto& stage : stageOrder) { + _kernels.push_back(std::move(stage.second)); } } - auto it = _kernelAddress.find(1); - IE_ASSERT(it != _kernelAddress.end()); - - return it->second; -} - -int CustomLayer::kernelId() const { - uint32_t kernelAddress = getKernelEntry(&_kernelBinary[0], _kernelEntry); - return getKernelId(&_kernelBinary[0], kernelAddress); -} - -void CustomLayer::loadSingleLayer(const pugi::xml_node& node) { - ie::details::CaselessEq cmp; - - std::string nodeName(node.name()); - if (!cmp(nodeName, "CustomLayer")) { - VPU_THROW_EXCEPTION << "Wrong custom layer XML : Node is not CustomLayer, but " << nodeName; - } - - auto nodeType = XMLParseUtils::GetStrAttr(node, "type", ""); - if (!cmp(nodeType, "MVCL")) { - VPU_THROW_EXCEPTION << "Wrong custom layer XML : Type is not MVCL, but " << nodeType; - } - - auto version = XMLParseUtils::GetIntAttr(node, "version", -1); - IE_ASSERT(version == 1); - - auto layerStage = XMLParseUtils::GetStrAttr(node, "stage", ""); - auto layerName = XMLParseUtils::GetStrAttr(node, "name", ""); - if (layerName.empty()) { - VPU_THROW_EXCEPTION << "Missing Layer name in CustomLayer"; - } - _layerName = layerStage.empty() ? layerName : layerName + "@stage_" + layerStage; - - _maxShaves = XMLParseUtils::GetIntAttr(node, "max-shaves", 0); - - processWhere(node.child("Where")); - - processKernelNode(node.child("Kernel")); - - processParametersNode(node.child("Parameters")); - - processWorkSizesNode(node.child("WorkSizes")); -} - -void CustomLayer::processWhere(const pugi::xml_node& node) { - for (auto child : node.attributes()) { - _whereParams[child.name()] = child.value(); - } -} - -void CustomLayer::processKernelNode(const pugi::xml_node& node) { - ie::details::CaselessEq cmp; - - std::string nodeName(node.name()); - if (!cmp(nodeName, "Kernel")) { - VPU_THROW_EXCEPTION << "Wrong node, expected Kernel found " << nodeName; - } - - if (!_kernelBinary.empty()) { - VPU_THROW_EXCEPTION << "Multiple definition of Kernel"; - } - - _kernelEntry = XMLParseUtils::GetStrAttr(node, "entry", ""); - if (_kernelEntry.empty()) { - VPU_THROW_EXCEPTION << "No Kernel entry in custom layer"; - } - - _kernelBinary.clear(); - for (auto sourceNode = node.child("Source"); !sourceNode.empty(); sourceNode = sourceNode.next_sibling("Source")) { - auto fileName = _configDir + "/" + XMLParseUtils::GetStrAttr(sourceNode, "filename", ""); - - std::ifstream inputFile(fileName, std::ios::binary); - if (!inputFile.is_open()) { - VPU_THROW_EXCEPTION << "Couldn't open kernel file " << fileName; + const auto addPorts = [](std::map& ports, const CustomKernel::KernelParam& newEdge) { + const auto layerInput = ports.find(newEdge.portIndex); + if (layerInput == ports.end()) { + ports.emplace(newEdge.portIndex, newEdge.format); + } else if (newEdge.format == CustomDataFormat::Any) { + return; + } else if (layerInput->second == CustomDataFormat::Any) { + layerInput->second = newEdge.format; } + }; - std::ostringstream contentStream; - contentStream << inputFile.rdbuf(); - _kernelBinary.append(contentStream.str()); - } - - _kernelAddress[1] = getKernelEntry(&_kernelBinary[0], _kernelEntry); - - _parameters = deduceKernelParameters(&_kernelBinary[0], _kernelAddress[1]); - - auto vecInfo = deduceVectorized(&_kernelBinary[0], _kernelAddress[1]); - if (vecInfo.first != 0) { - _kernelAddress[vecInfo.first] = vecInfo.second; - } -} - -void CustomLayer::processParametersNode(const pugi::xml_node& node) { - ie::details::CaselessEq cmp; - - std::string nodeName(node.name()); - if (!cmp(nodeName, "Parameters")) { - VPU_THROW_EXCEPTION << "Wrong node, expected Parameters found " << nodeName; - } - - for (auto tensorNode = node.child("Tensor"); !tensorNode.empty(); tensorNode = tensorNode.next_sibling("Tensor")) { - KernelParam kp; - - auto typeStr = XMLParseUtils::GetStrAttr(tensorNode, "type"); - if (cmp(typeStr, "input")) { - kp.type = CustomParamType::Input; - } else if (cmp(typeStr, "output")) { - kp.type = CustomParamType::Output; - } else if (cmp(typeStr, "input_buffer")) { - kp.type = CustomParamType::InputBuffer; - } else if (cmp(typeStr, "output_buffer")) { - kp.type = CustomParamType::OutputBuffer; - } else if (cmp(typeStr, "data")) { - kp.type = CustomParamType::Data; - } else { - VPU_THROW_EXCEPTION << "Tensor node has an invalid type " << typeStr; - } - - kp.format = formatFromString(XMLParseUtils::GetStrAttr(tensorNode, "format", "BFYX")); - if (kp.format == CustomDataFormat::None) { - VPU_THROW_EXCEPTION << "Tensor node has an invalid format " << kp.format; - } - - kp.argName = XMLParseUtils::GetStrAttr(tensorNode, "arg-name"); - if (kp.argName.empty()) { - VPU_THROW_EXCEPTION << "Tensor node has no arg-name"; - } - - kp.portIndex = XMLParseUtils::GetIntAttr(tensorNode, "port-index", -1); - if (kp.portIndex == -1) { - VPU_THROW_EXCEPTION << "Tensor node has no port-index"; - } - - if (kp.type == CustomParamType::InputBuffer || kp.type == CustomParamType::OutputBuffer) { - std::string bufferSize(XMLParseUtils::GetStrAttr(tensorNode, "size", "")); - while (!bufferSize.empty()) { - auto pos = bufferSize.find_first_of(','); - auto rule = bufferSize.substr(0, pos); - if (!isLegalSizeRule(rule)) { - VPU_THROW_EXCEPTION << "Invalid BufferSize " << rule; - } - - kp.bufferSizeRules.emplace_back(std::move(rule)); - - if (pos == std::string::npos) { - bufferSize.clear(); - } else { - bufferSize = bufferSize.substr(pos + 1, std::string::npos); - } + for (const auto& kernel : _kernels) { + for (const auto& binding : kernel.bindings()) { + if (binding.type == CustomParamType::Input) { + addPorts(_inputs, binding); } - - kp.dimIdx = -1; - std::string dim_src_string(XMLParseUtils::GetStrAttr(tensorNode, "dim", "")); - if (!dim_src_string.empty()) { - // Try to locate index separator. - auto pos = dim_src_string.find_first_of(','); - auto flag = dim_src_string.substr(0, pos); - if (cmp(flag, "input")) { - kp.dimSource = CustomDimSource::Input; - } else if (cmp(flag, "output")) { - kp.dimSource = CustomDimSource::Output; - } else { - VPU_THROW_EXCEPTION << "Invalid WG dim source " << flag; - } - - int idx = 0; - if (pos != std::string::npos) { - // User explicitly set input index in config. - auto idx_string = dim_src_string.substr(pos + 1, std::string::npos); - idx = std::stoi(idx_string); - } - if (idx < 0) { - VPU_THROW_EXCEPTION << "Invalid tensor index " << idx; - } - - kp.dimIdx = idx; + if (binding.type == CustomParamType::Output) { + addPorts(_outputs, binding); } } - - kp.irSource.clear(); - - _kernelParams.emplace_back(std::move(kp)); - } - - for (auto dataNode = node.child("Data"); !dataNode.empty(); dataNode = dataNode.next_sibling("Data")) { - KernelParam kp; - - auto typeStr = XMLParseUtils::GetStrAttr(dataNode, "type"); - if (cmp(typeStr, "data")) { - kp.type = CustomParamType::Data; - } else if (cmp(typeStr, "local_data")) { - kp.type = CustomParamType::LocalData; - } else { - VPU_THROW_EXCEPTION << "Data node has an invalid type " << typeStr; - } - - kp.format = CustomDataFormat::Any; - - kp.argName = XMLParseUtils::GetStrAttr(dataNode, "arg-name"); - if (kp.argName.empty()) { - VPU_THROW_EXCEPTION << "Data node has no arg-name"; - } - - kp.portIndex = -1; - - kp.irSource = XMLParseUtils::GetStrAttr(dataNode, "source", ""); - std::string dim_src_string(XMLParseUtils::GetStrAttr(dataNode, "dim", "")); - - if (kp.irSource.empty() && dim_src_string.empty()) { - VPU_THROW_EXCEPTION << "Data node has no source or dim"; - } - - if (!kp.irSource.empty() && !dim_src_string.empty()) { - VPU_THROW_EXCEPTION << "Data node can only have source or dim"; - } - - kp.dimIdx = -1; - if (kp.type == CustomParamType::LocalData) { - std::string bufferSize(XMLParseUtils::GetStrAttr(dataNode, "size", "")); - while (!bufferSize.empty()) { - auto pos = bufferSize.find_first_of(','); - auto rule = bufferSize.substr(0, pos); - if (!isLegalSizeRule(rule)) { - VPU_THROW_EXCEPTION << "Invalid BufferSize " << rule; - } - - kp.bufferSizeRules.emplace_back(std::move(rule)); - - if (pos == std::string::npos) { - bufferSize.clear(); - } else { - bufferSize = bufferSize.substr(pos + 1, std::string::npos); - } - } - - kp.dimIdx = -1; - std::string dim_src_string(XMLParseUtils::GetStrAttr(dataNode, "dim", "")); - if (!dim_src_string.empty()) { - // Try to locate index separator. - auto pos = dim_src_string.find_first_of(','); - auto flag = dim_src_string.substr(0, pos); - if (cmp(flag, "input")) { - kp.dimSource = CustomDimSource::Input; - } else if (cmp(flag, "output")) { - kp.dimSource = CustomDimSource::Output; - } else { - VPU_THROW_EXCEPTION << "Invalid WG dim source " << flag; - } - - int idx = 0; - if (pos != std::string::npos) { - // User explicitly set input index in config. - auto idx_string = dim_src_string.substr(pos + 1, std::string::npos); - idx = std::stoi(idx_string); - } - if (idx < 0) { - VPU_THROW_EXCEPTION << "Invalid tensor index " << idx; - } - - kp.dimIdx = idx; - } - } - - _kernelParams.emplace_back(std::move(kp)); - } - - for (auto scalarNode = node.child("Scalar"); !scalarNode.empty(); scalarNode = scalarNode.next_sibling("Scalar")) { - KernelParam kp; - - std::string typeStr = XMLParseUtils::GetStrAttr(scalarNode, "type"); - if (cmp(typeStr, "int")) { - kp.type = CustomParamType::Int; - } else if (cmp(typeStr, "float")) { - kp.type = CustomParamType::Float; - } else { - VPU_THROW_EXCEPTION << "Scalar node has an invalid type " << typeStr; - } - - kp.format = CustomDataFormat::Any; - - kp.argName = XMLParseUtils::GetStrAttr(scalarNode, "arg-name"); - if (kp.argName.empty()) { - VPU_THROW_EXCEPTION << "Scalar node has no arg-name"; - } - - kp.portIndex = XMLParseUtils::GetIntAttr(scalarNode, "port-index", 0); - - kp.irSource = XMLParseUtils::GetStrAttr(scalarNode, "source", ""); - if (kp.irSource.empty()) { - VPU_THROW_EXCEPTION << "Scalar node has no source"; - } - - _kernelParams.emplace_back(std::move(kp)); } } -void CustomLayer::processWorkSizesNode(const pugi::xml_node & node) { - ie::details::CaselessEq cmp; +bool CustomLayer::isLegalSizeRule(const std::string& rule, std::map layerParams) { + { + auto sizes = SmallVector> { + { "b", "1" }, { "B", "1" }, + { "f", "1" }, { "F", "1" }, + { "y", "1" }, { "Y", "1" }, + { "x", "1" }, { "X", "1" }, + }; - std::string nodeName(node.name()); - if (!cmp(node.name(), "WorkSizes")) { - VPU_THROW_EXCEPTION << "Wrong node, expected WorkSizes found " << nodeName; + std::move(begin(sizes), end(sizes), inserter(layerParams, end(layerParams))); } - _wgDimIdx = -1; - std::string dim_src_string(node.attribute("dim").as_string("")); - if (!dim_src_string.empty()) { - // Try to locate index separator. - auto pos = dim_src_string.find_first_of(','); - auto flag = dim_src_string.substr(0, pos); - if (cmp(flag, "input")) { - _wgDimSource = CustomDimSource::Input; - } else if (cmp(flag, "output")) { - _wgDimSource = CustomDimSource::Output; - } else { - VPU_THROW_EXCEPTION << "Invalid WG dim source " << flag; - } - - int idx = 0; - if (pos != std::string::npos) { - // User explicitly set input index in config. - auto idx_string = dim_src_string.substr(pos + 1, std::string::npos); - idx = std::stoi(idx_string); - } - if (idx < 0) { - VPU_THROW_EXCEPTION << "Invalid tensor index " << idx; - } - - _wgDimIdx = idx; - } - - std::string gws(node.attribute("global").as_string("")); - while (!gws.empty()) { - auto pos = gws.find_first_of(','); - auto rule = gws.substr(0, pos); - if (!isLegalSizeRule(rule)) { - VPU_THROW_EXCEPTION << "Invalid WorkSize " << rule; - } - - _globalSizeRules.emplace_back(std::move(rule)); - - if (pos == std::string::npos) { - gws.clear(); - } else { - gws = gws.substr(pos + 1, std::string::npos); - } - } - - std::string lws(node.attribute("local").as_string("")); - while (!lws.empty()) { - auto pos = lws.find_first_of(','); - auto rule = lws.substr(0, pos); - if (!isLegalSizeRule(rule)) { - VPU_THROW_EXCEPTION << "Invalid WorkSize " << rule; - } - - _localSizeRules.emplace_back(std::move(rule)); - - if (pos == std::string::npos) { - lws.clear(); - } else { - lws = lws.substr(pos + 1, std::string::npos); - } - } -} - -bool CustomLayer::isLegalSizeRule(const std::string& rule) { - SimpleMathExpression expr; - - expr.setVariables({ - { 'b', 1 }, { 'B', 1 }, - { 'f', 1 }, { 'F', 1 }, - { 'y', 1 }, { 'Y', 1 }, - { 'x', 1 }, { 'X', 1 }, - }); + MathExpression expr; + expr.setVariables(layerParams); try { expr.parse(rule); @@ -784,21 +241,66 @@ bool CustomLayer::isLegalSizeRule(const std::string& rule) { return true; } -CustomDataFormat CustomLayer::formatFromString(const std::string & str) { - static const ie::details::caseless_map FormatNameToType = { - { "BFYX" , CustomDataFormat::BFYX }, - { "BYXF" , CustomDataFormat::BYXF }, - { "FYX" , CustomDataFormat::FYX }, - { "YXF" , CustomDataFormat::YXF }, - { "ANY" , CustomDataFormat::Any }, +CustomDataFormat CustomLayer::formatFromLayout(const InferenceEngine::Layout& layout) { + const auto layoutToFormat = std::map { + { ie::NCHW , CustomDataFormat::BFYX }, + { ie::NHWC , CustomDataFormat::BYXF }, + { ie::CHW , CustomDataFormat::FYX }, + { ie::NC , CustomDataFormat::BF }, + { ie::ANY , CustomDataFormat::Any } }; - auto it = FormatNameToType.find(str); - if (it != FormatNameToType.end()) { - return it->second; - } + const auto it = layoutToFormat.find(layout); + VPU_THROW_UNLESS(it != layoutToFormat.end(), "Tensor node has an invalid format %s", layout); + return it->second; +} - return CustomDataFormat::None; +bool CustomLayer::meetsWhereRestrictions(const std::map& params) const { + const auto cmp = ie::details::CaselessEq{}; + + for (const auto& where : _whereParams) { + const auto restrictedParam = [&](const std::pair& param) { + return param.first == where.first; + }; + + const auto param = std::find_if(begin(params), end(params), restrictedParam); + if (param == params.end()) { + return false; + } + + const auto& restriction = where.second; + const auto number = parseNumber(param->second); + + const auto meetsRestriction = [&] { + // compare non-number restrictions (ex. kernel="3,3") + if (!number.hasValue()) { + return cmp(param->second, restriction); + } else { + if (restriction[0] == '>' && restriction[1] == '=') { + const auto to_compare = std::stof(restriction.substr(2, std::string::npos)); + return number.get() >= to_compare; + } else if (restriction[0] == '<' && restriction[1] == '=') { + const auto to_compare = std::stof(restriction.substr(2, std::string::npos)); + return number.get() <= to_compare; + } else if (restriction[0] == '>') { + const auto to_compare = std::stof(restriction.substr(1, std::string::npos)); + return number.get() > to_compare; + } else if (restriction[0] == '<') { + const auto to_compare = std::stof(restriction.substr(1, std::string::npos)); + return number.get() < to_compare; + } else if (restriction[0] == '!' && restriction[1] == '=') { + const auto to_compare = std::stof(restriction.substr(2, std::string::npos)); + return number.get() != to_compare; + } + return number.get() == std::stof(restriction); + } + }(); + + if (!meetsRestriction) { + return false; + } + } + return true; } } // namespace vpu diff --git a/inference-engine/src/vpu/graph_transformer/src/frontend/frontend.cpp b/inference-engine/src/vpu/graph_transformer/src/frontend/frontend.cpp index 0902dd06d11..16f18e9240e 100644 --- a/inference-engine/src/vpu/graph_transformer/src/frontend/frontend.cpp +++ b/inference-engine/src/vpu/graph_transformer/src/frontend/frontend.cpp @@ -17,6 +17,13 @@ #include #include #include +#include + +#include +#include +#include +#include +#include namespace vpu { @@ -105,6 +112,8 @@ FrontEnd::FrontEnd(StageBuilder::Ptr stageBuilder) {"StaticShapeNonZero", LAYER_PARSER(parseNonZero)}, {"ROIAlign", LAYER_PARSER(parseROIAlign)}, {"DynamicShapeResolver", LAYER_PARSER(parseDSR)}, + {"OutShapeOfReshape", LAYER_PARSER(parseOutShapeOfReshape)}, + {"StaticShapeBroadcast", LAYER_PARSER(parseBroadcast)}, }} {} ModelPtr FrontEnd::buildInitialModel(ie::ICNNNetwork& network) { @@ -149,38 +158,110 @@ namespace { std::atomic g_counter(0); -bool hasSuitableCustom( - const std::vector& customLayers, - const ie::CNNLayerPtr& layer) { - const auto& env = CompileEnv::get(); - ie::details::CaselessEq cmp; +} // namespace - env.log->trace("Check for suitable custom implementation for layer %s:%s", layer->name, layer->type); +CustomLayer::Ptr FrontEnd::getSuitableCustomLayer(const std::vector& customLayers, + const ie::CNNLayerPtr& cnnLayer) { + const auto& env = CompileEnv::get(); + env.log->trace("Check for suitable custom implementation for layer %s:%s", + cnnLayer->name, cnnLayer->type); VPU_LOGGER_SECTION(env.log); - for (const auto& customLayer : customLayers) { - env.log->trace("Check next custom layer : %v", customLayer->whereParams()); + const auto cnnInputs = [&] { + auto inputs = SmallVector{}; + inputs.reserve(cnnLayer->insData.size()); + for (const auto& input : cnnLayer->insData) { + const auto layout = input.lock()->getLayout(); + const auto format = CustomLayer::formatFromLayout(layout); + inputs.push_back(format); + } + return inputs; + }(); + + const auto cnnOutputs = [&] { + auto outputs = SmallVector{}; + outputs.reserve(cnnLayer->outData.size()); + for (const auto& output : cnnLayer->outData) { + const auto layout = output->getLayout(); + const auto format = CustomLayer::formatFromLayout(layout); + outputs.push_back(format); + } + return outputs; + }(); + + const auto isSuitableLayer = [&env, &cnnLayer](const CustomLayer::Ptr& customLayer) { + env.log->trace("Check next custom layer : %v", customLayer->layerName()); VPU_LOGGER_SECTION(env.log); - bool suitable = true; - for (const auto& whereParam : customLayer->whereParams()) { - const auto iter = layer->params.find(whereParam.first); - if (iter == layer->params.end() || !cmp(iter->second, whereParam.second)) { - suitable = false; - break; + if (!customLayer->meetsWhereRestrictions(cnnLayer->params)) { + env.log->trace("Where restrictions are not met"); + return false; + } + + for (const auto& kernel : customLayer->kernels()) { + const auto& gws = kernel.globalGridSizeRules(); + const auto& lws = kernel.localGridSizeRules(); + + const auto validSizeRule = [&](const std::string& rule) { + return CustomLayer::isLegalSizeRule(rule, cnnLayer->params); + }; + + const auto validGridSizes = std::all_of(begin(gws), end(gws), validSizeRule) && + std::all_of(begin(lws), end(lws), validSizeRule); + + if (!validGridSizes) { + env.log->trace("Work group grid sizes are not valid"); + return false; } } - if (suitable) { - env.log->trace("Matches"); - return true; + return true; + }; + + auto suitableCustomLayers = SmallVector{}; + + std::copy_if(begin(customLayers), end(customLayers), + back_inserter(suitableCustomLayers), isSuitableLayer); + + if (suitableCustomLayers.empty()) { + return nullptr; + } + + const auto inputsLayoutMatch = [&](const SmallVector& cnnEdges, + const std::map& clEdges) { + for (const auto clEdge : clEdges) { + const auto port = clEdge.first; + VPU_THROW_UNLESS(port < cnnEdges.size(), + "Can't bind custom layer edge with port '%s' to CNNNetwork layer", port); + + const auto clFormat = clEdge.second; + const auto cnnFormat = cnnEdges[port]; + if (cnnFormat != clFormat && + cnnFormat != CustomDataFormat::Any && + clFormat != CustomDataFormat::Any) { + return false; + } + } + return true; + }; + + + for (const auto& customLayer : suitableCustomLayers) { + const auto clInputs = customLayer->inputs(); + + if (inputsLayoutMatch(cnnInputs, clInputs)) { + env.log->trace("Found suitable '%s' custom layer", customLayer->layerName()); + return customLayer; } } - return false; + const auto firstGoodLayer = suitableCustomLayers.front(); + env.log->trace("Found suitable custom layer '%s', but input layouts " + "have not matched with what CNNNetwork expected", + firstGoodLayer->layerName()); + return firstGoodLayer; } -} // namespace void FrontEnd::parseLayer(const Model& model, const ie::CNNLayerPtr& layer, const DataVector& inputs, const DataVector& outputs) { parseLayer(model, layer, inputs, outputs, @@ -191,12 +272,8 @@ void FrontEnd::parseLayer(const Model& model, const ie::CNNLayerPtr& layer, cons void FrontEnd::parseLayer(const Model& model, const ie::CNNLayerPtr& layer, const DataVector& inputs, const DataVector& outputs, const FrontEnd::UnsupportedLayerCallback& onUnsupported, const FrontEnd::SupportedLayerCallback& onSupported) { - const auto customLayerByType = _customLayers.find(layer->type); - const auto customLayerAsStage = _customLayers.find(layer->type + "@stage_0"); - - const bool isCustomLayer = - ((customLayerByType != _customLayers.end()) && hasSuitableCustom(customLayerByType->second, layer)) || - ((customLayerAsStage != _customLayers.end()) && hasSuitableCustom(customLayerAsStage->second, layer)); + const auto customLayer = _customLayers.find(layer->type); + const bool isCustomLayer = customLayer != _customLayers.end() && getSuitableCustomLayer(customLayer->second, layer); const auto& type = isCustomLayer ? "Custom" : layer->type; if (parsers.count(type) == 0) { @@ -235,6 +312,15 @@ ModelPtr FrontEnd::runCommonPasses(ie::ICNNNetwork& network) { ModelPtr FrontEnd::runCommonPasses(ie::ICNNNetwork& network, const UnsupportedLayerCallback& unsupportedLayer, const SupportedLayerCallback& supportedLayer) { + // NGraph -> CNN conversion may be called in 2 different moments: at + // the beginning if conversion was forced by configuration or after detect + // network batch and precision conversions. Conversion utility + // returns std::shared_ptr. ICNNNetwork is neither copyable nor movable. + // As a result, it is impossible to overwrite given "network" argument. + // Do not use network parameter in this function to avoid using wrong network + // reference (e.g. original instead of converted). + auto* originalOrConvertNetwork = &network; + const auto& env = CompileEnv::get(); // @@ -268,7 +354,7 @@ ModelPtr FrontEnd::runCommonPasses(ie::ICNNNetwork& network, const UnsupportedLa // Create new VPU model // - const auto model = std::make_shared(network.getName()); + const auto model = std::make_shared(originalOrConvertNetwork->getName()); model->attrs().set("index", g_counter.fetch_add(1)); model->attrs().set("resources", env.resources); @@ -276,7 +362,7 @@ ModelPtr FrontEnd::runCommonPasses(ie::ICNNNetwork& network, const UnsupportedLa if (!env.config.ignoreIRStatistic) { ie::ICNNNetworkStats* stats = nullptr; // V10 IRs doesn't contain stats - if (network.getStats(&stats, nullptr) == InferenceEngine::OK && !stats->isEmpty()) { + if (originalOrConvertNetwork->getStats(&stats, nullptr) == InferenceEngine::OK && !stats->isEmpty()) { env.log->trace("Use node statistics from the IR"); model->setNodesStats(stats->getNodesStats()); } @@ -286,40 +372,50 @@ ModelPtr FrontEnd::runCommonPasses(ie::ICNNNetwork& network, const UnsupportedLa // Update IE Network // + std::shared_ptr convertedNetwork; + { env.log->trace("Update IE Network"); VPU_LOGGER_SECTION(env.log); - IE_SUPPRESS_DEPRECATED_START - // If we have NGraph network, but CNN compatibility is enabled, enforce conversion - if (network.getFunction() && env.config.forceDeprecatedCnnConversion) - network.addLayer(nullptr); - IE_SUPPRESS_DEPRECATED_END + auto convertNetwork = [&convertedNetwork, &originalOrConvertNetwork]() { + auto nGraphFunc = originalOrConvertNetwork->getFunction(); + // Disable shape inference (WA for generic operations) + ngraph::op::GenericIE::DisableReshape noReshape(nGraphFunc); - detectNetworkBatch(network, model); + ngraph::pass::ConvertOpSet3ToOpSet2().run_on_function(nGraphFunc); + ngraph::pass::ConvertOpSet2ToOpSet1().run_on_function(nGraphFunc); + ngraph::pass::ConvertOpSet1ToLegacy().run_on_function(nGraphFunc); + convertedNetwork = InferenceEngine::details::convertFunctionToICNNNetwork(nGraphFunc, *originalOrConvertNetwork); + originalOrConvertNetwork = convertedNetwork.get(); + }; - ie::NetPass::ConvertPrecision(network, ie::Precision::I64, ie::Precision::I32); - ie::NetPass::ConvertPrecision(network, ie::Precision::U64, ie::Precision::I32); - ie::NetPass::ConvertPrecision(network, ie::Precision::BOOL, ie::Precision::I32); + if (originalOrConvertNetwork->getFunction() && env.config.forceDeprecatedCnnConversion) { + convertNetwork(); + } - IE_SUPPRESS_DEPRECATED_START - // force conversion to CNNNetwork - if (network.getFunction()) - network.addLayer(nullptr); - IE_SUPPRESS_DEPRECATED_END + detectNetworkBatch(*originalOrConvertNetwork, model); - moveConstInputsToBlobs(network); + if (originalOrConvertNetwork->getFunction()) { + convertNetwork(); + } - removeConstLayers(network); + ie::NetPass::ConvertPrecision(*originalOrConvertNetwork, ie::Precision::I64, ie::Precision::I32); + ie::NetPass::ConvertPrecision(*originalOrConvertNetwork, ie::Precision::U64, ie::Precision::I32); + ie::NetPass::ConvertPrecision(*originalOrConvertNetwork, ie::Precision::BOOL, ie::Precision::I32); - unrollLoops(network); + moveConstInputsToBlobs(*originalOrConvertNetwork); + + removeConstLayers(*originalOrConvertNetwork); + + unrollLoops(*originalOrConvertNetwork); } // // Parse IR Network // - _ieParsedNetwork = parseNetwork(network); + _ieParsedNetwork = parseNetwork(*originalOrConvertNetwork); // // Process internal VPU Model @@ -331,7 +427,9 @@ ModelPtr FrontEnd::runCommonPasses(ie::ICNNNetwork& network, const UnsupportedLa parseInputAndOutputData(model); - addDataTypeConvertStages(model); + if (!CompileEnv::get().config.disableConvertStages) { + addDataTypeConvertStages(model); + } addPreProcessStages(model); } diff --git a/inference-engine/src/vpu/graph_transformer/src/middleend/allocator/allocator.cpp b/inference-engine/src/vpu/graph_transformer/src/middleend/allocator/allocator.cpp index 36a9a9e8e2e..5c9ee385b26 100644 --- a/inference-engine/src/vpu/graph_transformer/src/middleend/allocator/allocator.cpp +++ b/inference-engine/src/vpu/graph_transformer/src/middleend/allocator/allocator.cpp @@ -291,6 +291,12 @@ ShapeLocation Allocator::allocateShape(Data& data) { shapeLocation.dimsLocation = dataLocation.location; shapeLocation.dimsOffset = dataLocation.offset; + + if (data->usage() == DataUsage::Output) { + // We need to allocate memory for maximum dims values also + data->attrs().set("ioDimsUpperBoundOffset", _blobMemOffset); + _blobMemOffset += dimsByteSize; + } } else { // Static allocation shapeLocation.dimsLocation = Location::Blob; @@ -308,21 +314,20 @@ ShapeLocation Allocator::allocateShape(Data& data) { } void Allocator::freeData(const Data& data, DeallocationMode mode) { - // - // Release the chunk - // + const auto getChunk = [this, &data](const Data& parent) { + VPU_THROW_UNLESS(_allocatedIntermData.count(parent) > 0, + "Allocator failed on freeData for {} with usage {}: parent data {} with usage {} is not allocated", + data->name(), data->usage(), parent->name(), parent->usage()); - if (const auto& parentDataToShapeEdge = data->parentDataToShapeEdge()) { - auto const& parent = parentDataToShapeEdge->parent(); - - auto it = _memChunksPerData.find(parentDataToShapeEdge->parent()); - auto chunk = it->second; + auto it = _memChunksPerData.find(parent); VPU_INTERNAL_CHECK(it != _memChunksPerData.end(), "Allocator failed on freeData for {} with usage {}: parent data {} with usage {} " "containing shape for current data wasn't yet allocated", data->name(), data->usage(), parent->name(), parent->usage()); + auto chunk = it->second; + VPU_INTERNAL_CHECK(chunk != nullptr, "Allocator failed on freeData for {} with usage {}: parent data {} with usage {} " "containing shape for current data has no memory chunk", @@ -333,6 +338,10 @@ void Allocator::freeData(const Data& data, DeallocationMode mode) { "containing shape for this data has zero usages, but it is using at least by current data", data->name(), data->usage(), parent->name(), parent->usage()); + return chunk; + }; + + const auto decreaseChunkUsage = [this](allocator::MemChunk* chunk, const Data& parent) { --chunk->inUse; if (chunk->inUse == 0) { @@ -341,32 +350,30 @@ void Allocator::freeData(const Data& data, DeallocationMode mode) { _memChunksPerData.erase(parent); _allocatedIntermData.erase(parent); } + }; + + // + // Release the chunk + // + + if (const auto& parentDataToShapeEdge = data->parentDataToShapeEdge()) { + auto const& parent = parentDataToShapeEdge->parent(); + + if (parent->usage() == DataUsage::Intermediate || parent->usage() == DataUsage::Temp) { + auto chunk = getChunk(parent); + decreaseChunkUsage(chunk, parent); + } } auto topParent = data->getTopParentData(); if (topParent->usage() == DataUsage::Intermediate || topParent->usage() == DataUsage::Temp) { - IE_ASSERT(_allocatedIntermData.count(topParent) > 0); - - auto it = _memChunksPerData.find(topParent); - IE_ASSERT(it != _memChunksPerData.end()); - - auto chunk = it->second; - IE_ASSERT(chunk != nullptr); - IE_ASSERT(chunk->inUse > 0); + auto chunk = getChunk(topParent); switch (mode) { case DeallocationMode::JustFree: { - --chunk->inUse; - - if (chunk->inUse == 0) { - freeMem(chunk); - - _memChunksPerData.erase(topParent); - _allocatedIntermData.erase(topParent); - } - + decreaseChunkUsage(chunk, topParent); break; } diff --git a/inference-engine/src/vpu/graph_transformer/src/middleend/pass_manager.cpp b/inference-engine/src/vpu/graph_transformer/src/middleend/pass_manager.cpp index 7e43fc5055c..7717d25de89 100644 --- a/inference-engine/src/vpu/graph_transformer/src/middleend/pass_manager.cpp +++ b/inference-engine/src/vpu/graph_transformer/src/middleend/pass_manager.cpp @@ -87,6 +87,16 @@ PassSet::Ptr PassManager::buildMiddleEnd() { // initial dump pass must be the first dump ADD_DUMP_PASS("initial"); + // + // Replace Global AvgPooling with ReduceMean + // + + if (env.config.enableReplaceWithReduceMean) { + ADD_PASS(replaceWithReduceMean); + ADD_DUMP_PASS("replaceWithReduceMean"); + } + + if (!env.config.disableReorder && !env.config.hwOptimization) { ADD_PASS(reorderInputsToChannelMinor); ADD_DUMP_PASS("reorderInputsToChannelMinor"); @@ -127,15 +137,6 @@ PassSet::Ptr PassManager::buildMiddleEnd() { ADD_PASS(mergeParallelFC); ADD_DUMP_PASS("mergeParallelFC"); - // - // Replace Global AvgPooling with ReduceMean - // - - if (env.config.enableReplaceWithReduceMean) { - ADD_PASS(replaceWithReduceMean); - ADD_DUMP_PASS("replaceWithReduceMean"); - } - // // Model common adaptation // @@ -188,6 +189,11 @@ PassSet::Ptr PassManager::buildMiddleEnd() { ADD_PASS(hwPadding); ADD_DUMP_PASS("hwPadding"); + if (env.config.hwOptimization) { + ADD_PASS(splitLargeKernelConv); + ADD_DUMP_PASS("splitLargeKernelConv"); + } + // // Batch support // diff --git a/inference-engine/src/vpu/graph_transformer/src/middleend/passes/adjust_data_location.cpp b/inference-engine/src/vpu/graph_transformer/src/middleend/passes/adjust_data_location.cpp index 8538f344134..54e24461d14 100644 --- a/inference-engine/src/vpu/graph_transformer/src/middleend/passes/adjust_data_location.cpp +++ b/inference-engine/src/vpu/graph_transformer/src/middleend/passes/adjust_data_location.cpp @@ -327,7 +327,7 @@ void PassImpl::adjustModelForMemReqs(const Model& model) { env.log->trace("Child data [%s] : mode [%v] offset [%v]", childData->name(), mode, offset); - model->replaceParentData(childDataEdge, ddrCopy); + model->replaceDataToDataParent(childDataEdge, ddrCopy); loopOverData(childData, [](const Data& subData) { subData->setMemReqs(MemoryType::DDR); diff --git a/inference-engine/src/vpu/graph_transformer/src/middleend/passes/eliminate_const_concat.cpp b/inference-engine/src/vpu/graph_transformer/src/middleend/passes/eliminate_const_concat.cpp index d465ce2adef..f21c4b4cc64 100644 --- a/inference-engine/src/vpu/graph_transformer/src/middleend/passes/eliminate_const_concat.cpp +++ b/inference-engine/src/vpu/graph_transformer/src/middleend/passes/eliminate_const_concat.cpp @@ -18,7 +18,7 @@ namespace { class PassImpl final : public PerStagePass { public: - PassImpl() : PerStagePass({StageType::Concat}) {} + PassImpl() : PerStagePass({StageType::StubConcat}) {} void runForStage(const Model& model, const Stage& stage) override; }; diff --git a/inference-engine/src/vpu/graph_transformer/src/middleend/passes/final_check.cpp b/inference-engine/src/vpu/graph_transformer/src/middleend/passes/final_check.cpp index b76f0715e19..097e5f7708a 100644 --- a/inference-engine/src/vpu/graph_transformer/src/middleend/passes/final_check.cpp +++ b/inference-engine/src/vpu/graph_transformer/src/middleend/passes/final_check.cpp @@ -112,7 +112,7 @@ void PassImpl::run(const Model& model) { // if (dataEdge->connectionMode() == SharedConnectionMode::SINGLE_STAGE) { - if (connectionStage->type() == StageType::Concat || + if (connectionStage->type() == StageType::StubConcat || connectionStage->type() == StageType::Expand) { IE_ASSERT(producer == child); IE_ASSERT(consumer == parent); diff --git a/inference-engine/src/vpu/graph_transformer/src/middleend/passes/process_special_stages.cpp b/inference-engine/src/vpu/graph_transformer/src/middleend/passes/process_special_stages.cpp index 0da6be9ab13..542586632a8 100644 --- a/inference-engine/src/vpu/graph_transformer/src/middleend/passes/process_special_stages.cpp +++ b/inference-engine/src/vpu/graph_transformer/src/middleend/passes/process_special_stages.cpp @@ -105,7 +105,7 @@ void PassImpl::run(const Model& model) { continue; } - if (stage->type() == StageType::Concat) { + if (stage->type() == StageType::StubConcat) { _processor.processConcat(model, stage); } else if (stage->type() == StageType::Split) { _processor.processSplit(model, stage); diff --git a/inference-engine/src/vpu/graph_transformer/src/middleend/passes/replace_with_screlu.cpp b/inference-engine/src/vpu/graph_transformer/src/middleend/passes/replace_with_screlu.cpp index f1059f4c5a8..30200b9cbc0 100644 --- a/inference-engine/src/vpu/graph_transformer/src/middleend/passes/replace_with_screlu.cpp +++ b/inference-engine/src/vpu/graph_transformer/src/middleend/passes/replace_with_screlu.cpp @@ -38,7 +38,7 @@ void PassImpl::run(const Model& model) { continue; } - const auto nextStages = getExactNextStages(convolutionStage, {StageType::Power, StageType::Concat}); + const auto nextStages = getExactNextStages(convolutionStage, {StageType::Power, StageType::StubConcat}); if (nextStages.size() != 2 || convolutionStage->type() != StageType::StubConv) { continue; } @@ -54,7 +54,7 @@ void PassImpl::run(const Model& model) { continue; } - auto concatAfterPowerStage = getOneOfSingleNextStage(powerStage, {StageType::Concat}); + auto concatAfterPowerStage = getOneOfSingleNextStage(powerStage, {StageType::StubConcat}); if (concatAfterPowerStage != concatStage) { continue; } diff --git a/inference-engine/src/vpu/graph_transformer/src/middleend/passes/split_large_kernel_conv.cpp b/inference-engine/src/vpu/graph_transformer/src/middleend/passes/split_large_kernel_conv.cpp new file mode 100644 index 00000000000..0ffdfe9347a --- /dev/null +++ b/inference-engine/src/vpu/graph_transformer/src/middleend/passes/split_large_kernel_conv.cpp @@ -0,0 +1,163 @@ +// Copyright (C) 2020 Intel Corporation +// SPDX-License-Identifier: Apache-2.0 +// + +#include +#include +#include +#include + +#include +#include +#include + + +namespace vpu { + +namespace { + +class PassImpl final : public Pass { +public: + explicit PassImpl(const StageBuilder::Ptr& stageBuilder) : _stageBuilder(stageBuilder) {} + + void run(const Model& model) override; + +private: + StageBuilder::Ptr _stageBuilder; +}; + +void PassImpl::run(const Model& model) { + VPU_PROFILE(splitLargeKernelConv); + + for (const auto& stage : model->getStages()) { + if (stage->type() != StageType::StubConv) { + continue; + } + const auto tryHW = stage->attrs().getOrDefault("tryHW", false); + if (!tryHW) { + continue; + } + + IE_ASSERT(stage->numInputs() == 4); + IE_ASSERT(stage->numOutputs() == 1); + + const auto input = stage->input(0); + const auto weights = stage->input(1); + const auto biases = stage->input(2); + const auto scales = stage->input(3); + const auto output = stage->output(0); + + const auto kernelSizeX = stage->attrs().get("kernelSizeX"); + const auto kernelSizeY = stage->attrs().get("kernelSizeY"); + const auto groupSize = stage->attrs().get("groupSize"); + const auto inputC = input->desc().dim(Dim::C); + const auto outputC = output->desc().dim(Dim::C); + + //Only 1x16 convolution is supported now, could expand support up to 1x30 + if (kernelSizeX != 16 || kernelSizeY != 1 || groupSize != 1) { + continue; + } + + model->disconnectStage(stage); + + int kernelGroupSize = kernelSizeX / 16 + 1; + IE_ASSERT(kernelGroupSize == 2); + const auto newKernelSizeX = kernelSizeX / kernelGroupSize; + IE_ASSERT(newKernelSizeX * kernelGroupSize == kernelSizeX); + const auto inGroupDimX = input->desc().dim(Dim::W) - newKernelSizeX; + + DataVector subInputs(kernelGroupSize); + DataVector subOutputs(kernelGroupSize); + + for (int groupInd = 0; groupInd < kernelGroupSize; ++groupInd) { + auto postfix = formatString("@subkernel=%d/%d", groupInd + 1, kernelGroupSize); + + //subInput + auto subInputDesc = input->desc(); + subInputDesc.setDim(Dim::W, inGroupDimX); + + subInputs[groupInd] = model->duplicateData( + input, + postfix, + subInputDesc); + + //subShrinkStage + DimValues offsets({{Dim::W, groupInd * newKernelSizeX}}); + + _stageBuilder->addCropStage( + model, + stage->name() + postfix, + stage->origLayer(), + input, + subInputs[groupInd], + std::move(offsets)); + + // subWeights + Data subWeights; + { + const auto content = weights->content(); + IE_ASSERT(content != nullptr); + + const auto origWeights = content->get(); + IE_ASSERT(origWeights != nullptr); + + size_t newWeightsSize = newKernelSizeX * kernelSizeY * outputC * inputC; + + auto newWeightsBlob = ie::make_shared_blob(InferenceEngine::TensorDesc( + ie::Precision::FP16, + {newWeightsSize}, + ie::Layout::C)); + newWeightsBlob->allocate(); + + const auto newWeightsPtr = newWeightsBlob->buffer().as(); + auto src = origWeights + groupInd * newKernelSizeX; + auto dst = newWeightsPtr; + + for (int i = 0; i < kernelSizeY * inputC * outputC; ++i) { + std::copy_n(src + i * kernelSizeX, newKernelSizeX, dst + i * newKernelSizeX); + } + + subWeights = model->duplicateData( + weights, + postfix, + DataDesc({newKernelSizeX, kernelSizeY, inputC, outputC}), + ieBlobContent(newWeightsBlob)); + } + + // subOutput + auto subOutputDesc = output->desc(); + + subOutputs[groupInd] = model->duplicateData( + output, + postfix, + subOutputDesc); + + // subConvStage + auto subConvStage = model->duplicateStage( + stage, + postfix, + {subInputs[groupInd], subWeights, biases, scales}, + {subOutputs[groupInd]}); + + subConvStage->attrs().set("kernelSizeX", newKernelSizeX); + } + + _stageBuilder->addSumStage( + model, + stage->name() + "@sum", + stage->origLayer(), + subOutputs[0], + subOutputs[1], + output); + + model->removeStage(stage); + } +} + +} // namespace + +Pass::Ptr PassManager::splitLargeKernelConv() { + return std::make_shared(_stageBuilder); +} + +} // namespace vpu diff --git a/inference-engine/src/vpu/graph_transformer/src/middleend/passes/swap_concat_and_hw_ops.cpp b/inference-engine/src/vpu/graph_transformer/src/middleend/passes/swap_concat_and_hw_ops.cpp index cd7715400b6..c5c19d8df3f 100644 --- a/inference-engine/src/vpu/graph_transformer/src/middleend/passes/swap_concat_and_hw_ops.cpp +++ b/inference-engine/src/vpu/graph_transformer/src/middleend/passes/swap_concat_and_hw_ops.cpp @@ -27,7 +27,7 @@ void PassImpl::run(const Model& model) { if (concatStage == nullptr) continue; - if (concatStage->type() != StageType::Concat) + if (concatStage->type() != StageType::StubConcat) continue; IE_ASSERT(concatStage->numInputs() > 0); diff --git a/inference-engine/src/vpu/graph_transformer/src/model/data.cpp b/inference-engine/src/vpu/graph_transformer/src/model/data.cpp index ddf95985694..72d9968635c 100644 --- a/inference-engine/src/vpu/graph_transformer/src/model/data.cpp +++ b/inference-engine/src/vpu/graph_transformer/src/model/data.cpp @@ -178,26 +178,36 @@ void DataNode::setShapeAllocationInfo(const ShapeLocation& shapeLocation) { void DataNode::serializeBuffer( BlobSerializer& serializer) { - serializeDescImpl(serializer, _desc, this->strides()); + serializeDescImpl(serializer, _desc, this->shapeLocation()); serializer.append(checked_cast(_dataLocation.location)); - if (_dataLocation.location == Location::Input || _dataLocation.location == Location::Output) { - auto topParent = getTopParentData(); + const auto serializeIOParams = [&serializer](const Data& parent) { + auto IOIdx = parent->attrs().get("ioIdx"); + serializer.append(checked_cast(IOIdx)); - auto ioIdx = topParent->attrs().get("ioIdx"); - serializer.append(checked_cast(ioIdx)); - - auto parentByteSize = topParent->totalByteSize(); + auto parentByteSize = parent->totalByteSize(); serializer.append(checked_cast(parentByteSize)); + }; + + if (_dataLocation.location == Location::Input || _dataLocation.location == Location::Output) { + serializeIOParams(getTopParentData()); + } + + if (_shapeLocation.dimsLocation == Location::Output) { + serializeIOParams(parentDataToShapeEdge()->parent()); + } + + if (_shapeLocation.stridesLocation == Location::Output) { + serializeIOParams(parentDataToShapeEdge()->parent()); } serializer.append(checked_cast(_dataLocation.offset)); } void DataNode::serializeIOInfo(BlobSerializer& serializer) const { - auto ioIdx = attrs().get("ioIdx"); - serializer.append(checked_cast(ioIdx)); + auto dataIOIdx = attrs().get("ioIdx"); + serializer.append(checked_cast(dataIOIdx)); auto ioBufferOffset = attrs().get("ioBufferOffset"); serializer.append(checked_cast(ioBufferOffset)); @@ -213,13 +223,25 @@ void DataNode::serializeIOInfo(BlobSerializer& serializer) const { serializer.append(uint8_t(0)); } - serializeDescImpl(serializer, _desc, strides()); + auto resShapeLocation = shapeLocation(); + if (resShapeLocation.dimsLocation != Location::Blob) { + auto ioDimsUpperBoundOffset = attrs().get("ioDimsUpperBoundOffset"); + resShapeLocation.dimsLocation = Location::Blob; + resShapeLocation.dimsOffset = ioDimsUpperBoundOffset; + } + if (resShapeLocation.stridesLocation != Location::Blob) { + auto ioStridesUpperBoundOffset = attrs().get("ioStridesUpperBoundOffset"); + resShapeLocation.stridesLocation = Location::Blob; + resShapeLocation.stridesOffset = ioStridesUpperBoundOffset; + } + + serializeDescImpl(serializer, _desc, resShapeLocation); } void DataNode::serializeDescImpl( BlobSerializer& serializer, const DataDesc& storedDesc, - const DimValues& storedStrides) const { + const ShapeLocation& shapeLocation) const { IE_ASSERT(storedDesc.numDims() <= MAX_DIMS_32); auto storedDimsOrder = storedDesc.dimsOrder(); @@ -232,12 +254,10 @@ void DataNode::serializeDescImpl( serializer.append(checked_cast(storedPerm.size())); - const auto& shape = shapeLocation(); - - serializer.append(checked_cast(shape.dimsLocation)); - serializer.append(checked_cast(shape.dimsOffset)); - serializer.append(checked_cast(shape.stridesLocation)); - serializer.append(checked_cast(shape.stridesOffset)); + serializer.append(checked_cast(shapeLocation.dimsLocation)); + serializer.append(checked_cast(shapeLocation.dimsOffset)); + serializer.append(checked_cast(shapeLocation.stridesLocation)); + serializer.append(checked_cast(shapeLocation.stridesOffset)); } void printTo(std::ostream& os, const Data& data) { diff --git a/inference-engine/src/vpu/graph_transformer/src/model/model.cpp b/inference-engine/src/vpu/graph_transformer/src/model/model.cpp index b0667f0887c..c2a2ed9ea91 100644 --- a/inference-engine/src/vpu/graph_transformer/src/model/model.cpp +++ b/inference-engine/src/vpu/graph_transformer/src/model/model.cpp @@ -401,19 +401,12 @@ StageDependency ModelObj::addStageDependency(const Stage& stage, const Data& dat data->_dependentStagesEdges.push_back(edge); - VPU_THROW_UNLESS(data->usage() == DataUsage::Intermediate, - "Adding stage dependency for {} with type {} failed: only {} datas can be added as a dependency " - "while adding {} with usage {} was attempted", - stage->name(), stage->type(), DataUsage::Intermediate, data->name(), data->usage()); - VPU_THROW_UNLESS(data->_producerEdge != nullptr, "Adding stage dependency for {} with type {} failed: data {} with usage {} should have producer, " "but actually it doesn't", stage->name(), stage->type(), data->name(), data->usage()); - if (data->_producerEdge != nullptr) { - ++data->_producerEdge->_producer->_nextStages[stage]; - ++stage->_prevStages[data->_producerEdge->_producer]; - } + ++data->_producerEdge->_producer->_nextStages[stage]; + ++stage->_prevStages[data->_producerEdge->_producer]; return edge; } @@ -1392,7 +1385,7 @@ Stage getDataConnectionStage( // Check connection stage type and that parent has the largest buffer. // - if (connectionStage->type() == StageType::Concat || + if (connectionStage->type() == StageType::StubConcat || connectionStage->type() == StageType::Expand) { IE_ASSERT(producer == child); IE_ASSERT(consumer == parent); @@ -1538,7 +1531,11 @@ DataToShapeAllocation ModelObj::connectDataWithShape( const auto& parentStage = parent->producer(); const auto& childStage = child->producer(); - if (parentStage && childStage && parentStage != childStage && parent->usage() == DataUsage::Intermediate) { + const auto& areStagesDifferent = [](const Stage& lhs, const Stage& rhs) { + return lhs && rhs && lhs != rhs; + }; + + if (areStagesDifferent(parentStage, childStage)) { // Shape and data are produced from different stages, make sure that shape is calculated before data addStageDependency(childStage, parent); } @@ -1546,7 +1543,34 @@ DataToShapeAllocation ModelObj::connectDataWithShape( return edge; } -void ModelObj::replaceParentData( +void ModelObj::replaceDataToShapeParent( + const DataToShapeAllocation& edge, + const Data& newParent) { + auto oldParent = edge->parent(); + auto child = edge->child(); + + oldParent->_childDataToShapeEdges.erase(edge); + edge->_parent = newParent; + newParent->_childDataToShapeEdges.push_back(edge); +} + +void ModelObj::replaceDataToShapeChild( + const DataToShapeAllocation& edge, + const Data& newChild) { + auto parent = edge->parent(); + auto oldChild = edge->child(); + + oldChild->_parentDataToShapeEdge = nullptr; + edge->_child = newChild; + + VPU_THROW_UNLESS(newChild->_parentDataToShapeEdge == nullptr, + "replaceDataToShapeChild failed: newChild {} with usage {} already has parent {} with usage {}", + newChild->name(), newChild->usage(), newChild->_parentDataToShapeEdge->parent()->name(), newChild->_parentDataToShapeEdge->parent()->usage()); + + newChild->_parentDataToShapeEdge = edge; +} + +void ModelObj::replaceDataToDataParent( const DataToDataAllocation& edge, const Data& newParent) { auto oldParent = edge->parent(); @@ -1571,7 +1595,7 @@ void ModelObj::replaceParentData( } } -void ModelObj::replaceChildData( +void ModelObj::replaceDataToDataChild( const DataToDataAllocation& edge, const Data& newChild) { auto parent = edge->parent(); diff --git a/inference-engine/src/vpu/graph_transformer/src/parsed_config.cpp b/inference-engine/src/vpu/graph_transformer/src/parsed_config.cpp index 405bb65b27c..b00c95bc39a 100644 --- a/inference-engine/src/vpu/graph_transformer/src/parsed_config.cpp +++ b/inference-engine/src/vpu/graph_transformer/src/parsed_config.cpp @@ -62,6 +62,7 @@ IE_SUPPRESS_DEPRECATED_START VPU_CONFIG_KEY(ENABLE_REPLACE_WITH_REDUCE_MEAN), VPU_CONFIG_KEY(ENABLE_TENSOR_ITERATOR_UNROLLING), VPU_CONFIG_KEY(FORCE_PURE_TENSOR_ITERATOR), + VPU_CONFIG_KEY(DISABLE_CONVERT_STAGES), // // Debug options @@ -168,6 +169,7 @@ void ParsedConfig::parse(const std::map& config) { setOption(_compileConfig.enableReplaceWithReduceMean, switches, config, VPU_CONFIG_KEY(ENABLE_REPLACE_WITH_REDUCE_MEAN)); setOption(_compileConfig.enableTensorIteratorUnrolling, switches, config, VPU_CONFIG_KEY(ENABLE_TENSOR_ITERATOR_UNROLLING)); setOption(_compileConfig.forcePureTensorIterator, switches, config, VPU_CONFIG_KEY(FORCE_PURE_TENSOR_ITERATOR)); + setOption(_compileConfig.disableConvertStages, switches, config, VPU_CONFIG_KEY(DISABLE_CONVERT_STAGES)); setOption(_compileConfig.irWithVpuScalesDir, config, VPU_CONFIG_KEY(IR_WITH_SCALES_DIRECTORY)); setOption(_compileConfig.noneLayers, config, VPU_CONFIG_KEY(NONE_LAYERS), parseStringSet); @@ -213,6 +215,9 @@ IE_SUPPRESS_DEPRECATED_END if (const auto envVar = std::getenv("IE_VPU_DUMP_ALL_PASSES")) { _compileConfig.dumpAllPasses = std::stoi(envVar) != 0; } + if (const auto envVar = std::getenv("IE_VPU_NUMBER_OF_SHAVES_AND_CMX_SLICES")) { + _compileConfig.numSHAVEs = _compileConfig.numCMXSlices = std::stoi(envVar); + } #endif } diff --git a/inference-engine/src/vpu/graph_transformer/src/stages/broadcast.cpp b/inference-engine/src/vpu/graph_transformer/src/stages/broadcast.cpp new file mode 100644 index 00000000000..a5a6582a07b --- /dev/null +++ b/inference-engine/src/vpu/graph_transformer/src/stages/broadcast.cpp @@ -0,0 +1,159 @@ +// Copyright (C) 2020 Intel Corporation +// SPDX-License-Identifier: Apache-2.0 +// + +#include + +#include + +#include +#include + +#include +#include +#include +#include + +namespace vpu { + +namespace { + +class BroadcastStage final : public StageNode { +public: + using StageNode::StageNode; + +protected: + StagePtr cloneImpl() const override { + return std::make_shared(*this); + } + + void propagateDataOrderImpl(StageDataInfo& orderInfo) override { + const auto inputOrder = input(0)->desc().dimsOrder(); + auto outputOrder = DimsOrder::fromNumDims(output(0)->desc().numDims()); + + if (inputOrder.numDims() >= 3 && inputOrder.dimInd(Dim::C) == 0) { + outputOrder.moveDim(Dim::C, 0); + } + + orderInfo.setOutput(outputEdge(0), outputOrder); + } + + void getDataStridesRequirementsImpl(StageDataInfo& stridesInfo) override { + stridesInfo.setInput(inputEdge(0), StridesRequirement().remove(0)); + stridesInfo.setOutput(outputEdge(0), StridesRequirement().remove(0)); + } + + void finalizeDataLayoutImpl() override { + } + + void getBatchSupportInfoImpl(StageDataInfo& batchInfo) override { + } + + void initialCheckImpl() const override { + const auto mode = attrs().getOrDefault("mode", BroadcastMode::NUMPY); + const auto& dataPrecision = input(0)->desc().type(); + + VPU_THROW_UNLESS(numOutputs() == 1, + "{} stage with name {} must have only 1 output, actually provided {} outputs", + type(), name(), numOutputs()); + if (mode == BroadcastMode::NUMPY) { + VPU_THROW_UNLESS(numInputs() == 2, + "{} stage with name {} and numpy mode must have 2 inputs, actually " + "provided {} inputs", type(), name(), numInputs()); + assertInputsOutputsTypes(this, + {{dataPrecision}, {DataType::S32}}, + {{dataPrecision}}); + + } else { + VPU_THROW_UNLESS(numInputs() == 3, + "{} stage with name {} and explicit mode must have 3 inputs, actually " + "provided {} inputs", type(), name(), numInputs()); + assertInputsOutputsTypes(this, + {{dataPrecision}, {DataType::S32}, {DataType::S32}}, + {{dataPrecision}}); + } + } + + void serializeParamsImpl(BlobSerializer& serializer) const override { + const auto mode = attrs().getOrDefault("mode", BroadcastMode::NUMPY); + serializer.append(static_cast(mode == BroadcastMode::NUMPY ? 0 : 1)); + } + + void serializeDataImpl(BlobSerializer& serializer) const override { + const auto mode = attrs().getOrDefault("mode", BroadcastMode::NUMPY); + + input(0)->serializeBuffer(serializer); + input(1)->serializeBuffer(serializer); + if (mode == BroadcastMode::EXPLICIT) { + input(2)->serializeBuffer(serializer); + } + output(0)->serializeBuffer(serializer); + } +}; + +} // namespace + +void FrontEnd::parseBroadcast( + const Model& model, + const ie::CNNLayerPtr& layer, + const DataVector& inputs, + const DataVector& outputs) const { + VPU_THROW_UNLESS(layer != nullptr, + "parseBroadcast expects valid CNNLayerPtr, got nullptr"); + + VPU_THROW_UNLESS(outputs.size() == 1, + "{} layer with name {} must have only 1 output, actually provided {} outputs", + layer->type, layer->name, outputs.size()); + const auto output = outputs[0]; + + const auto modeString = layer->GetParamAsString("mode", "numpy"); + if (modeString == "numpy") { + VPU_THROW_UNLESS(inputs.size() == 2, + "{} layer with name {} and numpy mode must have 2 inputs, actually " + "provided {} inputs", layer->type, layer->name, inputs.size()); + } else if (modeString == "explicit") { + VPU_THROW_UNLESS(inputs.size() == 3, + "{} layer with name {} and explicit mode must have 3 inputs, actually " + "provided {} inputs", layer->type, layer->name, inputs.size()); + const auto axesMappingDesc = inputs[2]->desc(); + const auto axesMappingPerm = axesMappingDesc.dimsOrder().toPermutation(); + const auto axesMappingDim = axesMappingDesc.dim(axesMappingPerm.at(0)); + VPU_THROW_UNLESS(axesMappingDesc.numDims() == 1, + "{} layer with name {} and explicit mode must have 1D axesMapping tensor, " + "actually provided {}D tensor", + layer->type, layer->name, axesMappingDesc.numDims()); + VPU_THROW_UNLESS(axesMappingDim == output->desc().numDims(), + "{} layer with name {} and explicit mode must have axesMapping tensor with " + "size equals to number of output dims, expected [{}], provided [{}]", + layer->type, layer->name, output->desc().numDims(), axesMappingDim); + + } else { + VPU_THROW_FORMAT("{} layer with name {}: Graph Transformer doesn't support {} mode", + layer->type, layer->name, modeString); + } + + const auto shape = inputs[1]; + const auto shapeDesc = inputs[1]->desc(); + const auto shapeDim = shapeDesc.dim(shapeDesc.dimsOrder().toPermutation().at(0)); + VPU_THROW_UNLESS(shapeDesc.numDims() == 1, + "{} layer with name {} and explicit mode must have 1D target shape tensor, " + "actually provided {}D tensor", + layer->type, layer->name, shapeDesc.numDims()); + VPU_THROW_UNLESS(shapeDim == output->desc().numDims(), + "{} layer with name {} and explicit mode must have target shape tensor with " + "size equals to number of output dims, expected [{}], provided [{}]", + layer->type, layer->name, output->desc().numDims(), shapeDim); + + const auto mode = modeString == "numpy" ? BroadcastMode::NUMPY : BroadcastMode::EXPLICIT; + + auto stage = model->addNewStage( + layer->name, + StageType::Broadcast, + layer, + inputs, + outputs); + + stage->attrs().set("mode", mode); +} + +} //namespace vpu diff --git a/inference-engine/src/vpu/graph_transformer/src/stages/concat.cpp b/inference-engine/src/vpu/graph_transformer/src/stages/concat.cpp index 6371573937f..ee6a5385f40 100644 --- a/inference-engine/src/vpu/graph_transformer/src/stages/concat.cpp +++ b/inference-engine/src/vpu/graph_transformer/src/stages/concat.cpp @@ -4,61 +4,74 @@ #include -#include -#include -#include -#include -#include -#include -#include -#include - #include +#include +#include + +#include +#include +#include +#include + namespace vpu { namespace { -class ConcatStage final : public StageNode { +using InputEdges = details::ContainerRange; + +DimsOrder getMostSuitableOrder(const InputEdges& inputEdges) { + DimsOrderMap dimsOrderVotes; + for (const auto& inEdge : inputEdges) { + dimsOrderVotes[inEdge->input()->desc().dimsOrder()]++; + } + + // Select DimsOrder with most votes. + // For equal votes : HCW > CHW > HWC. + + DimsOrder finalOrder; + int curVotes = -1; + for (const auto& p : dimsOrderVotes) { + if (p.second > curVotes) { + finalOrder = p.first; + curVotes = p.second; + } else if (p.second == curVotes) { + if (p.first.numDims() >= 3) { + if (p.first.dimInd(Dim::C) == 2) { + finalOrder = p.first; + } else if (p.first.dimInd(Dim::C) == 3 && + finalOrder.dimInd(Dim::C) != 2) { + finalOrder = p.first; + } + } + } + } + + VPU_INTERNAL_CHECK(finalOrder.numDims() > 0, + "getMostSuitableOrder must find order with rank which is grater than 0, " + "actually rank is {}", finalOrder.numDims()); + VPU_INTERNAL_CHECK(curVotes > 0, + "getMostSuitableOrder: final order must have at least 1 vote " + "actually votes number is {}", curVotes); + + return finalOrder; +} + +// +// StubConcatStage will be replaced with Data <-> Data edges on special stage processor +// + +class StubConcatStage final : public StageNode { public: using StageNode::StageNode; protected: StagePtr cloneImpl() const override { - return std::make_shared(*this); + return std::make_shared(*this); } void propagateDataOrderImpl(StageDataInfo& orderInfo) override { - auto output = outputEdge(0)->output(); - - DimsOrderMap dimsOrderVotes; - for (const auto& inEdge : inputEdges()) { - dimsOrderVotes[inEdge->input()->desc().dimsOrder()]++; - } - - // Select DimsOrder with most votes. - // For equal votes : HCW > CHW > HWC. - - DimsOrder finalOrder; - int curVotes = -1; - for (const auto& p : dimsOrderVotes) { - if (p.second > curVotes) { - finalOrder = p.first; - curVotes = p.second; - } else if (p.second == curVotes) { - if (p.first.numDims() >= 3) { - if (p.first.dimInd(Dim::C) == 2) { - finalOrder = p.first; - } else if (p.first.dimInd(Dim::C) == 3 && - finalOrder.dimInd(Dim::C) != 2) { - finalOrder = p.first; - } - } - } - } - - IE_ASSERT(finalOrder.numDims() > 0); - IE_ASSERT(curVotes > 0); + const auto finalOrder = getMostSuitableOrder(inputEdges()); for (const auto& inEdge : inputEdges()) { orderInfo.setInput(inEdge, finalOrder); @@ -88,7 +101,10 @@ protected: } } - IE_ASSERT(minConcatDimInd < dimsOrder.numDims()); + VPU_INTERNAL_CHECK(minConcatDimInd < dimsOrder.numDims(), + "{} stage with name {} must have minConcatDimInd no greater than number " + "of dimensions, actually index is {}, number of dimension is {}", + type(), name(), minConcatDimInd, dimsOrder.numDims()); // // Initial StridesRequirement for inputs and output. @@ -157,39 +173,133 @@ protected: } void initialCheckImpl() const override { - IE_ASSERT(numInputs() > 0); - IE_ASSERT(numOutputs() == 1); + VPU_INTERNAL_CHECK(numInputs() > 0, + "{} stage with name {} must have no less than 1 input, " + "actually provided {} inputs", type(), name(), numInputs()); + VPU_INTERNAL_CHECK(numOutputs() == 1, + "{} stage with name {} must have only 1 output, " + "actually provided {} outputs", type(), name(), numOutputs()); const auto& firstInputPrecision = input(0)->desc().type(); assertAllInputsOutputsTypes(this, {firstInputPrecision}, {firstInputPrecision}); } void serializeParamsImpl(BlobSerializer&) const override { - VPU_THROW_EXCEPTION << "Must never be called"; + VPU_THROW_FORMAT("{} stage with name {} must never call serializeParamsImpl", + type(), name()); } void serializeDataImpl(BlobSerializer&) const override { - VPU_THROW_EXCEPTION << "Must never be called"; + VPU_THROW_FORMAT("{} stage with name {} must never call serializeDataImpl", + type(), name()); + } +}; + +// +// ConcatStage will be inferred on device side +// + +class ConcatStage final : public StageNode { +public: + using StageNode::StageNode; + +protected: + StagePtr cloneImpl() const override { + return std::make_shared(*this); + } + + void propagateDataOrderImpl(StageDataInfo& orderInfo) override { + const auto finalOrder = getMostSuitableOrder(inputEdges()); + + for (const auto& inEdge : inputEdges()) { + orderInfo.setInput(inEdge, finalOrder); + } + + orderInfo.setOutput(outputEdge(0), finalOrder); + } + + void getDataStridesRequirementsImpl(StageDataInfo& stridesInfo) override { + for (const auto& inEdge : inputEdges()) { + stridesInfo.setInput(inEdge, StridesRequirement().remove(0)); + } + stridesInfo.setOutput(outputEdge(0), StridesRequirement().remove(0)); + } + + void finalizeDataLayoutImpl() override { + } + + void getBatchSupportInfoImpl(StageDataInfo& batchInfo) override { + } + + void initialCheckImpl() const override { + VPU_INTERNAL_CHECK(numInputs() > 0, + "{} stage with name {} must have no less than 1 input, " + "actually provided {} inputs", type(), name(), numInputs()); + VPU_INTERNAL_CHECK(numOutputs() == 1, + "{} stage with name {} must have only 1 output, " + "actually provided {} outputs", type(), name(), numOutputs()); + + const auto& firstInputPrecision = input(0)->desc().type(); + assertAllInputsOutputsTypes(this, {firstInputPrecision}, {firstInputPrecision}); + } + + void serializeParamsImpl(BlobSerializer& serializer) const override { + const auto axis = attrs().get("axis"); + const auto axisInd = input(0)->desc().dimsOrder().dimInd(axis); + + serializer.append(static_cast(axisInd)); + serializer.append(static_cast(numInputs())); + } + + void serializeDataImpl(BlobSerializer& serializer) const override { + for (const auto& input : inputs()) { + input->serializeBuffer(serializer); + } + output(0)->serializeBuffer(serializer); } }; } // namespace -void FrontEnd::parseConcat(const Model& model, const ie::CNNLayerPtr& layer, const DataVector& inputs, const DataVector& outputs) const { - IE_ASSERT(!inputs.empty()); - IE_ASSERT(outputs.size() == 1); +void FrontEnd::parseConcat( + const Model& model, + const ie::CNNLayerPtr& layer, + const DataVector& inputs, + const DataVector& outputs) const { + VPU_THROW_UNLESS(!inputs.empty(), + "{} layer with name {} must have no less than 1 input, " + "actually provided 0 inputs", layer->type, layer->name); + VPU_THROW_UNLESS(outputs.size() == 1, + "{} layer with name {} must have only 1 output, actually provided {} outputs", + layer->type, layer->name, outputs.size()); auto output = outputs[0]; auto concat = std::dynamic_pointer_cast(layer); - IE_ASSERT(layer != nullptr); + VPU_THROW_UNLESS(layer != nullptr, + "{} layer with name {} must be able to convert to ie::ConcatLayer", + layer->type, layer->name); - IE_ASSERT(concat->_axis < output->desc().numDims()); + VPU_THROW_UNLESS(concat->_axis < output->desc().numDims(), + "{} layer with name {} must have axis attribute no grater than number of " + "dimensions, actually provided axis = {}, numDims = {}", + layer->type, layer->name, concat->_axis, output->desc().numDims()); auto perm = DimsOrder::fromNumDims(output->desc().numDims()).toPermutation(); auto axis = perm[output->desc().numDims() - 1 - concat->_axis]; - _stageBuilder->addConcatStage(model, concat->name, concat, axis, inputs, output); + // If there is DSR as concat's output in the transformed graph, then we need to infer + // concat on the device side. In other cases StubConcat stage will be added and it will + // be replace with Data <-> Data edges. + auto inferRequirement = ConcatInferRequirement::CanBeReplaced; + if (auto concatOp = std::dynamic_pointer_cast(layer->getNode())) { + inferRequirement = concatOp->get_output_as_single_output_node(0)->get_type_info() == + ngraph::vpu::op::DynamicShapeResolver::type_info + ? ConcatInferRequirement::NeedToInfer + : ConcatInferRequirement::CanBeReplaced; + } + + _stageBuilder->addConcatStage(model, concat->name, concat, axis, inputs, output, inferRequirement); } Stage StageBuilder::addConcatStage( @@ -198,17 +308,28 @@ Stage StageBuilder::addConcatStage( const ie::CNNLayerPtr& layer, Dim axis, const DataVector& inputs, - const Data& output) { + const Data& output, + ConcatInferRequirement inferRequirement) { std::vector offsets; offsets.reserve(inputs.size()); - DimValues curOffset({{axis, 0}}); - for (const auto& input : inputs) { - offsets.emplace_back(curOffset); - curOffset.set(axis, curOffset[axis] + input->desc().dim(axis)); - } + Stage stage; + if (inferRequirement == ConcatInferRequirement::NeedToInfer) { + stage = model->addNewStage( + layer->name, + StageType::Concat, + layer, + inputs, + {output}); + } else { + DimValues curOffset({{axis, 0}}); + for (const auto& input : inputs) { + offsets.emplace_back(curOffset); + curOffset.set(axis, curOffset[axis] + input->desc().dim(axis)); + } - auto stage = addConcatStage(model, name, layer, std::move(offsets), inputs, output); + stage = addConcatStage(model, name, layer, std::move(offsets), inputs, output); + } stage->attrs().set("axis", axis); @@ -222,11 +343,13 @@ Stage StageBuilder::addConcatStage( std::vector&& offsets, const DataVector& inputs, const Data& output) { - IE_ASSERT(offsets.size() == inputs.size()); + VPU_INTERNAL_CHECK(offsets.size() == inputs.size(), + "offsets count (provided {}) must be equal to inputs count (provided {}) to " + "create Concat stage with name {}", offsets.size(), inputs.size(), name); - auto stage = model->addNewStage( + auto stage = model->addNewStage( name, - StageType::Concat, + StageType::StubConcat, layer, inputs, {output}); diff --git a/inference-engine/src/vpu/graph_transformer/src/stages/convolution.cpp b/inference-engine/src/vpu/graph_transformer/src/stages/convolution.cpp index 65d1fb812ea..1f8878e6434 100644 --- a/inference-engine/src/vpu/graph_transformer/src/stages/convolution.cpp +++ b/inference-engine/src/vpu/graph_transformer/src/stages/convolution.cpp @@ -93,7 +93,14 @@ bool canTryHW(const int outputNumDims, tryHW = false; } - if (kernelSizeX > 15 || kernelSizeY > 15 || kernelStrideX > 8) { + // 1x16 convolution is split into two 1x8 convolutions in splitLargeKernelConv pass + const bool KernelSizeCantBeSplit = !(kernelSizeX == 16 && kernelSizeY == 1); + const bool KernelSizeTooLarge = (kernelSizeX > 15 || kernelSizeY > 15); + if (KernelSizeTooLarge && KernelSizeCantBeSplit) { + tryHW = false; + } + + if (kernelStrideX > 8) { tryHW = false; } @@ -139,6 +146,10 @@ void parseConv2D(const Model & model, int groupSize = convLayer->_group; + // kernelStrideY doesn't matter when kernelSizeY==InputSizeY, change it to try HW in 1D case + if (kernelSizeY == input->desc().dim(Dim::H) + padTop + padBottom) + kernelStrideY = kernelStrideX; + // // Check if HW is applicable // diff --git a/inference-engine/src/vpu/graph_transformer/src/stages/custom.cpp b/inference-engine/src/vpu/graph_transformer/src/stages/custom.cpp index 55844e00772..27cc40086a0 100644 --- a/inference-engine/src/vpu/graph_transformer/src/stages/custom.cpp +++ b/inference-engine/src/vpu/graph_transformer/src/stages/custom.cpp @@ -13,14 +13,14 @@ #include #include #include -#include #include #include #include namespace vpu { -static void calcSizesFromParams(const DataDesc &desc, const SmallVector &bufferSizeRules, SmallVector &sizes); +static SmallVector calcSizesFromParams(const DataDesc& desc, const SmallVector& bufferSizeRules, + std::map layerParams); namespace { @@ -95,17 +95,14 @@ private: } void serializeParamsImpl(BlobSerializer& serializer) const override { - const auto& customLayer = attrs().get("customLayer"); - const auto& gws = attrs().get>("gws"); - const auto& lws = attrs().get>("lws"); + const auto& kernel = attrs().get("customKernel"); + const auto& gws = attrs().get>("gws"); + const auto& lws = attrs().get>("lws"); const auto& ports = attrs().get>("ports"); - - // - // GWG, LWG, Offs - // + const auto& localDataSizes = attrs().get>("localDataSizes"); for (int i = 0; i < gws.size(); ++i) { - serializer.append(static_cast(gws[i]/lws[i])); + serializer.append(static_cast(gws[i] / lws[i])); } for (auto x : lws) { @@ -116,172 +113,146 @@ private: serializer.append(static_cast(0)); } - serializer.append(static_cast(customLayer->maxShaves())); - - // - // Kernel Id - // - - serializer.append(static_cast(customLayer->kernelId())); - - // - // Number of inputs - // - - IE_ASSERT(customLayer->stageNumInputs() >= 0); - serializer.append(static_cast(customLayer->stageNumInputs())); - - // - // Total number of blobs - // - + serializer.append(static_cast(kernel.maxShaves())); + serializer.append(static_cast(kernel.kernelId())); + serializer.append(static_cast(kernel.inputDataCount())); serializer.append(static_cast(numInputs() + numOutputs())); + serializer.append(static_cast(kernel.parameters().size())); - // - // Number of kernel parameters - // - - serializer.append(static_cast(customLayer->parameters().size())); - - // - // Parameters & relocation info - // - - std::map b2b; - for (const auto& kp : customLayer->bindings()) { + std::map b2b; + for (const auto& kp : kernel.bindings()) { b2b[kp.argName] = kp; } IE_ASSERT(origLayer() != nullptr); - for (const auto& kp : customLayer->parameters()) { + for (const auto& kp : kernel.parameters()) { const auto& parameter = b2b[kp]; switch (parameter.type) { - case CustomParamType::Input: - case CustomParamType::Output: - case CustomParamType::InputBuffer: - case CustomParamType::OutputBuffer: - case CustomParamType::Data: - { - if (ports.find(kp) == ports.end()) { - VPU_THROW_EXCEPTION - << "Unable to bind parameter " << parameter.argName << " for " - << origLayer()->type <<" layer. Name is: " << origLayer()->name; - } - int id = ports.find(kp)->second; - serializer.append(static_cast(0)); - serializer.append(static_cast(id)); + case CustomParamType::Input: + case CustomParamType::Output: + case CustomParamType::InputBuffer: + case CustomParamType::OutputBuffer: + case CustomParamType::Data: { + VPU_THROW_UNLESS(ports.find(kp) != ports.end(), + "XML specification for %s layer has no definition for %s parameter. Layer name: %s", + origLayer()->type, kp, origLayer()->name); - break; - } - case CustomParamType::Int: - case CustomParamType::Float: - { - if (origLayer()->params.find(parameter.irSource) != origLayer()->params.end()) { - std::stringstream parameterStream(origLayer()->params[parameter.irSource]); - std::string param; - for (int i = 0; i <= parameter.portIndex; i++) { - getline(parameterStream, param, ','); + int id = ports.find(kp)->second; + serializer.append(static_cast(0)); + serializer.append(static_cast(id)); + break; + } + case CustomParamType::Int: + case CustomParamType::Float: { + const auto cnnParam = origLayer()->params.find(parameter.irSource); + if (cnnParam != origLayer()->params.end()) { + const auto param = [&]() -> std::string { + if (parameter.portIndex < 0) { + return cnnParam->second; } - if (parameter.type == CustomParamType::Int) { - serializer.append(static_cast(std::stoi(param))); + VPU_THROW_UNLESS(cnnParam->second.find(',') != std::string::npos, + "Error while parsing CNNetwork parameter '%s' for '%s' layer: port-index=%d is set, " + "but parameter is neither a tensor, nor an array type.", + cnnParam->first, origLayer()->type, parameter.portIndex); + + std::string value; + std::stringstream parameterStream{cnnParam->second}; + for (int i = 0; i <= parameter.portIndex; i++) { + getline(parameterStream, value, ','); + } + return value; + }(); + + if (parameter.type == CustomParamType::Int) { + serializer.append(static_cast(std::stoi(param))); + serializer.append(static_cast(-1)); + } else { + serializer.append(static_cast(std::stof(param))); + serializer.append(static_cast(-2)); + } + break; + } else { + auto pos = parameter.irSource.find_first_of('.'); + if (pos != std::string::npos) { + auto blob = parameter.irSource.substr(0, pos); + auto dim = parameter.irSource.substr(pos + 1, std::string::npos); + + VPU_THROW_UNLESS(dim.length() == 1, + "Unable to deduce parameter '%s' for '%s' layer. Name is: '%s'", + parameter.argName, origLayer()->type, origLayer()->name); + + char dimLetter = dim[0]; + + ie::DataPtr origData; + if (blob == "I") { + origData = origLayer()->insData[parameter.portIndex].lock(); + } else { + origData = origLayer()->outData[parameter.portIndex]; + } + IE_ASSERT(origData != nullptr); + + auto dims = origData->getDims(); + int ndims = dims.size(); + + if (ndims > 4) { + VPU_THROW_UNLESS(dim.length() == 1, + "Unable to deduce parameter '%s' for '%s' layer. Name is: '%s'", + parameter.argName, origLayer()->type, origLayer()->name); + } + const std::map vars = { + {'b', 0}, {'B', 0}, + {'f', 1}, {'F', 1}, + {'y', 2}, {'Y', 2}, + {'x', 3}, {'X', 3}, + }; + + auto var = vars.find(dimLetter); + if (var != vars.end()) { + auto res = dims.at(var->second - 4 + ndims); + + serializer.append(static_cast(res)); serializer.append(static_cast(-1)); } else { - serializer.append(static_cast(std::stof(param) )); - serializer.append(static_cast(-2)); + VPU_THROW_FORMAT("Unable to deduce parameter '%s' for '%s' layer. Name is: '%s'", + parameter.argName, origLayer()->type, origLayer()->name); } + break; } else { - auto pos = parameter.irSource.find_first_of('.'); - if (pos != std::string::npos) { - auto blob = parameter.irSource.substr(0, pos); - auto dim = parameter.irSource.substr(pos + 1, std::string::npos); - - IE_ASSERT(dim.length() == 1) - << "Unable to deduce parameter " << parameter.argName << " for " - << origLayer()->type <<" layer. Name is: " << origLayer()->name; - char dimLetter = dim[0]; - - ie::DataPtr origData; - if (blob == "I") { - origData = origLayer()->insData[parameter.portIndex].lock(); - } else { - origData = origLayer()->outData[parameter.portIndex]; - } - IE_ASSERT(origData != nullptr); - - auto dims = origData->getDims(); - int ndims = dims.size(); - - if (ndims > 4) - VPU_THROW_EXCEPTION - << "Unable to deduce parameter " << parameter.argName << " for " - << origLayer()->type <<" layer. Name is: " << origLayer()->name; - - const std::map vars = { - { 'b', 0 }, { 'B', 0 }, - { 'f', 1 }, { 'F', 1 }, - { 'y', 2 }, { 'Y', 2 }, - { 'x', 3 }, { 'X', 3 }, - }; - - auto var = vars.find(dimLetter); - if (var != vars.end()) { - auto res = dims.at(var->second-4+ndims); - - serializer.append(static_cast(res)); + VPU_THROW_UNLESS(parameter.portIndex < 0, + "Unable to deduce parameter '%s' for '%s' layer: port-index=%d is set, " + "but parameter is neither a tensor, nor an array type.", + parameter.argName, origLayer()->type, parameter.portIndex); + try { + if (parameter.type == CustomParamType::Int) { + serializer.append(static_cast(std::stoi(parameter.irSource))); serializer.append(static_cast(-1)); } else { - VPU_THROW_EXCEPTION - << "Unable to deduce parameter " << parameter.argName << " for " - << origLayer()->type <<" layer. Name is: " << origLayer()->name; + serializer.append(static_cast(std::stof(parameter.irSource))); + serializer.append(static_cast(-2)); } - break; - } else { - try { - if (parameter.type == CustomParamType::Int) { - serializer.append(static_cast(std::stoi(parameter.irSource))); - serializer.append(static_cast(-1)); - } else { - serializer.append(static_cast(std::stof(parameter.irSource) )); - serializer.append(static_cast(-2)); - } - break; - } - catch (const std::invalid_argument&) { - VPU_THROW_EXCEPTION - << "Unable to deduce parameter " << parameter.argName << " for " - << origLayer()->type <<" layer. Name is: " << origLayer()->name - <<", parameter is: " << parameter.irSource; - } + } catch (const std::invalid_argument&) { + VPU_THROW_FORMAT("Unable to deduce parameter '%s' for '%s' layer. " + "Name is: '%s', parameter is: '%s'", + parameter.argName, origLayer()->type, origLayer()->name, parameter.irSource); } } } - case CustomParamType::LocalData: - { - ie::DataPtr origData; - if (parameter.dimSource == CustomDimSource::Input) { - origData = origLayer()->insData[parameter.dimIdx].lock(); - } else { - origData = origLayer()->outData[parameter.dimIdx]; - } - IE_ASSERT(origData != nullptr); + } + case CustomParamType::LocalData: { + const auto size = localDataSizes.at(parameter.argName); + serializer.append(static_cast(size)); + serializer.append(static_cast(-3)); - SmallVector sizes; - calcSizesFromParams(DataDesc(origData->getTensorDesc()), parameter.bufferSizeRules, sizes); - - serializer.append(static_cast(sizes[0] * sizes[1] * sizes[2])); - serializer.append(static_cast(-3)); - - break; - } - default: - VPU_THROW_EXCEPTION - << "Unable to deduce parameter " << parameter.argName << " for " - << origLayer()->type <<" layer. Name is: " << origLayer()->name; + break; + } + default: + VPU_THROW_FORMAT("Unable to deduce parameter '%s' for '%s' layer. Name is: '%s'", + parameter.argName, origLayer()->type, origLayer()->name); } } } @@ -305,80 +276,59 @@ private: } // namespace -static void calcSizesFromParams(const DataDesc &desc, const SmallVector &bufferSizeRules, SmallVector &sizes) { - // assume output tensor is dimension source by default - auto batchDim = desc.dim(Dim::N, 1); - auto featureDim = desc.dim(Dim::C, 1); - auto yDim = desc.dim(Dim::H, 1); - auto xDim = desc.dim(Dim::W, 1); +static SmallVector calcSizesFromParams(const DataDesc& desc, const SmallVector& bufferSizeRules, + std::map layerParams) { + { + const auto B = std::to_string(desc.dim(Dim::N, 1)); + const auto F = std::to_string(desc.dim(Dim::C, 1)); + const auto Y = std::to_string(desc.dim(Dim::H, 1)); + const auto X = std::to_string(desc.dim(Dim::W, 1)); - const std::map vars = { - { 'b', batchDim }, { 'B', batchDim }, - { 'f', featureDim }, { 'F', featureDim }, - { 'y', yDim }, { 'Y', yDim }, - { 'x', xDim }, { 'X', xDim }, + auto sizes = std::vector> { + {"b", B}, {"B", B}, + {"f", F}, {"F", F}, + {"y", Y}, {"Y", Y}, + {"x", X}, {"X", X}, + }; + + std::move(begin(sizes), end(sizes), inserter(layerParams, end(layerParams))); + } + + MathExpression expr; + expr.setVariables(layerParams); + const auto parseSizeRule = [&expr](const std::string& rule) { + expr.parse(rule); + return expr.evaluate(); }; - sizes.reserve(std::max(bufferSizeRules.size(), 3)); - for (const auto& rule : bufferSizeRules) { - SimpleMathExpression expr; - expr.setVariables(vars); - expr.parse(rule); - sizes.emplace_back(expr.evaluate()); - } - while (sizes.size() < 3) { - sizes.emplace_back(1); - } -} + auto sizes = SmallVector{}; + sizes.reserve(bufferSizeRules.size()); + std::transform(begin(bufferSizeRules), end(bufferSizeRules), std::back_inserter(sizes), parseSizeRule); -static CustomLayer::Ptr chooseSuitable(const std::vector& customLayers, - const std::map& layerParams) { - ie::details::CaselessEq cmp; - - for (const auto& customLayer : customLayers) { - bool suitable = true; - for (const auto& whereParam : customLayer->whereParams()) { - if (layerParams.find(whereParam.first) == layerParams.end() || - !cmp(layerParams.find(whereParam.first)->second, whereParam.second)) { - suitable = false; - } - } - if (suitable) { - return customLayer; - } - } - - IE_ASSERT(false); - return CustomLayer::Ptr(nullptr); + return sizes; } void FrontEnd::parseCustom(const Model& model, const ie::CNNLayerPtr& layer, const DataVector& inputs, const DataVector& outputs) { IE_ASSERT(layer != nullptr); IE_ASSERT(outputs.size() == 1); - std::vector customLayersForType; - if (_customLayers.count(layer->type) > 0) { - customLayersForType.push_back(chooseSuitable(_customLayers.find(layer->type)->second, layer->params)); - } else if (_customLayers.count(layer->type + "@stage_0") > 0) { - int stageNum = 0; - while (_customLayers.count(layer->type + "@stage_" + std::to_string(stageNum)) > 0) { - customLayersForType.push_back(chooseSuitable(_customLayers.find(layer->type + "@stage_" + std::to_string(stageNum))->second, - layer->params)); - stageNum++; - } - } else { - IE_ASSERT(false); - } + const auto suitableLayer = [&] { + const auto customLayersForType = _customLayers.find(layer->type); + IE_ASSERT(customLayersForType != _customLayers.end()); + return getSuitableCustomLayer(customLayersForType->second, layer); + }(); + IE_ASSERT(suitableLayer); + const auto kernels = suitableLayer->kernels(); // Get all buffers, buffers must be unique associated by port index std::map tempBuffsMap; - for (size_t stageNum = 0; stageNum < customLayersForType.size(); stageNum++) { - for (auto& param : customLayersForType[stageNum]->bindings()) { + for (const auto& kernel : kernels) { + for (const auto& param : kernel.bindings()) { if (param.type == CustomParamType::InputBuffer || param.type == CustomParamType::OutputBuffer) { - SmallVector sizes; - auto desc = (param.dimSource == CustomDimSource::Input) ? inputs[param.dimIdx]->desc() : outputs[param.dimIdx]->desc(); - calcSizesFromParams(desc, param.bufferSizeRules, sizes); - auto buf = model->addNewData("custom_" + layer->type + "_buf", DataDesc({sizes[0], sizes[1], sizes[2], 1})); + const auto desc = (param.dimSource == CustomDimSource::Input) ? inputs[param.dimIdx]->desc() + : outputs[param.dimIdx]->desc(); + const auto sizes = calcSizesFromParams(desc, { param.bufferSizeRule }, layer->params); + const auto buf = model->addNewData("custom_" + layer->type + "_buf", DataDesc({sizes[0], 1, 1, 1})); if (tempBuffsMap.find(param.portIndex) == tempBuffsMap.end()) { tempBuffsMap[param.portIndex] = buf; } @@ -387,15 +337,15 @@ void FrontEnd::parseCustom(const Model& model, const ie::CNNLayerPtr& layer, con } // Gather inputs and outputs for each stage for the layer - for (int stage_num = 0; stage_num < customLayersForType.size(); stage_num++) { - auto customLayer = customLayersForType[stage_num]; + for (int stage_num = 0; stage_num < kernels.size(); stage_num++) { + const auto& kernel = kernels[stage_num]; std::map ports; std::vector formats; // Gather inputs DataVector stageInputs; - for (auto& param : customLayer->bindings()) { + for (auto& param : kernel.bindings()) { if (param.type == CustomParamType::Input) { ports[param.argName] = stageInputs.size(); formats.emplace_back(param.format); @@ -408,7 +358,7 @@ void FrontEnd::parseCustom(const Model& model, const ie::CNNLayerPtr& layer, con } // Gather data blobs - for (auto& param : customLayer->bindings()) { + for (auto& param : kernel.bindings()) { if (param.type == CustomParamType::Data) { auto blobIterator = layer->blobs.find(param.irSource); if (blobIterator != layer->blobs.end()) { @@ -424,27 +374,26 @@ void FrontEnd::parseCustom(const Model& model, const ie::CNNLayerPtr& layer, con } } - customLayer->setStageNumInputs(stageInputs.size()); formats.emplace_back(CustomDataFormat::Any); // Get kernel binary - auto kernelNode = _kernelNodes.find(customLayer->kernelBinary()); + auto kernelNode = _kernelNodes.find(kernel.kernelBinary()); if (kernelNode != _kernelNodes.end()) { stageInputs.emplace_back((kernelNode->second)); } else { - auto kernelBinaryDesc = DataDesc({customLayer->kernelBinary().length()}); + auto kernelBinaryDesc = DataDesc({kernel.kernelBinary().length()}); kernelBinaryDesc.setType(DataType::U8); auto kernelBinary = model->addConstData( layer->type + "@kernelBinary", kernelBinaryDesc, - std::make_shared(customLayer->kernelBinary())); + std::make_shared(kernel.kernelBinary())); stageInputs.emplace_back((kernelBinary)); - _kernelNodes[customLayer->kernelBinary()] = kernelBinary; + _kernelNodes[kernel.kernelBinary()] = kernelBinary; } DataVector stageOutputs; - for (auto& param : customLayer->bindings()) { + for (auto& param : kernel.bindings()) { if (param.type == CustomParamType::Output) { ports[param.argName] = stageInputs.size() + stageOutputs.size(); stageOutputs.emplace_back(outputs[param.portIndex]); @@ -455,30 +404,45 @@ void FrontEnd::parseCustom(const Model& model, const ie::CNNLayerPtr& layer, con } auto stage = model->addNewStage( - layer->name + ((customLayersForType.size() == 1) ? "" : "@stage_" + std::to_string(stage_num)), + layer->name + ((kernels.size() == 1) ? "" : "@stage_" + std::to_string(stage_num)), StageType::Custom, layer, stageInputs, stageOutputs); - stage->attrs().set("customLayer", customLayer); + stage->attrs().set("customKernel", suitableLayer->kernels()[stage_num]); stage->attrs().set("ports", ports); stage->attrs().set("formats", formats); - SmallVector gws; - SmallVector lws; - auto dimSource = (customLayer->dimSource() == CustomDimSource::Input) ? inputs : outputs; - calcSizesFromParams(dimSource[customLayer->dimSourceIndex()]->desc(), customLayer->globalSizeRules(), gws); - calcSizesFromParams(dimSource[customLayer->dimSourceIndex()]->desc(), customLayer->localSizeRules(), lws); + const auto& dimSource = (kernel.dimSource() == CustomDimSource::Input) ? inputs : outputs; + const auto& dataDesc = dimSource[kernel.dimSourceIndex()]->desc(); + + const auto gws = calcSizesFromParams(dataDesc, kernel.globalGridSizeRules(), layer->params); + const auto lws = calcSizesFromParams(dataDesc, kernel.localGridSizeRules(), layer->params); stage->attrs().set("gws", gws); stage->attrs().set("lws", lws); + const auto localDataSizes = [&] { + auto sizes = std::map{}; + for (const auto& bind : kernel.bindings()) { + if (bind.type == CustomParamType::LocalData) { + const auto& source = bind.dimSource == CustomDimSource::Input ? inputs : outputs; + const auto& desc = source[bind.dimIdx]->desc(); + const auto size = calcSizesFromParams(desc, { bind.bufferSizeRule }, layer->params); + sizes.emplace(bind.argName, size[0]); + } + } + return sizes; + }(); + + stage->attrs().set("localDataSizes", localDataSizes); + std::map inputOrders; std::map outputOrders; - std::map b2b; - for (const auto& kp : customLayer->bindings()) { + std::map b2b; + for (const auto& kp : kernel.bindings()) { b2b[kp.argName] = kp; } @@ -489,7 +453,7 @@ void FrontEnd::parseCustom(const Model& model, const ie::CNNLayerPtr& layer, con { CustomDataFormat::FYX, DimsOrder::CHW } }; - for (const auto& kp : customLayer->parameters()) { + for (const auto& kp : kernel.parameters()) { const auto& parameter = b2b[kp]; if (parameter.type == CustomParamType::Input) { @@ -512,7 +476,7 @@ void FrontEnd::parseCustom(const Model& model, const ie::CNNLayerPtr& layer, con stage->attrs().set("inputOrders", std::move(inputOrders)); stage->attrs().set("outputOrders", std::move(outputOrders)); - int buffer_size = customLayer->kernelBinary().length() + 1024; + int buffer_size = kernel.kernelBinary().length() + 1024; model->addTempBuffer( stage, DataDesc({buffer_size})); diff --git a/inference-engine/src/vpu/graph_transformer/src/stages/dynamic_shape_resolver.cpp b/inference-engine/src/vpu/graph_transformer/src/stages/dynamic_shape_resolver.cpp index 82b23c60445..cb95807a951 100644 --- a/inference-engine/src/vpu/graph_transformer/src/stages/dynamic_shape_resolver.cpp +++ b/inference-engine/src/vpu/graph_transformer/src/stages/dynamic_shape_resolver.cpp @@ -7,48 +7,53 @@ namespace vpu { void FrontEnd::parseDSR(const Model& model, const ie::CNNLayerPtr& layer, const DataVector& inputs, const DataVector& outputs) const { - VPU_THROW_UNLESS(inputs.size() == 2, "Error while parsing {} with type {}, got {} inputs, while {} were expected", + VPU_THROW_UNLESS(inputs.size() == 2, "Error while parsing {} of type {}, got {} inputs, while {} were expected", layer->name, layer->type, inputs.size(), 2); - - VPU_THROW_UNLESS(outputs.size() == 1, "Error while parsing {} with type {}, got {} outputs, while {} were expected", - layer->name, layer->type, outputs.size(), 1); - const auto& data = inputs[0]; const auto& shape = inputs[1]; + VPU_THROW_UNLESS(outputs.size() == 1, "Parsing layer {} of type {} failed: got {} outputs, while {} were expected", + layer->name, layer->type, outputs.size(), 1); const auto& dataOutput = outputs[0]; + const auto dataProducerEdge = data->producerEdge(); + VPU_THROW_UNLESS(dataProducerEdge != nullptr, "Parsing layer {} of type {} failed: input with index {} (of name {}) must have a producer", + layer->name, layer->type, 0, data->name()); + VPU_THROW_UNLESS(shape->desc().numDims() == 1, - "Error while parsing {} with type {}, the number of dimensions for the second input {} should be equal to 1 " - "but got {} instead", - layer->name, layer->type, shape->name(), shape->desc().numDims()); + "Parsing layer {} of type {} failed: input with index {} (of name {}) must have rank equal to {}, actual is {}", + layer->name, layer->type, 0, shape->name(), 1, shape->desc().numDims()); VPU_THROW_UNLESS(shape->desc().totalDimSize() == data->desc().numDims(), - "Error while parsing {} with type {}, the total number of elements for the second input {} should be equal to " - "the number of dimensions for the first input {}, but got {} and {} respectively", - layer->name, layer->type, shape->name(), data->name(), shape->desc().totalDimSize(), data->desc().numDims()); + "Parsing layer {} of type {} failed: input with index {} (of name {}) must have the same total elements number as " + "input with index {} (of name {}), actual {} and {} respectively", + layer->name, layer->type, 0, shape->name(), 1, data->name(), shape->desc().totalDimSize(), data->desc().numDims()); - // Dynamic input shape is unsupported - VPU_THROW_UNLESS(data->producer() != nullptr, - "Parsing layer {} with type {} failed: DSR stages must have a producer, but actually it doesn't", - layer->name, layer->type); + const auto shapeProducerEdge = shape->producerEdge(); + VPU_THROW_UNLESS(shapeProducerEdge != nullptr, "Parsing layer {} of type {} failed: input with index {} (of name {}) must have a producer", + layer->name, layer->type, 1, shape->name()); - const auto dataOutputEdge = data->producerEdge(); - const auto shapeOutputEdge = shape->producerEdge(); + model->replaceStageOutput(dataProducerEdge, dataOutput); + if (const auto& dataToShapeEdge = data->parentDataToShapeEdge()) { + model->replaceDataToShapeChild(dataToShapeEdge, dataOutput); + } + model->removeUnusedData(data); if (dataOutput->usage() == DataUsage::Output) { // Create the second output with shape in case of dynamic output const auto& shapeOutput = model->addOutputData(dataOutput->name() + "@shape", shape->desc()); - model->replaceStageOutput(shapeOutputEdge, shapeOutput); + model->replaceStageOutput(shapeProducerEdge, shapeOutput); + model->connectDataWithShape(shapeOutput, dataOutput); + + for (const auto& dataToShapeEdge : shape->childDataToShapeEdges()) { + model->replaceDataToShapeParent(dataToShapeEdge, shapeOutput); + } model->removeUnusedData(shape); } else { model->connectDataWithShape(shape, dataOutput); } - - model->replaceStageOutput(dataOutputEdge, dataOutput); - model->removeUnusedData(data); } } // namespace vpu diff --git a/inference-engine/src/vpu/graph_transformer/src/stages/out_shape_of_reshape.cpp b/inference-engine/src/vpu/graph_transformer/src/stages/out_shape_of_reshape.cpp new file mode 100644 index 00000000000..66d794caabf --- /dev/null +++ b/inference-engine/src/vpu/graph_transformer/src/stages/out_shape_of_reshape.cpp @@ -0,0 +1,103 @@ +// Copyright (C) 2020 Intel Corporation +// SPDX-License-Identifier: Apache-2.0 +// + +#include + +#include + +#include +#include +#include +#include +#include + +namespace vpu { + +namespace { + +class OutShapeOfReshapeStage final : public StageNode { +private: + StagePtr cloneImpl() const override { + return std::make_shared(*this); + } + + void propagateDataOrderImpl(StageDataInfo& orderInfo) override { + } + + void getDataStridesRequirementsImpl(StageDataInfo& stridesInfo) override { + } + + void finalizeDataLayoutImpl() override { + } + + void getBatchSupportInfoImpl(StageDataInfo& batchInfo) override { + } + + void initialCheckImpl() const override { + assertInputsOutputsTypes(this, + {{DataType::S32}, {DataType::S32}}, + {{DataType::S32}}); + } + + void serializeParamsImpl(BlobSerializer& serializer) const override { + auto specialZero = attrs().get("specialZero"); + + serializer.append(static_cast(specialZero)); + } + + void serializeDataImpl(BlobSerializer& serializer) const override { + input(0)->serializeBuffer(serializer); + input(1)->serializeBuffer(serializer); + output(0)->serializeBuffer(serializer); + } +}; + +} // namespace + +void FrontEnd::parseOutShapeOfReshape( + const Model& model, + const ie::CNNLayerPtr& layer, + const DataVector& inputs, + const DataVector& outputs) const { + VPU_THROW_UNLESS(inputs.size() == 2, + "OutShapeOfReshape stage with name %s must have only 2 inputs, " + "actually provided %d", layer->name, inputs.size()); + VPU_THROW_UNLESS(outputs.size() == 1, + "OutShapeOfReshape stage with name %s must have only 1 output, " + "actually provided %d", layer->name, outputs.size()); + + auto inDataShape = inputs[0]; + auto outShapeDescriptor = inputs[1]; + auto outDataShape = outputs[0]; + + VPU_THROW_UNLESS(inDataShape->desc().numDims() == 1, + "OutShapeOfReshape stage with name %s must have 1D input data shape tensor, " + "actually provided %dD tensor", layer->name, inDataShape->desc().numDims()); + VPU_THROW_UNLESS(outShapeDescriptor->desc().numDims() == 1, + "OutShapeOfReshape stage with name %s must have 1D output shape descriptor " + "tensor, actually provided %dD tensor", + layer->name, outShapeDescriptor->desc().numDims()); + VPU_THROW_UNLESS(outDataShape->desc().numDims() == 1, + "OutShapeOfReshape stage with name %s must have 1D output data shape tensor, " + "actually provided %dD tensor", layer->name, outDataShape->desc().numDims()); + + VPU_THROW_UNLESS(outShapeDescriptor->desc().totalDimSize() == outDataShape->desc().totalDimSize(), + "OutShapeOfReshape stage with name %s must have output shape descriptor and " + "output data shape tensor with equal length, actually provided %d vs %d", + layer->name, outShapeDescriptor->desc().totalDimSize(), + outDataShape->desc().totalDimSize()); + + + auto outShapeOfReshapeStage = model->addNewStage( + layer->name, + StageType::OutShapeOfReshape, + layer, + inputs, + outputs); + + auto specialZero = layer->GetParamAsInt("special_zero", 0); + outShapeOfReshapeStage->attrs().set("specialZero", specialZero); +} + +} // namespace vpu diff --git a/inference-engine/src/vpu/graph_transformer/src/stages/pooling.cpp b/inference-engine/src/vpu/graph_transformer/src/stages/pooling.cpp index d4939884e19..2877522d859 100644 --- a/inference-engine/src/vpu/graph_transformer/src/stages/pooling.cpp +++ b/inference-engine/src/vpu/graph_transformer/src/stages/pooling.cpp @@ -228,6 +228,10 @@ void parsePool2D(const Model & model, int outputWidth = output->desc().dim(Dim::W); int outputHeight = output->desc().dim(Dim::H); + // kernelStrideY doesn't matter when kernelSizeY==InputSizeY, change it to try HW in 1D case + if (kernelSizeY == inputHeight + padTop + padBottom) + kernelStrideY = kernelStrideX; + bool tryHW = canTryHW(poolType, inputWidth, inputHeight, diff --git a/inference-engine/src/vpu/graph_transformer/src/stages/reduce.cpp b/inference-engine/src/vpu/graph_transformer/src/stages/reduce.cpp index 6d211d3e212..b898b4e925a 100644 --- a/inference-engine/src/vpu/graph_transformer/src/stages/reduce.cpp +++ b/inference-engine/src/vpu/graph_transformer/src/stages/reduce.cpp @@ -3,12 +3,14 @@ // #include +#include #include #include #include #include +#include #include namespace vpu { @@ -25,41 +27,33 @@ private: } void propagateDataOrderImpl(StageDataInfo& orderInfo) override { - auto input0 = inputEdge(0)->input(); - auto input1 = inputEdge(1)->input(); - auto output = outputEdge(0)->output(); - - auto in0Desc = input0->desc(); - auto in1Desc = input1->desc(); - auto outDesc = output->desc(); - - auto in0Order = DimsOrder::fromNumDims(in0Desc.numDims()); - auto in1Order = DimsOrder::fromNumDims(in1Desc.numDims()); - auto outOrder = DimsOrder::fromNumDims(outDesc.numDims()); - - orderInfo.setInput(inputEdge(0), in0Order); - orderInfo.setInput(inputEdge(1), in1Order); - orderInfo.setOutput(outputEdge(0), outOrder); + orderInfo.setInput(inputEdge(0), input(0)->desc().dimsOrder()); + orderInfo.setInput(inputEdge(1), input(1)->desc().dimsOrder()); + orderInfo.setOutput(outputEdge(0), output(0)->desc().dimsOrder()); } void getDataStridesRequirementsImpl(StageDataInfo& stridesInfo) override { } void finalizeDataLayoutImpl() override { - auto input0 = inputEdge(0)->input(); - auto input1 = inputEdge(1)->input(); - - auto in0Desc = input0->desc(); - auto in1Desc = input1->desc(); - - IE_ASSERT(input1->usage() == DataUsage::Const); + auto reductionAxes = input(1); + auto in0Desc = input(0)->desc(); + auto in1Desc = reductionAxes->desc(); + VPU_THROW_UNLESS(reductionAxes->usage() == DataUsage::Const, + "Stage {} of type {} expects input with index {} ({}) to be {}, but it is {}", + name(), type(), 1, reductionAxes->name(), DataUsage::Const, reductionAxes->usage()); size_t ndims = in0Desc.numDims(); - IE_ASSERT(in1Desc.numDims() == 1); + VPU_THROW_UNLESS(in1Desc.numDims() == 1, + "Stage {} of type {} expects input with index {} ({}) to have dimensions number is {}, but it is {}", + name(), type(), 1, reductionAxes->name(), 1, in1Desc.numDims()); size_t indicesSize = in1Desc.totalDimSize(); - IE_ASSERT(indicesSize <= ndims); + VPU_THROW_UNLESS(indicesSize <= ndims, + "Stage {} of type {} expects input with index {} ({}) to have total size not greater than dimensions ", + "number of input with index {} ({}), but it is {} > {}", + name(), type(), 1, reductionAxes->name(), 0, input(0)->name(), indicesSize, ndims); - const auto oldIndices = input1->content()->get(); + const auto oldIndices = reductionAxes->content()->get(); auto newIndicesBlob = ie::make_shared_blob(InferenceEngine::TensorDesc( ie::Precision::I32, @@ -69,28 +63,26 @@ private: auto newIndices = newIndicesBlob->buffer().as(); - const auto defDimsOrder = DimsOrder::fromNumDims(ndims); - const auto defPerm = defDimsOrder.toPermutation(); + const auto defPerm = DimsOrder::fromNumDims(ndims).toPermutation(); + const auto dimsOrder = in0Desc.dimsOrder(); for (size_t i = 0; i < indicesSize; ++i) { auto irIndex = oldIndices[i]; if (irIndex < 0) { // handle negative indices - irIndex = ndims - irIndex; + irIndex = ndims - std::abs(irIndex); } - IE_ASSERT(irIndex < ndims); + VPU_THROW_UNLESS(irIndex < ndims, + "Stage {} of type {} expects input with index {} ({}) include values less than ", + "dimensions number of input with index {} ({}), but it is {} >= {}", + name(), type(), 1, reductionAxes->name(), 0, input(0)->name(), irIndex, ndims); - const auto irRevIndex = ndims - 1 - irIndex; - - const auto irDim = defPerm[irRevIndex]; - - const auto vpuDimInd = in0Desc.dimsOrder().dimInd(irDim); - newIndices[i] = vpuDimInd; + const auto reducedDim = defPerm[ndims - 1 - irIndex]; + newIndices[i] = dimsOrder.dimInd(reducedDim); } - std::sort(newIndices, newIndices + indicesSize); auto newList = model()->duplicateData( - input1, + reductionAxes, "", DataDesc(), ieBlobContent(newIndicesBlob, DataType::S32)); @@ -106,7 +98,10 @@ private: } void initialCheckImpl() const override { - IE_ASSERT(input(0)->desc().type() == output(0)->desc().type()); + VPU_THROW_UNLESS(input(0)->desc().type() == output(0)->desc().type(), + "Stage {} of type {} expects that data types of input with index {} ({}) ", + "and output with index {} ({}) are the same, but it is {} and {}", + name(), type(), 0, input(0)->name(), 0, output(0)->name(), input(0)->desc().type(), output(0)->desc().type()); assertInputsOutputsTypes(this, {{DataType::FP16, DataType::S32}, {DataType::S32}}, {{DataType::FP16, DataType::S32}}); @@ -133,10 +128,15 @@ private: void FrontEnd::parseReduce(const Model& model, const ie::CNNLayerPtr& _layer, const DataVector& inputs, const DataVector& outputs) const { auto layer = std::dynamic_pointer_cast(_layer); - IE_ASSERT(layer != nullptr); - - IE_ASSERT(inputs.size() == 2); - IE_ASSERT(outputs.size() == 1); + VPU_THROW_UNLESS(layer != nullptr, + "Layer {} of type {} is nullptr", + layer->name, layer->type); + VPU_THROW_UNLESS(inputs.size() == 2, + "Layer {} of type {} expects {} inputs, but provided {}", + layer->name, layer->type, 2, inputs.size()); + VPU_THROW_UNLESS(outputs.size() == 1, + "Layer {} of type {} expects {} output, but provided {}", + layer->name, layer->type, 1, outputs.size()); auto stageType = StageType::None; if (layer->type == "ReduceAnd") { diff --git a/inference-engine/src/vpu/graph_transformer/src/stages/topk.cpp b/inference-engine/src/vpu/graph_transformer/src/stages/topk.cpp index 3314362424b..f8777d505ab 100644 --- a/inference-engine/src/vpu/graph_transformer/src/stages/topk.cpp +++ b/inference-engine/src/vpu/graph_transformer/src/stages/topk.cpp @@ -157,12 +157,8 @@ void FrontEnd::parseTopK(const Model& model, const ie::CNNLayerPtr& _layer, cons realOutputs = {outputValues}; } - const bool isArgMaxPossible = outputsMode != TopKOutputs::All && mode == TopKMode::Max - && ((sort == TopKSort::Value && outputsMode == TopKOutputs::ValueOnly) - || (sort == TopKSort::Index && outputsMode == TopKOutputs::IndexOnly)); - auto stage = model->addNewStage(layer->name, - isArgMaxPossible ? StageType::ArgMax : StageType::TopK, + StageType::TopK, layer, inputs, realOutputs); stage->attrs().set("axis", axis); diff --git a/inference-engine/src/vpu/myriad_plugin/myriad_plugin.cpp b/inference-engine/src/vpu/myriad_plugin/myriad_plugin.cpp index 7e44237f61e..146c93cc433 100644 --- a/inference-engine/src/vpu/myriad_plugin/myriad_plugin.cpp +++ b/inference-engine/src/vpu/myriad_plugin/myriad_plugin.cpp @@ -16,6 +16,7 @@ #include #include #include +#include #include "vpu/ngraph/transformations/dynamic_to_static_shape.hpp" #include "generic_ie.hpp" @@ -28,7 +29,6 @@ using namespace InferenceEngine::VPUConfigParams; using namespace vpu::MyriadPlugin; ExecutableNetworkInternal::Ptr Engine::LoadExeNetworkImpl( - const ICore* /*core*/, const ICNNNetwork& network, const std::map& config) { VPU_PROFILE(LoadExeNetworkImpl); @@ -39,7 +39,8 @@ ExecutableNetworkInternal::Ptr Engine::LoadExeNetworkImpl( auto clonedNetwork = cloneNetwork(network); if (auto function = clonedNetwork->getFunction()) { ngraph::op::GenericIE::DisableReshape noReshape(function); - vpu::DynamicToStaticShape().transform(*function); + ngraph::pass::CommonOptimizations().run_on_function(function); + vpu::DynamicToStaticShape().transform(function); } return std::make_shared(*clonedNetwork, _devicePool, parsedConfigCopy); diff --git a/inference-engine/src/vpu/myriad_plugin/myriad_plugin.h b/inference-engine/src/vpu/myriad_plugin/myriad_plugin.h index cbbd12f4aaf..7567a5fde69 100644 --- a/inference-engine/src/vpu/myriad_plugin/myriad_plugin.h +++ b/inference-engine/src/vpu/myriad_plugin/myriad_plugin.h @@ -28,7 +28,6 @@ public: void SetConfig(const std::map& config) override; ie::ExecutableNetworkInternal::Ptr LoadExeNetworkImpl( - const ie::ICore* core, const ie::ICNNNetwork& network, const std::map& config) override; diff --git a/inference-engine/tests/functional/inference_engine/CMakeLists.txt b/inference-engine/tests/functional/inference_engine/CMakeLists.txt index da353a06114..83ae2570dc4 100644 --- a/inference-engine/tests/functional/inference_engine/CMakeLists.txt +++ b/inference-engine/tests/functional/inference_engine/CMakeLists.txt @@ -13,14 +13,16 @@ addIeTargetTest( EXCLUDED_SOURCE_DIRS ${CMAKE_CURRENT_SOURCE_DIR}/extension_lib LINK_LIBRARIES + gmock funcTestUtils ngraphFunctions inference_engine_transformations ADD_CPPLINT - LABELS - INFERENCE_ENGINE DEPENDENCIES extension_tests + mock_engine + LABELS + IE ) include(CMakeParseArguments) @@ -86,6 +88,7 @@ function(ie_headers_compilation_with_custom_flags) set(content "#include <${header_file}>\n${content}") endforeach() set(source_file "${CMAKE_CURRENT_BINARY_DIR}/modern_flags_${IE_TEST_TEST_SUFFIX}.cpp") + file(REMOVE ${source_file}) file(GENERATE OUTPUT ${source_file} CONTENT ${content}) set(target_name ieFuncTestsCompilation${IE_TEST_TEST_SUFFIX}) diff --git a/inference-engine/tests_deprecated/unit/inference_engine_tests/caslesseq_tests.cpp b/inference-engine/tests/functional/inference_engine/caseless_tests.cpp similarity index 90% rename from inference-engine/tests_deprecated/unit/inference_engine_tests/caslesseq_tests.cpp rename to inference-engine/tests/functional/inference_engine/caseless_tests.cpp index 720a611592c..611304c1c4b 100644 --- a/inference-engine/tests_deprecated/unit/inference_engine_tests/caslesseq_tests.cpp +++ b/inference-engine/tests/functional/inference_engine/caseless_tests.cpp @@ -10,17 +10,7 @@ using namespace std; using namespace InferenceEngine::details; -class CaselessTests : public ::testing::Test { - protected: - virtual void TearDown() { - } - - virtual void SetUp() { - } - - public: - -}; +using CaselessTests = ::testing::Test; TEST_F(CaselessTests, emptyAreEqual) { ASSERT_TRUE(InferenceEngine::details::equal("", "")); @@ -49,7 +39,6 @@ TEST_F(CaselessTests, canFindCaslessInMap) { } TEST_F(CaselessTests, canFindCaslessInUnordered) { - caseless_unordered_map storage = { {"Abc", 1}, {"bC", 2}, diff --git a/inference-engine/tests/functional/inference_engine/core_threading_tests.cpp b/inference-engine/tests/functional/inference_engine/core_threading_tests.cpp new file mode 100644 index 00000000000..9b786f9ee08 --- /dev/null +++ b/inference-engine/tests/functional/inference_engine/core_threading_tests.cpp @@ -0,0 +1,149 @@ +// Copyright (C) 2018-2020 Intel Corporation +// SPDX-License-Identifier: Apache-2.0 +// + +#include +#include
+#include +#include + +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include + +class CoreThreadingTests : public ::testing::Test { +public: + void SetUp() override { + } + + void runParallel(std::function func, + const unsigned int iterations = 100, + const unsigned int threadsNum = 8) { + std::vector threads(threadsNum); + + for (auto & thread : threads) { + thread = std::thread([&](){ + for (unsigned int i = 0; i < iterations; ++i) { + func(); + } + }); + } + + for (auto & thread : threads) { + if (thread.joinable()) + thread.join(); + } + } + + void safeAddExtension(InferenceEngine::Core & ie) { + try { + auto extension = InferenceEngine::make_so_pointer( + FileUtils::makeSharedLibraryName({}, + std::string("extension_tests") + IE_BUILD_POSTFIX)); + ie.AddExtension(extension); + } catch (const InferenceEngine::details::InferenceEngineException & ex) { + ASSERT_STR_CONTAINS(ex.what(), "name: experimental. Opset"); + } + } +}; + +// tested function: SetConfig +TEST_F(CoreThreadingTests, SetConfigPluginDoesNotExist) { + InferenceEngine::Core ie; + std::map localConfig = { + { CONFIG_KEY(PERF_COUNT), InferenceEngine::PluginConfigParams::YES } + }; + + runParallel([&] () { + ie.SetConfig(localConfig); + }, 10000); +} + +// tested function: RegisterPlugin +TEST_F(CoreThreadingTests, RegisterPlugin) { + InferenceEngine::Core ie; + std::atomic index{0}; + runParallel([&] () { + const std::string deviceName = std::to_string(index++); + ie.RegisterPlugin(std::string("mock_engine") + IE_BUILD_POSTFIX, deviceName); + ie.GetVersions(deviceName); + ie.UnregisterPlugin(deviceName); + }, 4000); +} + +// tested function: RegisterPlugins +TEST_F(CoreThreadingTests, RegisterPlugins) { + InferenceEngine::Core ie; + std::atomic index{0}; + + auto getPluginXml = [&] () -> std::tuple { + std::string indexStr = std::to_string(index++); + std::string pluginsXML = InferenceEngine::getIELibraryPath() + + FileUtils::FileSeparator + + "test_plugins" + indexStr + ".xml"; + std::ofstream file(pluginsXML); + + file << "::SharedLibraryPrefix(); + file << "mock_engine"; + file << IE_BUILD_POSTFIX; + file << FileUtils::DotSymbol::value; + file << FileUtils::FileTraits::SharedLibraryExt(); + file << "\" name=\""; + file << indexStr; + file << "\">"; + file.flush(); + file.close(); + + return std::tie(pluginsXML, indexStr); + }; + + runParallel([&] () { + std::string fileName, deviceName; + std:tie(fileName, deviceName) = getPluginXml(); + ie.RegisterPlugins(fileName); + ie.GetVersions(deviceName); + ASSERT_EQ(0, std::remove(fileName.c_str())); + }, 1000); +} + +// tested function: GetAvailableDevices, UnregisterPlugin +// TODO: some plugins initialization (e.g. GNA) failed during such stress-test scenario +TEST_F(CoreThreadingTests, DISABLED_GetAvailableDevices) { + InferenceEngine::Core ie; + runParallel([&] () { + std::vector devices = ie.GetAvailableDevices(); + + // unregister all the devices + for (auto && deviceName : devices) { + try { + ie.UnregisterPlugin(deviceName); + } catch (const InferenceEngine::details::InferenceEngineException & ex) { + // if several threads unload plugin at once, the first thread does this + // while all others will throw an exception that plugin is not registered + ASSERT_STR_CONTAINS(ex.what(), "name is not registered in the"); + } + } + }, 30); +} + +// tested function: ReadNetwork, AddExtension +TEST_F(CoreThreadingTests, ReadNetwork) { + InferenceEngine::Core ie; + auto model = FuncTestUtils::TestModel::convReluNormPoolFcModelFP32; + auto network = ie.ReadNetwork(model.model_xml_str, model.weights_blob); + + runParallel([&] () { + safeAddExtension(ie); + (void)ie.ReadNetwork(model.model_xml_str, model.weights_blob); + }, 100, 12); +} diff --git a/inference-engine/tests_deprecated/unit/inference_engine_tests/data_test.cpp b/inference-engine/tests/functional/inference_engine/data_test.cpp similarity index 100% rename from inference-engine/tests_deprecated/unit/inference_engine_tests/data_test.cpp rename to inference-engine/tests/functional/inference_engine/data_test.cpp diff --git a/inference-engine/tests_deprecated/unit/inference_engine_tests/debug_tests.cpp b/inference-engine/tests/functional/inference_engine/debug_tests.cpp similarity index 77% rename from inference-engine/tests_deprecated/unit/inference_engine_tests/debug_tests.cpp rename to inference-engine/tests/functional/inference_engine/debug_tests.cpp index afb9d32fce8..0a36c6803b4 100644 --- a/inference-engine/tests_deprecated/unit/inference_engine_tests/debug_tests.cpp +++ b/inference-engine/tests/functional/inference_engine/debug_tests.cpp @@ -6,17 +6,7 @@ #include "debug.h" #include -class DebugTests : public ::testing::Test { -protected: - virtual void TearDown() { - } - - virtual void SetUp() { - } - -public: - -}; +using DebugTests = ::testing::Test; TEST_F(DebugTests, tolowerWorksWithEmptyString) { std::string str = ""; diff --git a/inference-engine/tests/functional/inference_engine/ie_extension_test.cpp b/inference-engine/tests/functional/inference_engine/ie_extension_test.cpp index e894913ce45..a72df362997 100644 --- a/inference-engine/tests/functional/inference_engine/ie_extension_test.cpp +++ b/inference-engine/tests/functional/inference_engine/ie_extension_test.cpp @@ -20,34 +20,8 @@ using namespace InferenceEngine; class ExtensionLibTests : public CommonTestUtils::TestsCommon { public: std::string getExtensionPath() { -#ifdef _WIN32 -#ifdef __MINGW32__ - const char pre[] = "lib"; -#else - const char pre[] = ""; -#endif -#ifdef NDEBUG - const char ext[] = ".dll"; -#else - const char ext[] = "d.dll"; -#endif - const char FileSeparator[] = "\\"; - -#else - const char FileSeparator[] = "/"; -#if defined __APPLE__ -#ifdef NDEBUG - const char ext[] = ".dylib"; -#else - const char ext[] = "d.dylib"; -#endif - const char pre[] = "lib"; -#else - const char pre[] = "lib"; - const char ext[] = ".so"; -#endif -#endif - return getIELibraryPath() + FileSeparator + pre + "extension_tests" + ext; + return FileUtils::makeSharedLibraryName({}, + std::string("extension_tests") + IE_BUILD_POSTFIX); } }; diff --git a/inference-engine/tests/functional/inference_engine/ngraph_reader/abs_tests.cpp b/inference-engine/tests/functional/inference_engine/ngraph_reader/abs_tests.cpp index f8d6143ee44..9567cab9636 100644 --- a/inference-engine/tests/functional/inference_engine/ngraph_reader/abs_tests.cpp +++ b/inference-engine/tests/functional/inference_engine/ngraph_reader/abs_tests.cpp @@ -4,6 +4,111 @@ #include #include "ngraph_reader_tests.hpp" +#include +#include +#include + +class FakeAbs : public ngraph::op::Op { +public: + static constexpr ngraph::NodeTypeInfo type_info{"Abs", 100500}; + const ngraph::NodeTypeInfo& get_type_info() const override { return type_info; } + + FakeAbs() = default; + FakeAbs(const ngraph::Output& arg): ngraph::op::Op({arg}) { + constructor_validate_and_infer_types(); + } + void validate_and_infer_types() override { + set_output_type(0, get_input_element_type(0), get_input_partial_shape(0)); + } + std::shared_ptr copy_with_new_args(const ngraph::NodeVector& new_args) const override { + return std::make_shared(new_args.at(0)); + } + bool visit_attributes(ngraph::AttributeVisitor& visitor) override { + return true; + } +}; +constexpr ngraph::NodeTypeInfo FakeAbs::type_info; + +class AbsFakeExtension: public InferenceEngine::IExtension { +public: + void GetVersion(const InferenceEngine::Version*& versionInfo) const noexcept override {} + void Release() noexcept override { delete this; } + void Unload() noexcept override {} + + std::map getOpSets() override{ + std::map opsets; + ngraph::OpSet opset; + opset.insert(); + opsets["experimental"] = opset; + return opsets; + } +}; + +TEST_F(NGraphReaderTests, ReadAbsFromCustomOpsetNetwork) { + std::string model = R"V0G0N( + + + + + + + 1 + 3 + 22 + 22 + + + + + + + 1 + 3 + 22 + 22 + + + + + 1 + 3 + 22 + 22 + + + + + + + 1 + 3 + 22 + 22 + + + + + + + + + +)V0G0N"; + + Core ie; + ie.AddExtension(std::make_shared()); + Blob::Ptr weights; + + auto network = ie.ReadNetwork(model, weights); + auto nGraph = network.getFunction(); + bool genericNodeExists = false; + const std::string type = "Abs"; + for (auto op : nGraph->get_ops()) { + if (type == op->get_type_info().name && 100500 == op->get_type_info().version) + genericNodeExists = true; + } + ASSERT_TRUE(genericNodeExists); +} TEST_F(NGraphReaderTests, ReadAbsNetwork) { std::string model = R"V0G0N( diff --git a/inference-engine/tests/functional/inference_engine/ngraph_reader/linear_ops_tests.cpp b/inference-engine/tests/functional/inference_engine/ngraph_reader/linear_ops_tests.cpp index 253501ebf6c..d17b60219fe 100644 --- a/inference-engine/tests/functional/inference_engine/ngraph_reader/linear_ops_tests.cpp +++ b/inference-engine/tests/functional/inference_engine/ngraph_reader/linear_ops_tests.cpp @@ -1757,7 +1757,7 @@ TEST_F(NGraphReaderTests, RemoveAdd2) { - + 1 diff --git a/inference-engine/tests_deprecated/unit/inference_engine_tests/pre_allocator_test.cpp b/inference-engine/tests/functional/inference_engine/pre_allocator_test.cpp similarity index 84% rename from inference-engine/tests_deprecated/unit/inference_engine_tests/pre_allocator_test.cpp rename to inference-engine/tests/functional/inference_engine/pre_allocator_test.cpp index 8f05fb8f588..464f9faf094 100644 --- a/inference-engine/tests_deprecated/unit/inference_engine_tests/pre_allocator_test.cpp +++ b/inference-engine/tests/functional/inference_engine/pre_allocator_test.cpp @@ -25,14 +25,13 @@ class PreallocatorTests: public ::testing::Test { allocator = details::make_pre_allocator(&*mybuf.begin(), mybuf.size()); } std::shared_ptr allocator; - }; TEST_F(PreallocatorTests, canAccessPreAllocatedMemory) { - void * handle = allocator->alloc(3); - float * ptr = (float *)allocator->lock(handle); + void * handle = allocator->alloc(3); + float * ptr = reinterpret_cast(allocator->lock(handle)); - mybuf = {1.1f,2.2f,3.3f}; + mybuf = { 1.1f, 2.2f, 3.3f }; ASSERT_EQ(ptr, &*mybuf.begin()); ASSERT_EQ(ptr[0], 1.1f); @@ -48,5 +47,5 @@ TEST_F(PreallocatorTests, canNotAllocateMoreMemory) { TEST_F(PreallocatorTests, canNotLockWrongHandle) { void * handle = allocator->alloc(3); - EXPECT_EQ(nullptr, allocator->lock(1 + (int*)handle)); + EXPECT_EQ(nullptr, allocator->lock(1 + reinterpret_cast(handle))); } diff --git a/inference-engine/tests_deprecated/unit/inference_engine_tests/preprocess_test.cpp b/inference-engine/tests/functional/inference_engine/preprocess_test.cpp similarity index 91% rename from inference-engine/tests_deprecated/unit/inference_engine_tests/preprocess_test.cpp rename to inference-engine/tests/functional/inference_engine/preprocess_test.cpp index 0fcacdd4f7c..06c65c14883 100644 --- a/inference-engine/tests_deprecated/unit/inference_engine_tests/preprocess_test.cpp +++ b/inference-engine/tests/functional/inference_engine/preprocess_test.cpp @@ -7,17 +7,7 @@ using namespace std; -class PreProcessTests : public ::testing::Test { -protected: - virtual void TearDown() { - } - - virtual void SetUp() { - } - -public: - -}; +using PreProcessTests = ::testing::Test; TEST_F(PreProcessTests, throwsOnSettingNullMeanImage) { InferenceEngine::PreProcessInfo info; diff --git a/inference-engine/tests_deprecated/unit/inference_engine_tests/response_buffer_test.cpp b/inference-engine/tests/functional/inference_engine/response_buffer_test.cpp similarity index 94% rename from inference-engine/tests_deprecated/unit/inference_engine_tests/response_buffer_test.cpp rename to inference-engine/tests/functional/inference_engine/response_buffer_test.cpp index 3bb427da139..6a3299c776e 100644 --- a/inference-engine/tests_deprecated/unit/inference_engine_tests/response_buffer_test.cpp +++ b/inference-engine/tests/functional/inference_engine/response_buffer_test.cpp @@ -8,18 +8,7 @@ using namespace std; using namespace InferenceEngine; -class ResponseBufferTests: public ::testing::Test { -protected: - virtual void TearDown() { - } - - virtual void SetUp() { - } - -public: - -}; - +using ResponseBufferTests = ::testing::Test; TEST_F(ResponseBufferTests, canCreateResponseMessage) { ResponseDesc desc; diff --git a/inference-engine/tests_deprecated/unit/inference_engine_tests/shared_object_loader_test.cpp b/inference-engine/tests/functional/inference_engine/shared_object_loader_test.cpp similarity index 81% rename from inference-engine/tests_deprecated/unit/inference_engine_tests/shared_object_loader_test.cpp rename to inference-engine/tests/functional/inference_engine/shared_object_loader_test.cpp index 7c5de17d745..5818af7d8df 100644 --- a/inference-engine/tests_deprecated/unit/inference_engine_tests/shared_object_loader_test.cpp +++ b/inference-engine/tests/functional/inference_engine/shared_object_loader_test.cpp @@ -2,10 +2,11 @@ // SPDX-License-Identifier: Apache-2.0 // +#include + #include -#include "tests_common.hpp" +#include #include "details/ie_so_loader.h" -#include "inference_engine.hpp" using namespace std; using namespace InferenceEngine; @@ -13,16 +14,21 @@ using namespace InferenceEngine::details; IE_SUPPRESS_DEPRECATED_START -class SharedObjectLoaderTests: public TestsCommon { +class SharedObjectLoaderTests: public ::testing::Test { protected: + std::string get_mock_engine_name() { + return FileUtils::makeSharedLibraryName(getIELibraryPath(), + std::string("mock_engine") + IE_BUILD_POSTFIX); + } + void loadDll(const string &libraryName) { sharedObjectLoader.reset(new details::SharedObjectLoader(libraryName.c_str())); } unique_ptr sharedObjectLoader; - + template std::function make_std_function(const std::string& functionName) { - std::function ptr (reinterpret_cast(sharedObjectLoader->get_symbol(functionName.c_str()))); + std::function ptr(reinterpret_cast(sharedObjectLoader->get_symbol(functionName.c_str()))); return ptr; } }; @@ -41,14 +47,14 @@ TEST_F(SharedObjectLoaderTests, loaderThrowsIfNoPlugin) { TEST_F(SharedObjectLoaderTests, canFindExistedMethod) { loadDll(get_mock_engine_name()); - + auto factory = make_std_function("CreatePluginEngine"); EXPECT_NE(nullptr, factory); } TEST_F(SharedObjectLoaderTests, throwIfMethodNofFoundInLibrary) { loadDll(get_mock_engine_name()); - + EXPECT_THROW(make_std_function("wrong_function"), InferenceEngine::details::InferenceEngineException); } diff --git a/inference-engine/tests_deprecated/unit/inference_engine_tests/so_pointer_tests.cpp b/inference-engine/tests/functional/inference_engine/so_pointer_tests.cpp similarity index 75% rename from inference-engine/tests_deprecated/unit/inference_engine_tests/so_pointer_tests.cpp rename to inference-engine/tests/functional/inference_engine/so_pointer_tests.cpp index 9cb89354b01..4ad9517156b 100644 --- a/inference-engine/tests_deprecated/unit/inference_engine_tests/so_pointer_tests.cpp +++ b/inference-engine/tests/functional/inference_engine/so_pointer_tests.cpp @@ -6,11 +6,15 @@ #include #include +#include +#include + #include -#include +#include #include
#include
+using namespace InferenceEngine; using namespace InferenceEngine::details; using namespace ::testing; using ::testing::InSequence; @@ -33,7 +37,7 @@ public: } }; -template +template class SoPointerHelper : public SOPointer { public: SoPointerHelper(std::shared_ptr&& loader, std::shared_ptr&& object) @@ -100,3 +104,19 @@ TEST_F(SoPointerTests, UnknownPluginExceptionStr) { ASSERT_STR_DOES_NOT_CONTAIN(e.what(), "from CWD:"); } } + +using SymbolLoaderTests = ::testing::Test; + +TEST_F(SymbolLoaderTests, throwCreateNullPtr) { + ASSERT_THROW(SymbolLoader(nullptr), InferenceEngineException); +} + +TEST_F(SymbolLoaderTests, instantiateSymbol) { + std::string name = FileUtils::makeSharedLibraryName(getIELibraryPath(), + std::string("mock_engine") + IE_BUILD_POSTFIX); + std::shared_ptr sharedLoader(new SharedObjectLoader(name.c_str())); + SymbolLoader loader(sharedLoader); + IE_SUPPRESS_DEPRECATED_START + ASSERT_NE(nullptr, loader.instantiateSymbol(SOCreatorTrait::name)); + IE_SUPPRESS_DEPRECATED_END +} diff --git a/inference-engine/tests/functional/inference_engine/transformations/convert_broadcast3_test.cpp b/inference-engine/tests/functional/inference_engine/transformations/convert_broadcast3_test.cpp new file mode 100644 index 00000000000..f81076b32cf --- /dev/null +++ b/inference-engine/tests/functional/inference_engine/transformations/convert_broadcast3_test.cpp @@ -0,0 +1,157 @@ +// Copyright (C) 2020 Intel Corporation +// SPDX-License-Identifier: Apache-2.0 +// + +#include + +#include +#include +#include + +#include +#include +#include +#include +#include +#include + +#include "ngraph_test_utils.hpp" + +using namespace testing; + +// Broadcast-3 is converted directly to Broadcast-1 for modes NUMPY, NONE and PDPD +TEST(TransformationTests, ConvertBroadcast3WithNumpyModeToBroadcast1) { + std::shared_ptr f(nullptr), f_ref(nullptr); + { + auto input1 = std::make_shared(ngraph::element::f32, ngraph::Shape{3, 1, 2}); + auto target_shape = ngraph::opset1::Constant::create(ngraph::element::i64, ngraph::Shape{3}, std::vector{3, 5, 2}); + auto broadcast = std::make_shared(input1, target_shape, ngraph::op::BroadcastType::NUMPY); + broadcast->set_friendly_name("broadcast"); + + f = std::make_shared(ngraph::NodeVector{broadcast}, ngraph::ParameterVector{input1}); + + ngraph::pass::InitNodeInfo().run_on_function(f); + ngraph::pass::ConvertBroadcast3().run_on_function(f); + ASSERT_NO_THROW(check_rt_info(f)); + } + + { + auto input1 = std::make_shared(ngraph::element::f32, ngraph::Shape{3, 1, 2}); + auto target_shape = std::make_shared(ngraph::element::i64, ngraph::Shape{3}, std::vector{3, 5, 2}); + auto broadcast = std::make_shared(input1, target_shape, ngraph::op::AutoBroadcastType::NUMPY); + broadcast->set_friendly_name("broadcast"); + + f_ref = std::make_shared(ngraph::NodeVector{broadcast}, ngraph::ParameterVector{input1}); + } + + auto res = compare_functions(f, f_ref); + ASSERT_TRUE(res.first) << res.second; + + auto result_node_of_converted_f = f->get_output_op(0); + auto broadcast_node = result_node_of_converted_f->input(0).get_source_output().get_node_shared_ptr(); + auto crop_node = broadcast_node->input(0).get_source_output().get_node_shared_ptr(); + ASSERT_TRUE(broadcast_node->get_friendly_name() == "broadcast") << "Transformation ConvertBroadcast3 should keep output names.\n"; +} + +TEST(TransformationTests, ConvertBroadcast3WithPDPDModeToBroadcast1) { + std::shared_ptr f(nullptr), f_ref(nullptr); + { + auto input1 = std::make_shared(ngraph::element::f32, ngraph::Shape{3, 1, 2}); + auto target_shape = ngraph::opset1::Constant::create(ngraph::element::i64, ngraph::Shape{3}, std::vector{3, 5, 2}); + auto broadcast = std::make_shared(input1, target_shape, ngraph::op::BroadcastType::PDPD); + broadcast->set_friendly_name("broadcast"); + + f = std::make_shared(ngraph::NodeVector{broadcast}, ngraph::ParameterVector{input1}); + + ngraph::pass::InitNodeInfo().run_on_function(f); + ngraph::pass::ConvertBroadcast3().run_on_function(f); + ASSERT_NO_THROW(check_rt_info(f)); + } + + { + auto input1 = std::make_shared(ngraph::element::f32, ngraph::Shape{3, 1, 2}); + auto target_shape = std::make_shared(ngraph::element::i64, ngraph::Shape{3}, std::vector{3, 5, 2}); + auto broadcast = std::make_shared(input1, target_shape, ngraph::op::AutoBroadcastType::PDPD); + broadcast->set_friendly_name("broadcast"); + + f_ref = std::make_shared(ngraph::NodeVector{broadcast}, ngraph::ParameterVector{input1}); + } + + auto res = compare_functions(f, f_ref); + ASSERT_TRUE(res.first) << res.second; + + auto result_node_of_converted_f = f->get_output_op(0); + auto broadcast_node = result_node_of_converted_f->input(0).get_source_output().get_node_shared_ptr(); + auto crop_node = broadcast_node->input(0).get_source_output().get_node_shared_ptr(); + ASSERT_TRUE(broadcast_node->get_friendly_name() == "broadcast") << "Transformation ConvertBroadcast3 should keep output names.\n"; +} + +TEST(TransformationTests, ConvertBroadcast3WithExplicitModeToBroadcast1) { + std::shared_ptr f(nullptr), f_ref(nullptr); + { + auto input1 = std::make_shared(ngraph::element::f32, ngraph::Shape{3, 5, 2}); + auto brodcast_axis = ngraph::opset1::Constant::create(ngraph::element::i64, ngraph::Shape{3}, std::vector{0, 1, 2}); + auto target_shape = ngraph::opset1::Constant::create(ngraph::element::i64, ngraph::Shape{3}, std::vector{3, 5, 2}); + auto broadcast = std::make_shared(input1, target_shape, brodcast_axis, ngraph::op::BroadcastType::EXPLICIT); + broadcast->set_friendly_name("broadcast"); + + f = std::make_shared(ngraph::NodeVector{broadcast}, ngraph::ParameterVector{input1}); + + ngraph::pass::InitNodeInfo().run_on_function(f); + ngraph::pass::ConvertBroadcast3().run_on_function(f); + ASSERT_NO_THROW(check_rt_info(f)); + } + + { + auto input1 = std::make_shared(ngraph::element::f32, ngraph::Shape{3, 5, 2}); + auto brodcast_axis = ngraph::opset1::Constant::create(ngraph::element::i64, ngraph::Shape{3}, std::vector{0, 1, 2}); + auto target_shape = ngraph::opset1::Constant::create(ngraph::element::i64, ngraph::Shape{3}, std::vector{3, 5, 2}); + auto broadcast = std::make_shared(input1, target_shape, brodcast_axis, ngraph::op::AutoBroadcastType::EXPLICIT); + + f_ref = std::make_shared(ngraph::NodeVector{broadcast}, ngraph::ParameterVector{input1}); + } + + auto res = compare_functions(f, f_ref); + ASSERT_TRUE(res.first) << res.second; + + auto result_node_of_converted_f = f->get_output_op(0); + auto broadcast_node = result_node_of_converted_f->input(0).get_source_output().get_node_shared_ptr(); + auto crop_node = broadcast_node->input(0).get_source_output().get_node_shared_ptr(); + ASSERT_TRUE(broadcast_node->get_friendly_name() == "broadcast") << "Transformation ConvertBroadcast3 should keep output names.\n"; +} + +// Broadcast-3 with mode BIDIRECTIONAL is converted to Multiply with constant with 1s of the corresponding type +TEST(TransformationTests, ConvertBroadcast3WithBidirectionalModeToBroadcast1) { + std::shared_ptr f(nullptr), f_ref(nullptr); + { + auto input1 = std::make_shared(ngraph::element::f32, ngraph::Shape{1, 1, 2}); + auto target_shape = ngraph::opset1::Constant::create(ngraph::element::i64, ngraph::Shape{3}, std::vector{3, 5, 1}); + auto broadcast = std::make_shared(input1, target_shape, ngraph::op::BroadcastType::BIDIRECTIONAL); + broadcast->set_friendly_name("broadcast"); + + f = std::make_shared(ngraph::NodeVector{broadcast}, ngraph::ParameterVector{input1}); + + ngraph::pass::InitNodeInfo().run_on_function(f); + ngraph::pass::ConvertBroadcast3().run_on_function(f); + ASSERT_NO_THROW(check_rt_info(f)); + } + + { + auto input = std::make_shared(ngraph::element::f32, ngraph::Shape{1, 1, 2}); + auto target_shape = std::make_shared(ngraph::element::i64, ngraph::Shape{3}, std::vector{3, 5, 1}); + auto constant_one = std::make_shared(input->get_output_element_type(0), ngraph::Shape({1}), std::vector{1}); + auto broadcast_ones = std::make_shared(constant_one, target_shape, ngraph::op::AutoBroadcastType::NUMPY); + auto multiply = std::make_shared(input, broadcast_ones); + multiply->set_friendly_name("broadcast"); + + f_ref = std::make_shared(ngraph::NodeVector{multiply}, ngraph::ParameterVector{input}); + } + + auto res = compare_functions(f, f_ref); + ASSERT_TRUE(res.first) << res.second; + + auto result_node_of_converted_f = f->get_output_op(0); + auto result_node = result_node_of_converted_f->input(0).get_source_output().get_node_shared_ptr(); + auto crop_node = result_node->input(0).get_source_output().get_node_shared_ptr(); + ASSERT_TRUE(result_node->get_friendly_name() == "broadcast") << "Transformation ConvertBroadcast3 should keep output names.\n"; +} diff --git a/inference-engine/tests/functional/inference_engine/transformations/convert_nms3_test.cpp b/inference-engine/tests/functional/inference_engine/transformations/convert_nms3_test.cpp new file mode 100644 index 00000000000..1fc7528434e --- /dev/null +++ b/inference-engine/tests/functional/inference_engine/transformations/convert_nms3_test.cpp @@ -0,0 +1,103 @@ +// Copyright (C) 2020 Intel Corporation +// SPDX-License-Identifier: Apache-2.0 +// + +#include + +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include + +#include "ngraph_test_utils.hpp" + +using namespace testing; +using namespace ngraph; + +TEST(TransformationTests, ConvertNMS3I32Output) { + std::shared_ptr f(nullptr), f_ref(nullptr); + { + auto boxes = std::make_shared(element::f32, Shape{1, 1000, 4}); + auto scores = std::make_shared(element::f32, Shape{1, 1, 1000}); + auto max_output_boxes_per_class = opset3::Constant::create(element::i64, Shape{}, {10}); + auto iou_threshold = opset3::Constant::create(element::f32, Shape{}, {0.75}); + auto score_threshold = opset3::Constant::create(element::f32, Shape{}, {0.7}); + auto nms = std::make_shared(boxes, scores, max_output_boxes_per_class, + iou_threshold, score_threshold, opset3::NonMaxSuppression::BoxEncodingType::CORNER, true, element::i32); + nms->set_friendly_name("nms"); + + f = std::make_shared(NodeVector{nms}, ParameterVector{boxes, scores}); + + pass::InitNodeInfo().run_on_function(f); + pass::ConvertNMS3().run_on_function(f); + ASSERT_NO_THROW(check_rt_info(f)); + } + + { + auto boxes = std::make_shared(element::f32, Shape{1, 1000, 4}); + auto scores = std::make_shared(element::f32, Shape{1, 1, 1000}); + auto max_output_boxes_per_class = opset3::Constant::create(element::i64, Shape{}, {10}); + auto iou_threshold = opset3::Constant::create(element::f32, Shape{}, {0.75}); + auto score_threshold = opset3::Constant::create(element::f32, Shape{}, {0.7}); + auto nms = std::make_shared(boxes, scores, max_output_boxes_per_class, + iou_threshold, score_threshold, opset1::NonMaxSuppression::BoxEncodingType::CORNER, true); + nms->set_friendly_name("nms"); + + f_ref = std::make_shared(NodeVector{nms}, ParameterVector{boxes, scores}); + } + + auto res = compare_functions(f, f_ref); + ASSERT_TRUE(res.first) << res.second; + + auto result_node_of_converted_f = f->get_output_op(0); + auto nms_node = result_node_of_converted_f->input(0).get_source_output().get_node_shared_ptr(); + ASSERT_TRUE(nms_node->get_friendly_name() == "nms") << "Transformation ConvertTopK3 should keep output names.\n"; +} + +TEST(TransformationTests, ConvertNMS3I64Output) { + std::shared_ptr f(nullptr), f_ref(nullptr); + { + auto boxes = std::make_shared(element::f32, Shape{1, 1000, 4}); + auto scores = std::make_shared(element::f32, Shape{1, 1, 1000}); + auto max_output_boxes_per_class = opset3::Constant::create(element::i64, Shape{}, {10}); + auto iou_threshold = opset3::Constant::create(element::f32, Shape{}, {0.75}); + auto score_threshold = opset3::Constant::create(element::f32, Shape{}, {0.7}); + auto nms = std::make_shared(boxes, scores, max_output_boxes_per_class, + iou_threshold, score_threshold, opset3::NonMaxSuppression::BoxEncodingType::CORNER, true, element::i64); + nms->set_friendly_name("nms"); + + f = std::make_shared(NodeVector{nms}, ParameterVector{boxes, scores}); + + pass::InitNodeInfo().run_on_function(f); + pass::ConvertNMS3().run_on_function(f); + ASSERT_NO_THROW(check_rt_info(f)); + } + + { + auto boxes = std::make_shared(element::f32, Shape{1, 1000, 4}); + auto scores = std::make_shared(element::f32, Shape{1, 1, 1000}); + auto max_output_boxes_per_class = opset3::Constant::create(element::i64, Shape{}, {10}); + auto iou_threshold = opset3::Constant::create(element::f32, Shape{}, {0.75}); + auto score_threshold = opset3::Constant::create(element::f32, Shape{}, {0.7}); + auto nms = std::make_shared(boxes, scores, max_output_boxes_per_class, + iou_threshold, score_threshold, opset2::NonMaxSuppression::BoxEncodingType::CORNER, true); + auto convert = std::make_shared(nms, element::i64); + convert->set_friendly_name("nms"); + + f_ref = std::make_shared(NodeVector{convert}, ParameterVector{boxes, scores}); + } + + auto res = compare_functions(f, f_ref); + ASSERT_TRUE(res.first) << res.second; + + auto result_node_of_converted_f = f->get_output_op(0); + auto nms_node = result_node_of_converted_f->input(0).get_source_output().get_node_shared_ptr(); + ASSERT_TRUE(nms_node->get_friendly_name() == "nms") << "Transformation ConvertTopK3 should keep output names.\n"; +} \ No newline at end of file diff --git a/inference-engine/tests/functional/inference_engine/transformations/convert_scatter_elements_to_scatter_test.cpp b/inference-engine/tests/functional/inference_engine/transformations/convert_scatter_elements_to_scatter_test.cpp new file mode 100644 index 00000000000..9b28daf0efe --- /dev/null +++ b/inference-engine/tests/functional/inference_engine/transformations/convert_scatter_elements_to_scatter_test.cpp @@ -0,0 +1,131 @@ +// Copyright (C) 2020 Intel Corporation +// SPDX-License-Identifier: Apache-2.0 +// + +#include + +#include "common_test_utils/test_common.hpp" +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include + +#include "ngraph_test_utils.hpp" + +using namespace testing; + +std::shared_ptr get_initial_function(const ngraph::PartialShape & data_shape, + const ngraph::PartialShape & indexes_shape, + const ngraph::PartialShape & updates_shape, + const ngraph::PartialShape & broadcast_shape, + const int64_t & axis) { + auto data = std::make_shared(ngraph::element::f32, data_shape); + auto indexes = std::make_shared(ngraph::element::i64, indexes_shape); + auto updates = std::make_shared(ngraph::element::f32, updates_shape); + auto axis_const = ngraph::opset3::Constant::create(ngraph::element::i64, {1}, {axis}); + + uint64_t broadcast_len = broadcast_shape.rank().get_length(); + auto broadcast_shape_param = std::make_shared(ngraph::element::i64, ngraph::Shape{broadcast_len}); + auto broadcast = std::make_shared(indexes, broadcast_shape_param); + + auto scatter = std::make_shared(data, broadcast, updates, axis_const); + + return std::make_shared(ngraph::NodeVector{scatter}, ngraph::ParameterVector{data, indexes, updates, broadcast_shape_param}); +} + +std::shared_ptr get_reference_function(const ngraph::PartialShape & data_shape, + const ngraph::PartialShape & indexes_shape, + const ngraph::PartialShape & updates_shape, + const int64_t & axis, + const ngraph::Shape & reshape_shape = {}, + const std::vector & squeeze_indices = {}) { + auto data = std::make_shared(ngraph::element::f32, data_shape); + auto indexes = std::make_shared(ngraph::element::i64, indexes_shape); + auto updates = std::make_shared(ngraph::element::f32, updates_shape); + auto axis_const = ngraph::opset3::Constant::create(ngraph::element::i64, {1}, {axis}); + + ngraph::Output index_out = indexes->output(0); + if (!reshape_shape.empty()) { + index_out = std::make_shared(indexes, + ngraph::opset3::Constant::create(ngraph::element::i64, {reshape_shape.size()}, reshape_shape), false); + } + + if (!squeeze_indices.empty()) { + index_out = std::make_shared(indexes, + ngraph::opset3::Constant::create(ngraph::element::i64, {squeeze_indices.size()}, squeeze_indices)); + } + + auto scatter = std::make_shared(data, index_out, updates, axis_const); + + return std::make_shared(ngraph::NodeVector{scatter}, ngraph::ParameterVector{data, indexes, updates}); +} + +void test(std::shared_ptr f, std::shared_ptr f_ref) { + ngraph::pass::InitNodeInfo().run_on_function(f); + ngraph::pass::ConvertScatterElementsToScatter().run_on_function(f); + ASSERT_NO_THROW(check_rt_info(f)); + ngraph::pass::ConstantFolding().run_on_function(f); + + auto res = compare_functions(f, f_ref); + ASSERT_TRUE(res.first) << res.second; +} + +void test(std::shared_ptr f) { + test(f, f); +} + +TEST(TransformationTests, ConvertScatterElementsToScatterTestAxis0) { + test(get_initial_function({1000, 256, 7, 7}, {1000, 1, 1, 1}, {1000, 256, 7, 7}, {1000, 256, 7, 7}, 0), + get_reference_function({1000, 256, 7, 7}, {1000, 1, 1, 1}, {1000, 256, 7, 7}, 0, {1000})); +} + +TEST(TransformationTests, ConvertScatterElementsToScatterTestAxis1) { + test(get_initial_function({1000, 256, 7, 7}, {256, 1, 1}, {1000, 256, 7, 7}, {1000, 256, 7, 7}, 1), + get_reference_function({1000, 256, 7, 7}, {256, 1, 1}, {1000, 256, 7, 7}, 1, {256})); +} + +TEST(TransformationTests, ConvertScatterElementsToScatterTestNoReshape) { + test(get_initial_function({1000, 256, 7, 7}, {1}, {1000, 1, 7, 7}, {1000, 1, 7, 7}, 1), + get_reference_function({1000, 256, 7, 7}, {1}, {1000, 1, 7, 7}, 1)); +} + +TEST(TransformationTests, ConvertScatterElementsToScatterTestNoReshapeNegAxis) { + test(get_initial_function({1000, 256, 7, 7}, {1}, {1000, 1, 7, 7}, {1000, 1, 7, 7}, -3), + get_reference_function({1000, 256, 7, 7}, {1}, {1000, 1, 7, 7}, -3)); +} + +TEST(TransformationTests, ConvertScatterElementsToScatterTestNegative) { + test(get_initial_function({1000, 256, 7, 7}, {1000, 256, 1, 1}, {1000, 256, 7, 7}, {1000, 256, 7, 7}, 0)); +} + +TEST(TransformationTests, ConvertScatterElementsToScatterTestAxis0Dyn) { + test(get_initial_function({DYN, 256, 7, 7}, {DYN, 1, 1, 1}, {DYN, 256, 7, 7}, {DYN, 256, 7, 7}, 0), + get_reference_function({DYN, 256, 7, 7}, {DYN, 1, 1, 1}, {DYN, 256, 7, 7}, 0, {}, {1, 2, 3})); +} + +TEST(TransformationTests, ConvertScatterElementsToScatterTestAxis1Dyn) { + test(get_initial_function({1000, DYN, 7, 7}, {DYN, 1, 1}, {1000, DYN, 7, 7}, {1000, DYN, 7, 7}, 1), + get_reference_function({1000, DYN, 7, 7}, {DYN, 1, 1}, {1000, DYN, 7, 7}, 1, {}, {1, 2})); +} + +TEST(TransformationTests, ConvertScatterElementsToScatterTestAxis1NoSqueezeDyn) { + test(get_initial_function({1000, DYN, 7, 7}, {DYN}, {1000, 256, 7, 7}, {1000, DYN, 7, 7}, 1), + get_reference_function({1000, DYN, 7, 7}, {DYN}, {1000, 256, 7, 7}, 1)); +} + +TEST(TransformationTests, ConvertScatterElementsToScatterTestAxis0Neg1Dyn) { + test(get_initial_function({DYN, 256, 7, 7}, {DYN, DYN, 1, 1}, {DYN, 256, 7, 7}, {DYN, 256, 7, 7}, 0)); +} + +TEST(TransformationTests, ConvertScatterElementsToScatterTestAxis0Neg2Dyn) { + test(get_initial_function({DYN, 256, 7, 7}, {DYN, 1, 2, 1}, {DYN, 256, 7, 7}, {DYN, 256, 7, 7}, 0)); +} \ No newline at end of file diff --git a/inference-engine/tests/functional/inference_engine/transformations/convert_shapeof3.cpp b/inference-engine/tests/functional/inference_engine/transformations/convert_shapeof3.cpp new file mode 100644 index 00000000000..5019643ed6d --- /dev/null +++ b/inference-engine/tests/functional/inference_engine/transformations/convert_shapeof3.cpp @@ -0,0 +1,79 @@ +// Copyright (C) 2020 Intel Corporation +// SPDX-License-Identifier: Apache-2.0 +// + +#include + +#include +#include + +#include +#include +#include +#include +#include + +#include "ngraph_test_utils.hpp" + +using namespace testing; + +TEST(TransformationTests, ConvertShapeOf3WithI64) { + std::shared_ptr f(nullptr), f_ref(nullptr); + { + auto input = std::make_shared(ngraph::element::f32, ngraph::Shape{1, 2, 3}); + auto shapeof = std::make_shared(input, ngraph::element::i64); + shapeof->set_friendly_name("shapeof"); + + f = std::make_shared(ngraph::NodeVector{shapeof}, ngraph::ParameterVector{input}); + + ngraph::pass::InitNodeInfo().run_on_function(f); + ngraph::pass::ConvertShapeOf3().run_on_function(f); + ASSERT_NO_THROW(check_rt_info(f)); + } + + { + auto input = std::make_shared(ngraph::element::f32, ngraph::Shape{1, 2, 3}); + auto shapeof = std::make_shared(input); + shapeof->set_friendly_name("shapeof"); + + f_ref = std::make_shared(ngraph::NodeVector{shapeof}, ngraph::ParameterVector{input}); + } + + auto res = compare_functions(f, f_ref); + ASSERT_TRUE(res.first) << res.second; + + auto result_node_of_converted_f = f->get_output_op(0); + auto output_node = result_node_of_converted_f->input(0).get_source_output().get_node_shared_ptr(); + ASSERT_TRUE(output_node->get_friendly_name() == "shapeof") << "Transformation ConvertShapeOf3 should keep output names.\n"; +} + +TEST(TransformationTests, ConvertShapeOf3WithI32) { + std::shared_ptr f(nullptr), f_ref(nullptr); + { + auto input = std::make_shared(ngraph::element::f32, ngraph::Shape{1, 2, 3}); + auto shapeof = std::make_shared(input, ngraph::element::i32); + shapeof->set_friendly_name("shapeof"); + + f = std::make_shared(ngraph::NodeVector{shapeof}, ngraph::ParameterVector{input}); + + ngraph::pass::InitNodeInfo().run_on_function(f); + ngraph::pass::ConvertShapeOf3().run_on_function(f); + ASSERT_NO_THROW(check_rt_info(f)); + } + + { + auto input = std::make_shared(ngraph::element::f32, ngraph::Shape{1, 2, 3}); + auto shapeof = std::make_shared(input); + auto convert = std::make_shared(shapeof, ngraph::element::i32); + convert->set_friendly_name("shapeof"); + + f_ref = std::make_shared(ngraph::NodeVector{convert}, ngraph::ParameterVector{input}); + } + + auto res = compare_functions(f, f_ref); + ASSERT_TRUE(res.first) << res.second; + + auto result_node_of_converted_f = f->get_output_op(0); + auto output_node = result_node_of_converted_f->input(0).get_source_output().get_node_shared_ptr(); + ASSERT_TRUE(output_node->get_friendly_name() == "shapeof") << "Transformation ConvertShapeOf3 should keep output names.\n"; +} diff --git a/inference-engine/tests/functional/inference_engine/transformations/convert_topk3_test.cpp b/inference-engine/tests/functional/inference_engine/transformations/convert_topk3_test.cpp new file mode 100644 index 00000000000..e5ae2e159cc --- /dev/null +++ b/inference-engine/tests/functional/inference_engine/transformations/convert_topk3_test.cpp @@ -0,0 +1,161 @@ +// Copyright (C) 2020 Intel Corporation +// SPDX-License-Identifier: Apache-2.0 +// + +#include + +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include + +#include "ngraph_test_utils.hpp" + +using namespace testing; + +// check that the first output from the TopK-3 with I32 output indices is equal to the TopK-1 first output +TEST(TransformationTests, ConvertTopK3I32Output0) { + std::shared_ptr f(nullptr), f_ref(nullptr); + { + auto input = std::make_shared(ngraph::element::f32, ngraph::Shape{15, 20, 3}); + auto k = ngraph::opset3::Constant::create(ngraph::element::i64, ngraph::Shape{}, {10}); + auto topk = std::make_shared(input, k, 1, "min", "value", ngraph::element::i32); + topk->set_friendly_name("topk"); + + // due to the 'compare_functions' limitation we will check only one output + f = std::make_shared(ngraph::OutputVector{topk->output(0)}, ngraph::ParameterVector{input}); + + ngraph::pass::InitNodeInfo().run_on_function(f); + ngraph::pass::ConvertTopK3().run_on_function(f); + ASSERT_NO_THROW(check_rt_info(f)); + } + + { + auto input = std::make_shared(ngraph::element::f32, ngraph::Shape{15, 20, 3}); + auto k = ngraph::opset3::Constant::create(ngraph::element::i64, ngraph::Shape{}, {10}); + auto topk = std::make_shared(input, k, 1, "min", "value", ngraph::element::i32); + topk->set_friendly_name("topk"); + + // due to the 'compare_functions' limitation we will check only one output + f_ref = std::make_shared(ngraph::OutputVector{topk->output(0)}, ngraph::ParameterVector{input}); + } + + auto res = compare_functions(f, f_ref); + ASSERT_TRUE(res.first) << res.second; + + auto result_node_of_converted_f = f->get_output_op(0); + auto topk_node = result_node_of_converted_f->input(0).get_source_output().get_node_shared_ptr(); + ASSERT_TRUE(topk_node->get_friendly_name() == "topk") << "Transformation ConvertTopK3 should keep output names.\n"; +} + +// check that the second output from the TopK-3 with I32 output indices is equal to the TopK-1 second output +TEST(TransformationTests, ConvertTopK3I32Output1) { + std::shared_ptr f(nullptr), f_ref(nullptr); + { + auto input = std::make_shared(ngraph::element::f32, ngraph::Shape{15, 20, 3}); + auto k = ngraph::opset3::Constant::create(ngraph::element::i64, ngraph::Shape{}, {10}); + auto topk = std::make_shared(input, k, 1, "min", "value", ngraph::element::i32); + topk->set_friendly_name("topk"); + + // due to the 'compare_functions' limitation we will check only one output + f = std::make_shared(ngraph::OutputVector{topk->output(1)}, ngraph::ParameterVector{input}); + + ngraph::pass::InitNodeInfo().run_on_function(f); + ngraph::pass::ConvertTopK3().run_on_function(f); + ASSERT_NO_THROW(check_rt_info(f)); + } + + { + auto input = std::make_shared(ngraph::element::f32, ngraph::Shape{15, 20, 3}); + auto k = ngraph::opset3::Constant::create(ngraph::element::i64, ngraph::Shape{}, {10}); + auto topk = std::make_shared(input, k, 1, "min", "value", ngraph::element::i32); + topk->set_friendly_name("topk"); + + // due to the 'compare_functions' limitation we will check only one output + f_ref = std::make_shared(ngraph::OutputVector{topk->output(1)}, ngraph::ParameterVector{input}); + } + + auto res = compare_functions(f, f_ref); + ASSERT_TRUE(res.first) << res.second; + + auto result_node_of_converted_f = f->get_output_op(0); + auto topk_node = result_node_of_converted_f->input(0).get_source_output().get_node_shared_ptr(); + ASSERT_TRUE(topk_node->get_friendly_name() == "topk") << "Transformation ConvertTopK3 should keep output names.\n"; +} + +// check that the first output from the TopK-3 with I64 output indices is equal to the TopK-1 first output +TEST(TransformationTests, ConvertTopK3I64Output0) { + std::shared_ptr f(nullptr), f_ref(nullptr); + { + auto input = std::make_shared(ngraph::element::f32, ngraph::Shape{15, 20, 3}); + auto k = ngraph::opset3::Constant::create(ngraph::element::i64, ngraph::Shape{}, {10}); + auto topk = std::make_shared(input, k, 1, "min", "value", ngraph::element::i64); + topk->set_friendly_name("topk"); + + // due to the 'compare_functions' limitation we will check only one output + f = std::make_shared(ngraph::OutputVector{topk->output(0)}, ngraph::ParameterVector{input}); + + ngraph::pass::InitNodeInfo().run_on_function(f); + ngraph::pass::ConvertTopK3().run_on_function(f); + ASSERT_NO_THROW(check_rt_info(f)); + } + + { + auto input = std::make_shared(ngraph::element::f32, ngraph::Shape{15, 20, 3}); + auto k = ngraph::opset3::Constant::create(ngraph::element::i64, ngraph::Shape{}, {10}); + auto topk = std::make_shared(input, k, 1, "min", "value", ngraph::element::i32); + topk->set_friendly_name("topk"); + + // due to the 'compare_functions' limitation we will check only one output + f_ref = std::make_shared(ngraph::OutputVector{topk->output(0)}, ngraph::ParameterVector{input}); + } + + auto res = compare_functions(f, f_ref); + ASSERT_TRUE(res.first) << res.second; + + auto result_node_of_converted_f = f->get_output_op(0); + auto topk_node = result_node_of_converted_f->input(0).get_source_output().get_node_shared_ptr(); + ASSERT_TRUE(topk_node->get_friendly_name() == "topk") << "Transformation ConvertTopK3 should keep output names.\n"; +} + +// check that the second output from the TopK-3 with I64 output indices is equal to the TopK-1 second output converted to I64 +TEST(TransformationTests, ConvertTopK3I64Output1) { + std::shared_ptr f(nullptr), f_ref(nullptr); + { + auto input = std::make_shared(ngraph::element::f32, ngraph::Shape{15, 20, 3}); + auto k = ngraph::opset3::Constant::create(ngraph::element::i64, ngraph::Shape{}, {10}); + auto topk = std::make_shared(input, k, 1, "min", "value", ngraph::element::i64); + topk->set_friendly_name("topk"); + + // due to the 'compare_functions' limitation we will check only one output + f = std::make_shared(ngraph::OutputVector{topk->output(1)}, ngraph::ParameterVector{input}); + + ngraph::pass::InitNodeInfo().run_on_function(f); + ngraph::pass::ConvertTopK3().run_on_function(f); + ASSERT_NO_THROW(check_rt_info(f)); + } + + { + auto input = std::make_shared(ngraph::element::f32, ngraph::Shape{15, 20, 3}); + auto k = ngraph::opset3::Constant::create(ngraph::element::i64, ngraph::Shape{}, {10}); + auto topk = std::make_shared(input, k, 1, "min", "value", ngraph::element::i32); + auto convert = std::make_shared(topk->output(1), topk->get_index_element_type()); + topk->set_friendly_name("topk"); + + // due to the 'compare_functions' limitation we will check only one output + f_ref = std::make_shared(ngraph::NodeVector{convert}, ngraph::ParameterVector{input}); + } + + auto res = compare_functions(f, f_ref); + ASSERT_TRUE(res.first) << res.second; + + auto result_node_of_converted_f = f->get_output_op(0); + auto topk_node = result_node_of_converted_f->input(0).get_source_output().get_node_shared_ptr(); +} diff --git a/inference-engine/tests/functional/inference_engine/transformations/ngraph_test_utils.cpp b/inference-engine/tests/functional/inference_engine/transformations/ngraph_test_utils.cpp index 6d2c9dea522..42194e7a496 100644 --- a/inference-engine/tests/functional/inference_engine/transformations/ngraph_test_utils.cpp +++ b/inference-engine/tests/functional/inference_engine/transformations/ngraph_test_utils.cpp @@ -43,9 +43,9 @@ std::pair compare_functions(const std::shared_ptrinputs().size(); ++i) { - if (node1->input(i).get_shape() != node2->input(i).get_shape()) { + if (!node1->input(i).get_partial_shape().compatible(node2->input(i).get_partial_shape())) { std::ostringstream out("Different shape detected"); - out << node1->input(i).get_shape() << " and " << node2->input(i).get_shape(); + out << node1->input(i).get_partial_shape() << " and " << node2->input(i).get_partial_shape(); return {false, out.str()}; } diff --git a/inference-engine/tests/functional/inference_engine/transformations/ngraph_test_utils.hpp b/inference-engine/tests/functional/inference_engine/transformations/ngraph_test_utils.hpp index 5764088e6bb..01a9ee266cd 100644 --- a/inference-engine/tests/functional/inference_engine/transformations/ngraph_test_utils.hpp +++ b/inference-engine/tests/functional/inference_engine/transformations/ngraph_test_utils.hpp @@ -7,9 +7,12 @@ #include #include +#include #include "common_test_utils/test_common.hpp" +#define DYN ngraph::Dimension::dynamic() + using TransformationTests = CommonTestUtils::TestsCommon; std::pair compare_functions(const std::shared_ptr & f1, const std::shared_ptr & f2); diff --git a/inference-engine/tests/functional/inference_engine/transformations/optimize_strided_slice_test.cpp b/inference-engine/tests/functional/inference_engine/transformations/optimize_strided_slice_test.cpp new file mode 100644 index 00000000000..0d7446781c5 --- /dev/null +++ b/inference-engine/tests/functional/inference_engine/transformations/optimize_strided_slice_test.cpp @@ -0,0 +1,274 @@ +// Copyright (C) 2020 Intel Corporation +// SPDX-License-Identifier: Apache-2.0 +// + +#include + +#include "common_test_utils/test_common.hpp" +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include + +#include "ngraph_test_utils.hpp" + +using namespace testing; + +TEST(TransformationTests, OptimizeSS_UselessDeletion_Negative1) { + std::shared_ptr f(nullptr); + { + auto data = std::make_shared(ngraph::element::f32, ngraph::Shape{5, 5, 5, 5}); + auto begin = ngraph::opset1::Constant::create(ngraph::element::i64, ngraph::Shape{4}, {0, 0, 0, 0}); + auto end = ngraph::opset1::Constant::create(ngraph::element::i64, ngraph::Shape{4}, {-1, -1, -1, -1}); + auto stride = ngraph::opset1::Constant::create(ngraph::element::i64, ngraph::Shape{4}, {1}); + + std::vector begin_mask = {0, 0, 0, 0}; + std::vector end_mask = {1, 1, 1, 1}; // ignoring end -- slicing to the end + + auto ss = std::make_shared(data, begin, end, stride, begin_mask, end_mask); + + f = std::make_shared(ngraph::NodeVector{ss}, ngraph::ParameterVector{data}); + ngraph::pass::StridedSliceOptimization().run_on_function(f); + ngraph::pass::ConstantFolding().run_on_function(f); + } + + auto res = compare_functions(f, f); + ASSERT_TRUE(res.first) << res.second; +} + +TEST(TransformationTests, OptimizeSS_UselessDeletion_Negative2) { + std::shared_ptr f(nullptr); + { + auto data = std::make_shared(ngraph::element::f32, ngraph::PartialShape::dynamic(4)); + auto relu = std::make_shared(data); + auto begin = ngraph::opset1::Constant::create(ngraph::element::i64, ngraph::Shape{4}, {0, 0, 0, 0}); + auto end = ngraph::opset1::Constant::create(ngraph::element::i64, ngraph::Shape{4}, {-1, -1, -1, -1}); + auto stride = ngraph::opset1::Constant::create(ngraph::element::i64, ngraph::Shape{4}, {1}); + + std::vector begin_mask = {0, 0, 0, 0}; + std::vector end_mask = {1, 1, 1, 1}; // ignoring end -- slicing to the end + + auto ss = std::make_shared(relu, begin, end, stride, begin_mask, end_mask); + + f = std::make_shared(ngraph::NodeVector{ss}, ngraph::ParameterVector{data}); + ngraph::pass::StridedSliceOptimization().run_on_function(f); + ngraph::pass::ConstantFolding().run_on_function(f); + } + + auto res = compare_functions(f, f); + ASSERT_TRUE(res.first) << res.second; +} + +TEST(TransformationTests, OptimizeSS_UselessDeletion) { + std::shared_ptr f(nullptr), f_ref(nullptr); + { + auto data = std::make_shared(ngraph::element::f32, ngraph::Shape{5, 5, 5, 5}); + auto relu = std::make_shared(data); + auto begin = ngraph::opset1::Constant::create(ngraph::element::i64, ngraph::Shape{4}, {0, 0, 0, 0}); + auto end = ngraph::opset1::Constant::create(ngraph::element::i64, ngraph::Shape{4}, {-1, -1, -1, -1}); + auto stride = ngraph::opset1::Constant::create(ngraph::element::i64, ngraph::Shape{4}, {1}); + + std::vector begin_mask = {0, 0, 0, 0}; + std::vector end_mask = {1, 1, 1, 1}; // ignoring end -- slicing to the end + + auto ss = std::make_shared(relu, begin, end, stride, begin_mask, end_mask); + + f = std::make_shared(ngraph::NodeVector{ss}, ngraph::ParameterVector{data}); + ngraph::pass::StridedSliceOptimization().run_on_function(f); + ngraph::pass::ConstantFolding().run_on_function(f); + } + { + auto data = std::make_shared(ngraph::element::f32, ngraph::Shape{5, 5, 5, 5}); + auto relu = std::make_shared(data); + f_ref = std::make_shared(ngraph::NodeVector{relu}, ngraph::ParameterVector{data}); + } + + auto res = compare_functions(f, f_ref); + ASSERT_TRUE(res.first) << res.second; +} + +TEST(TransformationTests, OptimizeSS_Usefull_Test) { + std::shared_ptr f(nullptr), f_ref(nullptr); + { + auto data = std::make_shared(ngraph::element::f32, ngraph::Shape{5, 5, 5, 5}); + auto begin = ngraph::opset1::Constant::create(ngraph::element::i64, ngraph::Shape{4}, {0, 0, 0, 0}); + auto end = ngraph::opset1::Constant::create(ngraph::element::i64, ngraph::Shape{4}, {-1, -1, -1, -1}); + auto stride = ngraph::opset1::Constant::create(ngraph::element::i64, ngraph::Shape{4}, {1}); + + std::vector begin_mask = {0, 0, 0, 0}; + std::vector end_mask = {0, 0, 0, 0}; + + auto ss = std::make_shared(data, begin, end, stride, begin_mask, end_mask); + + f = std::make_shared(ngraph::NodeVector{ss}, ngraph::ParameterVector{data}); + ngraph::pass::StridedSliceOptimization().run_on_function(f); + ngraph::pass::ConstantFolding().run_on_function(f); + } + { + auto data = std::make_shared(ngraph::element::f32, ngraph::Shape{5, 5, 5, 5}); + auto begin = ngraph::opset1::Constant::create(ngraph::element::i64, ngraph::Shape{4}, {0, 0, 0, 0}); + auto end = ngraph::opset1::Constant::create(ngraph::element::i64, ngraph::Shape{4}, {-1, -1, -1, -1}); + auto stride = ngraph::opset1::Constant::create(ngraph::element::i64, ngraph::Shape{4}, {1}); + + std::vector begin_mask = {0, 0, 0, 0}; + std::vector end_mask = {0, 0, 0, 0}; + + auto ss = std::make_shared(data, begin, end, stride, begin_mask, end_mask); + + f_ref = std::make_shared(ngraph::NodeVector{ss}, ngraph::ParameterVector{data}); + } + + auto res = compare_functions(f, f_ref); + ASSERT_TRUE(res.first) << res.second; +} + +TEST(TransformationTests, OptimizeSS_Shared_Test) { + std::shared_ptr f(nullptr), f_ref(nullptr); + { + auto source = std::make_shared(ngraph::element::f32, ngraph::Shape{5, 5, 5, 5}); + + auto begin1 = ngraph::opset1::Constant::create(ngraph::element::i64, ngraph::Shape{4}, {0, 0, 0, 0}); + auto end1 = ngraph::opset1::Constant::create(ngraph::element::i64, ngraph::Shape{4}, {-1, -1, -1, -1}); + auto stride1 = ngraph::opset1::Constant::create(ngraph::element::i64, ngraph::Shape{4}, {1}); + std::vector begin_mask1 = {0, 0, 0, 0}; + std::vector end_mask1 = {0, 0, 0, 0}; + auto ss1 = std::make_shared(source, begin1, end1, stride1, begin_mask1, end_mask1); + + auto begin2 = ngraph::opset1::Constant::create(ngraph::element::i64, ngraph::Shape{4}, {0, 0, 0, 0}); + auto end2 = ngraph::opset1::Constant::create(ngraph::element::i64, ngraph::Shape{4}, {-1, -1, -1, -1}); + auto stride2 = ngraph::opset1::Constant::create(ngraph::element::i64, ngraph::Shape{4}, {1}); + std::vector begin_mask2 = {0, 0, 0, 0}; + std::vector end_mask2 = {0, 0, 0, 0}; + auto ss2 = std::make_shared(source, begin2, end2, stride2, begin_mask2, end_mask2); + + auto concat = std::make_shared(ngraph::NodeVector{ss1, ss2}, 0); + + f = std::make_shared(ngraph::NodeVector{concat}, ngraph::ParameterVector{source}); + ngraph::pass::StridedSliceOptimization().run_on_function(f); + ngraph::pass::ConstantFolding().run_on_function(f); + } + { + auto source = std::make_shared(ngraph::element::f32, ngraph::Shape{5, 5, 5, 5}); + + auto begin1 = ngraph::opset1::Constant::create(ngraph::element::i64, ngraph::Shape{4}, {0, 0, 0, 0}); + auto end1 = ngraph::opset1::Constant::create(ngraph::element::i64, ngraph::Shape{4}, {-1, -1, -1, -1}); + auto stride1 = ngraph::opset1::Constant::create(ngraph::element::i64, ngraph::Shape{4}, {1}); + std::vector begin_mask1 = {0, 0, 0, 0}; + std::vector end_mask1 = {0, 0, 0, 0}; + auto ss1 = std::make_shared(source, begin1, end1, stride1, begin_mask1, end_mask1); + + auto concat = std::make_shared(ngraph::NodeVector{ss1, ss1}, 0); + + f_ref = std::make_shared(ngraph::NodeVector{concat}, ngraph::ParameterVector{source}); + } + auto res = compare_functions(f, f_ref); + ASSERT_TRUE(res.first) << res.second; +} + +TEST(TransformationTests, OptimizeSS_NotShared_Test) { + std::shared_ptr f(nullptr), f_ref(nullptr); + { + auto source = std::make_shared(ngraph::element::f32, ngraph::Shape{5, 6, 5, 5}); + + auto axis = ngraph::opset1::Constant::create(ngraph::element::i64, ngraph::Shape{}, {1}); + auto split = std::make_shared(source, axis, 2); + + auto begin1 = ngraph::opset1::Constant::create(ngraph::element::i64, ngraph::Shape{4}, {0, 0, 0, 0}); + auto end1 = ngraph::opset1::Constant::create(ngraph::element::i64, ngraph::Shape{4}, {-1, -1, -1, -1}); + auto stride1 = ngraph::opset1::Constant::create(ngraph::element::i64, ngraph::Shape{4}, {1}); + std::vector begin_mask1 = {0, 0, 0, 0}; + std::vector end_mask1 = {0, 0, 0, 0}; + auto ss1 = std::make_shared(split->output(0), begin1, end1, stride1, begin_mask1, end_mask1); + + auto begin2 = ngraph::opset1::Constant::create(ngraph::element::i64, ngraph::Shape{4}, {0, 0, 0, 0}); + auto end2 = ngraph::opset1::Constant::create(ngraph::element::i64, ngraph::Shape{4}, {-1, -1, -1, -1}); + auto stride2 = ngraph::opset1::Constant::create(ngraph::element::i64, ngraph::Shape{4}, {1}); + std::vector begin_mask2 = {0, 0, 0, 0}; + std::vector end_mask2 = {0, 0, 0, 0}; + auto ss2 = std::make_shared(split->output(1), begin2, end2, stride2, begin_mask2, end_mask2); + + auto concat = std::make_shared(ngraph::NodeVector{ss1, ss2}, 0); + + f = std::make_shared(ngraph::NodeVector{concat}, ngraph::ParameterVector{source}); + ngraph::pass::StridedSliceOptimization().run_on_function(f); + ngraph::pass::ConstantFolding().run_on_function(f); + } + { + auto source = std::make_shared(ngraph::element::f32, ngraph::Shape{5, 6, 5, 5}); + + auto axis = ngraph::opset1::Constant::create(ngraph::element::i64, ngraph::Shape{}, {1}); + auto split = std::make_shared(source, axis, 2); + + auto begin1 = ngraph::opset1::Constant::create(ngraph::element::i64, ngraph::Shape{4}, {0, 0, 0, 0}); + auto end1 = ngraph::opset1::Constant::create(ngraph::element::i64, ngraph::Shape{4}, {-1, -1, -1, -1}); + auto stride1 = ngraph::opset1::Constant::create(ngraph::element::i64, ngraph::Shape{4}, {1}); + std::vector begin_mask1 = {0, 0, 0, 0}; + std::vector end_mask1 = {0, 0, 0, 0}; + auto ss1 = std::make_shared(split->output(0), begin1, end1, stride1, begin_mask1, end_mask1); + + auto begin2 = ngraph::opset1::Constant::create(ngraph::element::i64, ngraph::Shape{4}, {0, 0, 0, 0}); + auto end2 = ngraph::opset1::Constant::create(ngraph::element::i64, ngraph::Shape{4}, {-1, -1, -1, -1}); + auto stride2 = ngraph::opset1::Constant::create(ngraph::element::i64, ngraph::Shape{4}, {1}); + std::vector begin_mask2 = {0, 0, 0, 0}; + std::vector end_mask2 = {0, 0, 0, 0}; + auto ss2 = std::make_shared(split->output(1), begin2, end2, stride2, begin_mask2, end_mask2); + + auto concat = std::make_shared(ngraph::NodeVector{ss1, ss2}, 0); + + f_ref = std::make_shared(ngraph::NodeVector{concat}, ngraph::ParameterVector{source}); + } + + auto res = compare_functions(f, f_ref); + ASSERT_TRUE(res.first) << res.second; +} + +TEST(TransformationTests, OptimizeSS_Groupped_Test) { + std::shared_ptr f(nullptr), f_ref(nullptr); + { + auto source = std::make_shared(ngraph::element::f32, ngraph::Shape{5, 5, 5, 5}); + + auto begin1 = ngraph::opset1::Constant::create(ngraph::element::i64, ngraph::Shape{4}, {0, 0, 0, 0}); + auto end1 = ngraph::opset1::Constant::create(ngraph::element::i64, ngraph::Shape{4}, {5, 3, 5, 5}); + auto stride1 = ngraph::opset1::Constant::create(ngraph::element::i64, ngraph::Shape{4}, {1}); + std::vector begin_mask1 = {0, 0, 0, 0}; + std::vector end_mask1 = {0, 0, 0, 0}; + auto ss1 = std::make_shared(source, begin1, end1, stride1, begin_mask1, end_mask1); + + auto begin2 = ngraph::opset1::Constant::create(ngraph::element::i64, ngraph::Shape{4}, {0, 3, 0, 0}); + auto end2 = ngraph::opset1::Constant::create(ngraph::element::i64, ngraph::Shape{4}, {5, 5, 5, 5}); + auto stride2 = ngraph::opset1::Constant::create(ngraph::element::i64, ngraph::Shape{4}, {1}); + std::vector begin_mask2 = {0, 0, 0, 0}; + std::vector end_mask2 = {0, 0, 0, 0}; + auto ss2 = std::make_shared(source, begin2, end2, stride2, begin_mask2, end_mask2); + + auto concat = std::make_shared(ngraph::NodeVector{ss1, ss2}, 1); + + f = std::make_shared(ngraph::NodeVector{concat}, ngraph::ParameterVector{source}); + ngraph::pass::StridedSliceOptimization().run_on_function(f); + ngraph::pass::ConstantFolding().run_on_function(f); + } + { + auto source = std::make_shared(ngraph::element::f32, ngraph::Shape{5, 5, 5, 5}); + + auto axis = ngraph::opset1::Constant::create(ngraph::element::i64, ngraph::Shape{}, {1}); + auto split_sizes = ngraph::opset1::Constant::create(ngraph::element::i64, ngraph::Shape{2}, {3, 2}); + auto variadic_split = std::make_shared(source, axis, split_sizes); + + auto concat = std::make_shared(ngraph::OutputVector{variadic_split->output(0), variadic_split->output(1)}, 1); + + f_ref = std::make_shared(ngraph::NodeVector{concat}, ngraph::ParameterVector{source}); + } + + auto res = compare_functions(f, f_ref); + ASSERT_TRUE(res.first) << res.second; +} diff --git a/inference-engine/tests/functional/inference_engine/transformations/transpose_to_reshape_test.cpp b/inference-engine/tests/functional/inference_engine/transformations/transpose_to_reshape_test.cpp new file mode 100644 index 00000000000..7028797c313 --- /dev/null +++ b/inference-engine/tests/functional/inference_engine/transformations/transpose_to_reshape_test.cpp @@ -0,0 +1,137 @@ +// Copyright (C) 2020 Intel Corporation +// SPDX-License-Identifier: Apache-2.0 +// + +#include + +#include "common_test_utils/test_common.hpp" +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include + +#include "ngraph_test_utils.hpp" + +using namespace testing; + +using InputShape = ngraph::PartialShape; +using TransposeOrder = std::vector; + +struct ReferenceParams { + bool no_changes = false; + bool is_empty = false; + std::vector reshape_value; + + ReferenceParams() = default; + + explicit ReferenceParams(bool no_changes, bool is_empty) : no_changes(no_changes), is_empty(is_empty) {} + + explicit ReferenceParams(const std::vector & reshape_value): reshape_value(reshape_value) {} +}; + +class TransposeToReshapeTests: public CommonTestUtils::TestsCommon, + public testing::WithParamInterface > { +public: + std::shared_ptr f, f_ref; + + void SetUp() override { + const auto& input_shape = std::get<0>(GetParam()); + const auto& transpose_order = std::get<1>(GetParam()); + const auto& reference_params = std::get<2>(GetParam()); + + f = get_initial_function(input_shape, transpose_order); + f_ref = get_reference_function(input_shape, transpose_order, reference_params); + } + +private: + std::shared_ptr get_initial_function(const ngraph::PartialShape & input_shape, + const std::vector & transpose_order) { + auto data = std::make_shared(ngraph::element::f32, input_shape); + auto order_const = ngraph::opset3::Constant::create(ngraph::element::i64, ngraph::Shape{transpose_order.size()}, transpose_order); + auto transpose = std::make_shared(data, order_const); + + // WA to test cases with transpose elimination + auto relu = std::make_shared(transpose); + + return std::make_shared(ngraph::NodeVector{relu}, ngraph::ParameterVector{data}); + } + + std::shared_ptr get_reference_function(const ngraph::PartialShape & input_shape, + const std::vector & transpose_order, + const ReferenceParams & params) { + if (params.no_changes) { + return get_initial_function(input_shape, transpose_order); + } + + auto data = std::make_shared(ngraph::element::f32, input_shape); + + ngraph::Output reshape_dims, last(data); + if (!params.reshape_value.empty()) { + reshape_dims = ngraph::opset3::Constant::create(ngraph::element::i64, ngraph::Shape{params.reshape_value.size()}, params.reshape_value); + } else { + auto shape_of = std::make_shared(data); + reshape_dims = std::make_shared(shape_of, + ngraph::opset3::Constant::create(ngraph::element::i64, ngraph::Shape{transpose_order.size()}, transpose_order), + ngraph::opset3::Constant::create(ngraph::element::i64, ngraph::Shape{1}, {0})); + } + + if (!params.is_empty) { + last = std::make_shared(last, reshape_dims, true); + } + + last = std::make_shared(last); + + return std::make_shared(ngraph::NodeVector{last.get_node_shared_ptr()}, ngraph::ParameterVector{data}); + } +}; + +TEST_P(TransposeToReshapeTests, CompareFunctions) { + ngraph::pass::InitNodeInfo().run_on_function(f); + ngraph::pass::AlgebraicSimplification().run_on_function(f); + ASSERT_NO_THROW(check_rt_info(f)); + auto res = compare_functions(f, f_ref); + ASSERT_TRUE(res.first) << res.second; +} + +#define SAME_FUNCTION ReferenceParams(true, false) +#define EMPTY_FUNCTION ReferenceParams(false, true) +#define SHAPE_OF_GATHER ReferenceParams() + +INSTANTIATE_TEST_CASE_P(KeepTranspose, TransposeToReshapeTests, + testing::Values(std::make_tuple(InputShape{1, 3, 64, 64}, TransposeOrder{0, 1, 3, 2}, SAME_FUNCTION), + std::make_tuple(InputShape{1, 3, 1, 64}, TransposeOrder{2, 0, 3, 1}, SAME_FUNCTION), + std::make_tuple(InputShape{1, 3, 1, 3}, TransposeOrder{3, 0, 2, 1}, SAME_FUNCTION), + std::make_tuple(InputShape{DYN, 2, 64, 1}, TransposeOrder{1, 0, 3, 2}, SAME_FUNCTION), + std::make_tuple(InputShape{DYN, 3}, TransposeOrder{1, 0}, SAME_FUNCTION), + std::make_tuple(InputShape{DYN, DYN, 1}, TransposeOrder{2, 1, 0}, SAME_FUNCTION), + std::make_tuple(InputShape{DYN, DYN}, TransposeOrder{1, 0}, SAME_FUNCTION))); + +INSTANTIATE_TEST_CASE_P(EliminateTranspose, TransposeToReshapeTests, + testing::Values(std::make_tuple(InputShape{1, 3, 64, 64}, TransposeOrder{0, 1, 2, 3}, EMPTY_FUNCTION), + std::make_tuple(InputShape{1, 1, 1}, TransposeOrder{2, 0, 1}, EMPTY_FUNCTION), + std::make_tuple(InputShape{DYN, DYN}, TransposeOrder{0, 1}, EMPTY_FUNCTION))); + +INSTANTIATE_TEST_CASE_P(ReshapeWithConstant, TransposeToReshapeTests, + testing::Values(std::make_tuple(InputShape{1, 3, 64, 1}, TransposeOrder{0, 1, 3, 2}, ReferenceParams({1, 3, 1, 64})), + std::make_tuple(InputShape{1, 3, 1, 64}, TransposeOrder{1, 0, 3, 2}, ReferenceParams({3, 1, 64, 1})), + std::make_tuple(InputShape{DYN, DYN, 1}, TransposeOrder{0, 2, 1}, ReferenceParams({0, 1, -1})), + std::make_tuple(InputShape{1, 1, DYN}, TransposeOrder{2, 1, 0}, ReferenceParams({-1, 1, 1})), + std::make_tuple(InputShape{DYN, 1, 64, 1}, TransposeOrder{1, 0, 3, 2}, ReferenceParams({1, -1, 1, 64})))); + +INSTANTIATE_TEST_CASE_P(ReshapeWithGather, TransposeToReshapeTests, + testing::Values(std::make_tuple(InputShape{DYN, 1, DYN, 1}, TransposeOrder{1, 0, 3, 2}, SHAPE_OF_GATHER), + std::make_tuple(InputShape{1, DYN, DYN, DYN}, TransposeOrder{1, 2, 3, 0}, SHAPE_OF_GATHER))); + +#undef SAME_FUNCTION +#undef EMPTY_FUNCTION +#undef SHAPE_OF_GATHER diff --git a/inference-engine/tests/functional/plugin/cpu/bfloat16/bf16_network_restoring.cpp b/inference-engine/tests/functional/plugin/cpu/bfloat16/bf16_network_restoring.cpp index 3f02f6c41ef..3c352c8f07b 100644 --- a/inference-engine/tests/functional/plugin/cpu/bfloat16/bf16_network_restoring.cpp +++ b/inference-engine/tests/functional/plugin/cpu/bfloat16/bf16_network_restoring.cpp @@ -27,7 +27,7 @@ namespace LayerTestsDefinitions { class BF16NetworkRestore1 : public BasicBF16Test { protected: - std::shared_ptr createGraph(InferenceEngine::Precision netPrecision)override { + std::shared_ptr createGraph(InferenceEngine::Precision netPrecision) override { // + Power1(FP32) // | // + AvgPooling1(FP32) @@ -170,7 +170,7 @@ protected: return std::make_shared(ngraph::NodeVector{eltNode2}, ngraph::ParameterVector{input1}); } - void SetUp()override { + void SetUp() override { std::tie(inputPrecision, netPrecision, inputShapes, newInputShapes, targetDevice) = this->GetParam(); fnPtr = createGraph(netPrecision); diff --git a/inference-engine/tests/functional/plugin/cpu/bfloat16/bfloat16_helpers.hpp b/inference-engine/tests/functional/plugin/cpu/bfloat16/bfloat16_helpers.hpp index 53532c54308..7bb2a554785 100644 --- a/inference-engine/tests/functional/plugin/cpu/bfloat16/bfloat16_helpers.hpp +++ b/inference-engine/tests/functional/plugin/cpu/bfloat16/bfloat16_helpers.hpp @@ -130,7 +130,7 @@ typedef std::tuple< * * class ScaleshiftConv_x3_Eltwise : public BasicBF16Test { * protected: - * void SetUp()override { + * void SetUp() override { * fnPtr = std::make_shared(ngraph::NodeVector{convNode3}, ngraph::ParameterVector{input1}); // STAGE1: @@ -253,12 +253,11 @@ public: // BFloat16Helpers::getMaxAbsValue(lm1.as(), mout1->size()) << std::endl; // std::cout << "Max in fp32 network by output " << outputNameFP32 << ": " << // BFloat16Helpers::getMaxAbsValue(lm2.as(), mout2->size()) << std::endl; - FuncTestUtils::compareRawBuffers(lm1.as(), lm2.as(), mout1->size(), mout2->size(), + FuncTestUtils::CompareType::ABS, threshold); - // Stage2: verification of performance counters std::pair wrongLayer = BFloat16Helpers::matchPerfCountPrecisionVsExpected(req1.GetPerformanceCounts(), expectedPrecisions); diff --git a/inference-engine/tests/functional/plugin/cpu/bfloat16/concat_in_place.cpp b/inference-engine/tests/functional/plugin/cpu/bfloat16/concat_in_place.cpp new file mode 100644 index 00000000000..5037e202fee --- /dev/null +++ b/inference-engine/tests/functional/plugin/cpu/bfloat16/concat_in_place.cpp @@ -0,0 +1,160 @@ +// Copyright (C) 2020 Intel Corporation +// SPDX-License-Identifier: Apache-2.0 +// + +#include "bfloat16_helpers.hpp" + +#include +#include +#include +#include +#include +#include +#include + +#include + +#include "functional_test_utils/blob_utils.hpp" +#include "common_test_utils/common_utils.hpp" + +#include "ngraph/opsets/opset1.hpp" + +using namespace std; +using namespace ngraph; +using namespace InferenceEngine; + +namespace LayerTestsDefinitions { +namespace { + static const int inputSize = 2, concatAxe = 1; + static std::vector paramVector = { + SizeVector({ 1, 1, inputSize, inputSize }), + SizeVector({ 1, 2, inputSize, inputSize }), + SizeVector({ 1, 3, inputSize, inputSize }), + SizeVector({ 1, 4, inputSize, inputSize }), + SizeVector({ 1, 5, inputSize, inputSize }), + SizeVector({ 1, 6, inputSize, inputSize }), + SizeVector({ 1, 7, inputSize, inputSize }), + SizeVector({ 1, 8, inputSize, inputSize }), + SizeVector({ 1, 9, inputSize, inputSize }), + SizeVector({ 1, 10, inputSize, inputSize })}; +} // namespace + +class Concat_in_place : public BasicBF16Test { +protected: + std::shared_ptr createGraph(InferenceEngine::Precision netPrecision) override { + // scaleshift + // / \ + // Conv Conv + // \ / + // concat + // | + // relu + + ngraph::element::Type ntype = (netPrecision == Precision::FP32) ? ngraph::element::f32 : ngraph::element::bf16; + // multiply + auto input1 = std::make_shared(ntype, ngraph::Shape{inputShapes}); + input1->set_friendly_name("Input_1"); + std::shared_ptr const1 = nullptr; + if (netPrecision == Precision::FP32) { + const1 = opset1::Constant::create(ntype, Shape{1}, { 2.0f }); + } else { + const1 = opset1::Constant::create(ntype, Shape{1}, { bfloat16::from_bits(BFloat16Helpers::reducePrecisionBitwiseS(2.0f)) }); + } + auto mulNode = std::make_shared(input1, const1); + + // add + std::shared_ptr const2 = nullptr; + if (netPrecision == Precision::FP32) { + const2 = opset1::Constant::create(ntype, Shape{1}, { 1.0f }); + } else { + const2 = opset1::Constant::create(ntype, Shape{1}, { bfloat16::from_bits(BFloat16Helpers::reducePrecisionBitwiseS(1.0f)) }); + } + auto addNode = std::make_shared(mulNode, const2); + addNode->set_friendly_name("ADD_1"); + + // convolution + std::shared_ptr weightsNode = nullptr; + auto channelsCount = inputShapes[1]; + ngraph::Shape convFilterShape = { channelsCount, channelsCount, 3, 3 }; // out channel, /input channels, kernel h, kernel w + if (netPrecision == Precision::FP32) { + std::vector weightValuesFP32; + weightValuesFP32.resize(channelsCount * channelsCount * 3 * 3); + BFloat16Helpers::fillInputsBySinValues(weightValuesFP32.data(), weightValuesFP32.size()); + weightsNode = std::make_shared(ntype, convFilterShape, weightValuesFP32); + } else { + std::vector weightValuesBF16; + weightValuesBF16.resize(channelsCount * channelsCount * 3 * 3); + BFloat16Helpers::fillInputsBySinValues(weightValuesBF16.data(), weightValuesBF16.size()); + weightsNode = std::make_shared(ntype, convFilterShape, weightValuesBF16.data()); + } + + std::shared_ptr convNode1 = std::make_shared( + addNode, weightsNode, + ngraph::Strides({ 1, 1 }), // strides + ngraph::CoordinateDiff({ 1, 1 }), // pad begin + ngraph::CoordinateDiff({ 1, 1 }), // pad end + ngraph::Strides({ 1, 1 }), // dilation + ngraph::op::PadType::EXPLICIT); // pad type + convNode1->set_friendly_name("CONV_1"); + + std::shared_ptr convNode2 = std::make_shared( + addNode, weightsNode, + ngraph::Strides({ 1, 1 }), // strides + ngraph::CoordinateDiff({ 1, 1 }), // pad begin + ngraph::CoordinateDiff({ 1, 1 }), // pad end + ngraph::Strides({ 1, 1 }), // dilation + ngraph::op::PadType::EXPLICIT); // pad type + convNode2->set_friendly_name("CONV_2"); + + // Concat + ngraph::NodeVector concInputNodes = { convNode1, convNode2 }; + + auto concNode = std::make_shared(concInputNodes, concatAxe); + concNode->set_friendly_name("CONC_1_TEST"); + + // ReLU + auto reluNode = std::make_shared(concNode); + reluNode->set_friendly_name("RELU_1"); + + return std::make_shared(ngraph::NodeVector{reluNode}, ngraph::ParameterVector{input1}); + } + + void SetUp() override { + std::tie(inputPrecision, netPrecision, inputShapes, newInputShapes, targetDevice) = this->GetParam(); + fnPtr = createGraph(netPrecision); + + // STAGE1: + threshold = 10e-1; + // STAGE2: + // filling of expected precision of layer execution defined by precisoin of input tensor to the primitive and reflected in + // performance counters + expectedPrecisions["ADD_1"] = "FP32"; + expectedPrecisions["CONV_1"] = "BF16"; + expectedPrecisions["CONV_2"] = "BF16"; + expectedPrecisions["CONC_1_TEST"] = "FP32"; + expectedPrecisions["RELU_1"] = "FP32"; + } +}; + +TEST_P(Concat_in_place, CompareWithRefImpl) { + test(); +}; + +INSTANTIATE_TEST_CASE_P(FP32_bfloat16_NoReshape, Concat_in_place, + ::testing::Combine( + ::testing::Values(Precision::FP32), + ::testing::Values(Precision::FP32), + ::testing::ValuesIn(paramVector), + ::testing::Values(SizeVector()), + ::testing::Values(CommonTestUtils::DEVICE_CPU)), + Concat_in_place::getTestCaseName); + +INSTANTIATE_TEST_CASE_P(BF16_bfloat16_NoReshape, Concat_in_place, + ::testing::Combine( + ::testing::Values(Precision::FP32), + ::testing::Values(Precision::BF16), + ::testing::ValuesIn(paramVector), + ::testing::Values(SizeVector()), + ::testing::Values(CommonTestUtils::DEVICE_CPU)), + Concat_in_place::getTestCaseName); +} // namespace LayerTestsDefinitions diff --git a/inference-engine/tests/functional/plugin/cpu/bfloat16/conv_add.cpp b/inference-engine/tests/functional/plugin/cpu/bfloat16/conv_add.cpp new file mode 100644 index 00000000000..8f70ce84d02 --- /dev/null +++ b/inference-engine/tests/functional/plugin/cpu/bfloat16/conv_add.cpp @@ -0,0 +1,162 @@ +// Copyright (C) 2020 Intel Corporation +// SPDX-License-Identifier: Apache-2.0 +// + +#include "bfloat16_helpers.hpp" + +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +#include "common_test_utils/common_utils.hpp" + +#include "ngraph/opsets/opset1.hpp" + +using namespace std; +using namespace ngraph; +using namespace InferenceEngine; + +namespace LayerTestsDefinitions { + +class ConvAdd : public BasicBF16Test { +protected: + std::shared_ptr createGraph(InferenceEngine::Precision netPrecision) override { +// Power (FP32) +// | +// Conv(BF16) +// | +// Eltwise (SUM)(BF16) +// | +// Conv (BF16) + + auto channelsCount = inputShapes[1]; + + // STAGE1: construction of the GRAPH + ngraph::element::Type ntype = (netPrecision == Precision::FP32) ? ngraph::element::f32 : ngraph::element::bf16; + // add + auto input1 = std::make_shared(ntype, ngraph::Shape{inputShapes}); + input1->set_friendly_name("Input_1"); + std::shared_ptr eltConst0 = nullptr, eltConst1 = nullptr; + if (netPrecision == Precision::FP32) { + eltConst0 = opset1::Constant::create(ntype, Shape{1}, { 2.0f }); + eltConst1 = opset1::Constant::create(ntype, Shape{1}, { 2.0f }); + } else { + eltConst0 = opset1::Constant::create(ntype, Shape{1}, { bfloat16::from_bits(BFloat16Helpers::reducePrecisionBitwiseS(2.0f)) }); + eltConst1 = opset1::Constant::create(ntype, Shape{1}, { bfloat16::from_bits(BFloat16Helpers::reducePrecisionBitwiseS(2.0f)) }); + } + auto addNode0 = std::make_shared(input1, eltConst0); + addNode0->set_friendly_name("Add_0"); + + // convolution + std::shared_ptr weightsNode0 = nullptr, weightsNode1 = nullptr; + ngraph::Shape convFilterShape = { channelsCount, channelsCount, 3, 3 }; // out channel, /input channels, kernel h, kernel w + if (netPrecision == Precision::FP32) { + std::vector weightValuesFP32; + weightValuesFP32.resize(channelsCount * channelsCount * 3 * 3); + BFloat16Helpers::fillInputsBySinValues(weightValuesFP32.data(), weightValuesFP32.size()); + weightsNode0 = std::make_shared(ntype, convFilterShape, weightValuesFP32); + weightsNode1 = std::make_shared(ntype, convFilterShape, weightValuesFP32); + } else { + std::vector weightValuesBF16; + weightValuesBF16.resize(channelsCount * channelsCount * 3 * 3); + BFloat16Helpers::fillInputsBySinValues(weightValuesBF16.data(), weightValuesBF16.size()); + weightsNode0 = std::make_shared(ntype, convFilterShape, weightValuesBF16.data()); + weightsNode1 = std::make_shared(ntype, convFilterShape, weightValuesBF16.data()); + } + + std::shared_ptr convNode0 = std::make_shared( + addNode0, weightsNode0, + ngraph::Strides({ 1, 1 }), // strides + ngraph::CoordinateDiff({ 1, 1 }), // pad begin + ngraph::CoordinateDiff({ 1, 1 }), // pad end + ngraph::Strides({ 1, 1 }), // dilation + ngraph::op::PadType::EXPLICIT); // pad type + convNode0->set_friendly_name("Convolution_0"); + + // eltwise, i.e. sum + auto eltSumNode = std::make_shared(convNode0, eltConst1); + eltSumNode->set_friendly_name("Elt_sum"); + + // convolution + std::shared_ptr convNode1 = std::make_shared( + eltSumNode, weightsNode1, + ngraph::Strides({ 1, 1 }), // strides + ngraph::CoordinateDiff({ 1, 1 }), // pad begin + ngraph::CoordinateDiff({ 1, 1 }), // pad end + ngraph::Strides({ 1, 1 }), // dilation + ngraph::op::PadType::EXPLICIT); // pad type + convNode1->set_friendly_name("Convolution_1"); + + return std::make_shared(convNode1, ngraph::ParameterVector{input1}); + } + void SetUp() override { + std::tie(inputPrecision, netPrecision, inputShapes, newInputShapes, targetDevice) = this->GetParam(); + fnPtr = createGraph(netPrecision); + + // STAGE2: set up safe threshold <= 5% from maximum value of output tensor + + // 256 channels + // threshold = 0.26f; // Max in fp32 network by output: 5.26852 + + // 3 channels + threshold = 0.2f; // Max in fp32 network by output: 4.90418 + + // STAGE3: + // filling of expected precision of layer execution defined by precisoin of input tensor to the primitive and reflected in + // performance counters + expectedPrecisions["Convolution_0"] = "BF16"; + expectedPrecisions["Convolution_1"] = "BF16"; + expectedPrecisions["Elt_sum"] = "FP32"; + } +}; + +TEST_P(ConvAdd, CompareWithRefImpl) { + test(); +}; + +// CPU plug-in failure in that case + +//INSTANTIATE_TEST_CASE_P(FP32_bfloat16_NoReshape, ConvAdd, +// ::testing::Combine( +// ::testing::Values(Precision::FP32), +// ::testing::Values(Precision::FP32), +// ::testing::Values(SizeVector({1, 256, 38, 38})), +// ::testing::Values(SizeVector()), +// ::testing::Values(CommonTestUtils::DEVICE_CPU)), +// ConvAdd::getTestCaseName); +// +//INSTANTIATE_TEST_CASE_P(BF16_bfloat16_NoReshape, ConvAdd, +// ::testing::Combine( +// ::testing::Values(Precision::FP32), +// ::testing::Values(Precision::BF16), +// ::testing::Values(SizeVector({1, 256, 38, 38})), +// ::testing::Values(SizeVector()), +// ::testing::Values(CommonTestUtils::DEVICE_CPU)), +// ConvAdd::getTestCaseName); + +INSTANTIATE_TEST_CASE_P(FP32_bfloat16_NoReshape, ConvAdd, + ::testing::Combine( + ::testing::Values(Precision::FP32), + ::testing::Values(Precision::FP32), + ::testing::Values(SizeVector({1, 3, 38, 38})), + ::testing::Values(SizeVector()), + ::testing::Values(CommonTestUtils::DEVICE_CPU)), + ConvAdd::getTestCaseName); + +INSTANTIATE_TEST_CASE_P(BF16_bfloat16_NoReshape, ConvAdd, + ::testing::Combine( + ::testing::Values(Precision::FP32), + ::testing::Values(Precision::BF16), + ::testing::Values(SizeVector({1, 3, 38, 38})), + ::testing::Values(SizeVector()), + ::testing::Values(CommonTestUtils::DEVICE_CPU)), + ConvAdd::getTestCaseName); + +} // namespace LayerTestsDefinitions diff --git a/inference-engine/tests/functional/plugin/cpu/bfloat16/conv_conv.cpp b/inference-engine/tests/functional/plugin/cpu/bfloat16/conv_conv.cpp index a55c7e1378f..4db4d9f3771 100644 --- a/inference-engine/tests/functional/plugin/cpu/bfloat16/conv_conv.cpp +++ b/inference-engine/tests/functional/plugin/cpu/bfloat16/conv_conv.cpp @@ -27,15 +27,16 @@ namespace LayerTestsDefinitions { class ConvConv : public BasicBF16Test { protected: - std::shared_ptr createGraph(InferenceEngine::Precision netPrecision)override { + std::shared_ptr createGraph(InferenceEngine::Precision netPrecision) override { // ScaleShift (FP32) // | // Conv (BF16) // | // Conv (BF16) + ngraph::element::Type ntype = (netPrecision == Precision::FP32) ? ngraph::element::f32 : ngraph::element::bf16; // multiply - auto input1 = std::make_shared(ngraph::element::f32, ngraph::Shape{1, 3, 40, 40}); + auto input1 = std::make_shared(ngraph::element::f32, ngraph::Shape{inputShapes}); auto const1 = opset1::Constant::create(ngraph::element::f32, Shape{1}, { 2.0f }); auto mulNode = std::make_shared(input1, const1); @@ -45,11 +46,22 @@ protected: addNode->set_friendly_name("ADD_1"); // convolution - ngraph::Shape convFilterShape = { 3, 3, 3, 3 }; // out channel, /input channels, kernel h, kernel w - std::vector weightValues; - weightValues.resize(3 * 3 * 3 * 3); - BFloat16Helpers::fillInputsBySinValues(weightValues.data(), weightValues.size()); - auto weightsNode = std::make_shared(ngraph::element::f32, convFilterShape, weightValues); + std::shared_ptr weightsNode = nullptr; + + auto channelsCount = inputShapes[1]; + + ngraph::Shape convFilterShape = { channelsCount, channelsCount, 3, 3 }; // out channel, /input channels, kernel h, kernel w + if (netPrecision == Precision::FP32) { + std::vector weightValuesFP32; + weightValuesFP32.resize(channelsCount * channelsCount * 3 * 3); + BFloat16Helpers::fillInputsBySinValues(weightValuesFP32.data(), weightValuesFP32.size()); + weightsNode = std::make_shared(ntype, convFilterShape, weightValuesFP32); + } else { + std::vector weightValuesBF16; + weightValuesBF16.resize(channelsCount * channelsCount * 3 * 3); + BFloat16Helpers::fillInputsBySinValues(weightValuesBF16.data(), weightValuesBF16.size()); + weightsNode = std::make_shared(ntype, convFilterShape, weightValuesBF16.data()); + } std::shared_ptr convNode1 = std::make_shared( addNode, weightsNode, @@ -61,9 +73,9 @@ protected: convNode1->set_friendly_name("CONV_1"); // Convolution - ngraph::Shape convFilterShape2 = { 3, 3, 3, 3 }; // out channel, /input channels, kernel h, kernel w + ngraph::Shape convFilterShape2 = { channelsCount, channelsCount, 3, 3 }; // out channel, /input channels, kernel h, kernel w std::vector weightValues2; - weightValues2.resize(3 * 3 * 3 * 3); + weightValues2.resize(channelsCount * channelsCount * 3 * 3); BFloat16Helpers::fillInputsBySinValues(weightValues2.data(), weightValues2.size()); auto weightsNode2 = std::make_shared(ngraph::element::f32, convFilterShape2, weightValues2); std::shared_ptr convNode2 = std::make_shared( @@ -77,13 +89,12 @@ protected: return std::make_shared(ngraph::NodeVector{convNode2}, ngraph::ParameterVector{input1}); } - void SetUp()override { + void SetUp() override { std::tie(inputPrecision, netPrecision, inputShapes, newInputShapes, targetDevice) = this->GetParam(); fnPtr = createGraph(netPrecision); // STAGE1: - // the maximum values in the latest tensor for this test is 24.4. It would be safe to set threshold eq to 0.1 - threshold = 0.3f; + threshold = 1.0f; // Max in fp32 network by output CONV_2: 49.3427 // STAGE2: // filling of expected precision of layer execution defined by precisoin of input tensor to the primitive and reflected in // performance counters diff --git a/inference-engine/tests/functional/plugin/cpu/bfloat16/conv_dwconv_relu.cpp b/inference-engine/tests/functional/plugin/cpu/bfloat16/conv_dwconv_relu.cpp index 1ab6f50ec0a..051c9bd843e 100644 --- a/inference-engine/tests/functional/plugin/cpu/bfloat16/conv_dwconv_relu.cpp +++ b/inference-engine/tests/functional/plugin/cpu/bfloat16/conv_dwconv_relu.cpp @@ -19,7 +19,7 @@ namespace LayerTestsDefinitions { class ConvDWConvReLU : public BasicBF16Test { protected: - std::shared_ptr createGraph(InferenceEngine::Precision netPrecision)override { + std::shared_ptr createGraph(InferenceEngine::Precision netPrecision) override { // scaleshift (FP32) // | // Conv (BF16) @@ -28,11 +28,10 @@ protected: // | // ReLU (Fused Info DW convolution) - // multiply ngraph::element::Type ntype = (netPrecision == Precision::FP32) ? ngraph::element::f32 : ngraph::element::bf16; // multiply - auto input1 = std::make_shared(ntype, ngraph::Shape{1, 3, 40, 40}); + auto input1 = std::make_shared(ntype, ngraph::Shape{inputShapes}); input1->set_friendly_name("Input_1"); std::shared_ptr const1 = nullptr; if (netPrecision == Precision::FP32) { @@ -53,16 +52,18 @@ protected: addNode->set_friendly_name("ADD_1"); // convolution + auto channelsCount = inputShapes[1]; + std::shared_ptr weightsNode = nullptr; - ngraph::Shape convFilterShape = { 3, 3, 3, 3 }; // out channel, /input channels, kernel h, kernel w + ngraph::Shape convFilterShape = { channelsCount, channelsCount, 3, 3 }; // out channel, /input channels, kernel h, kernel w if (netPrecision == Precision::FP32) { std::vector weightValuesFP32; - weightValuesFP32.resize(3 * 3 * 3 * 3); + weightValuesFP32.resize(channelsCount * channelsCount * 3 * 3); BFloat16Helpers::fillInputsBySinValues(weightValuesFP32.data(), weightValuesFP32.size()); weightsNode = std::make_shared(ntype, convFilterShape, weightValuesFP32); } else { std::vector weightValuesBF16; - weightValuesBF16.resize(3 * 3 * 3 * 3); + weightValuesBF16.resize(channelsCount * channelsCount * 3 * 3); BFloat16Helpers::fillInputsBySinValues(weightValuesBF16.data(), weightValuesBF16.size()); weightsNode = std::make_shared(ntype, convFilterShape, weightValuesBF16.data()); } @@ -78,15 +79,15 @@ protected: // DW convolution std::shared_ptr weightsNode2 = nullptr; - ngraph::Shape convFilterShape2 = { 3, 1, 1, 3, 3 }; // out channel, /input channels, kernel h, kernel w + ngraph::Shape convFilterShape2 = { channelsCount, 1, 1, 3, 3 }; if (netPrecision == Precision::FP32) { std::vector weightValues2FP32; - weightValues2FP32.resize(3 * 1 * 1 * 3 * 3); + weightValues2FP32.resize(channelsCount * 1 * 1 * 3 * 3); BFloat16Helpers::fillInputsBySinValues(weightValues2FP32.data(), weightValues2FP32.size()); weightsNode2 = std::make_shared(ntype, convFilterShape2, weightValues2FP32); } else { std::vector weightValues2BF16; - weightValues2BF16.resize(3 * 1 * 1 * 3 * 3); + weightValues2BF16.resize(channelsCount * 1 * 1 * 3 * 3); BFloat16Helpers::fillInputsBySinValues(weightValues2BF16.data(), weightValues2BF16.size()); weightsNode2 = std::make_shared(ntype, convFilterShape2, weightValues2BF16.data()); } @@ -106,7 +107,7 @@ protected: return std::make_shared(reluNode2, ngraph::ParameterVector{input1}); } - void SetUp()override { + void SetUp() override { std::tie(inputPrecision, netPrecision, inputShapes, newInputShapes, targetDevice) = this->GetParam(); fnPtr = createGraph(netPrecision); diff --git a/inference-engine/tests/functional/plugin/cpu/bfloat16/conv_eltwise_depthwise.cpp b/inference-engine/tests/functional/plugin/cpu/bfloat16/conv_eltwise_depthwise.cpp new file mode 100644 index 00000000000..dc9aec4f9c8 --- /dev/null +++ b/inference-engine/tests/functional/plugin/cpu/bfloat16/conv_eltwise_depthwise.cpp @@ -0,0 +1,256 @@ +// Copyright (C) 2020 Intel Corporation +// SPDX-License-Identifier: Apache-2.0 +// + +#include "bfloat16_helpers.hpp" + +#include +#include +#include +#include +#include +#include +#include + +#include + +#include "functional_test_utils/blob_utils.hpp" +#include "common_test_utils/common_utils.hpp" +#include "functional_test_utils/layer_test_utils.hpp" +#include "ngraph/opsets/opset1.hpp" + +using namespace std; +using namespace ngraph; +using namespace InferenceEngine; + +namespace LayerTestsDefinitions { +typedef std::tuple< Precision, SizeVector, string, size_t, CoordinateDiff, string> convEltwiseDepthwiseTestParamsSet; + +class ConvEltwiseDepthwise : + public testing::WithParamInterface, public LayerTestsUtils::LayerTestsCommon { +public: + std::shared_ptr fnPtr; + SizeVector inputShapes; + std::map expectedPrecisions; + float threshold = 3e-2; + Precision netPrecision; + size_t kernel; + CoordinateDiff pads; + string mkldnnPrimitive; + +protected: + std::shared_ptr createGraph(InferenceEngine::Precision netPrecision) { + // scaleshift (FP32) + // | + // Conv (BF16) + // | + // Relu (Eltwise Fused into Conv) + // | + // scaleshift (Depthwise Fused into Conv) + + element::Type ntype = (netPrecision == Precision::FP32) ? element::f32 : element::bf16; + size_t chCnt = inputShapes[1]; + + // multiply + auto input1 = std::make_shared(ntype, Shape{ inputShapes }); + input1->set_friendly_name("Input_1"); + std::shared_ptr const1 = nullptr; + if (netPrecision == Precision::FP32) { + const1 = opset1::Constant::create(ntype, Shape{ 1 }, { 2.0f }); + } else { + const1 = opset1::Constant::create(ntype, Shape{ 1 }, { bfloat16::from_bits(BFloat16Helpers::reducePrecisionBitwiseS(2.0f)) }); + } + auto mulNode = std::make_shared(input1, const1); + + // add + std::shared_ptr const2 = nullptr; + if (netPrecision == Precision::FP32) { + const2 = opset1::Constant::create(ntype, Shape{ 1 }, { 1.0f }); + } else { + const2 = opset1::Constant::create(ntype, Shape{ 1 }, { bfloat16::from_bits(BFloat16Helpers::reducePrecisionBitwiseS(1.0f)) }); + } + auto addNode = std::make_shared(mulNode, const2); + addNode->set_friendly_name("SS_1"); + + // convolution + std::shared_ptr weightsNode = nullptr; + Shape convFilterShape = { chCnt, chCnt, kernel, kernel }; // out channel, /input channels, kernel h, kernel w + if (netPrecision == Precision::FP32) { + std::vector weightValuesFP32; + weightValuesFP32.resize(chCnt * chCnt * kernel * kernel); + BFloat16Helpers::fillInputsBySinValues(weightValuesFP32.data(), weightValuesFP32.size()); + weightsNode = std::make_shared(ntype, convFilterShape, weightValuesFP32); + } else { + std::vector weightValuesBF16; + weightValuesBF16.resize(chCnt * chCnt * kernel * kernel); + BFloat16Helpers::fillInputsBySinValues(weightValuesBF16.data(), weightValuesBF16.size()); + weightsNode = std::make_shared(ntype, convFilterShape, weightValuesBF16.data()); + } + + std::shared_ptr convNode1 = std::make_shared( + addNode, weightsNode, Strides({ 1, 1 }), pads, pads, Strides({ 1, 1 }), op::PadType::EXPLICIT); + convNode1->set_friendly_name("CONV"); + + // Eltwise, i.e. Relu + auto reluNode = std::make_shared(convNode1); + reluNode->set_friendly_name("RELU"); + + // multiply + std::shared_ptr const3 = nullptr; + if (netPrecision == Precision::FP32) { + const3 = opset1::Constant::create(ntype, Shape{ 1, chCnt, 1, 1 }, { 3.0f }); + } else { + const3 = opset1::Constant::create(ntype, Shape{ 1, chCnt, 1, 1 }, { bfloat16::from_bits(BFloat16Helpers::reducePrecisionBitwiseS(3.0f)) }); + } + auto mulNode2 = std::make_shared(reluNode, const3); + + // add + std::shared_ptr const4 = nullptr; + if (netPrecision == Precision::FP32) { + const4 = opset1::Constant::create(ntype, Shape{ 1, chCnt, 1, 1 }, { 2.0f }); + } else { + const4 = opset1::Constant::create(ntype, Shape{ 1, chCnt, 1, 1 }, { bfloat16::from_bits(BFloat16Helpers::reducePrecisionBitwiseS(2.0f)) }); + } + auto addNode2 = std::make_shared(mulNode2, const4); + addNode2->set_friendly_name("SS_2"); + + return std::make_shared(NodeVector{ addNode2 }, ParameterVector{ input1 }); + } +public: + static string getTestCaseName(testing::TestParamInfo obj) { + Precision netPrecision; + SizeVector inputShapes; + string targetDevice; + size_t kernel; + CoordinateDiff pads; + string mkldnnPrimitive; + std::tie(netPrecision, inputShapes, targetDevice, kernel, pads, mkldnnPrimitive) = obj.param; + + std::ostringstream result; + result << "IS=" << CommonTestUtils::vec2str(inputShapes) << "_"; + result << "netPRC=" << netPrecision.name() << "_"; + result << "mkldnnPrimitive=" << mkldnnPrimitive << "_"; + result << "targetDevice=" << targetDevice; + return result.str(); + } + + void Run_test() { + if (!InferenceEngine::with_cpu_x86_bfloat16()) { + // on platforms which do not support bfloat16, we are disabling bf16 tests since there are no bf16 primitives, + // tests are useless on such platforms + return; + } + std::tie(netPrecision, inputShapes, targetDevice, kernel, pads, mkldnnPrimitive) = this->GetParam(); + InferenceEngine::CNNNetwork cnnNet(fnPtr); + + for (const auto& inputItem : cnnNet.getInputsInfo()) { + inputItem.second->setPrecision(Precision::FP32); + } + + string inputName = cnnNet.getInputsInfo().begin()->first; + string outputName = cnnNet.getOutputsInfo().begin()->first; + auto ie = InferenceEngine::Core(); + // BF16 inference + std::map options; + if (netPrecision == InferenceEngine::Precision::FP32) { + options[InferenceEngine::PluginConfigParams::KEY_ENFORCE_BF16] = InferenceEngine::PluginConfigParams::YES; + } else { + options[InferenceEngine::PluginConfigParams::KEY_ENFORCE_BF16] = InferenceEngine::PluginConfigParams::NO; + } + options[InferenceEngine::PluginConfigParams::KEY_PERF_COUNT] = InferenceEngine::PluginConfigParams::YES; + options[InferenceEngine::PluginConfigParams::KEY_DUMP_EXEC_GRAPH_AS_DOT] = "egraph_test"; + + auto exec_net1 = ie.LoadNetwork(cnnNet, targetDevice, options); + auto req1 = exec_net1.CreateInferRequest(); + + InferenceEngine::Blob::Ptr inBlob1 = req1.GetBlob(inputName); + BFloat16Helpers::fillInputsBySinValues(inBlob1); + + req1.Infer(); + auto outBlobBF16 = req1.GetBlob(outputName); + InferenceEngine::MemoryBlob::CPtr mout1 = InferenceEngine::as(outBlobBF16); + ASSERT_NE(mout1, nullptr); + auto lm1 = mout1->rmap(); + + // FP32 infrence + // if netPrecision is not eq to the FP32 - change network precision and recreate network + InferenceEngine::CNNNetwork cnnNetFP32(createGraph(InferenceEngine::Precision::FP32)); + string inputNameFP32 = cnnNetFP32.getInputsInfo().begin()->first; + string outputNameFP32 = cnnNetFP32.getOutputsInfo().begin()->first; + for (const auto& inputItem : cnnNetFP32.getInputsInfo()) { + inputItem.second->setPrecision(Precision::FP32); + } + auto exec_net2 = ie.LoadNetwork(cnnNetFP32, targetDevice, + { { InferenceEngine::PluginConfigParams::KEY_ENFORCE_BF16, InferenceEngine::PluginConfigParams::NO } }); + auto req2 = exec_net2.CreateInferRequest(); + + req2.SetBlob(inputNameFP32, inBlob1); + + req2.Infer(); + auto outBlobFP32 = req2.GetBlob(outputNameFP32); + InferenceEngine::MemoryBlob::CPtr mout2 = InferenceEngine::as(outBlobFP32); + ASSERT_NE(mout2, nullptr); + auto lm2 = mout2->rmap(); + + FuncTestUtils::compareRawBuffers(lm1.as(), lm2.as(), mout1->size(), mout2->size(), + FuncTestUtils::CompareType::ABS_AND_REL, + threshold, threshold); + + // Stage2: verification of performance counters + std::pair wrongLayer = + BFloat16Helpers::matchPerfCountPrecisionVsExpected(req1.GetPerformanceCounts(), expectedPrecisions); + if (wrongLayer.first != string("")) { + string layerInPerfCounts = wrongLayer.first + " " + wrongLayer.second; + string layerExpected = wrongLayer.first + " " + expectedPrecisions[wrongLayer.first]; + ASSERT_EQ(layerInPerfCounts, layerExpected); + } + fnPtr.reset(); + } + + void SetUp() override { + std::vector inputShape; + std::tie(netPrecision, inputShapes, targetDevice, kernel, pads, mkldnnPrimitive) = this->GetParam(); + fnPtr = createGraph(netPrecision); + + expectedPrecisions["SS_1"] = "FP32"; + expectedPrecisions["CONV"] = mkldnnPrimitive; + expectedPrecisions["RELU"] = "ndef"; + expectedPrecisions["SS_2"] = "ndef"; + } +}; + +TEST_P(ConvEltwiseDepthwise, CompareWithRefImpl) { + Run_test(); +}; + +INSTANTIATE_TEST_CASE_P(FP32_bfloat16_1x1_depthwise_BF16, ConvEltwiseDepthwise, + ::testing::Combine( + ::testing::Values(Precision::FP32), + ::testing::Values(SizeVector({ 1, 5, 1, 1 })), + ::testing::Values(CommonTestUtils::DEVICE_CPU), + ::testing::Values(size_t(1)), + ::testing::Values(CoordinateDiff({ 0, 0 })), + ::testing::Values(string("jit_avx512_1x1_BF16"))), + ConvEltwiseDepthwise::getTestCaseName); + +INSTANTIATE_TEST_CASE_P(FP32_bfloat16_gemm_depthwise_BF16, ConvEltwiseDepthwise, + ::testing::Combine( + ::testing::Values(Precision::FP32), + ::testing::Values(SizeVector({ 1, 3, 10, 10 })), + ::testing::Values(CommonTestUtils::DEVICE_CPU), + ::testing::Values(size_t(3)), + ::testing::Values(CoordinateDiff({ 1, 1 })), + ::testing::Values(string("jit_gemm_BF16"))), + ConvEltwiseDepthwise::getTestCaseName); + +INSTANTIATE_TEST_CASE_P(FP32_bfloat16_conv_depthwise_BF16, ConvEltwiseDepthwise, + ::testing::Combine( + ::testing::Values(Precision::FP32), + ::testing::Values(SizeVector({ 1, 5, 10, 10 })), + ::testing::Values(CommonTestUtils::DEVICE_CPU), + ::testing::Values(size_t(3)), + ::testing::Values(CoordinateDiff({ 0, 0 })), + ::testing::Values(string("jit_avx512_BF16"))), + ConvEltwiseDepthwise::getTestCaseName); + +} // namespace LayerTestsDefinitions diff --git a/inference-engine/tests/functional/plugin/cpu/bfloat16/conv_relu_pool_conv_relu_pool.cpp b/inference-engine/tests/functional/plugin/cpu/bfloat16/conv_relu_pool_conv_relu_pool.cpp index 8ec2cfd2e33..49d47e6218a 100644 --- a/inference-engine/tests/functional/plugin/cpu/bfloat16/conv_relu_pool_conv_relu_pool.cpp +++ b/inference-engine/tests/functional/plugin/cpu/bfloat16/conv_relu_pool_conv_relu_pool.cpp @@ -27,7 +27,7 @@ namespace LayerTestsDefinitions { class ConvReLUPoolConvReLUPool : public BasicBF16Test { protected: - std::shared_ptr createGraph(InferenceEngine::Precision netPrecision)override { + std::shared_ptr createGraph(InferenceEngine::Precision netPrecision) override { // Convolution1 (FP32) // | // ReLU1 (Fused) @@ -46,21 +46,23 @@ protected: // STAGE1: construction of the GRAPH ngraph::element::Type ntype = (netPrecision == Precision::FP32) ? ngraph::element::f32 : ngraph::element::bf16; + auto channelsCount = inputShapes[1]; + // multiply - auto input1 = std::make_shared(ntype, ngraph::Shape{1, 3, 40, 40}); + auto input1 = std::make_shared(ntype, ngraph::Shape{inputShapes}); input1->set_friendly_name("Input_1"); // convolution1 std::shared_ptr weightsNode = nullptr; - ngraph::Shape convFilterShape = { 3, 3, 3, 3 }; // out channel, /input channels, kernel h, kernel w + ngraph::Shape convFilterShape = { channelsCount, channelsCount, 3, 3 }; // out channel, /input channels, kernel h, kernel w if (netPrecision == Precision::FP32) { std::vector weightValuesFP32; - weightValuesFP32.resize(3 * 3 * 3 * 3); + weightValuesFP32.resize(channelsCount * channelsCount * 3 * 3); BFloat16Helpers::fillInputsBySinValues(weightValuesFP32.data(), weightValuesFP32.size()); weightsNode = std::make_shared(ntype, convFilterShape, weightValuesFP32); } else { std::vector weightValuesBF16; - weightValuesBF16.resize(3 * 3 * 3 * 3); + weightValuesBF16.resize(channelsCount * channelsCount * 3 * 3); BFloat16Helpers::fillInputsBySinValues(weightValuesBF16.data(), weightValuesBF16.size()); weightsNode = std::make_shared(ntype, convFilterShape, weightValuesBF16.data()); } @@ -90,15 +92,15 @@ protected: // convolution2 std::shared_ptr weightsNode2 = nullptr; - ngraph::Shape convFilterShape2 = { 3, 3, 3, 3 }; // out channel, /input channels, kernel h, kernel w + ngraph::Shape convFilterShape2 = { channelsCount, channelsCount, 3, 3 }; // out channel, /input channels, kernel h, kernel w if (netPrecision == Precision::FP32) { std::vector weightValuesFP32; - weightValuesFP32.resize(3 * 3 * 3 * 3); + weightValuesFP32.resize(channelsCount * channelsCount * 3 * 3); BFloat16Helpers::fillInputsBySinValues(weightValuesFP32.data(), weightValuesFP32.size()); weightsNode2 = std::make_shared(ntype, convFilterShape2, weightValuesFP32); } else { std::vector weightValuesBF16; - weightValuesBF16.resize(3 * 3 * 3 * 3); + weightValuesBF16.resize(channelsCount * channelsCount * 3 * 3); BFloat16Helpers::fillInputsBySinValues(weightValuesBF16.data(), weightValuesBF16.size()); weightsNode2 = std::make_shared(ntype, convFilterShape2, weightValuesBF16.data()); } @@ -127,15 +129,15 @@ protected: // convolution3 std::shared_ptr weightsNode3 = nullptr; - ngraph::Shape convFilterShape3 = { 3, 3, 3, 3 }; // out channel, /input channels, kernel h, kernel w + ngraph::Shape convFilterShape3 = { channelsCount, channelsCount, 3, 3 }; // out channel, /input channels, kernel h, kernel w if (netPrecision == Precision::FP32) { std::vector weightValuesFP32; - weightValuesFP32.resize(3 * 3 * 3 * 3); + weightValuesFP32.resize(channelsCount * channelsCount * 3 * 3); BFloat16Helpers::fillInputsBySinValues(weightValuesFP32.data(), weightValuesFP32.size()); weightsNode3 = std::make_shared(ntype, convFilterShape3, weightValuesFP32); } else { std::vector weightValuesBF16; - weightValuesBF16.resize(3 * 3 * 3 * 3); + weightValuesBF16.resize(channelsCount * channelsCount * 3 * 3); BFloat16Helpers::fillInputsBySinValues(weightValuesBF16.data(), weightValuesBF16.size()); weightsNode3 = std::make_shared(ntype, convFilterShape3, weightValuesBF16.data()); } @@ -149,12 +151,9 @@ protected: ngraph::op::PadType::EXPLICIT); // pad type convNode3->set_friendly_name("Convolution_3"); - - - return std::make_shared(ngraph::NodeVector{convNode3}, ngraph::ParameterVector{input1}); } - void SetUp()override { + void SetUp() override { std::tie(inputPrecision, netPrecision, inputShapes, newInputShapes, targetDevice) = this->GetParam(); fnPtr = createGraph(netPrecision); diff --git a/inference-engine/tests/functional/plugin/cpu/bfloat16/elt_max.cpp b/inference-engine/tests/functional/plugin/cpu/bfloat16/elt_max.cpp new file mode 100644 index 00000000000..5c8e3924974 --- /dev/null +++ b/inference-engine/tests/functional/plugin/cpu/bfloat16/elt_max.cpp @@ -0,0 +1,151 @@ +// Copyright (C) 2020 Intel Corporation +// SPDX-License-Identifier: Apache-2.0 +// + +#include "bfloat16_helpers.hpp" + +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +#include "common_test_utils/common_utils.hpp" + +#include "ngraph/opsets/opset1.hpp" + +using namespace std; +using namespace ngraph; +using namespace InferenceEngine; + +namespace LayerTestsDefinitions { + +class Elt_max : public BasicBF16Test { +protected: + std::shared_ptr createGraph(InferenceEngine::Precision netPrecision) override { +// Power (FP32) +// | +// Conv(BF16) Const(FP32) +// | / +// Eltwise(MAX)(FP32) +// | +// Conv(BF16) + + // STAGE1: construction of the GRAPH + ngraph::element::Type ntype = (netPrecision == Precision::FP32) ? ngraph::element::f32 : ngraph::element::bf16; + auto channelsCount = inputShapes[1]; + const int conv0OutputChannels = 1; + + // add + auto input1 = std::make_shared(ntype, ngraph::Shape{inputShapes}); + input1->set_friendly_name("Input_1"); + std::shared_ptr powerConst = nullptr; + if (netPrecision == Precision::FP32) { + powerConst = opset1::Constant::create(ntype, Shape{1}, { 2.0f }); + } else { + powerConst = opset1::Constant::create(ntype, Shape{1}, { bfloat16::from_bits(BFloat16Helpers::reducePrecisionBitwiseS(2.0f)) }); + } + auto powerNode0 = std::make_shared(input1, powerConst); + powerNode0->set_friendly_name("Power_0"); + + // convolution + std::shared_ptr weightsNode0 = nullptr, weightsNode1 = nullptr; + ngraph::Shape convFilterShape0 = { conv0OutputChannels, channelsCount, 3, 3 }; // out channel, /input channels, kernel h, kernel w + ngraph::Shape convFilterShape1 = { 1, conv0OutputChannels, 3, 3 }; // out channel, /input channels, kernel h, kernel w + if (netPrecision == Precision::FP32) { + std::vector weightValuesFP32_0, weightValuesFP32_1; + weightValuesFP32_0.resize(conv0OutputChannels * channelsCount * 3 * 3); + weightValuesFP32_1.resize(1 * conv0OutputChannels * 3 * 3); + BFloat16Helpers::fillInputsBySinValues(weightValuesFP32_0.data(), weightValuesFP32_0.size()); + BFloat16Helpers::fillInputsBySinValues(weightValuesFP32_1.data(), weightValuesFP32_1.size()); + weightsNode0 = std::make_shared(ntype, convFilterShape0, weightValuesFP32_0); + weightsNode1 = std::make_shared(ntype, convFilterShape1, weightValuesFP32_1); + } else { + std::vector weightValuesBF16_0, weightValuesBF16_1; + weightValuesBF16_0.resize(conv0OutputChannels * channelsCount * 3 * 3); + weightValuesBF16_1.resize(1 * conv0OutputChannels * 3 * 3); + BFloat16Helpers::fillInputsBySinValues(weightValuesBF16_0.data(), weightValuesBF16_0.size()); + BFloat16Helpers::fillInputsBySinValues(weightValuesBF16_1.data(), weightValuesBF16_1.size()); + weightsNode0 = std::make_shared(ntype, convFilterShape0, weightValuesBF16_0.data()); + weightsNode1 = std::make_shared(ntype, convFilterShape1, weightValuesBF16_1.data()); + } + + std::shared_ptr convNode0 = std::make_shared( + powerNode0, weightsNode0, + ngraph::Strides({ 1, 1 }), // strides + ngraph::CoordinateDiff({ 1, 1 }), // pad begin + ngraph::CoordinateDiff({ 1, 1 }), // pad end + ngraph::Strides({ 1, 1 }), // dilation + ngraph::op::PadType::EXPLICIT); // pad type + convNode0->set_friendly_name("Convolution_0"); + + // Eltwise, i.e. Max + std::shared_ptr maxConst = nullptr; + auto batchSize = inputShapes[0]; + auto heightSize = inputShapes[2]; + auto widthSize = inputShapes[3]; + if (netPrecision == Precision::FP32) { + maxConst = opset1::Constant::create(ntype, Shape{batchSize, conv0OutputChannels, heightSize, widthSize}, { 2.0f }); + } else { + maxConst = opset1::Constant::create(ntype, Shape{batchSize, conv0OutputChannels, heightSize, widthSize}, + { bfloat16::from_bits(BFloat16Helpers::reducePrecisionBitwiseS(2.0f)) }); + } + maxConst->set_friendly_name("Max_const"); + auto eltMaxNode = std::make_shared(convNode0, maxConst); + eltMaxNode->set_friendly_name("Elt_max"); + + std::shared_ptr convNode1 = std::make_shared( + eltMaxNode, weightsNode1, + ngraph::Strides({ 1, 1 }), // strides + ngraph::CoordinateDiff({ 1, 1 }), // pad begin + ngraph::CoordinateDiff({ 1, 1 }), // pad end + ngraph::Strides({ 1, 1 }), // dilation + ngraph::op::PadType::EXPLICIT); // pad type + convNode1->set_friendly_name("Convolution_1"); + + return std::make_shared(convNode1, ngraph::ParameterVector{input1}); + } + void SetUp() override { + std::tie(inputPrecision, netPrecision, inputShapes, newInputShapes, targetDevice) = this->GetParam(); + fnPtr = createGraph(netPrecision); + + // STAGE2: set up safe threshold <= 5% from maximum value of output tensor + threshold = 0.2f; // Max in fp32 network by output: 20.0761 + + // STAGE3: + // filling of expected precision of layer execution defined by precisoin of input tensor to the primitive and reflected in + // performance counters + expectedPrecisions["Convolution_0"] = "BF16"; + expectedPrecisions["Convolution_1"] = "BF16"; + expectedPrecisions["Elt_max"] = "FP32"; + } +}; + +TEST_P(Elt_max, CompareWithRefImpl) { + test(); +}; + + +INSTANTIATE_TEST_CASE_P(FP32_bfloat16_NoReshape, Elt_max, + ::testing::Combine( + ::testing::Values(Precision::FP32), + ::testing::Values(Precision::FP32), + ::testing::Values(SizeVector({1, 3, 40, 40})), + ::testing::Values(SizeVector()), + ::testing::Values(CommonTestUtils::DEVICE_CPU)), + Elt_max::getTestCaseName); + +INSTANTIATE_TEST_CASE_P(BF16_bfloat16_NoReshape, Elt_max, + ::testing::Combine( + ::testing::Values(Precision::FP32), + ::testing::Values(Precision::BF16), + ::testing::Values(SizeVector({1, 3, 40, 40})), + ::testing::Values(SizeVector()), + ::testing::Values(CommonTestUtils::DEVICE_CPU)), + Elt_max::getTestCaseName); +} // namespace LayerTestsDefinitions diff --git a/inference-engine/tests/functional/plugin/cpu/bfloat16/elt_x3.cpp b/inference-engine/tests/functional/plugin/cpu/bfloat16/elt_x3.cpp new file mode 100644 index 00000000000..987c53cde26 --- /dev/null +++ b/inference-engine/tests/functional/plugin/cpu/bfloat16/elt_x3.cpp @@ -0,0 +1,229 @@ +// Copyright (C) 2020 Intel Corporation +// SPDX-License-Identifier: Apache-2.0 +// + +#include "bfloat16_helpers.hpp" + +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +#include "common_test_utils/common_utils.hpp" + +#include "ngraph/opsets/opset1.hpp" + +using namespace std; +using namespace ngraph; +using namespace InferenceEngine; + +namespace LayerTestsDefinitions { + +class Elt_x3 : public BasicBF16Test { +protected: + std::shared_ptr createGraph(InferenceEngine::Precision netPrecision) override { +// Power (FP32) +// / | \ +// Conv(BF16) Conv(BF16) Conv(BF16) +// / | / +// ---------------------------------------------- +// Eltwise(MAX)(FP32) Eltwise(Mul) (FP32) +// | | +// Conv(BF16) Conv(BF16) +// \ / +// Eltwise (SUM)(BF16) +// | +// Conv (BF16) + + auto channelsCount = inputShapes[1]; + + // STAGE1: construction of the GRAPH + ngraph::element::Type ntype = (netPrecision == Precision::FP32) ? ngraph::element::f32 : ngraph::element::bf16; + // add + auto input1 = std::make_shared(ntype, ngraph::Shape{inputShapes}); + input1->set_friendly_name("Input_1"); + std::shared_ptr addConst = nullptr; + if (netPrecision == Precision::FP32) { + addConst = opset1::Constant::create(ntype, Shape{1}, { 2.0f }); + } else { + addConst = opset1::Constant::create(ntype, Shape{1}, { bfloat16::from_bits(BFloat16Helpers::reducePrecisionBitwiseS(2.0f)) }); + } + auto addNode0 = std::make_shared(input1, addConst); + addNode0->set_friendly_name("Add_0"); + + // convolution + std::shared_ptr weightsNode0_1 = nullptr, weightsNode0_2 = nullptr, + weightsNode0_3 = nullptr, weightsNode1 = nullptr, + weightsNode2 = nullptr, weightsNode3 = nullptr; + ngraph::Shape convFilterShape = { channelsCount, channelsCount, 3, 3 }; // out channel, /input channels, kernel h, kernel w + if (netPrecision == Precision::FP32) { + std::vector weightValuesFP32; + weightValuesFP32.resize(channelsCount * channelsCount * 3 * 3); + BFloat16Helpers::fillInputsBySinValues(weightValuesFP32.data(), weightValuesFP32.size()); + weightsNode0_1 = std::make_shared(ntype, convFilterShape, weightValuesFP32); + weightsNode0_2 = std::make_shared(ntype, convFilterShape, weightValuesFP32); + weightsNode0_3 = std::make_shared(ntype, convFilterShape, weightValuesFP32); + weightsNode1 = std::make_shared(ntype, convFilterShape, weightValuesFP32); + weightsNode2 = std::make_shared(ntype, convFilterShape, weightValuesFP32); + weightsNode3 = std::make_shared(ntype, convFilterShape, weightValuesFP32); + } else { + std::vector weightValuesBF16; + weightValuesBF16.resize(channelsCount * channelsCount * 3 * 3); + BFloat16Helpers::fillInputsBySinValues(weightValuesBF16.data(), weightValuesBF16.size()); + weightsNode0_1 = std::make_shared(ntype, convFilterShape, weightValuesBF16.data()); + weightsNode0_2 = std::make_shared(ntype, convFilterShape, weightValuesBF16.data()); + weightsNode0_3 = std::make_shared(ntype, convFilterShape, weightValuesBF16.data()); + weightsNode1 = std::make_shared(ntype, convFilterShape, weightValuesBF16.data()); + weightsNode2 = std::make_shared(ntype, convFilterShape, weightValuesBF16.data()); + weightsNode3 = std::make_shared(ntype, convFilterShape, weightValuesBF16.data()); + } + + std::shared_ptr convNode0_1 = std::make_shared( + addNode0, weightsNode0_1, + ngraph::Strides({ 1, 1 }), // strides + ngraph::CoordinateDiff({ 1, 1 }), // pad begin + ngraph::CoordinateDiff({ 1, 1 }), // pad end + ngraph::Strides({ 1, 1 }), // dilation + ngraph::op::PadType::EXPLICIT); // pad type + convNode0_1->set_friendly_name("Convolution_0_1"); + + std::shared_ptr convNode0_2 = std::make_shared( + addNode0, weightsNode0_2, + ngraph::Strides({ 1, 1 }), // strides + ngraph::CoordinateDiff({ 1, 1 }), // pad begin + ngraph::CoordinateDiff({ 1, 1 }), // pad end + ngraph::Strides({ 1, 1 }), // dilation + ngraph::op::PadType::EXPLICIT); // pad type + convNode0_2->set_friendly_name("Convolution_0_2"); + + std::shared_ptr convNode0_3 = std::make_shared( + addNode0, weightsNode0_3, + ngraph::Strides({ 1, 1 }), // strides + ngraph::CoordinateDiff({ 1, 1 }), // pad begin + ngraph::CoordinateDiff({ 1, 1 }), // pad end + ngraph::Strides({ 1, 1 }), // dilation + ngraph::op::PadType::EXPLICIT); // pad type + convNode0_3->set_friendly_name("Convolution_0_3"); + + // Eltwise, i.e. Mul + auto eltMulNode = std::make_shared(convNode0_1, convNode0_2); + eltMulNode->set_friendly_name("Elt_mul"); + + // Eltwise, i.e. Max + std::shared_ptr maxConst = nullptr; + if (netPrecision == Precision::FP32) { + maxConst = opset1::Constant::create(ntype, Shape{inputShapes}, { 2.0f }); + } else { + maxConst = opset1::Constant::create(ntype, Shape{inputShapes}, { bfloat16::from_bits(BFloat16Helpers::reducePrecisionBitwiseS(2.0f)) }); + } + auto eltMaxNode = std::make_shared(convNode0_3, maxConst); + eltMaxNode->set_friendly_name("Elt_max"); + + // convolution + std::shared_ptr convNode1 = std::make_shared( + eltMulNode, weightsNode1, + ngraph::Strides({ 1, 1 }), // strides + ngraph::CoordinateDiff({ 1, 1 }), // pad begin + ngraph::CoordinateDiff({ 1, 1 }), // pad end + ngraph::Strides({ 1, 1 }), // dilation + ngraph::op::PadType::EXPLICIT); // pad type + convNode1->set_friendly_name("Convolution_1"); + + std::shared_ptr convNode2 = std::make_shared( + eltMaxNode, weightsNode2, + ngraph::Strides({ 1, 1 }), // strides + ngraph::CoordinateDiff({ 1, 1 }), // pad begin + ngraph::CoordinateDiff({ 1, 1 }), // pad end + ngraph::Strides({ 1, 1 }), // dilation + ngraph::op::PadType::EXPLICIT); // pad type + convNode2->set_friendly_name("Convolution_2"); + + // eltwise, i.e. sum + auto eltSumNode = std::make_shared(convNode1, convNode2); + eltSumNode->set_friendly_name("Elt_sum"); + + // convolution + std::shared_ptr convNode3 = std::make_shared( + eltSumNode, weightsNode3, + ngraph::Strides({ 1, 1 }), // strides + ngraph::CoordinateDiff({ 1, 1 }), // pad begin + ngraph::CoordinateDiff({ 1, 1 }), // pad end + ngraph::Strides({ 1, 1 }), // dilation + ngraph::op::PadType::EXPLICIT); // pad type + convNode3->set_friendly_name("Convolution_3"); + + return std::make_shared(convNode3, ngraph::ParameterVector{input1}); + } + void SetUp() override { + std::tie(inputPrecision, netPrecision, inputShapes, newInputShapes, targetDevice) = this->GetParam(); + fnPtr = createGraph(netPrecision); + + // STAGE2: set up safe threshold <= 5% from maximum value of output tensor + + // 256 channels, 38 x 38 size + // threshold = 0.6f; // Max in fp32 network by output: 12.0983 + + // 3 channels, 4 x 4 size + threshold = 20.6f; // Max in fp32 network by output: 879.077 + + // STAGE3: + // filling of expected precision of layer execution defined by precisoin of input tensor to the primitive and reflected in + // performance counters + expectedPrecisions["Convolution_1"] = "BF16"; + expectedPrecisions["Convolution_2"] = "BF16"; + expectedPrecisions["Convolution_3"] = "BF16"; + expectedPrecisions["Elt_max"] = "FP32"; + expectedPrecisions["Elt_mul"] = "FP32"; + expectedPrecisions["Elt_sum"] = "ndef"; + } +}; + +TEST_P(Elt_x3, CompareWithRefImpl) { + test(); +}; + +// CPU plug-in failure in that case + +//INSTANTIATE_TEST_CASE_P(FP32_bfloat16_NoReshape, Elt_x3, +// ::testing::Combine( +// ::testing::Values(Precision::FP32), +// ::testing::Values(Precision::FP32), +// ::testing::Values(SizeVector({1, 256, 38, 38})), +// ::testing::Values(SizeVector()), +// ::testing::Values(CommonTestUtils::DEVICE_CPU)), +// Elt_x3::getTestCaseName); +// +//INSTANTIATE_TEST_CASE_P(BF16_bfloat16_NoReshape, Elt_x3, +// ::testing::Combine( +// ::testing::Values(Precision::FP32), +// ::testing::Values(Precision::BF16), +// ::testing::Values(SizeVector({1, 256, 38, 38})), +// ::testing::Values(SizeVector()), +// ::testing::Values(CommonTestUtils::DEVICE_CPU)), +// Elt_x3::getTestCaseName); + +INSTANTIATE_TEST_CASE_P(FP32_bfloat16_NoReshape, Elt_x3, + ::testing::Combine( + ::testing::Values(Precision::FP32), + ::testing::Values(Precision::FP32), + ::testing::Values(SizeVector({1, 3, 4, 4})), + ::testing::Values(SizeVector()), + ::testing::Values(CommonTestUtils::DEVICE_CPU)), + Elt_x3::getTestCaseName); + +INSTANTIATE_TEST_CASE_P(BF16_bfloat16_NoReshape, Elt_x3, + ::testing::Combine( + ::testing::Values(Precision::FP32), + ::testing::Values(Precision::BF16), + ::testing::Values(SizeVector({1, 3, 4, 4})), + ::testing::Values(SizeVector()), + ::testing::Values(CommonTestUtils::DEVICE_CPU)), + Elt_x3::getTestCaseName); + +} // namespace LayerTestsDefinitions diff --git a/inference-engine/tests/functional/plugin/cpu/bfloat16/faster_100_5_1_1_conv.cpp b/inference-engine/tests/functional/plugin/cpu/bfloat16/faster_100_5_1_1_conv.cpp index efc9c6d2105..ca97b105a3c 100644 --- a/inference-engine/tests/functional/plugin/cpu/bfloat16/faster_100_5_1_1_conv.cpp +++ b/inference-engine/tests/functional/plugin/cpu/bfloat16/faster_100_5_1_1_conv.cpp @@ -28,16 +28,18 @@ namespace LayerTestsDefinitions { class Faster100_5_1_1_Conv : public BasicBF16Test { protected: - std::shared_ptr createGraph(InferenceEngine::Precision netPrecision)override { + std::shared_ptr createGraph(InferenceEngine::Precision netPrecision) override { // Power (FP32) // | // Convolution (BF16) // STAGE1: constructin og the GRAPH + auto channelsCount = inputShapes[1]; + // multiply ngraph::element::Type ntype = (netPrecision == Precision::FP32) ? ngraph::element::f32 : ngraph::element::bf16; // multiply - auto input1 = std::make_shared(ntype, ngraph::Shape{10, 5, 1, 1}); + auto input1 = std::make_shared(ntype, ngraph::Shape{inputShapes}); input1->set_friendly_name("Input_1"); std::shared_ptr const1 = nullptr; if (netPrecision == Precision::FP32) { @@ -59,10 +61,10 @@ protected: // problematic convolution: 100x5x1x1 std::shared_ptr weightsNode = nullptr; - ngraph::Shape convFilterShape = { 5, 5, 1, 1 }; // out channel, /input channels, kernel h, kernel w + ngraph::Shape convFilterShape = { channelsCount, channelsCount, 1, 1 }; // out channel, /input channels, kernel h, kernel w if (netPrecision == Precision::FP32) { std::vector weightValues; - weightValues.resize(5 * 5 * 1 * 1, 0.f); + weightValues.resize(channelsCount * channelsCount * 1 * 1, 0.f); weightValues[0] = 1.0f; weightValues[7] = 1.0f; weightValues[11] = 1.0f; @@ -71,7 +73,7 @@ protected: weightsNode = std::make_shared(ngraph::element::f32, convFilterShape, weightValues); } else { std::vector weightValuesBF16; - weightValuesBF16.resize(5 * 5 * 1 * 1, BFloat16Helpers::reducePrecisionBitwiseS(0.0f)); + weightValuesBF16.resize(channelsCount * channelsCount * 1 * 1, BFloat16Helpers::reducePrecisionBitwiseS(0.0f)); weightValuesBF16[0] = BFloat16Helpers::reducePrecisionBitwiseS(1.0f); weightValuesBF16[7] = BFloat16Helpers::reducePrecisionBitwiseS(1.0f); weightValuesBF16[11] = BFloat16Helpers::reducePrecisionBitwiseS(1.0f); @@ -96,7 +98,7 @@ protected: return std::make_shared(ngraph::NodeVector{reluNode}, ngraph::ParameterVector{input1}); } - void SetUp()override { + void SetUp() override { std::tie(inputPrecision, netPrecision, inputShapes, newInputShapes, targetDevice) = this->GetParam(); fnPtr = createGraph(netPrecision); diff --git a/inference-engine/tests/functional/plugin/cpu/bfloat16/gather_multiply.cpp b/inference-engine/tests/functional/plugin/cpu/bfloat16/gather_multiply.cpp new file mode 100644 index 00000000000..596a018b7f1 --- /dev/null +++ b/inference-engine/tests/functional/plugin/cpu/bfloat16/gather_multiply.cpp @@ -0,0 +1,130 @@ +// Copyright (C) 2020 Intel Corporation +// SPDX-License-Identifier: Apache-2.0 +// + +#include "bfloat16_helpers.hpp" + +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +#include "common_test_utils/common_utils.hpp" + +#include "ngraph/opsets/opset1.hpp" + +using namespace std; +using namespace ngraph; +using namespace InferenceEngine; + +namespace LayerTestsDefinitions { + +class Gather_multiply : public BasicBF16Test { +protected: + std::shared_ptr createGraph(InferenceEngine::Precision netPrecision) override { +// Add (FP32) +// | +// FC (BF16) +// / +// ------------------------------------------- +// Gather(BF16) Const +// \ / +// Mul(FP32) + + // STAGE1: construction of the GRAPH + ngraph::element::Type ntype = (netPrecision == Precision::FP32) ? ngraph::element::f32 : ngraph::element::bf16; + auto inputSize = inputShapes[1]; + + // add + auto input1 = std::make_shared(ntype, ngraph::Shape{inputShapes}); + + input1->set_friendly_name("Input_1"); + std::shared_ptr addConst = nullptr; + if (netPrecision == Precision::FP32) { + addConst = opset1::Constant::create(ntype, Shape{1}, { 2.0f }); + } else { + addConst = opset1::Constant::create(ntype, Shape{1}, { bfloat16::from_bits(BFloat16Helpers::reducePrecisionBitwiseS(2.0f)) }); + } + auto addNode0 = std::make_shared(input1, addConst); + addNode0->set_friendly_name("Add_1"); + + // matmul + std::shared_ptr matmulConst0 = nullptr; + if (netPrecision == Precision::FP32) { + matmulConst0 = opset1::Constant::create(ntype, Shape{inputSize, inputSize}, { 2.0f }); + } else { + matmulConst0 = opset1::Constant::create(ntype, Shape{inputSize, inputSize}, + { bfloat16::from_bits(BFloat16Helpers::reducePrecisionBitwiseS(2.0f)) }); + } + auto matmulNode = std::make_shared(addNode0, matmulConst0); + matmulNode->set_friendly_name("Matmul_0"); + + // gather + auto axesConst = opset1::Constant::create(ngraph::element::i64, Shape{1}, { 1 }); + std::vector gatherArray; + for (size_t i = 0; i < inputSize; i++) { + gatherArray.push_back(i); + } + auto indexesConst = opset1::Constant::create(ngraph::element::i64, Shape{inputSize}, gatherArray); + auto gatherNode = std::make_shared(matmulNode, indexesConst, axesConst); + gatherNode->set_friendly_name("Gather_1"); + + // multiply + std::shared_ptr mulConst = nullptr; + if (netPrecision == Precision::FP32) { + mulConst = opset1::Constant::create(ntype, Shape{inputShapes}, { 2.0f }); + } else { + mulConst = opset1::Constant::create(ntype, Shape{inputShapes}, { bfloat16::from_bits(BFloat16Helpers::reducePrecisionBitwiseS(2.0f)) }); + } + auto mulNode = std::make_shared(gatherNode, mulConst); + mulNode->set_friendly_name("Mul_1"); + + return std::make_shared(mulNode, ngraph::ParameterVector{input1}); + } + void SetUp() override { + std::tie(inputPrecision, netPrecision, inputShapes, newInputShapes, targetDevice) = this->GetParam(); + fnPtr = createGraph(netPrecision); + + // STAGE2: set up safe threshold <= 5% from maximum value of output tensor + threshold = 0.1f; // Max in fp32 network by output: 21.7285 + + // STAGE3: + // filling of expected precision of layer execution defined by precisoin of input tensor to the primitive and reflected in + // performance counters + + expectedPrecisions["Matmul_0"] = "BF16"; + expectedPrecisions["Mul_1"] = "FP32"; + } +}; + +TEST_P(Gather_multiply, CompareWithRefImpl) { + test(); +}; + + +INSTANTIATE_TEST_CASE_P(FP32_bfloat16_NoReshape, Gather_multiply, + ::testing::Combine( + ::testing::Values(Precision::FP32), + ::testing::Values(Precision::FP32), + ::testing::Values(SizeVector({1, 4})), + ::testing::Values(SizeVector()), + ::testing::Values(CommonTestUtils::DEVICE_CPU)), + Gather_multiply::getTestCaseName); +// CPU plug-in failure in that case + +//INSTANTIATE_TEST_CASE_P(BF16_bfloat16_NoReshape, Gather_multiply, +// ::testing::Combine( +// ::testing::Values(Precision::FP32), +// ::testing::Values(Precision::BF16), +// ::testing::Values(SizeVector({1, 4})), +// ::testing::Values(SizeVector()), +// ::testing::Values(CommonTestUtils::DEVICE_CPU)), +// Gather_multiply::getTestCaseName); + +} // namespace LayerTestsDefinitions diff --git a/inference-engine/tests/functional/plugin/cpu/bfloat16/gather_x2_add_mul_relu_concat_matmul.cpp b/inference-engine/tests/functional/plugin/cpu/bfloat16/gather_x2_add_mul_relu_concat_matmul.cpp new file mode 100644 index 00000000000..6c8c714e30d --- /dev/null +++ b/inference-engine/tests/functional/plugin/cpu/bfloat16/gather_x2_add_mul_relu_concat_matmul.cpp @@ -0,0 +1,156 @@ +// Copyright (C) 2020 Intel Corporation +// SPDX-License-Identifier: Apache-2.0 +// + +#include "bfloat16_helpers.hpp" + +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +#include "common_test_utils/common_utils.hpp" + +#include "ngraph/opsets/opset1.hpp" + +using namespace std; +using namespace ngraph; +using namespace InferenceEngine; + +namespace LayerTestsDefinitions { + +class Gather_x2_add_mul_relu_concat_matmul : public BasicBF16Test { +protected: + std::shared_ptr createGraph(InferenceEngine::Precision netPrecision) override { +// Add (FP32) +// | +// FullyConnected (BF16) +// / | \ +// ------------------------------------------- +// Gather(FP32) Gather(FP32) Add (FP32) +// \ / / +// Mul(FP32) ReLU(FP32) +// \ / +// Concat(FP32) Const +// \ / +// Matmul(BF16) + + // STAGE1: construction of the GRAPH + ngraph::element::Type ntype = (netPrecision == Precision::FP32) ? ngraph::element::f32 : ngraph::element::bf16; + // add + auto input1 = std::make_shared(ntype, ngraph::Shape{inputShapes}); + auto inputSize = inputShapes[1]; + + input1->set_friendly_name("Input_1"); + std::shared_ptr addConst = nullptr; + if (netPrecision == Precision::FP32) { + addConst = opset1::Constant::create(ntype, Shape{1}, { 2.0f }); + } else { + addConst = opset1::Constant::create(ntype, Shape{1}, { bfloat16::from_bits(BFloat16Helpers::reducePrecisionBitwiseS(2.0f)) }); + } + auto addNode0 = std::make_shared(input1, addConst); + addNode0->set_friendly_name("Add_1"); + + // matmul + std::shared_ptr matmulConst0 = nullptr; + if (netPrecision == Precision::FP32) { + matmulConst0 = opset1::Constant::create(ntype, Shape{inputSize, inputSize}, { 2.0f }); + } else { + matmulConst0 = opset1::Constant::create(ntype, Shape{inputSize, inputSize}, + { bfloat16::from_bits(BFloat16Helpers::reducePrecisionBitwiseS(2.0f)) }); + } + auto matmulNode = std::make_shared(addNode0, matmulConst0); + matmulNode->set_friendly_name("Matmul_0"); + + // gather + std::vector gatherArray; + for (size_t i = 0; i < inputSize; i++) { + gatherArray.push_back(i); + } + auto axesConst = opset1::Constant::create(ngraph::element::i64, Shape{1}, { 1 }); + auto indexesConst = opset1::Constant::create(ngraph::element::i64, Shape{inputSize}, gatherArray); + auto gatherNode1 = std::make_shared(matmulNode, indexesConst, axesConst); + gatherNode1->set_friendly_name("Gather_1"); + + auto gatherNode2 = std::make_shared(matmulNode, indexesConst, axesConst); + gatherNode2->set_friendly_name("Gather_2"); + + // multiply + auto mulNode = std::make_shared(gatherNode1, gatherNode2); + mulNode->set_friendly_name("Mul_1"); + + // add + auto addNode1 = std::make_shared(matmulNode, addConst); + addNode0->set_friendly_name("Add_1"); + + // ReLU + auto reluNode = std::make_shared(addNode1); + reluNode->set_friendly_name("Relu_1"); + + // Concat + ngraph::NodeVector concInputNodes = {mulNode, reluNode}; + auto concNode = std::make_shared(concInputNodes, 1); + concNode->set_friendly_name("Conc_1"); + + // matmul + std::shared_ptr matmulConst1 = nullptr; + if (netPrecision == Precision::FP32) { + matmulConst1 = opset1::Constant::create(ntype, Shape{inputSize * 2, inputSize * 2}, { 2.0f }); + } else { + matmulConst1 = opset1::Constant::create(ntype, Shape{inputSize * 2, inputSize * 2}, + { bfloat16::from_bits(BFloat16Helpers::reducePrecisionBitwiseS(2.0f)) }); + } + auto matmulNode1 = std::make_shared(concNode, matmulConst1); + matmulNode1->set_friendly_name("Matmul_1"); + + return std::make_shared(matmulNode1, ngraph::ParameterVector{input1}); + } + void SetUp() override { + std::tie(inputPrecision, netPrecision, inputShapes, newInputShapes, targetDevice) = this->GetParam(); + fnPtr = createGraph(netPrecision); + + // STAGE2: set up safe threshold <= 5% from maximum value of output tensor + threshold = 170.02f; // Max in fp32 network by output: 3887.11 + + // STAGE3: + // filling of expected precision of layer execution defined by precisoin of input tensor to the primitive and reflected in + // performance counters + expectedPrecisions["Matmul_0"] = "BF16"; + expectedPrecisions["Mul_1"] = "FP32"; + expectedPrecisions["Add_1"] = "FP32"; + expectedPrecisions["Relu_1"] = "FP32"; + expectedPrecisions["Conc_1"] = "FP32"; + expectedPrecisions["Matmul_1"] = "BF16"; + } +}; + +TEST_P(Gather_x2_add_mul_relu_concat_matmul, CompareWithRefImpl) { + test(); +}; + + +INSTANTIATE_TEST_CASE_P(FP32_bfloat16_NoReshape, Gather_x2_add_mul_relu_concat_matmul, + ::testing::Combine( + ::testing::Values(Precision::FP32), + ::testing::Values(Precision::FP32), + ::testing::Values(SizeVector({ 2048, 64 })), + ::testing::Values(SizeVector()), + ::testing::Values(CommonTestUtils::DEVICE_CPU)), + Gather_x2_add_mul_relu_concat_matmul::getTestCaseName); + +INSTANTIATE_TEST_CASE_P(BF16_bfloat16_NoReshape, Gather_x2_add_mul_relu_concat_matmul, + ::testing::Combine( + ::testing::Values(Precision::FP32), + ::testing::Values(Precision::BF16), + ::testing::Values(SizeVector({ 2048, 64 })), + ::testing::Values(SizeVector()), + ::testing::Values(CommonTestUtils::DEVICE_CPU)), + Gather_x2_add_mul_relu_concat_matmul::getTestCaseName); + +} // namespace LayerTestsDefinitions diff --git a/inference-engine/tests/functional/plugin/cpu/bfloat16/interpolation.cpp b/inference-engine/tests/functional/plugin/cpu/bfloat16/interpolation.cpp new file mode 100644 index 00000000000..75047fe4988 --- /dev/null +++ b/inference-engine/tests/functional/plugin/cpu/bfloat16/interpolation.cpp @@ -0,0 +1,146 @@ +// Copyright (C) 2020 Intel Corporation +// SPDX-License-Identifier: Apache-2.0 +// + +#include "bfloat16_helpers.hpp" + +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +#include "common_test_utils/common_utils.hpp" + +#include "ngraph/opsets/opset1.hpp" + +using namespace std; +using namespace ngraph; +using namespace InferenceEngine; + +namespace LayerTestsDefinitions { + +class Interpolation : public BasicBF16Test { +protected: + std::shared_ptr createGraph(InferenceEngine::Precision netPrecision) override { + // Convolution (BF16) + // | + // Interpolation (In the case of mode = "linear") (FP32) + // | + // Convolution (BF16) + + // STAGE1: construction of the GRAPH + ngraph::element::Type ntype = (netPrecision == Precision::FP32) ? ngraph::element::f32 : ngraph::element::bf16; + auto channelsCount = inputShapes[1]; + + // add + auto input1 = std::make_shared(ntype, ngraph::Shape{inputShapes}); + input1->set_friendly_name("Input_1"); + std::shared_ptr addConst = nullptr; + if (netPrecision == Precision::FP32) { + addConst = opset1::Constant::create(ntype, Shape{1}, { 2.0f }); + } else { + addConst = opset1::Constant::create(ntype, Shape{1}, { bfloat16::from_bits(BFloat16Helpers::reducePrecisionBitwiseS(2.0f)) }); + } + auto addNode = std::make_shared(input1, addConst); + addNode->set_friendly_name("Add_1"); + + // convolution + std::shared_ptr weightsNode1 = nullptr, weightsNode2 = nullptr; + ngraph::Shape convFilterShape = { channelsCount, channelsCount, 3, 3 }; // out channel, /input channels, kernel h, kernel w + if (netPrecision == Precision::FP32) { + std::vector weightValuesFP32; + weightValuesFP32.resize(channelsCount * channelsCount * 3 * 3); + BFloat16Helpers::fillInputsBySinValues(weightValuesFP32.data(), weightValuesFP32.size()); + weightsNode1 = std::make_shared(ntype, convFilterShape, weightValuesFP32); + weightsNode2 = std::make_shared(ntype, convFilterShape, weightValuesFP32); + } else { + std::vector weightValuesBF16; + weightValuesBF16.resize(channelsCount * channelsCount * 3 * 3); + BFloat16Helpers::fillInputsBySinValues(weightValuesBF16.data(), weightValuesBF16.size()); + weightsNode1 = std::make_shared(ntype, convFilterShape, weightValuesBF16.data()); + weightsNode2 = std::make_shared(ntype, convFilterShape, weightValuesBF16.data()); + } + + std::shared_ptr convNode1 = std::make_shared( + addNode, weightsNode1, + ngraph::Strides({ 1, 1 }), // strides + ngraph::CoordinateDiff({ 1, 1 }), // pad begin + ngraph::CoordinateDiff({ 1, 1 }), // pad end + ngraph::Strides({ 1, 1 }), // dilation + ngraph::op::PadType::EXPLICIT); // pad type + convNode1->set_friendly_name("Convolution_1"); + + // interpolation + auto heightSize = static_cast(inputShapes[2]); + auto weigthSize = static_cast(inputShapes[3]); + std::vector outShape = {2 * heightSize, 2 * weigthSize}; + + auto interpolShape = std::make_shared(ngraph::element::i64, ngraph::Shape{2}, outShape); + ngraph::op::InterpolateAttrs attrs; + attrs.pads_begin.push_back(0); + attrs.pads_end.push_back(0); + attrs.axes = ngraph::AxisSet{2, 3}; + attrs.align_corners = false; + attrs.mode = "linear"; + attrs.antialias = false; + auto interpolNode = std::make_shared( + convNode1, + interpolShape, attrs); + interpolNode->set_friendly_name("Interp"); + + std::shared_ptr convNode2 = std::make_shared( + interpolNode, weightsNode2, + ngraph::Strides({ 1, 1 }), // strides + ngraph::CoordinateDiff({ 1, 1 }), // pad begin + ngraph::CoordinateDiff({ 1, 1 }), // pad end + ngraph::Strides({ 1, 1 }), // dilation + ngraph::op::PadType::EXPLICIT); // pad type + convNode2->set_friendly_name("Convolution_2"); + return std::make_shared(convNode2, ngraph::ParameterVector{input1}); + } + void SetUp() override { + std::tie(inputPrecision, netPrecision, inputShapes, newInputShapes, targetDevice) = this->GetParam(); + fnPtr = createGraph(netPrecision); + + // STAGE2: set up safe threshold <= 5% from maximum value of output tensor + threshold = 0.02f; // Max in fp32 network by output: 2.531 + + // STAGE3: + // filling of expected precision of layer execution defined by precisoin of input tensor to the primitive and reflected in + // performance counters + expectedPrecisions["Convolution_1"] = "BF16"; + expectedPrecisions["Interp"] = "FP32"; + expectedPrecisions["Convolution_2"] = "BF16"; + } +}; + +TEST_P(Interpolation, CompareWithRefImpl) { + test(); +}; + + +INSTANTIATE_TEST_CASE_P(FP32_bfloat16_NoReshape, Interpolation, + ::testing::Combine( + ::testing::Values(Precision::FP32), + ::testing::Values(Precision::FP32), + ::testing::Values(SizeVector({ 1, 1, 2, 2 })), + ::testing::Values(SizeVector()), + ::testing::Values(CommonTestUtils::DEVICE_CPU)), + Interpolation::getTestCaseName); + +INSTANTIATE_TEST_CASE_P(BF16_bfloat16_NoReshape, Interpolation, + ::testing::Combine( + ::testing::Values(Precision::FP32), + ::testing::Values(Precision::BF16), + ::testing::Values(SizeVector({ 1, 1, 2, 2 })), + ::testing::Values(SizeVector()), + ::testing::Values(CommonTestUtils::DEVICE_CPU)), + Interpolation::getTestCaseName); + +} // namespace LayerTestsDefinitions diff --git a/inference-engine/tests/functional/plugin/cpu/bfloat16/mobilenet_ssd_with_branching.cpp b/inference-engine/tests/functional/plugin/cpu/bfloat16/mobilenet_ssd_with_branching.cpp index e8eafcbead6..e2498189a32 100644 --- a/inference-engine/tests/functional/plugin/cpu/bfloat16/mobilenet_ssd_with_branching.cpp +++ b/inference-engine/tests/functional/plugin/cpu/bfloat16/mobilenet_ssd_with_branching.cpp @@ -19,7 +19,7 @@ namespace LayerTestsDefinitions { class MobileNet_ssd_with_branching : public BasicBF16Test { protected: - std::shared_ptr createGraph(InferenceEngine::Precision netPrecision)override { + std::shared_ptr createGraph(InferenceEngine::Precision netPrecision) override { // scaleshift // | // Conv1 (FP32) @@ -35,8 +35,10 @@ protected: // Concat ngraph::element::Type ntype = (netPrecision == Precision::FP32) ? ngraph::element::f32 : ngraph::element::bf16; + auto channelsCount = inputShapes[1]; + // multiply - auto input1 = std::make_shared(ntype, ngraph::Shape{1, 3, 40, 40}); + auto input1 = std::make_shared(ntype, ngraph::Shape{inputShapes}); input1->set_friendly_name("Input_1"); std::shared_ptr const1 = nullptr; if (netPrecision == Precision::FP32) { @@ -58,15 +60,15 @@ protected: // Conv1 std::shared_ptr weightsNode = nullptr; - ngraph::Shape convFilterShape = { 3, 3, 3, 3 }; // out channel, /input channels, kernel h, kernel w + ngraph::Shape convFilterShape = { channelsCount, channelsCount, 3, 3 }; // out channel, /input channels, kernel h, kernel w if (netPrecision == Precision::FP32) { std::vector weightValuesFP32; - weightValuesFP32.resize(3 * 3 * 3 * 3); + weightValuesFP32.resize(channelsCount * channelsCount * 3 * 3); BFloat16Helpers::fillInputsBySinValues(weightValuesFP32.data(), weightValuesFP32.size()); weightsNode = std::make_shared(ntype, convFilterShape, weightValuesFP32); } else { std::vector weightValuesBF16; - weightValuesBF16.resize(3 * 3 * 3 * 3); + weightValuesBF16.resize(channelsCount * channelsCount * 3 * 3); BFloat16Helpers::fillInputsBySinValues(weightValuesBF16.data(), weightValuesBF16.size()); weightsNode = std::make_shared(ntype, convFilterShape, weightValuesBF16.data()); } @@ -96,15 +98,15 @@ protected: // DW convolution std::shared_ptr weightsNode2 = nullptr; - ngraph::Shape convFilterShape2 = { 3, 1, 1, 3, 3 }; // out channel, /input channels, kernel h, kernel w + ngraph::Shape convFilterShape2 = { channelsCount, 1, 1, 3, 3 }; // out channel, /input channels, kernel h, kernel w if (netPrecision == Precision::FP32) { std::vector weightValues2FP32; - weightValues2FP32.resize(3 * 1 * 1 * 3 * 3); + weightValues2FP32.resize(channelsCount * 1 * 1 * 3 * 3); BFloat16Helpers::fillInputsBySinValues(weightValues2FP32.data(), weightValues2FP32.size()); weightsNode2 = std::make_shared(ntype, convFilterShape2, weightValues2FP32); } else { std::vector weightValues2BF16; - weightValues2BF16.resize(3 * 1 * 1 * 3 * 3); + weightValues2BF16.resize(channelsCount * 1 * 1 * 3 * 3); BFloat16Helpers::fillInputsBySinValues(weightValues2BF16.data(), weightValues2BF16.size()); weightsNode2 = std::make_shared(ntype, convFilterShape2, weightValues2BF16.data()); } @@ -138,7 +140,7 @@ protected: return std::make_shared(concNode, ngraph::ParameterVector{input1}); } - void SetUp()override { + void SetUp() override { std::tie(inputPrecision, netPrecision, inputShapes, newInputShapes, targetDevice) = this->GetParam(); fnPtr = createGraph(netPrecision); diff --git a/inference-engine/tests/functional/plugin/cpu/bfloat16/resample.cpp b/inference-engine/tests/functional/plugin/cpu/bfloat16/resample.cpp new file mode 100644 index 00000000000..2c803050fbd --- /dev/null +++ b/inference-engine/tests/functional/plugin/cpu/bfloat16/resample.cpp @@ -0,0 +1,146 @@ +// Copyright (C) 2020 Intel Corporation +// SPDX-License-Identifier: Apache-2.0 +// + +#include "bfloat16_helpers.hpp" + +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +#include "common_test_utils/common_utils.hpp" + +#include "ngraph/opsets/opset1.hpp" + +using namespace std; +using namespace ngraph; +using namespace InferenceEngine; + +namespace LayerTestsDefinitions { + +class Resample : public BasicBF16Test { +protected: + std::shared_ptr createGraph(InferenceEngine::Precision netPrecision) override { + // Convolution (BF16) + // | + // Interpolation (Resample in the case of mode = "nearest") (FP32) + // | + // Convolution (BF16) + + // STAGE1: construction of the GRAPH + + ngraph::element::Type ntype = (netPrecision == Precision::FP32) ? ngraph::element::f32 : ngraph::element::bf16; + // add + auto input1 = std::make_shared(ntype, ngraph::Shape{inputShapes}); + auto channelsCount = inputShapes[1]; + input1->set_friendly_name("Input_1"); + std::shared_ptr addConst = nullptr; + if (netPrecision == Precision::FP32) { + addConst = opset1::Constant::create(ntype, Shape{1}, { 2.0f }); + } else { + addConst = opset1::Constant::create(ntype, Shape{1}, { bfloat16::from_bits(BFloat16Helpers::reducePrecisionBitwiseS(2.0f)) }); + } + auto addNode = std::make_shared(input1, addConst); + addNode->set_friendly_name("Add_1"); + + // convolution + std::shared_ptr weightsNode1 = nullptr, weightsNode2 = nullptr; + ngraph::Shape convFilterShape = { channelsCount, channelsCount, 3, 3 }; // out channel, /input channels, kernel h, kernel w + if (netPrecision == Precision::FP32) { + std::vector weightValuesFP32; + weightValuesFP32.resize(channelsCount * channelsCount * 3 * 3); + BFloat16Helpers::fillInputsBySinValues(weightValuesFP32.data(), weightValuesFP32.size()); + weightsNode1 = std::make_shared(ntype, convFilterShape, weightValuesFP32); + weightsNode2 = std::make_shared(ntype, convFilterShape, weightValuesFP32); + } else { + std::vector weightValuesBF16; + weightValuesBF16.resize(channelsCount * channelsCount * 3 * 3); + BFloat16Helpers::fillInputsBySinValues(weightValuesBF16.data(), weightValuesBF16.size()); + weightsNode1 = std::make_shared(ntype, convFilterShape, weightValuesBF16.data()); + weightsNode2 = std::make_shared(ntype, convFilterShape, weightValuesBF16.data()); + } + + std::shared_ptr convNode1 = std::make_shared( + addNode, weightsNode1, + ngraph::Strides({ 1, 1 }), // strides + ngraph::CoordinateDiff({ 1, 1 }), // pad begin + ngraph::CoordinateDiff({ 1, 1 }), // pad end + ngraph::Strides({ 1, 1 }), // dilation + ngraph::op::PadType::EXPLICIT); // pad type + convNode1->set_friendly_name("Convolution_1"); + + // interpolation + auto heightSize = static_cast(inputShapes[2]); + auto weigthSize = static_cast(inputShapes[3]); + std::vector outShape = {2 * heightSize, 2 * weigthSize}; + + auto interpolShape = std::make_shared(ngraph::element::i64, ngraph::Shape{2}, outShape); + ngraph::op::InterpolateAttrs attrs; + attrs.pads_begin.push_back(0); + attrs.pads_end.push_back(0); + attrs.axes = ngraph::AxisSet{2, 3}; + attrs.align_corners = false; + attrs.mode = "nearest"; + attrs.antialias = false; + auto interpolNode = std::make_shared( + convNode1, + interpolShape, attrs); + interpolNode->set_friendly_name("Interp"); + + std::shared_ptr convNode2 = std::make_shared( + interpolNode, weightsNode2, + ngraph::Strides({ 1, 1 }), // strides + ngraph::CoordinateDiff({ 1, 1 }), // pad begin + ngraph::CoordinateDiff({ 1, 1 }), // pad end + ngraph::Strides({ 1, 1 }), // dilation + ngraph::op::PadType::EXPLICIT); // pad type + convNode2->set_friendly_name("Convolution_2"); + return std::make_shared(convNode2, ngraph::ParameterVector{input1}); + } + void SetUp() override { + std::tie(inputPrecision, netPrecision, inputShapes, newInputShapes, targetDevice) = this->GetParam(); + fnPtr = createGraph(netPrecision); + + // STAGE2: set up safe threshold <= 5% from maximum value of output tensor + threshold = 0.02f; // Max in fp32 network by output: 2.35926 + + // STAGE3: + // filling of expected precision of layer execution defined by precisoin of input tensor to the primitive and reflected in + // performance counters + expectedPrecisions["Convolution_1"] = "BF16"; + expectedPrecisions["Interp"] = "FP32"; + expectedPrecisions["Convolution_2"] = "BF16"; + } +}; + +TEST_P(Resample, CompareWithRefImpl) { + test(); +}; + + +INSTANTIATE_TEST_CASE_P(FP32_bfloat16_NoReshape, Resample, + ::testing::Combine( + ::testing::Values(Precision::FP32), + ::testing::Values(Precision::FP32), + ::testing::Values(SizeVector({ 1, 1, 2, 2 })), + ::testing::Values(SizeVector()), + ::testing::Values(CommonTestUtils::DEVICE_CPU)), + Resample::getTestCaseName); + +INSTANTIATE_TEST_CASE_P(BF16_bfloat16_NoReshape, Resample, + ::testing::Combine( + ::testing::Values(Precision::FP32), + ::testing::Values(Precision::BF16), + ::testing::Values(SizeVector({ 1, 1, 2, 2 })), + ::testing::Values(SizeVector()), + ::testing::Values(CommonTestUtils::DEVICE_CPU)), + Resample::getTestCaseName); + +} // namespace LayerTestsDefinitions diff --git a/inference-engine/tests/functional/plugin/cpu/bfloat16/scaleshift_conv_eltwise_conv.cpp b/inference-engine/tests/functional/plugin/cpu/bfloat16/scaleshift_conv_eltwise_conv.cpp index e165f867c7f..fb1308fbdd3 100644 --- a/inference-engine/tests/functional/plugin/cpu/bfloat16/scaleshift_conv_eltwise_conv.cpp +++ b/inference-engine/tests/functional/plugin/cpu/bfloat16/scaleshift_conv_eltwise_conv.cpp @@ -27,7 +27,7 @@ namespace LayerTestsDefinitions { class ScaleshiftConvEltwiseConv : public BasicBF16Test { protected: - std::shared_ptr createGraph(InferenceEngine::Precision netPrecision)override { + std::shared_ptr createGraph(InferenceEngine::Precision netPrecision) override { // scaleshift (FP32) Conv (FP32) // \ / // Eltwise (Fused into Conv) @@ -37,7 +37,9 @@ protected: ngraph::element::Type ntype = (netPrecision == Precision::FP32) ? ngraph::element::f32 : ngraph::element::bf16; // multiply - auto input1 = std::make_shared(ntype, ngraph::Shape{1, 3, 40, 40}); + auto input1 = std::make_shared(ntype, ngraph::Shape{inputShapes}); + auto channelsCount = inputShapes[1]; + input1->set_friendly_name("Input_1"); std::shared_ptr const1 = nullptr; if (netPrecision == Precision::FP32) { @@ -59,15 +61,15 @@ protected: // convolution std::shared_ptr weightsNode = nullptr; - ngraph::Shape convFilterShape = { 3, 3, 3, 3 }; // out channel, /input channels, kernel h, kernel w + ngraph::Shape convFilterShape = { channelsCount, channelsCount, 3, 3 }; // out channel, /input channels, kernel h, kernel w if (netPrecision == Precision::FP32) { std::vector weightValuesFP32; - weightValuesFP32.resize(3 * 3 * 3 * 3); + weightValuesFP32.resize(channelsCount * channelsCount * 3 * 3); BFloat16Helpers::fillInputsBySinValues(weightValuesFP32.data(), weightValuesFP32.size()); weightsNode = std::make_shared(ntype, convFilterShape, weightValuesFP32); } else { std::vector weightValuesBF16; - weightValuesBF16.resize(3 * 3 * 3 * 3); + weightValuesBF16.resize(channelsCount * channelsCount * 3 * 3); BFloat16Helpers::fillInputsBySinValues(weightValuesBF16.data(), weightValuesBF16.size()); weightsNode = std::make_shared(ntype, convFilterShape, weightValuesBF16.data()); } @@ -87,15 +89,15 @@ protected: // Convolution std::shared_ptr weightsNode2 = nullptr; - ngraph::Shape convFilterShape2 = { 3, 3, 3, 3 }; // out channel, /input channels, kernel h, kernel w + ngraph::Shape convFilterShape2 = { channelsCount, channelsCount, 3, 3 }; // out channel, /input channels, kernel h, kernel w if (netPrecision == Precision::FP32) { std::vector weightValues2; - weightValues2.resize(3 * 3 * 3 * 3); + weightValues2.resize(channelsCount * channelsCount * 3 * 3); BFloat16Helpers::fillInputsBySinValues(weightValues2.data(), weightValues2.size()); weightsNode2 = std::make_shared(ntype, convFilterShape2, weightValues2); } else { std::vector weightValues2BF16; - weightValues2BF16.resize(3 * 3 * 3 * 3); + weightValues2BF16.resize(channelsCount * channelsCount * 3 * 3); BFloat16Helpers::fillInputsBySinValues(weightValues2BF16.data(), weightValues2BF16.size()); weightsNode2 = std::make_shared(ntype, convFilterShape2, weightValues2BF16.data()); } @@ -112,12 +114,12 @@ protected: return std::make_shared(ngraph::NodeVector{convNode2}, ngraph::ParameterVector{input1}); } - void SetUp()override { + void SetUp() override { std::tie(inputPrecision, netPrecision, inputShapes, newInputShapes, targetDevice) = this->GetParam(); fnPtr = createGraph(netPrecision); // STAGE1: - threshold = 0.2f; // max value in the latest tensor for FP32 network is 37.77 + threshold = 1.0f; // max value in the latest tensor for FP32 network is 37.77 // STAGE2: // filling of expected precision of layer execution defined by precisoin of input tensor to the primitive and reflected in // performance counters diff --git a/inference-engine/tests/functional/plugin/cpu/bfloat16/scaleshift_conv_eltwise_relu_conv.cpp b/inference-engine/tests/functional/plugin/cpu/bfloat16/scaleshift_conv_eltwise_relu_conv.cpp index ba7c17b29ec..2ac468e81df 100644 --- a/inference-engine/tests/functional/plugin/cpu/bfloat16/scaleshift_conv_eltwise_relu_conv.cpp +++ b/inference-engine/tests/functional/plugin/cpu/bfloat16/scaleshift_conv_eltwise_relu_conv.cpp @@ -27,7 +27,7 @@ namespace LayerTestsDefinitions { class ScaleshiftConvEltwiseReluConv : public BasicBF16Test { protected: - std::shared_ptr createGraph(InferenceEngine::Precision netPrecision)override { + std::shared_ptr createGraph(InferenceEngine::Precision netPrecision) override { // scaleshift (FP32) Conv (FP32_ // \ / // Eltwise (Fused into conv) @@ -37,8 +37,10 @@ protected: // Conv (BF16) ngraph::element::Type ntype = (netPrecision == Precision::FP32) ? ngraph::element::f32 : ngraph::element::bf16; + auto channelsCount = inputShapes[1]; + // multiply - auto input1 = std::make_shared(ntype, ngraph::Shape{1, 3, 40, 40}); + auto input1 = std::make_shared(ntype, ngraph::Shape{inputShapes}); input1->set_friendly_name("Input_1"); std::shared_ptr const1 = nullptr; if (netPrecision == Precision::FP32) { @@ -60,15 +62,15 @@ protected: // convolution std::shared_ptr weightsNode = nullptr; - ngraph::Shape convFilterShape = { 3, 3, 3, 3 }; // out channel, /input channels, kernel h, kernel w + ngraph::Shape convFilterShape = { channelsCount, channelsCount, 3, 3 }; // out channel, /input channels, kernel h, kernel w if (netPrecision == Precision::FP32) { std::vector weightValuesFP32; - weightValuesFP32.resize(3 * 3 * 3 * 3); + weightValuesFP32.resize(channelsCount * channelsCount * 3 * 3); BFloat16Helpers::fillInputsBySinValues(weightValuesFP32.data(), weightValuesFP32.size()); weightsNode = std::make_shared(ntype, convFilterShape, weightValuesFP32); } else { std::vector weightValuesBF16; - weightValuesBF16.resize(3 * 3 * 3 * 3); + weightValuesBF16.resize(channelsCount * channelsCount * 3 * 3); BFloat16Helpers::fillInputsBySinValues(weightValuesBF16.data(), weightValuesBF16.size()); weightsNode = std::make_shared(ntype, convFilterShape, weightValuesBF16.data()); } @@ -92,15 +94,15 @@ protected: // Convolution std::shared_ptr weightsNode2 = nullptr; - ngraph::Shape convFilterShape2 = { 3, 3, 3, 3 }; // out channel, /input channels, kernel h, kernel w + ngraph::Shape convFilterShape2 = { channelsCount, channelsCount, 3, 3 }; // out channel, /input channels, kernel h, kernel w if (netPrecision == Precision::FP32) { std::vector weightValues2; - weightValues2.resize(3 * 3 * 3 * 3); + weightValues2.resize(channelsCount * channelsCount * 3 * 3); BFloat16Helpers::fillInputsBySinValues(weightValues2.data(), weightValues2.size()); weightsNode2 = std::make_shared(ntype, convFilterShape2, weightValues2); } else { std::vector weightValues2BF16; - weightValues2BF16.resize(3 * 3 * 3 * 3); + weightValues2BF16.resize(channelsCount * channelsCount * 3 * 3); BFloat16Helpers::fillInputsBySinValues(weightValues2BF16.data(), weightValues2BF16.size()); weightsNode2 = std::make_shared(ntype, convFilterShape2, weightValues2BF16.data()); } @@ -116,12 +118,12 @@ protected: return std::make_shared(ngraph::NodeVector{convNode2}, ngraph::ParameterVector{input1}); } - void SetUp()override { + void SetUp() override { std::tie(inputPrecision, netPrecision, inputShapes, newInputShapes, targetDevice) = this->GetParam(); fnPtr = createGraph(netPrecision); // STAGE1: - threshold = 9e-2; + threshold = 1.0f; // Max in fp32 network by output CONV_2: 30.1374 // STAGE2: // filling of expected precision of layer execution defined by precisoin of input tensor to the primitive and reflected in // performance counters diff --git a/inference-engine/tests/functional/plugin/cpu/bfloat16/scaleshift_conv_eltwise_scaleshift.cpp b/inference-engine/tests/functional/plugin/cpu/bfloat16/scaleshift_conv_eltwise_scaleshift.cpp index 41f81cbb252..e0fa90445c3 100644 --- a/inference-engine/tests/functional/plugin/cpu/bfloat16/scaleshift_conv_eltwise_scaleshift.cpp +++ b/inference-engine/tests/functional/plugin/cpu/bfloat16/scaleshift_conv_eltwise_scaleshift.cpp @@ -27,7 +27,7 @@ namespace LayerTestsDefinitions { class ScaleshiftConvEltwiseScaleshift : public BasicBF16Test { protected: - std::shared_ptr createGraph(InferenceEngine::Precision netPrecision)override { + std::shared_ptr createGraph(InferenceEngine::Precision netPrecision) override { // scaleshift (FP32) // | // Conv (BF16) @@ -37,8 +37,10 @@ protected: // scaleshift (FP32) ngraph::element::Type ntype = (netPrecision == Precision::FP32) ? ngraph::element::f32 : ngraph::element::bf16; + auto channelsCount = inputShapes[1]; + // multiply - auto input1 = std::make_shared(ntype, ngraph::Shape{1, 3, 40, 40}); + auto input1 = std::make_shared(ntype, ngraph::Shape{inputShapes}); input1->set_friendly_name("Input_1"); std::shared_ptr const1 = nullptr; if (netPrecision == Precision::FP32) { @@ -60,15 +62,15 @@ protected: // convolution std::shared_ptr weightsNode = nullptr; - ngraph::Shape convFilterShape = { 3, 3, 3, 3 }; // out channel, /input channels, kernel h, kernel w + ngraph::Shape convFilterShape = { channelsCount, channelsCount, 3, 3 }; // out channel, /input channels, kernel h, kernel w if (netPrecision == Precision::FP32) { std::vector weightValuesFP32; - weightValuesFP32.resize(3 * 3 * 3 * 3); + weightValuesFP32.resize(channelsCount * channelsCount * 3 * 3); BFloat16Helpers::fillInputsBySinValues(weightValuesFP32.data(), weightValuesFP32.size()); weightsNode = std::make_shared(ntype, convFilterShape, weightValuesFP32); } else { std::vector weightValuesBF16; - weightValuesBF16.resize(3 * 3 * 3 * 3); + weightValuesBF16.resize(channelsCount * channelsCount * 3 * 3); BFloat16Helpers::fillInputsBySinValues(weightValuesBF16.data(), weightValuesBF16.size()); weightsNode = std::make_shared(ntype, convFilterShape, weightValuesBF16.data()); } @@ -110,7 +112,7 @@ protected: return std::make_shared(ngraph::NodeVector{addNode2}, ngraph::ParameterVector{input1}); } - void SetUp()override { + void SetUp() override { std::tie(inputPrecision, netPrecision, inputShapes, newInputShapes, targetDevice) = this->GetParam(); fnPtr = createGraph(netPrecision); diff --git a/inference-engine/tests/functional/plugin/cpu/bfloat16/scaleshift_conv_elu_conv.cpp b/inference-engine/tests/functional/plugin/cpu/bfloat16/scaleshift_conv_elu_conv.cpp index fc63492e2d7..110ef28a8ae 100644 --- a/inference-engine/tests/functional/plugin/cpu/bfloat16/scaleshift_conv_elu_conv.cpp +++ b/inference-engine/tests/functional/plugin/cpu/bfloat16/scaleshift_conv_elu_conv.cpp @@ -27,7 +27,7 @@ namespace LayerTestsDefinitions { class ScaleshiftConvEluConv : public BasicBF16Test { protected: - std::shared_ptr createGraph(InferenceEngine::Precision netPrecision)override { + std::shared_ptr createGraph(InferenceEngine::Precision netPrecision) override { // scaleshift (FP32) // | // Conv (BF16) @@ -37,8 +37,10 @@ protected: // Conv (BF16) ngraph::element::Type ntype = (netPrecision == Precision::FP32) ? ngraph::element::f32 : ngraph::element::bf16; + auto channelsCount = inputShapes[1]; + // multiply - auto input1 = std::make_shared(ntype, ngraph::Shape{1, 3, 40, 40}); + auto input1 = std::make_shared(ntype, ngraph::Shape{inputShapes}); input1->set_friendly_name("Input_1"); std::shared_ptr const1 = nullptr; if (netPrecision == Precision::FP32) { @@ -60,15 +62,15 @@ protected: // convolution std::shared_ptr weightsNode = nullptr; - ngraph::Shape convFilterShape = { 3, 3, 3, 3 }; // out channel, /input channels, kernel h, kernel w + ngraph::Shape convFilterShape = { channelsCount, channelsCount, 3, 3 }; // out channel, /input channels, kernel h, kernel w if (netPrecision == Precision::FP32) { std::vector weightValuesFP32; - weightValuesFP32.resize(3 * 3 * 3 * 3); + weightValuesFP32.resize(channelsCount * channelsCount * 3 * 3); BFloat16Helpers::fillInputsBySinValues(weightValuesFP32.data(), weightValuesFP32.size()); weightsNode = std::make_shared(ntype, convFilterShape, weightValuesFP32); } else { std::vector weightValuesBF16; - weightValuesBF16.resize(3 * 3 * 3 * 3); + weightValuesBF16.resize(channelsCount * channelsCount * 3 * 3); BFloat16Helpers::fillInputsBySinValues(weightValuesBF16.data(), weightValuesBF16.size()); weightsNode = std::make_shared(ntype, convFilterShape, weightValuesBF16.data()); } @@ -98,7 +100,7 @@ protected: return std::make_shared(ngraph::NodeVector{convNode2}, ngraph::ParameterVector{input1}); } - void SetUp()override { + void SetUp() override { std::tie(inputPrecision, netPrecision, inputShapes, newInputShapes, targetDevice) = this->GetParam(); fnPtr = createGraph(netPrecision); @@ -109,7 +111,6 @@ protected: // performance counters expectedPrecisions["ADD_1"] = "FP32"; expectedPrecisions["CONV_1"] = "BF16"; - expectedPrecisions["ELU_1"] = "FP32"; expectedPrecisions["CONV_2"] = "BF16"; } }; diff --git a/inference-engine/tests/functional/plugin/cpu/bfloat16/scaleshift_conv_relu.cpp b/inference-engine/tests/functional/plugin/cpu/bfloat16/scaleshift_conv_relu.cpp index 6e5df70f31e..e6a62a84861 100644 --- a/inference-engine/tests/functional/plugin/cpu/bfloat16/scaleshift_conv_relu.cpp +++ b/inference-engine/tests/functional/plugin/cpu/bfloat16/scaleshift_conv_relu.cpp @@ -27,7 +27,7 @@ namespace LayerTestsDefinitions { class ScaleshiftConvRelu : public BasicBF16Test { protected: - std::shared_ptr createGraph(InferenceEngine::Precision netPrecision)override { + std::shared_ptr createGraph(InferenceEngine::Precision netPrecision) override { // scaleshift (FP32) // | // Conv (BF16) @@ -35,8 +35,10 @@ protected: // relu (Fused into convolution) ngraph::element::Type ntype = (netPrecision == Precision::FP32) ? ngraph::element::f32 : ngraph::element::bf16; + auto channelsCount = inputShapes[1]; + // multiply - auto input1 = std::make_shared(ntype, ngraph::Shape{1, 3, 40, 40}); + auto input1 = std::make_shared(ntype, ngraph::Shape{inputShapes}); input1->set_friendly_name("Input_1"); std::shared_ptr const1 = nullptr; if (netPrecision == Precision::FP32) { @@ -58,15 +60,15 @@ protected: // convolution std::shared_ptr weightsNode = nullptr; - ngraph::Shape convFilterShape = { 3, 3, 3, 3 }; // out channel, /input channels, kernel h, kernel w + ngraph::Shape convFilterShape = { channelsCount, channelsCount, 3, 3 }; // out channel, /input channels, kernel h, kernel w if (netPrecision == Precision::FP32) { std::vector weightValuesFP32; - weightValuesFP32.resize(3 * 3 * 3 * 3); + weightValuesFP32.resize(channelsCount * channelsCount * 3 * 3); BFloat16Helpers::fillInputsBySinValues(weightValuesFP32.data(), weightValuesFP32.size()); weightsNode = std::make_shared(ntype, convFilterShape, weightValuesFP32); } else { std::vector weightValuesBF16; - weightValuesBF16.resize(3 * 3 * 3 * 3); + weightValuesBF16.resize(channelsCount * channelsCount * 3 * 3); BFloat16Helpers::fillInputsBySinValues(weightValuesBF16.data(), weightValuesBF16.size()); weightsNode = std::make_shared(ntype, convFilterShape, weightValuesBF16.data()); } @@ -86,7 +88,7 @@ protected: return std::make_shared(ngraph::NodeVector{reluNode}, ngraph::ParameterVector{input1}); } - void SetUp()override { + void SetUp() override { std::tie(inputPrecision, netPrecision, inputShapes, newInputShapes, targetDevice) = this->GetParam(); fnPtr = createGraph(netPrecision); diff --git a/inference-engine/tests/functional/plugin/cpu/bfloat16/scaleshift_conv_x2_concat_relu.cpp b/inference-engine/tests/functional/plugin/cpu/bfloat16/scaleshift_conv_x2_concat_relu.cpp index 11dcb1e841a..5597b97f27a 100644 --- a/inference-engine/tests/functional/plugin/cpu/bfloat16/scaleshift_conv_x2_concat_relu.cpp +++ b/inference-engine/tests/functional/plugin/cpu/bfloat16/scaleshift_conv_x2_concat_relu.cpp @@ -27,7 +27,7 @@ namespace LayerTestsDefinitions { class ScaleshiftConv_x2_ConcatRelu : public BasicBF16Test { protected: - std::shared_ptr createGraph(InferenceEngine::Precision netPrecision)override { + std::shared_ptr createGraph(InferenceEngine::Precision netPrecision) override { // scaleshift // / \ // Conv Conv @@ -37,8 +37,10 @@ protected: // relu ngraph::element::Type ntype = (netPrecision == Precision::FP32) ? ngraph::element::f32 : ngraph::element::bf16; + auto channelsCount = inputShapes[1]; + // multiply - auto input1 = std::make_shared(ntype, ngraph::Shape{1, 3, 40, 40}); + auto input1 = std::make_shared(ntype, ngraph::Shape{inputShapes}); input1->set_friendly_name("Input_1"); std::shared_ptr const1 = nullptr; if (netPrecision == Precision::FP32) { @@ -60,15 +62,15 @@ protected: // convolution std::shared_ptr weightsNode = nullptr; - ngraph::Shape convFilterShape = { 3, 3, 3, 3 }; // out channel, /input channels, kernel h, kernel w + ngraph::Shape convFilterShape = { channelsCount, channelsCount, 3, 3 }; // out channel, /input channels, kernel h, kernel w if (netPrecision == Precision::FP32) { std::vector weightValuesFP32; - weightValuesFP32.resize(3 * 3 * 3 * 3); + weightValuesFP32.resize(channelsCount * channelsCount * 3 * 3); BFloat16Helpers::fillInputsBySinValues(weightValuesFP32.data(), weightValuesFP32.size()); weightsNode = std::make_shared(ntype, convFilterShape, weightValuesFP32); } else { std::vector weightValuesBF16; - weightValuesBF16.resize(3 * 3 * 3 * 3); + weightValuesBF16.resize(channelsCount * channelsCount * 3 * 3); BFloat16Helpers::fillInputsBySinValues(weightValuesBF16.data(), weightValuesBF16.size()); weightsNode = std::make_shared(ntype, convFilterShape, weightValuesBF16.data()); } @@ -93,9 +95,7 @@ protected: // Concat ngraph::NodeVector concInputNodes = { convNode1, convNode2 }; - - // test is to be failed, if axis == 1 - TODO - auto concNode = std::make_shared(concInputNodes, 2); + auto concNode = std::make_shared(concInputNodes, 1); concNode->set_friendly_name("CONC_1"); // ReLU @@ -105,7 +105,7 @@ protected: return std::make_shared(ngraph::NodeVector{reluNode}, ngraph::ParameterVector{input1}); } - void SetUp()override { + void SetUp() override { std::tie(inputPrecision, netPrecision, inputShapes, newInputShapes, targetDevice) = this->GetParam(); fnPtr = createGraph(netPrecision); diff --git a/inference-engine/tests/functional/plugin/cpu/bfloat16/scaleshift_conv_x2_eltwise.cpp b/inference-engine/tests/functional/plugin/cpu/bfloat16/scaleshift_conv_x2_eltwise.cpp index 82340d26d23..d4f1fda6899 100644 --- a/inference-engine/tests/functional/plugin/cpu/bfloat16/scaleshift_conv_x2_eltwise.cpp +++ b/inference-engine/tests/functional/plugin/cpu/bfloat16/scaleshift_conv_x2_eltwise.cpp @@ -27,7 +27,7 @@ namespace LayerTestsDefinitions { class ScaleshiftConv_x2_Eltwise : public BasicBF16Test { protected: - std::shared_ptr createGraph(InferenceEngine::Precision netPrecision)override { + std::shared_ptr createGraph(InferenceEngine::Precision netPrecision) override { // scaleshift (FP32) // / \ // Conv1 (BF16) Conv1 (BF16) @@ -35,8 +35,10 @@ protected: // eltwise (Fused into Conv1) produce FP32 output ngraph::element::Type ntype = (netPrecision == Precision::FP32) ? ngraph::element::f32 : ngraph::element::bf16; + auto channelsCount = inputShapes[1]; + // multiply - auto input1 = std::make_shared(ntype, ngraph::Shape{1, 3, 40, 40}); + auto input1 = std::make_shared(ntype, ngraph::Shape{inputShapes}); input1->set_friendly_name("Input_1"); std::shared_ptr const1 = nullptr; if (netPrecision == Precision::FP32) { @@ -58,15 +60,15 @@ protected: // convolution std::shared_ptr weightsNode = nullptr; - ngraph::Shape convFilterShape = { 3, 3, 3, 3 }; // out channel, /input channels, kernel h, kernel w + ngraph::Shape convFilterShape = { channelsCount, channelsCount, 3, 3 }; // out channel, /input channels, kernel h, kernel w if (netPrecision == Precision::FP32) { std::vector weightValuesFP32; - weightValuesFP32.resize(3 * 3 * 3 * 3); + weightValuesFP32.resize(channelsCount * channelsCount * 3 * 3); BFloat16Helpers::fillInputsBySinValues(weightValuesFP32.data(), weightValuesFP32.size()); weightsNode = std::make_shared(ntype, convFilterShape, weightValuesFP32); } else { std::vector weightValuesBF16; - weightValuesBF16.resize(3 * 3 * 3 * 3); + weightValuesBF16.resize(channelsCount * channelsCount * 3 * 3); BFloat16Helpers::fillInputsBySinValues(weightValuesBF16.data(), weightValuesBF16.size()); weightsNode = std::make_shared(ntype, convFilterShape, weightValuesBF16.data()); } @@ -95,7 +97,7 @@ protected: return std::make_shared(ngraph::NodeVector{eltNode}, ngraph::ParameterVector{input1}); } - void SetUp()override { + void SetUp() override { std::tie(inputPrecision, netPrecision, inputShapes, newInputShapes, targetDevice) = this->GetParam(); fnPtr = createGraph(netPrecision); diff --git a/inference-engine/tests/functional/plugin/cpu/bfloat16/scaleshift_conv_x2_mixed1_eltwise.cpp b/inference-engine/tests/functional/plugin/cpu/bfloat16/scaleshift_conv_x2_mixed1_eltwise.cpp index 86bcc5212c2..d3b72634e2b 100644 --- a/inference-engine/tests/functional/plugin/cpu/bfloat16/scaleshift_conv_x2_mixed1_eltwise.cpp +++ b/inference-engine/tests/functional/plugin/cpu/bfloat16/scaleshift_conv_x2_mixed1_eltwise.cpp @@ -27,7 +27,7 @@ namespace LayerTestsDefinitions { class ScaleshiftConv_x2_mixed1_Eltwise : public BasicBF16Test { protected: - std::shared_ptr createGraph(InferenceEngine::Precision netPrecision)override { + std::shared_ptr createGraph(InferenceEngine::Precision netPrecision) override { // scaleshift (FP32) // | | // Conv1(BF16) Conv2(FP32) @@ -35,8 +35,10 @@ protected: // eltwise(Fused into Conv1) ngraph::element::Type ntype = (netPrecision == Precision::FP32) ? ngraph::element::f32 : ngraph::element::bf16; + auto channelsCount = inputShapes[1]; + // multiply - auto input1 = std::make_shared(ntype, ngraph::Shape{1, 3, 40, 40}); + auto input1 = std::make_shared(ntype, ngraph::Shape{inputShapes}); input1->set_friendly_name("Input_1"); std::shared_ptr const1 = nullptr; if (netPrecision == Precision::FP32) { @@ -58,15 +60,15 @@ protected: // convolution std::shared_ptr weightsNode = nullptr; - ngraph::Shape convFilterShape = { 3, 3, 3, 3 }; // out channel, /input channels, kernel h, kernel w + ngraph::Shape convFilterShape = { channelsCount, channelsCount, 3, 3 }; // out channel, /input channels, kernel h, kernel w if (netPrecision == Precision::FP32) { std::vector weightValuesFP32; - weightValuesFP32.resize(3 * 3 * 3 * 3); + weightValuesFP32.resize(channelsCount * channelsCount * 3 * 3); BFloat16Helpers::fillInputsBySinValues(weightValuesFP32.data(), weightValuesFP32.size()); weightsNode = std::make_shared(ntype, convFilterShape, weightValuesFP32); } else { std::vector weightValuesBF16; - weightValuesBF16.resize(3 * 3 * 3 * 3); + weightValuesBF16.resize(channelsCount * channelsCount * 3 * 3); BFloat16Helpers::fillInputsBySinValues(weightValuesBF16.data(), weightValuesBF16.size()); weightsNode = std::make_shared(ntype, convFilterShape, weightValuesBF16.data()); } @@ -95,7 +97,7 @@ protected: return std::make_shared(ngraph::NodeVector{eltNode}, ngraph::ParameterVector{input1}); } - void SetUp()override { + void SetUp() override { std::tie(inputPrecision, netPrecision, inputShapes, newInputShapes, targetDevice) = this->GetParam(); fnPtr = createGraph(netPrecision); diff --git a/inference-engine/tests/functional/plugin/cpu/bfloat16/scaleshift_conv_x2_mixed2_eltwise.cpp b/inference-engine/tests/functional/plugin/cpu/bfloat16/scaleshift_conv_x2_mixed2_eltwise.cpp index 1e483bf20db..f76c90874bb 100644 --- a/inference-engine/tests/functional/plugin/cpu/bfloat16/scaleshift_conv_x2_mixed2_eltwise.cpp +++ b/inference-engine/tests/functional/plugin/cpu/bfloat16/scaleshift_conv_x2_mixed2_eltwise.cpp @@ -27,7 +27,7 @@ namespace LayerTestsDefinitions { class ScaleshiftConv_x2_mixed2_Eltwise : public BasicBF16Test { protected: - std::shared_ptr createGraph(InferenceEngine::Precision netPrecision)override { + std::shared_ptr createGraph(InferenceEngine::Precision netPrecision) override { // scaleshift (FP32) // | | // Conv1 (FP32) Conv2 (Bf16) @@ -35,19 +35,21 @@ protected: // eltwise (Fused into Conv1) ngraph::element::Type ntype = (netPrecision == Precision::FP32) ? ngraph::element::f32 : ngraph::element::bf16; - auto input1 = std::make_shared(ntype, ngraph::Shape{1, 3, 40, 40}); + auto channelsCount = inputShapes[1]; + + auto input1 = std::make_shared(ntype, ngraph::Shape{inputShapes}); // convolution std::shared_ptr weightsNode = nullptr; - ngraph::Shape convFilterShape = { 3, 3, 3, 3 }; // out channel, /input channels, kernel h, kernel w + ngraph::Shape convFilterShape = { channelsCount, channelsCount, 3, 3 }; // out channel, /input channels, kernel h, kernel w if (netPrecision == Precision::FP32) { std::vector weightValuesFP32; - weightValuesFP32.resize(3 * 3 * 3 * 3); + weightValuesFP32.resize(channelsCount * channelsCount * 3 * 3); BFloat16Helpers::fillInputsBySinValues(weightValuesFP32.data(), weightValuesFP32.size()); weightsNode = std::make_shared(ntype, convFilterShape, weightValuesFP32); } else { std::vector weightValuesBF16; - weightValuesBF16.resize(3 * 3 * 3 * 3); + weightValuesBF16.resize(channelsCount * channelsCount * 3 * 3); BFloat16Helpers::fillInputsBySinValues(weightValuesBF16.data(), weightValuesBF16.size()); weightsNode = std::make_shared(ntype, convFilterShape, weightValuesBF16.data()); } @@ -98,7 +100,7 @@ protected: return std::make_shared(ngraph::NodeVector{eltNode}, ngraph::ParameterVector{input1}); } - void SetUp()override { + void SetUp() override { std::tie(inputPrecision, netPrecision, inputShapes, newInputShapes, targetDevice) = this->GetParam(); fnPtr = createGraph(netPrecision); diff --git a/inference-engine/tests/functional/plugin/cpu/bfloat16/scaleshift_conv_x3_eltwise.cpp b/inference-engine/tests/functional/plugin/cpu/bfloat16/scaleshift_conv_x3_eltwise.cpp index 361dc01796c..1a4fb8110c2 100644 --- a/inference-engine/tests/functional/plugin/cpu/bfloat16/scaleshift_conv_x3_eltwise.cpp +++ b/inference-engine/tests/functional/plugin/cpu/bfloat16/scaleshift_conv_x3_eltwise.cpp @@ -27,7 +27,7 @@ namespace LayerTestsDefinitions { class ScaleshiftConv_x3_Eltwise : public BasicBF16Test { protected: - std::shared_ptr createGraph(InferenceEngine::Precision netPrecision)override { + std::shared_ptr createGraph(InferenceEngine::Precision netPrecision) override { // scaleshift (FP32) // // / \ @@ -43,8 +43,11 @@ protected: // Conv3 (BF16) ngraph::element::Type ntype = (netPrecision == Precision::FP32) ? ngraph::element::f32 : ngraph::element::bf16; + auto channelsCount = inputShapes[1]; + const int outChannels = 16; + // multiply - auto input1 = std::make_shared(ntype, ngraph::Shape{1, 3, 40, 40}); + auto input1 = std::make_shared(ntype, ngraph::Shape{inputShapes}); input1->set_friendly_name("Input_1"); std::shared_ptr const1 = nullptr; if (netPrecision == Precision::FP32) { @@ -66,15 +69,15 @@ protected: // convolution std::shared_ptr weightsNode = nullptr; - ngraph::Shape convFilterShape = { 16, 3, 3, 3 }; // out channel, /input channels, kernel h, kernel w + ngraph::Shape convFilterShape = { outChannels, channelsCount, 3, 3 }; // out channel, /input channels, kernel h, kernel w if (netPrecision == Precision::FP32) { std::vector weightValuesFP32; - weightValuesFP32.resize(16 * 3 * 3 * 3); + weightValuesFP32.resize(outChannels * channelsCount * 3 * 3); BFloat16Helpers::fillInputsBySinValues(weightValuesFP32.data(), weightValuesFP32.size()); weightsNode = std::make_shared(ntype, convFilterShape, weightValuesFP32); } else { std::vector weightValuesBF16; - weightValuesBF16.resize(16 * 3 * 3 * 3); + weightValuesBF16.resize(outChannels * channelsCount * 3 * 3); BFloat16Helpers::fillInputsBySinValues(weightValuesBF16.data(), weightValuesBF16.size()); weightsNode = std::make_shared(ntype, convFilterShape, weightValuesBF16.data()); } @@ -103,15 +106,15 @@ protected: // Convolution std::shared_ptr weightsNode3 = nullptr; - ngraph::Shape convFilterShape3 = { 16, 16, 3, 3 }; // out channel, /input channels, kernel h, kernel w + ngraph::Shape convFilterShape3 = { outChannels, outChannels, 3, 3 }; // out channel, /input channels, kernel h, kernel w if (netPrecision == Precision::FP32) { std::vector weightValuesFP32; - weightValuesFP32.resize(16 * 16 * 3 * 3); + weightValuesFP32.resize(outChannels * outChannels * 3 * 3); BFloat16Helpers::fillInputsBySinValues(weightValuesFP32.data(), weightValuesFP32.size()); weightsNode3 = std::make_shared(ntype, convFilterShape3, weightValuesFP32); } else { std::vector weightValuesBF16; - weightValuesBF16.resize(16 * 16 * 3 * 3); + weightValuesBF16.resize(outChannels * outChannels * 3 * 3); BFloat16Helpers::fillInputsBySinValues(weightValuesBF16.data(), weightValuesBF16.size()); weightsNode3 = std::make_shared(ntype, convFilterShape3, weightValuesBF16.data()); } @@ -128,12 +131,12 @@ protected: return std::make_shared(ngraph::NodeVector{convNode3}, ngraph::ParameterVector{input1}); } - void SetUp()override { + void SetUp() override { std::tie(inputPrecision, netPrecision, inputShapes, newInputShapes, targetDevice) = this->GetParam(); fnPtr = createGraph(netPrecision); // STAGE1: - threshold = 1.0f; // max value in the latest tensor for FP32 network is 93.3 + threshold = 2.0f; // max value in the latest tensor for FP32 network is 93.3 // STAGE2: // filling of expected precision of layer execution defined by precisoin of input tensor to the primitive and reflected in diff --git a/inference-engine/tests/functional/plugin/cpu/bfloat16/scaleshift_x2_conv_x2_eltwise.cpp b/inference-engine/tests/functional/plugin/cpu/bfloat16/scaleshift_x2_conv_x2_eltwise.cpp index 3daece18ba1..f90d4f4f84d 100644 --- a/inference-engine/tests/functional/plugin/cpu/bfloat16/scaleshift_x2_conv_x2_eltwise.cpp +++ b/inference-engine/tests/functional/plugin/cpu/bfloat16/scaleshift_x2_conv_x2_eltwise.cpp @@ -27,7 +27,7 @@ namespace LayerTestsDefinitions { class Scaleshift_x2_Conv_x2_Eltwise : public BasicBF16Test { protected: - std::shared_ptr createGraph(InferenceEngine::Precision netPrecision)override { + std::shared_ptr createGraph(InferenceEngine::Precision netPrecision) override { // // scaleshift (FP32) scaleshift (FP32) // \ / \ @@ -37,8 +37,10 @@ protected: // | ngraph::element::Type ntype = (netPrecision == Precision::FP32) ? ngraph::element::f32 : ngraph::element::bf16; + auto channelsCount = inputShapes[1]; + // multiply - auto input1 = std::make_shared(ntype, ngraph::Shape{1, 3, 40, 40}); + auto input1 = std::make_shared(ntype, ngraph::Shape{inputShapes}); input1->set_friendly_name("Input_1"); std::shared_ptr const1 = nullptr; if (netPrecision == Precision::FP32) { @@ -83,15 +85,15 @@ protected: // convolution std::shared_ptr weightsNode = nullptr; - ngraph::Shape convFilterShape = { 3, 3, 3, 3 }; // out channel, /input channels, kernel h, kernel w + ngraph::Shape convFilterShape = { channelsCount, channelsCount, 3, 3 }; // out channel, /input channels, kernel h, kernel w if (netPrecision == Precision::FP32) { std::vector weightValuesFP32; - weightValuesFP32.resize(3 * 3 * 3 * 3); + weightValuesFP32.resize(channelsCount * channelsCount * 3 * 3); BFloat16Helpers::fillInputsBySinValues(weightValuesFP32.data(), weightValuesFP32.size()); weightsNode = std::make_shared(ntype, convFilterShape, weightValuesFP32); } else { std::vector weightValuesBF16; - weightValuesBF16.resize(3 * 3 * 3 * 3); + weightValuesBF16.resize(channelsCount * channelsCount * 3 * 3); BFloat16Helpers::fillInputsBySinValues(weightValuesBF16.data(), weightValuesBF16.size()); weightsNode = std::make_shared(ntype, convFilterShape, weightValuesBF16.data()); } @@ -116,7 +118,7 @@ protected: return std::make_shared(ngraph::NodeVector{eltNode, convNode2}, ngraph::ParameterVector{input1}); } - void SetUp()override { + void SetUp() override { std::tie(inputPrecision, netPrecision, inputShapes, newInputShapes, targetDevice) = this->GetParam(); fnPtr = createGraph(netPrecision); diff --git a/inference-engine/tests/functional/plugin/cpu/bfloat16/scaleshift_x3_conv_eltwise_relu.cpp b/inference-engine/tests/functional/plugin/cpu/bfloat16/scaleshift_x3_conv_eltwise_relu.cpp index 3c22d1890b9..2b0de268f02 100644 --- a/inference-engine/tests/functional/plugin/cpu/bfloat16/scaleshift_x3_conv_eltwise_relu.cpp +++ b/inference-engine/tests/functional/plugin/cpu/bfloat16/scaleshift_x3_conv_eltwise_relu.cpp @@ -27,7 +27,7 @@ namespace LayerTestsDefinitions { class Scaleshift_x3_ConvEltwiseRelu : public BasicBF16Test { protected: - std::shared_ptr createGraph(InferenceEngine::Precision netPrecision)override { + std::shared_ptr createGraph(InferenceEngine::Precision netPrecision) override { // // scaleshift (FP32) // | @@ -42,9 +42,10 @@ protected: // scaleshift (FP32) ngraph::element::Type ntype = (netPrecision == Precision::FP32) ? ngraph::element::f32 : ngraph::element::bf16; + auto channelsCount = inputShapes[1]; // multiply - auto input1 = std::make_shared(ntype, ngraph::Shape{1, 3, 40, 40}); + auto input1 = std::make_shared(ntype, ngraph::Shape{inputShapes}); std::shared_ptr const1 = nullptr; if (netPrecision == Precision::FP32) { const1 = opset1::Constant::create(ntype, Shape{1}, { 2.0f }); @@ -65,15 +66,15 @@ protected: // convolution std::shared_ptr weightsNode = nullptr; - ngraph::Shape convFilterShape = { 3, 3, 3, 3 }; // out channel, /input channels, kernel h, kernel w + ngraph::Shape convFilterShape = { channelsCount, channelsCount, 3, 3 }; // out channel, /input channels, kernel h, kernel w if (netPrecision == Precision::FP32) { std::vector weightValuesFP32; - weightValuesFP32.resize(3 * 3 * 3 * 3); + weightValuesFP32.resize(channelsCount * channelsCount * 3 * 3); BFloat16Helpers::fillInputsBySinValues(weightValuesFP32.data(), weightValuesFP32.size()); weightsNode = std::make_shared(ntype, convFilterShape, weightValuesFP32); } else { std::vector weightValuesBF16; - weightValuesBF16.resize(3 * 3 * 3 * 3); + weightValuesBF16.resize(channelsCount * channelsCount * 3 * 3); BFloat16Helpers::fillInputsBySinValues(weightValuesBF16.data(), weightValuesBF16.size()); weightsNode = std::make_shared(ntype, convFilterShape, weightValuesBF16.data()); } @@ -136,7 +137,7 @@ protected: return std::make_shared(ngraph::NodeVector{addNode3}, ngraph::ParameterVector{input1}); } - void SetUp()override { + void SetUp() override { std::tie(inputPrecision, netPrecision, inputShapes, newInputShapes, targetDevice) = this->GetParam(); fnPtr = createGraph(netPrecision); @@ -155,9 +156,9 @@ protected: } }; - TEST_P(Scaleshift_x3_ConvEltwiseRelu, CompareWithRefImpl) { - test(); - }; +TEST_P(Scaleshift_x3_ConvEltwiseRelu, CompareWithRefImpl) { + test(); +}; INSTANTIATE_TEST_CASE_P(FP32_bfloat16_NoReshape, Scaleshift_x3_ConvEltwiseRelu, ::testing::Combine( diff --git a/inference-engine/tests/functional/plugin/cpu/bfloat16/tail_fp32_optimization.cpp b/inference-engine/tests/functional/plugin/cpu/bfloat16/tail_fp32_optimization.cpp index 3a99203e252..4ed11f72ee7 100644 --- a/inference-engine/tests/functional/plugin/cpu/bfloat16/tail_fp32_optimization.cpp +++ b/inference-engine/tests/functional/plugin/cpu/bfloat16/tail_fp32_optimization.cpp @@ -27,7 +27,7 @@ namespace LayerTestsDefinitions { class PoolingAfterConv : public BasicBF16Test { protected: - std::shared_ptr createGraph(InferenceEngine::Precision netPrecision)override { + std::shared_ptr createGraph(InferenceEngine::Precision netPrecision) override { // Scaleshift (FP32) // | // Convolution (BF16) @@ -40,8 +40,11 @@ protected: // STAGE1: construction of the GRAPH ngraph::element::Type ntype = (netPrecision == Precision::FP32) ? ngraph::element::f32 : ngraph::element::bf16; + auto channelsCount = inputShapes[1]; + const int outChannels = 16; + // multiply - auto input1 = std::make_shared(ntype, ngraph::Shape{1, 3, 40, 40}); + auto input1 = std::make_shared(ntype, ngraph::Shape{inputShapes}); input1->set_friendly_name("Input_1"); std::shared_ptr const1 = nullptr; if (netPrecision == Precision::FP32) { @@ -63,15 +66,15 @@ protected: // convolution std::shared_ptr weightsNode = nullptr; - ngraph::Shape convFilterShape = { 16, 3, 3, 3 }; // out channel, /input channels, kernel h, kernel w + ngraph::Shape convFilterShape = { outChannels, channelsCount, 3, 3 }; // out channel, /input channels, kernel h, kernel w if (netPrecision == Precision::FP32) { std::vector weightValuesFP32; - weightValuesFP32.resize(16 * 3 * 3 * 3); + weightValuesFP32.resize(outChannels * channelsCount * 3 * 3); BFloat16Helpers::fillInputsBySinValues(weightValuesFP32.data(), weightValuesFP32.size()); weightsNode = std::make_shared(ntype, convFilterShape, weightValuesFP32); } else { std::vector weightValuesBF16; - weightValuesBF16.resize(16 * 3 * 3 * 3); + weightValuesBF16.resize(outChannels * channelsCount * 3 * 3); BFloat16Helpers::fillInputsBySinValues(weightValuesBF16.data(), weightValuesBF16.size()); weightsNode = std::make_shared(ntype, convFilterShape, weightValuesBF16.data()); } @@ -100,7 +103,7 @@ protected: return std::make_shared(ngraph::NodeVector{avgpoolNode}, ngraph::ParameterVector{input1}); } - void SetUp()override { + void SetUp() override { std::tie(inputPrecision, netPrecision, inputShapes, newInputShapes, targetDevice) = this->GetParam(); fnPtr = createGraph(netPrecision); diff --git a/inference-engine/tests/functional/plugin/cpu/bfloat16/topk_inputs_i32.cpp b/inference-engine/tests/functional/plugin/cpu/bfloat16/topk_inputs_i32.cpp index ef704c07853..29ae8e0cb2c 100644 --- a/inference-engine/tests/functional/plugin/cpu/bfloat16/topk_inputs_i32.cpp +++ b/inference-engine/tests/functional/plugin/cpu/bfloat16/topk_inputs_i32.cpp @@ -27,7 +27,7 @@ namespace LayerTestsDefinitions { class TopKInputsI32 : public BasicBF16Test { protected: - std::shared_ptr createGraph(InferenceEngine::Precision netPrecision)override { + std::shared_ptr createGraph(InferenceEngine::Precision netPrecision) override { // Power (FP32) // | // Convolution1 (BF16) Const (I32) @@ -41,8 +41,11 @@ protected: // STAGE1: construction of the GRAPH ngraph::element::Type ntype = (netPrecision == Precision::FP32) ? ngraph::element::f32 : ngraph::element::bf16; + auto channelsCount = inputShapes[1]; + const int intermediateChannelsCount = 16; + // multiply - auto input1 = std::make_shared(ntype, ngraph::Shape{1, 3, 40, 40}); + auto input1 = std::make_shared(ntype, ngraph::Shape{inputShapes}); input1->set_friendly_name("Input_1"); std::shared_ptr const1 = nullptr; if (netPrecision == Precision::FP32) { @@ -64,15 +67,15 @@ protected: // convolution std::shared_ptr weightsNode = nullptr; - ngraph::Shape convFilterShape = { 16, 3, 3, 3 }; // out channel, /input channels, kernel h, kernel w + ngraph::Shape convFilterShape = { intermediateChannelsCount, channelsCount, 3, 3 }; // out channel, /input channels, kernel h, kernel w if (netPrecision == Precision::FP32) { std::vector weightValuesFP32; - weightValuesFP32.resize(16 * 3 * 3 * 3); + weightValuesFP32.resize(intermediateChannelsCount * channelsCount * 3 * 3); BFloat16Helpers::fillInputsBySinValues(weightValuesFP32.data(), weightValuesFP32.size()); weightsNode = std::make_shared(ntype, convFilterShape, weightValuesFP32); } else { std::vector weightValuesBF16; - weightValuesBF16.resize(16 * 3 * 3 * 3); + weightValuesBF16.resize(intermediateChannelsCount * channelsCount * 3 * 3); BFloat16Helpers::fillInputsBySinValues(weightValuesBF16.data(), weightValuesBF16.size()); weightsNode = std::make_shared(ntype, convFilterShape, weightValuesBF16.data()); } @@ -123,11 +126,11 @@ protected: return std::make_shared(ngraph::NodeVector{convNode2, goe1}, ngraph::ParameterVector{input1}); } - void SetUp()override { + void SetUp() override { std::tie(inputPrecision, netPrecision, inputShapes, newInputShapes, targetDevice) = this->GetParam(); fnPtr = createGraph(netPrecision); - threshold = 0.14f; // max value in the latest tensor for FP32 network is 22.6 + threshold = 0.5f; // max value in the latest tensor for FP32 network is 22.6 // STAGE2: // filling of expected precision of layer execution defined by precisoin of input tensor to the primitive and reflected in diff --git a/inference-engine/tests/functional/plugin/cpu/shared_tests_instances/behavior/core_threading_tests.cpp b/inference-engine/tests/functional/plugin/cpu/shared_tests_instances/behavior/core_threading_tests.cpp new file mode 100644 index 00000000000..70f2f259cda --- /dev/null +++ b/inference-engine/tests/functional/plugin/cpu/shared_tests_instances/behavior/core_threading_tests.cpp @@ -0,0 +1,22 @@ +// Copyright (C) 2018-2020 Intel Corporation +// SPDX-License-Identifier: Apache-2.0 +// + +#include + +namespace { + +Params params[] = { + std::tuple { "CPU", { { CONFIG_KEY(PERF_COUNT), CONFIG_VALUE(YES) } } }, + std::tuple { "HETERO", { { "TARGET_FALLBACK", "CPU" } } }, + std::tuple { "MULTI", { { MULTI_CONFIG_KEY(DEVICE_PRIORITIES) , "CPU" } } } +}; + +} // namespace + +INSTANTIATE_TEST_CASE_P(CPU, CoreThreadingTests, testing::ValuesIn(params)); + +INSTANTIATE_TEST_CASE_P(CPU, CoreThreadingTestsWithIterations, + testing::Combine(testing::ValuesIn(params), + testing::Values(4), + testing::Values(50))); diff --git a/inference-engine/tests/functional/plugin/cpu/shared_tests_instances/single_layer_tests/pooling.cpp b/inference-engine/tests/functional/plugin/cpu/shared_tests_instances/single_layer_tests/pooling.cpp index 1968599966e..6a619838a76 100644 --- a/inference-engine/tests/functional/plugin/cpu/shared_tests_instances/single_layer_tests/pooling.cpp +++ b/inference-engine/tests/functional/plugin/cpu/shared_tests_instances/single_layer_tests/pooling.cpp @@ -58,8 +58,7 @@ INSTANTIATE_TEST_CASE_P(MaxPool_ExplicitPad_FloorRpunding, PoolingLayerTest, const auto maxPool_ExplicitPad_CeilRounding_Params = ::testing::Combine( ::testing::Values(ngraph::helpers::PoolingTypes::MAX), ::testing::ValuesIn(kernels), - // TODO: Non 1 strides fails in ngraph reference implementation with error "The end corner is out of bounds at axis 3" thrown in the test body. - ::testing::Values(std::vector({1, 1})), + ::testing::ValuesIn(strides), ::testing::ValuesIn(padBegins), ::testing::ValuesIn(padEnds), ::testing::Values(ngraph::op::RoundingType::CEIL), @@ -82,10 +81,9 @@ const auto avgPoolExplicitPadCeilRoundingParams = ::testing::Combine( ::testing::Values(ngraph::helpers::PoolingTypes::AVG), ::testing::ValuesIn(kernels), // TODO: Non 1 strides fails in ngraph reference implementation with error "The end corner is out of bounds at axis 3" thrown in the test body. - ::testing::Values(std::vector({1, 1})), - // TODO: Non zero pads excluded because of accuracy mismatch - ::testing::Values(std::vector({0, 0})), - ::testing::Values(std::vector({0, 0})), + ::testing::ValuesIn(strides), + ::testing::ValuesIn(std::vector>({{0, 0}, {1, 1}, {0, 1}})), + ::testing::ValuesIn(std::vector>({{0, 0}, {1, 1}, {0, 1}})), ::testing::Values(ngraph::op::RoundingType::CEIL), ::testing::Values(ngraph::op::PadType::EXPLICIT), ::testing::Values(true, false) @@ -98,14 +96,27 @@ INSTANTIATE_TEST_CASE_P(AvgPool_ExplicitPad_CeilRounding, PoolingLayerTest, ::testing::Values(std::vector({1, 3, 30, 30})), ::testing::Values(CommonTestUtils::DEVICE_CPU)), PoolingLayerTest::getTestCaseName); + +std::vector psParams({poolSpecificParams(ngraph::helpers::PoolingTypes::AVG, {2, 2}, {2, 2}, {0, 0}, {0, 0}, + ngraph::op::RoundingType::CEIL, ngraph::op::PadType::EXPLICIT, false), + poolSpecificParams(ngraph::helpers::PoolingTypes::AVG, {7, 7}, {1, 1}, {0, 0}, {1, 1}, + ngraph::op::RoundingType::CEIL, ngraph::op::PadType::EXPLICIT, false)}); + +INSTANTIATE_TEST_CASE_P(AvgPool_ExplicitPad_CeilRounding_corner, PoolingLayerTest, + ::testing::Combine( + ::testing::ValuesIn(psParams), + ::testing::ValuesIn(netPrecisions), + ::testing::Values(std::vector({1, 1024, 6, 6})), + ::testing::Values(CommonTestUtils::DEVICE_CPU)), + PoolingLayerTest::getTestCaseName); + /* +========== Explicit Pad Floor Rounding ========== */ const auto avgPoolExplicitPadFloorRoundingParams = ::testing::Combine( ::testing::Values(ngraph::helpers::PoolingTypes::AVG), ::testing::ValuesIn(kernels), ::testing::ValuesIn(strides), - // TODO: Non zero pads excluded because of accuracy mismatch - ::testing::Values(std::vector({0, 0})), - ::testing::Values(std::vector({0, 0})), + ::testing::ValuesIn(std::vector>({{0, 0}, {1, 1}})), + ::testing::ValuesIn(std::vector>({{0, 0}, {1, 1}})), ::testing::Values(ngraph::op::RoundingType::FLOOR), ::testing::Values(ngraph::op::PadType::EXPLICIT), ::testing::Values(true, false) @@ -144,4 +155,5 @@ INSTANTIATE_TEST_CASE_P(MAX_and_AVGPool_ValidPad, PoolingLayerTest, -} // namespace \ No newline at end of file +} // namespace + diff --git a/inference-engine/tests/functional/plugin/cpu/shared_tests_instances/skip_tests_config.cpp b/inference-engine/tests/functional/plugin/cpu/shared_tests_instances/skip_tests_config.cpp index 8db78c156dc..536f0bb224a 100644 --- a/inference-engine/tests/functional/plugin/cpu/shared_tests_instances/skip_tests_config.cpp +++ b/inference-engine/tests/functional/plugin/cpu/shared_tests_instances/skip_tests_config.cpp @@ -9,5 +9,7 @@ std::vector disabledTestPatterns() { return { + // TODO: Issue 26264 + R"(.*(MaxPool|AvgPool).*S\(1\.2\).*Rounding=CEIL.*)" }; } \ No newline at end of file diff --git a/inference-engine/tests/functional/plugin/gpu/shared_tests_instances/single_layer_tests/convolution.cpp b/inference-engine/tests/functional/plugin/gpu/shared_tests_instances/single_layer_tests/convolution.cpp index 42198d319c8..05d1c8cc1b9 100644 --- a/inference-engine/tests/functional/plugin/gpu/shared_tests_instances/single_layer_tests/convolution.cpp +++ b/inference-engine/tests/functional/plugin/gpu/shared_tests_instances/single_layer_tests/convolution.cpp @@ -78,7 +78,7 @@ const std::vector> strides3d = {{1, 1, 1}, const std::vector> dilations3d = {{1, 1, 1}, {1, 2, 1}}; -const auto conv3DParams_FP32 = ::testing::Combine( +const auto conv3DParams = ::testing::Combine( ::testing::ValuesIn(kernels3d), ::testing::ValuesIn(strides3d), ::testing::ValuesIn(paddings3d), @@ -88,30 +88,11 @@ const auto conv3DParams_FP32 = ::testing::Combine( ::testing::Values(ngraph::op::PadType::EXPLICIT) ); -const auto conv3DParams_FP16 = ::testing::Combine( - ::testing::Values(std::vector({3, 3, 3})), - ::testing::ValuesIn(strides3d), - ::testing::ValuesIn(paddings3d), - ::testing::ValuesIn(paddings3d), - ::testing::ValuesIn(dilations3d), - ::testing::Values(5), - ::testing::Values(ngraph::op::PadType::EXPLICIT) -); - -INSTANTIATE_TEST_CASE_P(Convolution3D_FP32, ConvolutionLayerTest, +INSTANTIATE_TEST_CASE_P(Convolution3D, ConvolutionLayerTest, ::testing::Combine( - conv3DParams_FP32, - ::testing::Values(InferenceEngine::Precision::FP32), + conv3DParams, + ::testing::ValuesIn(netPrecisions), ::testing::Values(std::vector({1, 3, 10, 10, 10})), ::testing::Values(CommonTestUtils::DEVICE_GPU)), ConvolutionLayerTest::getTestCaseName); - -INSTANTIATE_TEST_CASE_P(Convolution3D_FP16, ConvolutionLayerTest, - ::testing::Combine( - conv3DParams_FP16, - ::testing::Values(InferenceEngine::Precision::FP16), - ::testing::Values(std::vector({1, 3, 10, 10, 10})), - ::testing::Values(CommonTestUtils::DEVICE_GPU)), - ConvolutionLayerTest::getTestCaseName); - } // namespace diff --git a/inference-engine/tests/functional/plugin/myriad/ngraph/operations/out_shape_of_reshape.cpp b/inference-engine/tests/functional/plugin/myriad/ngraph/operations/out_shape_of_reshape.cpp new file mode 100644 index 00000000000..d1b0525f1b7 --- /dev/null +++ b/inference-engine/tests/functional/plugin/myriad/ngraph/operations/out_shape_of_reshape.cpp @@ -0,0 +1,175 @@ +// Copyright (C) 2020 Intel Corporation +// SPDX-License-Identifier: Apache-2.0 +// + +#include "vpu/ngraph/operations/out_shape_of_reshape.hpp" + +#include + +#include +#include + +#include
+ +#include + +namespace { + +using TensorShape = ngraph::PartialShape; +using TensorType = ngraph::element::Type; + +using TestParams = std::tuple< + TensorShape, + TensorType, + TensorShape, + TensorType>; + +class OutShapeOfReshapeTests + : public CommonTestUtils::TestsCommon, + public testing::WithParamInterface { +public: + void SetUp() override { + const auto& parameters = GetParam(); + const auto& inDataShapeTensorShape = std::get<0>(parameters); + const auto& inTensorShapeTensorType = std::get<1>(parameters); + const auto& outShapeDescriptorTensorShape = std::get<2>(parameters); + const auto& outShapeDescriptorTensorType = std::get<3>(parameters); + + m_inDataShapeParam = std::make_shared( + inTensorShapeTensorType, inDataShapeTensorShape); + m_outShapeDescriptorParam = std::make_shared( + outShapeDescriptorTensorType, outShapeDescriptorTensorShape); + } + +protected: + std::shared_ptr m_inDataShapeParam; + std::shared_ptr m_outShapeDescriptorParam; +}; + +std::vector tensorShapes { + TensorShape{1}, + TensorShape{3}, + TensorShape{4}, +}; + +std::set allNGraphTypes() { + return { + ngraph::element::dynamic, + ngraph::element::boolean, + ngraph::element::bf16, + ngraph::element::f16, + ngraph::element::f32, + ngraph::element::f64, + ngraph::element::i8, + ngraph::element::i16, + ngraph::element::i32, + ngraph::element::i64, + ngraph::element::u1, + ngraph::element::u8, + ngraph::element::u16, + ngraph::element::u32, + ngraph::element::u64 + }; +} + +std::set allNGraphIntegralNumberTypes() { + return { + ngraph::element::i8, + ngraph::element::i16, + ngraph::element::i32, + ngraph::element::i64, + ngraph::element::u1, + ngraph::element::u8, + ngraph::element::u16, + ngraph::element::u32, + ngraph::element::u64 + }; +} + +// +// Positive tests +// + +TEST_P(OutShapeOfReshapeTests, CanValidateAndInferTypes) { + std::shared_ptr op; + ASSERT_NO_THROW(op = std::make_shared( + m_inDataShapeParam, m_outShapeDescriptorParam, true)); + ASSERT_NO_THROW(std::make_shared( + ngraph::OutputVector{op->output(0)}, + ngraph::ParameterVector{m_inDataShapeParam, m_outShapeDescriptorParam})); +} + +INSTANTIATE_TEST_CASE_P(NGraph, OutShapeOfReshapeTests, testing::Combine( + testing::ValuesIn(tensorShapes), + testing::ValuesIn(allNGraphIntegralNumberTypes()), + testing::ValuesIn(tensorShapes), + testing::ValuesIn(allNGraphIntegralNumberTypes())) +); + +// +// Negative tests +// + +std::set allNGraphNotIntegralTypes() { + auto notIntegralTypes = std::set{}; + const auto& allTypes = allNGraphTypes(); + const auto& allIntegralTypes = allNGraphIntegralNumberTypes(); + std::set_difference(allTypes.cbegin(), allTypes.cend(), allIntegralTypes.cbegin(), allIntegralTypes.cend(), + std::inserter(notIntegralTypes, notIntegralTypes.begin())); + return notIntegralTypes; +} + +using OutShapeOfReshapeTestsNegativeDataType = OutShapeOfReshapeTests; +TEST_P(OutShapeOfReshapeTestsNegativeDataType, ThrowsOnInvalidDataType) { + std::shared_ptr op; + ASSERT_THROW(op = std::make_shared( + m_inDataShapeParam, m_outShapeDescriptorParam, true), + ngraph::NodeValidationFailure); +} +INSTANTIATE_TEST_CASE_P(InvalidInDataShapeTensorType, OutShapeOfReshapeTestsNegativeDataType, + testing::Combine( + testing::Values(TensorShape{4}), + testing::ValuesIn(allNGraphNotIntegralTypes()), + testing::Values(TensorShape{3}), + testing::Values(ngraph::element::i64)) +); + +INSTANTIATE_TEST_CASE_P(InvalidOutShapeDescriptorTensorType, OutShapeOfReshapeTestsNegativeDataType, + testing::Combine( + testing::Values(TensorShape{4}), + testing::Values(ngraph::element::i64), + testing::Values(TensorShape{3}), + testing::ValuesIn(allNGraphNotIntegralTypes())) +); + +std::vector invalidTensorShapes { + TensorShape{}, + TensorShape{4, 8}, + TensorShape{ngraph::Dimension::dynamic()}, +}; + +using OutShapeOfReshapeTestsNegativeDataShape = OutShapeOfReshapeTests; +TEST_P(OutShapeOfReshapeTestsNegativeDataShape, ThrowsOnInvalidDataShape) { + std::shared_ptr op; + ASSERT_THROW(op = std::make_shared( + m_inDataShapeParam, m_outShapeDescriptorParam, true), + ngraph::NodeValidationFailure); +} + +INSTANTIATE_TEST_CASE_P(InvalidInDataShapeTensorShape, OutShapeOfReshapeTestsNegativeDataShape, + testing::Combine( + testing::ValuesIn(invalidTensorShapes), + testing::Values(ngraph::element::i64), + testing::ValuesIn(tensorShapes), + testing::Values(ngraph::element::i64)) +); + +INSTANTIATE_TEST_CASE_P(InvalidOutShapeDescriptorTensorShape, OutShapeOfReshapeTestsNegativeDataShape, + testing::Combine( + testing::ValuesIn(tensorShapes), + testing::Values(ngraph::element::i64), + testing::ValuesIn(invalidTensorShapes), + testing::Values(ngraph::element::i64)) +); + +} // namespace diff --git a/inference-engine/tests/functional/plugin/myriad/ngraph/operations/static_shape_broadcast.cpp b/inference-engine/tests/functional/plugin/myriad/ngraph/operations/static_shape_broadcast.cpp new file mode 100644 index 00000000000..f1e7dd760ce --- /dev/null +++ b/inference-engine/tests/functional/plugin/myriad/ngraph/operations/static_shape_broadcast.cpp @@ -0,0 +1,202 @@ +// Copyright (C) 2020 Intel Corporation +// SPDX-License-Identifier: Apache-2.0 +// + +#include "vpu/ngraph/operations/static_shape_broadcast.hpp" + +#include + +#include +#include + +#include
+ +#include + +namespace { + +using TensorType = ngraph::element::Type; +using TensorShape = ngraph::PartialShape; +using AxesMapping = std::vector; + +struct BroadcastNumpyShapes { + TensorShape srcShape; + TensorShape targetShape; +}; + +struct BroadcastExplicitShapes { + TensorShape srcShape; + TensorShape targetShape; + AxesMapping axesMapping; +}; + +using BroadcastNumpyTestParams = std::tuple; +using BroadcastExplicitTestParams = std::tuple; + +class StaticShapeBroadcastNumpyTests + : public CommonTestUtils::TestsCommon, + public testing::WithParamInterface { +public: + void SetUp() override { + const auto& parameters = GetParam(); + const auto& tensorType = std::get<0>(parameters); + const auto& tensorShape = std::get<1>(parameters).srcShape; + const auto& targetShape = std::get<1>(parameters).targetShape; + + m_tensor = std::make_shared(tensorType, tensorShape); + m_tensorWithTargetShape = std::make_shared(tensorType, targetShape); + } +protected: + std::shared_ptr m_tensor; + std::shared_ptr m_tensorWithTargetShape; +}; + +class StaticShapeBroadcastExplicitTests + : public CommonTestUtils::TestsCommon, + public testing::WithParamInterface { +public: + void SetUp() override { + const auto& parameters = GetParam(); + const auto& tensorType = std::get<0>(parameters); + const auto& tensorShape = std::get<1>(parameters).srcShape; + const auto& targetShape = std::get<1>(parameters).targetShape; + const auto& axesMapping = std::get<1>(parameters).axesMapping; + + m_tensor = std::make_shared(tensorType, tensorShape); + m_tensorWithTargetShape = std::make_shared(tensorType, targetShape); + m_axesMapping = std::make_shared( + ngraph::element::u64, ngraph::Shape{axesMapping.size()}, axesMapping); + } +protected: + std::shared_ptr m_tensor; + std::shared_ptr m_tensorWithTargetShape; + std::shared_ptr m_axesMapping; +}; + +std::vector testNumpyStaticShapes { + BroadcastNumpyShapes{TensorShape{1, 100}, TensorShape{4, 100}}, + BroadcastNumpyShapes{TensorShape{1, 100}, TensorShape{2, 4, 100}}, + BroadcastNumpyShapes{TensorShape{16, 1, 1}, TensorShape{2, 16, 50, 50}}, +}; + +std::vector testExplicitStaticShapes { + BroadcastExplicitShapes{TensorShape{16}, TensorShape{1, 16, 50, 50}, AxesMapping{1}}, + BroadcastExplicitShapes{TensorShape{50, 50}, TensorShape{1, 50, 50, 16}, AxesMapping{1, 2}}, +}; + +std::vector testNGraphNumericTypes { + ngraph::element::dynamic, + ngraph::element::bf16, + ngraph::element::f16, + ngraph::element::f32, + ngraph::element::f64, + ngraph::element::i8, + ngraph::element::i16, + ngraph::element::i32, + ngraph::element::i64, + ngraph::element::u1, + ngraph::element::u8, + ngraph::element::u16, + ngraph::element::u32, + ngraph::element::u64, +}; + +// +// Positive tests +// + +TEST_P(StaticShapeBroadcastNumpyTests, CanValidateAndInferTypes) { + const auto shapeOf = std::make_shared(m_tensorWithTargetShape); + std::shared_ptr op; + ASSERT_NO_THROW(op = std::make_shared( + m_tensor, shapeOf)); + ASSERT_NO_THROW(std::make_shared( + ngraph::OutputVector{op->output(0)}, + ngraph::ParameterVector{m_tensor, m_tensorWithTargetShape})); + ASSERT_EQ(m_tensorWithTargetShape->get_shape(), op->output(0).get_shape()); +} + +INSTANTIATE_TEST_CASE_P(NGraph, StaticShapeBroadcastNumpyTests, testing::Combine( + testing::ValuesIn(testNGraphNumericTypes), + testing::ValuesIn(testNumpyStaticShapes)) +); + +TEST_P(StaticShapeBroadcastExplicitTests, CanValidateAndInferTypes) { + const auto shapeOf = std::make_shared(m_tensorWithTargetShape); + std::shared_ptr op; + ASSERT_NO_THROW(op = std::make_shared( + m_tensor, shapeOf, m_axesMapping)); + ASSERT_NO_THROW(std::make_shared( + ngraph::OutputVector{op->output(0)}, + ngraph::ParameterVector{m_tensor, m_tensorWithTargetShape})); + ASSERT_EQ(m_tensorWithTargetShape->get_shape(), op->output(0).get_shape()); +} + +INSTANTIATE_TEST_CASE_P(NGraph, StaticShapeBroadcastExplicitTests, testing::Combine( + testing::ValuesIn(testNGraphNumericTypes), + testing::ValuesIn(testExplicitStaticShapes)) +); + +// +// Negative tests +// + +using StaticShapeBroadcastNumpyTestsNegativeNumInputs = StaticShapeBroadcastNumpyTests; +TEST_P(StaticShapeBroadcastNumpyTestsNegativeNumInputs, ThrowsOnInvalidNumInputs) { + const auto shapeOf = std::make_shared(m_tensorWithTargetShape); + const auto axesMapping = std::make_shared( + ngraph::element::u64, ngraph::Shape{1}, 0); + std::shared_ptr op; + ASSERT_THROW(op = std::make_shared( + m_tensor, shapeOf, axesMapping, ngraph::op::BroadcastType::NUMPY), + ngraph::NodeValidationFailure); +} + +INSTANTIATE_TEST_CASE_P(NGraph, StaticShapeBroadcastNumpyTestsNegativeNumInputs, testing::Combine( + testing::Values(ngraph::element::f16), + testing::Values(testNumpyStaticShapes[0])) +); + +using StaticShapeBroadcastExplicitTestsNegativeNumInputs = StaticShapeBroadcastExplicitTests; +TEST_P(StaticShapeBroadcastExplicitTestsNegativeNumInputs, ThrowsOnInvalidNumInputs) { + const auto shapeOf = std::make_shared(m_tensorWithTargetShape); + std::shared_ptr op; + ASSERT_THROW(op = std::make_shared( + m_tensor, shapeOf, ngraph::op::BroadcastType::EXPLICIT), + ngraph::NodeValidationFailure); +} + +INSTANTIATE_TEST_CASE_P(NGraph, StaticShapeBroadcastExplicitTestsNegativeNumInputs, testing::Combine( + testing::Values(ngraph::element::f16), + testing::Values(testExplicitStaticShapes[0])) +); + +using StaticShapeBroadcastTestsNegativeMode = StaticShapeBroadcastNumpyTests; +TEST_P(StaticShapeBroadcastTestsNegativeMode, ThrowsOnInvalidMode) { + const auto shapeOf = std::make_shared(m_tensorWithTargetShape); + std::shared_ptr op; + ASSERT_THROW(op = std::make_shared( + m_tensor, shapeOf, ngraph::op::BroadcastType::BIDIRECTIONAL), + ngraph::NodeValidationFailure); +} + +INSTANTIATE_TEST_CASE_P(NGraph, StaticShapeBroadcastTestsNegativeMode, testing::Combine( + testing::Values(ngraph::element::f16), + testing::Values(testNumpyStaticShapes[0])) +); + +using StaticShapeBroadcastTestsNegativeEvaluate = StaticShapeBroadcastNumpyTests; +TEST_P(StaticShapeBroadcastTestsNegativeEvaluate, ThrowsOnInvalidMode) { + const auto targetShape = std::make_shared( + ngraph::element::u64, ngraph::Shape{4}); + std::shared_ptr op; + ASSERT_THROW(op = std::make_shared( + m_tensor, targetShape), ngraph::NodeValidationFailure); +} + +INSTANTIATE_TEST_CASE_P(NGraph, StaticShapeBroadcastTestsNegativeEvaluate, testing::Combine( + testing::Values(ngraph::element::f16), + testing::Values(testNumpyStaticShapes[0])) +); + +} // namespace diff --git a/inference-engine/tests/functional/plugin/myriad/ngraph/operations/static_shape_nonzero.cpp b/inference-engine/tests/functional/plugin/myriad/ngraph/operations/static_shape_nonzero.cpp index e1e856f8771..c6e9b289efa 100644 --- a/inference-engine/tests/functional/plugin/myriad/ngraph/operations/static_shape_nonzero.cpp +++ b/inference-engine/tests/functional/plugin/myriad/ngraph/operations/static_shape_nonzero.cpp @@ -18,19 +18,27 @@ namespace { using TensorType = ngraph::element::Type; using TensorShape = ngraph::PartialShape; +typedef std::tuple< + TensorType, // input type + TensorShape, // input shape + TensorType // output type +> staticShapeNonZeroTestParams; + class StaticShapeNonZeroTests : public CommonTestUtils::TestsCommon, - public testing::WithParamInterface> { + public testing::WithParamInterface { public: void SetUp() override { const auto& parameters = GetParam(); const auto& tensorType = std::get<0>(parameters); const auto& tensorShape = std::get<1>(parameters); + m_outputType = std::get<2>(parameters); m_param = std::make_shared(tensorType, tensorShape); } protected: std::shared_ptr m_param; + ngraph::element::Type m_outputType; }; std::vector testStaticShapes { @@ -63,13 +71,19 @@ std::vector testNGraphNumericTypes { ngraph::element::u64, }; +std::vector outputTypes { + ngraph::element::i32, + ngraph::element::i64, +}; + + // // Positive tests // TEST_P(StaticShapeNonZeroTests, CanValidateAndInferTypes) { std::shared_ptr op; - ASSERT_NO_THROW(op = std::make_shared(m_param)); + ASSERT_NO_THROW(op = std::make_shared(m_param, m_outputType)); ASSERT_NO_THROW(std::make_shared( ngraph::OutputVector{op->output(0), op->output(1)}, ngraph::ParameterVector{m_param})); @@ -77,35 +91,51 @@ TEST_P(StaticShapeNonZeroTests, CanValidateAndInferTypes) { INSTANTIATE_TEST_CASE_P(NGraph, StaticShapeNonZeroTests, testing::Combine( testing::ValuesIn(testNGraphNumericTypes), - testing::ValuesIn(testStaticShapes)) + testing::ValuesIn(testStaticShapes), + testing::ValuesIn(outputTypes)) ); // // Negative tests // -using StaticShapeNonZeroTestsNegativeDataType = StaticShapeNonZeroTests; -TEST_P(StaticShapeNonZeroTestsNegativeDataType, ThrowsOnInvalidDataType) { +using StaticShapeNonZeroTestsNegativeInputDataType = StaticShapeNonZeroTests; +TEST_P(StaticShapeNonZeroTestsNegativeInputDataType, ThrowsOnInvalidInputType) { std::shared_ptr op; - ASSERT_THROW(op = std::make_shared(m_param), + ASSERT_THROW(op = std::make_shared(m_param, m_outputType), ngraph::NodeValidationFailure); } -INSTANTIATE_TEST_CASE_P(NGraph, StaticShapeNonZeroTestsNegativeDataType, testing::Combine( +INSTANTIATE_TEST_CASE_P(NGraph, StaticShapeNonZeroTestsNegativeInputDataType, testing::Combine( testing::Values(ngraph::element::boolean), - testing::ValuesIn(testStaticShapes)) + testing::ValuesIn(testStaticShapes), + testing::ValuesIn(outputTypes)) ); using StaticShapeNonZeroTestsNegativeDataShape = StaticShapeNonZeroTests; TEST_P(StaticShapeNonZeroTestsNegativeDataShape, ThrowsOnInvalidDataShape) { std::shared_ptr op; - ASSERT_THROW(op = std::make_shared(m_param), + ASSERT_THROW(op = std::make_shared(m_param, m_outputType), ngraph::NodeValidationFailure); } INSTANTIATE_TEST_CASE_P(NGraph, StaticShapeNonZeroTestsNegativeDataShape, testing::Combine( testing::ValuesIn(testNGraphNumericTypes), - testing::ValuesIn(testDynamicShapes)) + testing::ValuesIn(testDynamicShapes), + testing::ValuesIn(outputTypes)) +); + +using StaticShapeNonZeroTestsNegativeOutputDataType = StaticShapeNonZeroTests; +TEST_P(StaticShapeNonZeroTestsNegativeOutputDataType, ThrowsOnInvalidOutputType) { + std::shared_ptr op; + ASSERT_THROW(op = std::make_shared(m_param, m_outputType), + ngraph::NodeValidationFailure); +} + +INSTANTIATE_TEST_CASE_P(NGraph, StaticShapeNonZeroTestsNegativeOutputDataType, testing::Combine( + testing::ValuesIn(testNGraphNumericTypes), + testing::ValuesIn(testStaticShapes), + testing::Values(ngraph::element::boolean)) ); } // namespace diff --git a/inference-engine/tests/functional/plugin/myriad/ngraph/transformations/dynamic_to_static_shape_binary_elementwise.cpp b/inference-engine/tests/functional/plugin/myriad/ngraph/transformations/dynamic_to_static_shape_binary_elementwise.cpp index 668d71d6c72..f85deef8040 100644 --- a/inference-engine/tests/functional/plugin/myriad/ngraph/transformations/dynamic_to_static_shape_binary_elementwise.cpp +++ b/inference-engine/tests/functional/plugin/myriad/ngraph/transformations/dynamic_to_static_shape_binary_elementwise.cpp @@ -62,7 +62,7 @@ protected: eltwise->set_output_type(0, eltwise->get_input_element_type(0), ngraph::PartialShape::dynamic(eltwise->get_output_partial_shape(0).rank())); const auto transformations = vpu::Transformations{{eltwiseType, vpu::dynamicToStaticShapeBinaryEltwise}}; - vpu::DynamicToStaticShape(transformations).transform(*function); + vpu::DynamicToStaticShape(transformations).transform(function); return function; } @@ -200,7 +200,7 @@ protected: eltwise->set_output_type(0, eltwise->get_input_element_type(0), ngraph::PartialShape::dynamic(eltwise->get_output_partial_shape(0).rank())); const auto transformations = vpu::Transformations{{eltwiseType, vpu::dynamicToStaticShapeBinaryEltwise}}; - vpu::DynamicToStaticShape(transformations).transform(*function); + vpu::DynamicToStaticShape(transformations).transform(function); return function; } diff --git a/inference-engine/tests/functional/plugin/myriad/ngraph/transformations/dynamic_to_static_shape_broadcast.cpp b/inference-engine/tests/functional/plugin/myriad/ngraph/transformations/dynamic_to_static_shape_broadcast.cpp new file mode 100644 index 00000000000..06e691314aa --- /dev/null +++ b/inference-engine/tests/functional/plugin/myriad/ngraph/transformations/dynamic_to_static_shape_broadcast.cpp @@ -0,0 +1,134 @@ +// Copyright (C) 2020 Intel Corporation +// SPDX-License-Identifier: Apache-2.0 +// + +#include "vpu/ngraph/transformations/dynamic_to_static_shape_broadcast.hpp" +#include "vpu/ngraph/transformations/dynamic_to_static_shape.hpp" +#include "vpu/ngraph/operations/static_shape_broadcast.hpp" +#include "vpu/ngraph/operations/dynamic_shape_resolver.hpp" + +#include +#include +#include + +#include +#include + +#include +#include +#include +#include + +namespace { + +using TensorType = ngraph::element::Type; +using TensorShape = ngraph::PartialShape; +using AxesMapping = std::vector; + +struct BroadcastExplicitShapes { + TensorShape srcShape; + TensorShape targetShape; + AxesMapping axesMapping; +}; +using BroadcastExplicitTestParams = std::tuple; + +class DynamicToStaticShapeBroadcastTests + : public CommonTestUtils::TestsCommon, + public testing::WithParamInterface { +public: + void SetUp() override { + const auto& parameters = GetParam(); + const auto& tensorType = std::get<0>(parameters); + const auto& tensorShape = std::get<1>(parameters).srcShape; + const auto& targetShape = std::get<1>(parameters).targetShape; + const auto& axesMapping = std::get<1>(parameters).axesMapping; + + ngraph::helpers::CompareFunctions( + *transform(tensorType, tensorShape, targetShape, axesMapping), + *reference(tensorType, tensorShape, targetShape, axesMapping)); + } + +protected: + std::shared_ptr transform( + const TensorType& tensorType, + const TensorShape& tensorShape, + const TensorShape& targetShape, + const AxesMapping& axesMapping) const { + const auto tensorParam = std::make_shared( + tensorType, tensorShape); + const auto tensorWithTargetShapeParam = std::make_shared( + tensorType, targetShape); + + const auto shapeOfNode = std::make_shared(tensorWithTargetShapeParam); + shapeOfNode->set_is_foldable(false); + + const auto axesMappingConstant = std::make_shared( + ngraph::element::u64, ngraph::Shape{axesMapping.size()}, axesMapping); + + const auto broadcast = std::make_shared( + tensorParam, shapeOfNode, axesMappingConstant); + + auto function = std::make_shared( + ngraph::NodeVector{broadcast}, + ngraph::ParameterVector{tensorParam, tensorWithTargetShapeParam}, + "Actual"); + + // We need to set broadcast output shape to make its rank static. + // In opset3::Broadcast implementation with Explicit mode output shape gets + // static rank only in cases when the second input is Concat + std::vector broadcastOutShape( + shapeOfNode->get_output_shape(0)[0], ngraph::Dimension::dynamic()); + broadcast->set_output_type(0, tensorParam->get_output_element_type(0), + ngraph::PartialShape(broadcastOutShape)); + function->get_result()->set_output_type(0, tensorParam->get_output_element_type(0), + targetShape); + + const auto transformations = vpu::Transformations{{ + ngraph::opset3::Broadcast::type_info, vpu::dynamicToStaticShapeBroadcast}}; + vpu::DynamicToStaticShape(transformations).transform(function); + return function; + } + + std::shared_ptr reference( + const TensorType& tensorType, + const TensorShape& tensorShape, + const TensorShape& targetShape, + const AxesMapping& axesMapping) const { + const auto tensorParam = std::make_shared( + tensorType, tensorShape); + const auto tensorWithTargetShapeParam = std::make_shared( + tensorType, targetShape); + const auto shapeOf = std::make_shared(tensorWithTargetShapeParam); + + const auto axesMappingConstant = std::make_shared( + ngraph::element::u64, ngraph::Shape{axesMapping.size()}, axesMapping); + + const auto staticShapeBroadcast = std::make_shared( + tensorParam, shapeOf, axesMappingConstant); + + const auto dsrOut = std::make_shared( + staticShapeBroadcast, shapeOf); + return std::make_shared( + ngraph::NodeVector{dsrOut}, + ngraph::ParameterVector{tensorParam, tensorWithTargetShapeParam}, + "Expected"); + } +}; + +TEST_P(DynamicToStaticShapeBroadcastTests, compareFunctions) { +} + +INSTANTIATE_TEST_CASE_P(NGraph, DynamicToStaticShapeBroadcastTests, testing::Combine( + testing::Values( + ngraph::element::f16, + ngraph::element::f32, + ngraph::element::i32, + ngraph::element::i64, + ngraph::element::u8), + testing::Values( + BroadcastExplicitShapes{TensorShape{16}, TensorShape{1, 16, 50, 50}, AxesMapping{1}}, + BroadcastExplicitShapes{TensorShape{50, 50}, TensorShape{1, 50, 50, 16}, AxesMapping{1, 2}}) + +)); + +} // namespace diff --git a/inference-engine/tests/functional/plugin/myriad/ngraph/transformations/dynamic_to_static_shape_clamp.cpp b/inference-engine/tests/functional/plugin/myriad/ngraph/transformations/dynamic_to_static_shape_clamp.cpp index 576ee66cf29..08c34f37ceb 100644 --- a/inference-engine/tests/functional/plugin/myriad/ngraph/transformations/dynamic_to_static_shape_clamp.cpp +++ b/inference-engine/tests/functional/plugin/myriad/ngraph/transformations/dynamic_to_static_shape_clamp.cpp @@ -48,7 +48,7 @@ protected: node->set_output_type(0, dsr->get_input_element_type(0), ngraph::PartialShape::dynamic(outputShape.rank())); const auto transformations = vpu::Transformations{{ngraph::opset3::Clamp::type_info, vpu::dynamicToStaticUnaryElementwise}}; - vpu::DynamicToStaticShape(transformations).transform(*function); + vpu::DynamicToStaticShape(transformations).transform(function); return function; } diff --git a/inference-engine/tests/functional/plugin/myriad/ngraph/transformations/dynamic_to_static_shape_concat.cpp b/inference-engine/tests/functional/plugin/myriad/ngraph/transformations/dynamic_to_static_shape_concat.cpp new file mode 100644 index 00000000000..f2bd533cfdc --- /dev/null +++ b/inference-engine/tests/functional/plugin/myriad/ngraph/transformations/dynamic_to_static_shape_concat.cpp @@ -0,0 +1,141 @@ +// Copyright (C) 2020 Intel Corporation +// SPDX-License-Identifier: Apache-2.0 +// + +#include + +#include +#include +#include +#include + +#include +#include +#include +#include +#include + +#include +#include +#include + +namespace { + +using DataType = ngraph::element::Type; +using DataShape = ngraph::Shape; +using DataShapes = std::vector; + +struct ConcatParam { + DataShapes dataShapes; + int axis; +}; +using ConcatTestParam = std::tuple; + +class DynamicToStaticShapeConcatTests + : public CommonTestUtils::TestsCommon, public testing::WithParamInterface { +public: + void SetUp() override { + const auto& parameters = GetParam(); + const auto& dataType = std::get<0>(parameters); + const auto& concatParam = std::get<1>(parameters); + const auto& dataShapes = concatParam.dataShapes; + const auto& axis = concatParam.axis; + + ngraph::helpers::CompareFunctions( + *transform(dataType, dataShapes, axis), + *reference(dataType, dataShapes, axis)); + } + +protected: + std::shared_ptr createDSRWithParams( + const DataShape& dataShape, + const ngraph::element::Type& dataType, + ngraph::ParameterVector& params) const { + const auto param = std::make_shared( + dataType, dataShape); + const auto shape = std::make_shared( + ngraph::element::i64, ngraph::Shape{dataShape.size()}); + params.push_back(param); + params.push_back(shape); + return std::make_shared(param, shape); + } + + std::shared_ptr transform( + const ngraph::element::Type& dataType, + const DataShapes& dataShapes, + const int axis) const { + ngraph::NodeVector dsrVector; + ngraph::ParameterVector params; + for (const auto& dataShape : dataShapes) { + dsrVector.push_back(createDSRWithParams(dataShape, dataType, params)); + } + + const auto concat = std::make_shared(dsrVector, axis); + const auto function = std::make_shared( + ngraph::NodeVector{concat}, params, "Actual"); + concat->set_output_type(0, dsrVector[0]->get_input_element_type(0), + ngraph::PartialShape::dynamic(concat->get_output_partial_shape(0).rank())); + + const auto transformations = vpu::Transformations{ + {ngraph::opset3::Concat::type_info, vpu::dynamicToStaticShapeConcat}}; + vpu::DynamicToStaticShape(transformations).transform(function); + return function; + } + + std::shared_ptr reference( + const ngraph::element::Type& dataType, + const DataShapes& dataShapes, + const int axis) const { + ngraph::NodeVector dsrVector; + ngraph::ParameterVector params; + + dsrVector.push_back(createDSRWithParams(dataShapes.front(), dataType, params)); + + auto accumulatedShape = params.back()->output(0); + for (size_t inputIdx = 1; inputIdx < dataShapes.size(); ++inputIdx) { + dsrVector.push_back(createDSRWithParams( + dataShapes.at(inputIdx), dataType, params)); + const auto shapeAccumulatorOp = std::make_shared( + accumulatedShape, params.back()); + accumulatedShape = shapeAccumulatorOp->output(0); + } + + const size_t rank = dataShapes.front().size(); + std::vector dividerValues(rank, dataShapes.size()); + dividerValues[axis < 0 ? axis + rank : axis] = 1; + const auto divider = std::make_shared( + ngraph::element::i64, ngraph::Shape{rank}, dividerValues); + const auto divide = std::make_shared(accumulatedShape, divider); + + const auto concat = std::make_shared(dsrVector, axis); + const auto outDsr = std::make_shared(concat, divide); + return std::make_shared( + ngraph::NodeVector{outDsr}, params, "Expected"); + } +}; + +TEST_P(DynamicToStaticShapeConcatTests, CompareFunctions) { +} + +std::vector dataTypes = { + ngraph::element::f16, + ngraph::element::f32, + ngraph::element::i32, + ngraph::element::i64, + ngraph::element::u8, +}; + +std::vector concatParams = { + {DataShapes{DataShape{128}, DataShape{256}, DataShape{512}, DataShape{1024}}, 0}, + {DataShapes{DataShape{1, 1000}, DataShape{2, 1000}, DataShape{4, 1000}, DataShape{8, 1000}}, 0}, + {DataShapes{DataShape{128, 100}, DataShape{128, 200}, DataShape{128, 400}, DataShape{128, 800}}, 1}, + {DataShapes{DataShape{3, 64, 128}, DataShape{4, 64, 128}, DataShape{5, 64, 128}}, 0}, + {DataShapes{DataShape{3, 64, 128}, DataShape{3, 64, 256}, DataShape{3, 64, 512}}, 2}, + {DataShapes{DataShape{3, 64, 128}, DataShape{3, 64, 256}, DataShape{3, 64, 512}}, -1}, +}; + +INSTANTIATE_TEST_CASE_P(NGraph, DynamicToStaticShapeConcatTests, testing::Combine( + testing::ValuesIn(dataTypes), + testing::ValuesIn(concatParams))); + +} // namespace diff --git a/inference-engine/tests/functional/plugin/myriad/ngraph/transformations/dynamic_to_static_shape_convert.cpp b/inference-engine/tests/functional/plugin/myriad/ngraph/transformations/dynamic_to_static_shape_convert.cpp index c222af04333..f0863d341da 100644 --- a/inference-engine/tests/functional/plugin/myriad/ngraph/transformations/dynamic_to_static_shape_convert.cpp +++ b/inference-engine/tests/functional/plugin/myriad/ngraph/transformations/dynamic_to_static_shape_convert.cpp @@ -48,7 +48,7 @@ protected: convert->set_output_type(0, dsr->get_input_element_type(0), ngraph::PartialShape::dynamic(outputShape.rank())); const auto transformations = vpu::Transformations{{ngraph::opset3::Convert::type_info, vpu::dynamicToStaticUnaryElementwise}}; - vpu::DynamicToStaticShape(transformations).transform(*function); + vpu::DynamicToStaticShape(transformations).transform(function); return function; } diff --git a/inference-engine/tests/functional/plugin/myriad/ngraph/transformations/dynamic_to_static_shape_gather.cpp b/inference-engine/tests/functional/plugin/myriad/ngraph/transformations/dynamic_to_static_shape_gather.cpp new file mode 100644 index 00000000000..cbefc4bc824 --- /dev/null +++ b/inference-engine/tests/functional/plugin/myriad/ngraph/transformations/dynamic_to_static_shape_gather.cpp @@ -0,0 +1,320 @@ +// Copyright (C) 2020 Intel Corporation +// SPDX-License-Identifier: Apache-2.0 +// + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +namespace { + +using DataType = ngraph::element::Type_t; +using DataDims = ngraph::Shape; + +struct GatherTestCase { + ngraph::Shape data_shape, index_shape; + int64_t axis, first_split_point, second_split_point; +}; + +const auto combinations = testing::Combine( + testing::Values( + ngraph::element::f16, + ngraph::element::f32, + ngraph::element::i32, + ngraph::element::i64, + ngraph::element::u8), + testing::Values( + ngraph::element::i32, + ngraph::element::i64, + ngraph::element::u8), + testing::Values( + GatherTestCase{{6}, {15, 4, 20, 28}, 0, 0, 0}, + GatherTestCase{{6, 12, 10, 24}, {6}, 0, 0, 1}, + GatherTestCase{{6, 12}, {15, 4, 20, 28}, 1, 1, 2}, + GatherTestCase{{6, 12, 10, 24}, {15, 4, 20, 28}, 3, 3, 4}, + GatherTestCase{{6, 12, 10, 24}, {15, 4, 20, 28}, -1, 3, 4}, + GatherTestCase{{6, 12, 10, 24}, {15, 4, 20, 28}, -4, 0, 1})); + + +class DynamicToStaticShapeGatherDataDSR : public CommonTestUtils::TestsCommon, + public testing::WithParamInterface> { +public: + void SetUp() override { + const auto& parameters = GetParam(); + const auto& data_type = std::get<0>(parameters); + const auto& idx_type = std::get<1>(parameters); + const auto& gather_setup = std::get<2>(parameters); + + ngraph::helpers::CompareFunctions(*transform(data_type, idx_type, gather_setup), + *reference(data_type, idx_type, gather_setup)); + } + +protected: + std::shared_ptr transform( + const ngraph::element::Type_t& data_type, + const ngraph::element::Type_t& idx_type, + const GatherTestCase& gather_setup) const { + const auto data = std::make_shared(data_type, gather_setup.data_shape); + const auto indices = std::make_shared(idx_type, gather_setup.index_shape); + const auto axis = ngraph::opset3::Constant::create(ngraph::element::i32, {1}, std::vector{gather_setup.axis}); + + const auto dims = std::make_shared(ngraph::element::i64, ngraph::Shape{gather_setup.data_shape.size()}); + + const auto dsr = std::make_shared(data, dims); + const auto node = std::make_shared(dsr, indices, axis); + + auto outputShape = node->get_output_partial_shape(0); + const auto function = std::make_shared( + ngraph::NodeVector{node}, + ngraph::ParameterVector{data, dims, indices}, + "Actual"); + node->set_output_type(0, dsr->get_input_element_type(0), ngraph::PartialShape::dynamic( + gather_setup.data_shape.size() + gather_setup.index_shape.size() - 1)); + + const auto transformations = vpu::Transformations{{node->type_info, vpu::dynamicToStaticShapeGather}}; + vpu::DynamicToStaticShape(transformations).transform(function); + return function; + } + + std::shared_ptr reference( + const ngraph::element::Type_t& data_type, + const ngraph::element::Type_t& idx_type, + const GatherTestCase& gather_setup) const { + const auto data = std::make_shared(data_type, gather_setup.data_shape); + const auto indices = std::make_shared(idx_type, gather_setup.index_shape); + const auto axis = ngraph::opset3::Constant::create(ngraph::element::i32, {1}, std::vector{gather_setup.axis}); + + const auto dims = std::make_shared(ngraph::element::i64, ngraph::Shape{gather_setup.data_shape.size()}); + + const auto dsr = std::make_shared(data, dims); + const auto node = std::make_shared(dsr, indices, axis); + + const auto indices_shape = ngraph::opset3::Constant::create(dims->get_element_type(), {gather_setup.index_shape.size()}, gather_setup.index_shape); + ngraph::OutputVector output_dims; + if (gather_setup.first_split_point) { + std::vector idxs(gather_setup.first_split_point); + std::iota(idxs.begin(), idxs.end(), 0); + output_dims.push_back( + std::make_shared( + dims, + ngraph::opset3::Constant::create(ngraph::element::i64, {idxs.size()}, idxs), + ngraph::opset3::Constant::create(ngraph::element::i64, {1}, {0}))); + } + if (!gather_setup.index_shape.empty()) + output_dims.push_back(indices_shape); + if (gather_setup.first_split_point + 1 < gather_setup.data_shape.size()) { + std::vector idxs(gather_setup.data_shape.size() - gather_setup.second_split_point); + std::iota(idxs.begin(), idxs.end(), gather_setup.second_split_point); + output_dims.push_back( + std::make_shared( + dims, + ngraph::opset3::Constant::create(ngraph::element::i64, {idxs.size()}, idxs), + ngraph::opset3::Constant::create(ngraph::element::i64, {1}, {0}))); + } + const auto output_shape = std::make_shared(output_dims, 0); + const auto dsr1 = std::make_shared(node, output_shape); + return std::make_shared( + ngraph::NodeVector{dsr1}, + ngraph::ParameterVector{data, dims, indices}, + "Expected"); + } +}; + +TEST_P(DynamicToStaticShapeGatherDataDSR, CompareFunctions) { +} + +INSTANTIATE_TEST_CASE_P(NGraph, DynamicToStaticShapeGatherDataDSR, combinations); + +class DynamicToStaticShapeGatherIdxDSR : public CommonTestUtils::TestsCommon, + public testing::WithParamInterface> { +public: + void SetUp() override { + const auto& parameters = GetParam(); + const auto& data_type = std::get<0>(parameters); + const auto& idx_type = std::get<1>(parameters); + const auto& gather_setup = std::get<2>(parameters); + + ngraph::helpers::CompareFunctions(*transform(data_type, idx_type, gather_setup), + *reference(data_type, idx_type, gather_setup)); + } + +protected: + std::shared_ptr transform( + const ngraph::element::Type_t& data_type, + const ngraph::element::Type_t& idx_type, + const GatherTestCase& gather_setup) const { + const auto data = std::make_shared(data_type, gather_setup.data_shape); + const auto indices = std::make_shared(idx_type, gather_setup.index_shape); + const auto axis = ngraph::opset3::Constant::create(ngraph::element::i32, {1}, std::vector{gather_setup.axis}); + + const auto dims = std::make_shared(ngraph::element::i64, ngraph::Shape{gather_setup.index_shape.size()}); + + const auto dsr = std::make_shared(indices, dims); + const auto node = std::make_shared(data, dsr, axis); + + auto outputShape = node->get_output_partial_shape(0); + const auto function = std::make_shared( + ngraph::NodeVector{node}, + ngraph::ParameterVector{data, dims, indices}, + "Actual"); + node->set_output_type(0, dsr->get_input_element_type(0), ngraph::PartialShape::dynamic( + gather_setup.data_shape.size() + gather_setup.index_shape.size() - 1)); + + const auto transformations = vpu::Transformations{{node->type_info, vpu::dynamicToStaticShapeGather}}; + vpu::DynamicToStaticShape(transformations).transform(function); + return function; + } + + std::shared_ptr reference( + const ngraph::element::Type_t& data_type, + const ngraph::element::Type_t& idx_type, + const GatherTestCase& gather_setup) const { + const auto data = std::make_shared(data_type, gather_setup.data_shape); + const auto indices = std::make_shared(idx_type, gather_setup.index_shape); + const auto axis = ngraph::opset3::Constant::create(ngraph::element::i32, {1}, std::vector{gather_setup.axis}); + + const auto dims = std::make_shared(ngraph::element::i64, ngraph::Shape{gather_setup.index_shape.size()}); + + const auto dsr = std::make_shared(indices, dims); + const auto node = std::make_shared(data, dsr, axis); + + const auto data_shape = ngraph::opset3::Constant::create(dims->get_element_type(), {gather_setup.data_shape.size()}, gather_setup.data_shape); + + ngraph::OutputVector output_dims; + if (gather_setup.first_split_point) { + std::vector idxs(gather_setup.first_split_point); + std::iota(idxs.begin(), idxs.end(), 0); + output_dims.push_back( + std::make_shared( + data_shape, + ngraph::opset3::Constant::create(ngraph::element::i64, {idxs.size()}, idxs), + ngraph::opset3::Constant::create(ngraph::element::i64, {1}, {0}))); + } + if (!gather_setup.index_shape.empty()) + output_dims.push_back(dims); + if (gather_setup.first_split_point + 1 < gather_setup.data_shape.size()) { + std::vector idxs(gather_setup.data_shape.size() - gather_setup.second_split_point); + std::iota(idxs.begin(), idxs.end(), gather_setup.second_split_point); + output_dims.push_back( + std::make_shared( + data_shape, + ngraph::opset3::Constant::create(ngraph::element::i64, {idxs.size()}, idxs), + ngraph::opset3::Constant::create(ngraph::element::i64, {1}, {0}))); + } + const auto output_shape = std::make_shared(output_dims, 0); + const auto dsr1 = std::make_shared(node, output_shape); + return std::make_shared( + ngraph::NodeVector{dsr1}, + ngraph::ParameterVector{data, dims, indices}, + "Expected"); + } +}; + +TEST_P(DynamicToStaticShapeGatherIdxDSR, CompareFunctions) { +} + +INSTANTIATE_TEST_CASE_P(NGraph, DynamicToStaticShapeGatherIdxDSR, combinations); + +class DynamicToStaticShapeGather : public CommonTestUtils::TestsCommon, + public testing::WithParamInterface> { +public: + void SetUp() override { + const auto& parameters = GetParam(); + const auto& data_type = std::get<0>(parameters); + const auto& idx_type = std::get<1>(parameters); + const auto& gather_setup = std::get<2>(parameters); + + ngraph::helpers::CompareFunctions(*transform(data_type, idx_type, gather_setup), + *reference(data_type, idx_type, gather_setup)); + } + +protected: + std::shared_ptr transform( + const ngraph::element::Type_t& data_type, + const ngraph::element::Type_t& idx_type, + const GatherTestCase& gather_setup) const { + const auto data = std::make_shared(data_type, gather_setup.data_shape); + const auto indices = std::make_shared(idx_type, gather_setup.index_shape); + const auto axis = ngraph::opset3::Constant::create(ngraph::element::i32, {1}, std::vector{gather_setup.axis}); + + const auto data_dims = std::make_shared(ngraph::element::i64, ngraph::Shape{gather_setup.data_shape.size()}); + const auto indices_dims = std::make_shared(ngraph::element::i64, ngraph::Shape{gather_setup.index_shape.size()}); + + const auto data_dsr = std::make_shared(data, data_dims); + const auto indices_dsr = std::make_shared(indices, indices_dims); + const auto node = std::make_shared(data_dsr, indices_dsr, axis); + + auto outputShape = node->get_output_partial_shape(0); + const auto function = std::make_shared( + ngraph::NodeVector{node}, + ngraph::ParameterVector{data, data_dims, indices, indices_dims}, + "Actual"); + node->set_output_type(0, node->get_input_element_type(0), ngraph::PartialShape::dynamic( + gather_setup.data_shape.size() + gather_setup.index_shape.size() - 1)); + + const auto transformations = vpu::Transformations{{node->type_info, vpu::dynamicToStaticShapeGather}}; + vpu::DynamicToStaticShape(transformations).transform(function); + return function; + } + + std::shared_ptr reference( + const ngraph::element::Type_t& data_type, + const ngraph::element::Type_t& idx_type, + const GatherTestCase& gather_setup) const { + const auto data = std::make_shared(data_type, gather_setup.data_shape); + const auto indices = std::make_shared(idx_type, gather_setup.index_shape); + const auto axis = ngraph::opset3::Constant::create(ngraph::element::i32, {1}, std::vector{gather_setup.axis}); + + const auto data_dims = std::make_shared(ngraph::element::i64, ngraph::Shape{gather_setup.data_shape.size()}); + const auto indices_dims = std::make_shared(ngraph::element::i64, ngraph::Shape{gather_setup.index_shape.size()}); + + const auto data_dsr = std::make_shared(data, data_dims); + const auto indices_dsr = std::make_shared(indices, indices_dims); + const auto node = std::make_shared(data_dsr, indices_dsr, axis); + + ngraph::OutputVector output_dims; + if (gather_setup.first_split_point) { + std::vector idxs(gather_setup.first_split_point); + std::iota(idxs.begin(), idxs.end(), 0); + output_dims.push_back( + std::make_shared( + data_dims, + ngraph::opset3::Constant::create(ngraph::element::i64, {idxs.size()}, idxs), + ngraph::opset3::Constant::create(ngraph::element::i64, {1}, {0}))); + } + if (!gather_setup.index_shape.empty()) + output_dims.push_back(indices_dims); + if (gather_setup.first_split_point + 1 < gather_setup.data_shape.size()) { + std::vector idxs(gather_setup.data_shape.size() - gather_setup.second_split_point); + std::iota(idxs.begin(), idxs.end(), gather_setup.second_split_point); + output_dims.push_back( + std::make_shared( + data_dims, + ngraph::opset3::Constant::create(ngraph::element::i64, {idxs.size()}, idxs), + ngraph::opset3::Constant::create(ngraph::element::i64, {1}, {0}))); + } + const auto output_shape = std::make_shared(output_dims, 0); + const auto dsr1 = std::make_shared(node, output_shape); + return std::make_shared( + ngraph::NodeVector{dsr1}, + ngraph::ParameterVector{data, data_dims, indices, indices_dims}, + "Expected"); + } +}; + +TEST_P(DynamicToStaticShapeGather, CompareFunctions) { +} + +INSTANTIATE_TEST_CASE_P(NGraph, DynamicToStaticShapeGather, combinations); + +} // namespace diff --git a/inference-engine/tests/functional/plugin/myriad/ngraph/transformations/dynamic_to_static_shape_non_max_suppression.cpp b/inference-engine/tests/functional/plugin/myriad/ngraph/transformations/dynamic_to_static_shape_non_max_suppression.cpp index 06e7440a6ae..fbe2a968694 100644 --- a/inference-engine/tests/functional/plugin/myriad/ngraph/transformations/dynamic_to_static_shape_non_max_suppression.cpp +++ b/inference-engine/tests/functional/plugin/myriad/ngraph/transformations/dynamic_to_static_shape_non_max_suppression.cpp @@ -65,7 +65,7 @@ protected: node->set_output_type(0, dsr->get_input_element_type(0), ngraph::PartialShape::dynamic(outputShape.rank())); const auto transformations = vpu::Transformations{{node->type_info, vpu::dynamicToStaticNonMaxSuppression}}; - vpu::DynamicToStaticShape(transformations).transform(*function); + vpu::DynamicToStaticShape(transformations).transform(function); return function; } diff --git a/inference-engine/tests/functional/plugin/myriad/ngraph/transformations/dynamic_to_static_shape_nonzero.cpp b/inference-engine/tests/functional/plugin/myriad/ngraph/transformations/dynamic_to_static_shape_nonzero.cpp index 07486aa4a1d..cddf3bd5f79 100644 --- a/inference-engine/tests/functional/plugin/myriad/ngraph/transformations/dynamic_to_static_shape_nonzero.cpp +++ b/inference-engine/tests/functional/plugin/myriad/ngraph/transformations/dynamic_to_static_shape_nonzero.cpp @@ -24,31 +24,39 @@ namespace { using TensorType = ngraph::element::Type_t; using TensorShape = ngraph::Shape; -class DynamicToStaticShapeNonZeroTests : public CommonTestUtils::TestsCommon, public testing::WithParamInterface> { +typedef std::tuple< + TensorType, // input type + TensorShape, // input shape + TensorType // output type +> dynamicToStaticShapeNonZeroTestParams; + +class DynamicToStaticShapeNonZeroTests : public CommonTestUtils::TestsCommon, + public testing::WithParamInterface { public: void prepareFunctions() { const auto& parameters = GetParam(); - const auto& tensorType = std::get<0>(parameters); - const auto& tensorShape = std::get<1>(parameters); + const auto& inputType = std::get<0>(parameters); + const auto& inputShape = std::get<1>(parameters); + const auto& resultType = std::get<2>(parameters); // Create a function with only op::NonZero // And then run conversion pass { - const auto input = std::make_shared(tensorType, tensorShape); + const auto input = std::make_shared(inputType, inputShape); - const auto nonZero = std::make_shared(input); + const auto nonZero = std::make_shared(input, resultType); nonZero->set_friendly_name(s_FriendlyName); actual = std::make_shared(ngraph::NodeVector{nonZero}, ngraph::ParameterVector{input}); const auto transformation = vpu::Transformations{{ngraph::opset3::NonZero::type_info, vpu::dynamicToStaticShapeNonZero}}; - vpu::DynamicToStaticShape(transformation).transform(*actual); + vpu::DynamicToStaticShape(transformation).transform(actual); } // Create a reference function { - const auto input = std::make_shared(tensorType, tensorShape); + const auto input = std::make_shared(inputType, inputShape); - const auto staticShapeNonZero = std::make_shared(input); + const auto staticShapeNonZero = std::make_shared(input, resultType); staticShapeNonZero->set_friendly_name(std::string(s_FriendlyName) + "/static_shape"); const auto dynamicShapeResolver = std::make_shared( staticShapeNonZero->output(0), staticShapeNonZero->output(1)); @@ -98,7 +106,10 @@ INSTANTIATE_TEST_CASE_P(NGraph, DynamicToStaticShapeNonZeroTests, testing::Combi TensorShape{1000}, TensorShape{4, 1000}, TensorShape{3, 128, 256}, - TensorShape{2, 3, 128, 256}) + TensorShape{2, 3, 128, 256}), + testing::Values( + ngraph::element::i32, + ngraph::element::i64) )); } // namespace diff --git a/inference-engine/tests/functional/plugin/myriad/ngraph/transformations/dynamic_to_static_shape_reshape.cpp b/inference-engine/tests/functional/plugin/myriad/ngraph/transformations/dynamic_to_static_shape_reshape.cpp new file mode 100644 index 00000000000..ee14731f367 --- /dev/null +++ b/inference-engine/tests/functional/plugin/myriad/ngraph/transformations/dynamic_to_static_shape_reshape.cpp @@ -0,0 +1,113 @@ +// Copyright (C) 2020 Intel Corporation +// SPDX-License-Identifier: Apache-2.0 +// + +#include "vpu/ngraph/transformations/dynamic_to_static_shape_reshape.hpp" +#include "vpu/ngraph/operations/out_shape_of_reshape.hpp" +#include "vpu/ngraph/operations/dynamic_shape_resolver.hpp" + +#include +#include +#include + +#include +#include + +#include +#include +#include +#include +#include + +namespace { + +using DataType = ngraph::element::Type; +using DataShape = ngraph::Shape; +using TestParams = std::tuple; + +class DynamicToStaticShapeReshapeTests + : public CommonTestUtils::TestsCommon, + public testing::WithParamInterface { +public: + void SetUp() override { + const auto& parameters = GetParam(); + const auto& inDataShape = std::get<0>(parameters); + const auto& inDataType = std::get<1>(parameters); + + ngraph::helpers::CompareFunctions( + *transform(inDataType, inDataShape), + *reference(inDataType, inDataShape)); + } + +protected: + std::shared_ptr transform( + const ngraph::element::Type& inDataType, + const ngraph::Shape& inDataShape) const { + const auto inDataParam = std::make_shared( + inDataType, inDataShape); + const auto inDataDimsParam = std::make_shared( + ngraph::element::i64, ngraph::Shape{inDataShape.size()}); + const auto outShapeDescriptorParam = std::make_shared( + ngraph::element::i64, ngraph::Shape{inDataShape.size()}, inDataShape); + + const auto dsr = std::make_shared( + inDataParam, inDataDimsParam); + const auto reshape = std::make_shared( + dsr, outShapeDescriptorParam, true); + + auto function = std::make_shared( + ngraph::NodeVector{reshape}, + ngraph::ParameterVector{inDataParam, inDataDimsParam}, + "Actual"); + reshape->set_output_type(0, dsr->get_input_element_type(0), ngraph::PartialShape::dynamic( + outShapeDescriptorParam->get_output_partial_shape(0).rank())); + + const auto transformations = vpu::Transformations{{ + ngraph::op::v1::Reshape::type_info, vpu::dynamicToStaticShapeReshape}}; + vpu::DynamicToStaticShape(transformations).transform(function); + return function; + } + + std::shared_ptr reference( + const ngraph::element::Type& inDataType, + const ngraph::Shape& inDataShape) const { + const auto inDataParam = std::make_shared( + inDataType, inDataShape); + const auto inDataDimsParam = std::make_shared( + ngraph::element::i64, ngraph::Shape{inDataShape.size()}); + const auto outShapeDescriptorParam = std::make_shared( + ngraph::element::i64, ngraph::Shape{inDataShape.size()}, inDataShape); + + const auto dsr0 = std::make_shared( + inDataParam, inDataDimsParam); + const auto reshape = std::make_shared( + dsr0, outShapeDescriptorParam, true); + + const auto outShapeOfReshape = std::make_shared( + inDataDimsParam, outShapeDescriptorParam, true); + const auto dsr1 = std::make_shared( + reshape, outShapeOfReshape); + return std::make_shared( + ngraph::NodeVector{dsr1}, + ngraph::ParameterVector{inDataParam, inDataDimsParam}, + "Expected"); + } +}; + +TEST_P(DynamicToStaticShapeReshapeTests, compareFunctions) { +} + +INSTANTIATE_TEST_CASE_P(NGraph, DynamicToStaticShapeReshapeTests, testing::Combine( + testing::Values( + DataShape{4, 1000}, + DataShape{3, 128, 256}, + DataShape{2, 3, 128, 256}), + testing::Values( + ngraph::element::f16, + ngraph::element::f32, + ngraph::element::i32, + ngraph::element::i64, + ngraph::element::u8) +)); + +} // namespace diff --git a/inference-engine/tests/functional/plugin/myriad/ngraph/transformations/dynamic_to_static_shape_roialign.cpp b/inference-engine/tests/functional/plugin/myriad/ngraph/transformations/dynamic_to_static_shape_roialign.cpp index af4cec8c188..cdbc929e85f 100644 --- a/inference-engine/tests/functional/plugin/myriad/ngraph/transformations/dynamic_to_static_shape_roialign.cpp +++ b/inference-engine/tests/functional/plugin/myriad/ngraph/transformations/dynamic_to_static_shape_roialign.cpp @@ -62,7 +62,7 @@ protected: node->set_output_type(0, dsr->get_input_element_type(0), ngraph::PartialShape::dynamic(outputShape.rank())); const auto transformations = vpu::Transformations{{node->type_info, vpu::dynamicToStaticShapeROIAlign}}; - vpu::DynamicToStaticShape(transformations).transform(*function); + vpu::DynamicToStaticShape(transformations).transform(function); return function; } @@ -150,7 +150,7 @@ protected: node->set_output_type(0, dsr->get_input_element_type(0), ngraph::PartialShape::dynamic(outputShape.rank())); const auto transformations = vpu::Transformations{{node->type_info, vpu::dynamicToStaticShapeROIAlign}}; - vpu::DynamicToStaticShape(transformations).transform(*function); + vpu::DynamicToStaticShape(transformations).transform(function); return function; } @@ -241,7 +241,7 @@ protected: node->set_output_type(0, data_dsr->get_input_element_type(0), ngraph::PartialShape::dynamic(outputShape.rank())); const auto transformations = vpu::Transformations{{node->type_info, vpu::dynamicToStaticShapeROIAlign}}; - vpu::DynamicToStaticShape(transformations).transform(*function); + vpu::DynamicToStaticShape(transformations).transform(function); return function; } diff --git a/inference-engine/tests/functional/plugin/myriad/ngraph/transformations/dynamic_to_static_shape_scatter.cpp b/inference-engine/tests/functional/plugin/myriad/ngraph/transformations/dynamic_to_static_shape_scatter.cpp index 81c12977c45..b05f17c2926 100644 --- a/inference-engine/tests/functional/plugin/myriad/ngraph/transformations/dynamic_to_static_shape_scatter.cpp +++ b/inference-engine/tests/functional/plugin/myriad/ngraph/transformations/dynamic_to_static_shape_scatter.cpp @@ -61,7 +61,7 @@ protected: node->set_output_type(0, dsr->get_input_element_type(0), ngraph::PartialShape::dynamic(outputShape.rank())); const auto transformations = vpu::Transformations{{scatter_setup.scatter_type_info, vpu::dynamicToStaticUnaryElementwise}}; - vpu::DynamicToStaticShape(transformations).transform(*function); + vpu::DynamicToStaticShape(transformations).transform(function); return function; } diff --git a/inference-engine/tests/functional/plugin/myriad/ngraph/transformations/dynamic_to_static_shape_shapeof.cpp b/inference-engine/tests/functional/plugin/myriad/ngraph/transformations/dynamic_to_static_shape_shapeof.cpp new file mode 100644 index 00000000000..4c28ef72aa2 --- /dev/null +++ b/inference-engine/tests/functional/plugin/myriad/ngraph/transformations/dynamic_to_static_shape_shapeof.cpp @@ -0,0 +1,213 @@ +// Copyright (C) 2020 Intel Corporation +// SPDX-License-Identifier: Apache-2.0 +// + +#include "vpu/ngraph/transformations/dynamic_to_static_shape_shapeof.hpp" + +#include +#include + +#include +#include +#include + +#include +#include + + +namespace { + +using TensorType = ngraph::element::Type_t; +using TensorShape = ngraph::Shape; + +class DynamicToStaticShapeShapeOfRemoveDSR : public CommonTestUtils::TestsCommon, + public testing::WithParamInterface> { +public: + void SetUp() override { + const auto& parameters = GetParam(); + const auto& data_type = std::get<0>(parameters); + const auto& data_shape = std::get<1>(parameters); + + ngraph::helpers::CompareFunctions(*transform(data_type, data_shape), + *reference(data_type, data_shape)); + } + +protected: + std::shared_ptr transform( + const TensorType& dataType, + const TensorShape& dataShape) const { + const auto data = std::make_shared(dataType, dataShape); + const auto shape = std::make_shared(ngraph::element::i64, ngraph::Shape{dataShape.size()}); + + const auto dsr = std::make_shared(data, shape); + const auto shapeOf = std::make_shared(dsr->output(0)); + + const auto function = std::make_shared( + ngraph::NodeVector{shapeOf}, + ngraph::ParameterVector{data, shape}, + "Actual"); + + vpu::DynamicToStaticShapeShapeOf().run_on_function(function); + return function; + } + + std::shared_ptr reference( + const TensorType& dataType, + const TensorShape& dataShape) const { + const auto shape = std::make_shared(ngraph::element::i64, ngraph::Shape{dataShape.size()}); + + return std::make_shared( + ngraph::NodeVector{shape}, + ngraph::ParameterVector{shape}, + "Expected"); + } +}; + +TEST_P(DynamicToStaticShapeShapeOfRemoveDSR, CompareFunctions) { +} + +INSTANTIATE_TEST_CASE_P(NGraph, DynamicToStaticShapeShapeOfRemoveDSR, testing::Combine( + testing::Values( + ngraph::element::f16, + ngraph::element::f32, + ngraph::element::i32, + ngraph::element::i64, + ngraph::element::u8), + testing::Values( + TensorShape{1000}, + TensorShape{4, 1000}, + TensorShape{3, 128, 256}, + TensorShape{2, 3, 128, 256}) +)); + +class DynamicToStaticShapeShapeOfWithOutRemoveDSR : public CommonTestUtils::TestsCommon, + public testing::WithParamInterface> { +public: + void SetUp() override { + const auto& parameters = GetParam(); + const auto& data_type = std::get<0>(parameters); + const auto& data_shape = std::get<1>(parameters); + + ngraph::helpers::CompareFunctions(*transform(data_type, data_shape), + *reference(data_type, data_shape)); + } + +protected: + std::shared_ptr transform( + const TensorType& dataType, + const TensorShape& dataShape) const { + const auto data = std::make_shared(dataType, dataShape); + const auto shape = std::make_shared(ngraph::element::i64, ngraph::Shape{dataShape.size()}); + + const auto dsr = std::make_shared(data, shape); + const auto shapeOf = std::make_shared(dsr->output(0)); + const auto shapeOfOutputRelu = std::make_shared(shapeOf->output(0)); + + const auto function = std::make_shared( + ngraph::NodeVector{shapeOfOutputRelu}, + ngraph::ParameterVector{data, shape}, + "Actual"); + + vpu::DynamicToStaticShapeShapeOf().run_on_function(function); + return function; + } + + std::shared_ptr reference( + const TensorType& dataType, + const TensorShape& dataShape) const { + const auto shape = std::make_shared(ngraph::element::i64, ngraph::Shape{dataShape.size()}); + + const auto shapeRelu = std::make_shared(shape); + + return std::make_shared( + ngraph::NodeVector{shapeRelu}, + ngraph::ParameterVector{shape}, + "Expected"); + } +}; + +TEST_P(DynamicToStaticShapeShapeOfWithOutRemoveDSR, CompareFunctions) { +} + +INSTANTIATE_TEST_CASE_P(NGraph, DynamicToStaticShapeShapeOfWithOutRemoveDSR, testing::Combine( + testing::Values( + ngraph::element::f16, + ngraph::element::f32, + ngraph::element::i32, + ngraph::element::i64, + ngraph::element::u8), + testing::Values( + TensorShape{1000}, + TensorShape{4, 1000}, + TensorShape{3, 128, 256}, + TensorShape{2, 3, 128, 256}) +)); + +class DynamicToStaticShapeShapeOfKeepDSR : public CommonTestUtils::TestsCommon, + public testing::WithParamInterface> { +public: + void SetUp() override { + const auto& parameters = GetParam(); + const auto& data_type = std::get<0>(parameters); + const auto& data_shape = std::get<1>(parameters); + + ngraph::helpers::CompareFunctions(*transform(data_type, data_shape), + *reference(data_type, data_shape)); + } + +protected: + std::shared_ptr transform( + const TensorType& dataType, + const TensorShape& dataShape) const { + const auto data = std::make_shared(dataType, dataShape); + const auto shape = std::make_shared(ngraph::element::i64, ngraph::Shape{dataShape.size()}); + + const auto dsr = std::make_shared(data, shape); + const auto shapeOf = std::make_shared(dsr->output(0)); + const auto dsrOutputRelu = std::make_shared(dsr->output(0)); + const auto shapeOfOutputRelu = std::make_shared(shapeOf->output(0)); + + const auto function = std::make_shared( + ngraph::NodeVector{dsrOutputRelu}, + ngraph::ParameterVector{data, shape}, + "Actual"); + + vpu::DynamicToStaticShapeShapeOf().run_on_function(function); + return function; + } + + std::shared_ptr reference( + const TensorType& dataType, + const TensorShape& dataShape) const { + const auto data = std::make_shared(dataType, dataShape); + const auto shape = std::make_shared(ngraph::element::i64, ngraph::Shape{dataShape.size()}); + + const auto dsr = std::make_shared(data, shape); + const auto shapeRelu = std::make_shared(shape); + const auto dsrOutputRelu = std::make_shared(dsr->output(0)); + + return std::make_shared( + ngraph::NodeVector{dsrOutputRelu}, + ngraph::ParameterVector{data, shape}, + "Expected"); + } +}; + +TEST_P(DynamicToStaticShapeShapeOfKeepDSR, CompareFunctions) { +} + +INSTANTIATE_TEST_CASE_P(NGraph, DynamicToStaticShapeShapeOfKeepDSR, testing::Combine( + testing::Values( + ngraph::element::f16, + ngraph::element::f32, + ngraph::element::i32, + ngraph::element::i64, + ngraph::element::u8), + testing::Values( + TensorShape{1000}, + TensorShape{4, 1000}, + TensorShape{3, 128, 256}, + TensorShape{2, 3, 128, 256}) +)); + +} // namespace diff --git a/inference-engine/tests/functional/plugin/myriad/ngraph/transformations/dynamic_to_static_shape_squeeze.cpp b/inference-engine/tests/functional/plugin/myriad/ngraph/transformations/dynamic_to_static_shape_squeeze.cpp index ecf3d197623..c5169cf8985 100644 --- a/inference-engine/tests/functional/plugin/myriad/ngraph/transformations/dynamic_to_static_shape_squeeze.cpp +++ b/inference-engine/tests/functional/plugin/myriad/ngraph/transformations/dynamic_to_static_shape_squeeze.cpp @@ -65,7 +65,7 @@ protected: node->set_output_type(0, dsr->get_input_element_type(0), ngraph::PartialShape::dynamic(node->get_output_partial_shape(0).rank())); const auto transformations = vpu::Transformations{{node->type_info, vpu::dynamicToStaticShapeSqueeze}}; - vpu::DynamicToStaticShape(transformations).transform(*function); + vpu::DynamicToStaticShape(transformations).transform(function); return function; } diff --git a/inference-engine/tests/functional/plugin/myriad/ngraph/transformations/dynamic_to_static_shape_transpose.cpp b/inference-engine/tests/functional/plugin/myriad/ngraph/transformations/dynamic_to_static_shape_transpose.cpp index aa501d41e53..e5c9efb92f9 100644 --- a/inference-engine/tests/functional/plugin/myriad/ngraph/transformations/dynamic_to_static_shape_transpose.cpp +++ b/inference-engine/tests/functional/plugin/myriad/ngraph/transformations/dynamic_to_static_shape_transpose.cpp @@ -73,7 +73,7 @@ protected: transpose->set_output_type(0, dsr->get_input_element_type(0), makeDynamicShape(transposition->get_output_partial_shape(0))); const auto transformations = vpu::Transformations{{ngraph::opset3::Transpose::type_info, vpu::dynamicToStaticShapeTranspose}}; - vpu::DynamicToStaticShape(transformations).transform(*function); + vpu::DynamicToStaticShape(transformations).transform(function); return function; } diff --git a/inference-engine/tests/functional/plugin/myriad/ngraph/transformations/dynamic_to_static_shape_unary_elementwise.cpp b/inference-engine/tests/functional/plugin/myriad/ngraph/transformations/dynamic_to_static_shape_unary_elementwise.cpp index 6263fc79756..295b16dbd75 100644 --- a/inference-engine/tests/functional/plugin/myriad/ngraph/transformations/dynamic_to_static_shape_unary_elementwise.cpp +++ b/inference-engine/tests/functional/plugin/myriad/ngraph/transformations/dynamic_to_static_shape_unary_elementwise.cpp @@ -50,7 +50,7 @@ protected: node->set_output_type(0, dsr->get_input_element_type(0), ngraph::PartialShape::dynamic(outputShape.rank())); const auto transformations = vpu::Transformations{{type_info, vpu::dynamicToStaticUnaryElementwise}}; - vpu::DynamicToStaticShape(transformations).transform(*function); + vpu::DynamicToStaticShape(transformations).transform(function); return function; } diff --git a/inference-engine/tests/functional/plugin/myriad/ngraph/transformations/dynamic_to_static_shape_unsqueeze.cpp b/inference-engine/tests/functional/plugin/myriad/ngraph/transformations/dynamic_to_static_shape_unsqueeze.cpp index 530c3876724..b43e541d36d 100644 --- a/inference-engine/tests/functional/plugin/myriad/ngraph/transformations/dynamic_to_static_shape_unsqueeze.cpp +++ b/inference-engine/tests/functional/plugin/myriad/ngraph/transformations/dynamic_to_static_shape_unsqueeze.cpp @@ -67,7 +67,7 @@ protected: ngraph::PartialShape::dynamic(node->get_output_partial_shape(0).rank() + unsqueeze_axes.size())); const auto transformations = vpu::Transformations{{node->type_info, vpu::dynamicToStaticShapeUnsqueeze}}; - vpu::DynamicToStaticShape(transformations).transform(*function); + vpu::DynamicToStaticShape(transformations).transform(function); return function; } diff --git a/inference-engine/tests/functional/plugin/myriad/ngraph/transformations/dynamic_to_static_shape_variadic_split.cpp b/inference-engine/tests/functional/plugin/myriad/ngraph/transformations/dynamic_to_static_shape_variadic_split.cpp new file mode 100644 index 00000000000..9a6ed08affa --- /dev/null +++ b/inference-engine/tests/functional/plugin/myriad/ngraph/transformations/dynamic_to_static_shape_variadic_split.cpp @@ -0,0 +1,151 @@ +// Copyright (C) 2020 Intel Corporation +// SPDX-License-Identifier: Apache-2.0 +// + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +namespace { + +using DataType = ngraph::element::Type_t; +using DataDims = ngraph::Shape; + +struct VariadicSplitTestCase { + ngraph::Shape data_shape; + std::vector split_lengths; + int64_t axis, first_split_point, second_split_point; +}; + +const auto combinations = testing::Combine( + testing::Values( + ngraph::element::f16, + ngraph::element::f32, + ngraph::element::i32, + ngraph::element::i64, + ngraph::element::u8), + testing::Values( + ngraph::element::i32, + ngraph::element::i64), + testing::Values( + VariadicSplitTestCase{{6}, {2, 1, 2, 1}, 0, 0, 0}, + VariadicSplitTestCase{{6, 12, 10, 24}, {1, 1, 3, 1}, 0, 0, 1}, + VariadicSplitTestCase{{6, 12}, {7, 2, 1, 2}, 1, 1, 2}, + VariadicSplitTestCase{{6, 12, 10, 24}, {10, 14}, 3, 3, 4}, + VariadicSplitTestCase{{6, 12, 10, 24}, {14, 10}, -1, 3, 4}, + VariadicSplitTestCase{{6, 12, 10, 24}, {6}, -4, 0, 1})); + + +class DynamicToStaticShapeVeriadicSplit : public CommonTestUtils::TestsCommon, + public testing::WithParamInterface> { +public: + void SetUp() override { + const auto& parameters = GetParam(); + const auto& data_type = std::get<0>(parameters); + const auto& idx_type = std::get<1>(parameters); + const auto& variadic_split_setup = std::get<2>(parameters); + + ngraph::helpers::CompareFunctions(*transform(data_type, idx_type, variadic_split_setup), + *reference(data_type, idx_type, variadic_split_setup)); + } + +protected: + std::shared_ptr transform( + const ngraph::element::Type_t& data_type, + const ngraph::element::Type_t& idx_type, + const VariadicSplitTestCase& variadic_split_setup) const { + const auto data = std::make_shared(data_type, variadic_split_setup.data_shape); + const auto axis = ngraph::opset3::Constant::create(idx_type, {}, std::vector{variadic_split_setup.axis}); + const auto split_lengths = ngraph::opset3::Constant::create(idx_type, + {variadic_split_setup.split_lengths.size()}, std::vector{variadic_split_setup.split_lengths}); + + const auto dims = std::make_shared(ngraph::element::i64, ngraph::Shape{variadic_split_setup.data_shape.size()}); + + const auto dsr = std::make_shared(data, dims); + const auto node = std::make_shared(dsr, axis, split_lengths); + + const auto tests_wa = std::make_shared(node->outputs(), variadic_split_setup.axis); + + auto outputShape = node->get_output_partial_shape(0); + const auto function = std::make_shared( + ngraph::NodeVector{tests_wa}, + ngraph::ParameterVector{data, dims}, + "Actual"); + node->set_output_type(0, dsr->get_input_element_type(0), ngraph::PartialShape::dynamic(variadic_split_setup.data_shape.size())); + + const auto transformations = vpu::Transformations{{node->type_info, vpu::dynamicToStaticShapeVariadicSplit}}; + vpu::DynamicToStaticShape(transformations).transform(function); + return function; + } + + std::shared_ptr reference( + const ngraph::element::Type_t& data_type, + const ngraph::element::Type_t& idx_type, + const VariadicSplitTestCase& variadic_split_setup) const { + const auto data = std::make_shared(data_type, variadic_split_setup.data_shape); + const auto axis = ngraph::opset3::Constant::create(idx_type, {}, std::vector{variadic_split_setup.axis}); + const auto split_lengths = ngraph::opset3::Constant::create(idx_type, + {variadic_split_setup.split_lengths.size()}, std::vector{variadic_split_setup.split_lengths}); + + const auto dims = std::make_shared(ngraph::element::i64, ngraph::Shape{variadic_split_setup.data_shape.size()}); + + const auto dsr = std::make_shared(data, dims); + const auto node = std::make_shared(dsr, axis, split_lengths); + + ngraph::OutputVector first_shape_part, second_shape_part; + if (variadic_split_setup.first_split_point) { + std::vector idxs(variadic_split_setup.first_split_point); + std::iota(idxs.begin(), idxs.end(), 0); + first_shape_part.push_back( + std::make_shared( + dims, + ngraph::opset3::Constant::create(ngraph::element::i64, {idxs.size()}, idxs), + ngraph::opset3::Constant::create(ngraph::element::i64, {1}, {0}))); + } + if (variadic_split_setup.first_split_point + 1 < variadic_split_setup.data_shape.size()) { + std::vector idxs(variadic_split_setup.data_shape.size() - variadic_split_setup.second_split_point); + std::iota(idxs.begin(), idxs.end(), variadic_split_setup.second_split_point); + second_shape_part.push_back( + std::make_shared( + dims, + ngraph::opset3::Constant::create(ngraph::element::i64, {idxs.size()}, idxs), + ngraph::opset3::Constant::create(ngraph::element::i64, {1}, {0}))); + } + ngraph::NodeVector results; + for (auto i = 0; i < variadic_split_setup.split_lengths.size(); ++i) { + const auto dim = ngraph::opset3::Constant::create(dims->get_element_type(), {1}, {variadic_split_setup.split_lengths[i]}); + if (!first_shape_part.empty() || !second_shape_part.empty()) { + ngraph::OutputVector output_dims{dim}; + output_dims.insert(output_dims.begin(), first_shape_part.begin(), first_shape_part.end()); + output_dims.insert(output_dims.end(), second_shape_part.begin(), second_shape_part.end()); + const auto output_shape = std::make_shared(output_dims, 0); + results.push_back(std::make_shared(node->output(i), output_shape)); + } else { + results.push_back(std::make_shared(node->output(i), dim)); + } + } + const auto tests_wa = std::make_shared(results, variadic_split_setup.axis); + + return std::make_shared( + tests_wa, + ngraph::ParameterVector{data, dims}, + "Expected"); + } +}; + +TEST_P(DynamicToStaticShapeVeriadicSplit, CompareFunctions) { +} + +INSTANTIATE_TEST_CASE_P(NGraph, DynamicToStaticShapeVeriadicSplit, combinations); + +} // namespace diff --git a/inference-engine/tests/functional/plugin/myriad/shared_tests_instances/behavior/core_threading_tests.cpp b/inference-engine/tests/functional/plugin/myriad/shared_tests_instances/behavior/core_threading_tests.cpp new file mode 100644 index 00000000000..fd694f51fde --- /dev/null +++ b/inference-engine/tests/functional/plugin/myriad/shared_tests_instances/behavior/core_threading_tests.cpp @@ -0,0 +1,22 @@ +// Copyright (C) 2018-2020 Intel Corporation +// SPDX-License-Identifier: Apache-2.0 +// + +#include + +namespace { + +Params params[] = { + std::tuple { "MYRIAD", { { CONFIG_KEY(PERF_COUNT), CONFIG_VALUE(YES) } } }, + std::tuple { "HETERO", { { "TARGET_FALLBACK", "MYRIAD" } } }, + std::tuple { "MULTI", { { MULTI_CONFIG_KEY(DEVICE_PRIORITIES) , "MYRIAD" } } } +}; + +} // namespace + +INSTANTIATE_TEST_CASE_P(MYRIAD, CoreThreadingTests, testing::ValuesIn(params)); + +INSTANTIATE_TEST_CASE_P(DISABLED_MYRIAD, CoreThreadingTestsWithIterations, + testing::Combine(testing::ValuesIn(params), + testing::Values(2), + testing::Values(2))); diff --git a/inference-engine/tests/functional/plugin/myriad/shared_tests_instances/single_layer_tests/concat.cpp b/inference-engine/tests/functional/plugin/myriad/shared_tests_instances/single_layer_tests/concat.cpp index 123636327e1..a47f9c194f2 100644 --- a/inference-engine/tests/functional/plugin/myriad/shared_tests_instances/single_layer_tests/concat.cpp +++ b/inference-engine/tests/functional/plugin/myriad/shared_tests_instances/single_layer_tests/concat.cpp @@ -10,8 +10,7 @@ using namespace LayerTestsDefinitions; namespace { -// TODO: All concat on axis 0 always fails by accuracy -std::vector axes = {1, 2, 3}; +std::vector axes = {0, 1, 2, 3}; std::vector>> inShapes = { {{10, 10, 10, 10}, {10, 10, 10, 10}}, {{10, 10, 10, 10}, {10, 10, 10, 10}, {10, 10, 10, 10}}, @@ -21,21 +20,11 @@ std::vector>> inShapes = { std::vector netPrecisions = {InferenceEngine::Precision::FP16}; -INSTANTIATE_TEST_CASE_P(Axis_1_and_3, ConcatLayerTest, +INSTANTIATE_TEST_CASE_P(Concat_Basic, ConcatLayerTest, ::testing::Combine( - ::testing::Values(1, 3), + ::testing::ValuesIn(axes), ::testing::ValuesIn(inShapes), ::testing::ValuesIn(netPrecisions), ::testing::Values(CommonTestUtils::DEVICE_MYRIAD)), ConcatLayerTest::getTestCaseName); - - -// TODO: concat on axis 2 fails by accuracy with input precision different from FP16 -INSTANTIATE_TEST_CASE_P(Axis_2, ConcatLayerTest, - ::testing::Combine( - ::testing::Values(2), - ::testing::ValuesIn(inShapes), - ::testing::ValuesIn(netPrecisions), - ::testing::Values(CommonTestUtils::DEVICE_MYRIAD)), - ConcatLayerTest::getTestCaseName); -} // namespace \ No newline at end of file +} // namespace diff --git a/inference-engine/tests/functional/plugin/myriad/shared_tests_instances/single_layer_tests/proposal.cpp b/inference-engine/tests/functional/plugin/myriad/shared_tests_instances/single_layer_tests/proposal.cpp new file mode 100644 index 00000000000..afe76b61805 --- /dev/null +++ b/inference-engine/tests/functional/plugin/myriad/shared_tests_instances/single_layer_tests/proposal.cpp @@ -0,0 +1,50 @@ +// Copyright (C) 2020 Intel Corporation +// SPDX-License-Identifier: Apache-2.0 +// + +#include + +#include "single_layer_tests/proposal.hpp" +#include "common_test_utils/test_constants.hpp" + +using namespace ngraph::helpers; +using namespace LayerTestsDefinitions; + +namespace { + +/* ============= Proposal ============= */ +const std::vector base_size_ = {16}; +const std::vector pre_nms_topn_ = {100}; +const std::vector post_nms_topn_ = {100}; +const std::vector nms_thresh_ = {0.7f}; +const std::vector min_size_ = {1}; +const std::vector ratio_ = {{1.0f, 2.0f}}; +const std::vector scale_ = {{1.2f, 1.5f}}; +const std::vector clip_before_nms_ = {false}; +const std::vector clip_after_nms_ = {false}; + +// empty string corresponds to Caffe framework +// Myriad plugin does not take this parameter; uses "" by default +const std::vector framework_ = {""}; + +const auto proposalParams = ::testing::Combine( + ::testing::ValuesIn(base_size_), + ::testing::ValuesIn(pre_nms_topn_), + ::testing::ValuesIn(post_nms_topn_), + ::testing::ValuesIn(nms_thresh_), + ::testing::ValuesIn(min_size_), + ::testing::ValuesIn(ratio_), + ::testing::ValuesIn(scale_), + ::testing::ValuesIn(clip_before_nms_), + ::testing::ValuesIn(clip_after_nms_), + ::testing::ValuesIn(framework_) +); + +INSTANTIATE_TEST_CASE_P(Proposal_tests, ProposalLayerTest, + ::testing::Combine( + proposalParams, + ::testing::Values(CommonTestUtils::DEVICE_MYRIAD)), + ProposalLayerTest::getTestCaseName +); + +} // namespace diff --git a/inference-engine/tests/functional/plugin/myriad/shared_tests_instances/skip_tests_config.cpp b/inference-engine/tests/functional/plugin/myriad/shared_tests_instances/skip_tests_config.cpp index 9042d5a5732..85c824fb348 100644 --- a/inference-engine/tests/functional/plugin/myriad/shared_tests_instances/skip_tests_config.cpp +++ b/inference-engine/tests/functional/plugin/myriad/shared_tests_instances/skip_tests_config.cpp @@ -9,6 +9,9 @@ std::vector disabledTestPatterns() { return { + // Issue 26268 + ".*ConcatLayerTest.*axis=0.*", + // Not supported activation types ".*ActivationLayerTest\\.CompareWithRefs/Tanh.*netPRC=FP32.*", ".*ActivationLayerTest\\.CompareWithRefs/Exp.*netPRC=FP32.*", ".*ActivationLayerTest\\.CompareWithRefs/Log.*netPRC=FP32.*", diff --git a/inference-engine/tests/functional/plugin/myriad/single_layer_tests/static_shape_nonzero.cpp b/inference-engine/tests/functional/plugin/myriad/single_layer_tests/static_shape_nonzero.cpp new file mode 100644 index 00000000000..faf379bb4e2 --- /dev/null +++ b/inference-engine/tests/functional/plugin/myriad/single_layer_tests/static_shape_nonzero.cpp @@ -0,0 +1,119 @@ +// Copyright (C) 2020 Intel Corporation +// SPDX-License-Identifier: Apache-2.0 +// + +#include "vpu/ngraph/operations/static_shape_nonzero.hpp" + +#include "vpu/private_plugin_config.hpp" + +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include + +typedef std::tuple< + InferenceEngine::SizeVector, // Input shape + InferenceEngine::Precision, // Input precision + LayerTestsUtils::TargetDevice // Device name +> staticShapeNonZeroLayerTestParams; + +namespace LayerTestsDefinitions { + +class StaticShapeNonZeroLayerTest : public testing::WithParamInterface, + public LayerTestsUtils::LayerTestsCommon { +public: + static std::string getTestCaseName(testing::TestParamInfo obj) { + InferenceEngine::SizeVector inputShape; + InferenceEngine::Precision inputPrecision; + std::string targetDevice; + std::tie(inputShape, inputPrecision, targetDevice) = obj.param; + + std::ostringstream result; + result << "IS=" << CommonTestUtils::vec2str(inputShape) << "_"; + result << "inPrc=" << inputPrecision.name() << "_"; + result << "targetDevice=" << targetDevice; + return result.str(); + } + +protected: + void SetUp() override { + SetRefMode(LayerTestsUtils::RefMode::INTERPRETER); + configuration[VPU_CONFIG_KEY(DETECT_NETWORK_BATCH)] = CONFIG_VALUE(NO); + configuration[VPU_CONFIG_KEY(DISABLE_REORDER)] = CONFIG_VALUE(YES); + + InferenceEngine::SizeVector inputShape; + std::tie(inputShape, inPrc, targetDevice) = this->GetParam(); + auto ngPrc = FuncTestUtils::PrecisionUtils::convertIE2nGraphPrc(inPrc); + + const auto input = std::make_shared(ngPrc, ngraph::Shape(inputShape)); + const auto staticShapeNonZero = std::make_shared(input, ngraph::element::i32); + ngraph::ResultVector results{std::make_shared(staticShapeNonZero->output(0)), + std::make_shared(staticShapeNonZero->output(1))}; + function = std::make_shared(results, ngraph::ParameterVector{input}); + outPrc = InferenceEngine::Precision::I32; + } + + InferenceEngine::Blob::Ptr GenerateInput(const InferenceEngine::InputInfo &info) const override { + return FuncTestUtils::createAndFillBlobFloat(info.getTensorDesc(), 4, -2, 2); + } + + void Compare(const std::vector>& expectedOutput, const std::vector& actualOutputs) override { + const auto expectedIndicesPtr = reinterpret_cast(expectedOutput[0].data()); + const auto expectedDimsPtr = reinterpret_cast(expectedOutput[1].data()); + + const auto actualIndices = actualOutputs[0]; + const auto actualDims = actualOutputs[1]; + + const auto actualIndicesPtr = InferenceEngine::as(actualIndices)->rmap().as(); + const auto actualDimsPtr = InferenceEngine::as(actualDims)->rmap().as(); + + ASSERT_EQ(expectedDimsPtr[0], actualDimsPtr[0]); + ASSERT_EQ(expectedDimsPtr[1], actualDimsPtr[1]); + + const auto totalDimsSize = actualIndices->getTensorDesc().getDims()[1]; + + for (int axis = 0; axis < actualDimsPtr[1]; ++axis) { + for (int i = 0; i < actualDimsPtr[0]; ++i) { + const auto idx = i + axis * totalDimsSize; + ASSERT_EQ(expectedIndicesPtr[idx], actualIndicesPtr[idx]); + } + } + } +}; + +TEST_P(StaticShapeNonZeroLayerTest, accuracy) { + Run(); +} + +std::vector inputDims = { + { 7 }, + { 1000 }, + { 3, 5 }, + { 65, 33 }, + { 33, 65 }, + { 1, 1000 }, + { 223, 217, 21 }, + { 3, 4, 5, 1 }, + { 3, 4, 1, 5, 1 } +}; + +std::vector inputPrecisions = { + InferenceEngine::Precision::U8, + InferenceEngine::Precision::FP32, + InferenceEngine::Precision::I32, +}; + +INSTANTIATE_TEST_CASE_P(accuracy, StaticShapeNonZeroLayerTest, + ::testing::Combine( + ::testing::ValuesIn(inputDims), + ::testing::ValuesIn(inputPrecisions), + ::testing::Values(CommonTestUtils::DEVICE_MYRIAD))); + +} // namespace LayerTestsDefinitions diff --git a/inference-engine/tests/functional/plugin/myriad/subgraph_tests/dsr_concat.cpp b/inference-engine/tests/functional/plugin/myriad/subgraph_tests/dsr_concat.cpp new file mode 100644 index 00000000000..3f5995e9f90 --- /dev/null +++ b/inference-engine/tests/functional/plugin/myriad/subgraph_tests/dsr_concat.cpp @@ -0,0 +1,81 @@ +// Copyright (C) 2020 Intel Corporation +// SPDX-License-Identifier: Apache-2.0 +// + +#include + +#include +#include + +namespace { + +using DataType = ngraph::element::Type; +using DataShape = ngraph::Shape; +using DataShapes = std::vector; + +struct ConcatParam { + DataShapes dataShapes; + int axis; +}; +using ConcatTestParam = std::tuple; + +class DSR_Concat + : public testing::WithParamInterface, + public LayerTestsUtils::LayerTestsCommon { +protected: + void SetUp() override { + const auto& parameters = GetParam(); + const auto& dataType = std::get<0>(parameters); + const auto& concatParam = std::get<1>(parameters); + targetDevice = std::get<2>(GetParam()); + + const auto& dataShapes = concatParam.dataShapes; + const auto& axis = concatParam.axis; + + ngraph::NodeVector dsrVector; + ngraph::ParameterVector params; + for (const auto& dataShape : dataShapes) { + const auto param = std::make_shared( + dataType, dataShape); + const auto shape = std::make_shared( + ngraph::element::i64, ngraph::Shape{dataShape.size()}); + dsrVector.emplace_back(std::make_shared( + param, shape)); + params.push_back(param); + params.push_back(shape); + } + + const auto concat = std::make_shared(dsrVector, axis); + const auto result = std::make_shared(concat); + + function = std::make_shared( + ngraph::NodeVector{result}, params, "DSR-Concat"); + } +}; + +TEST_P(DSR_Concat, CompareWithReference) { + Run(); +} + +std::vector dataTypes = { + ngraph::element::f16, + ngraph::element::f32, + ngraph::element::i32, + ngraph::element::i64, + ngraph::element::u8, +}; + +std::vector concatParams = { + {DataShapes{DataShape{128}, DataShape{256}, DataShape{512}, DataShape{1024}}, 0}, + {DataShapes{DataShape{1, 1000}, DataShape{2, 1000}, DataShape{4, 1000}, DataShape{8, 1000}}, 0}, + {DataShapes{DataShape{128, 100}, DataShape{128, 200}, DataShape{128, 400}, DataShape{128, 800}}, 1}, + {DataShapes{DataShape{3, 64, 128}, DataShape{4, 64, 128}, DataShape{5, 64, 128}}, 0}, + {DataShapes{DataShape{3, 64, 128}, DataShape{3, 64, 256}, DataShape{3, 64, 512}}, 2}, +}; + +INSTANTIATE_TEST_CASE_P(DISABLED_DynamicConcat, DSR_Concat, ::testing::Combine( + ::testing::ValuesIn(dataTypes), + ::testing::ValuesIn(concatParams), + ::testing::Values(CommonTestUtils::DEVICE_MYRIAD))); + +} // namespace diff --git a/inference-engine/tests/functional/plugin/myriad/subgraph_tests/dsr_gather.cpp b/inference-engine/tests/functional/plugin/myriad/subgraph_tests/dsr_gather.cpp new file mode 100644 index 00000000000..94fc83926fc --- /dev/null +++ b/inference-engine/tests/functional/plugin/myriad/subgraph_tests/dsr_gather.cpp @@ -0,0 +1,143 @@ +// Copyright (C) 2020 Intel Corporation +// SPDX-License-Identifier: Apache-2.0 +// + +#include +#include +#include + +namespace { + +using DataType = ngraph::element::Type_t; +using DataDims = ngraph::Shape; + + +struct GatherTestCase { + ngraph::Shape data_shape, index_shape; + int64_t axis, first_split_point, second_split_point; +}; + +const auto combinations = testing::Combine( + testing::Values( + ngraph::element::f16, + ngraph::element::f32, + ngraph::element::i32, + ngraph::element::i64, + ngraph::element::u8), + testing::Values( + ngraph::element::i32, + ngraph::element::i64, + ngraph::element::u8), + testing::Values( + GatherTestCase{{6}, {15, 4, 20, 28}, 0, 0, 0}, + GatherTestCase{{6, 12, 10, 24}, {6}, 0, 0, 1}, + GatherTestCase{{6, 12}, {15, 4, 20, 28}, 1, 1, 2}, + GatherTestCase{{6, 12, 10, 24}, {15, 4, 20, 28}, 3, 3, 4}, + GatherTestCase{{6, 12, 10, 24}, {15, 4, 20, 28}, -1, 3, 4}, + GatherTestCase{{6, 12, 10, 24}, {15, 4, 20, 28}, -4, 0, 1}), + testing::Values(CommonTestUtils::DEVICE_MYRIAD)); + + +using Parameters = std::tuple< + DataType, + DataType, + GatherTestCase, + LayerTestsUtils::TargetDevice +>; + +class DSR_GatherData : public testing::WithParamInterface, + public LayerTestsUtils::LayerTestsCommon { +protected: + void SetUp() override { + const auto& parameters = GetParam(); + const auto& data_type = std::get<0>(parameters); + const auto& idx_type = std::get<1>(parameters); + const auto& gather_setup = std::get<2>(parameters); + targetDevice = std::get<3>(parameters); + + const auto data = std::make_shared(data_type, gather_setup.data_shape); + const auto indices = std::make_shared(idx_type, gather_setup.index_shape); + const auto axis = ngraph::opset3::Constant::create(ngraph::element::i32, {1}, std::vector{gather_setup.axis}); + + const auto dims = std::make_shared(ngraph::element::i64, ngraph::Shape{gather_setup.data_shape.size()}); + + const auto dsr = std::make_shared(data, dims); + const auto node = std::make_shared(dsr, indices, axis); + + const auto result = std::make_shared(node); + function = std::make_shared(ngraph::ResultVector{result}, + ngraph::ParameterVector{data, indices, dims}, "DSR-GatherData"); + } +}; + +TEST_P(DSR_GatherData, CompareWithReference) { + Run(); +} + +INSTANTIATE_TEST_CASE_P(DISABLED_DynamicGatherData, DSR_GatherData, combinations); + +class DSR_GatherIdx : public testing::WithParamInterface, + public LayerTestsUtils::LayerTestsCommon { +protected: + void SetUp() override { + const auto& parameters = GetParam(); + const auto& data_type = std::get<0>(parameters); + const auto& idx_type = std::get<1>(parameters); + const auto& gather_setup = std::get<2>(parameters); + targetDevice = std::get<3>(parameters); + + const auto data = std::make_shared(data_type, gather_setup.data_shape); + const auto indices = std::make_shared(idx_type, gather_setup.index_shape); + const auto axis = ngraph::opset3::Constant::create(ngraph::element::i32, {1}, std::vector{gather_setup.axis}); + + const auto dims = std::make_shared(ngraph::element::i64, ngraph::Shape{gather_setup.index_shape.size()}); + + const auto dsr = std::make_shared(indices, dims); + const auto node = std::make_shared(data, dsr, axis); + + const auto result = std::make_shared(node); + function = std::make_shared(ngraph::ResultVector{result}, + ngraph::ParameterVector{data, indices, dims}, "DSR-GatherIdx"); + } +}; + +TEST_P(DSR_GatherIdx, CompareWithReference) { + Run(); +} + +INSTANTIATE_TEST_CASE_P(DISABLED_DynamicGatherIdx, DSR_GatherIdx, combinations); + +class DSR_Gather : public testing::WithParamInterface, + public LayerTestsUtils::LayerTestsCommon { +protected: + void SetUp() override { + const auto& parameters = GetParam(); + const auto& data_type = std::get<0>(parameters); + const auto& idx_type = std::get<1>(parameters); + const auto& gather_setup = std::get<2>(parameters); + targetDevice = std::get<3>(parameters); + + const auto data = std::make_shared(data_type, gather_setup.data_shape); + const auto indices = std::make_shared(idx_type, gather_setup.index_shape); + const auto axis = ngraph::opset3::Constant::create(ngraph::element::i32, {1}, std::vector{gather_setup.axis}); + + const auto data_dims = std::make_shared(ngraph::element::i64, ngraph::Shape{gather_setup.data_shape.size()}); + const auto indices_dims = std::make_shared(ngraph::element::i64, ngraph::Shape{gather_setup.index_shape.size()}); + + const auto data_dsr = std::make_shared(data, data_dims); + const auto indices_dsr = std::make_shared(indices, indices_dims); + const auto node = std::make_shared(data_dsr, indices_dsr, axis); + + const auto result = std::make_shared(node); + function = std::make_shared(ngraph::ResultVector{result}, + ngraph::ParameterVector{data, indices, data_dims, indices_dims}, "DSR-Gather"); + } +}; + +TEST_P(DSR_Gather, CompareWithReference) { + Run(); +} + +INSTANTIATE_TEST_CASE_P(DISABLED_DynamicGatherIdx, DSR_Gather, combinations); + +} // namespace diff --git a/inference-engine/tests/functional/plugin/myriad/subgraph_tests/dsr_reshape.cpp b/inference-engine/tests/functional/plugin/myriad/subgraph_tests/dsr_reshape.cpp new file mode 100644 index 00000000000..58413e1811c --- /dev/null +++ b/inference-engine/tests/functional/plugin/myriad/subgraph_tests/dsr_reshape.cpp @@ -0,0 +1,71 @@ +// Copyright (C) 2020 Intel Corporation +// SPDX-License-Identifier: Apache-2.0 +// + +#include + +#include +#include + +namespace { + +using DataType = ngraph::element::Type_t; +using DataShape = ngraph::Shape; +using ShapeDescriptor = std::vector; +using ReshapeTestParams = std::tuple; + +using Parameters = std::tuple< + DataType, + ReshapeTestParams, + LayerTestsUtils::TargetDevice +>; + +class DSR_Reshape : public testing::WithParamInterface, public LayerTestsUtils::LayerTestsCommon { +protected: + void SetUp() override { + const auto& parameters = GetParam(); + const auto& inDataType = std::get<0>(GetParam()); + const auto& reshapeTestParams = std::get<1>(GetParam()); + targetDevice = std::get<2>(GetParam()); + + const auto& inDataShape = std::get<0>(reshapeTestParams); + const auto& specialZero = std::get<1>(reshapeTestParams); + const auto& outShapeDescriptor = std::get<2>(reshapeTestParams); + + const auto inDataParam = std::make_shared( + inDataType, inDataShape); + const auto inDataShapeParam = std::make_shared( + ngraph::element::i32, ngraph::Shape{inDataShape.size()}); + const auto dsr = std::make_shared( + inDataParam, inDataShapeParam); + + const auto outShapeDescriptorConstNode = std::make_shared( + ngraph::element::i64, ngraph::Shape{outShapeDescriptor.size()}, outShapeDescriptor); + const auto reshape = std::make_shared( + dsr, outShapeDescriptorConstNode, specialZero); + + const auto result = std::make_shared(reshape); + function = std::make_shared( + ngraph::ResultVector{result}, + ngraph::ParameterVector{inDataParam, inDataShapeParam}, + "DSR-Reshape"); + } +}; + +TEST_P(DSR_Reshape, CompareWithReference) { + Run(); +} + +std::vector reshapeTestParams = { + std::make_tuple(DataShape{1, 5, 5, 24}, true, ShapeDescriptor{0, -1, 4}), + std::make_tuple(DataShape{1, 5, 5, 0}, false, ShapeDescriptor{0, 4}), + std::make_tuple(DataShape{1, 3, 128, 256}, true, ShapeDescriptor{0, 0, 64, 512}), +}; + +INSTANTIATE_TEST_CASE_P(DISABLED_DynamicReshape, DSR_Reshape, + ::testing::Combine( + ::testing::Values(ngraph::element::f16, ngraph::element::f32, ngraph::element::i32), + ::testing::ValuesIn(reshapeTestParams), + ::testing::Values(CommonTestUtils::DEVICE_MYRIAD))); + +} // namespace diff --git a/inference-engine/tests/functional/plugin/myriad/subgraph_tests/dsr_variadic_split.cpp b/inference-engine/tests/functional/plugin/myriad/subgraph_tests/dsr_variadic_split.cpp new file mode 100644 index 00000000000..ec868b96daa --- /dev/null +++ b/inference-engine/tests/functional/plugin/myriad/subgraph_tests/dsr_variadic_split.cpp @@ -0,0 +1,81 @@ +// Copyright (C) 2020 Intel Corporation +// SPDX-License-Identifier: Apache-2.0 +// + +#include +#include +#include + +namespace { + +using DataType = ngraph::element::Type_t; +using DataDims = ngraph::Shape; + + +struct VariadicSplitTestCase { + ngraph::Shape data_shape; + std::vector split_lengths; + int64_t axis, first_split_point, second_split_point; +}; + +const auto combinations = testing::Combine( + testing::Values( + ngraph::element::f16, + ngraph::element::f32, + ngraph::element::i32, + ngraph::element::i64, + ngraph::element::u8), + testing::Values( + ngraph::element::i32, + ngraph::element::i64), + testing::Values( + VariadicSplitTestCase{{6}, {2, 1, 2, 1}, 0, 0, 0}, + VariadicSplitTestCase{{6, 12, 10, 24}, {1, 1, 3, 1}, 0, 0, 1}, + VariadicSplitTestCase{{6, 12}, {7, 2, 1, 2}, 1, 1, 2}, + VariadicSplitTestCase{{6, 12, 10, 24}, {10, 14}, 3, 3, 4}, + VariadicSplitTestCase{{6, 12, 10, 24}, {14, 10}, -1, 3, 4}, + VariadicSplitTestCase{{6, 12, 10, 24}, {6}, -4, 0, 1}), + testing::Values(CommonTestUtils::DEVICE_MYRIAD)); + + +using Parameters = std::tuple< + DataType, + DataType, + VariadicSplitTestCase, + LayerTestsUtils::TargetDevice +>; + +class DSR_VariadicSplit : public testing::WithParamInterface, + public LayerTestsUtils::LayerTestsCommon { +protected: + void SetUp() override { + const auto& parameters = GetParam(); + const auto& data_type = std::get<0>(parameters); + const auto& idx_type = std::get<1>(parameters); + const auto& variadic_split_setup = std::get<2>(parameters); + targetDevice = std::get<3>(parameters); + + const auto data = std::make_shared(data_type, variadic_split_setup.data_shape); + const auto axis = ngraph::opset3::Constant::create(idx_type, {}, std::vector{variadic_split_setup.axis}); + const auto split_lengths = ngraph::opset3::Constant::create(idx_type, + {variadic_split_setup.split_lengths.size()}, std::vector{variadic_split_setup.split_lengths}); + + const auto dims = std::make_shared(ngraph::element::i64, ngraph::Shape{variadic_split_setup.data_shape.size()}); + + const auto dsr = std::make_shared(data, dims); + const auto node = std::make_shared(dsr, axis, split_lengths); + + const auto tests_wa = std::make_shared(node->outputs(), variadic_split_setup.axis); + const auto result = std::make_shared(tests_wa); + function = std::make_shared(ngraph::ResultVector{result}, + ngraph::ParameterVector{data, dims}, "DSR-VariadicSplit"); + } +}; + +TEST_P(DSR_VariadicSplit, CompareWithReference) { + Run(); +} + +INSTANTIATE_TEST_CASE_P(DISABLED_DynamicGatherData, DSR_VariadicSplit, combinations); + +} // namespace diff --git a/inference-engine/tests/functional/plugin/myriad/subgraph_tests/nonzero_broadcast.cpp b/inference-engine/tests/functional/plugin/myriad/subgraph_tests/nonzero_broadcast.cpp new file mode 100644 index 00000000000..b2c5c61d8a9 --- /dev/null +++ b/inference-engine/tests/functional/plugin/myriad/subgraph_tests/nonzero_broadcast.cpp @@ -0,0 +1,62 @@ +// Copyright (C) 2020 Intel Corporation +// SPDX-License-Identifier: Apache-2.0 +// + +#include + +#include +#include + +namespace { + +using TensorType = ngraph::element::Type; +using TensorShape = ngraph::PartialShape; + +using BroadcastExplicitTestParams = std::tuple< + TensorType, TensorShape, LayerTestsUtils::TargetDevice>; + +class NonZero_Broadcast : public testing::WithParamInterface, + public LayerTestsUtils::LayerTestsCommon { +protected: + void SetUp() override { + const auto& parameters = GetParam(); + const auto& tensorType = std::get<0>(parameters); + const auto& tensorShape = std::get<1>(parameters); + targetDevice = std::get<2>(GetParam()); + + const auto tensorParam = std::make_shared( + tensorType, tensorShape); + const auto nonZero = std::make_shared(tensorParam); + const auto shapeOfNonZero = std::make_shared(nonZero); + + const auto broadcastConstant = std::make_shared( + tensorType, ngraph::Shape{1}, 1); + + const auto axesMappingConstant = std::make_shared( + ngraph::element::u64, ngraph::Shape{1}, 0); + + const auto broadcast = std::make_shared( + broadcastConstant, shapeOfNonZero, axesMappingConstant); + + const auto result = std::make_shared(broadcast); + + function = std::make_shared( + ngraph::ResultVector{result}, + ngraph::ParameterVector{tensorParam}, + "NonZero-Broadcast"); + } +}; + +TEST_P(NonZero_Broadcast, CompareWithReference) { + Run(); +} +// Blocked by #-30913, #-30915 +INSTANTIATE_TEST_CASE_P(DISABLED_DynamicBroadcast, NonZero_Broadcast, ::testing::Combine( + ::testing::Values(ngraph::element::f16, ngraph::element::f32, ngraph::element::i32), + ::testing::Values( + TensorShape{1000}, + TensorShape{4, 1000}, + TensorShape{3, 128, 256}), + ::testing::Values(CommonTestUtils::DEVICE_MYRIAD))); + +} // namespace diff --git a/inference-engine/tests/functional/plugin/myriad/subgraph_tests/dsr_transpose.cpp b/inference-engine/tests/functional/plugin/myriad/subgraph_tests/nonzero_transpose.cpp similarity index 71% rename from inference-engine/tests/functional/plugin/myriad/subgraph_tests/dsr_transpose.cpp rename to inference-engine/tests/functional/plugin/myriad/subgraph_tests/nonzero_transpose.cpp index 8198d7add5b..775724a9463 100644 --- a/inference-engine/tests/functional/plugin/myriad/subgraph_tests/dsr_transpose.cpp +++ b/inference-engine/tests/functional/plugin/myriad/subgraph_tests/nonzero_transpose.cpp @@ -5,6 +5,7 @@ #include #include #include +#include namespace { @@ -17,7 +18,7 @@ using Parameters = std::tuple< LayerTestsUtils::TargetDevice >; -class DSR_Transpose : public testing::WithParamInterface, public LayerTestsUtils::LayerTestsCommon { +class NonZero_Transpose : public testing::WithParamInterface, public LayerTestsUtils::LayerTestsCommon { protected: void SetUp() override { const auto& parameters = GetParam(); @@ -26,25 +27,29 @@ protected: targetDevice = std::get<2>(GetParam()); const auto data = std::make_shared(dataType, dataDims); - const auto dims = std::make_shared(ngraph::element::i64, ngraph::Shape{dataDims.size()}); - const auto dsr = std::make_shared(data, dims); + const auto nonZero = std::make_shared(data); auto permutation = std::vector(dataDims.size()); std::iota(permutation.begin(), permutation.end(), 0); std::shuffle(permutation.begin(), permutation.end(), std::mt19937()); const auto transposition = std::make_shared(ngraph::element::i64, ngraph::Shape{dataDims.size()}, permutation); - const auto transpose = std::make_shared(dsr, transposition); + const auto transpose = std::make_shared(nonZero, transposition); const auto result = std::make_shared(transpose); - function = std::make_shared(ngraph::ResultVector{result}, ngraph::ParameterVector{data, dims}, "DSR-Transpose"); + function = std::make_shared(ngraph::ResultVector{result}, ngraph::ParameterVector{data}, "NonZero-Transpose"); } }; -TEST_P(DSR_Transpose, CompareWithReference) { - Run(); +TEST_P(NonZero_Transpose, CompareWithReference) { + SKIP_IF_CURRENT_TEST_IS_DISABLED() + + configuration.emplace(VPU_MYRIAD_CONFIG_KEY(PLATFORM), VPU_MYRIAD_CONFIG_VALUE(2480)); + ConfigurePlugin(); + + ASSERT_NO_THROW(LoadNetwork()); } -INSTANTIATE_TEST_CASE_P(DISABLED_DynamicTranspose, DSR_Transpose, +INSTANTIATE_TEST_CASE_P(DynamicTranspose, NonZero_Transpose, ::testing::Combine( ::testing::Values(ngraph::element::f16, ngraph::element::f32, ngraph::element::i32), ::testing::Values(ngraph::Shape{1, 800}), diff --git a/inference-engine/tests/functional/plugin/shared/include/behavior/core_threading_tests.hpp b/inference-engine/tests/functional/plugin/shared/include/behavior/core_threading_tests.hpp new file mode 100644 index 00000000000..0af6860f659 --- /dev/null +++ b/inference-engine/tests/functional/plugin/shared/include/behavior/core_threading_tests.hpp @@ -0,0 +1,198 @@ +// Copyright (C) 2018-2020 Intel Corporation +// SPDX-License-Identifier: Apache-2.0 +// + +#include +#include
+#include +#include +#include + +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include + +using Device = std::string; +using Config = std::map; +using Params = std::tuple; + +class CoreThreadingTestsBase { +public: + static void runParallel(std::function func, + const unsigned int iterations = 100, + const unsigned int threadsNum = 8) { + std::vector threads(threadsNum); + + for (auto & thread : threads) { + thread = std::thread([&](){ + for (unsigned int i = 0; i < iterations; ++i) { + func(); + } + }); + } + + for (auto & thread : threads) { + if (thread.joinable()) + thread.join(); + } + } + + void safePluginUnregister(InferenceEngine::Core & ie) { + try { + ie.UnregisterPlugin(deviceName); + } catch (const InferenceEngine::details::InferenceEngineException & ex) { + // if several threads unload plugin at once, the first thread does this + // while all others will throw an exception that plugin is not registered + ASSERT_STR_CONTAINS(ex.what(), "name is not registered in the"); + } + } + + void safeAddExtension(InferenceEngine::Core & ie) { + try { + auto extension = InferenceEngine::make_so_pointer( + FileUtils::makeSharedLibraryName({}, "extension_tests")); + ie.AddExtension(extension); + } catch (const InferenceEngine::details::InferenceEngineException & ex) { + ASSERT_STR_CONTAINS(ex.what(), "name: experimental"); + } + } + + Device deviceName; + Config config; +}; + +// +// Common threading plugin tests +// + +class CoreThreadingTests : public CoreThreadingTestsBase, + public ::testing::TestWithParam { +public: + void SetUp() override { + std::tie(deviceName, config) = GetParam(); + } +}; + +// tested function: GetVersions, UnregisterPlugin +TEST_P(CoreThreadingTests, smoke_GetVersions) { + InferenceEngine::Core ie; + + runParallel([&] () { + auto versions = ie.GetVersions(deviceName); + ASSERT_LE(1u, versions.size()); + safePluginUnregister(ie); + }); +} + +// tested function: SetConfig for already created plugins +TEST_P(CoreThreadingTests, smoke_SetConfigPluginExists) { + InferenceEngine::Core ie; + + ie.SetConfig(config); + auto versions = ie.GetVersions(deviceName); + + runParallel([&] () { + ie.SetConfig(config); + }, 10000); +} + +// tested function: GetConfig, UnregisterPlugin +TEST_P(CoreThreadingTests, smoke_GetConfig) { + InferenceEngine::Core ie; + std::string configKey = config.begin()->first; + + ie.SetConfig(config); + runParallel([&] () { + ie.GetConfig(deviceName, configKey); + safePluginUnregister(ie); + }); +} + +// tested function: GetMetric, UnregisterPlugin +TEST_P(CoreThreadingTests, smoke_GetMetric) { + InferenceEngine::Core ie; + runParallel([&] () { + ie.GetMetric(deviceName, METRIC_KEY(SUPPORTED_CONFIG_KEYS)); + safePluginUnregister(ie); + }); +} + +// tested function: QueryNetwork +TEST_P(CoreThreadingTests, smoke_QueryNetwork) { + InferenceEngine::Core ie; + auto model = FuncTestUtils::TestModel::convReluNormPoolFcModelFP32; + auto network = ie.ReadNetwork(model.model_xml_str, model.weights_blob); + + ie.SetConfig(config, deviceName); + InferenceEngine::QueryNetworkResult refResult = ie.QueryNetwork(network, deviceName); + + runParallel([&] () { + const auto result = ie.QueryNetwork(network, deviceName); + safePluginUnregister(ie); + + // compare QueryNetworkResult with reference + for (auto && r : refResult.supportedLayersMap) { + ASSERT_NE(result.supportedLayersMap.end(), result.supportedLayersMap.find(r.first)); + } + for (auto && r : result.supportedLayersMap) { + ASSERT_NE(refResult.supportedLayersMap.end(), refResult.supportedLayersMap.find(r.first)); + } + }, 3000); +} + +// +// Parametrized tests with numfer of parallel threads, iterations +// + +using Threads = unsigned int; +using Iterations = unsigned int; + +class CoreThreadingTestsWithIterations : public ::testing::TestWithParam >, + public CoreThreadingTestsBase { +public: + void SetUp() override { + std::tie(deviceName, config) = std::get<0>(GetParam()); + numThreads = std::get<1>(GetParam()); + numIterations = std::get<2>(GetParam()); + } + + unsigned int numIterations; + unsigned int numThreads; +}; + +// tested function: LoadNetwork, AddExtension +TEST_P(CoreThreadingTestsWithIterations, smoke_LoadNetwork) { + InferenceEngine::Core ie; + std::atomic counter{0u}; + + const FuncTestUtils::TestModel::TestModel models[] = { + FuncTestUtils::TestModel::convReluNormPoolFcModelFP32, + FuncTestUtils::TestModel::convReluNormPoolFcModelFP16 + }; + std::vector networks; + for (auto & model : models) { + networks.emplace_back(ie.ReadNetwork(model.model_xml_str, model.weights_blob)); + } + + // TODO: uncomment after fixing *-31414 + // networks.emplace_back(InferenceEngine::CNNNetwork(ngraph::builder::subgraph::make2InputSubtract())); + // networks.emplace_back(InferenceEngine::CNNNetwork(ngraph::builder::subgraph::makeMultiSingleConv())); + // networks.emplace_back(InferenceEngine::CNNNetwork(ngraph::builder::subgraph::makeSingleConv())); + // networks.emplace_back(InferenceEngine::CNNNetwork(ngraph::builder::subgraph::makeSplitConvConcat())); + // networks.emplace_back(InferenceEngine::CNNNetwork(ngraph::builder::subgraph::makeSplitMultiConvConcat())); + + ie.SetConfig(config, deviceName); + runParallel([&] () { + auto value = counter++; + (void)ie.LoadNetwork(networks[(counter++) % networks.size()], deviceName); + }, numIterations, numThreads); +} diff --git a/inference-engine/tests/functional/plugin/shared/include/single_layer_tests/concat.hpp b/inference-engine/tests/functional/plugin/shared/include/single_layer_tests/concat.hpp index 53f0b61a6d3..ecd7c57c34c 100644 --- a/inference-engine/tests/functional/plugin/shared/include/single_layer_tests/concat.hpp +++ b/inference-engine/tests/functional/plugin/shared/include/single_layer_tests/concat.hpp @@ -16,6 +16,7 @@ namespace LayerTestsDefinitions { using concatParamsTuple = typename std::tuple< + //TODO: according to specification axis have to be int, negative values are allowed size_t, // Concat axis std::vector>, // Input shapes InferenceEngine::Precision, // Network precision diff --git a/inference-engine/tests/functional/plugin/shared/include/single_layer_tests/proposal.hpp b/inference-engine/tests/functional/plugin/shared/include/single_layer_tests/proposal.hpp new file mode 100644 index 00000000000..c8a9dc40ea9 --- /dev/null +++ b/inference-engine/tests/functional/plugin/shared/include/single_layer_tests/proposal.hpp @@ -0,0 +1,66 @@ +// Copyright (C) 2020 Intel Corporation +// SPDX-License-Identifier: Apache-2.0 +// + +#pragma once + +#include +#include +#include +#include + +#include "functional_test_utils/layer_test_utils.hpp" +#include "ngraph_functions/builders.hpp" +#include "ngraph_functions/utils/ngraph_helpers.hpp" + +namespace LayerTestsDefinitions { + +namespace proposalTypes { + +typedef size_t base_size_type; +typedef size_t pre_nms_topn_type; +typedef size_t post_nms_topn_type; +typedef float nms_thresh_type; +typedef size_t min_size_type; +typedef std::vector ratio_type; +typedef std::vector scale_type; +typedef bool clip_before_nms_type; +typedef bool clip_after_nms_type; +typedef bool normalize_type; +typedef size_t feat_stride_type; +typedef float box_size_scale_type; +typedef float box_coordinate_scale_type; +typedef std::string framework_type; + +}; // namespace proposalTypes + +using namespace proposalTypes; + +typedef std::tuple< + base_size_type, + pre_nms_topn_type, + post_nms_topn_type, + nms_thresh_type, + min_size_type, + ratio_type, + scale_type, + clip_before_nms_type, + clip_after_nms_type, + framework_type> proposalSpecificParams; +typedef std::tuple< + proposalSpecificParams, + std::string> proposalLayerTestParamsSet; + +class ProposalLayerTest + : public testing::WithParamInterface, + public LayerTestsUtils::LayerTestsCommon { +public: + static std::string getTestCaseName(testing::TestParamInfo obj); + InferenceEngine::Blob::Ptr GenerateInput(const InferenceEngine::InputInfo &info) const override; + +protected: + void SetUp() override; + void Validate() override; +}; + +} // namespace LayerTestsDefinitions diff --git a/inference-engine/tests/functional/plugin/shared/src/single_layer_tests/activation.cpp b/inference-engine/tests/functional/plugin/shared/src/single_layer_tests/activation.cpp index 1adf2b8fdc9..b7add9d286e 100644 --- a/inference-engine/tests/functional/plugin/shared/src/single_layer_tests/activation.cpp +++ b/inference-engine/tests/functional/plugin/shared/src/single_layer_tests/activation.cpp @@ -101,12 +101,15 @@ TEST_P(ActivationLayerTest, CompareWithRefs) { auto ngPrc = FuncTestUtils::PrecisionUtils::convertIE2nGraphPrc(netPrecision); convertFuncToF32(fnPtr, netPrecision); auto refOutData = ngraph::helpers::inferFnWithInterp(fnPtr, inRawData); - auto thr = FuncTestUtils::GetComparisonThreshold(netPrecision); + float thr1, thr2; + FuncTestUtils::GetComparisonThreshold(netPrecision, thr1, thr2); + size_t outElementsCount = std::accumulate(begin(fnPtr->get_output_shape(0)), end(fnPtr->get_output_shape(0)), 1, std::multiplies()); - FuncTestUtils::compareRawBuffers(outBlob->cbuffer().as(), *refOutData[0], outElementsCount, - outElementsCount, - thr); + FuncTestUtils::compareRawBuffers(outBlob->cbuffer().as(), *refOutData[0], + outElementsCount, outElementsCount, + FuncTestUtils::CompareType::ABS_AND_REL, + thr1, thr2); fnPtr.reset(); if (targetDevice.find(CommonTestUtils::DEVICE_GPU) != std::string::npos) { PluginCache::get().reset(); diff --git a/inference-engine/tests/functional/plugin/shared/src/single_layer_tests/concat.cpp b/inference-engine/tests/functional/plugin/shared/src/single_layer_tests/concat.cpp index 251ec74cac0..24d1d6ba32e 100644 --- a/inference-engine/tests/functional/plugin/shared/src/single_layer_tests/concat.cpp +++ b/inference-engine/tests/functional/plugin/shared/src/single_layer_tests/concat.cpp @@ -21,7 +21,7 @@ namespace LayerTestsDefinitions { std::string ConcatLayerTest::getTestCaseName(const testing::TestParamInfo &obj) { - size_t axis; + int axis; std::vector> inputShapes; InferenceEngine::Precision netPrecision; std::string targetName; @@ -35,7 +35,7 @@ std::string ConcatLayerTest::getTestCaseName(const testing::TestParamInfo> inputShape; InferenceEngine::Precision netPrecision; std::tie(axis, inputShape, netPrecision, targetDevice) = this->GetParam(); diff --git a/inference-engine/tests/functional/plugin/shared/src/single_layer_tests/proposal.cpp b/inference-engine/tests/functional/plugin/shared/src/single_layer_tests/proposal.cpp new file mode 100644 index 00000000000..d5cc953ff8a --- /dev/null +++ b/inference-engine/tests/functional/plugin/shared/src/single_layer_tests/proposal.cpp @@ -0,0 +1,154 @@ +// Copyright (C) 2020 Intel Corporation +// SPDX-License-Identifier: Apache-2.0 +// + +#include +#include +#include +#include +#include +#include + +#include "ie_core.hpp" + +#include "common_test_utils/common_utils.hpp" +#include "functional_test_utils/blob_utils.hpp" +#include "functional_test_utils/plugin_cache.hpp" +#include "functional_test_utils/layer_test_utils.hpp" + +#include "single_layer_tests/proposal.hpp" + +namespace LayerTestsDefinitions { + +const normalize_type normalize = true; +const feat_stride_type feat_stride = 1; +const box_size_scale_type box_size_scale = 2.0f; +const box_coordinate_scale_type box_coordinate_scale = 2.0f; + +std::string ProposalLayerTest::getTestCaseName(testing::TestParamInfo obj) { + proposalSpecificParams proposalParams; + + std::string targetDevice; + std::tie(proposalParams, targetDevice) = obj.param; + + base_size_type base_size; + pre_nms_topn_type pre_nms_topn; + post_nms_topn_type post_nms_topn; + nms_thresh_type nms_thresh; + min_size_type min_size; + ratio_type ratio; + scale_type scale; + clip_before_nms_type clip_before_nms; + clip_after_nms_type clip_after_nms; + framework_type framework; + std::tie(base_size, pre_nms_topn, + post_nms_topn, + nms_thresh, + min_size, + ratio, + scale, + clip_before_nms, + clip_after_nms, + framework) = proposalParams; + + std::ostringstream result; + result << "base_size=" << base_size << "_"; + result << "pre_nms_topn=" << pre_nms_topn << "_"; + result << "post_nms_topn=" << post_nms_topn << "_"; + result << "nms_thresh=" << nms_thresh << "_"; + result << "feat_stride=" << feat_stride << "_"; + result << "min_size=" << min_size << "_"; + result << "ratio = " << CommonTestUtils::vec2str(ratio) << "_"; + result << "scale = " << CommonTestUtils::vec2str(scale) << "_"; + result << "clip_before_nms=" << clip_before_nms << "_"; + result << "clip_after_nms=" << clip_after_nms << "_"; + result << "normalize=" << normalize << "_"; + result << "box_size_scale=" << box_size_scale << "_"; + result << "box_coordinate_scale=" << box_coordinate_scale << "_"; + result << "framework=" << framework << "_"; + result << "targetDevice=" << targetDevice; + + return result.str(); +} + +void ProposalLayerTest::SetUp() { + proposalSpecificParams proposalParams; + + std::tie(proposalParams, targetDevice) = this->GetParam(); + base_size_type base_size; + pre_nms_topn_type pre_nms_topn; + post_nms_topn_type post_nms_topn; + nms_thresh_type nms_thresh; + min_size_type min_size; + ratio_type ratio; + scale_type scale; + clip_before_nms_type clip_before_nms; + clip_after_nms_type clip_after_nms; + framework_type framework; + + std::tie(base_size, pre_nms_topn, + post_nms_topn, + nms_thresh, + min_size, + ratio, + scale, + clip_before_nms, + clip_after_nms, + framework) = proposalParams; + + size_t bottom_w = base_size; + size_t bottom_h = base_size; + size_t num_anchors = ratio.size() * scale.size(); + + std::vector scoresShape = {1, 2 * num_anchors, bottom_h, bottom_w}; + std::vector boxesShape = {1, 4 * num_anchors, bottom_h, bottom_w}; + std::vector imageInfoShape = {3}; + + auto ngPrc = FuncTestUtils::PrecisionUtils::convertIE2nGraphPrc(InferenceEngine::Precision::FP16); + auto params = ngraph::builder::makeParams(ngPrc, {{"scores", scoresShape}, {"boxes", boxesShape}, {"image_info", imageInfoShape}}); + auto paramOuts = ngraph::helpers::convert2OutputVector(ngraph::helpers::castOps2Nodes(params)); + + auto proposal = std::dynamic_pointer_cast( + ngraph::builder::makeProposal(paramOuts[0], paramOuts[1], paramOuts[2], ngPrc, + base_size, + pre_nms_topn, + post_nms_topn, + nms_thresh, + feat_stride, + min_size, + ratio, + scale, + clip_before_nms, + clip_after_nms, + normalize, + box_size_scale, + box_coordinate_scale, + framework)); + + ngraph::ResultVector results{std::make_shared(proposal)}; + function = std::make_shared(results, params, "proposal"); +} + +InferenceEngine::Blob::Ptr ProposalLayerTest::GenerateInput(const InferenceEngine::InputInfo &info) const { + InferenceEngine::Blob::Ptr blobPtr; + + const std::string name = info.name(); + if (name == "scores") { + blobPtr = FuncTestUtils::createAndFillBlobFloat(info.getTensorDesc(), 1, 0, 1000, 8234231); + } else if (name == "boxes") { + blobPtr = FuncTestUtils::createAndFillBlobFloatNormalDistribution(info.getTensorDesc(), 0.0f, 0.2f, 7235346); + } else if (name == "image_info") { + const float image_info[] = {225.0f, 225.0f, 1.0f}; + blobPtr = FuncTestUtils::createAndFillBlobWithFloatArray(info.getTensorDesc(), image_info, 3); + } + + return blobPtr; +} + +// TODO: for validation, reference version is required (#28373) +void ProposalLayerTest::Validate() {} + +TEST_P(ProposalLayerTest, CompareWithRefs) { + Run(); +} +} // namespace LayerTestsDefinitions diff --git a/inference-engine/tests/functional/plugin/shared/src/single_layer_tests/select.cpp b/inference-engine/tests/functional/plugin/shared/src/single_layer_tests/select.cpp index 17a1909f04d..2bd874e8cb5 100644 --- a/inference-engine/tests/functional/plugin/shared/src/single_layer_tests/select.cpp +++ b/inference-engine/tests/functional/plugin/shared/src/single_layer_tests/select.cpp @@ -87,10 +87,15 @@ namespace LayerTestsDefinitions { std::vector convRefOutData(outElementsCount); for (size_t i = 0; i < outElementsCount; i++) convRefOutData[i] = static_cast(refOutData[i]); - FuncTestUtils::compareRawBuffers(outBlob->cbuffer().as(), convRefOutData.data(), outElementsCount, outElementsCount); + FuncTestUtils::compareRawBuffers(outBlob->cbuffer().as(), convRefOutData.data(), + outElementsCount, outElementsCount, FuncTestUtils::CompareType::ABS_AND_REL); } else { - auto thr = FuncTestUtils::GetComparisonThreshold(InferenceEngine::Precision::FP32); - FuncTestUtils::compareRawBuffers(outBlob->cbuffer().as(), refOutData.data(), outElementsCount, outElementsCount, thr); + float thr1, thr2; + FuncTestUtils::GetComparisonThreshold(InferenceEngine::Precision::FP32, thr1, thr2); + FuncTestUtils::compareRawBuffers(outBlob->cbuffer().as(), refOutData.data(), + outElementsCount, outElementsCount, + FuncTestUtils::CompareType::ABS_AND_REL, + thr1, thr2); } layer.fnPtr.reset(); diff --git a/inference-engine/tests/ie_test_utils/common_test_utils/data_utils.hpp b/inference-engine/tests/ie_test_utils/common_test_utils/data_utils.hpp index b40b2d76794..031919ce994 100644 --- a/inference-engine/tests/ie_test_utils/common_test_utils/data_utils.hpp +++ b/inference-engine/tests/ie_test_utils/common_test_utils/data_utils.hpp @@ -92,9 +92,10 @@ void inline fill_data_random(InferenceEngine::Blob::Ptr &blob, const uint32_t r } template -void inline fill_data_random_float(InferenceEngine::Blob::Ptr &blob, const uint32_t range, int32_t start_from, const int32_t k) { +void inline fill_data_random_float(InferenceEngine::Blob::Ptr &blob, const uint32_t range, int32_t start_from, const int32_t k, + const int seed = 1) { using dataType = typename InferenceEngine::PrecisionTrait::value_type; - std::default_random_engine random(1); + std::default_random_engine random(seed); // 1/k is the resolution of the floating point numbers std::uniform_int_distribution distribution(k * start_from, k * (start_from + range)); @@ -110,6 +111,41 @@ void inline fill_data_random_float(InferenceEngine::Blob::Ptr &blob, const uint3 } } +template +void inline fill_data_normal_random_float(InferenceEngine::Blob::Ptr &blob, + const float mean, + const float stddev, + const int seed = 1) { + using dataType = typename InferenceEngine::PrecisionTrait::value_type; + std::default_random_engine random(seed); + std::normal_distribution<> normal_d{mean, stddev}; + + auto *rawBlobDataPtr = blob->buffer().as(); + for (size_t i = 0; i < blob->size(); i++) { + auto value = static_cast(normal_d(random)); + if (typeid(dataType) == typeid(typename InferenceEngine::PrecisionTrait::value_type)) { + rawBlobDataPtr[i] = ngraph::float16(value).to_bits(); + } else { + rawBlobDataPtr[i] = value; + } + } +} + +template +void inline fill_data_float_array(InferenceEngine::Blob::Ptr &blob, const float values[], const size_t size) { + using dataType = typename InferenceEngine::PrecisionTrait::value_type; + + auto *rawBlobDataPtr = blob->buffer().as(); + for (size_t i = 0; i < std::min(size, blob->size()); i++) { + auto value = values[i]; + if (typeid(dataType) == typeid(typename InferenceEngine::PrecisionTrait::value_type)) { + rawBlobDataPtr[i] = ngraph::float16(value).to_bits(); + } else { + rawBlobDataPtr[i] = value; + } + } +} + template<> void inline fill_data_random(InferenceEngine::Blob::Ptr &blob, const uint32_t range, int32_t start_from, const int32_t k) { fill_data_random_float(blob, range, start_from, k); diff --git a/inference-engine/tests_deprecated/helpers/test_assertions.hpp b/inference-engine/tests/ie_test_utils/common_test_utils/test_assertions.hpp similarity index 68% rename from inference-engine/tests_deprecated/helpers/test_assertions.hpp rename to inference-engine/tests/ie_test_utils/common_test_utils/test_assertions.hpp index f984535b0c0..b74ac0aaef0 100644 --- a/inference-engine/tests_deprecated/helpers/test_assertions.hpp +++ b/inference-engine/tests/ie_test_utils/common_test_utils/test_assertions.hpp @@ -4,33 +4,59 @@ #include +#include + +#include #include +#include +#include +#include + +namespace { + +bool strContains(const std::string & str, const std::string & substr) { + return str.find(substr) != std::string::npos; +} + +bool strDoesnotContain(const std::string & str, const std::string & substr) { + (void)strDoesnotContain; // to overcome unused warning + return !strContains(str, substr); +} + +} // namespace + +#define ASSERT_STR_CONTAINS(str, substr) \ + ASSERT_PRED2(&strContains, str, substr) + +#define ASSERT_STR_DOES_NOT_CONTAIN(str, substr) \ + ASSERT_PRED2(&strDoesnotContain, str, substr) + +#define EXPECT_STR_CONTAINS(str, substr) \ + EXPECT_PRED2(&strContains, str, substr) #define ASSERT_BLOB_EQ(lhs, rhs) \ -compare_blob(lhs,rhs) + compare_blob(lhs, rhs) #define ASSERT_DIMS_EQ(lhs, rhs) \ -compare_dims(lhs,rhs) + compare_dims(lhs, rhs) #define ASSERT_DATA_EQ(lhs, rhs) \ -compare_data(lhs,rhs) + compare_data(lhs, rhs) #define ASSERT_PREPROCESS_CHANNEL_EQ(lhs, rhs) \ -compare_preprocess(lhs,rhs) + compare_preprocess(lhs, rhs) #define ASSERT_PREPROCESS_INFO_EQ(lhs, rhs) \ -compare_preprocess_info(lhs,rhs) + compare_preprocess_info(lhs, rhs) #define ASSERT_OUTPUTS_INFO_EQ(lhs, rhs) \ -compare_outputs_info(lhs,rhs) + compare_outputs_info(lhs, rhs) #define ASSERT_INPUTS_INFO_EQ(lhs, rhs) \ -compare_inputs_info(lhs,rhs) + compare_inputs_info(lhs, rhs) #define ASSERT_STRINGEQ(lhs, rhs) \ -compare_cpp_strings(lhs,rhs) - - + compare_cpp_strings(lhs, rhs) inline void compare_blob(InferenceEngine::Blob::Ptr lhs, InferenceEngine::Blob::Ptr rhs) { ASSERT_EQ(lhs.get(), rhs.get()); @@ -39,7 +65,7 @@ inline void compare_blob(InferenceEngine::Blob::Ptr lhs, InferenceEngine::Blob:: inline void compare_dims(const InferenceEngine::SizeVector & lhs, const InferenceEngine::SizeVector & rhs) { ASSERT_EQ(lhs.size(), rhs.size()); - for(int i=0;ifirst.c_str(), j->first.c_str()); ASSERT_DIMS_EQ(i->second->getTensorDesc().getDims(), j->second->getTensorDesc().getDims()); ASSERT_PREPROCESS_INFO_EQ(i->second->getPreProcess(), j->second->getPreProcess()); diff --git a/inference-engine/tests/ie_test_utils/functional_test_utils/blob_utils.hpp b/inference-engine/tests/ie_test_utils/functional_test_utils/blob_utils.hpp index 75b94501c34..76ffcd9ec5f 100644 --- a/inference-engine/tests/ie_test_utils/functional_test_utils/blob_utils.hpp +++ b/inference-engine/tests/ie_test_utils/functional_test_utils/blob_utils.hpp @@ -17,10 +17,32 @@ #include "common_test_utils/test_constants.hpp" namespace FuncTestUtils { -template -void inline compareRawBuffers(const dType *res, const dType *ref, - size_t resSize, size_t refSize, - float max_diff = 0.01, bool printData = false) { + +enum CompareType{ + ABS, + REL, + ABS_AND_REL // if absolute and relative differences are too high, an exception is thrown +}; +/** + * @brief Checks values of two blobs according to given algorithm and thresholds. + * In ABS and REL cases thr1 corresponds to the single threshold, + * In ABS_AND_REL case thr1 and thr2 mean absolute and relative threshold + * + * @tparam dType Type of blob data + * @param res Pointer to considered blob + * @param ref Pointer to reference blob + * @param resSize Size of considered blob + * @param refSize Size of reference blob + * @param compareType Defines an algorithm of comparision + * @param thr1 First threshold of difference + * @param thr2 Second threshold of difference + * @param printData A flag if data printing is demanded + */ + template +static void inline compareRawBuffers(const dType *res, const dType *ref, + size_t resSize, size_t refSize, + CompareType compareType, float thr1 = 0.01, float thr2 = 0.01, + bool printData = false) { if (printData) { std::cout << "Reference results: " << std::endl; for (size_t i = 0; i < refSize; i++) { @@ -34,43 +56,144 @@ void inline compareRawBuffers(const dType *res, const dType *ref, std::cout << std::endl; } - for (size_t i = 0; i < refSize; i++) { - float absDiff = std::abs(res[i] - ref[i]); - if (absDiff > max_diff) { - float relDiff = absDiff / std::max(res[i], ref[i]); - ASSERT_LT(relDiff, max_diff) << "Relative comparison of values ref: " << ref[i] << " and res: " - << res[i] << " , index in blobs: " << i << " failed!"; - } + switch (compareType) { + case CompareType::ABS: + for (size_t i = 0; i < refSize; i++) { + float absDiff = std::abs(res[i] - ref[i]); + ASSERT_LT(absDiff, thr1) << "Relative comparison of values ref: " << ref[i] << " and res: " + << res[i] << " , index in blobs: " << i << " failed!"; + } + break; + case CompareType::REL: + for (size_t i = 0; i < refSize; i++) { + float absDiff = std::abs(res[i] - ref[i]); + float relDiff = absDiff / std::max(res[i], ref[i]); + ASSERT_LT(relDiff, thr2) << "Relative comparison of values ref: " << ref[i] << " and res: " + << res[i] << " , index in blobs: " << i << " failed!"; + } + break; + case CompareType::ABS_AND_REL: + for (size_t i = 0; i < refSize; i++) { + float absDiff = std::abs(res[i] - ref[i]); + if (absDiff > thr1) { + float relDiff = absDiff / std::max(res[i], ref[i]); + ASSERT_LT(relDiff, thr2) << "Comparison of values ref: " << ref[i] << " and res: " + << res[i] << " , index in blobs: " << i << " failed!"; + } + } + break; } } - +/** + * @brief Checks absolute and relative difference of blob values according to given threshold. + * + * @tparam dType Type of blob data + * @param res Pointer to considered blob + * @param ref Pointer to reference blob + * @param resSize Size of considered blob + * @param refSize Size of reference blob + * @param thr Threshold of difference, absolute and relative simultaneously + * @param printData Flag if data printing is demanded + */ template -void inline compareRawBuffers(const std::vector res, const std::vector ref, +static void inline compareRawBuffers(const dType *res, const dType *ref, + size_t resSize, size_t refSize, + float thr = 0.01, + bool printData = false) { + compareRawBuffers(res, ref, resSize, refSize, CompareType::ABS_AND_REL, thr, thr, printData); +} +/** + * @brief Checks values of two blobs according to given algorithm and thresholds. + * In ABS and REL cases thr1 corresponds to the single threshold, + * In ABS_AND_REL case thr1 and thr2 mean absolute and relative threshold + * + * @tparam dType Type of blob data + * @param res Vector of considered blob values + * @param ref Vector of reference blob values + * @param resSize Size of considered blob + * @param refSize Size of reference blob + * @param compareType Defines an algorithm of comparision + * @param thr1 First threshold of difference + * @param thr2 Second threshold of difference + * @param printData A flag if data printing is demanded + */ +template +static void inline compareRawBuffers(const std::vector res, const std::vector ref, const std::vector &resSizes, const std::vector &refSizes, - float max_diff = 0.01, bool printData = false) { + CompareType compareType, + float thr1 = 0.01, float thr2 = 0.01, bool printData = false) { ASSERT_TRUE(res.size() == ref.size()) << "Reference and Results vector have to be same length"; ASSERT_TRUE(res.size() == resSizes.size()) << "Results vector and elements count vector have to be same length"; ASSERT_TRUE(ref.size() == refSizes.size()) << "Reference vector and elements count vector have to be same length"; for (size_t i = 0; i < res.size(); i++) { if (printData) std::cout << "BEGIN CHECK BUFFER [" << i << "]" << std::endl; - compareRawBuffers(res[i], ref[i], resSizes[i], refSizes[i], max_diff, printData); + compareRawBuffers(res[i], ref[i], resSizes[i], refSizes[i], compareType, thr1, thr2, printData); if (printData) std::cout << "END CHECK BUFFER [" << i << "]" << std::endl; } } - +/** + * @brief Checks absolute and relative difference of blob values according to given threshold. + * + * @tparam dType Type of blob data + * @param res Vector of considered blob values + * @param ref Vector of reference blob values + * @param resSize Size of considered blob + * @param refSize Size of reference blob + * @param thr Threshold of difference, absolute and relative simultaneously + * @param printData A flag if data printing is demanded + */ template -void inline compareRawBuffers(const std::vector res, const std::vector> ref, +static void inline compareRawBuffers(const std::vector res, const std::vector ref, + const std::vector &resSizes, const std::vector &refSizes, + float thr = 0.01, bool printData = false) { + compareRawBuffers(res, ref, resSizes, refSizes, CompareType::ABS_AND_REL, thr, thr, printData); +} +/** + * @brief Checks values of two blobs according to given algorithm and thresholds. + * In ABS and REL cases thr1 corresponds to the single threshold, + * In ABS_AND_REL case thr1 and thr2 mean absolute and relative threshold + * + * @tparam dType Type of blob data + * @param res Vector of considered blob values + * @param ref Vector of reference blob values + * @param resSize Size of considered blob + * @param refSize Size of reference blob + * @param compareType Defines an algorithm of comparision + * @param thr1 First threshold of difference + * @param thr2 Second threshold of difference + * @param printData A flag if data printing is demanded + */ +template +static void inline compareRawBuffers(const std::vector res, const std::vector> ref, const std::vector &resSizes, const std::vector &refSizes, - float max_diff = 0.01, bool printData = false) { + CompareType compareType, + float thr1 = 0.01, float thr2 = 0.01, bool printData = false) { ASSERT_TRUE(res.size() == ref.size()) << "Reference and Results vector have to be same length"; ASSERT_TRUE(res.size() == resSizes.size()) << "Results vector and elements count vector have to be same length"; ASSERT_TRUE(ref.size() == refSizes.size()) << "Reference vector and elements count vector have to be same length"; for (size_t i = 0; i < res.size(); i++) { if (printData) std::cout << "BEGIN CHECK BUFFER [" << i << "]" << std::endl; - compareRawBuffers(res[i], *ref[i], resSizes[i], refSizes[i], max_diff, printData); + compareRawBuffers(res[i], *ref[i], resSizes[i], refSizes[i], compareType, thr1, thr2, printData); if (printData) std::cout << "END CHECK BUFFER [" << i << "]" << std::endl; } } +/** + * @brief Checks absolute and relative difference of blob values according to given threshold. + * + * @tparam dType Type of blob data + * @param res Vector of considered blob values + * @param ref Vector of reference blob values + * @param resSize Size of considered blob + * @param refSize Size of reference blob + * @param thr Threshold of difference, absolute and relative simultaneously + * @param printData A flag if data printing is demanded + */ +template +static void inline compareRawBuffers(const std::vector res, const std::vector> ref, + const std::vector &resSizes, const std::vector &refSizes, + float thr = 0.01, bool printData = false) { + compareRawBuffers(res, ref, resSizes, refSizes, CompareType::ABS_AND_REL, thr, thr, printData); +} template void inline @@ -154,21 +277,30 @@ compareBlobs(const InferenceEngine::Blob::Ptr &res, const InferenceEngine::Blob: } } -float inline GetComparisonThreshold(InferenceEngine::Precision prc) { +void inline GetComparisonThreshold(InferenceEngine::Precision prc, float &absoluteThreshold, float &relativeThreshold) { switch (prc) { case InferenceEngine::Precision::FP32: - return 1e-4; + absoluteThreshold = relativeThreshold = 1e-4; + break; case InferenceEngine::Precision::FP16: - return 1e-2; + absoluteThreshold = relativeThreshold = 1e-2; + break; case InferenceEngine::Precision::I16: case InferenceEngine::Precision::I8: case InferenceEngine::Precision::U8: - return 1; + absoluteThreshold = relativeThreshold = 1; + break; default: THROW_IE_EXCEPTION << "Unhandled precision " << prc << " passed to the GetComparisonThreshold()"; } } +float inline GetComparisonThreshold(InferenceEngine::Precision prc) { + float res; + GetComparisonThreshold(prc, res, res); + return res; +} + // Copy from net_pass.h template void inline convertArrayPrecision(typename InferenceEngine::PrecisionTrait::value_type *dst, @@ -238,6 +370,82 @@ InferenceEngine::Blob::Ptr inline copyBlobWithCast(const InferenceEngine::Blob:: return newBlob; } +InferenceEngine::Blob::Ptr inline createAndFillBlobFloatNormalDistribution(const InferenceEngine::TensorDesc &td, + const float mean, + const float stddev, + const int32_t seed = 1) { + InferenceEngine::Blob::Ptr blob = make_blob_with_precision(td); + blob->allocate(); + switch (td.getPrecision()) { +#define CASE(X) case X: CommonTestUtils::fill_data_normal_random_float(blob, mean, stddev, seed); break; + CASE(InferenceEngine::Precision::FP32) + CASE(InferenceEngine::Precision::FP16) + CASE(InferenceEngine::Precision::U8) + CASE(InferenceEngine::Precision::U16) + CASE(InferenceEngine::Precision::I8) + CASE(InferenceEngine::Precision::I16) + CASE(InferenceEngine::Precision::I64) + CASE(InferenceEngine::Precision::BIN) + CASE(InferenceEngine::Precision::I32) + CASE(InferenceEngine::Precision::BOOL) +#undef CASE + default: + THROW_IE_EXCEPTION << "Wrong precision specified: " << td.getPrecision().name(); + } + return blob; +} + +InferenceEngine::Blob::Ptr inline createAndFillBlobFloat(const InferenceEngine::TensorDesc &td, + const uint32_t range = 10, + const int32_t start_from = 0, + const int32_t resolution = 1, + const int32_t seed = 1) { + InferenceEngine::Blob::Ptr blob = make_blob_with_precision(td); + + blob->allocate(); + switch (td.getPrecision()) { +#define CASE(X) case X: CommonTestUtils::fill_data_random_float(blob, range, start_from, resolution, seed); break; + CASE(InferenceEngine::Precision::FP32) + CASE(InferenceEngine::Precision::FP16) + CASE(InferenceEngine::Precision::U8) + CASE(InferenceEngine::Precision::U16) + CASE(InferenceEngine::Precision::I8) + CASE(InferenceEngine::Precision::I16) + CASE(InferenceEngine::Precision::I64) + CASE(InferenceEngine::Precision::BIN) + CASE(InferenceEngine::Precision::I32) + CASE(InferenceEngine::Precision::BOOL) +#undef CASE + default: + THROW_IE_EXCEPTION << "Wrong precision specified: " << td.getPrecision().name(); + } + return blob; +} + +InferenceEngine::Blob::Ptr inline createAndFillBlobWithFloatArray(const InferenceEngine::TensorDesc &td, + const float values[], + const int size) { + InferenceEngine::Blob::Ptr blob = make_blob_with_precision(td); + blob->allocate(); + switch (td.getPrecision()) { +#define CASE(X) case X: CommonTestUtils::fill_data_float_array(blob, values, size); break; + CASE(InferenceEngine::Precision::FP32) + CASE(InferenceEngine::Precision::FP16) + CASE(InferenceEngine::Precision::U8) + CASE(InferenceEngine::Precision::U16) + CASE(InferenceEngine::Precision::I8) + CASE(InferenceEngine::Precision::I16) + CASE(InferenceEngine::Precision::I64) + CASE(InferenceEngine::Precision::BIN) + CASE(InferenceEngine::Precision::I32) + CASE(InferenceEngine::Precision::BOOL) +#undef CASE + default: + THROW_IE_EXCEPTION << "Wrong precision specified: " << td.getPrecision().name(); + } + return blob; +} + InferenceEngine::Blob::Ptr inline createAndFillBlob(const InferenceEngine::TensorDesc &td, const uint32_t range = 10, const int32_t start_from = 0, diff --git a/inference-engine/tests/ie_test_utils/functional_test_utils/layer_test_utils.cpp b/inference-engine/tests/ie_test_utils/functional_test_utils/layer_test_utils.cpp index e0a68732ad9..27f8a9abee2 100644 --- a/inference-engine/tests/ie_test_utils/functional_test_utils/layer_test_utils.cpp +++ b/inference-engine/tests/ie_test_utils/functional_test_utils/layer_test_utils.cpp @@ -84,6 +84,9 @@ void LayerTestsCommon::LoadNetwork() { cnnNetwork = InferenceEngine::CNNNetwork{function}; ConfigureNetwork(); executableNetwork = core->LoadNetwork(cnnNetwork, targetDevice); +} + +void LayerTestsCommon::Infer() { inferRequest = executableNetwork.CreateInferRequest(); for (const auto &input : cnnNetwork.getInputsInfo()) { @@ -93,9 +96,6 @@ void LayerTestsCommon::LoadNetwork() { inferRequest.SetBlob(info->name(), blob); inputs.push_back(blob); } -} - -void LayerTestsCommon::Infer() { inferRequest.Infer(); } @@ -108,6 +108,14 @@ std::vector LayerTestsCommon::GetOutputs() { return outputs; } +void LayerTestsCommon::Compare(const std::vector>& expectedOutputs, const std::vector& actualOutputs) { + for (std::size_t outputIndex = 0; outputIndex < expectedOutputs.size(); ++outputIndex) { + const auto &expected = expectedOutputs[outputIndex]; + const auto &actual = actualOutputs[outputIndex]; + Compare(expected, actual); + } +} + void LayerTestsCommon::Validate() { // nGraph interpreter does not support f16 // IE converts f16 to f32 @@ -142,11 +150,7 @@ void LayerTestsCommon::Validate() { IE_ASSERT(actualOutputs.size() == expectedOutputs.size()) << "nGraph interpreter has " << expectedOutputs.size() << " outputs, while IE " << actualOutputs.size(); - for (std::size_t outputIndex = 0; outputIndex < expectedOutputs.size(); ++outputIndex) { - const auto &expected = expectedOutputs[outputIndex]; - const auto &actual = actualOutputs[outputIndex]; - Compare(expected, actual); - } + Compare(expectedOutputs, actualOutputs); } void LayerTestsCommon::SetRefMode(RefMode mode) { diff --git a/inference-engine/tests/ie_test_utils/functional_test_utils/layer_test_utils.hpp b/inference-engine/tests/ie_test_utils/functional_test_utils/layer_test_utils.hpp index 60cacea25a0..6e317b760ad 100644 --- a/inference-engine/tests/ie_test_utils/functional_test_utils/layer_test_utils.hpp +++ b/inference-engine/tests/ie_test_utils/functional_test_utils/layer_test_utils.hpp @@ -137,9 +137,11 @@ public: // Run ngraph Interpreter backend to calculate references auto refOutData = ngraph::helpers::inferFnWithInterp(fnPtr, inRawData); // Compare IE infer results vs ngraph Interpreter reference results - auto thr = FuncTestUtils::GetComparisonThreshold(netPrecision); - FuncTestUtils::compareRawBuffers(outBlobsRawData, refOutData, outElementsCount, outElementsCount, thr); - + float thr1, thr2; + FuncTestUtils::GetComparisonThreshold(netPrecision, thr1, thr2); + FuncTestUtils::compareRawBuffers(outBlobsRawData, refOutData, outElementsCount, outElementsCount, + FuncTestUtils::CompareType::ABS_AND_REL, + thr1, thr2); // Deallocate ngraph::Function pointer fnPtr.reset(); if (targetDevice.find(CommonTestUtils::DEVICE_GPU) != std::string::npos) { @@ -229,6 +231,8 @@ public: virtual void Run(); + virtual void Compare(const std::vector>& expectedOutputs, const std::vector& actualOutputs); + virtual void Compare(const std::vector &expected, const InferenceEngine::Blob::Ptr &actual); virtual void SetRefMode(RefMode mode); @@ -262,6 +266,10 @@ protected: return refMode; } + void ConfigurePlugin() const; + + void LoadNetwork(); + TargetDevice targetDevice; std::shared_ptr function; std::map configuration; @@ -272,19 +280,15 @@ protected: InferenceEngine::Precision outPrc = InferenceEngine::Precision::UNSPECIFIED; InferenceEngine::ExecutableNetwork executableNetwork; + virtual void Validate(); + private: - void ConfigurePlugin() const; - void ConfigureNetwork() const; - void LoadNetwork(); - void Infer(); std::vector GetOutputs(); - void Validate(); - InferenceEngine::Core *core = nullptr; InferenceEngine::CNNNetwork cnnNetwork; InferenceEngine::InferRequest inferRequest; diff --git a/inference-engine/tests/ie_test_utils/unit_test_utils/mocks/cpp_interfaces/impl/mock_inference_plugin_internal.hpp b/inference-engine/tests/ie_test_utils/unit_test_utils/mocks/cpp_interfaces/impl/mock_inference_plugin_internal.hpp index fc8605aae4e..c68604a3781 100644 --- a/inference-engine/tests/ie_test_utils/unit_test_utils/mocks/cpp_interfaces/impl/mock_inference_plugin_internal.hpp +++ b/inference-engine/tests/ie_test_utils/unit_test_utils/mocks/cpp_interfaces/impl/mock_inference_plugin_internal.hpp @@ -18,8 +18,8 @@ class MockInferencePluginInternal2 : public InferenceEngine::InferencePluginInternal { public: - MOCK_METHOD3(LoadExeNetworkImpl, std::shared_ptr( - const InferenceEngine::ICore *, const InferenceEngine::ICNNNetwork &, const std::map &)); + MOCK_METHOD2(LoadExeNetworkImpl, std::shared_ptr( + const InferenceEngine::ICNNNetwork &, const std::map &)); MOCK_METHOD3(LoadNetwork, void( InferenceEngine::IExecutableNetwork::Ptr &, const InferenceEngine::ICNNNetwork &, @@ -30,8 +30,8 @@ public: class MockInferencePluginInternal : public InferenceEngine::InferencePluginInternal { public: - MOCK_METHOD3(LoadExeNetworkImpl, std::shared_ptr( - const InferenceEngine::ICore *, const InferenceEngine::ICNNNetwork &, const std::map &)); + MOCK_METHOD2(LoadExeNetworkImpl, std::shared_ptr( + const InferenceEngine::ICNNNetwork &, const std::map &)); MOCK_METHOD1(AddExtension, void(InferenceEngine::IExtensionPtr ext_ptr)); MOCK_METHOD1(SetConfig, void(const std::map &)); @@ -47,8 +47,8 @@ public: class MockInferencePluginInternal3 : public InferenceEngine::InferencePluginInternal { public: - MOCK_METHOD3(LoadExeNetworkImpl, std::shared_ptr( - const InferenceEngine::ICore *, const InferenceEngine::ICNNNetwork &, const std::map &)); + MOCK_METHOD2(LoadExeNetworkImpl, std::shared_ptr( + const InferenceEngine::ICNNNetwork &, const std::map &)); MOCK_METHOD1(AddExtension, void(InferenceEngine::IExtensionPtr ext_ptr)); MOCK_METHOD1(SetConfig, void(const std::map &)); }; diff --git a/inference-engine/tests/ie_test_utils/unit_test_utils/mocks/cpp_interfaces/mock_plugin_impl.hpp b/inference-engine/tests/ie_test_utils/unit_test_utils/mocks/cpp_interfaces/mock_plugin_impl.hpp index 5fac6e97f9f..996dc641a21 100644 --- a/inference-engine/tests/ie_test_utils/unit_test_utils/mocks/cpp_interfaces/mock_plugin_impl.hpp +++ b/inference-engine/tests/ie_test_utils/unit_test_utils/mocks/cpp_interfaces/mock_plugin_impl.hpp @@ -36,7 +36,7 @@ class MockPluginImpl { InferenceEngine::ExecutableNetwork ImportNetwork(const std::istream&, const std::map &) {return {};} MOCK_QUALIFIED_METHOD0(GetName, const noexcept, std::string(void)); MOCK_QUALIFIED_METHOD1(SetName, noexcept, void(const std::string &)); - MOCK_QUALIFIED_METHOD0(GetCore, const noexcept, const InferenceEngine::ICore*(void)); + MOCK_QUALIFIED_METHOD0(GetCore, const noexcept, InferenceEngine::ICore*(void)); MOCK_QUALIFIED_METHOD1(SetCore, noexcept, void(InferenceEngine::ICore*)); MOCK_CONST_METHOD2(GetConfig, InferenceEngine::Parameter(const std::string& name, diff --git a/inference-engine/tests/ngraph_functions/include/ngraph_functions/builders.hpp b/inference-engine/tests/ngraph_functions/include/ngraph_functions/builders.hpp index c4a92d62dcc..a7e246210c8 100644 --- a/inference-engine/tests/ngraph_functions/include/ngraph_functions/builders.hpp +++ b/inference-engine/tests/ngraph_functions/include/ngraph_functions/builders.hpp @@ -17,6 +17,7 @@ namespace ngraph { namespace builder { ngraph::ParameterVector makeParams(const element::Type &type, const std::vector> &shapes); +ngraph::ParameterVector makeParams(const element::Type &type, const std::vector>> &inputs); std::shared_ptr makeConstant(const element::Type &type, const std::vector &shape, const std::vector &data, bool random = false); @@ -92,5 +93,24 @@ std::shared_ptr makeSqueeze(const ngraph::Output &in, std::shared_ptr makeUnsqueeze(const ngraph::Output &in, const element::Type &type, const std::vector &squeeze_indices); + +std::shared_ptr makeProposal(const ngraph::Output &class_probs, + const ngraph::Output &class_logits, + const ngraph::Output &image_shape, + const element::Type &type, + size_t base_size, + size_t pre_nms_topn, + size_t post_nms_topn, + float nms_thresh, + size_t feat_stride, + size_t min_size, + const std::vector &ratio, + const std::vector &scale, + bool clip_before_nms, + bool clip_after_nms, + bool normalize, + float box_size_scale, + float box_coordinate_scale, + std::string framework); } // namespace builder } // namespace ngraph diff --git a/inference-engine/tests/ngraph_functions/src/params_vector.cpp b/inference-engine/tests/ngraph_functions/src/params_vector.cpp index 0ed3a35aaae..ba7ef1e75b8 100644 --- a/inference-engine/tests/ngraph_functions/src/params_vector.cpp +++ b/inference-engine/tests/ngraph_functions/src/params_vector.cpp @@ -15,7 +15,22 @@ ngraph::ParameterVector makeParams(const element::Type &type, const std::vector< auto paramNode = std::make_shared(type, ngraph::Shape(shape)); outs.push_back(paramNode); } + return outs; } + +ngraph::ParameterVector makeParams(const element::Type &type, const std::vector>> &inputs) { + ngraph::ParameterVector outs; + for (const auto &input : inputs) { + const auto &name = input.first; + const auto &shape = input.second; + auto paramNode = std::make_shared(type, ngraph::Shape(shape)); + paramNode->set_friendly_name(name); + outs.push_back(paramNode); + } + + return outs; +} + } // namespace builder } // namespace ngraph \ No newline at end of file diff --git a/inference-engine/tests/ngraph_functions/src/proposal.cpp b/inference-engine/tests/ngraph_functions/src/proposal.cpp new file mode 100644 index 00000000000..cbcbfdaeee2 --- /dev/null +++ b/inference-engine/tests/ngraph_functions/src/proposal.cpp @@ -0,0 +1,52 @@ +// Copyright (C) 2020 Intel Corporation +// SPDX-License-Identifier: Apache-2.0 +// +// + +#include +#include + +#include "ngraph_functions/builders.hpp" + +namespace ngraph { +namespace builder { + +std::shared_ptr makeProposal(const ngraph::Output &class_probs, + const ngraph::Output &class_logits, + const ngraph::Output &image_shape, + const element::Type &type, + size_t base_size, + size_t pre_nms_topn, + size_t post_nms_topn, + float nms_thresh, + size_t feat_stride, + size_t min_size, + const std::vector &ratio, + const std::vector &scale, + bool clip_before_nms, + bool clip_after_nms, + bool normalize, + float box_size_scale, + float box_coordinate_scale, + std::string framework) { + ngraph::op::ProposalAttrs attrs; + attrs.base_size = base_size; + attrs.pre_nms_topn = pre_nms_topn; + attrs.post_nms_topn = post_nms_topn; + attrs.nms_thresh = nms_thresh; + attrs.feat_stride = feat_stride; + attrs.min_size = min_size; + attrs.ratio = ratio; + attrs.scale = scale; + attrs.clip_before_nms = clip_before_nms; + attrs.clip_after_nms = clip_after_nms; + attrs.normalize = normalize; + attrs.box_size_scale = box_size_scale; + attrs.box_coordinate_scale = box_coordinate_scale; + attrs.framework = framework; + + return std::make_shared(class_probs, class_logits, image_shape, attrs); +} + +} // namespace builder +} // namespace ngraph diff --git a/inference-engine/tests/ngraph_functions/src/utils/ngraph_helpers.cpp b/inference-engine/tests/ngraph_functions/src/utils/ngraph_helpers.cpp index be02b12e6e7..673075821fc 100644 --- a/inference-engine/tests/ngraph_functions/src/utils/ngraph_helpers.cpp +++ b/inference-engine/tests/ngraph_functions/src/utils/ngraph_helpers.cpp @@ -60,10 +60,9 @@ std::vector> interpreterFunction(const std::shared_ptr auto outputTensors = std::vector>{}; const auto &results = function->get_results(); - std::transform(results.cbegin(), results.cend(), std::back_inserter(outputTensors), - [&backend](const std::shared_ptr &result) { - return backend->create_tensor(result->get_element_type(), result->get_shape()); - }); + for (size_t i = 0; i ()); + } auto handle = backend->compile(function); handle->call_with_validate(outputTensors, inputTensors); diff --git a/inference-engine/tests/unit/engines/vpu/split_large_kernel_conv_tests.cpp b/inference-engine/tests/unit/engines/vpu/split_large_kernel_conv_tests.cpp new file mode 100644 index 00000000000..99ffa78714e --- /dev/null +++ b/inference-engine/tests/unit/engines/vpu/split_large_kernel_conv_tests.cpp @@ -0,0 +1,105 @@ +// Copyright (C) 2020 Intel Corporation +// SPDX-License-Identifier: Apache-2.0 +// + +#include "graph_transformer_tests.hpp" +#include +#include + +using namespace vpu; + +class VPU_SplitLargeKernelConvTest : public GraphTransformerTest { + protected: + PassSet pipeline; + Model model; + + public: + void InitConvStage( + int inputX = 8960, + int inputY = 1, + bool isOutput4D = true) { + + int kernelx = 16; + int kernely = 1; + int kernelStrideX = 1; + int kernelStrideY = 1; + int dilationX = 1; + int dilationY = 1; + int padx_begin = 7; + int pady_begin = 0; + int padx_end = 8; + int pady_end = 0; + model = CreateModel(); + + auto input = model->addInputData( + "Input", + DataDesc(DataType::FP16, DimsOrder::NCHW, {inputX, inputY, 8, 1})); + model->attrs().set("numInputs", 1); + + Data output; + if (isOutput4D) { + output = model->addOutputData( + "Output", + DataDesc(DataType::FP16, + DimsOrder::NCHW, + {(inputX + padx_begin + padx_end - kernelx) / kernelStrideX + 1, + (inputY + pady_begin + pady_end - kernely) / kernelStrideY + 1, 8, 1})); + } else { + output = model->addOutputData( + "Output", + DataDesc(DataType::FP16, + DimsOrder::CHW, + {(inputX + padx_begin + padx_end - kernelx) / kernelStrideX + 1, + (inputY + pady_begin + pady_end - kernely) / kernelStrideY + 1, 8})); + } + + auto conv = std::make_shared(ie::LayerParams{"conv", "Convolution", ie::Precision::FP16}); + conv->_kernel_x = kernelx; + conv->_kernel_y = kernely; + conv->_stride_x = kernelStrideX; + conv->_stride_y = kernelStrideY; + conv->_dilation_x = dilationX; + conv->_dilation_x = dilationY; + + conv->_padding.insert(0, padx_begin); + conv->_padding.insert(1, pady_begin); + conv->_pads_end.insert(0, padx_end); + conv->_pads_end.insert(1, pady_end); + conv->_auto_pad = "same_upper"; + + conv->_weights = ie::make_shared_blob({ ie::Precision::FP16, {static_cast(kernelx * kernely * 8 * 8)}, ie::Layout::C }); + conv->_weights->allocate(); + + frontEnd->parseConvolution(model, conv, {input}, {output}); + + pipeline.addPass(passManager->dumpModel("initial")); + + pipeline.addPass(passManager->hwPadding()); + pipeline.addPass(passManager->dumpModel("hwPadding")); + + // if large kernel conv converted to conv that can be ran on HW, then hwConvTiling will work - if not will got an exception + pipeline.addPass(passManager->splitLargeKernelConv()); + pipeline.addPass(passManager->dumpModel("splitLargeKernelConv")); + + pipeline.addPass(passManager->hwConvTiling()); + pipeline.addPass(passManager->dumpModel("hwConvTiling")); + + pipeline.addPass(passManager->adjustDataLayout()); + pipeline.addPass(passManager->dumpModel("adjustDataLayout")); + + pipeline.addPass(passManager->processSpecialStages()); + pipeline.addPass(passManager->dumpModel("processSpecialStages")); + + pipeline.addPass(passManager->adjustDataLocation()); + pipeline.addPass(passManager->dumpModel("adjustDataLocation")); + + pipeline.addPass(passManager->finalCheck()); + } +}; + +TEST_F(VPU_SplitLargeKernelConvTest, splitLargeKernelConvIfKernelSizeIs1x16) { + InitCompileEnv(); + InitConvStage(); + + ASSERT_NO_THROW(pipeline.run(model)); +} \ No newline at end of file diff --git a/inference-engine/tests/unit/inference_engine/CMakeLists.txt b/inference-engine/tests/unit/inference_engine/CMakeLists.txt index 55e52b59262..629a2cecfbb 100644 --- a/inference-engine/tests/unit/inference_engine/CMakeLists.txt +++ b/inference-engine/tests/unit/inference_engine/CMakeLists.txt @@ -11,5 +11,5 @@ addIeTargetTest( unitTestUtils ADD_CPPLINT LABELS - INFERENCE_ENGINE + IE ) \ No newline at end of file diff --git a/inference-engine/tests/unit/vpu/frontend_tests/dsr_parsing_tests.cpp b/inference-engine/tests/unit/vpu/frontend_tests/dsr_parsing_tests.cpp index 8c9de8b0552..b4fbbb55b30 100644 --- a/inference-engine/tests/unit/vpu/frontend_tests/dsr_parsing_tests.cpp +++ b/inference-engine/tests/unit/vpu/frontend_tests/dsr_parsing_tests.cpp @@ -24,6 +24,21 @@ protected: _testModel = CreateTestModel(); } + void checkShapeConnection(const Data& parent, const Data& child) { + ASSERT_NE(child->parentDataToShapeEdge(), nullptr); + ASSERT_EQ(child->childDataToShapeEdges().size(), 0); + const auto& parentDataToShapeEdge = child->parentDataToShapeEdge(); + ASSERT_EQ(parentDataToShapeEdge->parent(), parent); + ASSERT_EQ(parentDataToShapeEdge->child(), child); + + ASSERT_EQ(parent->parentDataToShapeEdge(), nullptr); + + const auto& childDataToShapeEdges = parent->childDataToShapeEdges(); + + const auto& it = std::find(childDataToShapeEdges.begin(), childDataToShapeEdges.end(), parentDataToShapeEdge); + ASSERT_NE(it, childDataToShapeEdges.end()); + } + ie::CNNLayerPtr createDSRLayer() { return std::make_shared(ie::LayerParams{"DSR", "DynamicShapeResolver", ie::Precision::I32}); } @@ -97,25 +112,34 @@ TEST_F(DSRParsingTests, DSRParserDoesntAssertOnCorrectIO) { {inputStage->output(0), inputStage->output(1)}, _testModel.getOutputs())); } -class DSRParsingFromNgraphTests : public DSRParsingTests { -protected: - void checkShapeConnection(const Data& parent, const Data& child) { - ASSERT_NE(child->parentDataToShapeEdge(), nullptr); - ASSERT_EQ(child->childDataToShapeEdges().size(), 0); - const auto& parentDataToShapeEdge = child->parentDataToShapeEdge(); - ASSERT_EQ(parentDataToShapeEdge->parent(), parent); - ASSERT_EQ(parentDataToShapeEdge->child(), child); +TEST_F(DSRParsingTests, DSRParserPreservesConnectionsOnOutputDSR) { + _testModel.createInputs({_dataDesc}); + _testModel.createOutputs({_dataDesc}); - ASSERT_EQ(parent->parentDataToShapeEdge(), nullptr); + const auto& model = _testModel.getBaseModel(); - const auto& childDataToShapeEdges = parent->childDataToShapeEdges(); - ASSERT_EQ(childDataToShapeEdges.size(), 1); + const auto& inputStage = _testModel.addStage({InputInfo::fromNetwork(0)}, + {OutputInfo::intermediate(_dataDesc), OutputInfo::intermediate(_correstShapeDesc)}); - ASSERT_EQ(childDataToShapeEdges.front(), parentDataToShapeEdge); - } -}; + model->connectDataWithShape(inputStage->output(1), inputStage->output(0)); -TEST_F(DSRParsingFromNgraphTests, DSRParserCreatesTwoOutputsOnOutputDSR) { + checkShapeConnection(inputStage->output(1), inputStage->output(0)); + + const auto& outputStage = _testModel.addStage({InputInfo::fromPrevStage(0)}, + {OutputInfo::intermediate(_dataDesc)}); + + const auto& dsrLayer = createDSRLayer(); + + ASSERT_NO_THROW(frontEnd->parseDSR(_testModel.getBaseModel(), dsrLayer, + {outputStage->output(0), inputStage->output(1)}, _testModel.getOutputs())); + + checkShapeConnection(inputStage->output(1), inputStage->output(0)); + checkShapeConnection(inputStage->output(1), outputStage->output(0)); +} + +typedef DSRParsingTests DSRParsingFromNgraphTests; + +TEST_F(DSRParsingFromNgraphTests, DSRParserCreatesAndConnectsTwoOutputsOnOutputDSR) { const auto& inPrecision = ::ngraph::element::Type(::ngraph::element::Type_t::i32); const auto& tensor = std::make_shared(inPrecision, ngraph::Shape{1, 800}); @@ -139,6 +163,15 @@ TEST_F(DSRParsingFromNgraphTests, DSRParserCreatesTwoOutputsOnOutputDSR) { } } ASSERT_EQ(numOutputs, 2); + + const auto& it = std::find_if(model->getStages().begin(), model->getStages().end(), [](const Stage& stage) { + return stage->type() == StageType::NonZero; + }); + + ASSERT_NE(it, model->getStages().end()); + const auto& nonZeroStage = *it; + + checkShapeConnection(nonZeroStage->output(1), nonZeroStage->output(0)); } TEST_F(DSRParsingFromNgraphTests, DSRWithSingleProducerCreatesConnectionBetweenDataAndShape) { @@ -159,16 +192,12 @@ TEST_F(DSRParsingFromNgraphTests, DSRWithSingleProducerCreatesConnectionBetweenD ModelPtr model; ASSERT_NO_THROW(model = frontEnd->buildInitialModel(cnnNet)); - Stage nonZeroStage = nullptr; + const auto& it = std::find_if(model->getStages().begin(), model->getStages().end(), [](const Stage& stage) { + return stage->type() == StageType::NonZero; + }); - for (const auto& stage : model->getStages()) { - if (stage->type() != StageType::NonZero) { - continue; - } - nonZeroStage = stage; - } - - ASSERT_NE(nonZeroStage, nullptr); + ASSERT_NE(it, model->getStages().end()); + const auto& nonZeroStage = *it; checkShapeConnection(nonZeroStage->output(1), nonZeroStage->output(0)); } @@ -193,16 +222,12 @@ TEST_F(DSRParsingFromNgraphTests, DSRWithTwoProducersCreatesConnectionBetweenDat ModelPtr model; ASSERT_NO_THROW(model = frontEnd->buildInitialModel(cnnNet)); - Stage nonZeroStage = nullptr; + const auto& it = std::find_if(model->getStages().begin(), model->getStages().end(), [](const Stage& stage) { + return stage->type() == StageType::NonZero; + }); - for (const auto& stage : model->getStages()) { - if (stage->type() != StageType::NonZero) { - continue; - } - nonZeroStage = stage; - } - - ASSERT_NE(nonZeroStage, nullptr); + ASSERT_NE(it, model->getStages().end()); + const auto& nonZeroStage = *it; const auto& stageReluData = nonZeroStage->output(0)->singleConsumer(); const auto& stageReluShape = nonZeroStage->output(1)->singleConsumer(); diff --git a/inference-engine/tests/unit/vpu/middleend_tests/edges_tests/stage_dependency_edge.cpp b/inference-engine/tests/unit/vpu/middleend_tests/edges_tests/stage_dependency_edge.cpp index e41b52f9226..80b6bd17179 100644 --- a/inference-engine/tests/unit/vpu/middleend_tests/edges_tests/stage_dependency_edge.cpp +++ b/inference-engine/tests/unit/vpu/middleend_tests/edges_tests/stage_dependency_edge.cpp @@ -24,7 +24,7 @@ protected: PassSet::Ptr _middleEnd = nullptr; }; -TEST_F(StageDependencyEdgeProcessingTests, AddStageDependencyAssertsOnOutputData) { +TEST_F(StageDependencyEdgeProcessingTests, AddStageDependencyDoesNotAssertOnOutputData) { // // -> [Data] -> (Stage) -> [Output] // [Input] -> (Stage) | @@ -43,7 +43,7 @@ TEST_F(StageDependencyEdgeProcessingTests, AddStageDependencyAssertsOnOutputData auto model = _testModel.getBaseModel(); - ASSERT_ANY_THROW(model->addStageDependency(dependentStage, dependencyProducer->output(0))); + ASSERT_NO_THROW(model->addStageDependency(dependentStage, dependencyProducer->output(0))); } TEST_F(StageDependencyEdgeProcessingTests, NetWithTwoStagesHasCorrectExecOrder) { diff --git a/inference-engine/tests_deprecated/behavior/cldnn/shared_tests_instances/cpp_wrappers/holders_tests.cpp b/inference-engine/tests_deprecated/behavior/cldnn/shared_tests_instances/cpp_wrappers/holders_tests.cpp index 8a8876d0ec6..4c8ff9a2f59 100644 --- a/inference-engine/tests_deprecated/behavior/cldnn/shared_tests_instances/cpp_wrappers/holders_tests.cpp +++ b/inference-engine/tests_deprecated/behavior/cldnn/shared_tests_instances/cpp_wrappers/holders_tests.cpp @@ -4,7 +4,7 @@ #include "holders_tests.hpp" -INSTANTIATE_TEST_CASE_P(ReleaseOrderTests, CPP_HoldersTests, testing::Combine(testing::ValuesIn(std::vector> { +INSTANTIATE_TEST_CASE_P(smoke_ReleaseOrderTests, CPP_HoldersTests, testing::Combine(testing::ValuesIn(std::vector> { // 0 - plugin // 1 - executable_network // 2 - infer_request diff --git a/inference-engine/tests_deprecated/behavior/cldnn/shared_tests_instances/plugin_tests/behavior_test_plugin.cpp b/inference-engine/tests_deprecated/behavior/cldnn/shared_tests_instances/plugin_tests/behavior_test_plugin.cpp index d72defce5bc..3cf345d3755 100644 --- a/inference-engine/tests_deprecated/behavior/cldnn/shared_tests_instances/plugin_tests/behavior_test_plugin.cpp +++ b/inference-engine/tests_deprecated/behavior/cldnn/shared_tests_instances/plugin_tests/behavior_test_plugin.cpp @@ -6,9 +6,9 @@ #include "behavior_test_plugins.hpp" #include "cldnn_test_data.hpp" -INSTANTIATE_TEST_CASE_P(BehaviorTest, BehaviorPluginTest, ValuesIn(supportedValues), +INSTANTIATE_TEST_CASE_P(smoke_BehaviorTest, BehaviorPluginTest, ValuesIn(supportedValues), getTestCaseName); -INSTANTIATE_TEST_CASE_P(BehaviorTest, BehaviorPluginTestInput, ValuesIn(allInputSupportedValues), +INSTANTIATE_TEST_CASE_P(smoke_BehaviorTest, BehaviorPluginTestInput, ValuesIn(allInputSupportedValues), getTestCaseName); -INSTANTIATE_TEST_CASE_P(BehaviorTest, BehaviorPluginTestOutput, ValuesIn(allOutputSupportedValues), +INSTANTIATE_TEST_CASE_P(smoke_BehaviorTest, BehaviorPluginTestOutput, ValuesIn(allOutputSupportedValues), getOutputTestCaseName); diff --git a/inference-engine/tests_deprecated/behavior/cldnn/shared_tests_instances/plugin_tests/behavior_test_plugin_config.cpp b/inference-engine/tests_deprecated/behavior/cldnn/shared_tests_instances/plugin_tests/behavior_test_plugin_config.cpp index 01cde8fc897..718d09932dd 100644 --- a/inference-engine/tests_deprecated/behavior/cldnn/shared_tests_instances/plugin_tests/behavior_test_plugin_config.cpp +++ b/inference-engine/tests_deprecated/behavior/cldnn/shared_tests_instances/plugin_tests/behavior_test_plugin_config.cpp @@ -6,13 +6,13 @@ #include "cldnn_test_data.hpp" -INSTANTIATE_TEST_CASE_P(BehaviorTest, BehaviorPluginIncorrectConfigTest, ValuesIn(withIncorrectConfValues), +INSTANTIATE_TEST_CASE_P(smoke_BehaviorTest, BehaviorPluginIncorrectConfigTest, ValuesIn(withIncorrectConfValues), getTestCaseName); -INSTANTIATE_TEST_CASE_P(BehaviorTest, BehaviorPluginIncorrectConfigTestInferRequestAPI, +INSTANTIATE_TEST_CASE_P(smoke_BehaviorTest, BehaviorPluginIncorrectConfigTestInferRequestAPI, ValuesIn(supportedValues), getTestCaseName); -INSTANTIATE_TEST_CASE_P(BehaviorTest, BehaviorPluginCorrectConfigTestInferRequestAPI, +INSTANTIATE_TEST_CASE_P(smoke_BehaviorTest, BehaviorPluginCorrectConfigTestInferRequestAPI, ValuesIn(supportedValues), getTestCaseName); diff --git a/inference-engine/tests_deprecated/behavior/cldnn/shared_tests_instances/plugin_tests/behavior_test_plugin_exec_graph_info.cpp b/inference-engine/tests_deprecated/behavior/cldnn/shared_tests_instances/plugin_tests/behavior_test_plugin_exec_graph_info.cpp index f41607dc29e..9979c087f36 100644 --- a/inference-engine/tests_deprecated/behavior/cldnn/shared_tests_instances/plugin_tests/behavior_test_plugin_exec_graph_info.cpp +++ b/inference-engine/tests_deprecated/behavior/cldnn/shared_tests_instances/plugin_tests/behavior_test_plugin_exec_graph_info.cpp @@ -7,7 +7,7 @@ // Disabled due to a bug on CentOS that leads to segmentation fault of application on exit // when perf counters are enabled -//INSTANTIATE_TEST_CASE_P( +//INSTANTIATE_TEST_CASE_P(smoke_ // BehaviorTest, // BehaviorPluginTestExecGraphInfo, // ValuesIn(supportedValues), diff --git a/inference-engine/tests_deprecated/behavior/cldnn/shared_tests_instances/plugin_tests/behavior_test_plugin_infer_request.cpp b/inference-engine/tests_deprecated/behavior/cldnn/shared_tests_instances/plugin_tests/behavior_test_plugin_infer_request.cpp index 220d66d636b..d6312a9cb89 100644 --- a/inference-engine/tests_deprecated/behavior/cldnn/shared_tests_instances/plugin_tests/behavior_test_plugin_infer_request.cpp +++ b/inference-engine/tests_deprecated/behavior/cldnn/shared_tests_instances/plugin_tests/behavior_test_plugin_infer_request.cpp @@ -5,4 +5,4 @@ #include "behavior_test_plugin_infer_request.hpp" #include "cldnn_test_data.hpp" -INSTANTIATE_TEST_CASE_P(BehaviorTest, BehaviorPluginTestInferRequest, ValuesIn(requestsSupportedValues), getTestCaseName); +INSTANTIATE_TEST_CASE_P(smoke_BehaviorTest, BehaviorPluginTestInferRequest, ValuesIn(requestsSupportedValues), getTestCaseName); diff --git a/inference-engine/tests_deprecated/behavior/cldnn/shared_tests_instances/plugin_tests/behavior_test_plugin_infer_request_callback.cpp b/inference-engine/tests_deprecated/behavior/cldnn/shared_tests_instances/plugin_tests/behavior_test_plugin_infer_request_callback.cpp index 919fccd2a3f..1f78f6d8bc3 100644 --- a/inference-engine/tests_deprecated/behavior/cldnn/shared_tests_instances/plugin_tests/behavior_test_plugin_infer_request_callback.cpp +++ b/inference-engine/tests_deprecated/behavior/cldnn/shared_tests_instances/plugin_tests/behavior_test_plugin_infer_request_callback.cpp @@ -5,5 +5,5 @@ #include "behavior_test_plugin_infer_request_callback.hpp" #include "cldnn_test_data.hpp" -INSTANTIATE_TEST_CASE_P(BehaviorTest, BehaviorPluginTestInferRequestCallback, ValuesIn(requestsSupportedValues), +INSTANTIATE_TEST_CASE_P(smoke_BehaviorTest, BehaviorPluginTestInferRequestCallback, ValuesIn(requestsSupportedValues), getTestCaseName); diff --git a/inference-engine/tests_deprecated/behavior/cldnn/shared_tests_instances/plugin_tests/behavior_test_plugin_infer_request_config.cpp b/inference-engine/tests_deprecated/behavior/cldnn/shared_tests_instances/plugin_tests/behavior_test_plugin_infer_request_config.cpp index 9e5800d7600..52338059f8d 100644 --- a/inference-engine/tests_deprecated/behavior/cldnn/shared_tests_instances/plugin_tests/behavior_test_plugin_infer_request_config.cpp +++ b/inference-engine/tests_deprecated/behavior/cldnn/shared_tests_instances/plugin_tests/behavior_test_plugin_infer_request_config.cpp @@ -5,5 +5,5 @@ #include "behavior_test_plugin_infer_request_config.hpp" #include "cldnn_test_data.hpp" -INSTANTIATE_TEST_CASE_P(BehaviorTest, BehaviorPluginTestInferRequestConfigExclusiveAsync, ValuesIn(supportedValues), +INSTANTIATE_TEST_CASE_P(smoke_BehaviorTest, BehaviorPluginTestInferRequestConfigExclusiveAsync, ValuesIn(supportedValues), getConfigTestCaseName); diff --git a/inference-engine/tests_deprecated/behavior/cldnn/shared_tests_instances/plugin_tests/behavior_test_plugin_infer_request_input.cpp b/inference-engine/tests_deprecated/behavior/cldnn/shared_tests_instances/plugin_tests/behavior_test_plugin_infer_request_input.cpp index 01971669903..d71e2d5d0d0 100644 --- a/inference-engine/tests_deprecated/behavior/cldnn/shared_tests_instances/plugin_tests/behavior_test_plugin_infer_request_input.cpp +++ b/inference-engine/tests_deprecated/behavior/cldnn/shared_tests_instances/plugin_tests/behavior_test_plugin_infer_request_input.cpp @@ -5,5 +5,5 @@ #include "behavior_test_plugin_infer_request_input.hpp" #include "cldnn_test_data.hpp" -INSTANTIATE_TEST_CASE_P(BehaviorTest, BehaviorPluginTestInferRequestInput, ValuesIn(allInputSupportedValues), +INSTANTIATE_TEST_CASE_P(smoke_BehaviorTest, BehaviorPluginTestInferRequestInput, ValuesIn(allInputSupportedValues), getTestCaseName); diff --git a/inference-engine/tests_deprecated/behavior/cldnn/shared_tests_instances/plugin_tests/behavior_test_plugin_infer_request_output.cpp b/inference-engine/tests_deprecated/behavior/cldnn/shared_tests_instances/plugin_tests/behavior_test_plugin_infer_request_output.cpp index 9719941190a..1ebe6221d8b 100644 --- a/inference-engine/tests_deprecated/behavior/cldnn/shared_tests_instances/plugin_tests/behavior_test_plugin_infer_request_output.cpp +++ b/inference-engine/tests_deprecated/behavior/cldnn/shared_tests_instances/plugin_tests/behavior_test_plugin_infer_request_output.cpp @@ -5,5 +5,5 @@ #include "behavior_test_plugin_infer_request_output.hpp" #include "cldnn_test_data.hpp" -INSTANTIATE_TEST_CASE_P(BehaviorTest, BehaviorPluginTestInferRequestOutput, ValuesIn(allOutputSupportedValues), +INSTANTIATE_TEST_CASE_P(smoke_BehaviorTest, BehaviorPluginTestInferRequestOutput, ValuesIn(allOutputSupportedValues), getOutputTestCaseName); diff --git a/inference-engine/tests_deprecated/behavior/cldnn/shared_tests_instances/plugin_tests/behavior_test_plugin_layers.cpp b/inference-engine/tests_deprecated/behavior/cldnn/shared_tests_instances/plugin_tests/behavior_test_plugin_layers.cpp index d35e5b83e60..ad2113ffe08 100644 --- a/inference-engine/tests_deprecated/behavior/cldnn/shared_tests_instances/plugin_tests/behavior_test_plugin_layers.cpp +++ b/inference-engine/tests_deprecated/behavior/cldnn/shared_tests_instances/plugin_tests/behavior_test_plugin_layers.cpp @@ -10,7 +10,7 @@ memory_test_params memory_test_cases[] = { // FIXME //#if (defined INSTANTIATE_TESTS) -//INSTANTIATE_TEST_CASE_P(BehaviorTest, MemoryLayerTest, +//INSTANTIATE_TEST_CASE_P(smoke_BehaviorTest, MemoryLayerTest, // ::testing::ValuesIn(memory_test_cases), // getTestName); //#endif diff --git a/inference-engine/tests_deprecated/behavior/cldnn/shared_tests_instances/plugin_tests/behavior_test_plugin_layout.cpp b/inference-engine/tests_deprecated/behavior/cldnn/shared_tests_instances/plugin_tests/behavior_test_plugin_layout.cpp index 93367391b18..ce4f8653524 100644 --- a/inference-engine/tests_deprecated/behavior/cldnn/shared_tests_instances/plugin_tests/behavior_test_plugin_layout.cpp +++ b/inference-engine/tests_deprecated/behavior/cldnn/shared_tests_instances/plugin_tests/behavior_test_plugin_layout.cpp @@ -14,8 +14,8 @@ layout_test_params conv_test_cases[] = { layout_test_params("GPU", "FP32", Layout::NCHW, power_params({ { 1, 3, 16, 16 } }, 1, 2, 2)), }; -INSTANTIATE_TEST_CASE_P(BehaviorTest, LayoutTestCanLoadPower, +INSTANTIATE_TEST_CASE_P(smoke_BehaviorTest, LayoutTestCanLoadPower, ::testing::ValuesIn(power_test_cases), getTestName); -INSTANTIATE_TEST_CASE_P(BehaviorTest, LayoutTestCanLoadConv, +INSTANTIATE_TEST_CASE_P(smoke_BehaviorTest, LayoutTestCanLoadConv, ::testing::ValuesIn(conv_test_cases), getTestName); diff --git a/inference-engine/tests_deprecated/behavior/cldnn/shared_tests_instances/plugin_tests/behavior_test_plugin_perf_counters.cpp b/inference-engine/tests_deprecated/behavior/cldnn/shared_tests_instances/plugin_tests/behavior_test_plugin_perf_counters.cpp index dc309f4b819..1ac533a2576 100644 --- a/inference-engine/tests_deprecated/behavior/cldnn/shared_tests_instances/plugin_tests/behavior_test_plugin_perf_counters.cpp +++ b/inference-engine/tests_deprecated/behavior/cldnn/shared_tests_instances/plugin_tests/behavior_test_plugin_perf_counters.cpp @@ -7,7 +7,7 @@ // Disabled due to a bug on CentOS that leads to segmentation fault of application on exit // when perf counters are enabled -//INSTANTIATE_TEST_CASE_P( +//INSTANTIATE_TEST_CASE_P(smoke_ // BehaviorTest, // BehaviorPluginTestPerfCounters, // ValuesIn(supportedValues), diff --git a/inference-engine/tests_deprecated/behavior/cldnn/shared_tests_instances/plugin_tests/behavior_test_plugin_set_preprocess.cpp b/inference-engine/tests_deprecated/behavior/cldnn/shared_tests_instances/plugin_tests/behavior_test_plugin_set_preprocess.cpp index 75009b9575c..14d5d0339fc 100644 --- a/inference-engine/tests_deprecated/behavior/cldnn/shared_tests_instances/plugin_tests/behavior_test_plugin_set_preprocess.cpp +++ b/inference-engine/tests_deprecated/behavior/cldnn/shared_tests_instances/plugin_tests/behavior_test_plugin_set_preprocess.cpp @@ -5,7 +5,7 @@ #include "behavior_test_plugin_set_preprocess.hpp" #include "cldnn_test_data.hpp" -INSTANTIATE_TEST_CASE_P(BehaviorTest, +INSTANTIATE_TEST_CASE_P(smoke_BehaviorTest, BehaviorPluginTestPreProcess, ValuesIn(supportedValues), getTestCaseName); diff --git a/inference-engine/tests_deprecated/behavior/cldnn/shared_tests_instances/plugin_tests/behavior_test_plugin_unsupported.cpp b/inference-engine/tests_deprecated/behavior/cldnn/shared_tests_instances/plugin_tests/behavior_test_plugin_unsupported.cpp index 3aa7335218c..51b6f824c86 100644 --- a/inference-engine/tests_deprecated/behavior/cldnn/shared_tests_instances/plugin_tests/behavior_test_plugin_unsupported.cpp +++ b/inference-engine/tests_deprecated/behavior/cldnn/shared_tests_instances/plugin_tests/behavior_test_plugin_unsupported.cpp @@ -5,8 +5,8 @@ #include "behavior_test_plugin_unsupported.hpp" #include "cldnn_test_data.hpp" -INSTANTIATE_TEST_CASE_P(BehaviorTest, BehaviorPluginTestAllUnsupported, ValuesIn(allUnSupportedValues), +INSTANTIATE_TEST_CASE_P(smoke_BehaviorTest, BehaviorPluginTestAllUnsupported, ValuesIn(allUnSupportedValues), getTestCaseName); -INSTANTIATE_TEST_CASE_P(BehaviorTest, BehaviorPluginTestTypeUnsupported, ValuesIn(typeUnSupportedValues), +INSTANTIATE_TEST_CASE_P(smoke_BehaviorTest, BehaviorPluginTestTypeUnsupported, ValuesIn(typeUnSupportedValues), getTestCaseName); diff --git a/inference-engine/tests_deprecated/behavior/cldnn/shared_tests_instances/plugin_tests/behavior_test_plugin_version.cpp b/inference-engine/tests_deprecated/behavior/cldnn/shared_tests_instances/plugin_tests/behavior_test_plugin_version.cpp index 1915219e239..a9857f629ed 100644 --- a/inference-engine/tests_deprecated/behavior/cldnn/shared_tests_instances/plugin_tests/behavior_test_plugin_version.cpp +++ b/inference-engine/tests_deprecated/behavior/cldnn/shared_tests_instances/plugin_tests/behavior_test_plugin_version.cpp @@ -5,4 +5,4 @@ #include "behavior_test_plugin_version.hpp" #include "cldnn_test_data.hpp" -INSTANTIATE_TEST_CASE_P(BehaviorTest, BehaviorPluginTestVersion, ValuesIn(add_element_into_array(supportedValues, BEH_HETERO)), getTestCaseName); +INSTANTIATE_TEST_CASE_P(smoke_BehaviorTest, BehaviorPluginTestVersion, ValuesIn(add_element_into_array(supportedValues, BEH_HETERO)), getTestCaseName); diff --git a/inference-engine/tests_deprecated/behavior/cldnn/shared_tests_instances/plugin_tests/cldnn_test_data.hpp b/inference-engine/tests_deprecated/behavior/cldnn/shared_tests_instances/plugin_tests/cldnn_test_data.hpp index 1b1ec48c3d3..81df192fdda 100644 --- a/inference-engine/tests_deprecated/behavior/cldnn/shared_tests_instances/plugin_tests/cldnn_test_data.hpp +++ b/inference-engine/tests_deprecated/behavior/cldnn/shared_tests_instances/plugin_tests/cldnn_test_data.hpp @@ -14,19 +14,34 @@ FuncTestUtils::TestModel::convReluNormPoolFcModelFP32.model_xml_str, \ FuncTestUtils::TestModel::convReluNormPoolFcModelFP32.weights_blob, \ Precision::FP32) +// for multi-device we are testing the fp16 (as it is supported by all device combos we are considering for testing +// e.g. GPU and VPU, for CPU the network is automatically (internally) converted to fp32. +const std::map multi_device_conf = {{MultiDeviceConfigParams::KEY_MULTI_DEVICE_PRIORITIES, "GPU"}}; +#define BEH_MULTI BehTestParams("MULTI", \ + FuncTestUtils::TestModel::convReluNormPoolFcModelFP16.model_xml_str, \ + FuncTestUtils::TestModel::convReluNormPoolFcModelFP16.weights_blob, \ + Precision::FP32, \ + multi_device_conf) // all parameters are unsupported - reversed #define BEH_US_ALL_CLDNN BehTestParams("GPU", \ FuncTestUtils::TestModel::convReluNormPoolFcModelQ78.model_xml_str, \ FuncTestUtils::TestModel::convReluNormPoolFcModelQ78.weights_blob, \ Precision::Q78) +#define BEH_US_ALL_MULTI BehTestParams("MULTI", \ + FuncTestUtils::TestModel::convReluNormPoolFcModelQ78.model_xml_str, \ + FuncTestUtils::TestModel::convReluNormPoolFcModelQ78.weights_blob, \ + Precision::Q78, \ + multi_device_conf) const BehTestParams supportedValues[] = { BEH_CLDNN, + BEH_MULTI, }; const BehTestParams requestsSupportedValues[] = { BEH_CLDNN, + BEH_MULTI, }; const BehTestParams allInputSupportedValues[] = { @@ -36,19 +51,34 @@ const BehTestParams allInputSupportedValues[] = { BEH_CLDNN.withIn(Precision::FP16).withConfig({{KEY_GPU_THROUGHPUT_STREAMS, GPU_THROUGHPUT_AUTO}}), BEH_CLDNN.withIn(Precision::I16).withConfig({{KEY_GPU_THROUGHPUT_STREAMS, GPU_THROUGHPUT_AUTO}}), BEH_CLDNN.withIn(Precision::I32).withConfig({{KEY_GPU_THROUGHPUT_STREAMS, GPU_THROUGHPUT_AUTO}}), + BEH_MULTI, BEH_MULTI.withIn(Precision::FP16), BEH_MULTI.withIn(Precision::U8), BEH_MULTI.withIn(Precision::I16), + BEH_MULTI.withIn(Precision::I32), + BEH_MULTI.withIn(Precision::U8).withConfig({{MultiDeviceConfigParams::KEY_MULTI_DEVICE_PRIORITIES, "GPU"}, + {KEY_GPU_THROUGHPUT_STREAMS, GPU_THROUGHPUT_AUTO}}), + BEH_MULTI.withIn(Precision::FP16).withConfig({{KEY_GPU_THROUGHPUT_STREAMS, GPU_THROUGHPUT_AUTO}, + {MultiDeviceConfigParams::KEY_MULTI_DEVICE_PRIORITIES, "GPU"}}), + BEH_MULTI.withIn(Precision::I16).withConfig({{KEY_GPU_THROUGHPUT_STREAMS, GPU_THROUGHPUT_AUTO}, + {MultiDeviceConfigParams::KEY_MULTI_DEVICE_PRIORITIES, "GPU"}}), + BEH_MULTI.withIn(Precision::I32).withConfig({{KEY_GPU_THROUGHPUT_STREAMS, GPU_THROUGHPUT_AUTO}, + {MultiDeviceConfigParams::KEY_MULTI_DEVICE_PRIORITIES, "GPU"}}), }; const BehTestParams allOutputSupportedValues[] = { BEH_CLDNN, BEH_CLDNN.withOut(Precision::FP16), BEH_CLDNN.withIn(Precision::FP16).withConfig({{KEY_GPU_THROUGHPUT_STREAMS, GPU_THROUGHPUT_AUTO}}), + BEH_MULTI, BEH_MULTI.withOut(Precision::FP16), + BEH_MULTI.withIn(Precision::FP16).withConfig({{KEY_GPU_THROUGHPUT_STREAMS, GPU_THROUGHPUT_AUTO}, + {MultiDeviceConfigParams::KEY_MULTI_DEVICE_PRIORITIES, "GPU"}}), }; const BehTestParams typeUnSupportedValues[] = { BEH_CLDNN.withIn(Precision::Q78), BEH_CLDNN.withIn(Precision::I8), + BEH_MULTI.withIn(Precision::Q78), BEH_MULTI.withIn(Precision::I8), }; const BehTestParams allUnSupportedValues[] = { BEH_US_ALL_CLDNN, + BEH_US_ALL_MULTI, }; const std::vector withCorrectConfValues = { @@ -63,6 +93,23 @@ const std::vector withCorrectConfValues = { BEH_CLDNN.withConfig({{KEY_TUNING_MODE, TUNING_CREATE}, {KEY_TUNING_FILE, "tfile"}}), BEH_CLDNN.withConfig({{KEY_DEVICE_ID, "0"}}), + BEH_MULTI.withConfig({{MultiDeviceConfigParams::KEY_MULTI_DEVICE_PRIORITIES, "GPU"}, + {KEY_GPU_THROUGHPUT_STREAMS, GPU_THROUGHPUT_AUTO}}), + BEH_MULTI.withConfig({{MultiDeviceConfigParams::KEY_MULTI_DEVICE_PRIORITIES, "GPU"}, + {KEY_GPU_THROUGHPUT_STREAMS, "2"}}), + BEH_MULTI.withConfig({{MultiDeviceConfigParams::KEY_MULTI_DEVICE_PRIORITIES, "GPU"}, + {KEY_PERF_COUNT, NO}}), + BEH_MULTI.withConfig({{MultiDeviceConfigParams::KEY_MULTI_DEVICE_PRIORITIES, "GPU"}, + {KEY_DUMP_KERNELS, NO}}), + BEH_MULTI.withConfig({{MultiDeviceConfigParams::KEY_MULTI_DEVICE_PRIORITIES, "GPU"}, + {KEY_DUMP_KERNELS, YES}}), + BEH_MULTI.withConfig({{MultiDeviceConfigParams::KEY_MULTI_DEVICE_PRIORITIES, "GPU"}, + {KEY_TUNING_MODE, TUNING_DISABLED}}), + BEH_MULTI.withConfig({{MultiDeviceConfigParams::KEY_MULTI_DEVICE_PRIORITIES, "GPU"}, + {KEY_TUNING_MODE, TUNING_CREATE}, + {KEY_TUNING_FILE, "tfile"}}), + BEH_MULTI.withConfig({{MultiDeviceConfigParams::KEY_MULTI_DEVICE_PRIORITIES, "GPU"}, + {KEY_DEVICE_ID, "0"}}), }; const BehTestParams withIncorrectConfValues[] = { @@ -75,6 +122,18 @@ const BehTestParams withIncorrectConfValues[] = { // FIXME: [IE clDNN] The plugin doesn't throw GENERAL_ERROR if use non-exist tuning file. CVS-8593 //BEH_CLDNN.withConfig({ { KEY_TUNING_MODE, TUNING_USE_EXISTING }, // { KEY_TUNING_FILE, "unknown_file" } }), + BEH_MULTI.withConfig({{MultiDeviceConfigParams::KEY_MULTI_DEVICE_PRIORITIES, "GPU"}, + {KEY_GPU_THROUGHPUT_STREAMS, "OFF"}}), + BEH_MULTI.withConfig({{MultiDeviceConfigParams::KEY_MULTI_DEVICE_PRIORITIES, "GPU"}, + {KEY_PERF_COUNT, "ON"}}), + BEH_MULTI.withConfig({{MultiDeviceConfigParams::KEY_MULTI_DEVICE_PRIORITIES, "GPU"}, + {KEY_CONFIG_FILE, "unknown_file"}}), + BEH_MULTI.withConfig({{MultiDeviceConfigParams::KEY_MULTI_DEVICE_PRIORITIES, "GPU"}, + {KEY_DUMP_KERNELS, "ON"}}), + BEH_MULTI.withConfig({{MultiDeviceConfigParams::KEY_MULTI_DEVICE_PRIORITIES, "GPU"}, + {KEY_TUNING_MODE, "TUNING_UNKNOWN_MODE"}}), + BEH_MULTI.withConfig({{MultiDeviceConfigParams::KEY_MULTI_DEVICE_PRIORITIES, "GPU"}, + {KEY_DEVICE_ID, "DEVICE_UNKNOWN"}}) }; const std::vector withCorrectConfValuesNetworkOnly = { @@ -83,4 +142,5 @@ const std::vector withCorrectConfValuesNetworkOnly = { const BehTestParams withIncorrectConfKeys[] = { BEH_CLDNN.withIncorrectConfigItem(), + BEH_MULTI.withIncorrectConfigItem(), }; diff --git a/inference-engine/tests_deprecated/behavior/gna/shared_tests_instances/cpp_wrappers/holders_tests.cpp b/inference-engine/tests_deprecated/behavior/gna/shared_tests_instances/cpp_wrappers/holders_tests.cpp index 7b7ed39cf26..75e76e2f854 100644 --- a/inference-engine/tests_deprecated/behavior/gna/shared_tests_instances/cpp_wrappers/holders_tests.cpp +++ b/inference-engine/tests_deprecated/behavior/gna/shared_tests_instances/cpp_wrappers/holders_tests.cpp @@ -4,7 +4,7 @@ #include "holders_tests.hpp" -INSTANTIATE_TEST_CASE_P(ReleaseOrderTests, CPP_HoldersTests, testing::Combine(testing::ValuesIn(std::vector> { +INSTANTIATE_TEST_CASE_P(smoke_ReleaseOrderTests, CPP_HoldersTests, testing::Combine(testing::ValuesIn(std::vector> { // 0 - plugin // 1 - executable_network // 2 - infer_request diff --git a/inference-engine/tests_deprecated/behavior/gna/shared_tests_instances/plugin_tests/behavior_test_plugin.cpp b/inference-engine/tests_deprecated/behavior/gna/shared_tests_instances/plugin_tests/behavior_test_plugin.cpp index ce4219d51cc..5e8a3f7110a 100644 --- a/inference-engine/tests_deprecated/behavior/gna/shared_tests_instances/plugin_tests/behavior_test_plugin.cpp +++ b/inference-engine/tests_deprecated/behavior/gna/shared_tests_instances/plugin_tests/behavior_test_plugin.cpp @@ -6,9 +6,9 @@ #include "behavior_test_plugins.hpp" #include "gna_test_data.hpp" -INSTANTIATE_TEST_CASE_P(BehaviorTest, BehaviorPluginTest, ValuesIn(supportedValues), +INSTANTIATE_TEST_CASE_P(smoke_BehaviorTest, BehaviorPluginTest, ValuesIn(supportedValues), getTestCaseName); -INSTANTIATE_TEST_CASE_P(BehaviorTest, BehaviorPluginTestInput, ValuesIn(allInputSupportedValues), +INSTANTIATE_TEST_CASE_P(smoke_BehaviorTest, BehaviorPluginTestInput, ValuesIn(allInputSupportedValues), getTestCaseName); -INSTANTIATE_TEST_CASE_P(BehaviorTest, BehaviorPluginTestOutput, ValuesIn(allOutputSupportedValues), +INSTANTIATE_TEST_CASE_P(smoke_BehaviorTest, BehaviorPluginTestOutput, ValuesIn(allOutputSupportedValues), getOutputTestCaseName); diff --git a/inference-engine/tests_deprecated/behavior/gna/shared_tests_instances/plugin_tests/behavior_test_plugin_config.cpp b/inference-engine/tests_deprecated/behavior/gna/shared_tests_instances/plugin_tests/behavior_test_plugin_config.cpp index fe72b8e2749..bff01fb2f8f 100644 --- a/inference-engine/tests_deprecated/behavior/gna/shared_tests_instances/plugin_tests/behavior_test_plugin_config.cpp +++ b/inference-engine/tests_deprecated/behavior/gna/shared_tests_instances/plugin_tests/behavior_test_plugin_config.cpp @@ -5,13 +5,13 @@ #include "behavior_test_plugin_config.hpp" #include "gna_test_data.hpp" -INSTANTIATE_TEST_CASE_P(BehaviorTest, BehaviorPluginIncorrectConfigTest, ValuesIn(withIncorrectConfValues), +INSTANTIATE_TEST_CASE_P(smoke_BehaviorTest, BehaviorPluginIncorrectConfigTest, ValuesIn(withIncorrectConfValues), getTestCaseName); -INSTANTIATE_TEST_CASE_P(BehaviorTest, BehaviorPluginIncorrectConfigTestInferRequestAPI, +INSTANTIATE_TEST_CASE_P(smoke_BehaviorTest, BehaviorPluginIncorrectConfigTestInferRequestAPI, ValuesIn(withIncorrectConfKeys), getTestCaseName); -INSTANTIATE_TEST_CASE_P(BehaviorTest, BehaviorPluginCorrectConfigTestInferRequestAPI, +INSTANTIATE_TEST_CASE_P(smoke_BehaviorTest, BehaviorPluginCorrectConfigTestInferRequestAPI, ValuesIn(supportedValues), getTestCaseName); diff --git a/inference-engine/tests_deprecated/behavior/gna/shared_tests_instances/plugin_tests/behavior_test_plugin_exec_graph_info.cpp b/inference-engine/tests_deprecated/behavior/gna/shared_tests_instances/plugin_tests/behavior_test_plugin_exec_graph_info.cpp index 93411409ece..c8099abab34 100644 --- a/inference-engine/tests_deprecated/behavior/gna/shared_tests_instances/plugin_tests/behavior_test_plugin_exec_graph_info.cpp +++ b/inference-engine/tests_deprecated/behavior/gna/shared_tests_instances/plugin_tests/behavior_test_plugin_exec_graph_info.cpp @@ -6,7 +6,7 @@ #include "gna_test_data.hpp" INSTANTIATE_TEST_CASE_P( - BehaviorTest, + smoke_BehaviorTest, BehaviorPluginTestExecGraphInfo, ValuesIn(supportedValues), getTestCaseName); diff --git a/inference-engine/tests_deprecated/behavior/gna/shared_tests_instances/plugin_tests/behavior_test_plugin_infer_request.cpp b/inference-engine/tests_deprecated/behavior/gna/shared_tests_instances/plugin_tests/behavior_test_plugin_infer_request.cpp index 3a2a25ceb35..9918dc508fc 100644 --- a/inference-engine/tests_deprecated/behavior/gna/shared_tests_instances/plugin_tests/behavior_test_plugin_infer_request.cpp +++ b/inference-engine/tests_deprecated/behavior/gna/shared_tests_instances/plugin_tests/behavior_test_plugin_infer_request.cpp @@ -5,4 +5,4 @@ #include "behavior_test_plugin_infer_request.hpp" #include "gna_test_data.hpp" -INSTANTIATE_TEST_CASE_P(BehaviorTest, BehaviorPluginTestInferRequest, ValuesIn(requestsSupportedValues), getTestCaseName); +INSTANTIATE_TEST_CASE_P(smoke_BehaviorTest, BehaviorPluginTestInferRequest, ValuesIn(requestsSupportedValues), getTestCaseName); diff --git a/inference-engine/tests_deprecated/behavior/gna/shared_tests_instances/plugin_tests/behavior_test_plugin_infer_request_callback.cpp b/inference-engine/tests_deprecated/behavior/gna/shared_tests_instances/plugin_tests/behavior_test_plugin_infer_request_callback.cpp index 906805e5df4..17c4deb6eaa 100644 --- a/inference-engine/tests_deprecated/behavior/gna/shared_tests_instances/plugin_tests/behavior_test_plugin_infer_request_callback.cpp +++ b/inference-engine/tests_deprecated/behavior/gna/shared_tests_instances/plugin_tests/behavior_test_plugin_infer_request_callback.cpp @@ -6,5 +6,5 @@ #include "gna_test_data.hpp" // TODO: support InferRequestCallback in GNAPlugin -//INSTANTIATE_TEST_CASE_P(BehaviorTest, BehaviorPluginTestInferRequestCallback, ValuesIn(requestsSupportedValues), +//INSTANTIATE_TEST_CASE_P(smoke_BehaviorTest, BehaviorPluginTestInferRequestCallback, ValuesIn(requestsSupportedValues), // getTestCaseName); diff --git a/inference-engine/tests_deprecated/behavior/gna/shared_tests_instances/plugin_tests/behavior_test_plugin_infer_request_config.cpp b/inference-engine/tests_deprecated/behavior/gna/shared_tests_instances/plugin_tests/behavior_test_plugin_infer_request_config.cpp index 6eb64e9001a..67ae245bbe2 100644 --- a/inference-engine/tests_deprecated/behavior/gna/shared_tests_instances/plugin_tests/behavior_test_plugin_infer_request_config.cpp +++ b/inference-engine/tests_deprecated/behavior/gna/shared_tests_instances/plugin_tests/behavior_test_plugin_infer_request_config.cpp @@ -5,11 +5,11 @@ #include "behavior_test_plugin_infer_request_config.hpp" #include "gna_test_data.hpp" -INSTANTIATE_TEST_CASE_P(BehaviorTest, BehaviorPluginTestInferRequestConfig, +INSTANTIATE_TEST_CASE_P(smoke_BehaviorTest, BehaviorPluginTestInferRequestConfig, ValuesIn(withCorrectConfValues), getConfigTestCaseName); -INSTANTIATE_TEST_CASE_P(BehaviorTest, BehaviorPluginTestInferRequestConfigExclusiveAsync, ValuesIn(supportedValues), +INSTANTIATE_TEST_CASE_P(smoke_BehaviorTest, BehaviorPluginTestInferRequestConfigExclusiveAsync, ValuesIn(supportedValues), getConfigTestCaseName); bool CheckGnaHw() { @@ -38,6 +38,6 @@ TEST_P(BehaviorPluginTestInferRequestWithGnaHw, CanInferOrFailWithGnaHw) { } } -INSTANTIATE_TEST_CASE_P(BehaviorTest, BehaviorPluginTestInferRequestWithGnaHw, +INSTANTIATE_TEST_CASE_P(smoke_BehaviorTest, BehaviorPluginTestInferRequestWithGnaHw, ValuesIn(withGnaHwConfValue), getConfigTestCaseName); diff --git a/inference-engine/tests_deprecated/behavior/gna/shared_tests_instances/plugin_tests/behavior_test_plugin_infer_request_input.cpp b/inference-engine/tests_deprecated/behavior/gna/shared_tests_instances/plugin_tests/behavior_test_plugin_infer_request_input.cpp index 235c647481e..2c9c0d1ede8 100644 --- a/inference-engine/tests_deprecated/behavior/gna/shared_tests_instances/plugin_tests/behavior_test_plugin_infer_request_input.cpp +++ b/inference-engine/tests_deprecated/behavior/gna/shared_tests_instances/plugin_tests/behavior_test_plugin_infer_request_input.cpp @@ -5,5 +5,5 @@ #include "behavior_test_plugin_infer_request_input.hpp" #include "gna_test_data.hpp" -INSTANTIATE_TEST_CASE_P(BehaviorTest, BehaviorPluginTestInferRequestInput, ValuesIn(allInputSupportedValues), +INSTANTIATE_TEST_CASE_P(smoke_BehaviorTest, BehaviorPluginTestInferRequestInput, ValuesIn(allInputSupportedValues), getTestCaseName); diff --git a/inference-engine/tests_deprecated/behavior/gna/shared_tests_instances/plugin_tests/behavior_test_plugin_infer_request_output.cpp b/inference-engine/tests_deprecated/behavior/gna/shared_tests_instances/plugin_tests/behavior_test_plugin_infer_request_output.cpp index bb123323940..d9c222058d5 100644 --- a/inference-engine/tests_deprecated/behavior/gna/shared_tests_instances/plugin_tests/behavior_test_plugin_infer_request_output.cpp +++ b/inference-engine/tests_deprecated/behavior/gna/shared_tests_instances/plugin_tests/behavior_test_plugin_infer_request_output.cpp @@ -5,5 +5,5 @@ #include "behavior_test_plugin_infer_request_output.hpp" #include "gna_test_data.hpp" -INSTANTIATE_TEST_CASE_P(BehaviorTest, BehaviorPluginTestInferRequestOutput, ValuesIn(allOutputSupportedValues), +INSTANTIATE_TEST_CASE_P(smoke_BehaviorTest, BehaviorPluginTestInferRequestOutput, ValuesIn(allOutputSupportedValues), getOutputTestCaseName); diff --git a/inference-engine/tests_deprecated/behavior/gna/shared_tests_instances/plugin_tests/behavior_test_plugin_layers.cpp b/inference-engine/tests_deprecated/behavior/gna/shared_tests_instances/plugin_tests/behavior_test_plugin_layers.cpp index bbda3162b89..d7dca53f937 100644 --- a/inference-engine/tests_deprecated/behavior/gna/shared_tests_instances/plugin_tests/behavior_test_plugin_layers.cpp +++ b/inference-engine/tests_deprecated/behavior/gna/shared_tests_instances/plugin_tests/behavior_test_plugin_layers.cpp @@ -10,7 +10,7 @@ conv_test_params deconv_test_cases[] = { conv_test_params(CommonTestUtils::DEVICE_GNA, conv_case) }; -INSTANTIATE_TEST_CASE_P(BehaviorTest, DeconvolutionLayerTest, +INSTANTIATE_TEST_CASE_P(smoke_BehaviorTest, DeconvolutionLayerTest, ::testing::ValuesIn(deconv_test_cases), getTestName); @@ -19,17 +19,17 @@ pool_test_params roi_pool_test_cases[] = { }; // TODO: fix this -//INSTANTIATE_TEST_CASE_P(BehaviorTest, PoolingLayerTest, +//INSTANTIATE_TEST_CASE_P(smoke_BehaviorTest, PoolingLayerTest, // ::testing::Values(pool_test_params("GNAPlugin", "FP32", pool_case)), // getTestName); // -//INSTANTIATE_TEST_CASE_P(BehaviorTest, ReLULayerTest, +//INSTANTIATE_TEST_CASE_P(smoke_BehaviorTest, ReLULayerTest, // ::testing::Values(activ_test_params("GNAPlugin", "FP32", activation_case)), // getTestName); // FIXME //#if (defined INSTANTIATE_TESTS) -//INSTANTIATE_TEST_CASE_P(BehaviorTest, MemoryLayerTest, +//INSTANTIATE_TEST_CASE_P(smoke_BehaviorTest, MemoryLayerTest, // ::testing::ValuesIn(memory_test_cases), // getTestName); //#endif diff --git a/inference-engine/tests_deprecated/behavior/gna/shared_tests_instances/plugin_tests/behavior_test_plugin_layout.cpp b/inference-engine/tests_deprecated/behavior/gna/shared_tests_instances/plugin_tests/behavior_test_plugin_layout.cpp index 385fc84ae5d..7e621e71d12 100644 --- a/inference-engine/tests_deprecated/behavior/gna/shared_tests_instances/plugin_tests/behavior_test_plugin_layout.cpp +++ b/inference-engine/tests_deprecated/behavior/gna/shared_tests_instances/plugin_tests/behavior_test_plugin_layout.cpp @@ -11,5 +11,5 @@ layout_test_params activ_test_cases[] = { layout_test_params(CommonTestUtils::DEVICE_GNA, "FP32", Layout::NCHW, power_params({ { 1, 3, 16, 16 } }, 2, 2, 2)), }; -INSTANTIATE_TEST_CASE_P(BehaviorTest, LayoutTestCanLoadActiv, +INSTANTIATE_TEST_CASE_P(smoke_BehaviorTest, LayoutTestCanLoadActiv, ::testing::ValuesIn(activ_test_cases), getTestName); diff --git a/inference-engine/tests_deprecated/behavior/gna/shared_tests_instances/plugin_tests/behavior_test_plugin_unsupported.cpp b/inference-engine/tests_deprecated/behavior/gna/shared_tests_instances/plugin_tests/behavior_test_plugin_unsupported.cpp index 6220d6974da..56b4c501bce 100644 --- a/inference-engine/tests_deprecated/behavior/gna/shared_tests_instances/plugin_tests/behavior_test_plugin_unsupported.cpp +++ b/inference-engine/tests_deprecated/behavior/gna/shared_tests_instances/plugin_tests/behavior_test_plugin_unsupported.cpp @@ -5,10 +5,10 @@ #include "behavior_test_plugin_unsupported.hpp" #include "gna_test_data.hpp" -INSTANTIATE_TEST_CASE_P(BehaviorTest, BehaviorPluginTestAllUnsupported, ValuesIn(allUnSupportedValues), +INSTANTIATE_TEST_CASE_P(smoke_BehaviorTest, BehaviorPluginTestAllUnsupported, ValuesIn(allUnSupportedValues), getTestCaseName); -INSTANTIATE_TEST_CASE_P(BehaviorTest, BehaviorPluginTestTypeUnsupported, ValuesIn(typeUnSupportedValues), +INSTANTIATE_TEST_CASE_P(smoke_BehaviorTest, BehaviorPluginTestTypeUnsupported, ValuesIn(typeUnSupportedValues), getTestCaseName); - INSTANTIATE_TEST_CASE_P(BehaviorTest, BehaviorPluginTestBatchUnsupported, ValuesIn(batchUnSupportedValues), + INSTANTIATE_TEST_CASE_P(smoke_BehaviorTest, BehaviorPluginTestBatchUnsupported, ValuesIn(batchUnSupportedValues), getTestCaseName); diff --git a/inference-engine/tests_deprecated/behavior/gna/shared_tests_instances/plugin_tests/behavior_test_plugin_version.cpp b/inference-engine/tests_deprecated/behavior/gna/shared_tests_instances/plugin_tests/behavior_test_plugin_version.cpp index 7b3c76db38e..2900cffb31e 100644 --- a/inference-engine/tests_deprecated/behavior/gna/shared_tests_instances/plugin_tests/behavior_test_plugin_version.cpp +++ b/inference-engine/tests_deprecated/behavior/gna/shared_tests_instances/plugin_tests/behavior_test_plugin_version.cpp @@ -5,4 +5,4 @@ #include "behavior_test_plugin_version.hpp" #include "gna_test_data.hpp" -INSTANTIATE_TEST_CASE_P(BehaviorTest, BehaviorPluginTestVersion, ValuesIn(add_element_into_array(supportedValues, BEH_HETERO)), getTestCaseName); +INSTANTIATE_TEST_CASE_P(smoke_BehaviorTest, BehaviorPluginTestVersion, ValuesIn(add_element_into_array(supportedValues, BEH_HETERO)), getTestCaseName); diff --git a/inference-engine/tests_deprecated/behavior/mkldnn/shared_tests_instances/cpp_wrappers/holders_tests.cpp b/inference-engine/tests_deprecated/behavior/mkldnn/shared_tests_instances/cpp_wrappers/holders_tests.cpp index 4a48d06f408..4d4dc98a194 100644 --- a/inference-engine/tests_deprecated/behavior/mkldnn/shared_tests_instances/cpp_wrappers/holders_tests.cpp +++ b/inference-engine/tests_deprecated/behavior/mkldnn/shared_tests_instances/cpp_wrappers/holders_tests.cpp @@ -4,7 +4,7 @@ #include "holders_tests.hpp" -INSTANTIATE_TEST_CASE_P(ReleaseOrderTests, CPP_HoldersTests, testing::Combine(testing::ValuesIn(std::vector> { +INSTANTIATE_TEST_CASE_P(smoke_ReleaseOrderTests, CPP_HoldersTests, testing::Combine(testing::ValuesIn(std::vector> { // 0 - plugin // 1 - executable_network // 2 - infer_request diff --git a/inference-engine/tests_deprecated/behavior/mkldnn/shared_tests_instances/plugin_tests/behavior_test_plugin.cpp b/inference-engine/tests_deprecated/behavior/mkldnn/shared_tests_instances/plugin_tests/behavior_test_plugin.cpp index 3ee37d6660a..471137bea84 100644 --- a/inference-engine/tests_deprecated/behavior/mkldnn/shared_tests_instances/plugin_tests/behavior_test_plugin.cpp +++ b/inference-engine/tests_deprecated/behavior/mkldnn/shared_tests_instances/plugin_tests/behavior_test_plugin.cpp @@ -6,9 +6,9 @@ #include "behavior_test_plugins.hpp" #include "mkldnn_test_data.hpp" -INSTANTIATE_TEST_CASE_P(BehaviorTest, BehaviorPluginTest, ValuesIn(supportedValues), +INSTANTIATE_TEST_CASE_P(smoke_BehaviorTest, BehaviorPluginTest, ValuesIn(supportedValues), getTestCaseName); -INSTANTIATE_TEST_CASE_P(BehaviorTest, BehaviorPluginTestInput, ValuesIn(allInputSupportedValues), +INSTANTIATE_TEST_CASE_P(smoke_BehaviorTest, BehaviorPluginTestInput, ValuesIn(allInputSupportedValues), getTestCaseName); -INSTANTIATE_TEST_CASE_P(BehaviorTest, BehaviorPluginTestOutput, ValuesIn(allOutputSupportedValues), +INSTANTIATE_TEST_CASE_P(smoke_BehaviorTest, BehaviorPluginTestOutput, ValuesIn(allOutputSupportedValues), getOutputTestCaseName); diff --git a/inference-engine/tests_deprecated/behavior/mkldnn/shared_tests_instances/plugin_tests/behavior_test_plugin_config.cpp b/inference-engine/tests_deprecated/behavior/mkldnn/shared_tests_instances/plugin_tests/behavior_test_plugin_config.cpp index 487dc47a146..bdabdb8563b 100644 --- a/inference-engine/tests_deprecated/behavior/mkldnn/shared_tests_instances/plugin_tests/behavior_test_plugin_config.cpp +++ b/inference-engine/tests_deprecated/behavior/mkldnn/shared_tests_instances/plugin_tests/behavior_test_plugin_config.cpp @@ -5,17 +5,17 @@ #include "behavior_test_plugin_config.hpp" #include "mkldnn_test_data.hpp" -INSTANTIATE_TEST_CASE_P(BehaviorTest, BehaviorPluginCorrectConfigTest, +INSTANTIATE_TEST_CASE_P(smoke_BehaviorTest, BehaviorPluginCorrectConfigTest, ValuesIn(BehTestParams::concat(withCorrectConfValues, withCorrectConfValuesPluginOnly)), getTestCaseName); -INSTANTIATE_TEST_CASE_P(BehaviorTest, BehaviorPluginIncorrectConfigTest, ValuesIn(withIncorrectConfValues), +INSTANTIATE_TEST_CASE_P(smoke_BehaviorTest, BehaviorPluginIncorrectConfigTest, ValuesIn(withIncorrectConfValues), getTestCaseName); -INSTANTIATE_TEST_CASE_P(BehaviorTest, BehaviorPluginIncorrectConfigTestInferRequestAPI, +INSTANTIATE_TEST_CASE_P(smoke_BehaviorTest, BehaviorPluginIncorrectConfigTestInferRequestAPI, ValuesIn(withIncorrectConfKeys), getTestCaseName); -INSTANTIATE_TEST_CASE_P(BehaviorTest, BehaviorPluginCorrectConfigTestInferRequestAPI, +INSTANTIATE_TEST_CASE_P(smoke_BehaviorTest, BehaviorPluginCorrectConfigTestInferRequestAPI, ValuesIn(supportedValues), getTestCaseName); diff --git a/inference-engine/tests_deprecated/behavior/mkldnn/shared_tests_instances/plugin_tests/behavior_test_plugin_exec_graph_info.cpp b/inference-engine/tests_deprecated/behavior/mkldnn/shared_tests_instances/plugin_tests/behavior_test_plugin_exec_graph_info.cpp index ec20b0cbe47..af7aa87d7a2 100644 --- a/inference-engine/tests_deprecated/behavior/mkldnn/shared_tests_instances/plugin_tests/behavior_test_plugin_exec_graph_info.cpp +++ b/inference-engine/tests_deprecated/behavior/mkldnn/shared_tests_instances/plugin_tests/behavior_test_plugin_exec_graph_info.cpp @@ -6,7 +6,7 @@ #include "mkldnn_test_data.hpp" INSTANTIATE_TEST_CASE_P( - BehaviorTest, + smoke_BehaviorTest, BehaviorPluginTestExecGraphInfo, ValuesIn(supportedValues), getTestCaseName); diff --git a/inference-engine/tests_deprecated/behavior/mkldnn/shared_tests_instances/plugin_tests/behavior_test_plugin_infer_request.cpp b/inference-engine/tests_deprecated/behavior/mkldnn/shared_tests_instances/plugin_tests/behavior_test_plugin_infer_request.cpp index 41bd3e38c18..f74a84c4bb1 100644 --- a/inference-engine/tests_deprecated/behavior/mkldnn/shared_tests_instances/plugin_tests/behavior_test_plugin_infer_request.cpp +++ b/inference-engine/tests_deprecated/behavior/mkldnn/shared_tests_instances/plugin_tests/behavior_test_plugin_infer_request.cpp @@ -5,4 +5,4 @@ #include "behavior_test_plugin_infer_request.hpp" #include "mkldnn_test_data.hpp" -INSTANTIATE_TEST_CASE_P(BehaviorTest, BehaviorPluginTestInferRequest, ValuesIn(requestsSupportedValues), getTestCaseName); +INSTANTIATE_TEST_CASE_P(smoke_BehaviorTest, BehaviorPluginTestInferRequest, ValuesIn(requestsSupportedValues), getTestCaseName); diff --git a/inference-engine/tests_deprecated/behavior/mkldnn/shared_tests_instances/plugin_tests/behavior_test_plugin_infer_request_callback.cpp b/inference-engine/tests_deprecated/behavior/mkldnn/shared_tests_instances/plugin_tests/behavior_test_plugin_infer_request_callback.cpp index ee7164699b3..fe0f54b336a 100644 --- a/inference-engine/tests_deprecated/behavior/mkldnn/shared_tests_instances/plugin_tests/behavior_test_plugin_infer_request_callback.cpp +++ b/inference-engine/tests_deprecated/behavior/mkldnn/shared_tests_instances/plugin_tests/behavior_test_plugin_infer_request_callback.cpp @@ -5,5 +5,5 @@ #include "behavior_test_plugin_infer_request_callback.hpp" #include "mkldnn_test_data.hpp" -INSTANTIATE_TEST_CASE_P(BehaviorTest, BehaviorPluginTestInferRequestCallback, ValuesIn(requestsSupportedValues), +INSTANTIATE_TEST_CASE_P(smoke_BehaviorTest, BehaviorPluginTestInferRequestCallback, ValuesIn(requestsSupportedValues), getTestCaseName); diff --git a/inference-engine/tests_deprecated/behavior/mkldnn/shared_tests_instances/plugin_tests/behavior_test_plugin_infer_request_config.cpp b/inference-engine/tests_deprecated/behavior/mkldnn/shared_tests_instances/plugin_tests/behavior_test_plugin_infer_request_config.cpp index d1d7c863c47..408d020f192 100644 --- a/inference-engine/tests_deprecated/behavior/mkldnn/shared_tests_instances/plugin_tests/behavior_test_plugin_infer_request_config.cpp +++ b/inference-engine/tests_deprecated/behavior/mkldnn/shared_tests_instances/plugin_tests/behavior_test_plugin_infer_request_config.cpp @@ -5,10 +5,10 @@ #include "behavior_test_plugin_infer_request_config.hpp" #include "mkldnn_test_data.hpp" -INSTANTIATE_TEST_CASE_P(BehaviorTest, BehaviorPluginTestInferRequestConfig, +INSTANTIATE_TEST_CASE_P(smoke_BehaviorTest, BehaviorPluginTestInferRequestConfig, ValuesIn(BehTestParams::concat(withCorrectConfValues, withCorrectConfValuesNetworkOnly)), getConfigTestCaseName); -INSTANTIATE_TEST_CASE_P(BehaviorTest, BehaviorPluginTestInferRequestConfigExclusiveAsync, ValuesIn(supportedValues), +INSTANTIATE_TEST_CASE_P(smoke_BehaviorTest, BehaviorPluginTestInferRequestConfigExclusiveAsync, ValuesIn(supportedValues), getConfigTestCaseName); diff --git a/inference-engine/tests_deprecated/behavior/mkldnn/shared_tests_instances/plugin_tests/behavior_test_plugin_infer_request_input.cpp b/inference-engine/tests_deprecated/behavior/mkldnn/shared_tests_instances/plugin_tests/behavior_test_plugin_infer_request_input.cpp index 088844ff64e..12f48efdd7a 100644 --- a/inference-engine/tests_deprecated/behavior/mkldnn/shared_tests_instances/plugin_tests/behavior_test_plugin_infer_request_input.cpp +++ b/inference-engine/tests_deprecated/behavior/mkldnn/shared_tests_instances/plugin_tests/behavior_test_plugin_infer_request_input.cpp @@ -5,5 +5,5 @@ #include "behavior_test_plugin_infer_request_input.hpp" #include "mkldnn_test_data.hpp" -INSTANTIATE_TEST_CASE_P(BehaviorTest, BehaviorPluginTestInferRequestInput, ValuesIn(allInputSupportedValues), +INSTANTIATE_TEST_CASE_P(smoke_BehaviorTest, BehaviorPluginTestInferRequestInput, ValuesIn(allInputSupportedValues), getTestCaseName); diff --git a/inference-engine/tests_deprecated/behavior/mkldnn/shared_tests_instances/plugin_tests/behavior_test_plugin_infer_request_output.cpp b/inference-engine/tests_deprecated/behavior/mkldnn/shared_tests_instances/plugin_tests/behavior_test_plugin_infer_request_output.cpp index 7bc7022eb0c..575a8653417 100644 --- a/inference-engine/tests_deprecated/behavior/mkldnn/shared_tests_instances/plugin_tests/behavior_test_plugin_infer_request_output.cpp +++ b/inference-engine/tests_deprecated/behavior/mkldnn/shared_tests_instances/plugin_tests/behavior_test_plugin_infer_request_output.cpp @@ -5,5 +5,5 @@ #include "behavior_test_plugin_infer_request_output.hpp" #include "mkldnn_test_data.hpp" -INSTANTIATE_TEST_CASE_P(BehaviorTest, BehaviorPluginTestInferRequestOutput, ValuesIn(allOutputSupportedValues), +INSTANTIATE_TEST_CASE_P(smoke_BehaviorTest, BehaviorPluginTestInferRequestOutput, ValuesIn(allOutputSupportedValues), getOutputTestCaseName); diff --git a/inference-engine/tests_deprecated/behavior/mkldnn/shared_tests_instances/plugin_tests/behavior_test_plugin_layers.cpp b/inference-engine/tests_deprecated/behavior/mkldnn/shared_tests_instances/plugin_tests/behavior_test_plugin_layers.cpp index 5e47e3aa6da..2bd8e2d9df0 100644 --- a/inference-engine/tests_deprecated/behavior/mkldnn/shared_tests_instances/plugin_tests/behavior_test_plugin_layers.cpp +++ b/inference-engine/tests_deprecated/behavior/mkldnn/shared_tests_instances/plugin_tests/behavior_test_plugin_layers.cpp @@ -8,7 +8,7 @@ pool_test_params roi_pool_test_cases[] = { pool_test_params(CommonTestUtils::DEVICE_CPU, "FP32", pool_case), }; -INSTANTIATE_TEST_CASE_P(BehaviorTest, ROIPoolingLayerTest, +INSTANTIATE_TEST_CASE_P(smoke_BehaviorTest, ROIPoolingLayerTest, ::testing::ValuesIn(roi_pool_test_cases), getTestName); @@ -16,11 +16,11 @@ activ_test_params activ_test_cases[] = { activ_test_params(CommonTestUtils::DEVICE_CPU, "FP32", activation_case), }; -INSTANTIATE_TEST_CASE_P(BehaviorTest, ActivationLayerTest, +INSTANTIATE_TEST_CASE_P(smoke_BehaviorTest, ActivationLayerTest, ::testing::ValuesIn(activ_test_cases), getTestName); -INSTANTIATE_TEST_CASE_P(BehaviorTest, ReLULayerTest, +INSTANTIATE_TEST_CASE_P(smoke_BehaviorTest, ReLULayerTest, ::testing::Values(activ_test_params("CPU", "FP32", activation_case)), getTestName); @@ -28,6 +28,6 @@ norm_test_params norm_test_cases[] = { norm_test_params(CommonTestUtils::DEVICE_CPU, "FP32", norm_case), }; -INSTANTIATE_TEST_CASE_P(BehaviorTest, NormalizeLayerTest, +INSTANTIATE_TEST_CASE_P(smoke_BehaviorTest, NormalizeLayerTest, ::testing::ValuesIn(norm_test_cases), getTestName); diff --git a/inference-engine/tests_deprecated/behavior/mkldnn/shared_tests_instances/plugin_tests/behavior_test_plugin_layout.cpp b/inference-engine/tests_deprecated/behavior/mkldnn/shared_tests_instances/plugin_tests/behavior_test_plugin_layout.cpp index 49750d115fd..efb38cf232a 100644 --- a/inference-engine/tests_deprecated/behavior/mkldnn/shared_tests_instances/plugin_tests/behavior_test_plugin_layout.cpp +++ b/inference-engine/tests_deprecated/behavior/mkldnn/shared_tests_instances/plugin_tests/behavior_test_plugin_layout.cpp @@ -21,9 +21,9 @@ layout_test_params conv_neg_test_cases[] = { layout_test_params(CommonTestUtils::DEVICE_CPU, "FP32", Layout::CHW, power_params({ { 3, 32, 16 } }, 2, 2, 2)), }; -INSTANTIATE_TEST_CASE_P(BehaviorTest, LayoutTestCanLoadPower, +INSTANTIATE_TEST_CASE_P(smoke_BehaviorTest, LayoutTestCanLoadPower, ::testing::ValuesIn(power_test_cases), getTestName); -INSTANTIATE_TEST_CASE_P(BehaviorTest, LayoutTestCanLoadConv, +INSTANTIATE_TEST_CASE_P(smoke_BehaviorTest, LayoutTestCanLoadConv, ::testing::ValuesIn(conv_test_cases), getTestName); -INSTANTIATE_TEST_CASE_P(BehaviorTest, LayoutTestCanNotLoadConv, +INSTANTIATE_TEST_CASE_P(smoke_BehaviorTest, LayoutTestCanNotLoadConv, ::testing::ValuesIn(conv_neg_test_cases), getTestName); diff --git a/inference-engine/tests_deprecated/behavior/mkldnn/shared_tests_instances/plugin_tests/behavior_test_plugin_set_preprocess.cpp b/inference-engine/tests_deprecated/behavior/mkldnn/shared_tests_instances/plugin_tests/behavior_test_plugin_set_preprocess.cpp index 266f1b04175..17369e12bf3 100644 --- a/inference-engine/tests_deprecated/behavior/mkldnn/shared_tests_instances/plugin_tests/behavior_test_plugin_set_preprocess.cpp +++ b/inference-engine/tests_deprecated/behavior/mkldnn/shared_tests_instances/plugin_tests/behavior_test_plugin_set_preprocess.cpp @@ -5,7 +5,7 @@ #include "behavior_test_plugin_set_preprocess.hpp" #include "mkldnn_test_data.hpp" -INSTANTIATE_TEST_CASE_P(BehaviorTest, +INSTANTIATE_TEST_CASE_P(smoke_BehaviorTest, BehaviorPluginTestPreProcess, ValuesIn(requestsSupportedValues), getTestCaseName); diff --git a/inference-engine/tests_deprecated/behavior/mkldnn/shared_tests_instances/plugin_tests/behavior_test_plugin_unsupported.cpp b/inference-engine/tests_deprecated/behavior/mkldnn/shared_tests_instances/plugin_tests/behavior_test_plugin_unsupported.cpp index aadb3dc3cdc..9ca1d5d601c 100644 --- a/inference-engine/tests_deprecated/behavior/mkldnn/shared_tests_instances/plugin_tests/behavior_test_plugin_unsupported.cpp +++ b/inference-engine/tests_deprecated/behavior/mkldnn/shared_tests_instances/plugin_tests/behavior_test_plugin_unsupported.cpp @@ -5,8 +5,8 @@ #include "behavior_test_plugin_unsupported.hpp" #include "mkldnn_test_data.hpp" -INSTANTIATE_TEST_CASE_P(BehaviorTest, BehaviorPluginTestAllUnsupported, ValuesIn(allUnSupportedValues), +INSTANTIATE_TEST_CASE_P(smoke_BehaviorTest, BehaviorPluginTestAllUnsupported, ValuesIn(allUnSupportedValues), getTestCaseName); -INSTANTIATE_TEST_CASE_P(BehaviorTest, BehaviorPluginTestTypeUnsupported, ValuesIn(typeUnSupportedValues), +INSTANTIATE_TEST_CASE_P(smoke_BehaviorTest, BehaviorPluginTestTypeUnsupported, ValuesIn(typeUnSupportedValues), getTestCaseName); diff --git a/inference-engine/tests_deprecated/behavior/mkldnn/shared_tests_instances/plugin_tests/behavior_test_plugin_version.cpp b/inference-engine/tests_deprecated/behavior/mkldnn/shared_tests_instances/plugin_tests/behavior_test_plugin_version.cpp index 8d05905f446..3811e22f627 100644 --- a/inference-engine/tests_deprecated/behavior/mkldnn/shared_tests_instances/plugin_tests/behavior_test_plugin_version.cpp +++ b/inference-engine/tests_deprecated/behavior/mkldnn/shared_tests_instances/plugin_tests/behavior_test_plugin_version.cpp @@ -5,4 +5,4 @@ #include "behavior_test_plugin_version.hpp" #include "mkldnn_test_data.hpp" -INSTANTIATE_TEST_CASE_P(BehaviorTest, BehaviorPluginTestVersion, ValuesIn(add_element_into_array(supportedValues, BEH_HETERO)), getTestCaseName); +INSTANTIATE_TEST_CASE_P(smoke_BehaviorTest, BehaviorPluginTestVersion, ValuesIn(add_element_into_array(supportedValues, BEH_HETERO)), getTestCaseName); diff --git a/inference-engine/tests_deprecated/behavior/mkldnn/shared_tests_instances/plugin_tests/mkldnn_test_data.hpp b/inference-engine/tests_deprecated/behavior/mkldnn/shared_tests_instances/plugin_tests/mkldnn_test_data.hpp index 7f7f36ec9ed..71539e2ea1b 100644 --- a/inference-engine/tests_deprecated/behavior/mkldnn/shared_tests_instances/plugin_tests/mkldnn_test_data.hpp +++ b/inference-engine/tests_deprecated/behavior/mkldnn/shared_tests_instances/plugin_tests/mkldnn_test_data.hpp @@ -17,21 +17,39 @@ FuncTestUtils::TestModel::convReluNormPoolFcModelFP32.model_xml_str, \ FuncTestUtils::TestModel::convReluNormPoolFcModelFP32.weights_blob, \ Precision::FP32) +// for multi-device we are testing the fp16 (as it is supported by all device combos we are considering for testing +// e.g. GPU and VPU, for CPU the network is automatically (internally) converted to fp32. +// Yet the input precision FP16 is not supported by the CPU yet +const std::map multi_device_conf = {{MultiDeviceConfigParams::KEY_MULTI_DEVICE_PRIORITIES, "CPU"}}; +#define BEH_MULTI BehTestParams("MULTI", \ + FuncTestUtils::TestModel::convReluNormPoolFcModelFP16.model_xml_str, \ + FuncTestUtils::TestModel::convReluNormPoolFcModelFP16.weights_blob, \ + Precision::FP32, \ + multi_device_conf) // all parameters are unsupported - reversed #define BEH_US_ALL_MKLDNN BehTestParams("CPU", \ FuncTestUtils::TestModel::convReluNormPoolFcModelQ78.model_xml_str, \ FuncTestUtils::TestModel::convReluNormPoolFcModelQ78.weights_blob, \ Precision::Q78) +#define BEH_US_ALL_MULTI BehTestParams("MULTI", \ + FuncTestUtils::TestModel::convReluNormPoolFcModelQ78.model_xml_str, \ + FuncTestUtils::TestModel::convReluNormPoolFcModelQ78.weights_blob, \ + Precision::Q78, \ + multi_device_conf) const BehTestParams supportedValues[] = { BEH_MKLDNN, + BEH_MULTI, }; const BehTestParams requestsSupportedValues[] = { BEH_MKLDNN, // the following adds additional test the MKLDNNGraphlessInferRequest (explicitly created for streams) BEH_MKLDNN.withConfig({{KEY_CPU_THROUGHPUT_STREAMS, CPU_THROUGHPUT_AUTO}}), + BEH_MKLDNN.withConfig({{CONFIG_KEY(CPU_THROUGHPUT_STREAMS),"0"}, + {CONFIG_KEY(CPU_THREADS_NUM), "1"}}), + BEH_MULTI, }; const BehTestParams allInputSupportedValues[] = { @@ -50,21 +68,36 @@ const BehTestParams allInputSupportedValues[] = { BEH_MKLDNN_FP16.withIn(Precision::U8).withConfig({{KEY_CPU_THROUGHPUT_STREAMS, CPU_THROUGHPUT_AUTO}}), BEH_MKLDNN_FP16.withIn(Precision::U16).withConfig({{KEY_CPU_THROUGHPUT_STREAMS, CPU_THROUGHPUT_AUTO}}), BEH_MKLDNN_FP16.withIn(Precision::I16).withConfig({{KEY_CPU_THROUGHPUT_STREAMS, CPU_THROUGHPUT_AUTO}}), + BEH_MULTI, + BEH_MULTI.withIn(Precision::U8), + BEH_MULTI.withIn(Precision::U16), + BEH_MULTI.withIn(Precision::I16), + BEH_MULTI.withIn(Precision::U8).withConfig({{MultiDeviceConfigParams::KEY_MULTI_DEVICE_PRIORITIES, "CPU"}, + {KEY_CPU_THROUGHPUT_STREAMS, CPU_THROUGHPUT_AUTO}}), + BEH_MULTI.withIn(Precision::U16).withConfig({{MultiDeviceConfigParams::KEY_MULTI_DEVICE_PRIORITIES, "CPU"}, + {KEY_CPU_THROUGHPUT_STREAMS, CPU_THROUGHPUT_AUTO}}), + BEH_MULTI.withIn(Precision::I16).withConfig({{MultiDeviceConfigParams::KEY_MULTI_DEVICE_PRIORITIES, "CPU"}, + {KEY_CPU_THROUGHPUT_STREAMS, CPU_THROUGHPUT_AUTO}}), }; const BehTestParams allOutputSupportedValues[] = { BEH_MKLDNN, // the following withConfig test checks the MKLDNNGraphlessInferRequest (explicitly created for streams) BEH_MKLDNN.withConfig({{KEY_CPU_THROUGHPUT_STREAMS, CPU_THROUGHPUT_AUTO}}), + BEH_MULTI.withOut(Precision::FP32), + BEH_MULTI.withConfig({{MultiDeviceConfigParams::KEY_MULTI_DEVICE_PRIORITIES, "CPU"}, + {KEY_CPU_THROUGHPUT_STREAMS, CPU_THROUGHPUT_AUTO}}), }; const BehTestParams typeUnSupportedValues[] = { BEH_MKLDNN.withIn(Precision::Q78), BEH_MKLDNN_FP16, + BEH_MULTI.withIn(Precision::Q78), }; const BehTestParams allUnSupportedValues[] = { BEH_US_ALL_MKLDNN, + BEH_US_ALL_MULTI, }; const std::vector withCorrectConfValues = { @@ -74,20 +107,40 @@ const std::vector withCorrectConfValues = { BEH_MKLDNN.withConfig({{KEY_CPU_BIND_THREAD, NO}}), BEH_MKLDNN.withConfig({{KEY_CPU_BIND_THREAD, YES}}), BEH_MKLDNN.withConfig({{KEY_DYN_BATCH_LIMIT, "10"}}), + BEH_MULTI.withConfig({{MultiDeviceConfigParams::KEY_MULTI_DEVICE_PRIORITIES, "CPU"}, + {KEY_CPU_THROUGHPUT_STREAMS, CPU_THROUGHPUT_NUMA}}), + BEH_MULTI.withConfig({{MultiDeviceConfigParams::KEY_MULTI_DEVICE_PRIORITIES, "CPU"}, + {KEY_CPU_THROUGHPUT_STREAMS, CPU_THROUGHPUT_AUTO}}), + BEH_MULTI.withConfig({{MultiDeviceConfigParams::KEY_MULTI_DEVICE_PRIORITIES, "CPU"}, + {KEY_CPU_THROUGHPUT_STREAMS, "8"}}), + BEH_MULTI.withConfig({{MultiDeviceConfigParams::KEY_MULTI_DEVICE_PRIORITIES, "CPU"}, + {KEY_CPU_BIND_THREAD, NO}}), + BEH_MULTI.withConfig({{MultiDeviceConfigParams::KEY_MULTI_DEVICE_PRIORITIES, "CPU"}, + {KEY_CPU_BIND_THREAD, YES}}), + BEH_MULTI.withConfig({{MultiDeviceConfigParams::KEY_MULTI_DEVICE_PRIORITIES, "CPU"}, + {KEY_DYN_BATCH_LIMIT, "10"}}), }; const BehTestParams withIncorrectConfValues[] = { BEH_MKLDNN.withConfig({{KEY_CPU_THROUGHPUT_STREAMS, "OFF"}}), BEH_MKLDNN.withConfig({{KEY_CPU_BIND_THREAD, "OFF"}}), BEH_MKLDNN.withConfig({{KEY_DYN_BATCH_LIMIT, "NAN"}}), + BEH_MULTI.withConfig({{MultiDeviceConfigParams::KEY_MULTI_DEVICE_PRIORITIES, "CPU"}, + {KEY_CPU_THROUGHPUT_STREAMS, "OFF"}}), + BEH_MULTI.withConfig({{MultiDeviceConfigParams::KEY_MULTI_DEVICE_PRIORITIES, "CPU"}, + {KEY_CPU_BIND_THREAD, "OFF"}}), + BEH_MULTI.withConfig({{MultiDeviceConfigParams::KEY_MULTI_DEVICE_PRIORITIES, "CPU"}, + {KEY_DYN_BATCH_LIMIT, "NAN"}}), }; const std::vector withCorrectConfValuesPluginOnly; const std::vector withCorrectConfValuesNetworkOnly = { BEH_MKLDNN.withConfig({}), + BEH_MULTI }; const BehTestParams withIncorrectConfKeys[] = { BEH_MKLDNN.withIncorrectConfigItem(), + BEH_MULTI.withIncorrectConfigItem(), }; diff --git a/inference-engine/tests_deprecated/behavior/shared_tests/CMakeLists.txt b/inference-engine/tests_deprecated/behavior/shared_tests/CMakeLists.txt index c570cb96907..942efa46e29 100644 --- a/inference-engine/tests_deprecated/behavior/shared_tests/CMakeLists.txt +++ b/inference-engine/tests_deprecated/behavior/shared_tests/CMakeLists.txt @@ -11,7 +11,7 @@ file(GLOB_RECURSE SHARED_TESTS_SRC ${CMAKE_CURRENT_SOURCE_DIR}/*.cpp ${CMAKE_CURRENT_SOURCE_DIR}/*.hpp) add_library(${TARGET_NAME} STATIC ${SHARED_TESTS_SRC}) -add_dependencies(${TARGET_NAME} inference_engine_preproc) +add_dependencies(${TARGET_NAME} MultiDevicePlugin inference_engine_preproc) target_include_directories(${TARGET_NAME} PUBLIC "${CMAKE_CURRENT_SOURCE_DIR}/plugin_tests") diff --git a/inference-engine/tests_deprecated/behavior/shared_tests/plugin_tests/behavior_test_plugin.h b/inference-engine/tests_deprecated/behavior/shared_tests/plugin_tests/behavior_test_plugin.h index c08d9ee1f9a..a1e593e3014 100644 --- a/inference-engine/tests_deprecated/behavior/shared_tests/plugin_tests/behavior_test_plugin.h +++ b/inference-engine/tests_deprecated/behavior/shared_tests/plugin_tests/behavior_test_plugin.h @@ -14,7 +14,7 @@ #include #include #include -#include +#include #include #include diff --git a/inference-engine/tests_deprecated/behavior/shared_tests/plugin_tests/behavior_test_plugin_config.hpp b/inference-engine/tests_deprecated/behavior/shared_tests/plugin_tests/behavior_test_plugin_config.hpp index 4edc6b5096d..7b43063ac71 100644 --- a/inference-engine/tests_deprecated/behavior/shared_tests/plugin_tests/behavior_test_plugin_config.hpp +++ b/inference-engine/tests_deprecated/behavior/shared_tests/plugin_tests/behavior_test_plugin_config.hpp @@ -193,7 +193,7 @@ TEST_P(BehaviorPluginCorrectConfigTestInferRequestAPI, reusableCPUStreamsExecuto // for multi-device the number of Executors is not known (defined by the devices configuration) } else { ASSERT_EQ(0u, ExecutorManager::getInstance()->getExecutorsNumber()); - ASSERT_GE(1u, ExecutorManager::getInstance()->getIdleCPUStreamsExecutorsNumber()); + ASSERT_GE(2u, ExecutorManager::getInstance()->getIdleCPUStreamsExecutorsNumber()); } } if (GetParam().device == CommonTestUtils::DEVICE_CPU) { diff --git a/inference-engine/tests_deprecated/behavior/shared_tests/plugin_tests/behavior_test_plugin_infer_request.hpp b/inference-engine/tests_deprecated/behavior/shared_tests/plugin_tests/behavior_test_plugin_infer_request.hpp index 38d520ea89d..b0fea6154d5 100644 --- a/inference-engine/tests_deprecated/behavior/shared_tests/plugin_tests/behavior_test_plugin_infer_request.hpp +++ b/inference-engine/tests_deprecated/behavior/shared_tests/plugin_tests/behavior_test_plugin_infer_request.hpp @@ -13,8 +13,11 @@ using namespace InferenceEngine::details; namespace { std::string getTestCaseName(testing::TestParamInfo obj) { - return obj.param.device + "_" + obj.param.input_blob_precision.name() - + (obj.param.config.size() ? "_" + obj.param.config.begin()->second : ""); + std::string config; + for (auto&& cfg : obj.param.config) { + config += "_" + cfg.first + "_" + cfg.second; + } + return obj.param.device + "_" + obj.param.input_blob_precision.name() + config; } } @@ -500,6 +503,15 @@ TEST_P(BehaviorPluginTestInferRequest, canWaitWithotStartAsync) { TEST_P(BehaviorPluginTestInferRequest, returnDeviceBusyOnSetBlobAfterAsyncInfer) { SKIP_IF_CURRENT_TEST_IS_DISABLED() + auto&& config = GetParam().config; + auto itConfig = config.find(CONFIG_KEY(CPU_THROUGHPUT_STREAMS)); + if (itConfig != config.end()) { + if (itConfig->second != "CPU_THROUGHPUT_AUTO") { + if (std::stoi(itConfig->second) == 0) { + GTEST_SKIP() << "Not applicable with disabled streams"; + } + } + } TestEnv::Ptr testEnv; ASSERT_NO_FATAL_FAILURE(_createAndCheckInferRequest(GetParam(), testEnv)); Blob::Ptr input; diff --git a/inference-engine/tests_deprecated/behavior/shared_tests/plugin_tests/behavior_test_plugin_infer_request_callback.hpp b/inference-engine/tests_deprecated/behavior/shared_tests/plugin_tests/behavior_test_plugin_infer_request_callback.hpp index 08c98f7063c..75565eafddd 100644 --- a/inference-engine/tests_deprecated/behavior/shared_tests/plugin_tests/behavior_test_plugin_infer_request_callback.hpp +++ b/inference-engine/tests_deprecated/behavior/shared_tests/plugin_tests/behavior_test_plugin_infer_request_callback.hpp @@ -13,8 +13,11 @@ using namespace InferenceEngine::details; namespace { std::string getTestCaseName(testing::TestParamInfo obj) { - return obj.param.device + "_" + obj.param.input_blob_precision.name() - + (obj.param.config.size() ? "_" + obj.param.config.begin()->second : ""); + std::string config; + for (auto&& cfg : obj.param.config) { + config += "_" + cfg.first + "_" + cfg.second; + } + return obj.param.device + "_" + obj.param.input_blob_precision.name() + config; } } diff --git a/inference-engine/tests_deprecated/behavior/shared_tests/plugin_tests/behavior_test_plugin_set_preprocess.hpp b/inference-engine/tests_deprecated/behavior/shared_tests/plugin_tests/behavior_test_plugin_set_preprocess.hpp index 8b17573a1b5..0881e51dd57 100644 --- a/inference-engine/tests_deprecated/behavior/shared_tests/plugin_tests/behavior_test_plugin_set_preprocess.hpp +++ b/inference-engine/tests_deprecated/behavior/shared_tests/plugin_tests/behavior_test_plugin_set_preprocess.hpp @@ -3,7 +3,6 @@ // #include "behavior_test_plugin.h" -#include using namespace std; using namespace ::testing; diff --git a/inference-engine/tests_deprecated/behavior/shared_tests/plugin_tests/behavior_test_plugins.hpp b/inference-engine/tests_deprecated/behavior/shared_tests/plugin_tests/behavior_test_plugins.hpp index 99c225ef11a..f94a71a725b 100644 --- a/inference-engine/tests_deprecated/behavior/shared_tests/plugin_tests/behavior_test_plugins.hpp +++ b/inference-engine/tests_deprecated/behavior/shared_tests/plugin_tests/behavior_test_plugins.hpp @@ -68,7 +68,7 @@ IE_SUPPRESS_DEPRECATED_END class BehaviorPluginTestInput : public BehaviorPluginTest { }; class BehaviorPluginTestOutput : public BehaviorPluginTest { }; -TEST_F(BehaviorPluginTest, AllocateNullBlob) { +TEST_F(BehaviorPluginTest, smoke_llocateNullBlob) { TensorDesc tdesc = TensorDesc(Precision::FP32, NCHW); InferenceEngine::TBlob blob(tdesc); ASSERT_NO_THROW(blob.allocate()); diff --git a/inference-engine/tests_deprecated/behavior/vpu/CMakeLists.txt b/inference-engine/tests_deprecated/behavior/vpu/CMakeLists.txt index 99c6d89691e..217a2aa9e39 100644 --- a/inference-engine/tests_deprecated/behavior/vpu/CMakeLists.txt +++ b/inference-engine/tests_deprecated/behavior/vpu/CMakeLists.txt @@ -66,8 +66,8 @@ function(enable_vpu TARGET_NAME FLAG_NAME PLUGIN_NAME) target_link_libraries(${TARGET_NAME} PRIVATE mvnc) endif() - add_test(NAME ${TARGET_NAME} - COMMAND ${TARGET_NAME}) + add_test(NAME ${TARGET_NAME} COMMAND ${TARGET_NAME}) + set_property(TEST ${TARGET_NAME} PROPERTY LABELS VPU MYRIAD) add_dependencies(${TARGET_NAME} ${DEPENDENCIES}) endfunction(enable_vpu) diff --git a/inference-engine/tests_deprecated/behavior/vpu/myriad_tests/aot_behavior_tests.cpp b/inference-engine/tests_deprecated/behavior/vpu/myriad_tests/aot_behavior_tests.cpp index 66f79723549..40eb1684d49 100644 --- a/inference-engine/tests_deprecated/behavior/vpu/myriad_tests/aot_behavior_tests.cpp +++ b/inference-engine/tests_deprecated/behavior/vpu/myriad_tests/aot_behavior_tests.cpp @@ -204,6 +204,6 @@ const BehTestParams vpuValues[] = { BEH_MYRIAD, }; -INSTANTIATE_TEST_CASE_P(BehaviorTest, AOTBehaviorTests, ValuesIn(vpuValues), getTestCaseName); +INSTANTIATE_TEST_CASE_P(smoke_BehaviorTest, AOTBehaviorTests, ValuesIn(vpuValues), getTestCaseName); #endif diff --git a/inference-engine/tests_deprecated/behavior/vpu/myriad_tests/vpu_boot_tests.cpp b/inference-engine/tests_deprecated/behavior/vpu/myriad_tests/vpu_boot_tests.cpp index 8525def9fba..20142b85c4f 100644 --- a/inference-engine/tests_deprecated/behavior/vpu/myriad_tests/vpu_boot_tests.cpp +++ b/inference-engine/tests_deprecated/behavior/vpu/myriad_tests/vpu_boot_tests.cpp @@ -112,4 +112,4 @@ const BehTestParams vpuValues[] = { BEH_MYRIAD, }; -INSTANTIATE_TEST_CASE_P(BehaviorTest, MYRIADBoot, ValuesIn(vpuValues), getTestCaseName); +INSTANTIATE_TEST_CASE_P(smoke_BehaviorTest, MYRIADBoot, ValuesIn(vpuValues), getTestCaseName); diff --git a/inference-engine/tests_deprecated/behavior/vpu/myriad_tests/vpu_get_metric_tests.cpp b/inference-engine/tests_deprecated/behavior/vpu/myriad_tests/vpu_get_metric_tests.cpp index 890fb3bd91e..6555a67709e 100644 --- a/inference-engine/tests_deprecated/behavior/vpu/myriad_tests/vpu_get_metric_tests.cpp +++ b/inference-engine/tests_deprecated/behavior/vpu/myriad_tests/vpu_get_metric_tests.cpp @@ -26,7 +26,7 @@ protected: } }; -TEST_F(VPUGetMetric, GetThermalStatsFromNetwork) { +TEST_F(VPUGetMetric, smoke_GetThermalStatsFromNetwork) { const auto exe_network = loadNetworkOnDevice("MYRIAD"); auto result = Parameter{}; @@ -36,7 +36,7 @@ TEST_F(VPUGetMetric, GetThermalStatsFromNetwork) { ASSERT_GT(result.as(), 0); } -TEST_F(VPUGetMetric, GetThermalStatsFromPlugin) { +TEST_F(VPUGetMetric, smoke_GetThermalStatsFromPlugin) { std::vector availableDevices; ASSERT_NO_THROW(availableDevices = getAvailableDevices()); ASSERT_TRUE(!availableDevices.empty()); @@ -53,7 +53,7 @@ TEST_F(VPUGetMetric, GetThermalStatsFromPlugin) { } } -TEST_F(VPUGetMetric, ThermalStatsFromPluginWithIncorrectID) { +TEST_F(VPUGetMetric, smoke_ThermalStatsFromPluginWithIncorrectID) { std::vector availableDevices; ASSERT_NO_THROW(availableDevices = getAvailableDevices()); ASSERT_TRUE(!availableDevices.empty()); @@ -70,7 +70,7 @@ TEST_F(VPUGetMetric, ThermalStatsFromPluginWithIncorrectID) { ASSERT_TRUE(result.empty()); } -TEST_F(VPUGetMetric, ThermalStatsFromPluginWithoutLoadedNetwork) { +TEST_F(VPUGetMetric, smoke_ThermalStatsFromPluginWithoutLoadedNetwork) { std::vector availableDevices; ASSERT_NO_THROW(availableDevices = getAvailableDevices()); ASSERT_TRUE(!availableDevices.empty()); @@ -83,7 +83,7 @@ TEST_F(VPUGetMetric, ThermalStatsFromPluginWithoutLoadedNetwork) { ASSERT_TRUE(result.empty()); } -TEST_F(VPUGetMetric, MyriadGetAvailableDevices) { +TEST_F(VPUGetMetric, smoke_MyriadGetAvailableDevices) { std::vector availableDevices; ASSERT_NO_THROW(availableDevices = getAvailableDevices()); ASSERT_TRUE(!availableDevices.empty()); diff --git a/inference-engine/tests_deprecated/behavior/vpu/myriad_tests/vpu_load_network_tests.cpp b/inference-engine/tests_deprecated/behavior/vpu/myriad_tests/vpu_load_network_tests.cpp index eb4baabc986..fa470686981 100644 --- a/inference-engine/tests_deprecated/behavior/vpu/myriad_tests/vpu_load_network_tests.cpp +++ b/inference-engine/tests_deprecated/behavior/vpu/myriad_tests/vpu_load_network_tests.cpp @@ -8,12 +8,12 @@ #include "behavior_test_plugin.h" #include "helpers/myriad_load_network_case.hpp" -TEST_F(MyriadLoadNetworkTestCase, ReloadPlugin) { +TEST_F(MyriadLoadNetworkTestCase, smoke_ReloadPlugin) { ASSERT_NO_THROW(LoadNetwork()); ASSERT_NO_THROW(LoadNetwork()); } -TEST_F(MyriadLoadNetworkTestCase, SimpleLoading) { +TEST_F(MyriadLoadNetworkTestCase, smoke_SimpleLoading) { auto devices = getDevicesList(); ASSERT_TRUE(devices.size()); @@ -28,7 +28,7 @@ TEST_F(MyriadLoadNetworkTestCase, SimpleLoading) { ASSERT_TRUE(!IsDeviceAvailable(device_to_load)); } -TEST_F(MyriadLoadNetworkTestCase, LoadingAtTheSameDevice) { +TEST_F(MyriadLoadNetworkTestCase, smoke_LoadingAtTheSameDevice) { auto devices = getDevicesList(); ASSERT_TRUE(devices.size()); @@ -46,7 +46,7 @@ TEST_F(MyriadLoadNetworkTestCase, LoadingAtTheSameDevice) { ie->LoadNetwork(cnnNetwork, "MYRIAD", config)); } -TEST_F(MyriadLoadNetworkTestCase, ThrowsExeptionWhenNameIsInvalid) { +TEST_F(MyriadLoadNetworkTestCase, smoke_ThrowsExeptionWhenNameIsInvalid) { auto device_to_load = "SomeVeryBadName"; std::map config = { {KEY_DEVICE_ID, device_to_load}, @@ -56,7 +56,7 @@ TEST_F(MyriadLoadNetworkTestCase, ThrowsExeptionWhenNameIsInvalid) { ie->LoadNetwork(cnnNetwork, "MYRIAD", config)); } -TEST_F(MyriadLoadNetworkTestCase, ThrowsExeptionWhenPlatformConflictWithProtocol) { +TEST_F(MyriadLoadNetworkTestCase, smoke_ThrowsExeptionWhenPlatformConflictWithProtocol) { std::string wrong_platform; auto devices = getDevicesList(); ASSERT_TRUE(devices.size()); diff --git a/inference-engine/tests_deprecated/behavior/vpu/myriad_tests/vpu_protocol_tests.cpp b/inference-engine/tests_deprecated/behavior/vpu/myriad_tests/vpu_protocol_tests.cpp index 76e201a1220..d66b56ed36a 100644 --- a/inference-engine/tests_deprecated/behavior/vpu/myriad_tests/vpu_protocol_tests.cpp +++ b/inference-engine/tests_deprecated/behavior/vpu/myriad_tests/vpu_protocol_tests.cpp @@ -26,7 +26,7 @@ TEST_P(MyriadProtocolTests, CanInferenceWithProtocol) { ASSERT_EQ(statusCode, StatusCode::OK) << resp.msg; } -INSTANTIATE_TEST_CASE_P(VPUConfigProtocolTests, +INSTANTIATE_TEST_CASE_P(smoke_VPUConfigProtocolTests, MyriadProtocolTests, ::testing::ValuesIn(myriadProtocols), MyriadProtocolTests::getTestCaseName); \ No newline at end of file diff --git a/inference-engine/tests_deprecated/behavior/vpu/myriad_tests/vpu_watchdog_tests.cpp b/inference-engine/tests_deprecated/behavior/vpu/myriad_tests/vpu_watchdog_tests.cpp index a20cb244b16..eec34b12bbf 100644 --- a/inference-engine/tests_deprecated/behavior/vpu/myriad_tests/vpu_watchdog_tests.cpp +++ b/inference-engine/tests_deprecated/behavior/vpu/myriad_tests/vpu_watchdog_tests.cpp @@ -235,4 +235,4 @@ const BehTestParams vpuValues[] = { BEH_MYRIAD, }; -INSTANTIATE_TEST_CASE_P(BehaviorTest, MYRIADWatchdog, ValuesIn(vpuValues), getTestCaseName); +INSTANTIATE_TEST_CASE_P(smoke_BehaviorTest, MYRIADWatchdog, ValuesIn(vpuValues), getTestCaseName); diff --git a/inference-engine/tests_deprecated/behavior/vpu/shared_tests_instances/cpp_wrappers/holders_tests.cpp b/inference-engine/tests_deprecated/behavior/vpu/shared_tests_instances/cpp_wrappers/holders_tests.cpp index eaa3e591b27..cd57d39fadf 100644 --- a/inference-engine/tests_deprecated/behavior/vpu/shared_tests_instances/cpp_wrappers/holders_tests.cpp +++ b/inference-engine/tests_deprecated/behavior/vpu/shared_tests_instances/cpp_wrappers/holders_tests.cpp @@ -4,7 +4,7 @@ #include "holders_tests.hpp" -INSTANTIATE_TEST_CASE_P(ReleaseOrderTests, CPP_HoldersTests, testing::Combine(testing::ValuesIn(std::vector> { +INSTANTIATE_TEST_CASE_P(smoke_ReleaseOrderTests, CPP_HoldersTests, testing::Combine(testing::ValuesIn(std::vector> { // 0 - plugin // 1 - executable_network // 2 - infer_request diff --git a/inference-engine/tests_deprecated/behavior/vpu/shared_tests_instances/plugin_tests/behavior_test_plugin.cpp b/inference-engine/tests_deprecated/behavior/vpu/shared_tests_instances/plugin_tests/behavior_test_plugin.cpp index 4ff0124ecf9..44b689cec12 100644 --- a/inference-engine/tests_deprecated/behavior/vpu/shared_tests_instances/plugin_tests/behavior_test_plugin.cpp +++ b/inference-engine/tests_deprecated/behavior/vpu/shared_tests_instances/plugin_tests/behavior_test_plugin.cpp @@ -6,9 +6,9 @@ #include "behavior_test_plugins.hpp" #include "vpu_test_data.hpp" -INSTANTIATE_TEST_CASE_P(BehaviorTest, BehaviorPluginTest, ValuesIn(supportedValues), +INSTANTIATE_TEST_CASE_P(smoke_BehaviorTest, BehaviorPluginTest, ValuesIn(supportedValues), getTestCaseName); -INSTANTIATE_TEST_CASE_P(BehaviorTest, BehaviorPluginTestInput, ValuesIn(allInputSupportedValues), +INSTANTIATE_TEST_CASE_P(smoke_BehaviorTest, BehaviorPluginTestInput, ValuesIn(allInputSupportedValues), getTestCaseName); -INSTANTIATE_TEST_CASE_P(BehaviorTest, BehaviorPluginTestOutput, ValuesIn(allOutputSupportedValues), +INSTANTIATE_TEST_CASE_P(smoke_BehaviorTest, BehaviorPluginTestOutput, ValuesIn(allOutputSupportedValues), getOutputTestCaseName); diff --git a/inference-engine/tests_deprecated/behavior/vpu/shared_tests_instances/plugin_tests/behavior_test_plugin_config.cpp b/inference-engine/tests_deprecated/behavior/vpu/shared_tests_instances/plugin_tests/behavior_test_plugin_config.cpp index b33e8e855a0..f70454633ca 100644 --- a/inference-engine/tests_deprecated/behavior/vpu/shared_tests_instances/plugin_tests/behavior_test_plugin_config.cpp +++ b/inference-engine/tests_deprecated/behavior/vpu/shared_tests_instances/plugin_tests/behavior_test_plugin_config.cpp @@ -6,7 +6,7 @@ #include "vpu_test_data.hpp" INSTANTIATE_TEST_CASE_P( - BehaviorTest, BehaviorPluginCorrectConfigTest, + smoke_BehaviorTest, BehaviorPluginCorrectConfigTest, ValuesIn( BehTestParams::concat( BehTestParams::concat(deviceSpecificConfigurations, deviceAgnosticConfigurations), @@ -16,13 +16,13 @@ INSTANTIATE_TEST_CASE_P( getTestCaseName ); -INSTANTIATE_TEST_CASE_P(BehaviorTest, BehaviorPluginIncorrectConfigTest, ValuesIn(withIncorrectConfValues), +INSTANTIATE_TEST_CASE_P(smoke_BehaviorTest, BehaviorPluginIncorrectConfigTest, ValuesIn(withIncorrectConfValues), getTestCaseName); -INSTANTIATE_TEST_CASE_P(BehaviorTest, BehaviorPluginIncorrectConfigTestInferRequestAPI, +INSTANTIATE_TEST_CASE_P(smoke_BehaviorTest, BehaviorPluginIncorrectConfigTestInferRequestAPI, ValuesIn(withIncorrectConfKeys), getTestCaseName); -INSTANTIATE_TEST_CASE_P(BehaviorTest, BehaviorPluginCorrectConfigTestInferRequestAPI, +INSTANTIATE_TEST_CASE_P(smoke_BehaviorTest, BehaviorPluginCorrectConfigTestInferRequestAPI, ValuesIn(supportedValues), getTestCaseName); diff --git a/inference-engine/tests_deprecated/behavior/vpu/shared_tests_instances/plugin_tests/behavior_test_plugin_exec_graph_info.cpp b/inference-engine/tests_deprecated/behavior/vpu/shared_tests_instances/plugin_tests/behavior_test_plugin_exec_graph_info.cpp index ab60df5fedd..f0eb203add9 100644 --- a/inference-engine/tests_deprecated/behavior/vpu/shared_tests_instances/plugin_tests/behavior_test_plugin_exec_graph_info.cpp +++ b/inference-engine/tests_deprecated/behavior/vpu/shared_tests_instances/plugin_tests/behavior_test_plugin_exec_graph_info.cpp @@ -7,7 +7,7 @@ // TODO: currently this tests are not applicable to myriadPlugin #if 0 -INSTANTIATE_TEST_CASE_P( +INSTANTIATE_TEST_CASE_P(smoke_ BehaviorTest, BehaviorPluginTestExecGraphInfo, ValuesIn(supportedValues), diff --git a/inference-engine/tests_deprecated/behavior/vpu/shared_tests_instances/plugin_tests/behavior_test_plugin_infer_request.cpp b/inference-engine/tests_deprecated/behavior/vpu/shared_tests_instances/plugin_tests/behavior_test_plugin_infer_request.cpp index d05de675d0e..0721ad56ca8 100644 --- a/inference-engine/tests_deprecated/behavior/vpu/shared_tests_instances/plugin_tests/behavior_test_plugin_infer_request.cpp +++ b/inference-engine/tests_deprecated/behavior/vpu/shared_tests_instances/plugin_tests/behavior_test_plugin_infer_request.cpp @@ -5,4 +5,4 @@ #include "behavior_test_plugin_infer_request.hpp" #include "vpu_test_data.hpp" -INSTANTIATE_TEST_CASE_P(BehaviorTest, BehaviorPluginTestInferRequest, ValuesIn(requestsSupportedValues), getTestCaseName); +INSTANTIATE_TEST_CASE_P(smoke_BehaviorTest, BehaviorPluginTestInferRequest, ValuesIn(requestsSupportedValues), getTestCaseName); diff --git a/inference-engine/tests_deprecated/behavior/vpu/shared_tests_instances/plugin_tests/behavior_test_plugin_infer_request_callback.cpp b/inference-engine/tests_deprecated/behavior/vpu/shared_tests_instances/plugin_tests/behavior_test_plugin_infer_request_callback.cpp index 24daac13c3a..14db00a1912 100644 --- a/inference-engine/tests_deprecated/behavior/vpu/shared_tests_instances/plugin_tests/behavior_test_plugin_infer_request_callback.cpp +++ b/inference-engine/tests_deprecated/behavior/vpu/shared_tests_instances/plugin_tests/behavior_test_plugin_infer_request_callback.cpp @@ -5,5 +5,5 @@ #include "behavior_test_plugin_infer_request_callback.hpp" #include "vpu_test_data.hpp" -INSTANTIATE_TEST_CASE_P(BehaviorTest, BehaviorPluginTestInferRequestCallback, ValuesIn(requestsSupportedValues), +INSTANTIATE_TEST_CASE_P(smoke_BehaviorTest, BehaviorPluginTestInferRequestCallback, ValuesIn(requestsSupportedValues), getTestCaseName); diff --git a/inference-engine/tests_deprecated/behavior/vpu/shared_tests_instances/plugin_tests/behavior_test_plugin_infer_request_config.cpp b/inference-engine/tests_deprecated/behavior/vpu/shared_tests_instances/plugin_tests/behavior_test_plugin_infer_request_config.cpp index 7b9db6b8754..437662c1592 100644 --- a/inference-engine/tests_deprecated/behavior/vpu/shared_tests_instances/plugin_tests/behavior_test_plugin_infer_request_config.cpp +++ b/inference-engine/tests_deprecated/behavior/vpu/shared_tests_instances/plugin_tests/behavior_test_plugin_infer_request_config.cpp @@ -5,9 +5,9 @@ #include "behavior_test_plugin_infer_request_config.hpp" #include "vpu_test_data.hpp" -INSTANTIATE_TEST_CASE_P(BehaviorTest, BehaviorPluginTestInferRequestConfig, +INSTANTIATE_TEST_CASE_P(smoke_BehaviorTest, BehaviorPluginTestInferRequestConfig, ValuesIn(BehTestParams::concat(deviceAgnosticConfigurations, withCorrectConfValuesNetworkOnly)), getConfigTestCaseName); -INSTANTIATE_TEST_CASE_P(BehaviorTest, BehaviorPluginTestInferRequestConfigExclusiveAsync, ValuesIn(supportedValues), +INSTANTIATE_TEST_CASE_P(smoke_BehaviorTest, BehaviorPluginTestInferRequestConfigExclusiveAsync, ValuesIn(supportedValues), getConfigTestCaseName); diff --git a/inference-engine/tests_deprecated/behavior/vpu/shared_tests_instances/plugin_tests/behavior_test_plugin_infer_request_input.cpp b/inference-engine/tests_deprecated/behavior/vpu/shared_tests_instances/plugin_tests/behavior_test_plugin_infer_request_input.cpp index cdde2469ae8..e8633b7b08f 100644 --- a/inference-engine/tests_deprecated/behavior/vpu/shared_tests_instances/plugin_tests/behavior_test_plugin_infer_request_input.cpp +++ b/inference-engine/tests_deprecated/behavior/vpu/shared_tests_instances/plugin_tests/behavior_test_plugin_infer_request_input.cpp @@ -5,5 +5,5 @@ #include "behavior_test_plugin_infer_request_input.hpp" #include "vpu_test_data.hpp" -INSTANTIATE_TEST_CASE_P(BehaviorTest, BehaviorPluginTestInferRequestInput, ValuesIn(allInputSupportedValues), +INSTANTIATE_TEST_CASE_P(smoke_BehaviorTest, BehaviorPluginTestInferRequestInput, ValuesIn(allInputSupportedValues), getTestCaseName); diff --git a/inference-engine/tests_deprecated/behavior/vpu/shared_tests_instances/plugin_tests/behavior_test_plugin_infer_request_output.cpp b/inference-engine/tests_deprecated/behavior/vpu/shared_tests_instances/plugin_tests/behavior_test_plugin_infer_request_output.cpp index fb6812220bf..c7e891db1b2 100644 --- a/inference-engine/tests_deprecated/behavior/vpu/shared_tests_instances/plugin_tests/behavior_test_plugin_infer_request_output.cpp +++ b/inference-engine/tests_deprecated/behavior/vpu/shared_tests_instances/plugin_tests/behavior_test_plugin_infer_request_output.cpp @@ -5,5 +5,5 @@ #include "behavior_test_plugin_infer_request_output.hpp" #include "vpu_test_data.hpp" -INSTANTIATE_TEST_CASE_P(BehaviorTest, BehaviorPluginTestInferRequestOutput, ValuesIn(allOutputSupportedValues), +INSTANTIATE_TEST_CASE_P(smoke_BehaviorTest, BehaviorPluginTestInferRequestOutput, ValuesIn(allOutputSupportedValues), getOutputTestCaseName); diff --git a/inference-engine/tests_deprecated/behavior/vpu/shared_tests_instances/plugin_tests/behavior_test_plugin_layers.cpp b/inference-engine/tests_deprecated/behavior/vpu/shared_tests_instances/plugin_tests/behavior_test_plugin_layers.cpp index 86c076e1e18..845c8858f40 100644 --- a/inference-engine/tests_deprecated/behavior/vpu/shared_tests_instances/plugin_tests/behavior_test_plugin_layers.cpp +++ b/inference-engine/tests_deprecated/behavior/vpu/shared_tests_instances/plugin_tests/behavior_test_plugin_layers.cpp @@ -8,7 +8,7 @@ pool_test_params roi_pool_test_cases[] = { pool_test_params(CommonTestUtils::DEVICE_MYRIAD, "FP16", pool_case), }; -INSTANTIATE_TEST_CASE_P(BehaviorTest, ROIPoolingLayerTest, +INSTANTIATE_TEST_CASE_P(smoke_BehaviorTest, ROIPoolingLayerTest, ::testing::ValuesIn(roi_pool_test_cases), getTestName); @@ -18,7 +18,7 @@ memory_test_params memory_test_cases[] = { // FIXME //#if (defined INSTANTIATE_TESTS) -//INSTANTIATE_TEST_CASE_P(BehaviorTest, MemoryLayerTest, +//INSTANTIATE_TEST_CASE_P(smoke_BehaviorTest, MemoryLayerTest, // ::testing::ValuesIn(memory_test_cases), // getTestName); //#endif diff --git a/inference-engine/tests_deprecated/behavior/vpu/shared_tests_instances/plugin_tests/behavior_test_plugin_layout.cpp b/inference-engine/tests_deprecated/behavior/vpu/shared_tests_instances/plugin_tests/behavior_test_plugin_layout.cpp index c26895af4a0..623fe83445b 100644 --- a/inference-engine/tests_deprecated/behavior/vpu/shared_tests_instances/plugin_tests/behavior_test_plugin_layout.cpp +++ b/inference-engine/tests_deprecated/behavior/vpu/shared_tests_instances/plugin_tests/behavior_test_plugin_layout.cpp @@ -10,7 +10,7 @@ layout_test_params power_test_cases[] = { layout_test_params(CommonTestUtils::DEVICE_MYRIAD, "FP16", Layout::CHW, power_params({ { 3, 32, 16 } }, 2, 2, 2)), layout_test_params(CommonTestUtils::DEVICE_MYRIAD, "FP16", Layout::NCHW, power_params({ { 1, 3, 16, 16 } }, 2, 2, 2)), }; -INSTANTIATE_TEST_CASE_P(BehaviorTest, LayoutTestCanLoadPower, +INSTANTIATE_TEST_CASE_P(smoke_BehaviorTest, LayoutTestCanLoadPower, ::testing::ValuesIn(power_test_cases), getTestName); layout_test_params conv_neg_test_cases[] = { @@ -18,12 +18,12 @@ layout_test_params conv_neg_test_cases[] = { layout_test_params(CommonTestUtils::DEVICE_MYRIAD, "FP16", Layout::NC, power_params({ { 1, 3 } }, 2, 2, 2)), }; -INSTANTIATE_TEST_CASE_P(BehaviorTest, LayoutTestCanNotLoadConv, +INSTANTIATE_TEST_CASE_P(smoke_BehaviorTest, LayoutTestCanNotLoadConv, ::testing::ValuesIn(conv_neg_test_cases), getTestName); layout_test_params conv_test_cases[] = { layout_test_params(CommonTestUtils::DEVICE_MYRIAD, "FP16", Layout::CHW, power_params({ { 3, 32, 16 } }, 2, 2, 2)), layout_test_params(CommonTestUtils::DEVICE_MYRIAD, "FP16", Layout::NCHW, power_params({ { 1, 3, 16, 16 } }, 2, 2, 2)), }; - INSTANTIATE_TEST_CASE_P(BehaviorTest, LayoutTestCanLoadConv, + INSTANTIATE_TEST_CASE_P(smoke_BehaviorTest, LayoutTestCanLoadConv, ::testing::ValuesIn(conv_test_cases), getTestName); diff --git a/inference-engine/tests_deprecated/behavior/vpu/shared_tests_instances/plugin_tests/behavior_test_plugin_set_preprocess.cpp b/inference-engine/tests_deprecated/behavior/vpu/shared_tests_instances/plugin_tests/behavior_test_plugin_set_preprocess.cpp index 24a12342ebf..8fa9bbbd09f 100644 --- a/inference-engine/tests_deprecated/behavior/vpu/shared_tests_instances/plugin_tests/behavior_test_plugin_set_preprocess.cpp +++ b/inference-engine/tests_deprecated/behavior/vpu/shared_tests_instances/plugin_tests/behavior_test_plugin_set_preprocess.cpp @@ -5,7 +5,7 @@ #include "behavior_test_plugin_set_preprocess.hpp" #include "vpu_test_data.hpp" -INSTANTIATE_TEST_CASE_P(BehaviorTest, +INSTANTIATE_TEST_CASE_P(smoke_BehaviorTest, BehaviorPluginTestPreProcess, ValuesIn(supportedValues), getTestCaseName); diff --git a/inference-engine/tests_deprecated/behavior/vpu/shared_tests_instances/plugin_tests/behavior_test_plugin_unsupported.cpp b/inference-engine/tests_deprecated/behavior/vpu/shared_tests_instances/plugin_tests/behavior_test_plugin_unsupported.cpp index abe5a37eda3..c3a37c68e97 100644 --- a/inference-engine/tests_deprecated/behavior/vpu/shared_tests_instances/plugin_tests/behavior_test_plugin_unsupported.cpp +++ b/inference-engine/tests_deprecated/behavior/vpu/shared_tests_instances/plugin_tests/behavior_test_plugin_unsupported.cpp @@ -5,10 +5,10 @@ #include "behavior_test_plugin_unsupported.hpp" #include "vpu_test_data.hpp" -INSTANTIATE_TEST_CASE_P(BehaviorTest, BehaviorPluginTestAllUnsupported, ValuesIn(allUnSupportedValues), +INSTANTIATE_TEST_CASE_P(smoke_BehaviorTest, BehaviorPluginTestAllUnsupported, ValuesIn(allUnSupportedValues), getTestCaseName); -INSTANTIATE_TEST_CASE_P(BehaviorTest, BehaviorPluginTestTypeUnsupported, ValuesIn(typeUnSupportedValues), +INSTANTIATE_TEST_CASE_P(smoke_BehaviorTest, BehaviorPluginTestTypeUnsupported, ValuesIn(typeUnSupportedValues), getTestCaseName); - INSTANTIATE_TEST_CASE_P(BehaviorTest, BehaviorPluginTestBatchUnsupported, ValuesIn(batchUnSupportedValues), + INSTANTIATE_TEST_CASE_P(smoke_BehaviorTest, BehaviorPluginTestBatchUnsupported, ValuesIn(batchUnSupportedValues), getTestCaseName); diff --git a/inference-engine/tests_deprecated/behavior/vpu/shared_tests_instances/plugin_tests/behavior_test_plugin_version.cpp b/inference-engine/tests_deprecated/behavior/vpu/shared_tests_instances/plugin_tests/behavior_test_plugin_version.cpp index db9b742fdcd..aae56e3feb6 100644 --- a/inference-engine/tests_deprecated/behavior/vpu/shared_tests_instances/plugin_tests/behavior_test_plugin_version.cpp +++ b/inference-engine/tests_deprecated/behavior/vpu/shared_tests_instances/plugin_tests/behavior_test_plugin_version.cpp @@ -5,4 +5,4 @@ #include "behavior_test_plugin_version.hpp" #include "vpu_test_data.hpp" -INSTANTIATE_TEST_CASE_P(BehaviorTest, BehaviorPluginTestVersion, ValuesIn(add_element_into_array(supportedValues, BEH_HETERO)), getTestCaseName); +INSTANTIATE_TEST_CASE_P(smoke_BehaviorTest, BehaviorPluginTestVersion, ValuesIn(add_element_into_array(supportedValues, BEH_HETERO)), getTestCaseName); diff --git a/inference-engine/tests_deprecated/behavior/vpu/shared_tests_instances/plugin_tests/vpu_test_data.hpp b/inference-engine/tests_deprecated/behavior/vpu/shared_tests_instances/plugin_tests/vpu_test_data.hpp index 39ae92458ca..9858ad0858a 100644 --- a/inference-engine/tests_deprecated/behavior/vpu/shared_tests_instances/plugin_tests/vpu_test_data.hpp +++ b/inference-engine/tests_deprecated/behavior/vpu/shared_tests_instances/plugin_tests/vpu_test_data.hpp @@ -13,42 +13,67 @@ FuncTestUtils::TestModel::convReluNormPoolFcModelFP32.model_xml_str, \ FuncTestUtils::TestModel::convReluNormPoolFcModelFP32.weights_blob, \ Precision::FP32) +// for multi-device we are testing the fp16 (as it is supported by all device combos we are considering for testing +// e.g. GPU and VPU, for CPU the network is automatically (internally) converted to fp32. +#define BEH_MULTI(device) BehTestParams("MULTI", \ + FuncTestUtils::TestModel::convReluNormPoolFcModelFP16.model_xml_str, \ + FuncTestUtils::TestModel::convReluNormPoolFcModelFP16.weights_blob, \ + Precision::FP32, \ + {{MultiDeviceConfigParams::KEY_MULTI_DEVICE_PRIORITIES, #device}}) +#define BEH_MULTI_CONFIG BehTestParams("MULTI", \ + FuncTestUtils::TestModel::convReluNormPoolFcModelFP16.model_xml_str, \ + FuncTestUtils::TestModel::convReluNormPoolFcModelFP16.weights_blob, \ + Precision::FP32) // all parameters are unsupported - reversed #define BEH_US_ALL_MYRIAD BehTestParams("MYRIAD", \ FuncTestUtils::TestModel::convReluNormPoolFcModelQ78.model_xml_str, \ FuncTestUtils::TestModel::convReluNormPoolFcModelQ78.weights_blob, \ Precision::Q78) +#define BEH_US_ALL_MULTI(device) BehTestParams("MULTI", \ + FuncTestUtils::TestModel::convReluNormPoolFcModelQ78.model_xml_str, \ + FuncTestUtils::TestModel::convReluNormPoolFcModelQ78.weights_blob, \ + Precision::Q78, \ + {{MultiDeviceConfigParams::KEY_MULTI_DEVICE_PRIORITIES, #device}}) const BehTestParams supportedValues[] = { BEH_MYRIAD, + BEH_MULTI(MYRIAD), }; const BehTestParams requestsSupportedValues[] = { BEH_MYRIAD, + BEH_MULTI(MYRIAD), }; const BehTestParams allInputSupportedValues[] = { BEH_MYRIAD, BEH_MYRIAD.withIn(Precision::U8), BEH_MYRIAD.withIn(Precision::FP16), + BEH_MULTI(MYRIAD), BEH_MULTI(MYRIAD).withIn(Precision::U8), BEH_MULTI(MYRIAD).withIn(Precision::FP16), // I16 not supported yet - // (ISSUE-7979) [IE myriad] The plugin should support I16 format for Input + // (CVS-7979) [IE myriad] The plugin should support I16 format for Input //BEH_MYRIAD.withIn(Precision::I16), }; const BehTestParams allOutputSupportedValues[] = { BEH_MYRIAD, BEH_MYRIAD.withOut(Precision::FP16), + BEH_MULTI(MYRIAD), BEH_MULTI(MYRIAD).withOut(Precision::FP16), }; const BehTestParams typeUnSupportedValues[] = { BEH_MYRIAD.withIn(Precision::Q78), BEH_MYRIAD.withIn(Precision::U16), BEH_MYRIAD.withIn(Precision::I8), BEH_MYRIAD.withIn(Precision::I16), BEH_MYRIAD.withIn(Precision::I32), + BEH_MULTI(MYRIAD).withIn(Precision::Q78), BEH_MULTI(MYRIAD).withIn(Precision::U16), + BEH_MULTI(MYRIAD).withIn(Precision::I8), + BEH_MULTI(MYRIAD).withIn(Precision::I16), BEH_MULTI(MYRIAD).withIn(Precision::I32), }; const BehTestParams batchUnSupportedValues[] = { BEH_MYRIAD.withBatchSize(0), + BEH_MULTI(MYRIAD).withBatchSize(0), }; const BehTestParams allUnSupportedValues[] = { BEH_US_ALL_MYRIAD, + BEH_US_ALL_MULTI(MYRIAD), }; const std::vector deviceSpecificConfigurations = { @@ -78,6 +103,15 @@ const std::vector deviceAgnosticConfigurations = { BEH_MYRIAD.withConfig({{VPU_CONFIG_KEY(PRINT_RECEIVE_TENSOR_TIME), CONFIG_VALUE(YES)}}), BEH_MYRIAD.withConfig({{VPU_CONFIG_KEY(PRINT_RECEIVE_TENSOR_TIME), CONFIG_VALUE(NO)}}), + + BEH_MULTI_CONFIG.withConfig({ + {MultiDeviceConfigParams::KEY_MULTI_DEVICE_PRIORITIES, "MYRIAD"}, + {CONFIG_KEY(LOG_LEVEL), CONFIG_VALUE(LOG_DEBUG)} + }), + BEH_MULTI_CONFIG.withConfig({ + {MultiDeviceConfigParams::KEY_MULTI_DEVICE_PRIORITIES, "MYRIAD"}, + {VPU_CONFIG_KEY(HW_STAGES_OPTIMIZATION), CONFIG_VALUE(YES)} + }), }; const std::vector withCorrectConfValuesPluginOnly = { @@ -107,8 +141,22 @@ const BehTestParams withIncorrectConfValues[] = { BEH_MYRIAD.withConfig({{VPU_CONFIG_KEY(PRINT_RECEIVE_TENSOR_TIME), "ON"}}), BEH_MYRIAD.withConfig({{VPU_CONFIG_KEY(PRINT_RECEIVE_TENSOR_TIME), "OFF"}}), + + BEH_MULTI_CONFIG.withConfig({{MultiDeviceConfigParams::KEY_MULTI_DEVICE_PRIORITIES, "MYRIAD"}, + {VPU_CONFIG_KEY(HW_STAGES_OPTIMIZATION),"ON"}}), + BEH_MULTI_CONFIG.withConfig({{MultiDeviceConfigParams::KEY_MULTI_DEVICE_PRIORITIES, "MYRIAD"}, + {CONFIG_KEY(LOG_LEVEL), "VERBOSE"}}), + BEH_MULTI_CONFIG.withConfig({{MultiDeviceConfigParams::KEY_MULTI_DEVICE_PRIORITIES, "MYRIAD"}, + {VPU_CONFIG_KEY(IGNORE_IR_STATISTIC), "ON"}}), + BEH_MULTI_CONFIG.withConfig({{MultiDeviceConfigParams::KEY_MULTI_DEVICE_PRIORITIES, "MYRIAD"}, + {VPU_MYRIAD_CONFIG_KEY(PLATFORM), "-1"}}), + BEH_MULTI_CONFIG.withConfig({{MultiDeviceConfigParams::KEY_MULTI_DEVICE_PRIORITIES, "MYRIAD"}, + {VPU_MYRIAD_CONFIG_KEY(PLATFORM), "0"}}), + BEH_MULTI_CONFIG.withConfig({{MultiDeviceConfigParams::KEY_MULTI_DEVICE_PRIORITIES, "MYRIAD"}, + {VPU_MYRIAD_CONFIG_KEY(PLATFORM), "1"}}), }; const BehTestParams withIncorrectConfKeys[] = { BEH_MYRIAD.withIncorrectConfigItem(), + BEH_MULTI(MYRIAD).withIncorrectConfigItem(), }; diff --git a/inference-engine/tests_deprecated/fluid_preproc/CMakeLists.txt b/inference-engine/tests_deprecated/fluid_preproc/CMakeLists.txt index c7f9416ad75..840d5f80958 100644 --- a/inference-engine/tests_deprecated/fluid_preproc/CMakeLists.txt +++ b/inference-engine/tests_deprecated/fluid_preproc/CMakeLists.txt @@ -29,3 +29,6 @@ if(GAPI_TEST_PERF) else() target_compile_definitions(${TARGET} PRIVATE -DPERF_TEST=0) endif() + +add_test(NAME ${TARGET} COMMAND ${TARGET}) +set_property(TEST ${TARGET} PROPERTY LABELS IE PREPROC) diff --git a/inference-engine/tests_deprecated/functional/cldnn/CMakeLists.txt b/inference-engine/tests_deprecated/functional/cldnn/CMakeLists.txt index 88d6e04aace..76302d48e98 100644 --- a/inference-engine/tests_deprecated/functional/cldnn/CMakeLists.txt +++ b/inference-engine/tests_deprecated/functional/cldnn/CMakeLists.txt @@ -23,7 +23,6 @@ list(APPEND TEST_SRC ${CLDNN_TEST_SOURCES}) list(APPEND CLDNN_LIBS IESharedTests inference_engine_lp_transformations - inference_engine_ir_readers ${CLDNN__IOCL_ICD_LIBPATH}) # try to find VA libraries @@ -69,5 +68,5 @@ target_link_libraries(${TARGET_NAME} PRIVATE ${CLDNN_LIBS}) add_dependencies(${TARGET_NAME} ${DEPENDENCIES}) -add_test(NAME ${TARGET_NAME} - COMMAND ${TARGET_NAME}) +add_test(NAME ${TARGET_NAME} COMMAND ${TARGET_NAME}) +set_property(TEST ${TARGET_NAME} PROPERTY LABELS GPU) diff --git a/inference-engine/tests_deprecated/functional/gna/CMakeLists.txt b/inference-engine/tests_deprecated/functional/gna/CMakeLists.txt index 6528fe5cd66..35a90e87554 100644 --- a/inference-engine/tests_deprecated/functional/gna/CMakeLists.txt +++ b/inference-engine/tests_deprecated/functional/gna/CMakeLists.txt @@ -50,10 +50,8 @@ target_include_directories(${TARGET_NAME} add_dependencies(${TARGET_NAME} ${DEPENDENCIES}) -add_test(NAME ${TARGET_NAME} - COMMAND ${TARGET_NAME}) - -set_target_properties(${TARGET_NAME} PROPERTIES COMPILE_PDB_NAME ${TARGET_NAME}) +add_test(NAME ${TARGET_NAME} COMMAND ${TARGET_NAME}) +set_property(TEST ${TARGET_NAME} PROPERTY LABELS GNA) if(GNA_LIBRARY_VERSION STREQUAL "GNA1") target_compile_definitions(${TARGET_NAME} PRIVATE GNA1_LIB) diff --git a/inference-engine/tests_deprecated/functional/gna/shared_tests_instance/ie_class/ie_class.cpp b/inference-engine/tests_deprecated/functional/gna/shared_tests_instance/ie_class/ie_class.cpp index b984f0e4ab1..a83653b43d9 100644 --- a/inference-engine/tests_deprecated/functional/gna/shared_tests_instance/ie_class/ie_class.cpp +++ b/inference-engine/tests_deprecated/functional/gna/shared_tests_instance/ie_class/ie_class.cpp @@ -89,11 +89,10 @@ INSTANTIATE_TEST_CASE_P( INSTANTIATE_TEST_CASE_P( DISABLED_IEClassExecutableNetworkGetMetricTest, IEClassExecutableNetworkGetMetricTest_NETWORK_NAME, ::testing::Values("GNA", "MULTI:GNA", "HETERO:GNA")); -// -// TODO: this metric is not supported by the plugin + INSTANTIATE_TEST_CASE_P( - DISABLED_IEClassExecutableNetworkGetMetricTest, IEClassExecutableNetworkGetMetricTest_OPTIMAL_NUMBER_OF_INFER_REQUESTS, - ::testing::Values("GNA", "MULTI:GNA", "HETERO:GNA")); + IEClassExecutableNetworkGetMetricTest, IEClassExecutableNetworkGetMetricTest_OPTIMAL_NUMBER_OF_INFER_REQUESTS, + ::testing::Values("GNA"/*, "MULTI:GNA", "HETERO:GNA" */)); INSTANTIATE_TEST_CASE_P( IEClassExecutableNetworkGetMetricTest, IEClassExecutableNetworkGetMetricTest_ThrowsUnsupported, diff --git a/inference-engine/tests_deprecated/functional/mkldnn/CMakeLists.txt b/inference-engine/tests_deprecated/functional/mkldnn/CMakeLists.txt index 63a1f585c90..8947a8350f3 100644 --- a/inference-engine/tests_deprecated/functional/mkldnn/CMakeLists.txt +++ b/inference-engine/tests_deprecated/functional/mkldnn/CMakeLists.txt @@ -30,7 +30,6 @@ file(GLOB MKL_DNN_TEST_SOURCES list(APPEND MKL_DNN_LIBS IESharedTests inference_engine_lp_transformations - inference_engine_ir_readers ${Boost_REGEX_LIBRARY}) list(APPEND TEST_SRC ${MKL_DNN_TEST_SOURCES}) @@ -63,5 +62,5 @@ target_link_libraries(${TARGET_NAME} PRIVATE ${LIBRARIES}) add_dependencies(${TARGET_NAME} ${DEPENDENCIES}) -add_test(NAME ${TARGET_NAME} - COMMAND ${TARGET_NAME}) +add_test(NAME ${TARGET_NAME} COMMAND ${TARGET_NAME}) +set_property(TEST ${TARGET_NAME} PROPERTY LABELS CPU) diff --git a/inference-engine/tests_deprecated/functional/mkldnn/config_param_test/config_param_test.cpp b/inference-engine/tests_deprecated/functional/mkldnn/config_param_test/config_param_test.cpp index ae9ea61364b..2db8c491288 100644 --- a/inference-engine/tests_deprecated/functional/mkldnn/config_param_test/config_param_test.cpp +++ b/inference-engine/tests_deprecated/functional/mkldnn/config_param_test/config_param_test.cpp @@ -40,12 +40,13 @@ TEST_F(smoke_PropertyTest, onSplitConvConcat) { inferRequest1.Infer(); float* outRawDataWithConfig = inferRequest1.GetBlob(net.getOutputsInfo().begin()->first)->cbuffer().as(); - auto thr = FuncTestUtils::GetComparisonThreshold(InferenceEngine::Precision::FP32); + float thr1, thr2; + FuncTestUtils::GetComparisonThreshold(InferenceEngine::Precision::FP32, thr1, thr2); size_t outElementsCount = std::accumulate(begin(fnPtr->get_output_shape(0)), end(fnPtr->get_output_shape(0)), 1, std::multiplies()); - FuncTestUtils::compareRawBuffers(outRawData, outRawDataWithConfig, outElementsCount, - outElementsCount, - thr); + FuncTestUtils::compareRawBuffers(outRawData, outRawDataWithConfig, outElementsCount, outElementsCount, + FuncTestUtils::CompareType::ABS_AND_REL, + thr1, thr2); } diff --git a/inference-engine/tests_deprecated/functional/mkldnn/extensions_tests/extensions_test.cpp b/inference-engine/tests_deprecated/functional/mkldnn/extensions_tests/extensions_test.cpp index 4023b5ca708..a8b437d2c63 100644 --- a/inference-engine/tests_deprecated/functional/mkldnn/extensions_tests/extensions_test.cpp +++ b/inference-engine/tests_deprecated/functional/mkldnn/extensions_tests/extensions_test.cpp @@ -6,7 +6,6 @@ #include #include #include -#include #include #include #include @@ -386,36 +385,3 @@ TEST_F(smoke_ExtensionTest, MKLDNN_no_share_new_extension_between_engines) { std::shared_ptr ext(new NewTestExtension()); checkNotSharedExtensions(ext, "CPU"); } - -TEST_F(smoke_ExtensionTest, MULTI_delete_extension) { - try { - InferenceEngine::Core ie; - ie.GetVersions("MULTI"); - } catch (...) { - GTEST_SKIP(); - } - std::shared_ptr ext(new TestExtension()); - checkExtensionRemoved({"MultiDevice", ext, {{MultiDeviceConfigParams::KEY_MULTI_DEVICE_PRIORITIES, "CPU"}}}); -} - -TEST_F(smoke_ExtensionTest, MULTI_no_delete_extension_from_another_engine) { - try { - InferenceEngine::Core ie; - ie.GetVersions("MULTI"); - } catch (...) { - GTEST_SKIP(); - } - std::shared_ptr ext(new TestExtension()); - checkExtensionNotRemovedFromAnotherEngineObject({"MultiDevice", ext, {{MultiDeviceConfigParams::KEY_MULTI_DEVICE_PRIORITIES, "CPU"}}}); -} - -TEST_F(smoke_ExtensionTest, MULTI_no_share_extension_between_engines) { - try { - InferenceEngine::Core ie; - ie.GetVersions("MULTI"); - } catch (...) { - GTEST_SKIP(); - } - std::shared_ptr ext(new TestExtension()); - checkNotSharedExtensions(ext, "MULTI:CPU"); -} diff --git a/inference-engine/tests_deprecated/functional/mkldnn/shared_tests_instance/ie_class/ie_class.cpp b/inference-engine/tests_deprecated/functional/mkldnn/shared_tests_instance/ie_class/ie_class.cpp index e4c55c02dfd..09cb58e5c97 100644 --- a/inference-engine/tests_deprecated/functional/mkldnn/shared_tests_instance/ie_class/ie_class.cpp +++ b/inference-engine/tests_deprecated/functional/mkldnn/shared_tests_instance/ie_class/ie_class.cpp @@ -28,11 +28,11 @@ INSTANTIATE_TEST_CASE_P( INSTANTIATE_TEST_CASE_P( smoke_IEClassGetMetricTest, IEClassGetMetricTest_SUPPORTED_CONFIG_KEYS, - ::testing::Values("CPU", "HETERO")); + ::testing::Values("CPU", "MULTI", "HETERO")); INSTANTIATE_TEST_CASE_P( smoke_IEClassGetMetricTest, IEClassGetMetricTest_SUPPORTED_METRICS, - ::testing::Values("CPU", "HETERO")); + ::testing::Values("CPU", "MULTI", "HETERO")); INSTANTIATE_TEST_CASE_P( smoke_IEClassGetMetricTest, IEClassGetMetricTest_AVAILABLE_DEVICES, @@ -40,7 +40,7 @@ INSTANTIATE_TEST_CASE_P( INSTANTIATE_TEST_CASE_P( smoke_IEClassGetMetricTest, IEClassGetMetricTest_FULL_DEVICE_NAME, - ::testing::Values("CPU", "HETERO")); + ::testing::Values("CPU", "MULTI", "HETERO")); INSTANTIATE_TEST_CASE_P( smoke_IEClassGetMetricTest, IEClassGetMetricTest_OPTIMIZATION_CAPABILITIES, @@ -56,11 +56,11 @@ INSTANTIATE_TEST_CASE_P( INSTANTIATE_TEST_CASE_P( smoke_IEClassGetMetricTest, IEClassGetMetricTest_ThrowUnsupported, - ::testing::Values("CPU", "HETERO")); + ::testing::Values("CPU", "MULTI", "HETERO")); INSTANTIATE_TEST_CASE_P( smoke_IEClassGetConfigTest, IEClassGetConfigTest_ThrowUnsupported, - ::testing::Values("CPU", "HETERO")); + ::testing::Values("CPU", "MULTI", "HETERO")); INSTANTIATE_TEST_CASE_P( smoke_IEClassGetAvailableDevices, IEClassGetAvailableDevices, @@ -80,23 +80,23 @@ INSTANTIATE_TEST_CASE_P( INSTANTIATE_TEST_CASE_P( smoke_IEClassExecutableNetworkGetMetricTest, IEClassExecutableNetworkGetMetricTest_SUPPORTED_CONFIG_KEYS, - ::testing::Values("CPU", "HETERO:CPU")); + ::testing::Values("CPU", "MULTI:CPU", "HETERO:CPU")); INSTANTIATE_TEST_CASE_P( smoke_IEClassExecutableNetworkGetMetricTest, IEClassExecutableNetworkGetMetricTest_SUPPORTED_METRICS, - ::testing::Values("CPU", "HETERO:CPU")); + ::testing::Values("CPU", "MULTI:CPU", "HETERO:CPU")); INSTANTIATE_TEST_CASE_P( smoke_IEClassExecutableNetworkGetMetricTest, IEClassExecutableNetworkGetMetricTest_NETWORK_NAME, - ::testing::Values("CPU", "HETERO:CPU")); + ::testing::Values("CPU", "MULTI:CPU", "HETERO:CPU")); INSTANTIATE_TEST_CASE_P( smoke_IEClassExecutableNetworkGetMetricTest, IEClassExecutableNetworkGetMetricTest_OPTIMAL_NUMBER_OF_INFER_REQUESTS, - ::testing::Values("CPU", "HETERO:CPU")); + ::testing::Values("CPU", "MULTI:CPU", "HETERO:CPU")); INSTANTIATE_TEST_CASE_P( smoke_IEClassExecutableNetworkGetMetricTest, IEClassExecutableNetworkGetMetricTest_ThrowsUnsupported, - ::testing::Values("CPU", "HETERO:CPU")); + ::testing::Values("CPU", "MULTI:CPU", "HETERO:CPU")); // // Executable Network GetConfig / SetConfig diff --git a/inference-engine/tests_deprecated/functional/mkldnn/shared_tests_instance/network_tests/network_test.cpp b/inference-engine/tests_deprecated/functional/mkldnn/shared_tests_instance/network_tests/network_test.cpp index c525fcbbe15..6930beb4039 100644 --- a/inference-engine/tests_deprecated/functional/mkldnn/shared_tests_instance/network_tests/network_test.cpp +++ b/inference-engine/tests_deprecated/functional/mkldnn/shared_tests_instance/network_tests/network_test.cpp @@ -121,14 +121,14 @@ INSTANTIATE_TEST_CASE_P( smoke_Inception, ModelTransformationsTest, ::testing::Values( - TransformationsParams("MKLDNN", getModelParams("inception_v3_tf"), 1ul, false, false, createParam(), {}, 3ul), - TransformationsParams("MKLDNN", getModelParams("inception_v3_tf"), 1ul, false, true, createParamI8I8(), {}, 0, false), - TransformationsParams("MKLDNN", getModelParams("inception_v3_tf"), 1ul, false, true, createParamU8I8(), {}, 0), - TransformationsParams("MKLDNN", getModelParams("inception_v3_tf"), 1ul, false, true, createParamU8U8(), {}, 0), - TransformationsParams("MKLDNN", getModelParams("inception_v3_tf"), 1ul, false, true, createParamCpu().setQuantizedTensorAlignmentOnActivations(LayerTransformation::QuantizedTensorAlignment::UpdateLevel)), - TransformationsParams("MKLDNN", getModelParams("inception_v3_tf"), 1ul, false, true, createParamCpu().setQuantizedTensorAlignmentOnActivations(LayerTransformation::QuantizedTensorAlignment::UpdateIntervals)), - TransformationsParams("MKLDNN", getModelParams("inception_v3_tf"), 1ul, true, false, createParam()), - TransformationsParams("MKLDNN", getModelParams("inception_v3_tf"), 2ul, true, false, createParam()) + TransformationsParams("CPU", getModelParams("inception_v3_tf"), 1ul, false, false, createParam(), {}, 3ul), + TransformationsParams("CPU", getModelParams("inception_v3_tf"), 1ul, false, true, createParamI8I8(), {}, 0, false), + TransformationsParams("CPU", getModelParams("inception_v3_tf"), 1ul, false, true, createParamU8I8(), {}, 0), + TransformationsParams("CPU", getModelParams("inception_v3_tf"), 1ul, false, true, createParamU8U8(), {}, 0), + TransformationsParams("CPU", getModelParams("inception_v3_tf"), 1ul, false, true, createParamCpu().setQuantizedTensorAlignmentOnActivations(LayerTransformation::QuantizedTensorAlignment::UpdateLevel)), + TransformationsParams("CPU", getModelParams("inception_v3_tf"), 1ul, false, true, createParamCpu().setQuantizedTensorAlignmentOnActivations(LayerTransformation::QuantizedTensorAlignment::UpdateIntervals)), + TransformationsParams("CPU", getModelParams("inception_v3_tf"), 1ul, true, false, createParam()), + TransformationsParams("CPU", getModelParams("inception_v3_tf"), 2ul, true, false, createParam()) ), TransformationsParams::getLowPrecisionTransformerSingleLayerTestName); @@ -136,14 +136,14 @@ INSTANTIATE_TEST_CASE_P( smoke_MobileNet, ModelTransformationsTest, ::testing::Values( - TransformationsParams("MKLDNN", getModelParams("mobilenet_v2_tf_depthwise"), 1ul, false), + TransformationsParams("CPU", getModelParams("mobilenet_v2_tf_depthwise"), 1ul, false), // TODO: eshoguli: fix this issue -// TransformationsParams("MKLDNN", getModelParams("mobilenet_v2_tf_depthwise"), 1ul, false, true, createParamI8I8()), -// TransformationsParams("MKLDNN", getModelParams("mobilenet_v2_tf_depthwise"), 1ul, false, true, createParamU8I8()), -// TransformationsParams("MKLDNN", getModelParams("mobilenet_v2_tf_depthwise"), 1ul, false, true, createParamU8U8(), {}, 2), -// TransformationsParams("MKLDNN", getModelParams("mobilenet_v2_tf_depthwise"), 1ul, false, true, createParamCpu(), { "464/Pool", "465/Pool" }), - TransformationsParams("MKLDNN", getModelParams("mobilenet_v2_tf_depthwise"), 1ul, true), - TransformationsParams("MKLDNN", getModelParams("mobilenet_v2_tf_depthwise"), 2ul, true) +// TransformationsParams("CPU", getModelParams("mobilenet_v2_tf_depthwise"), 1ul, false, true, createParamI8I8()), +// TransformationsParams("CPU", getModelParams("mobilenet_v2_tf_depthwise"), 1ul, false, true, createParamU8I8()), +// TransformationsParams("CPU", getModelParams("mobilenet_v2_tf_depthwise"), 1ul, false, true, createParamU8U8(), {}, 2), +// TransformationsParams("CPU", getModelParams("mobilenet_v2_tf_depthwise"), 1ul, false, true, createParamCpu(), { "464/Pool", "465/Pool" }), + TransformationsParams("CPU", getModelParams("mobilenet_v2_tf_depthwise"), 1ul, true), + TransformationsParams("CPU", getModelParams("mobilenet_v2_tf_depthwise"), 2ul, true) ), TransformationsParams::getLowPrecisionTransformerSingleLayerTestName); @@ -151,28 +151,28 @@ INSTANTIATE_TEST_CASE_P( smoke_ResNet, ModelTransformationsTest, ::testing::Values( - TransformationsParams("MKLDNN", getModelParams("resnet_50_tf"), 1ul, false), - TransformationsParams("MKLDNN", getModelParams("resnet_50_tf"), 1ul, false, true, createParamI8I8(), { + TransformationsParams("CPU", getModelParams("resnet_50_tf"), 1ul, false), + TransformationsParams("CPU", getModelParams("resnet_50_tf"), 1ul, false, true, createParamI8I8(), { // TODO: remove when eltwise validation was added "resnet_v1_50/block1/unit_2/bottleneck_v1/act_quant/FakeQuantWithMinMaxVars", "resnet_v1_50/block2/unit_3/bottleneck_v1/act_quant/FakeQuantWithMinMaxVars" }), - TransformationsParams("MKLDNN", getModelParams("resnet_50_tf"), 1ul, false, true, createParamU8I8(), { + TransformationsParams("CPU", getModelParams("resnet_50_tf"), 1ul, false, true, createParamU8I8(), { // // TODO: remove when eltwise validation was added "resnet_v1_50/block1/unit_2/bottleneck_v1/act_quant/FakeQuantWithMinMaxVars", "resnet_v1_50/block2/unit_3/bottleneck_v1/act_quant/FakeQuantWithMinMaxVars" }), - TransformationsParams("MKLDNN", getModelParams("resnet_50_tf"), 1ul, false, true, createParamU8U8(), { + TransformationsParams("CPU", getModelParams("resnet_50_tf"), 1ul, false, true, createParamU8U8(), { // TODO: remove when eltwise validation was added "resnet_v1_50/block1/unit_2/bottleneck_v1/act_quant/FakeQuantWithMinMaxVars", "resnet_v1_50/block2/unit_3/bottleneck_v1/act_quant/FakeQuantWithMinMaxVars" }), - TransformationsParams("MKLDNN", getModelParams("resnet_50_tf"), 1ul, false, true, createParamCpu(), { + TransformationsParams("CPU", getModelParams("resnet_50_tf"), 1ul, false, true, createParamCpu(), { // TODO: remove when eltwise validation was added "resnet_v1_50/block1/unit_2/bottleneck_v1/act_quant/FakeQuantWithMinMaxVars", "resnet_v1_50/block2/unit_3/bottleneck_v1/act_quant/FakeQuantWithMinMaxVars" }), - TransformationsParams("MKLDNN", getModelParams("resnet_50_tf"), 1ul, true), - TransformationsParams("MKLDNN", getModelParams("resnet_50_tf"), 2ul, true) + TransformationsParams("CPU", getModelParams("resnet_50_tf"), 1ul, true), + TransformationsParams("CPU", getModelParams("resnet_50_tf"), 2ul, true) ), TransformationsParams::getLowPrecisionTransformerSingleLayerTestName); diff --git a/inference-engine/tests_deprecated/functional/mkldnn/shared_tests_instance/transformations/low_precision_transformer_single_layer_tests.cpp b/inference-engine/tests_deprecated/functional/mkldnn/shared_tests_instance/transformations/low_precision_transformer_single_layer_tests.cpp index b2ea9beae8d..1e8adfb62b3 100644 --- a/inference-engine/tests_deprecated/functional/mkldnn/shared_tests_instance/transformations/low_precision_transformer_single_layer_tests.cpp +++ b/inference-engine/tests_deprecated/functional/mkldnn/shared_tests_instance/transformations/low_precision_transformer_single_layer_tests.cpp @@ -18,6 +18,36 @@ INSTANTIATE_TEST_CASE_P( smoke_SingleLayerTransformationsTestFP32, SingleLayerTransformationsTest, ::testing::Values( + SingleLayerTransformationsTestParams( + "CPU", + PowerTestModel::Ptr(new PowerTestModel(1.f, 1.f, 0)), + { { 1, 3, 299, 299 } }, + { { 1, 3, 299, 299 } }), + + SingleLayerTransformationsTestParams( + "CPU", + PowerTestModel::Ptr(new PowerTestModel(1.f, 2.89f, 64)), + { { 1, 3, 299, 299 } }, + { { 1, 3, 299, 299 } }), + + SingleLayerTransformationsTestParams( + "CPU", + PowerTestModel::Ptr(new PowerTestModel(1.f, -32.f, 0)), + { { 1, 3, 299, 299 } }, + { { 1, 3, 299, 299 } }), + + SingleLayerTransformationsTestParams( + "CPU", + PowerTestModel::Ptr(new PowerTestModel(1.f, 1.f, -64.f)), + { { 1, 3, 299, 299 } }, + { { 1, 3, 299, 299 } }), + + SingleLayerTransformationsTestParams( + "CPU", + PowerTestModel::Ptr(new PowerTestModel(3.5f, 1.f, 0)), + { { 1, 3, 299, 299 } }, + { { 1, 3, 299, 299 } }), + SingleLayerTransformationsTestParams( "CPU", SingleLayerTestModel::Ptr(new ResampleTestModel()), diff --git a/inference-engine/tests_deprecated/functional/shared_tests/CMakeLists.txt b/inference-engine/tests_deprecated/functional/shared_tests/CMakeLists.txt index 20ea1863752..0cb368c8e34 100644 --- a/inference-engine/tests_deprecated/functional/shared_tests/CMakeLists.txt +++ b/inference-engine/tests_deprecated/functional/shared_tests/CMakeLists.txt @@ -11,7 +11,6 @@ list(APPEND SHARED_LIBRARIES ${NGRAPH_LIBRARIES} ie_tests ngraphFunctions - inference_engine_ir_readers ) file(GLOB SHARED_TESTS_SRC @@ -26,7 +25,7 @@ file(GLOB SHARED_TESTS_SRC ) add_library(${TARGET_NAME} STATIC ${SHARED_TESTS_SRC}) -add_dependencies(${TARGET_NAME} inference_engine_preproc mock_engine) +add_dependencies(${TARGET_NAME} inference_engine_preproc MultiDevicePlugin mock_engine) if(ENABLE_MKL_DNN) add_dependencies(${TARGET_NAME} MKLDNNPlugin) diff --git a/inference-engine/tests_deprecated/functional/shared_tests/common_single_layer_tests/single_layer_tests.hpp b/inference-engine/tests_deprecated/functional/shared_tests/common_single_layer_tests/single_layer_tests.hpp index df5db8f5a5b..6e0ab598b9b 100644 --- a/inference-engine/tests_deprecated/functional/shared_tests/common_single_layer_tests/single_layer_tests.hpp +++ b/inference-engine/tests_deprecated/functional/shared_tests/common_single_layer_tests/single_layer_tests.hpp @@ -401,7 +401,7 @@ protected: } template - static details::CNNNetworkImplPtr + static InferenceEngine::CNNNetwork buildSingleLayerNetwork(const std::string &layerType, const CommonTestUtils::InOutShapes &inOutShapes, std::map *params, @@ -410,8 +410,7 @@ protected: size_t weightsSize = 0, size_t biasesSize = 0, const TBlob::Ptr &weights = nullptr) { - auto *parser = new details::FormatParser(Version); - return buildSingleLayerNetworkCommon(parser, layerType, inOutShapes, params, layerDataName, precision, + return buildSingleLayerNetworkCommon(layerType, inOutShapes, params, layerDataName, precision, weightsSize, biasesSize, weights); } @@ -441,10 +440,9 @@ TEST_P(CommonSingleLayerTest, inferAfterReshape) { auto weights = createWeights(elementSize, weightByteSize, biasByteSize); - auto networkImplPtr = buildSingleLayerNetwork<3>(layerHelper->getType(), initialShapes, ¶ms, "data", - pluginParams.precision, weightByteSize, biasByteSize, weights); + auto network = buildSingleLayerNetwork<3>(layerHelper->getType(), initialShapes, ¶ms, "data", + pluginParams.precision, weightByteSize, biasByteSize, weights); - CNNNetwork network(networkImplPtr); std::tie(inputName, inputData) = (*network.getInputsInfo().begin()); inputData->setPrecision(pluginParams.precision); inputData->setLayout(pluginParams.layout); diff --git a/inference-engine/tests_deprecated/functional/shared_tests/ie_class/ie_class.hpp b/inference-engine/tests_deprecated/functional/shared_tests/ie_class/ie_class.hpp index c19573fa6ad..8191938c382 100644 --- a/inference-engine/tests_deprecated/functional/shared_tests/ie_class/ie_class.hpp +++ b/inference-engine/tests_deprecated/functional/shared_tests/ie_class/ie_class.hpp @@ -35,6 +35,15 @@ using namespace InferenceEngine; using namespace InferenceEngine::details; using namespace InferenceEngine::PluginConfigParams; +#define CHECK_MULTI() do { \ + try { \ + Core ie; \ + ie.GetVersions("MULTI"); \ + } catch (...) { \ + GTEST_SKIP(); \ + } \ + } while(false)\ + class IEClassBasicTest : public TestsCommon { public: void SetUp() override { @@ -188,7 +197,9 @@ TEST_P(IEClassBasicTestP, smoke_registerPluginsXMLUnicodePath) { GTEST_COUT << "Core created " << testIndex << std::endl; ASSERT_NO_THROW(ie.RegisterPlugins(wStringtoMBCSstringChar(pluginsXmlW))); CommonTestUtils::removeFile(pluginsXmlW); - +#if defined __linux__ && !defined(__APPLE__) + ASSERT_NO_THROW(ie.GetVersions("mock")); // from pluginXML +#endif ASSERT_NO_THROW(ie.GetVersions(deviceName)); GTEST_COUT << "Plugin created " << testIndex << std::endl; @@ -344,8 +355,8 @@ TEST_F(IEClassBasicTest, smoke_ImportNetworkHeteroThrows) { } TEST_F(IEClassBasicTest, smoke_ImportNetworkMultiThrows) { - Core ie; - + CHECK_MULTI(); + InferenceEngine::Core ie; ASSERT_THROW(ie.ImportNetwork("model", "MULTI"), InferenceEngineException); } @@ -465,6 +476,7 @@ TEST_P(IEClassNetworkTestP, QueryNetworkHeteroActualNoThrow) { } TEST_P(IEClassNetworkTestP, QueryNetworkMultiThrows) { + CHECK_MULTI(); Core ie; ASSERT_THROW(ie.QueryNetwork(actualNetwork, "MULTI"), InferenceEngineException); } @@ -1206,8 +1218,9 @@ TEST_P(IEClassLoadNetworkTest, LoadNetworkHETEROAndDeviceIDThrows) { // TEST_P(IEClassLoadNetworkTest, LoadNetworkHETEROwithMULTINoThrow) { - Core ie; + CHECK_MULTI(); + Core ie; if (supportsDeviceID(ie, deviceName) && supportsAvaliableDevices(ie, deviceName)) { std::string devices; auto availableDevices = ie.GetMetric(deviceName, METRIC_KEY(AVAILABLE_DEVICES)).as>(); @@ -1227,6 +1240,7 @@ TEST_P(IEClassLoadNetworkTest, LoadNetworkHETEROwithMULTINoThrow) { } TEST_P(IEClassLoadNetworkTest, LoadNetworkMULTIwithHETERONoThrow) { + CHECK_MULTI(); Core ie; if (supportsDeviceID(ie, deviceName) && supportsAvaliableDevices(ie, deviceName)) { @@ -1251,6 +1265,7 @@ TEST_P(IEClassLoadNetworkTest, LoadNetworkMULTIwithHETERONoThrow) { // TEST_P(IEClassLoadNetworkTest, QueryNetworkHETEROwithMULTINoThrowv7) { + CHECK_MULTI(); Core ie; if (supportsDeviceID(ie, deviceName) && supportsAvaliableDevices(ie, deviceName)) { @@ -1279,6 +1294,7 @@ TEST_P(IEClassLoadNetworkTest, QueryNetworkHETEROwithMULTINoThrowv7) { } TEST_P(IEClassLoadNetworkTest, QueryNetworkMULTIwithHETERONoThrowv7) { + CHECK_MULTI(); Core ie; if (supportsDeviceID(ie, deviceName) && supportsAvaliableDevices(ie, deviceName)) { @@ -1307,6 +1323,7 @@ TEST_P(IEClassLoadNetworkTest, QueryNetworkMULTIwithHETERONoThrowv7) { } TEST_P(IEClassLoadNetworkTest, QueryNetworkHETEROwithMULTINoThrowv10) { + CHECK_MULTI(); Core ie; if (supportsDeviceID(ie, deviceName) && supportsAvaliableDevices(ie, deviceName)) { @@ -1335,6 +1352,7 @@ TEST_P(IEClassLoadNetworkTest, QueryNetworkHETEROwithMULTINoThrowv10) { } TEST_P(IEClassLoadNetworkTest, DISABLED_QueryNetworkMULTIwithHETERONoThrowv10) { + CHECK_MULTI(); Core ie; if (supportsDeviceID(ie, deviceName) && supportsAvaliableDevices(ie, deviceName)) { @@ -1393,8 +1411,9 @@ TEST_P(IEClassLoadNetworkTest, DISABLED_QueryNetworkMULTIwithHETERONoThrowv10) { using IEClassLoadNetworkAfterCoreRecreateTest = IEClassLoadNetworkTest; TEST_P(IEClassLoadNetworkAfterCoreRecreateTest, LoadAfterRecreateCoresAndPlugins) { + CHECK_MULTI(); + Core ie; { - Core ie; auto versions = ie.GetVersions("MULTI:" + deviceName + ",CPU"); ASSERT_EQ(3, versions.size()); } diff --git a/inference-engine/tests_deprecated/functional/shared_tests/inference_engine_regression_tests/common_dyn_batch_regression.hpp b/inference-engine/tests_deprecated/functional/shared_tests/inference_engine_regression_tests/common_dyn_batch_regression.hpp index 3e4dac95850..5255bc0744f 100644 --- a/inference-engine/tests_deprecated/functional/shared_tests/inference_engine_regression_tests/common_dyn_batch_regression.hpp +++ b/inference-engine/tests_deprecated/functional/shared_tests/inference_engine_regression_tests/common_dyn_batch_regression.hpp @@ -69,10 +69,14 @@ TEST_P(TestNoRegressionDynBatchFP32, dynBatch) { auto refOutData = ngraph::helpers::inferFnWithInterp(fnPtr, {blob->cbuffer().as()}); - auto thr = FuncTestUtils::GetComparisonThreshold(InferenceEngine::Precision::FP32); + float thr1, thr2; + FuncTestUtils::GetComparisonThreshold(InferenceEngine::Precision::FP32, thr1, thr2); + std::vector inShapeLimited{size_t(bsz), 4, 20, 20}; size_t outElementsCount = std::accumulate(begin(inShapeLimited), end(inShapeLimited), 1, std::multiplies()); - FuncTestUtils::compareRawBuffers(outRawData, *refOutData[0], outElementsCount, outElementsCount, thr); + FuncTestUtils::compareRawBuffers(outRawData, *refOutData[0], outElementsCount, outElementsCount, + FuncTestUtils::CompareType::ABS_AND_REL, + thr1, thr2); if (GetParam().deviceName.find(CommonTestUtils::DEVICE_GPU) != std::string::npos) { PluginCache::get().reset(); } diff --git a/inference-engine/tests_deprecated/functional/shared_tests/network_tests/network_i8.hpp b/inference-engine/tests_deprecated/functional/shared_tests/network_tests/network_i8.hpp index d6a3b160864..af91077932d 100644 --- a/inference-engine/tests_deprecated/functional/shared_tests/network_tests/network_i8.hpp +++ b/inference-engine/tests_deprecated/functional/shared_tests/network_tests/network_i8.hpp @@ -51,7 +51,7 @@ inline void checkLayerOuputPrecision(const ICNNNetwork& network, const std::stri } struct network_params { - std::string pluginName; + std::string deviceName; std::string modelFile; std::string imageName; std::string statFile; @@ -87,20 +87,6 @@ struct network_params { result += statFile; return result; } - - std::string plugin() { return pluginName + "Plugin"; } - - std::string deviceName() { - if (pluginName == "MultiDevice") { - return "MULTI:CPU"; - } - if (pluginName == "MKLDNN") { - return "CPU"; - } - - return ""; - } - }; static LayerTransformation::Params createParam() { @@ -254,7 +240,7 @@ public: const size_t classesCanBeChangedIndex = 9999, const bool compareRawValues = true, const std::unordered_set& removedLayers = {}) : - pluginName(""), + deviceName(""), modelParams(ModelParams("", "", "", {})), batchSize(1ul), transformationsInPluginEnabled(transformationsInPluginEnabled), @@ -266,7 +252,7 @@ public: removedLayers(removedLayers) {} TransformationsParams( - const std::string pluginName, + const std::string deviceName, const ModelParams modelParams, const size_t batchSize, const bool transformationsInPluginEnabled = true, @@ -278,7 +264,7 @@ public: const std::unordered_set& removedLayers = {}, const std::vector>> inputs = {}, const std::vector>> transformations = {}) : - pluginName(pluginName), + deviceName(deviceName), modelParams(modelParams), batchSize(batchSize), transformationsInPluginEnabled(transformationsInPluginEnabled), @@ -289,7 +275,7 @@ public: compareRawValues(compareRawValues), removedLayers(removedLayers) {} - const std::string pluginName; + const std::string deviceName; const ModelParams modelParams; const size_t batchSize; @@ -436,7 +422,7 @@ protected: // transformationsParams.transformationsInPluginEnabled ? PluginConfigParams::YES : PluginConfigParams::NO); usedNetwork = cloneNet(network); - ExecutableNetwork exeNetwork = ie.LoadNetwork(network, p.deviceName(), config); + ExecutableNetwork exeNetwork = ie.LoadNetwork(network, p.deviceName, config); InferRequest inferRequest = exeNetwork.CreateInferRequest(); if (inputs.empty()) { Blob::Ptr src = readInput(p.image(), batch_size); @@ -541,7 +527,7 @@ protected: } network_params p{ - "MKLDNN", + "CPU", transformationsParam.modelParams.irFilePath, transformationsParam.modelParams.dataFilePath, "", diff --git a/inference-engine/tests_deprecated/functional/shared_tests/single_layer_tests/ti_tests.hpp b/inference-engine/tests_deprecated/functional/shared_tests/single_layer_tests/ti_tests.hpp index b939b48c3b3..f7ee40f39cf 100644 --- a/inference-engine/tests_deprecated/functional/shared_tests/single_layer_tests/ti_tests.hpp +++ b/inference-engine/tests_deprecated/functional/shared_tests/single_layer_tests/ti_tests.hpp @@ -293,21 +293,24 @@ class TITest2Base: public PlgTest { protected: virtual void RunTITest(const std::map & config = {}) { - try { ti_test_params p = param(); std::string model = getModel(p); auto weights = make_shared_blob(TensorDesc {Precision::U8, {p.precision.size() * p.tensorSize}, C}); weights->allocate(); - auto weights_size = details::product(std::begin(weights->getTensorDesc().getDims()), std::end(weights->getTensorDesc().getDims())); + if (p.precision == Precision::FP32) { - std::vector weights_vector(weights_size, 1.0f); - ie_memcpy(weights->buffer().as(), sizeof(float), &weights_vector[0], weights_vector.size() * sizeof(float)); - } else { + std::vector weights_vector(p.tensorSize, 1.0f); + ie_memcpy(weights->buffer().as(), p.tensorSize * sizeof(float), + &weights_vector[0], p.tensorSize * sizeof(float)); + } else if (p.precision == Precision::FP16) { // FP16 case - std::vector weights_vector(weights_size, PrecisionUtils::f32tof16(1.0f)); - ie_memcpy(weights->buffer().as(), sizeof(ie_fp16), &weights_vector[0], weights_vector.size() * sizeof(ie_fp16)); + std::vector weights_vector(p.tensorSize, PrecisionUtils::f32tof16(1.0f)); + ie_memcpy(weights->buffer().as(), p.tensorSize * sizeof(ie_fp16), + &weights_vector[0], p.tensorSize * sizeof(ie_fp16)); + } else { + ASSERT_TRUE(false); } Core ie; diff --git a/inference-engine/tests_deprecated/functional/shared_tests/transformations/fake_quantize_and_scaleshift_test.cpp b/inference-engine/tests_deprecated/functional/shared_tests/transformations/fake_quantize_and_scaleshift_test.cpp index e7a83e3f8a7..8f4d6edb77b 100644 --- a/inference-engine/tests_deprecated/functional/shared_tests/transformations/fake_quantize_and_scaleshift_test.cpp +++ b/inference-engine/tests_deprecated/functional/shared_tests/transformations/fake_quantize_and_scaleshift_test.cpp @@ -14,8 +14,9 @@ std::string FakeQuantizeAndScaleShiftTestModel::getModel(SingleLayerTransformati std::map fake_quantize_params = { {"levels", "256"} }; + std::map power_params = { - {"power", "1"}, {"scale", "1"}, {"shift", "0"} + {"power", "2"}, {"scale", "1"}, {"shift", "0"} }; std::vector> edges = { diff --git a/inference-engine/tests_deprecated/functional/shared_tests/transformations/fake_quantize_reshape_pooling_test_model_without_constants_test.cpp b/inference-engine/tests_deprecated/functional/shared_tests/transformations/fake_quantize_reshape_pooling_test_model_without_constants_test.cpp index 4cf0f3692a8..eda64fda143 100644 --- a/inference-engine/tests_deprecated/functional/shared_tests/transformations/fake_quantize_reshape_pooling_test_model_without_constants_test.cpp +++ b/inference-engine/tests_deprecated/functional/shared_tests/transformations/fake_quantize_reshape_pooling_test_model_without_constants_test.cpp @@ -35,7 +35,7 @@ std::string FakeQuantizeReshapePoolingTestModelWithoutConstants::getModel(Single std::vector biasesConvolutionConstDims = { conv.out_c }; std::map const_params = {}; std::map fakeQuantizeParams = {{ "levels", "256" }}; - std::map power_params = {{"power", "1"}, {"scale", "1"}, {"shift", "0"}}; + std::map power_params = {{"power", "2"}, {"scale", "1"}, {"shift", "0"}}; std::map poolingParams = { {"kernel", "7,1"}, { "pool-method", "avg" }, { "strides", "1,1" } }; std::vector> edges = { diff --git a/inference-engine/tests_deprecated/functional/shared_tests/transformations/low_precision_transformer_single_layer_tests.hpp b/inference-engine/tests_deprecated/functional/shared_tests/transformations/low_precision_transformer_single_layer_tests.hpp index 2464694a0ca..18014f33f00 100644 --- a/inference-engine/tests_deprecated/functional/shared_tests/transformations/low_precision_transformer_single_layer_tests.hpp +++ b/inference-engine/tests_deprecated/functional/shared_tests/transformations/low_precision_transformer_single_layer_tests.hpp @@ -852,6 +852,20 @@ public: std::string getModel(SingleLayerTransformationsTestParams& p) const override; }; +class PowerTestModel : public SingleLayerTestModel { +public: + PowerTestModel(const float& power, const float& scale, const float& shift) : power(power), scale(scale), shift(shift) {} + void resetTransformation(CNNNetwork& network) const override; + std::string getName() const override; + bool transform(CNNNetwork& network, LayerTransformation::Params& params) const override; + std::string getModel(SingleLayerTransformationsTestParams& p) const override; + +private: + const float power; + const float scale; + const float shift; +}; + class ConvolutionAndQuantizeOnWeightsWithMultiOutputIntervalsTestModel : public SingleLayerTestModel { public: std::string getModel(SingleLayerTransformationsTestParams& p) const override; diff --git a/inference-engine/tests_deprecated/functional/shared_tests/transformations/power_test.cpp b/inference-engine/tests_deprecated/functional/shared_tests/transformations/power_test.cpp new file mode 100644 index 00000000000..92a7217ba3a --- /dev/null +++ b/inference-engine/tests_deprecated/functional/shared_tests/transformations/power_test.cpp @@ -0,0 +1,78 @@ +// Copyright (C) 2020 Intel Corporation +// SPDX-License-Identifier: Apache-2.0 +// + +#include "low_precision_transformer_single_layer_tests.hpp" + +std::string PowerTestModel::getModel(SingleLayerTransformationsTestParams& p) const { + size_t type_size = sizeof(InferenceEngine::PrecisionTrait::value_type); + if (p._network_precision == "FP16") + type_size = sizeof(InferenceEngine::PrecisionTrait::value_type); + + CommonTestUtils::pool_common_params pooling = { {1, 1}, {1, 1}, {0, 0}, {0, 0}, "valid", false, true }; + std::vector poolOutShape(p.inputDimensions[0].size()); + CommonTestUtils::getPoolOutShape(p.inputDimensions[0], pooling, poolOutShape); + + std::map power_params = {{"power", std::to_string(power)}, {"scale", std::to_string(scale)}, {"shift", std::to_string(shift)}}; + std::map const_params = {}; + std::map fake_quantize_params = {{"levels", "256"}}; + + std::vector> edges = { + {"0,0", "1,1"}, {"1,2", "6,7"}, // power + {"2,3", "6,8"}, {"3,4", "6,9"}, {"4,5", "6,10"}, {"5,6", "6,11"}, // const + {"6,12", "7,13"}, {"7,14", "8,15"} // pool, power + }; + + return CommonTestUtils::DefaultNetBuilder::buildNetworkWithOneInput( + "Conv_ScaleShift_transformations", p.inputDimensions[0], p._network_precision) + .addLayer("Power", p._network_precision, &power_params, {{p.inputDimensions[0]}, {p.inputDimensions[0]}}) + .addLayer("Const", p._network_precision, &const_params, {{}, {{1}}}, type_size, 0) + .addLayer("Const", p._network_precision, &const_params, {{}, {{1}}}, type_size, 0) + .addLayer("Const", p._network_precision, &const_params, {{}, {{1}}}, type_size, 0) + .addLayer("Const", p._network_precision, &const_params, {{}, {{1}}}, type_size, 0) + .addLayer("FakeQuantize", p._network_precision, &fake_quantize_params, {{p.inputDimensions[0], {1}, {1}, {1}, {1}}, {{p.inputDimensions[0]}}}) + .poolingLayer(p._network_precision, {{p.inputDimensions[0]}, {poolOutShape}}, pooling) + .addLayer("Power", p._network_precision, &power_params, {{poolOutShape}, {poolOutShape}}) + .finish(&edges); +} + +void PowerTestModel::resetTransformation(CNNNetwork& network) const { + fillData(getLayer(network, "Const2"), 63.5, "custom"); + fillData(getLayer(network, "Const3"), 127.0, "custom"); + fillData(getLayer(network, "Const4"), 63.5, "custom"); + fillData(getLayer(network, "Const5"), 127.0, "custom"); +} + +std::string PowerTestModel::getName() const { + return std::string("PowerTestModel") + + (power == 1.f ? std::string("") : "_power!=1") + + (scale == 1.f ? "" : "_scale=" + std::to_string(scale)) + + (shift == 0 ? "" : "_shift!=" + std::to_string(shift)); +} + +bool PowerTestModel::transform(CNNNetwork& network, LayerTransformation::Params& params) const { + LowPrecisionTransformer transformer(LowPrecisionTransformer::getAllTransformations(params)); + transformer.transform(network); + + const Precision precision = params.updatePrecisions ? Precision(Precision::U8) : network.getPrecision(); + + CNNLayerPtr fakeQuantize = getLayer(network, "FakeQuantize6"); + if (fakeQuantize->outData[0]->getPrecision() != precision) { + THROW_IE_EXCEPTION << fakeQuantize->name << " precision " << precision << " is not correct"; + } + + CNNLayerPtr pooling = getLayer(network, "Pooling7"); + if (pooling->outData[0]->getPrecision() != precision) { + THROW_IE_EXCEPTION << pooling->name << " precision " << precision << " is not correct"; + } + + CNNLayerPtr powerLayer = getLayer(network, "Power8"); + + const bool deleteLayer = params.quantizeOutputs && power == 1.f && powerLayer != nullptr && powerLayer->type == "Power"; + + if (deleteLayer) { + THROW_IE_EXCEPTION << "Power layer is present after transformation"; + } + + return true; +} diff --git a/inference-engine/tests_deprecated/functional/shared_tests/transformations/scaleshift_and_fake_quantize_test.cpp b/inference-engine/tests_deprecated/functional/shared_tests/transformations/scaleshift_and_fake_quantize_test.cpp index a0d8baf5981..bed3fb8e83c 100644 --- a/inference-engine/tests_deprecated/functional/shared_tests/transformations/scaleshift_and_fake_quantize_test.cpp +++ b/inference-engine/tests_deprecated/functional/shared_tests/transformations/scaleshift_and_fake_quantize_test.cpp @@ -29,7 +29,7 @@ std::string ScaleShiftAndFakeQuantizeTestModel::getModel(SingleLayerTransformati std::map const_params = {}; std::map fake_quantize_params = {{"levels", "256"}}; - std::map power_params = {{"power", "1"}, {"scale", "1"}, {"shift", "0"}}; + std::map power_params = {{"power", "2"}, {"scale", "1"}, {"shift", "0"}}; std::vector> edges = { {"0,0", "1,1"}, {"1,2", "6,7"}, // Power diff --git a/inference-engine/tests_deprecated/functional/shared_tests/transformations/scaleshift_to_conv_after_concat_test.cpp b/inference-engine/tests_deprecated/functional/shared_tests/transformations/scaleshift_to_conv_after_concat_test.cpp index 0a2f19ac5ed..2d668a2650e 100644 --- a/inference-engine/tests_deprecated/functional/shared_tests/transformations/scaleshift_to_conv_after_concat_test.cpp +++ b/inference-engine/tests_deprecated/functional/shared_tests/transformations/scaleshift_to_conv_after_concat_test.cpp @@ -27,7 +27,7 @@ std::string ScaleShiftToConvolutionAfterConcatTestModel::getModel(SingleLayerTra {"axis", "1"} }; std::map power_params = { - {"power", "1"}, {"scale", "1"}, {"shift", "0"} + {"power", "2"}, {"scale", "1"}, {"shift", "0"} }; std::vector> edges = { diff --git a/inference-engine/tests_deprecated/functional/shared_tests/transformations/scaleshift_to_conv_after_fakequantize_ignore_test.cpp b/inference-engine/tests_deprecated/functional/shared_tests/transformations/scaleshift_to_conv_after_fakequantize_ignore_test.cpp index 053e5a403aa..97c94faff00 100644 --- a/inference-engine/tests_deprecated/functional/shared_tests/transformations/scaleshift_to_conv_after_fakequantize_ignore_test.cpp +++ b/inference-engine/tests_deprecated/functional/shared_tests/transformations/scaleshift_to_conv_after_fakequantize_ignore_test.cpp @@ -42,7 +42,7 @@ std::string ScaleShiftToConvolutionAfterFakeQuantizeIgnoreTestModel::getModel(Si std::map const_params = {}; std::map fake_quantize_params = { {"levels", "256"} }; - std::map power_params = { {"power", "1"}, {"scale", "1"}, {"shift", "0"} }; + std::map power_params = { {"power", "2"}, {"scale", "1"}, {"shift", "0"} }; std::vector> edges = { {"0,0", "1,1"}, // Input -> Power {"1,2", "6,7"}, // Power -> FakeQuantize diff --git a/inference-engine/tests_deprecated/functional/shared_tests/transformations/single_layer_transformations_test.cpp b/inference-engine/tests_deprecated/functional/shared_tests/transformations/single_layer_transformations_test.cpp index c234284b121..50b9e1fd735 100644 --- a/inference-engine/tests_deprecated/functional/shared_tests/transformations/single_layer_transformations_test.cpp +++ b/inference-engine/tests_deprecated/functional/shared_tests/transformations/single_layer_transformations_test.cpp @@ -304,9 +304,14 @@ void SingleLayerTransformationsTest::SetUp() { const float threshold = p.model->getThreshold(p.device_name, net_precision, param); const float zeroThreshold = p.model->getZeroThreshold(); - // const float threshold = net_precision == Precision::FP16 ? 0.0005f : 0.0003f; + + const auto outName = transformedOutput.find(name); + if (outName == transformedOutput.end()) { + THROW_IE_EXCEPTION << "Original output name " + name + " doesn't exist in transformed model"; + } + relative_compare( - CNNNetworkHelper::getFloatData(transformedOutput.find(name)->second).get(), + CNNNetworkHelper::getFloatData(outName->second).get(), CNNNetworkHelper::getFloatData(originalOutput.second).get(), outSize, threshold, diff --git a/inference-engine/tests_deprecated/functional/vpu/CMakeLists.txt b/inference-engine/tests_deprecated/functional/vpu/CMakeLists.txt index 8e6ada389b5..e8fe9b1bceb 100644 --- a/inference-engine/tests_deprecated/functional/vpu/CMakeLists.txt +++ b/inference-engine/tests_deprecated/functional/vpu/CMakeLists.txt @@ -41,7 +41,6 @@ addIeTarget( ${CMAKE_CURRENT_SOURCE_DIR}/common/regression/helpers LINK_LIBRARIES IESharedTests - inference_engine_ir_readers vpu_graph_transformer vpu_custom_kernels DEFINES @@ -69,7 +68,6 @@ addIeTargetTest( LINK_LIBRARIES IESharedTests vpu_custom_kernels - inference_engine_ir_readers LINK_LIBRARIES_WHOLE_ARCHIVE myriadTestData VPUCommonTests diff --git a/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_CTCDecoder_test.cpp b/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_CTCDecoder_test.cpp index 49fa67994dc..28996ae24c8 100644 --- a/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_CTCDecoder_test.cpp +++ b/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_CTCDecoder_test.cpp @@ -4,7 +4,11 @@ #include "myriad_layers_CTCDecoder_test.hpp" -INSTANTIATE_TEST_CASE_P(myriad, myriadCTCDecoderLayerTests_nightly, - ::testing::Combine( - ::testing::Values(true, false), - ::testing::ValuesIn(s_DimsConfig))); +INSTANTIATE_TEST_CASE_P( + accuracy, myriadCTCDecoderLayerTests_smoke, + ::testing::Combine( + ::testing::Values({{1, 88, 1, 71}}), + ::testing::Values(true, false), + ::testing::Values(IRVersion::v7, IRVersion::v10), + ::testing::ValuesIn(s_CustomConfig) +)); diff --git a/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_CTCDecoder_test.hpp b/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_CTCDecoder_test.hpp index d047eee2418..69a4d79d47a 100644 --- a/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_CTCDecoder_test.hpp +++ b/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_CTCDecoder_test.hpp @@ -9,17 +9,11 @@ using namespace InferenceEngine; #define ERROR_BOUND 0.2f -typedef struct { - SizeVector src_dims; - SizeVector seq_ind_dims; - SizeVector dst_dims; - std::string custom_config; -} dims_config; +PRETTY_PARAM(CustomConfig, std::string); +PRETTY_PARAM(HwOptimization, bool); -PRETTY_PARAM(hwAcceleration, std::string); -PRETTY_PARAM(dimsConfig, dims_config); - -typedef myriadLayerTestBaseWithParam> myriadCTCDecoderLayerTests_nightly; +typedef myriadLayerTestBaseWithParam> + myriadCTCDecoderLayerTests_smoke; void refCTCDecoder(const Blob::Ptr src, const Blob::Ptr seq_ind, Blob::Ptr dst) { ie_fp16 *src_data = static_cast(src->buffer()); @@ -89,46 +83,40 @@ void refCTCDecoder(const Blob::Ptr src, const Blob::Ptr seq_ind, Blob::Ptr dst) } } -TEST_P(myriadCTCDecoderLayerTests_nightly, CTCGreedyDecoder) { +TEST_P(myriadCTCDecoderLayerTests_smoke, CTCGreedyDecoder) { + const tensor_test_params dims = std::get<0>(GetParam()); + const bool hwOptimization = std::get<1>(GetParam()); + _irVersion = std::get<2>(GetParam()); + const std::string customConfig = std::get<3>(GetParam()); - bool HWConfigValue = std::get<0>(GetParam()); - dims_config dimsConfig = std::get<1>(GetParam()); + if (!customConfig.empty() && !CheckMyriadX()) { + GTEST_SKIP() << "Custom layers for MYRIAD2 not supported"; + } - if(!dimsConfig.custom_config.empty() && !CheckMyriadX()) { - GTEST_SKIP()<<"Custom layers for MYRIAD2 not supported"; - } + _config[VPU_CONFIG_KEY(CUSTOM_LAYERS)] = customConfig; - _config[VPU_CONFIG_KEY(CUSTOM_LAYERS)] = dimsConfig.custom_config; - - IN_OUT_desc inputTensors; - IN_OUT_desc outputTensors; - - inputTensors.resize(2); - outputTensors.resize(1); - - inputTensors[0] = dimsConfig.src_dims; - inputTensors[1] = dimsConfig.seq_ind_dims; - outputTensors[0] = dimsConfig.dst_dims; + const auto inputTensors = IN_OUT_desc{{dims.c, dims.h, dims.w}, {dims.h, dims.c}}; + const auto outputTensors = IN_OUT_desc{{1, 1, dims.h, dims.c}}; SetInputTensors(inputTensors); SetOutputTensors(outputTensors); - ASSERT_NO_FATAL_FAILURE(makeSingleLayerNetwork(LayerInitParams("CTCGreedyDecoder"), NetworkInitParams().useHWOpt(HWConfigValue))); + std::map params; + params["ctc_merge_repeated"] = "1"; - auto iter = _inputMap.begin(); - auto first_input = iter->first; - ++iter; - auto second_input = iter->first; + ASSERT_NO_FATAL_FAILURE(makeSingleLayerNetwork(LayerInitParams("CTCGreedyDecoder").params(params), + NetworkInitParams() + .useHWOpt(hwOptimization) + .layoutPreference(vpu::LayoutPreference::ChannelMajor) + .lockLayout(true))); - Blob::Ptr data; - auto dataBlob = _inputMap[first_input]; + auto dataBlob = _inputMap.begin()->second; + auto seqIndBlob = std::next(_inputMap.begin())->second; - auto seqIndBlob = _inputMap[second_input]; - uint16_t *blobRawSeqFp16 = seqIndBlob->buffer().as(); - size_t count = seqIndBlob->size(); - blobRawSeqFp16[0] = PrecisionUtils::f32tof16(0.0); - for (size_t indx = 1; indx < count; ++indx) { - blobRawSeqFp16[indx] = PrecisionUtils::f32tof16(1.0); + auto seqIndFp16 = seqIndBlob->buffer().as(); + seqIndFp16[0] = PrecisionUtils::f32tof16(0.0); + for (size_t i = 1; i < seqIndBlob->size(); ++i) { + seqIndFp16[i] = PrecisionUtils::f32tof16(1.0); } std::string inputTensorBinary = TestDataHelpers::get_data_path() + "/vpu/InputGreedyDecoderMyriadCHW.bin"; @@ -136,19 +124,14 @@ TEST_P(myriadCTCDecoderLayerTests_nightly, CTCGreedyDecoder) { ASSERT_TRUE(Infer()); - auto outputBlob = _outputMap.begin()->second; - - _refBlob = make_shared_blob(TensorDesc(Precision::FP16, outputBlob->getTensorDesc().getDims(), ANY)); - _refBlob->allocate(); - refCTCDecoder(dataBlob, seqIndBlob, _refBlob); - CompareCommonAbsolute(outputBlob, _refBlob, 0.0); + CompareCommonAbsolute(_outputMap.begin()->second, _refBlob, 0.0); } -static std::vector s_DimsConfig = { - {{88, 1, 71}, {88, 1}, {1, 88, 1, 1}, ""}, +static std::vector s_CustomConfig = { + {""}, #ifdef VPU_HAS_CUSTOM_KERNELS - {{88, 1, 71}, {88, 1}, {1, 88, 1, 1}, getIELibraryPath() + "/vpu_custom_kernels/customLayerBindings.xml"}, + getIELibraryPath() + "/vpu_custom_kernels/customLayerBindings.xml" #endif }; diff --git a/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_batch_normalization_test.cpp b/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_batch_normalization_test.cpp index 9739f14a768..a30d8b1d215 100644 --- a/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_batch_normalization_test.cpp +++ b/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_batch_normalization_test.cpp @@ -5,7 +5,7 @@ #include "myriad_layers_batch_normalization_test.hpp" INSTANTIATE_TEST_CASE_P( - accuracy, myriadLayersTestsBatchNormalization_nightly, + accuracy, myriadLayersTestsBatchNormalization_smoke, ::testing::Values( bn_test_params{{1, 1, 16, 8}, 0.001f}, bn_test_params{{1, 4, 8, 16}, 0.00001f}, diff --git a/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_batch_normalization_test.hpp b/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_batch_normalization_test.hpp index 8028d608e63..20d451b1cfc 100644 --- a/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_batch_normalization_test.hpp +++ b/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_batch_normalization_test.hpp @@ -58,11 +58,11 @@ void ref_batch_normalization(const InferenceEngine::Blob::Ptr src, } } -class myriadLayersTestsBatchNormalization_nightly: public myriadLayersTests_nightly, +class myriadLayersTestsBatchNormalization_smoke: public myriadLayersTests_nightly, public testing::WithParamInterface { }; -TEST_P(myriadLayersTestsBatchNormalization_nightly, TestsBatchNorm) +TEST_P(myriadLayersTestsBatchNormalization_smoke, TestsBatchNorm) { bn_test_params p = ::testing::WithParamInterface::GetParam(); size_t sz_weights = p.in.c; diff --git a/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_bias_test.cpp b/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_bias_test.cpp index f8521f8bbe8..eb89b5c1805 100644 --- a/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_bias_test.cpp +++ b/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_bias_test.cpp @@ -4,6 +4,6 @@ #include "myriad_layers_bias_test.hpp" -INSTANTIATE_TEST_CASE_P(accuracy, myriadLayersTestsBias_nightly, +INSTANTIATE_TEST_CASE_P(accuracy, myriadLayersTestsBias_smoke, ::testing::ValuesIn(s_biasDims) ); diff --git a/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_bias_test.hpp b/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_bias_test.hpp index 61abb8820bb..c35dd523eb5 100644 --- a/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_bias_test.hpp +++ b/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_bias_test.hpp @@ -88,11 +88,11 @@ void ref_bias(const InferenceEngine::Blob::Ptr src1, } } -class myriadLayersTestsBias_nightly: public myriadLayersTests_nightly, +class myriadLayersTestsBias_smoke: public myriadLayersTests_nightly, public testing::WithParamInterface { }; -TEST_P(myriadLayersTestsBias_nightly, TestsBias) { +TEST_P(myriadLayersTestsBias_smoke, TestsBias) { _config[VPU_CONFIG_KEY(DETECT_NETWORK_BATCH)] = CONFIG_VALUE(NO); auto input_dim = GetParam(); InferenceEngine::SizeVector input_dim1; diff --git a/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_blob_test.cpp b/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_blob_test.cpp index f663e73171f..de0614d8a5f 100644 --- a/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_blob_test.cpp +++ b/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_blob_test.cpp @@ -10,7 +10,7 @@ using namespace InferenceEngine; using namespace ::testing; -typedef myriadLayerTestBaseWithParam myriadBlobTests_nightly; +typedef myriadLayerTestBaseWithParam myriadBlobTests_smoke; std::vector readBinFile(std::string filename) { @@ -33,7 +33,7 @@ std::vector readBinFile(std::string filename) return vec; } -TEST_P(myriadBlobTests_nightly, CanGetSameBlobsOnSameIR) { +TEST_P(myriadBlobTests_smoke, CanGetSameBlobsOnSameIR) { std::string HWConfigValue = GetParam(); auto fnPtr = ngraph::builder::subgraph::makeSplitConvConcat(); @@ -64,20 +64,20 @@ TEST_P(myriadBlobTests_nightly, CanGetSameBlobsOnSameIR) { } } -INSTANTIATE_TEST_CASE_P(accuracy, myriadBlobTests_nightly, +INSTANTIATE_TEST_CASE_P(accuracy, myriadBlobTests_smoke, ::testing::Values(CONFIG_VALUE(YES), CONFIG_VALUE(NO)) ); -using myriadBlobExportTests_nightly = myriadLayersTests_nightly; +using myriadBlobExportTests_smoke = myriadLayersTests_nightly; -TEST_F(myriadBlobExportTests_nightly, CanNotDoImportOnNonExistFile) +TEST_F(myriadBlobExportTests_smoke, CanNotDoImportOnNonExistFile) { InferenceEngine::IExecutableNetwork::Ptr importedNetworkPtr; ASSERT_EQ(StatusCode::NETWORK_NOT_READ, _vpuPluginPtr->ImportNetwork(importedNetworkPtr, "I_dont_exist.blob", {}, nullptr)); } -TEST_F(myriadBlobExportTests_nightly, CanInferImportedNetworkOnExportedBlob) +TEST_F(myriadBlobExportTests_smoke, CanInferImportedNetworkOnExportedBlob) { auto fnPtr = ngraph::builder::subgraph::makeSplitConvConcat(); ASSERT_NO_THROW(_cnnNetwork = CNNNetwork(fnPtr)); @@ -95,7 +95,7 @@ TEST_F(myriadBlobExportTests_nightly, CanInferImportedNetworkOnExportedBlob) ASSERT_EQ(StatusCode::OK, inferRequest->Infer(&_resp)) << _resp.msg; } -TEST_F(myriadBlobExportTests_nightly, CanGetPerfCountsImportedNetwork) +TEST_F(myriadBlobExportTests_smoke, CanGetPerfCountsImportedNetwork) { auto fnPtr = ngraph::builder::subgraph::makeSplitConvConcat(); ASSERT_NO_THROW(_cnnNetwork = CNNNetwork(fnPtr)); @@ -125,7 +125,7 @@ TEST_F(myriadBlobExportTests_nightly, CanGetPerfCountsImportedNetwork) } } -class myriadConfigsWithBlobImportTests_nightly: public myriadLayersTests_nightly { +class myriadConfigsWithBlobImportTests_smoke: public myriadLayersTests_nightly { protected: // use this stream to redirect cout to it, // needs to be able check output on warnings @@ -148,7 +148,7 @@ private: }; -TEST_F(myriadConfigsWithBlobImportTests_nightly, TryingToSetCompileOptionPrintsWarning) +TEST_F(myriadConfigsWithBlobImportTests_smoke, TryingToSetCompileOptionPrintsWarning) { auto fnPtr = ngraph::builder::subgraph::makeSplitConvConcat(); ASSERT_NO_THROW(_cnnNetwork = CNNNetwork(fnPtr)); @@ -183,7 +183,7 @@ TEST_F(myriadConfigsWithBlobImportTests_nightly, TryingToSetCompileOptionPrintsW } } -TEST_F(myriadConfigsWithBlobImportTests_nightly, TryingToSetRuntimeOptionDoesNotPrintWarning) +TEST_F(myriadConfigsWithBlobImportTests_smoke, TryingToSetRuntimeOptionDoesNotPrintWarning) { auto fnPtr = ngraph::builder::subgraph::makeSplitConvConcat(); ASSERT_NO_THROW(_cnnNetwork = CNNNetwork(fnPtr)); @@ -215,9 +215,9 @@ TEST_F(myriadConfigsWithBlobImportTests_nightly, TryingToSetRuntimeOptionDoesNot } -using myriadBlobExportAccuracyDifferentCountInAndOutTests_nightly = myriadLayerTestBaseWithParam>; +using myriadBlobExportAccuracyDifferentCountInAndOutTests_smoke = myriadLayerTestBaseWithParam>; -TEST_F(myriadBlobExportAccuracyDifferentCountInAndOutTests_nightly, IsResultOfImportedAndGeneratedModelSame) +TEST_F(myriadBlobExportAccuracyDifferentCountInAndOutTests_smoke, IsResultOfImportedAndGeneratedModelSame) { SetSeed(DEFAULT_SEED_VALUE); @@ -287,9 +287,9 @@ TEST_F(myriadBlobExportAccuracyDifferentCountInAndOutTests_nightly, IsResultOfIm } -using myriadBlobExportAccuracyDifferentPrecisionOfInAndOutTests_nightly = myriadLayerTestBaseWithParam>; +using myriadBlobExportAccuracyDifferentPrecisionOfInAndOutTests_smoke = myriadLayerTestBaseWithParam>; -TEST_P(myriadBlobExportAccuracyDifferentPrecisionOfInAndOutTests_nightly, IsResultOfImportedAndGeneratedModelSame) +TEST_P(myriadBlobExportAccuracyDifferentPrecisionOfInAndOutTests_smoke, IsResultOfImportedAndGeneratedModelSame) { SetSeed(DEFAULT_SEED_VALUE); InferenceEngine::Precision inputPrecision = std::get<0>(GetParam()); @@ -354,9 +354,9 @@ TEST_P(myriadBlobExportAccuracyDifferentPrecisionOfInAndOutTests_nightly, IsResu CompareCommonAbsolute(importedOutputBlobPtr, outputBlobPtr, 0.f); } -using myriadExtraTests_nightly = myriadLayersTests_nightly; +using myriadExtraTests_smoke = myriadLayersTests_nightly; -TEST_F(myriadExtraTests_nightly, ThereIsNoSegfaultOnZeroConvolutionWeights) { +TEST_F(myriadExtraTests_smoke, ThereIsNoSegfaultOnZeroConvolutionWeights) { if (!CheckMyriadX()) { SKIP() << "Non-MyriadX device"; } @@ -414,5 +414,5 @@ static const std::vector inputPrecisions = {Inferenc static const std::vector outputPrecisions = {InferenceEngine::Precision::FP16, InferenceEngine::Precision::FP32}; -INSTANTIATE_TEST_CASE_P(accuracy, myriadBlobExportAccuracyDifferentPrecisionOfInAndOutTests_nightly, +INSTANTIATE_TEST_CASE_P(accuracy, myriadBlobExportAccuracyDifferentPrecisionOfInAndOutTests_smoke, ::testing::Combine(::testing::ValuesIn(inputPrecisions), ::testing::ValuesIn(outputPrecisions))); \ No newline at end of file diff --git a/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_clamp_test.cpp b/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_clamp_test.cpp index b848f2d60ca..bffd0972385 100644 --- a/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_clamp_test.cpp +++ b/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_clamp_test.cpp @@ -4,7 +4,7 @@ #include "myriad_layers_clamp_test.hpp" -INSTANTIATE_TEST_CASE_P(accuracy, myriadLayersTestsClampParams_nightly, +INSTANTIATE_TEST_CASE_P(accuracy, myriadLayersTestsClampParams_smoke, ::testing::Combine( ::testing::ValuesIn(s_clampTensors), ::testing::ValuesIn(s_clampParams)) diff --git a/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_clamp_test.hpp b/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_clamp_test.hpp index 306fe68e87b..4b28d9fc13a 100644 --- a/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_clamp_test.hpp +++ b/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_clamp_test.hpp @@ -18,9 +18,9 @@ struct clamp_test_params { }; }; -typedef myriadLayerTestBaseWithParam> myriadLayersTestsClampParams_nightly; +typedef myriadLayerTestBaseWithParam> myriadLayersTestsClampParams_smoke; -TEST_P(myriadLayersTestsClampParams_nightly, TestsClamp) { +TEST_P(myriadLayersTestsClampParams_smoke, TestsClamp) { _config[VPU_CONFIG_KEY(DETECT_NETWORK_BATCH)] = CONFIG_VALUE(NO); auto param = GetParam(); SizeVector tensor = std::get<0>(param); diff --git a/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_concat_test.cpp b/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_concat_test.cpp index 2a385cf9544..07bf2868375 100644 --- a/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_concat_test.cpp +++ b/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_concat_test.cpp @@ -4,7 +4,7 @@ #include "myriad_layers_concat_test.hpp" -INSTANTIATE_TEST_CASE_P(accuracy, myriadLayersTestsConcat_nightly, +INSTANTIATE_TEST_CASE_P(accuracy, myriadLayersTestsConcat_smoke, ::testing::Combine( ::testing::ValuesIn(s_concatCores), ::testing::ValuesIn(s_axis), @@ -14,7 +14,7 @@ INSTANTIATE_TEST_CASE_P(accuracy, myriadLayersTestsConcat_nightly, getTestCaseName ); -TEST_F(myriadLayersTestsConcat_nightly, ConcatAfterNormalize) { +TEST_F(myriadLayersTestsConcat_smoke, ConcatAfterNormalize) { const std::string model = R"V0G0N( diff --git a/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_concat_test.hpp b/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_concat_test.hpp index d25918b945a..36c110ba394 100644 --- a/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_concat_test.hpp +++ b/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_concat_test.hpp @@ -7,7 +7,7 @@ using namespace InferenceEngine; using myriadConcatTestParams = std::tuple; -typedef myriadLayerTestBaseWithParam myriadLayersTestsConcat_nightly; +typedef myriadLayerTestBaseWithParam myriadLayersTestsConcat_smoke; void CheckOutput(const InferenceEngine::BlobMap& input, InferenceEngine::Blob::Ptr actual, int32_t axis) { int32_t OW = 1; @@ -49,7 +49,7 @@ void CheckOutput(const InferenceEngine::BlobMap& input, InferenceEngine::Blob::P ASSERT_NE(n_checks, 0); } -TEST_P(myriadLayersTestsConcat_nightly, Concat) { +TEST_P(myriadLayersTestsConcat_smoke, Concat) { auto param = GetParam(); auto core = std::get<0>(param); auto axis = std::get<1>(param); diff --git a/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_conv_nd_test.cpp b/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_conv_nd_test.cpp index 75e3f27f580..78ef816d517 100644 --- a/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_conv_nd_test.cpp +++ b/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_conv_nd_test.cpp @@ -12,7 +12,7 @@ using namespace testing; // //---------------------------------------------------------------------- -INSTANTIATE_TEST_CASE_P(tricky_ncdhw_userpad, myriadLayersConvNDTest_nightly, +INSTANTIATE_TEST_CASE_P(tricky_ncdhw_userpad, myriadLayersConvNDTest_smoke, Combine( Values(InputShape {1, 3, 19, 65, 47}), Values(KernelShape {1, 3, 5}), @@ -26,7 +26,7 @@ INSTANTIATE_TEST_CASE_P(tricky_ncdhw_userpad, myriadLayersConvNDTest_nightly, ) ); -INSTANTIATE_TEST_CASE_P(tricky_ncdhw_autopad, myriadLayersConvNDTest_nightly, +INSTANTIATE_TEST_CASE_P(tricky_ncdhw_autopad, myriadLayersConvNDTest_smoke, Combine( Values(InputShape {1, 3, 19, 65, 47}), Values(KernelShape {1, 3, 5}), @@ -48,7 +48,7 @@ INSTANTIATE_TEST_CASE_P(tricky_ncdhw_autopad, myriadLayersConvNDTest_nightly, // //---------------------------------------------------------------------- -INSTANTIATE_TEST_CASE_P(simple_ncdhw_userpad, myriadLayersConvNDTest_nightly, +INSTANTIATE_TEST_CASE_P(simple_ncdhw_userpad, myriadLayersConvNDTest_smoke, Combine( Values(InputShape {1, 3, 20, 64, 48}), Values(KernelShape {3, 3, 3}), @@ -62,7 +62,7 @@ INSTANTIATE_TEST_CASE_P(simple_ncdhw_userpad, myriadLayersConvNDTest_nightly, ) ); -INSTANTIATE_TEST_CASE_P(simple_ncdhw_autopad, myriadLayersConvNDTest_nightly, +INSTANTIATE_TEST_CASE_P(simple_ncdhw_autopad, myriadLayersConvNDTest_smoke, Combine( Values(InputShape {1, 3, 20, 64, 48}), Values(KernelShape {3, 3, 3}), @@ -84,7 +84,7 @@ INSTANTIATE_TEST_CASE_P(simple_ncdhw_autopad, myriadLayersConvNDTest_nightly, // //---------------------------------------------------------------------- -INSTANTIATE_TEST_CASE_P(tricky_nchw_userpad, myriadLayersConvNDTest_nightly, +INSTANTIATE_TEST_CASE_P(tricky_nchw_userpad, myriadLayersConvNDTest_smoke, Combine( Values(InputShape {1, 3, 65, 47}), Values(KernelShape {1, 3}), @@ -98,7 +98,7 @@ INSTANTIATE_TEST_CASE_P(tricky_nchw_userpad, myriadLayersConvNDTest_nightly, ) ); -INSTANTIATE_TEST_CASE_P(tricky_nchw_autopad, myriadLayersConvNDTest_nightly, +INSTANTIATE_TEST_CASE_P(tricky_nchw_autopad, myriadLayersConvNDTest_smoke, Combine( Values(InputShape {1, 3, 65, 47}), Values(KernelShape {1, 3}), @@ -120,7 +120,7 @@ INSTANTIATE_TEST_CASE_P(tricky_nchw_autopad, myriadLayersConvNDTest_nightly, // //---------------------------------------------------------------------- -INSTANTIATE_TEST_CASE_P(simple_nchw_userpad, myriadLayersConvNDTest_nightly, +INSTANTIATE_TEST_CASE_P(simple_nchw_userpad, myriadLayersConvNDTest_smoke, Combine( Values(InputShape {1, 3, 64, 48}), Values(KernelShape {3, 3}), @@ -134,7 +134,7 @@ INSTANTIATE_TEST_CASE_P(simple_nchw_userpad, myriadLayersConvNDTest_nightly, ) ); -INSTANTIATE_TEST_CASE_P(simple_nchw_autopad, myriadLayersConvNDTest_nightly, +INSTANTIATE_TEST_CASE_P(simple_nchw_autopad, myriadLayersConvNDTest_smoke, Combine( Values(InputShape {1, 3, 64, 48}), Values(KernelShape {3, 3}), @@ -158,7 +158,7 @@ INSTANTIATE_TEST_CASE_P(simple_nchw_autopad, myriadLayersConvNDTest_nightly, // NB: requires 1GB of RAM on device (e.g. ma2085 board) // Stress test: large image with large depth, large kernel -INSTANTIATE_TEST_CASE_P(i3d_id6, myriadLayersConvNDTest_nightly, +INSTANTIATE_TEST_CASE_P(i3d_id6, myriadLayersConvNDTest_smoke, Combine( Values(InputShape {1, 3, 79, 224, 224}), Values(KernelShape {7, 7, 7}), @@ -171,7 +171,7 @@ INSTANTIATE_TEST_CASE_P(i3d_id6, myriadLayersConvNDTest_nightly, Values(Groups(1)))); // Like `i3d_id6` test but with smaller image (so must fit in Myriad X) -INSTANTIATE_TEST_CASE_P(i3d_id6_shrink, myriadLayersConvNDTest_nightly, +INSTANTIATE_TEST_CASE_P(i3d_id6_shrink, myriadLayersConvNDTest_smoke, Combine( Values(InputShape {1, 3, 39, 112, 112}), Values(KernelShape {7, 7, 7}), @@ -184,7 +184,7 @@ INSTANTIATE_TEST_CASE_P(i3d_id6_shrink, myriadLayersConvNDTest_nightly, Values(Groups(1)))); // Average-size image, trivial kernel 1x1x1 -INSTANTIATE_TEST_CASE_P(i3d_id12, myriadLayersConvNDTest_nightly, +INSTANTIATE_TEST_CASE_P(i3d_id12, myriadLayersConvNDTest_smoke, Combine( Values(InputShape {1, 64, 40, 56, 56}), Values(KernelShape {1, 1, 1}), @@ -197,7 +197,7 @@ INSTANTIATE_TEST_CASE_P(i3d_id12, myriadLayersConvNDTest_nightly, Values(Groups(1)))); // Average-size image, non-trivial kernel 3x3x3 -INSTANTIATE_TEST_CASE_P(i3d_id17, myriadLayersConvNDTest_nightly, +INSTANTIATE_TEST_CASE_P(i3d_id17, myriadLayersConvNDTest_smoke, Combine( Values(InputShape {1, 64, 40, 56, 56}), Values(KernelShape {3, 3, 3}), @@ -210,7 +210,7 @@ INSTANTIATE_TEST_CASE_P(i3d_id17, myriadLayersConvNDTest_nightly, Values(Groups(1)))); // Small image (7x7), trivial kernel -INSTANTIATE_TEST_CASE_P(i3d_id249, myriadLayersConvNDTest_nightly, +INSTANTIATE_TEST_CASE_P(i3d_id249, myriadLayersConvNDTest_smoke, Combine( Values(InputShape {1, 832, 10, 7, 7}), Values(KernelShape {1, 1, 1}), @@ -223,7 +223,7 @@ INSTANTIATE_TEST_CASE_P(i3d_id249, myriadLayersConvNDTest_nightly, Values(Groups(1)))); // Small image (7x7), non-trivial kernel -INSTANTIATE_TEST_CASE_P(i3d_id301, myriadLayersConvNDTest_nightly, +INSTANTIATE_TEST_CASE_P(i3d_id301, myriadLayersConvNDTest_smoke, Combine( Values(InputShape {1, 48, 10, 7, 7}), Values(KernelShape {3, 3, 3}), @@ -236,7 +236,7 @@ INSTANTIATE_TEST_CASE_P(i3d_id301, myriadLayersConvNDTest_nightly, Values(Groups(1)))); // Trivial image (1x1), trivial kernel -INSTANTIATE_TEST_CASE_P(i3d_id314, myriadLayersConvNDTest_nightly, +INSTANTIATE_TEST_CASE_P(i3d_id314, myriadLayersConvNDTest_smoke, Combine( Values(InputShape {1, 1024, 9, 1, 1}), Values(KernelShape {1, 1, 1}), diff --git a/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_conv_nd_test.hpp b/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_conv_nd_test.hpp index 98bfeaa85c7..42bedcd42c5 100644 --- a/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_conv_nd_test.hpp +++ b/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_conv_nd_test.hpp @@ -752,8 +752,8 @@ private: } }; -class myriadLayersConvNDTest_nightly: public ConvNDTest {}; +class myriadLayersConvNDTest_smoke: public ConvNDTest {}; -TEST_P(myriadLayersConvNDTest_nightly, ConvND) { +TEST_P(myriadLayersConvNDTest_smoke, ConvND) { testConvND(); } diff --git a/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_convert_test.cpp b/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_convert_test.cpp index e64e72bd226..556f9fd8ef9 100644 --- a/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_convert_test.cpp +++ b/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_convert_test.cpp @@ -5,15 +5,25 @@ #include "myriad_layers_convert_test.hpp" INSTANTIATE_TEST_CASE_P( - accuracy, myriadLayersTestsIOConvert_nightly, + accuracy, myriadLayersTestsIOConvert_smoke, ::testing::Combine( ::testing::ValuesIn(inputsDims), - ::testing::ValuesIn(precisionsIO) + ::testing::ValuesIn(precisionsIO), + ::testing::Values("") ) ); INSTANTIATE_TEST_CASE_P( - accuracy, myriadLayersTestsConvertWithFP16_nightly, + accuracy_customu8f16, myriadLayersTestsIOConvert_smoke, + ::testing::Combine( + ::testing::ValuesIn(inputsDims4D), + ::testing::Values(PrecisionPair{Precision::U8, Precision::FP16}), + ::testing::Values(s_CustomConfig) + ) +); + +INSTANTIATE_TEST_CASE_P( + accuracy, myriadLayersTestsConvertWithFP16_smoke, ::testing::Combine( ::testing::ValuesIn(inputsDims), ::testing::ValuesIn(withFP16Precisions) diff --git a/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_convert_test.hpp b/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_convert_test.hpp index 03b62911148..b068a5b6594 100644 --- a/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_convert_test.hpp +++ b/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_convert_test.hpp @@ -12,47 +12,65 @@ using namespace InferenceEngine; +PRETTY_PARAM(CustomConfig, std::string); + typedef std::pair PrecisionPair; -typedef std::tuple ConvertIOTestParam; +typedef std::tuple ConvertIOTestParam; typedef std::tuple ConvertWithFP16TestParam; -class myriadLayersTestsIOConvert_nightly: public myriadLayersTests_nightly, - public testing::WithParamInterface { +static CustomConfig s_CustomConfig = { +#ifdef VPU_HAS_CUSTOM_KERNELS + {getIELibraryPath() + "/vpu_custom_kernels/customLayerBindings.xml"} +#endif }; -TEST_P(myriadLayersTestsIOConvert_nightly, TestsIOConvert) -{ - const auto& param = ::testing::WithParamInterface::GetParam(); - const auto& inputDims = std::get<0>(param); - const auto& precisions = std::get<1>(param); - const auto& inputPrecision = precisions.first; - const auto& outputPrecision = precisions.second; +typedef myriadLayerTestBaseWithParam myriadLayersTestsIOConvert_smoke; - SetInputTensors({inputDims}); - SetOutputTensors({inputDims}); +TEST_P(myriadLayersTestsIOConvert_smoke, TestsIOConvert) { + const SizeVector& dims = std::get<0>(GetParam()); + const PrecisionPair& precision = std::get<1>(GetParam()); + const std::string& customConfig = std::get<2>(GetParam()); + const auto& inputPrecision = precision.first; + const auto& outputPrecision = precision.second; + + if(!customConfig.empty() && !CheckMyriadX()) { + GTEST_SKIP()<<"Custom layers for MYRIAD2 not supported"; + } + _config[VPU_CONFIG_KEY(CUSTOM_LAYERS)] = customConfig; + + _config[VPU_CONFIG_KEY(DISABLE_CONVERT_STAGES)] = CONFIG_VALUE(YES); + + SetInputTensors({dims}); + SetOutputTensors({dims}); + + std::map params = { + {"precision", std::to_string(outputPrecision)}, + {"scale", std::to_string(1.0)}, // scale and bias are needed for custom layer + {"bias", std::to_string(0.0)} + }; + + ASSERT_NO_FATAL_FAILURE(makeSingleLayerNetwork( + LayerInitParams("Convert") + .params(params) + .in({dims}) + .out({dims}) + .outPrecision(outputPrecision), + NetworkInitParams() + .layoutPreference(vpu::LayoutPreference::ChannelMajor) + .inputPrecision(inputPrecision) + .outputPrecision(outputPrecision) + .lockLayout(true))); - makeSingleLayerNetwork(LayerInitParams("Copy"), - NetworkInitParams() - .inputPrecision(inputPrecision) - .outputPrecision(outputPrecision)); ASSERT_TRUE(Infer()); - auto tensorDesc = InferenceEngine::TensorDesc( - outputPrecision, _outputMap.begin()->second->getTensorDesc().getDims(), - _outputMap.begin()->second->getTensorDesc().getLayout()); - auto refBlob = make_blob_with_precision(outputPrecision, tensorDesc); - refBlob->allocate(); + ASSERT_NO_FATAL_FAILURE(ref_convert(_inputMap.begin()->second, _refBlob)); - ref_convert(_inputMap.begin()->second, refBlob); - - CompareCommonAbsolute(_outputMap.begin()->second, refBlob, ERROR_BOUND); + CompareCommonAbsolute(_outputMap.begin()->second, _refBlob, ERROR_BOUND); } -class myriadLayersTestsConvertWithFP16_nightly: public myriadLayersTests_nightly, - public testing::WithParamInterface { -}; +typedef myriadLayerTestBaseWithParam myriadLayersTestsConvertWithFP16_smoke; -TEST_P(myriadLayersTestsConvertWithFP16_nightly, TestsConvertWithFP16) +TEST_P(myriadLayersTestsConvertWithFP16_smoke, TestsConvertWithFP16) { const auto& param = ::testing::WithParamInterface::GetParam(); const auto& inputDims = std::get<0>(param); @@ -91,7 +109,7 @@ TEST_P(myriadLayersTestsConvertWithFP16_nightly, TestsConvertWithFP16) CompareCommonAbsolute(_outputMap.begin()->second, getReferenceOutput(), ERROR_BOUND); } -std::vector inputsDims = { +std::vector inputsDims = { { 224, 224 }, { 3, 224, 224 }, { 1, 1, 224, 224 }, @@ -104,6 +122,15 @@ std::vector inputsDims = { { 2, 2, 3, 224, 224 }, }; +std::vector inputsDims4D = { + {{ 1, 1, 224, 224 }}, + {{ 1, 1, 416, 416 }}, + {{ 1, 1, 62, 62 }}, + {{ 1, 1, 227, 227 }}, + {{ 1, 3, 224, 224 }}, + {{ 1, 3, 360, 480 }}, +}; + std::vector precisionsIO = { {Precision::U8, Precision::FP16}, {Precision::FP32, Precision::FP16}, diff --git a/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_convolution1x1.cpp b/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_convolution1x1.cpp index da29ff1bd1c..6143dbbed3f 100644 --- a/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_convolution1x1.cpp +++ b/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_convolution1x1.cpp @@ -4,7 +4,7 @@ #include "myriad_layers_convolution1x1.hpp" -INSTANTIATE_TEST_CASE_P(myriad, myriadConvolution1x1LayerTests_nightly, +INSTANTIATE_TEST_CASE_P(myriad, myriadConvolution1x1LayerTests_smoke, ::testing::Combine( ::testing::Values(CONFIG_VALUE(NO)), ::testing::ValuesIn(s_isHWC), diff --git a/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_convolution1x1.hpp b/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_convolution1x1.hpp index 379817cc7a1..4ddafc8a679 100644 --- a/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_convolution1x1.hpp +++ b/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_convolution1x1.hpp @@ -20,7 +20,7 @@ PRETTY_PARAM(hwAcceleration, std::string); PRETTY_PARAM(dimsConfig, dims_config); PRETTY_PARAM(isHWC, int); -typedef myriadLayerTestBaseWithParam> myriadConvolution1x1LayerTests_nightly; +typedef myriadLayerTestBaseWithParam> myriadConvolution1x1LayerTests_smoke; void refConvolution1x1(const Blob::Ptr src, InferenceEngine::TBlob::Ptr weights, Blob::Ptr dst, int isHWC) { ie_fp16 *in = static_cast(src->buffer()); @@ -39,7 +39,7 @@ void refConvolution1x1(const Blob::Ptr src, InferenceEngine::TBlob::Ptr size_t IW = in_width; size_t IH = in_height; size_t IC = in_channels; - + const auto& out_dims = dst->getTensorDesc().getDims(); size_t out_width = out_dims[out_dims.size() - 1]; size_t out_height = out_dims[out_dims.size() - 2]; @@ -67,16 +67,17 @@ void refConvolution1x1(const Blob::Ptr src, InferenceEngine::TBlob::Ptr continue; } uint32_t indx; - if(isHWC == 1){ - indx = ic + iw * IC + ih * IC * IW; + if (isHWC == 1) { + indx = ic + iw * IC + ih * IC * IW; valYXZ = (valYXZ) + (PrecisionUtils::f16tof32(in[indx]) * PrecisionUtils::f16tof32(w[oc*IC + ic])); } - else { + else + { indx = iw + ih * IW + ic * IW * IH; valZYX = PrecisionUtils::f32tof16(PrecisionUtils::f16tof32(valZYX) + PrecisionUtils::f16tof32(PrecisionUtils::f32tof16(PrecisionUtils::f16tof32(in[indx]) * PrecisionUtils::f16tof32(w[oc*IC + ic])))); } } - if(isHWC == 1){ + if (isHWC == 1) { out[oc*OH*OW + oh*OW + ow] = PrecisionUtils::f32tof16(valYXZ); } else { @@ -87,7 +88,7 @@ void refConvolution1x1(const Blob::Ptr src, InferenceEngine::TBlob::Ptr } } -TEST_P(myriadConvolution1x1LayerTests_nightly, Convolution1x1) { +TEST_P(myriadConvolution1x1LayerTests_smoke, Convolution1x1) { std::string model = R"V0G0N( @@ -102,7 +103,7 @@ TEST_P(myriadConvolution1x1LayerTests_nightly, Convolution1x1) { - + @IB@ @@ -133,6 +134,7 @@ TEST_P(myriadConvolution1x1LayerTests_nightly, Convolution1x1) { std::string HWConfigValue = std::get<0>(GetParam()); int isHWC = std::get<1>(GetParam()); dims_config customConfig = std::get<2>(GetParam()); + const auto layout = isHWC ? Layout::NHWC : Layout::NCHW; if(!customConfig.custom_config.empty() && !CheckMyriadX()) { GTEST_SKIP()<<"Custom layers for MYRIAD2 not supported"; @@ -152,8 +154,6 @@ TEST_P(myriadConvolution1x1LayerTests_nightly, Convolution1x1) { size_t num_weights = IC * OC; - model.replace( model.find("@isHWC@"), sizeof("@isHWC@") -1, std::to_string(isHWC)); - model.replace( model.find("@IB@"), sizeof("@IB@") -1, std::to_string(IB)); model.replace( model.find("@IB@"), sizeof("@IB@") -1, std::to_string(IB)); model.replace( model.find("@IC@"), sizeof("@IC@") -1, std::to_string(IC)); @@ -171,7 +171,7 @@ TEST_P(myriadConvolution1x1LayerTests_nightly, Convolution1x1) { model.replace( model.find("@size_weights@"), sizeof("@size_weights@") -1, std::to_string(num_weights * sizeof(ie_fp16))); InferenceEngine::TBlob::Ptr weights_ptr = InferenceEngine::TBlob::Ptr(GenWeights(num_weights)); - + StatusCode st; InferenceEngine::Core ie; @@ -179,11 +179,11 @@ TEST_P(myriadConvolution1x1LayerTests_nightly, Convolution1x1) { _inputsInfo = network.getInputsInfo(); _inputsInfo["data"]->setPrecision(Precision::FP16); - (isHWC) ? _inputsInfo["data"]->setLayout(NHWC) : _inputsInfo["data"]->setLayout(NCHW); + _inputsInfo["data"]->setLayout(layout); _outputsInfo = network.getOutputsInfo(); _outputsInfo["conv1x1"]->setPrecision(Precision::FP16); - _outputsInfo["conv1x1"]->setLayout(NCHW); + _outputsInfo["conv1x1"]->setLayout(layout); ASSERT_NO_THROW(st = _vpuPluginPtr->LoadNetwork(_exeNetwork, network, {{VPU_CONFIG_KEY(CUSTOM_LAYERS), customConfig.custom_config}, {VPU_CONFIG_KEY(HW_STAGES_OPTIMIZATION), HWConfigValue}}, &_resp)); @@ -254,4 +254,4 @@ static std::vector s_isHWC = { #ifdef VPU_HAS_CUSTOM_KERNELS {0, 1} #endif -}; \ No newline at end of file +}; diff --git a/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_convolution3x3.cpp b/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_convolution3x3.cpp index 967ed364ff2..df2fecebc9c 100644 --- a/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_convolution3x3.cpp +++ b/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_convolution3x3.cpp @@ -4,7 +4,7 @@ #include "myriad_layers_convolution3x3.hpp" -INSTANTIATE_TEST_CASE_P(myriad, myriadConvolution3x3LayerTests_nightly, +INSTANTIATE_TEST_CASE_P(myriad, myriadConvolution3x3LayerTests_smoke, ::testing::Combine( ::testing::Values(CONFIG_VALUE(NO)), ::testing::ValuesIn(s_DimsConfig))); diff --git a/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_convolution3x3.hpp b/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_convolution3x3.hpp index 6f7307e0a88..bf06022988c 100644 --- a/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_convolution3x3.hpp +++ b/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_convolution3x3.hpp @@ -19,7 +19,7 @@ typedef struct { PRETTY_PARAM(hwAcceleration, std::string); PRETTY_PARAM(dimsConfig, dims_config_con3x3); -typedef myriadLayerTestBaseWithParam> myriadConvolution3x3LayerTests_nightly; +typedef myriadLayerTestBaseWithParam> myriadConvolution3x3LayerTests_smoke; void refConvolution3x3(const Blob::Ptr src, InferenceEngine::TBlob::Ptr weights, Blob::Ptr dst, int stride_x, int stride_y, int pad_x, int pad_y, int dilation_x, int dilation_y) { @@ -102,7 +102,7 @@ void refConvolution3x3(const Blob::Ptr src, InferenceEngine::TBlob::Ptr } } -TEST_P(myriadConvolution3x3LayerTests_nightly, Convolution3x3) { +TEST_P(myriadConvolution3x3LayerTests_smoke, Convolution3x3) { std::string model = R"V0G0N( @@ -117,7 +117,7 @@ TEST_P(myriadConvolution3x3LayerTests_nightly, Convolution3x3) { - + @IB@ diff --git a/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_convolution_test.cpp b/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_convolution_test.cpp index dbb8ad0e758..f4cfb447731 100644 --- a/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_convolution_test.cpp +++ b/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_convolution_test.cpp @@ -4,7 +4,7 @@ #include "myriad_layers_convolution_test.hpp" -INSTANTIATE_TEST_CASE_P(accuracy_chw_dilation, myriadLayerConvolution_nightly, +INSTANTIATE_TEST_CASE_P(accuracy_chw_dilation, myriadLayerConvolution_smoke, ::testing::Combine( ::testing::Values(MAKE_STRUCT(tensor_test_params, 1, 37, 43, 43) , MAKE_STRUCT(tensor_test_params, 1, 37, 19, 19)) @@ -23,7 +23,7 @@ INSTANTIATE_TEST_CASE_P(accuracy_chw_dilation, myriadLayerConvolution_nightly, ) ); -INSTANTIATE_TEST_CASE_P(accuracy, myriadLayers_IR3_ConvTests_nightly, +INSTANTIATE_TEST_CASE_P(accuracy, myriadLayers_IR3_ConvTests_smoke, ::testing::Combine( ::testing::Values({1, 3, 32, 24}) , ::testing::Values(MAKE_STRUCT(param_size, 3, 3)) @@ -35,7 +35,7 @@ INSTANTIATE_TEST_CASE_P(accuracy, myriadLayers_IR3_ConvTests_nightly, ) ); -INSTANTIATE_TEST_CASE_P(accuracy_Batch_0, myriadLayers_BatchTest_ConvTests_nightly, +INSTANTIATE_TEST_CASE_P(accuracy_Batch_0, myriadLayers_BatchTest_ConvTests_smoke, ::testing::Combine( ::testing::Values({10, 5, 1, 1}) , ::testing::Values(MAKE_STRUCT(param_size, 1, 1)) @@ -47,7 +47,7 @@ INSTANTIATE_TEST_CASE_P(accuracy_Batch_0, myriadLayers_BatchTest_ConvTests_night ) ); -INSTANTIATE_TEST_CASE_P(accuracy_Batch_1, myriadLayers_BatchTest_ConvTests_nightly, +INSTANTIATE_TEST_CASE_P(accuracy_Batch_1, myriadLayers_BatchTest_ConvTests_smoke, ::testing::Combine( ::testing::Values({10, 576, 7, 7}) , ::testing::Values(MAKE_STRUCT(param_size, 1, 1)) @@ -59,7 +59,7 @@ INSTANTIATE_TEST_CASE_P(accuracy_Batch_1, myriadLayers_BatchTest_ConvTests_night ) ); -INSTANTIATE_TEST_CASE_P(accuracy_Batch_2, myriadLayers_BatchTest_ConvTests_nightly, +INSTANTIATE_TEST_CASE_P(accuracy_Batch_2, myriadLayers_BatchTest_ConvTests_smoke, ::testing::Combine( ::testing::Values({10, 128, 7, 7}) , ::testing::Values(MAKE_STRUCT(param_size, 3, 3)) @@ -71,7 +71,7 @@ INSTANTIATE_TEST_CASE_P(accuracy_Batch_2, myriadLayers_BatchTest_ConvTests_night ) ); -INSTANTIATE_TEST_CASE_P(accuracy_Batch_3, myriadLayers_BatchTest_ConvTests_nightly, +INSTANTIATE_TEST_CASE_P(accuracy_Batch_3, myriadLayers_BatchTest_ConvTests_smoke, ::testing::Combine( ::testing::Values({10, 4, 7, 7}) , ::testing::Values(MAKE_STRUCT(param_size, 1, 1)) @@ -83,7 +83,7 @@ INSTANTIATE_TEST_CASE_P(accuracy_Batch_3, myriadLayers_BatchTest_ConvTests_night ) ); -INSTANTIATE_TEST_CASE_P(accuracy_Batch_4, myriadLayers_BatchTest_ConvTests_nightly, +INSTANTIATE_TEST_CASE_P(accuracy_Batch_4, myriadLayers_BatchTest_ConvTests_smoke, ::testing::Combine( ::testing::Values({10, 256, 7, 7}) , ::testing::Values(MAKE_STRUCT(param_size, 3, 3)) @@ -95,7 +95,7 @@ INSTANTIATE_TEST_CASE_P(accuracy_Batch_4, myriadLayers_BatchTest_ConvTests_night ) ); -INSTANTIATE_TEST_CASE_P(accuracy_Batch_5, myriadLayers_BatchTest_ConvTests_nightly, +INSTANTIATE_TEST_CASE_P(accuracy_Batch_5, myriadLayers_BatchTest_ConvTests_smoke, ::testing::Combine( ::testing::Values({10, 1024, 4, 4}) , ::testing::Values(MAKE_STRUCT(param_size, 1, 1)) @@ -107,7 +107,7 @@ INSTANTIATE_TEST_CASE_P(accuracy_Batch_5, myriadLayers_BatchTest_ConvTests_night ) ); -INSTANTIATE_TEST_CASE_P(accuracy_Batch_6, myriadLayers_BatchTest_ConvTests_nightly, +INSTANTIATE_TEST_CASE_P(accuracy_Batch_6, myriadLayers_BatchTest_ConvTests_smoke, ::testing::Combine( ::testing::Values({10, 192, 4, 4}) , ::testing::Values(MAKE_STRUCT(param_size, 3, 3)) @@ -119,7 +119,7 @@ INSTANTIATE_TEST_CASE_P(accuracy_Batch_6, myriadLayers_BatchTest_ConvTests_night ) ); -INSTANTIATE_TEST_CASE_P(accuracy_Batch_7, myriadLayers_BatchTest_ConvTests_nightly, +INSTANTIATE_TEST_CASE_P(accuracy_Batch_7, myriadLayers_BatchTest_ConvTests_smoke, ::testing::Combine( ::testing::Values({10, 160, 4, 4}) , ::testing::Values(MAKE_STRUCT(param_size, 3, 3)) @@ -131,7 +131,7 @@ INSTANTIATE_TEST_CASE_P(accuracy_Batch_7, myriadLayers_BatchTest_ConvTests_night ) ); -INSTANTIATE_TEST_CASE_P(accuracy_Batch_8, myriadLayers_BatchTest_ConvTests_nightly, +INSTANTIATE_TEST_CASE_P(accuracy_Batch_8, myriadLayers_BatchTest_ConvTests_smoke, ::testing::Combine( ::testing::Values({10, 224, 4, 4}) , ::testing::Values(MAKE_STRUCT(param_size, 3, 3)) @@ -143,7 +143,7 @@ INSTANTIATE_TEST_CASE_P(accuracy_Batch_8, myriadLayers_BatchTest_ConvTests_night ) ); -INSTANTIATE_TEST_CASE_P(accuracy_Batch_9, myriadLayers_BatchTest_ConvTests_nightly, +INSTANTIATE_TEST_CASE_P(accuracy_Batch_9, myriadLayers_BatchTest_ConvTests_smoke, ::testing::Combine( ::testing::Values({10, 1024, 4, 4}) , ::testing::Values(MAKE_STRUCT(param_size, 1, 1)) @@ -155,7 +155,7 @@ INSTANTIATE_TEST_CASE_P(accuracy_Batch_9, myriadLayers_BatchTest_ConvTests_night ) ); -INSTANTIATE_TEST_CASE_P(accuracy_Batch_10, myriadLayers_BatchTest_ConvTests_nightly, +INSTANTIATE_TEST_CASE_P(accuracy_Batch_10, myriadLayers_BatchTest_ConvTests_smoke, ::testing::Combine( ::testing::Values({1, 64, 56, 56}) , ::testing::Values(MAKE_STRUCT(param_size, 3, 3)) @@ -167,7 +167,7 @@ INSTANTIATE_TEST_CASE_P(accuracy_Batch_10, myriadLayers_BatchTest_ConvTests_nigh ) ); -INSTANTIATE_TEST_CASE_P(accuracy_Batch_11, myriadLayers_BatchTest_ConvTests_nightly, +INSTANTIATE_TEST_CASE_P(accuracy_Batch_11, myriadLayers_BatchTest_ConvTests_smoke, ::testing::Combine( ::testing::Values({10, 192, 7, 7}) , ::testing::Values(MAKE_STRUCT(param_size, 3, 3)) @@ -179,7 +179,7 @@ INSTANTIATE_TEST_CASE_P(accuracy_Batch_11, myriadLayers_BatchTest_ConvTests_nigh ) ); -INSTANTIATE_TEST_CASE_P(accuracy_Batch_12, myriadLayers_BatchTest_ConvTests_nightly, +INSTANTIATE_TEST_CASE_P(accuracy_Batch_12, myriadLayers_BatchTest_ConvTests_smoke, ::testing::Combine( ::testing::Values({10, 576, 7, 7}) , ::testing::Values(MAKE_STRUCT(param_size, 1, 1)) @@ -191,7 +191,7 @@ INSTANTIATE_TEST_CASE_P(accuracy_Batch_12, myriadLayers_BatchTest_ConvTests_nigh ) ); -INSTANTIATE_TEST_CASE_P(accuracy_Batch_1, myriadLayers_BatchTest2_ConvTests_nightly, +INSTANTIATE_TEST_CASE_P(accuracy_Batch_1, myriadLayers_BatchTest2_ConvTests_smoke, ::testing::Combine( ::testing::Values({10, 576, 7, 7}) , ::testing::Values(MAKE_STRUCT(param_size, 1, 1)) @@ -203,7 +203,7 @@ INSTANTIATE_TEST_CASE_P(accuracy_Batch_1, myriadLayers_BatchTest2_ConvTests_nigh ) ); -INSTANTIATE_TEST_CASE_P(accuracy_3X3, myriadLayers_IR3_ConvTests_nightly, +INSTANTIATE_TEST_CASE_P(accuracy_3X3, myriadLayers_IR3_ConvTests_smoke, ::testing::Combine( ::testing::Values({1, 3, 32, 24}) , ::testing::Values(MAKE_STRUCT(param_size, 3, 3)) @@ -215,7 +215,7 @@ INSTANTIATE_TEST_CASE_P(accuracy_3X3, myriadLayers_IR3_ConvTests_nightly, ) ); -INSTANTIATE_TEST_CASE_P(accuracy_3X1, myriadLayers_IR3_ConvTests_nightly, +INSTANTIATE_TEST_CASE_P(accuracy_3X1, myriadLayers_IR3_ConvTests_smoke, ::testing::Combine( ::testing::Values({1, 3, 32, 24}) , ::testing::Values(MAKE_STRUCT(param_size, 3, 1)) @@ -227,7 +227,7 @@ INSTANTIATE_TEST_CASE_P(accuracy_3X1, myriadLayers_IR3_ConvTests_nightly, ) ); -INSTANTIATE_TEST_CASE_P(accuracy_1X3, myriadLayers_IR3_ConvTests_nightly, +INSTANTIATE_TEST_CASE_P(accuracy_1X3, myriadLayers_IR3_ConvTests_smoke, ::testing::Combine( ::testing::Values({1, 4, 16, 16}) , ::testing::Values(MAKE_STRUCT(param_size, 1, 3)) @@ -239,7 +239,7 @@ INSTANTIATE_TEST_CASE_P(accuracy_1X3, myriadLayers_IR3_ConvTests_nightly, ) ); -INSTANTIATE_TEST_CASE_P(accuracy, myriadLayers_3X3X3_ConstInput_nightly, +INSTANTIATE_TEST_CASE_P(accuracy, myriadLayers_3X3X3_ConstInput_smoke, ::testing::Combine( ::testing::Values({1, 3, 10, 10}) , ::testing::Values(MAKE_STRUCT(param_size, 3, 3)) @@ -251,7 +251,7 @@ INSTANTIATE_TEST_CASE_P(accuracy, myriadLayers_3X3X3_ConstInput_nightly, ) ); -INSTANTIATE_TEST_CASE_P(accuracy_crossroad_spatialConv, myriadLayerConvolutionTensorFlow_nightly, +INSTANTIATE_TEST_CASE_P(accuracy_crossroad_spatialConv, myriadLayerConvolutionTensorFlow_smoke, ::testing::Combine( ::testing::Values(MAKE_STRUCT(tensor_test_params, 1, 3, 1024, 1024)) , ::testing::Values(MAKE_STRUCT(tensor_test_params, 1, 3, 512, 512)) @@ -264,7 +264,7 @@ INSTANTIATE_TEST_CASE_P(accuracy_crossroad_spatialConv, myriadLayerConvolutionTe ) ); -INSTANTIATE_TEST_CASE_P(accuracy_inception_v2, myriadLayerConvolutionTensorFlow_nightly, +INSTANTIATE_TEST_CASE_P(accuracy_inception_v2, myriadLayerConvolutionTensorFlow_smoke, ::testing::Combine( ::testing::Values(MAKE_STRUCT(tensor_test_params, 1, 16, 28, 28)) , ::testing::Values(MAKE_STRUCT(tensor_test_params, 1, 64, 14, 14)) @@ -277,7 +277,7 @@ INSTANTIATE_TEST_CASE_P(accuracy_inception_v2, myriadLayerConvolutionTensorFlow_ ) ); -INSTANTIATE_TEST_CASE_P(accuracy_inception_v1, myriadLayerConvolutionTensorFlow_nightly, +INSTANTIATE_TEST_CASE_P(accuracy_inception_v1, myriadLayerConvolutionTensorFlow_smoke, ::testing::Combine( ::testing::Values(MAKE_STRUCT(tensor_test_params, 1, 3, 224, 224), MAKE_STRUCT(tensor_test_params, 1, 32, 224, 224) @@ -292,7 +292,7 @@ INSTANTIATE_TEST_CASE_P(accuracy_inception_v1, myriadLayerConvolutionTensorFlow_ ) ); -INSTANTIATE_TEST_CASE_P(test_3x3_SSD_dilation, myriadLayerConvolution_nightly, +INSTANTIATE_TEST_CASE_P(test_3x3_SSD_dilation, myriadLayerConvolution_smoke, ::testing::Combine( ::testing::Values(MAKE_STRUCT(tensor_test_params, 1, 512, 19, 19)) , ::testing::Values(MAKE_STRUCT(param_size, 3, 3)) @@ -305,7 +305,7 @@ INSTANTIATE_TEST_CASE_P(test_3x3_SSD_dilation, myriadLayerConvolution_nightly, ) ); -INSTANTIATE_TEST_CASE_P(test_TF_Resnet_50, myriadLayers_IR3_ConvTests_nightly, +INSTANTIATE_TEST_CASE_P(test_TF_Resnet_50, myriadLayers_IR3_ConvTests_smoke, ::testing::Combine( ::testing::Values({1, 512, 38, 38}) , ::testing::Values(MAKE_STRUCT(param_size, 1, 1)) @@ -317,7 +317,7 @@ INSTANTIATE_TEST_CASE_P(test_TF_Resnet_50, myriadLayers_IR3_ConvTests_nightly, ) ); -INSTANTIATE_TEST_CASE_P(test_3x3_icvnet_dilation, myriadLayerConvolution_nightly, +INSTANTIATE_TEST_CASE_P(test_3x3_icvnet_dilation, myriadLayerConvolution_smoke, ::testing::Combine( ::testing::Values(MAKE_STRUCT(tensor_test_params, 1, 24, 20, 20)) , ::testing::Values(MAKE_STRUCT(param_size, 3, 3)) @@ -332,7 +332,7 @@ INSTANTIATE_TEST_CASE_P(test_3x3_icvnet_dilation, myriadLayerConvolution_nightly ) ); -INSTANTIATE_TEST_CASE_P(test_5x5_with_dilation, myriadLayerConvolution_nightly, +INSTANTIATE_TEST_CASE_P(test_5x5_with_dilation, myriadLayerConvolution_smoke, ::testing::Combine( ::testing::Values(MAKE_STRUCT(tensor_test_params, 1, 32, 64, 77)) , ::testing::Values(MAKE_STRUCT(param_size, 5, 5)) @@ -348,7 +348,7 @@ INSTANTIATE_TEST_CASE_P(test_5x5_with_dilation, myriadLayerConvolution_nightly, ) ); -INSTANTIATE_TEST_CASE_P(test_7x7_with_dilation, myriadLayerConvolution_nightly, +INSTANTIATE_TEST_CASE_P(test_7x7_with_dilation, myriadLayerConvolution_smoke, ::testing::Combine( ::testing::Values(MAKE_STRUCT(tensor_test_params, 1, 32, 64, 77)) , ::testing::Values(MAKE_STRUCT(param_size, 7, 7)) @@ -365,7 +365,7 @@ INSTANTIATE_TEST_CASE_P(test_7x7_with_dilation, myriadLayerConvolution_nightly, ); -INSTANTIATE_TEST_CASE_P(test_conv1x1, myriadLayerConvolution_nightly, +INSTANTIATE_TEST_CASE_P(test_conv1x1, myriadLayerConvolution_smoke, ::testing::Combine( ::testing::Values(MAKE_STRUCT(tensor_test_params, 1, 10, 13, 13)) , ::testing::Values(MAKE_STRUCT(param_size, 1, 1)) @@ -379,7 +379,7 @@ INSTANTIATE_TEST_CASE_P(test_conv1x1, myriadLayerConvolution_nightly, ) ); -INSTANTIATE_TEST_CASE_P(test_yolo_tiny_2_512x13x13_use_3x3_convolution, myriadLayerConvolution_nightly, +INSTANTIATE_TEST_CASE_P(test_yolo_tiny_2_512x13x13_use_3x3_convolution, myriadLayerConvolution_smoke, ::testing::Combine( ::testing::Values(MAKE_STRUCT(tensor_test_params, 1, 512, 13, 13)) , ::testing::Values(MAKE_STRUCT(param_size, 3, 3)) @@ -392,7 +392,7 @@ INSTANTIATE_TEST_CASE_P(test_yolo_tiny_2_512x13x13_use_3x3_convolution, myriadLa ) ); -INSTANTIATE_TEST_CASE_P(test_yolo_tiny_2_512x13x13_use_1x1_convolution, myriadLayerConvolution_nightly, +INSTANTIATE_TEST_CASE_P(test_yolo_tiny_2_512x13x13_use_1x1_convolution, myriadLayerConvolution_smoke, ::testing::Combine( ::testing::Values(MAKE_STRUCT(tensor_test_params, 1, 4608, 13, 13)) , ::testing::Values(MAKE_STRUCT(param_size, 1, 1)) @@ -405,7 +405,7 @@ INSTANTIATE_TEST_CASE_P(test_yolo_tiny_2_512x13x13_use_1x1_convolution, myriadLa ) ); -INSTANTIATE_TEST_CASE_P(accuracy_group, myriadLayerConvolution_nightly, +INSTANTIATE_TEST_CASE_P(accuracy_group, myriadLayerConvolution_smoke, ::testing::Combine( ::testing::Values(MAKE_STRUCT(tensor_test_params, 1, 32, 64, 77) , MAKE_STRUCT(tensor_test_params, 1, 32, 112, 96)) @@ -424,7 +424,7 @@ INSTANTIATE_TEST_CASE_P(accuracy_group, myriadLayerConvolution_nightly, ) ); -INSTANTIATE_TEST_CASE_P(accuracy_group_large_input, myriadLayerConvolution_nightly, +INSTANTIATE_TEST_CASE_P(accuracy_group_large_input, myriadLayerConvolution_smoke, ::testing::Combine( ::testing::Values(MAKE_STRUCT(tensor_test_params, 1, 32, 192, 336)) , ::testing::Values(MAKE_STRUCT(param_size, 3, 3)) @@ -439,7 +439,7 @@ INSTANTIATE_TEST_CASE_P(accuracy_group_large_input, myriadLayerConvolution_night ) ); -INSTANTIATE_TEST_CASE_P(accuracy_any_group, myriadLayerConvolution_nightly, +INSTANTIATE_TEST_CASE_P(accuracy_any_group, myriadLayerConvolution_smoke, ::testing::Combine( ::testing::Values(MAKE_STRUCT(tensor_test_params, 1, 32, 64, 77)) , ::testing::Values(MAKE_STRUCT(param_size, 3, 3)) @@ -456,7 +456,7 @@ INSTANTIATE_TEST_CASE_P(accuracy_any_group, myriadLayerConvolution_nightly, ) ); -INSTANTIATE_TEST_CASE_P(set_optimization_for_3x3_with_group, myriadLayerConvolution_nightly, +INSTANTIATE_TEST_CASE_P(set_optimization_for_3x3_with_group, myriadLayerConvolution_smoke, ::testing::Combine( ::testing::Values(MAKE_STRUCT(tensor_test_params, 1, 24, 80, 80) , MAKE_STRUCT(tensor_test_params, 1, 36, 80, 80)) @@ -471,7 +471,7 @@ INSTANTIATE_TEST_CASE_P(set_optimization_for_3x3_with_group, myriadLayerConvolut ) ); -INSTANTIATE_TEST_CASE_P(set_optimization_for_3x3s1, myriadLayerConvolution_nightly, +INSTANTIATE_TEST_CASE_P(set_optimization_for_3x3s1, myriadLayerConvolution_smoke, ::testing::Combine( ::testing::Values(MAKE_STRUCT(tensor_test_params, 1, 24, 80, 80)) , ::testing::Values(MAKE_STRUCT(param_size, 3, 3)) @@ -484,7 +484,7 @@ INSTANTIATE_TEST_CASE_P(set_optimization_for_3x3s1, myriadLayerConvolution_night ) ); -INSTANTIATE_TEST_CASE_P(accuracy_1x1, myriadLayerConvolution_nightly, +INSTANTIATE_TEST_CASE_P(accuracy_1x1, myriadLayerConvolution_smoke, ::testing::Combine( ::testing::Values(MAKE_STRUCT(tensor_test_params, 1, 16, 64, 64) , MAKE_STRUCT(tensor_test_params, 1, 32, 1, 1)) @@ -501,7 +501,7 @@ INSTANTIATE_TEST_CASE_P(accuracy_1x1, myriadLayerConvolution_nightly, ) ); -INSTANTIATE_TEST_CASE_P(accuracy_3x3, myriadLayerConvolution_nightly, +INSTANTIATE_TEST_CASE_P(accuracy_3x3, myriadLayerConvolution_smoke, ::testing::Combine( ::testing::Values(MAKE_STRUCT(tensor_test_params, 1, 8, 16, 16) , MAKE_STRUCT(tensor_test_params, 1, 8, 59, 73)) @@ -517,7 +517,7 @@ INSTANTIATE_TEST_CASE_P(accuracy_3x3, myriadLayerConvolution_nightly, ) ); -INSTANTIATE_TEST_CASE_P(accuracy_1x3, myriadLayerConvolution_nightly, +INSTANTIATE_TEST_CASE_P(accuracy_1x3, myriadLayerConvolution_smoke, ::testing::Combine( ::testing::Values(MAKE_STRUCT(tensor_test_params, 1, 8, 59, 73)) , ::testing::Values(MAKE_STRUCT(param_size, 1, 3), MAKE_STRUCT(param_size, 3, 1)) @@ -531,7 +531,7 @@ INSTANTIATE_TEST_CASE_P(accuracy_1x3, myriadLayerConvolution_nightly, ) ); -INSTANTIATE_TEST_CASE_P(accuracy_5x5, myriadLayerConvolution_nightly, +INSTANTIATE_TEST_CASE_P(accuracy_5x5, myriadLayerConvolution_smoke, ::testing::Combine( ::testing::Values(MAKE_STRUCT(tensor_test_params, 1, 16, 32, 32) /*, MAKE_STRUCT(tensor_test_params, 1, 8, 511, 399) failed*/) @@ -549,7 +549,7 @@ INSTANTIATE_TEST_CASE_P(accuracy_5x5, myriadLayerConvolution_nightly, ) ); -INSTANTIATE_TEST_CASE_P(accuracy_7x7, myriadLayerConvolution_nightly, +INSTANTIATE_TEST_CASE_P(accuracy_7x7, myriadLayerConvolution_smoke, ::testing::Combine( ::testing::Values(MAKE_STRUCT(tensor_test_params, 1, 8, 32, 32) /*, MAKE_STRUCT(tensor_test_params, 1, 8, 511, 399) failed*/) @@ -566,7 +566,7 @@ INSTANTIATE_TEST_CASE_P(accuracy_7x7, myriadLayerConvolution_nightly, ) ); -INSTANTIATE_TEST_CASE_P(accuracy_3x3_large_input_1, myriadLayerConvolution_nightly, +INSTANTIATE_TEST_CASE_P(accuracy_3x3_large_input_1, myriadLayerConvolution_smoke, ::testing::Combine( ::testing::Values(MAKE_STRUCT(tensor_test_params, 1, 3, 720, 1280)) , ::testing::Values(MAKE_STRUCT(param_size, 3, 3)) @@ -579,7 +579,7 @@ INSTANTIATE_TEST_CASE_P(accuracy_3x3_large_input_1, myriadLayerConvolution_night ) ); -INSTANTIATE_TEST_CASE_P(accuracy_3x3_large_input_2, myriadLayerConvolution_nightly, +INSTANTIATE_TEST_CASE_P(accuracy_3x3_large_input_2, myriadLayerConvolution_smoke, ::testing::Combine( ::testing::Values(MAKE_STRUCT(tensor_test_params, 1, 24, 357, 637)) , ::testing::Values(MAKE_STRUCT(param_size, 3, 3)) @@ -593,7 +593,7 @@ INSTANTIATE_TEST_CASE_P(accuracy_3x3_large_input_2, myriadLayerConvolution_night ); -INSTANTIATE_TEST_CASE_P(accuracy_3x3_large_input_3, myriadLayerConvolution_nightly, +INSTANTIATE_TEST_CASE_P(accuracy_3x3_large_input_3, myriadLayerConvolution_smoke, ::testing::Combine( ::testing::Values(MAKE_STRUCT(tensor_test_params, 1, 16, 359, 639)) , ::testing::Values(MAKE_STRUCT(param_size, 3, 3)) @@ -606,7 +606,7 @@ INSTANTIATE_TEST_CASE_P(accuracy_3x3_large_input_3, myriadLayerConvolution_night ) ); -INSTANTIATE_TEST_CASE_P(accuracy_1x1_large_input, myriadLayerConvolution_nightly, +INSTANTIATE_TEST_CASE_P(accuracy_1x1_large_input, myriadLayerConvolution_smoke, ::testing::Combine( ::testing::Values(MAKE_STRUCT(tensor_test_params, 1, 24, 355, 635)) , ::testing::Values(MAKE_STRUCT(param_size, 1, 1)) @@ -619,7 +619,7 @@ INSTANTIATE_TEST_CASE_P(accuracy_1x1_large_input, myriadLayerConvolution_nightly ) ); -INSTANTIATE_TEST_CASE_P(accuracy_small_input_0, myriadLayerConvolution_nightly, +INSTANTIATE_TEST_CASE_P(accuracy_small_input_0, myriadLayerConvolution_smoke, ::testing::Combine( ::testing::Values(MAKE_STRUCT(tensor_test_params, 1, 128, 38, 38)) , ::testing::Values(MAKE_STRUCT(param_size, 3, 3)) @@ -631,7 +631,7 @@ INSTANTIATE_TEST_CASE_P(accuracy_small_input_0, myriadLayerConvolution_nightly, , ::testing::Values(vpu::LayoutPreference::ChannelMinor) ) ); -INSTANTIATE_TEST_CASE_P(accuracy_small_input_1, myriadLayerConvolution_nightly, +INSTANTIATE_TEST_CASE_P(accuracy_small_input_1, myriadLayerConvolution_smoke, ::testing::Combine( ::testing::Values(MAKE_STRUCT(tensor_test_params, 1, 256, 2, 3)) , ::testing::Values(MAKE_STRUCT(param_size, 3, 3)) @@ -643,7 +643,7 @@ INSTANTIATE_TEST_CASE_P(accuracy_small_input_1, myriadLayerConvolution_nightly, , ::testing::Values(vpu::LayoutPreference::ChannelMinor) ) ); -INSTANTIATE_TEST_CASE_P(accuracy_small_input_2, myriadLayerConvolution_nightly, +INSTANTIATE_TEST_CASE_P(accuracy_small_input_2, myriadLayerConvolution_smoke, ::testing::Combine( ::testing::Values(MAKE_STRUCT(tensor_test_params, 1, 256, 2, 2)) , ::testing::Values(MAKE_STRUCT(param_size, 3, 3)) @@ -655,7 +655,7 @@ INSTANTIATE_TEST_CASE_P(accuracy_small_input_2, myriadLayerConvolution_nightly, , ::testing::Values(vpu::LayoutPreference::ChannelMinor) ) ); -INSTANTIATE_TEST_CASE_P(accuracy_small_input_3, myriadLayerConvolution_nightly, +INSTANTIATE_TEST_CASE_P(accuracy_small_input_3, myriadLayerConvolution_smoke, ::testing::Combine( ::testing::Values(MAKE_STRUCT(tensor_test_params, 1, 256, 1, 1)) , ::testing::Values(MAKE_STRUCT(param_size, 3, 3)) diff --git a/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_convolution_test.hpp b/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_convolution_test.hpp index 18e16ffe0c4..9beac09790d 100644 --- a/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_convolution_test.hpp +++ b/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_convolution_test.hpp @@ -22,12 +22,12 @@ PRETTY_PARAM(dilation_factor, param_size); PRETTY_PARAM(layoutPreference, vpu::LayoutPreference); typedef myriadLayerTestBaseWithParam> myriadLayerConvolution_nightly; + , out_channels, group, dilation_factor, layoutPreference >> myriadLayerConvolution_smoke; typedef myriadLayerTestBaseWithParam> myriadLayerConvolutionTensorFlow_nightly; + , group, dilation_factor, layoutPreference >> myriadLayerConvolutionTensorFlow_smoke; -TEST_P(myriadLayerConvolution_nightly, Convolution) { +TEST_P(myriadLayerConvolution_smoke, Convolution) { tensor_test_params input_dims = get<0>(GetParam()); param_size kernel = get<1>(GetParam()); param_size stride = get<2>(GetParam()); @@ -89,7 +89,7 @@ TEST_P(myriadLayerConvolution_nightly, Convolution) { CompareCommonAbsolute(outputBlob, _refBlob, maxerr); } -TEST_P(myriadLayerConvolutionTensorFlow_nightly, Convolution) { +TEST_P(myriadLayerConvolutionTensorFlow_smoke, Convolution) { tensor_test_params input_dims = get<0>(GetParam()); tensor_test_params output_dims = get<1>(GetParam()); param_size kernel = get<2>(GetParam()); @@ -173,10 +173,10 @@ void loadConstData(InferenceEngine::Blob::Ptr blob) { } } -class myriadLayers_3X3X3_ConstInput_nightly: public ConvolutionTest{ +class myriadLayers_3X3X3_ConstInput_smoke: public ConvolutionTest{ }; -TEST_P(myriadLayers_3X3X3_ConstInput_nightly, Convolution) { +TEST_P(myriadLayers_3X3X3_ConstInput_smoke, Convolution) { auto p = ::testing::WithParamInterface>::GetParam(); const auto layoutPreference = std::get<6>(p); @@ -215,11 +215,11 @@ TEST_P(myriadLayers_3X3X3_ConstInput_nightly, Convolution) { /* IR version 3 tests, main difference is a changes in padding parameters definitions */ typedef std::tuple IR3_params; -class myriadLayers_IR3_ConvTests_nightly: public myriadLayersTests_nightly, /*input tensor, kernel, stride, pads_begin, pads_end, out_channel, group */ +class myriadLayers_IR3_ConvTests_smoke: public myriadLayersTests_nightly, /*input tensor, kernel, stride, pads_begin, pads_end, out_channel, group */ public testing::WithParamInterface { }; -TEST_P(myriadLayers_IR3_ConvTests_nightly, Conv) { +TEST_P(myriadLayers_IR3_ConvTests_smoke, Conv) { std::map params; InferenceEngine::SizeVector output_tensor; int32_t IW = 0; @@ -280,11 +280,11 @@ TEST_P(myriadLayers_IR3_ConvTests_nightly, Conv) { CompareCommonAbsolute(_outputMap.begin()->second, getReferenceOutput(), maxerr); } -class myriadLayers_BatchTest_ConvTests_nightly: public myriadLayersTests_nightly, /*input tensor, kernel, stride, pads_begin, pads_end, out_channel, group */ +class myriadLayers_BatchTest_ConvTests_smoke: public myriadLayersTests_nightly, /*input tensor, kernel, stride, pads_begin, pads_end, out_channel, group */ public testing::WithParamInterface { }; -class myriadLayers_BatchTest2_ConvTests_nightly: public myriadLayersTests_nightly, /*input tensor, kernel, stride, pads_begin, pads_end, out_channel, group */ +class myriadLayers_BatchTest2_ConvTests_smoke: public myriadLayersTests_nightly, /*input tensor, kernel, stride, pads_begin, pads_end, out_channel, group */ public testing::WithParamInterface { }; @@ -335,7 +335,7 @@ static void genTestData(InferenceEngine::Blob::Ptr blob) { } } -TEST_P(myriadLayers_BatchTest_ConvTests_nightly, Conv) { +TEST_P(myriadLayers_BatchTest_ConvTests_smoke, Conv) { std::map params; InferenceEngine::SizeVector output_tensor; int32_t IW = 0; @@ -586,7 +586,7 @@ static const std::string MODEL_RFCNN = R"V0G0N( )V0G0N"; -TEST_P(myriadLayers_BatchTest2_ConvTests_nightly, Conv) { +TEST_P(myriadLayers_BatchTest2_ConvTests_smoke, Conv) { std::map params; InferenceEngine::SizeVector output_tensor; int32_t IW = 0; diff --git a/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_copy_test.cpp b/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_copy_test.cpp index f5c70a53bda..e2526fbab8c 100644 --- a/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_copy_test.cpp +++ b/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_copy_test.cpp @@ -4,7 +4,7 @@ #include "myriad_layers_copy_test.hpp" -INSTANTIATE_TEST_CASE_P(accuracy, myriadLayerCopy_nightly, +INSTANTIATE_TEST_CASE_P(accuracy, myriadLayerCopy_smoke, ::testing::Combine( ::testing::Values(MAKE_STRUCT(nd_tensor_test_params, {36, 19, 20, 21}) , MAKE_STRUCT(nd_tensor_test_params, {7, 8, 5, 12}) diff --git a/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_copy_test.hpp b/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_copy_test.hpp index bf3f4cc6ae2..c93488d525f 100644 --- a/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_copy_test.hpp +++ b/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_copy_test.hpp @@ -14,9 +14,9 @@ using namespace InferenceEngine; PRETTY_PARAM(NDims, nd_tensor_test_params); -typedef myriadLayerTestBaseWithParam> myriadLayerCopy_nightly; +typedef myriadLayerTestBaseWithParam> myriadLayerCopy_smoke; -TEST_P(myriadLayerCopy_nightly, Copy) { +TEST_P(myriadLayerCopy_smoke, Copy) { nd_tensor_test_params input_dims = get<0>(GetParam()); int ndims = get<1>(GetParam()); diff --git a/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_crop_test.cpp b/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_crop_test.cpp index fd28beb7e5c..c7e2de4bc12 100644 --- a/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_crop_test.cpp +++ b/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_crop_test.cpp @@ -5,7 +5,7 @@ #include "myriad_layers_crop_test.hpp" INSTANTIATE_TEST_CASE_P( - accuracy_Crop, myriadLayerCropOneInputAndDim_nightly, + accuracy_Crop, myriadLayerCropOneInputAndDim_smoke, ::testing::Combine( ::testing::ValuesIn(s_tileTensors1), ::testing::ValuesIn(s_tileTensors2), @@ -15,7 +15,7 @@ INSTANTIATE_TEST_CASE_P( ); INSTANTIATE_TEST_CASE_P( - accuracy_Crop1, myriadLayerCropOneInput_nightly, + accuracy_Crop1, myriadLayerCropOneInput_smoke, ::testing::Combine( ::testing::ValuesIn(s_tileTensors1), ::testing::ValuesIn(s_tileTensors2), @@ -25,7 +25,7 @@ INSTANTIATE_TEST_CASE_P( ); INSTANTIATE_TEST_CASE_P( - accuracy_Crop2, myriadLayerCropTwoInputs_nightly, + accuracy_Crop2, myriadLayerCropTwoInputs_smoke, ::testing::Combine( ::testing::ValuesIn(s_tileTensors1), ::testing::ValuesIn(s_tileTensors2), diff --git a/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_crop_test.hpp b/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_crop_test.hpp index c9d136000f7..8f9fa91b6b2 100644 --- a/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_crop_test.hpp +++ b/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_crop_test.hpp @@ -14,9 +14,9 @@ PRETTY_PARAM(dim, InferenceEngine::SizeVector) PRETTY_PARAM(crop_begin, InferenceEngine::SizeVector) PRETTY_PARAM(crop_end, InferenceEngine::SizeVector) -typedef myriadLayerTestBaseWithParam> myriadLayerCropOneInputAndDim_nightly; -typedef myriadLayerTestBaseWithParam> myriadLayerCropOneInput_nightly; -typedef myriadLayerTestBaseWithParam> myriadLayerCropTwoInputs_nightly; +typedef myriadLayerTestBaseWithParam> myriadLayerCropOneInputAndDim_smoke; +typedef myriadLayerTestBaseWithParam> myriadLayerCropOneInput_smoke; +typedef myriadLayerTestBaseWithParam> myriadLayerCropTwoInputs_smoke; static void ref_crop(const Blob::Ptr src, Blob::Ptr dst, @@ -67,7 +67,7 @@ static void ref_crop(const Blob::Ptr src, } } -TEST_P(myriadLayerCropOneInputAndDim_nightly, CropWithOneInputAndDim) { +TEST_P(myriadLayerCropOneInputAndDim_smoke, CropWithOneInputAndDim) { auto param = GetParam(); tensor_test_params tensor1 = std::get<0>(param); tensor_test_params tensor2 = std::get<1>(param); @@ -101,7 +101,7 @@ TEST_P(myriadLayerCropOneInputAndDim_nightly, CropWithOneInputAndDim) { CompareCommonAbsolute(_outputMap.begin()->second, _refBlob, ERROR_BOUND); } -TEST_P(myriadLayerCropOneInput_nightly, CropWithOneInput) { +TEST_P(myriadLayerCropOneInput_smoke, CropWithOneInput) { auto param = GetParam(); tensor_test_params tensor1 = std::get<0>(param); tensor_test_params tensor2 = std::get<1>(param); @@ -135,7 +135,7 @@ TEST_P(myriadLayerCropOneInput_nightly, CropWithOneInput) { CompareCommonAbsolute(_outputMap.begin()->second, _refBlob, ERROR_BOUND); } -TEST_P(myriadLayerCropTwoInputs_nightly, CropWithTwoInputs) { +TEST_P(myriadLayerCropTwoInputs_smoke, CropWithTwoInputs) { auto param = GetParam(); tensor_test_params tensor1 = std::get<0>(param); tensor_test_params tensor2 = std::get<1>(param); diff --git a/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_custom_test.cpp b/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_custom_test.cpp index d1413efa6a4..a8352dbfa52 100644 --- a/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_custom_test.cpp +++ b/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_custom_test.cpp @@ -4,26 +4,27 @@ #include "myriad_layers_custom_test.hpp" -INSTANTIATE_TEST_CASE_P(accuracy, myriadLayersTestsShuffleChannel_nightly, +INSTANTIATE_TEST_CASE_P(accuracy, myriadLayersTestsShuffleChannel_smoke, ::testing::Combine( ::testing::ValuesIn(s_ShuffleChannelTensors), ::testing::ValuesIn(s_ShuffleChannelGroup), ::testing::ValuesIn(s_CustomConfig))); -INSTANTIATE_TEST_CASE_P(accuracy, myriadLayersTestsQuantize_nightly, +INSTANTIATE_TEST_CASE_P(accuracy, myriadLayersTestsFakeQuantize_smoke, ::testing::Combine( ::testing::ValuesIn(s_QuantizeTensors), ::testing::ValuesIn(s_QuantizeLevels), + ::testing::Values(IRVersion::v7, IRVersion::v10), ::testing::ValuesIn(s_CustomConfig))); -INSTANTIATE_TEST_CASE_P(accuracy, myriadLayersTestsQuantizeBinarize_nightly, +INSTANTIATE_TEST_CASE_P(accuracy, myriadLayersTestsQuantizeBinarize_smoke, ::testing::Combine( ::testing::ValuesIn(s_QuantizeTensors), ::testing::ValuesIn(s_QuantizeLevels), ::testing::ValuesIn(s_QuantizeSwitchOut), ::testing::ValuesIn(s_CustomConfig))); -INSTANTIATE_TEST_CASE_P(accuracy, myriadLayersTestsBinaryConvolution_nightly, +INSTANTIATE_TEST_CASE_P(accuracy, myriadLayersTestsBinaryConvolution_smoke, ::testing::Combine( ::testing::ValuesIn(s_BinaryConvolutionTensors), ::testing::ValuesIn(s_BinaryConvolutionDilations), @@ -32,7 +33,18 @@ INSTANTIATE_TEST_CASE_P(accuracy, myriadLayersTestsBinaryConvolution_nightly, ::testing::ValuesIn(s_BinaryConvolutionStrides), ::testing::ValuesIn(s_CustomConfig))); -INSTANTIATE_TEST_CASE_P(accuracy, myriadLayersTestsExperimentalDetectronPriorGridGenerator_nightly, +INSTANTIATE_TEST_CASE_P(accuracy, myriadLayersTestsExperimentalDetectronPriorGridGenerator_smoke, ::testing::Combine( ::testing::ValuesIn(s_ExperimentalDetectronPriorGridGeneratorImageDims), ::testing::ValuesIn(s_CustomConfig))); + +INSTANTIATE_TEST_CASE_P(accuracy, myriadLayersTestsCorrelate_smoke, + ::testing::Combine( + ::testing::ValuesIn(s_CorrelateParams), + ::testing::ValuesIn(s_CustomConfig))); + +INSTANTIATE_TEST_CASE_P(accuracy, myriadLayersTestsSpatialTransform_smoke, + ::testing::Combine( + ::testing::ValuesIn(s_SpatialTransformInputs), + ::testing::ValuesIn(s_SpatialTransformTheta), + ::testing::ValuesIn(s_CustomConfig))); diff --git a/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_custom_test.hpp b/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_custom_test.hpp index d50e170db1b..2e838f71a26 100644 --- a/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_custom_test.hpp +++ b/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_custom_test.hpp @@ -2,7 +2,12 @@ // SPDX-License-Identifier: Apache-2.0 // +#pragma once + #include "myriad_layers_tests.hpp" +#include +#include +#include using namespace InferenceEngine; @@ -67,6 +72,7 @@ static void refQuantize(const Blob::Ptr src, int32_t W = 1; int32_t H = 1; int32_t C = 1; + get_dims(src, W, H, C); for (int c = 0; c < C; c++) { @@ -75,6 +81,10 @@ static void refQuantize(const Blob::Ptr src, float olow = PrecisionUtils::f16tof32(output_low->size() == 1 ? output_low_data[0] : output_low_data[c]); float ohigh = PrecisionUtils::f16tof32(output_high->size() == 1 ? output_high_data[0] : output_high_data[c]); + // emulate half math to be close to half float SHAVE implementation + float a = PrecisionUtils::f16tof32(PrecisionUtils::f32tof16((float)(levels - 1) / (ihigh - ilow))); + float b = PrecisionUtils::f16tof32(PrecisionUtils::f32tof16((ohigh - olow) / (float)(levels - 1))); + for (int h = 0; h < H; h++) { for (int w = 0; w < W; w++) { int idx = (isCHW) ? c*W*H + h*W + w : c + h*W*C + w*C; @@ -85,9 +95,15 @@ static void refQuantize(const Blob::Ptr src, dst_val = olow; } else if (src_val > ihigh) { dst_val = ohigh; - } else { - dst_val = round((src_val - ilow) * ((float)(levels - 1) / (ihigh - ilow))) * ((ohigh - olow) / (float)(levels - 1))+ olow; - //dst_val = round((src_val - ilow) / (ihigh - ilow) * (levels - 1)) / (levels - 1) * (ohigh - olow) + olow; + } else { + if(!(ihigh - ilow) || !(levels - 1)) { + dst_val = olow; + } else { + // quantization pass + float quantized = PrecisionUtils::f16tof32(PrecisionUtils::f32tof16((src_val - ilow) * a)); + // de-quantization pass + dst_val = PrecisionUtils::f16tof32(PrecisionUtils::f32tof16(roundf(quantized) * b)) + olow; + } } dst_data[idx] = PrecisionUtils::f32tof16(dst_val); @@ -308,6 +324,290 @@ static void refExperimentalDetectronPriorGridGenerator( } } } + +static void rearrange(const ie_fp16* in, ie_fp16* out, int num, int channels, int width, int height, + int widthheight, int padding, int pwidthheight) +{ + (void) height; + (void) pwidthheight; + + ASSERT_TRUE(num == 1) << "batch is not supported for Myriad"; + + for (int xy = 0; xy < widthheight; xy++) + { + for (int ch = 0; ch < channels; ch++) + { + ie_fp16 value = in[ch * widthheight + xy]; + + int xpad = (xy % width + padding); + int ypad = (xy / width + padding); + int xypad = ypad * (width + 2 * padding) + xpad; + + out[xypad * channels + ch] = value; + } + } +} + +static void correlate(int nthreads, int num, int topwidth, int topheight, int topchannels, int topcount, + int max_displacement, int neighborhood_grid_radius, int neighborhood_grid_width, + int kernel_radius, int kernel_size, int stride1, int stride2, + int bottomwidth, int bottomheight, int bottomchannels, + const ie_fp16* bottom0, const ie_fp16* bottom1, ie_fp16* top) +{ + (void) nthreads; + (void) kernel_radius; + (void) topcount; + (void) bottomheight; + (void) num; + + const int sumelems = kernel_size * kernel_size * bottomchannels; + + auto patch_data = std::vector(sumelems); + + for (int blockIdx_y = 0; blockIdx_y < topheight; blockIdx_y++) + { + for (int blockIdx_x = 0; blockIdx_x < topwidth; blockIdx_x++) + { + int x1 = blockIdx_x * stride1 + max_displacement; + int y1 = blockIdx_y * stride1 + max_displacement; + // Load 3D patch into shared memory + for (int j = 0; j < kernel_size; j++) + { + for (int i = 0; i < kernel_size; i++) + { + int idx1 = ( j * kernel_size + i) * bottomchannels; + int idx2 = ((y1 + j) * bottomwidth + x1 + i) * bottomchannels; + + for (int ch = 0; ch < bottomchannels; ch++) + patch_data[idx1 + ch] = bottom0[idx2 + ch]; + } + } + + for (int top_channel = 0; top_channel < topchannels; top_channel++) + { + int x2 = x1 + (top_channel % neighborhood_grid_width - neighborhood_grid_radius) * stride2; + int y2 = y1 + (top_channel / neighborhood_grid_width - neighborhood_grid_radius) * stride2; + + float sum = (0.0f); + for (int j = 0; j < kernel_size; j++) + { + for (int i = 0; i < kernel_size; i++) + { + int idx1 = ( j * kernel_size + i) * bottomchannels; + int idx2 = ((y2 + j) * bottomwidth + x2 + i) * bottomchannels; + + for (int ch = 0; ch < bottomchannels; ch++) + sum += PrecisionUtils::f16tof32(patch_data[idx1 + ch]) * PrecisionUtils::f16tof32(bottom1[idx2 + ch]); + } + } + top[top_channel * topheight * topwidth + blockIdx_y * topwidth + blockIdx_x] + = PrecisionUtils::f32tof16(sum / (float)sumelems); + } + } + } +} + +static void refCorrelate(const Blob::Ptr in0, + const Blob::Ptr in1, + Blob::Ptr out, + int kernel_size, int max_displacement, int pad_size, + int stride1, int stride2) { + // Correlation type = MULTIPLY + ASSERT_NE(in0, nullptr); + ASSERT_NE(in1, nullptr); + ASSERT_NE(out, nullptr); + + const ie_fp16 *in0_data = in0->buffer(); + const ie_fp16 *in1_data = in1->buffer(); + ie_fp16 *out_data = out->buffer(); + ASSERT_NE(in0_data, nullptr); + ASSERT_NE(in1_data, nullptr); + ASSERT_NE(out_data, nullptr); + + int32_t IW0 = 1; + int32_t IH0 = 1; + int32_t IC0 = 1; + get_dims(in0, IW0, IH0, IC0); + int32_t IW1 = 1; + int32_t IH1 = 1; + int32_t IC1 = 1; + get_dims(in1, IW1, IH1, IC1); + ASSERT_EQ(IW0, IW1); + ASSERT_EQ(IH0, IH1); + ASSERT_EQ(IC0, IC1); + + int32_t OW = 1; + int32_t OH = 1; + int32_t OC = 1; + get_dims(out, OW, OH, OC); + + const int bottomchannels = IC0; + + const int paddedbottomwidth = IW0 + 2 * pad_size; + const int paddedbottomheight = IH0 + 2 * pad_size; + + const int kernel_radius = kernel_size / 2; //size of unreachable border region (on each side) + const int border_size = max_displacement + kernel_radius; //size of unreachable border region (on each side) + + const int top_width = (int)ceilf((float)(paddedbottomwidth - border_size * 2) / (float)stride1); + const int top_height = (int)ceilf((float)(paddedbottomheight - border_size * 2) / (float)stride1); + + ASSERT_TRUE(top_width >= 1 && top_height >= 1) + << "Correlation cannot be done with current settings. Neighborhood and kernel don't fit in blob"; + + // Given a center position in image 1, + // how many displaced positions in -x / +x direction do we consider in image 2 (neighborhoodGridWidth): + const int neighborhood_grid_radius = max_displacement / stride2; + const int neighborhood_grid_width = 2 * neighborhood_grid_radius + 1; + + const int top_channels = neighborhood_grid_width * neighborhood_grid_width; + + ASSERT_TRUE(OC == top_channels && OH == top_height && OW == top_width) + << "input and output blobs have incompatible shapes"; + + auto rbot1 = std::vector(paddedbottomheight * paddedbottomwidth * bottomchannels); + auto rbot2 = std::vector(paddedbottomheight * paddedbottomwidth * bottomchannels); + + const int bnum = 1; + const int topcount = top_width * top_height * top_channels; + + const int pwidthheight = (IW0 + 2 * pad_size) * (IH0 + 2 * pad_size); + + rearrange(in0_data, rbot1.data(), bnum, IC0, IW0, IH0, IW0 * IH0, pad_size, pwidthheight); + rearrange(in1_data, rbot2.data(), bnum, IC0, IW0, IH0, IW0 * IH0, pad_size, pwidthheight); + + const int height = IH0 + 2 * pad_size; + const int width = IW0 + 2 * pad_size; + correlate(topcount, bnum, top_width, top_height, top_channels, topcount, + max_displacement, neighborhood_grid_radius, neighborhood_grid_width, + kernel_radius, kernel_size, stride1, stride2, width, height, IC0, + rbot1.data(), rbot2.data(), out_data); +} + +static float transform_forward_cpu(const ie_fp16* pic, const float px, const float py, int W, int H) { + float res = 0.0f; + float x = (px + 1) / 2 * H; + float y = (py + 1) / 2 * W; + int m, n, k, l; + float w; + k = (floorf(x)); + l = (floorf(y)); + m = floorf(x); + n = floorf(y); + w = 0; + + if (k >= 0 && k < H && l >= 0 && l < W) { + w = fmaxf(0.0f, 1 - fabsf(x - m)) * fmaxf(0.0f, 1 - fabsf(y - n)); + res += w * PrecisionUtils::f16tof32(pic[k * W + l]); + } + + k = (floorf(x) + 1); + l = (floorf(y)); + m = floorf(x) + 1; + n = floorf(y); + + w = 0; + if (k >= 0 && k < H && l >= 0 && l < W) { + w = fmaxf(0.0f, 1 - fabsf(x - m)) * fmaxf(0.0f, 1 - fabsf(y - n)); + res += w * PrecisionUtils::f16tof32(pic[k * W + l]); + } + k = (floorf(x)); + l = (floorf(y) + 1); + m = floorf(x); + n = floorf(y) + 1; + w = 0; + if (k >= 0 && k < H && l >= 0 && l < W) { + w = fmaxf(0.0f, 1 - fabsf(x - m)) * fmaxf(0.0f, 1 - fabsf(y - n)); + res += w * PrecisionUtils::f16tof32(pic[k * W + l]); + } + k = (floorf(x) + 1); + l = (floorf(y) + 1); + m = floorf(x) + 1; + n = floorf(y) + 1; + w = 0; + + if (k >= 0 && k < H && l >= 0 && l < W) { + w = fmaxf(0.0f, 1 - fabsf(x - m)) * fmaxf(0.0f, 1 - fabsf(y - n)); + res += w * PrecisionUtils::f16tof32(pic[k * W + l]); + } + + return PrecisionUtils::f32tof16(res); +} + +static void matrixMult(const std::vector& A, const std::vector& B, std::vector& C, + const int m, const int n, const int k, const int transposeB) { + if (transposeB) { + for (int rowA = 0; rowA < m; rowA++) { + for (int rowB = 0; rowB < n; rowB++) { + float sum = 0; + for (int colA = 0; colA < k; colA++) { + sum += A[rowA * k + colA] * B[rowB * k + colA]; + } + C[rowA * n + rowB] = sum; + } + } + } else { + for (int rowA = 0; rowA < m; rowA++) { + for (int colB = 0; colB < n; colB++) { + float sum = 0; + for (int colA = 0; colA < k; colA++) { + sum += A[rowA * k + colA] * B[colA * n + colB]; + } + C[rowA * n + colB] = sum; + } + } + } +} + +static void refSpatialTransform(const Blob::Ptr& src, const Blob::Ptr& theta, Blob::Ptr dst) { + ASSERT_NE(src, nullptr); + ASSERT_NE(theta, nullptr); + ASSERT_NE(dst, nullptr); + + const ie_fp16 *src_data = src->buffer(); + const ie_fp16 *theta_data = theta->buffer(); + ie_fp16 *dst_data = dst->buffer(); + ASSERT_NE(src_data, nullptr); + ASSERT_NE(theta_data, nullptr); + ASSERT_NE(dst_data, nullptr); + ASSERT_EQ(theta->size(), 6); + + int C = src->getTensorDesc().getDims()[1]; + int H = src->getTensorDesc().getDims()[2]; + int W = src->getTensorDesc().getDims()[3]; + + auto input_grid_data = std::vector(2*H*W); + auto output_grid_data = std::vector(3*H*W); + auto theta_float = std::vector(6); + for (size_t i = 0; i < 6; i++) { + theta_float[i] = PrecisionUtils::f16tof32(theta_data[i]); + } + + for (int i = 0; i < H * W; ++i) { + output_grid_data[3 * i] = ((i / W) * 1.0f / H * 2.0f - 1.0f); + output_grid_data[3 * i + 1] = ((i % W) * 1.0f / W * 2.0f - 1.0f); + output_grid_data[3 * i + 2] = 1.0f; + } + // Actually execute + int M_size = H * W; + int N_size = 2; + int K_size = 3; + matrixMult(output_grid_data, theta_float, input_grid_data, M_size, N_size, K_size, 1); + for (int j = 0; j < C; ++j) { + for (int s = 0; s < H; ++s) { + for (int t = 0; t < W; ++t) { + int row_idx = W * s + t; + float px = input_grid_data[row_idx * 2 + 0]; + float py = input_grid_data[row_idx * 2 + 1]; + + size_t dst_offset = (j * H + s) * W + t; + size_t src_offset = (j * H + 0) * W + 0; + dst_data[dst_offset] = transform_forward_cpu(src_data + src_offset, px, py, W, H); + } + } + } +} + static std::vector s_CustomConfig = { #ifdef VPU_HAS_CUSTOM_KERNELS getIELibraryPath() + "/vpu_custom_kernels/customLayerBindings.xml" @@ -321,15 +621,26 @@ PRETTY_PARAM(Dilations, int) PRETTY_PARAM(Kernel, param_size) PRETTY_PARAM(Strides, int) -typedef myriadLayerTestBaseWithParam> myriadLayersTestsShuffleChannel_nightly; -typedef myriadLayerTestBaseWithParam> myriadLayersTestsQuantize_nightly; -typedef myriadLayerTestBaseWithParam> myriadLayersTestsQuantizeBinarize_nightly; -typedef myriadLayerTestBaseWithParam> myriadLayersTestsBinaryConvolution_nightly; -typedef myriadLayerTestBaseWithParam, std::string>> -myriadLayersTestsExperimentalDetectronPriorGridGenerator_nightly; +typedef myriadLayerTestBaseWithParam> myriadLayersTestsShuffleChannel_smoke; +typedef myriadLayerTestBaseWithParam> myriadLayersTestsFakeQuantize_smoke; +typedef myriadLayerTestBaseWithParam> myriadLayersTestsQuantizeBinarize_smoke; +typedef myriadLayerTestBaseWithParam> myriadLayersTestsBinaryConvolution_smoke; +typedef myriadLayerTestBaseWithParam, std::string>> myriadLayersTestsExperimentalDetectronPriorGridGenerator_smoke; +typedef myriadLayerTestBaseWithParam, std::string>> myriadLayersTestsSpatialTransform_smoke; -TEST_P(myriadLayersTestsShuffleChannel_nightly, ShuffleChannel) { - tensor_test_params dims = std::get<0>(GetParam()); +struct CorrelateParams { + tensor_test_params dims; + int kernel_size; + int pad_size; + int max_displacement; + int stride1; + int stride2; +}; + +typedef myriadLayerTestBaseWithParam> myriadLayersTestsCorrelate_smoke; + +TEST_P(myriadLayersTestsShuffleChannel_smoke, ShuffleChannel) { + tensor_test_params dims = std::get<0>(GetParam()); int group = std::get<1>(GetParam()); std::string customConfig = std::get<2>(GetParam()); @@ -363,62 +674,78 @@ static std::vector s_ShuffleChannelGroup = { 2 }; -TEST_P(myriadLayersTestsQuantize_nightly, Quantize) { +TEST_P(myriadLayersTestsFakeQuantize_smoke, FakeQuantize) { tensor_test_params dims = std::get<0>(GetParam()); int levels = std::get<1>(GetParam()); - std::string customConfig = std::get<2>(GetParam()); + _irVersion = std::get<2>(GetParam()); + std::string customConfig = std::get<3>(GetParam()); - if(!customConfig.empty() && !CheckMyriadX()) { - GTEST_SKIP()<<"Custom layers for MYRIAD2 not supported"; + if (!customConfig.empty() && !CheckMyriadX()) { + GTEST_SKIP() << "Custom layers for MYRIAD2 not supported"; } _config[VPU_CONFIG_KEY(CUSTOM_LAYERS)] = customConfig; - IN_OUT_desc inpt(5); - for (int i = 0; i < inpt.size(); ++i) { - inpt[i].resize(4); - inpt[i][0] = dims.n; - inpt[i][1] = 1; - inpt[i][2] = 1; - inpt[i][3] = 1; - } - inpt[0][1] = dims.c; - inpt[0][2] = dims.h; - inpt[0][3] = dims.w; - for (int i = 1; i < inpt.size(); ++i) { - if (rand()%2 > 0) { - inpt[i][1] = dims.c; - } - } + srand(42); - SetInputTensors(inpt); + const auto inputFqSize = rand() % 2 ? 1 : dims.c; + const auto outputFqSize = rand() % 2 ? 1 : dims.c; + + const auto inputDims = IN_OUT_desc{dims.asVector(), + {1, inputFqSize, 1, 1}, + {1, inputFqSize, 1, 1}, + {1, outputFqSize, 1, 1}, + {1, outputFqSize, 1, 1} + }; + + SetInputTensors(inputDims); SetOutputTensor(dims); std::map params; params["levels"] = std::to_string(levels); - ASSERT_NO_FATAL_FAILURE(makeSingleLayerNetwork(LayerInitParams("FakeQuantize").params(params))); + ASSERT_NO_FATAL_FAILURE(makeSingleLayerNetwork( + LayerInitParams("FakeQuantize").params(params), + NetworkInitParams() + .layoutPreference(vpu::LayoutPreference::ChannelMajor) + .lockLayout(true))); + + auto inputBlobs = std::vector{}; + inputBlobs.reserve(5); + for (const auto& inputBlob : _inputMap) { + inputBlobs.push_back(inputBlob.second); + } + + const auto generateQuantBounds = [](const Blob::Ptr& lowBlob, const Blob::Ptr& highBlob) { + IE_ASSERT(lowBlob->size() == highBlob->size()); + IE_ASSERT(lowBlob->getTensorDesc().getDims() == highBlob->getTensorDesc().getDims()); + + const auto lowBound = lowBlob->buffer().as(); + const auto highBound = highBlob->buffer().as(); + for (std::size_t i = 0; i < lowBlob->size(); i++) { + const float val1 = rand() % 256; + const float val2 = 255.0f - fabs(val1); + lowBound[i] = PrecisionUtils::f32tof16(std::min(val1, val2)); + highBound[i] = PrecisionUtils::f32tof16(std::max(val1, val2)); + } + }; + + generateQuantBounds(inputBlobs[1], inputBlobs[2]); + generateQuantBounds(inputBlobs[3], inputBlobs[4]); ASSERT_TRUE(Infer()); - std::vector inputBlobs(inpt.size()); - auto inptIter = _inputMap.begin(); - for (int i = 0; i < inpt.size(); i++) { - inputBlobs[i] = inptIter->second; - inptIter++; - } - ASSERT_NO_FATAL_FAILURE(refQuantize(inputBlobs[0], inputBlobs[1], inputBlobs[2], inputBlobs[3], inputBlobs[4], _refBlob, - levels, false)); + levels, true)); - CompareCommonAbsolute(_outputMap.begin()->second, _refBlob, 0.01f); + CompareCommonAbsolute(_outputMap.begin()->second, _refBlob, 1.f); } -TEST_P(myriadLayersTestsQuantizeBinarize_nightly, Quantize_Binarization) { +TEST_P(myriadLayersTestsQuantizeBinarize_smoke, Quantize_Binarization) { std::string model = R"V0G0N( @@ -548,10 +875,10 @@ TEST_P(myriadLayersTestsQuantizeBinarize_nightly, Quantize_Binarization) { int OH = dims.h; int OW = dims.w; - int input_low_size = (rand()%2>0) ? dims.c : 1; - int input_high_size = (levels == 2) ? input_low_size : ((rand()%2>0) ? dims.c : 1); - int output_low_size = (rand()%2>0) ? dims.c : 1; - int output_high_size = (levels == 2) ? output_low_size : ((rand()%2>0) ? dims.c : 1); + int input_low_size = (rand()%2>0) ? dims.c : 1; + int input_high_size = (levels == 2) ? input_low_size : ((rand()%2>0) ? dims.c : 1); + int output_low_size = (rand()%2>0) ? dims.c : 1; + int output_high_size = (levels == 2) ? output_low_size : ((rand()%2>0) ? dims.c : 1); model.replace( model.find("@IB@"), sizeof("@IB@") -1, std::to_string(IB)); model.replace( model.find("@IB@"), sizeof("@IB@") -1, std::to_string(IB)); @@ -717,7 +1044,7 @@ static std::vector s_QuantizeSwitchOut = { 1 }; -TEST_P(myriadLayersTestsBinaryConvolution_nightly, BinaryConvolution) { +TEST_P(myriadLayersTestsBinaryConvolution_smoke, BinaryConvolution) { tensor_test_params dims = std::get<0>(GetParam()); int dilations = std::get<1>(GetParam()); int group = std::get<2>(GetParam()); @@ -791,7 +1118,7 @@ static std::vector s_BinaryConvolutionStrides = { 1, 2 }; -TEST_P(myriadLayersTestsExperimentalDetectronPriorGridGenerator_nightly, +TEST_P(myriadLayersTestsExperimentalDetectronPriorGridGenerator_smoke, ExperimentalDetectronPriorGridGenerator) { // Setup parameters and configuration. @@ -852,3 +1179,137 @@ s_ExperimentalDetectronPriorGridGeneratorImageDims = { {1, 128, 30, 30} }; +TEST_P(myriadLayersTestsCorrelate_smoke, Correlate) { + const auto test = std::get<0>(GetParam()); + const auto dims = test.dims; + const int kernel_size = test.kernel_size; + const int pad_size = test.pad_size; + const int max_displacement = test.max_displacement; + const int stride1 = test.stride1; + const int stride2 = test.stride2; + const std::string customConfig = std::get<1>(GetParam()); + + if(!customConfig.empty() && !CheckMyriadX()) { + GTEST_SKIP() << "Custom layers for MYRIAD2 not supported"; + } + _config[VPU_CONFIG_KEY(CUSTOM_LAYERS)] = customConfig; + + const int paddedbottomwidth = dims.w + 2 * pad_size; + const int paddedbottomheight = dims.h + 2 * pad_size; + + const int kernel_radius = kernel_size / 2; //size of unreachable border region (on each side) + const int border_size = max_displacement + kernel_radius; //size of unreachable border region (on each side) + + const int neighborhood_grid_radius = max_displacement / stride2; + const int neighborhood_grid_width = 2 * neighborhood_grid_radius + 1; + + const int top_width = (int)ceilf((float) (paddedbottomwidth - border_size * 2) / (float) stride1); + const int top_height = (int)ceilf((float)(paddedbottomheight - border_size * 2) / (float)stride1); + const int top_channels = (test.max_displacement + 1) * (test.max_displacement + 1);// neighborhood_grid_width * neighborhood_grid_width; + + const auto inputTensors = IN_OUT_desc{dims.asVector(), dims.asVector()}; + const auto outputTensors = IN_OUT_desc{{1, (uint32_t)top_channels, (uint32_t)top_height, (uint32_t)top_width}}; + + SetInputTensors(inputTensors); + SetOutputTensors(outputTensors); + + std::map params = { + {"top_width", std::to_string(top_width)}, + {"top_height", std::to_string(top_height)}, + {"width", std::to_string(dims.w)}, + {"height", std::to_string(dims.h)}, + {"channels", std::to_string(dims.c)}, + {"displacement", std::to_string(max_displacement)}, + {"pad", std::to_string(pad_size)}, + {"neighborhood_grid_radius", std::to_string(neighborhood_grid_radius)}, + {"neighborhood_grid_width", std::to_string(neighborhood_grid_width)}, + {"kernel_size", std::to_string(kernel_size)}, + {"stride", std::to_string(stride1) + "," + std::to_string(stride2)}, + }; + + ASSERT_NO_FATAL_FAILURE(makeSingleLayerNetwork( + LayerInitParams("Correlate").params(params), + NetworkInitParams() + .layoutPreference(vpu::LayoutPreference::ChannelMajor) + .lockLayout(true))); + + std::vector input_blobs{}; + input_blobs.reserve(_inputMap.size()); + for (auto& input : _inputMap) { + // generate input data + for (int i = 0; i < dims.c * dims.h * dims. w; i++) { + const float corr_min = -1.744443f; + const float corr_max = 11.167725f; + float val = (corr_min + (float) rand() / ((float) RAND_MAX / (corr_max - corr_min + 1.f) + 1.f)); + + auto buf = input.second->buffer().as(); + buf[i] = PrecisionUtils::f32tof16(val); + } + + input_blobs.push_back(input.second); + } + const int output_size = top_width * top_height * top_channels; + for (int i = 0; i < output_size; i++) { + _outputMap.begin()->second->buffer().as()[i] = 0; + _refBlob->buffer().as()[i] = 0; + } + + ASSERT_TRUE(Infer()); + + refCorrelate(input_blobs[0], input_blobs[1], _refBlob, kernel_size, max_displacement, pad_size, stride1, stride2); + + CompareCommonAbsolute(_outputMap.begin()->second, _refBlob, 0.1f); +} + +static const std::vector s_CorrelateParams = { + { {1, 64, 48, 64}, 1, 8, 8, 1, 2 }, + { {1, 127, 12, 64}, 3, 8, 8, 1, 2 }, + { {1, 256, 48, 64}, 1, 20, 20, 1, 2 } +}; + +TEST_P(myriadLayersTestsSpatialTransform_smoke, SpatialTransform) { + const tensor_test_params dims = std::get<0>(GetParam()); + const std::array theta = std::get<1>(GetParam()); + const std::string customConfig = std::get<2>(GetParam()); + + if(!customConfig.empty() && !CheckMyriadX()) { + GTEST_SKIP() << "Custom layers for MYRIAD2 not supported"; + } + _config[VPU_CONFIG_KEY(CUSTOM_LAYERS)] = customConfig; + + SetInputTensors({dims.asVector(), {1, 1, 2, 3}}); + SetOutputTensor(dims); + + ASSERT_NO_FATAL_FAILURE(makeSingleLayerNetwork( + LayerInitParams("SpatialTransform"), + NetworkInitParams() + .layoutPreference(vpu::LayoutPreference::ChannelMajor) + .lockLayout(true))); + + auto theta_half = std::next(_inputMap.begin())->second; + for (int i = 0; i < 6; i++) { + theta_half->buffer().as()[i] = PrecisionUtils::f32tof16(theta[i]); + } + + ASSERT_TRUE(Infer()); + + ASSERT_NO_FATAL_FAILURE(refSpatialTransform(_inputMap.begin()->second, + std::next(_inputMap.begin())->second, + _refBlob)); + + CompareCommonAbsolute(_outputMap.begin()->second, _refBlob, 0.001f); +} + +static const std::vector s_SpatialTransformInputs = { + {{ 1, 3, 24, 94 }}, + {{ 1, 3, 96, 188 }}, + {{ 1, 3, 97, 189 }}, + {{ 1, 3, 98, 190 }}, + {{ 1, 3, 384, 512 }}, + {{ 1, 3, 24, 640 }}, +}; + +static const std::vector> s_SpatialTransformTheta = { + {1.2f, 0.2f, -0.2f, 0.2f, 1.2f, -0.2f}, + {1.f, 0.f, 0.f, 0.0f, 1.f, 0.f} +}; diff --git a/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_deconvolution_test.cpp b/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_deconvolution_test.cpp index 9a4703a0db1..b1f42b1bc76 100644 --- a/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_deconvolution_test.cpp +++ b/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_deconvolution_test.cpp @@ -4,7 +4,7 @@ #include "myriad_layers_deconvolution_test.hpp" -INSTANTIATE_TEST_CASE_P(accuracy_deconv_to_conv, myriadLayerDeconvolution_nightly, +INSTANTIATE_TEST_CASE_P(accuracy_deconv_to_conv, myriadLayerDeconvolution_smoke, ::testing::Combine( ::testing::Values(MAKE_STRUCT(tensor_test_params, 1, 6, 5, 6)) , ::testing::Values(MAKE_STRUCT(param_size, 3, 1), MAKE_STRUCT(param_size, 3, 3)) @@ -17,7 +17,7 @@ INSTANTIATE_TEST_CASE_P(accuracy_deconv_to_conv, myriadLayerDeconvolution_nightl ) ); -INSTANTIATE_TEST_CASE_P(accuracy_deconv_to_conv_2, myriadLayerDeconvolution_nightly, +INSTANTIATE_TEST_CASE_P(accuracy_deconv_to_conv_2, myriadLayerDeconvolution_smoke, ::testing::Combine( ::testing::Values(MAKE_STRUCT(tensor_test_params, 2, 256, 14, 14)) , ::testing::Values(MAKE_STRUCT(param_size, 2, 2), MAKE_STRUCT(param_size, 3, 3)) @@ -30,7 +30,7 @@ INSTANTIATE_TEST_CASE_P(accuracy_deconv_to_conv_2, myriadLayerDeconvolution_nigh ) ); -INSTANTIATE_TEST_CASE_P(accuracy_group, myriadLayerDeconvolution_nightly, +INSTANTIATE_TEST_CASE_P(accuracy_group, myriadLayerDeconvolution_smoke, ::testing::Combine( ::testing::Values(MAKE_STRUCT(tensor_test_params, 1, 384, 4, 2)) , ::testing::Values(MAKE_STRUCT(param_size, 2, 2) @@ -47,7 +47,7 @@ INSTANTIATE_TEST_CASE_P(accuracy_group, myriadLayerDeconvolution_nightly, ) ); -INSTANTIATE_TEST_CASE_P(accuracy_depthDeconv, myriadLayerDeconvolution_nightly, +INSTANTIATE_TEST_CASE_P(accuracy_depthDeconv, myriadLayerDeconvolution_smoke, ::testing::Combine( ::testing::Values(MAKE_STRUCT(tensor_test_params, 1, 384, 4, 2)) , ::testing::Values(MAKE_STRUCT(param_size, 2, 2) @@ -84,7 +84,7 @@ INSTANTIATE_TEST_CASE_P(accuracy, myriadLayerDeconvolution_asymm_pad, ) ); -INSTANTIATE_TEST_CASE_P(accuracy, myriadLayerDeconvolution_nightly, +INSTANTIATE_TEST_CASE_P(accuracy, myriadLayerDeconvolution_smoke, ::testing::Combine( ::testing::Values(MAKE_STRUCT(tensor_test_params, 1, 2, 37, 59) , MAKE_STRUCT(tensor_test_params, 1, 21, 16, 16) @@ -109,7 +109,7 @@ INSTANTIATE_TEST_CASE_P(accuracy, myriadLayerDeconvolution_nightly, ) ); -INSTANTIATE_TEST_CASE_P(extra3x3s1, myriadLayerDeconvolution_nightly, +INSTANTIATE_TEST_CASE_P(extra3x3s1, myriadLayerDeconvolution_smoke, ::testing::Combine( ::testing::Values(MAKE_STRUCT(tensor_test_params, 1, 256, 1, 1)) , ::testing::Values(MAKE_STRUCT(param_size, 3, 3)) diff --git a/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_deconvolution_test.hpp b/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_deconvolution_test.hpp index 87ebb68e5c4..7c3af16da77 100644 --- a/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_deconvolution_test.hpp +++ b/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_deconvolution_test.hpp @@ -40,12 +40,12 @@ PRETTY_PARAM(layoutPreference, vpu::LayoutPreference) PRETTY_PARAM(hw_optimization, bool) typedef myriadLayerTestBaseWithParam> myriadLayerDeconvolution_nightly; + , out_channels, group, layoutPreference, hw_optimization >> myriadLayerDeconvolution_smoke; typedef myriadLayerTestBaseWithParam> myriadLayerDeconvolution_asymm_pad; -TEST_P(myriadLayerDeconvolution_nightly, Deconvolution) { +TEST_P(myriadLayerDeconvolution_smoke, Deconvolution) { tensor_test_params input_dims = get<0>(GetParam()); param_size kernel = get<1>(GetParam()); param_size stride = get<2>(GetParam()); diff --git a/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_detection_output_test.cpp b/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_detection_output_test.cpp index 4da2d75add6..50c254557e9 100644 --- a/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_detection_output_test.cpp +++ b/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_detection_output_test.cpp @@ -838,7 +838,7 @@ void checkDetectionObjectArrays(std::vector gold, std::vector gen_locations; std::vector gen_confidence; @@ -995,7 +995,7 @@ public: } }; -TEST_F(myriadDetectionOutputTests_nightly, NoConst) { +TEST_F(myriadDetectionOutputTests_smoke, NoConst) { ASSERT_NO_FATAL_FAILURE(PrepareInput()); ASSERT_NO_FATAL_FAILURE(CalcRefOutput(false)); @@ -1053,7 +1053,7 @@ TEST_F(myriadDetectionOutputTests_nightly, NoConst) { CheckResults(); } -TEST_F(myriadDetectionOutputTests_nightly, MxNet) { +TEST_F(myriadDetectionOutputTests_smoke, MxNet) { ASSERT_NO_FATAL_FAILURE(PrepareInput()); ASSERT_NO_FATAL_FAILURE(CalcRefOutput(true)); @@ -1109,7 +1109,7 @@ TEST_F(myriadDetectionOutputTests_nightly, MxNet) { CheckResults(); } -TEST_F(myriadDetectionOutputTests_nightly, WithConst) { +TEST_F(myriadDetectionOutputTests_smoke, WithConst) { ASSERT_NO_FATAL_FAILURE(PrepareInput()); ASSERT_NO_FATAL_FAILURE(CalcRefOutput(false)); diff --git a/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_eltwise_test.cpp b/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_eltwise_test.cpp index 467dd42d390..62031c6f8dc 100644 --- a/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_eltwise_test.cpp +++ b/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_eltwise_test.cpp @@ -4,168 +4,168 @@ #include "myriad_layers_eltwise_test.hpp" -INSTANTIATE_TEST_CASE_P(accuracy, myriadTestsEltwiseMax_nightly, +INSTANTIATE_TEST_CASE_P(accuracy, myriadTestsEltwiseMax_smoke, ::testing::Combine( ::testing::ValuesIn(s_eltwiseTensors), ::testing::ValuesIn(s_eltwiseInputs), ::testing::ValuesIn(s_eltwiseDims)) ); -INSTANTIATE_TEST_CASE_P(accuracy, myriadTestsEltwiseSum_nightly, +INSTANTIATE_TEST_CASE_P(accuracy, myriadTestsEltwiseSum_smoke, ::testing::Combine( ::testing::ValuesIn(s_eltwiseTensors), ::testing::ValuesIn(s_eltwiseInputs), ::testing::ValuesIn(s_eltwiseDims)) ); -INSTANTIATE_TEST_CASE_P(accuracy, myriadTestsEltwiseSub_nightly, +INSTANTIATE_TEST_CASE_P(accuracy, myriadTestsEltwiseSub_smoke, ::testing::Combine( ::testing::ValuesIn(s_eltwiseTensors), ::testing::ValuesIn(s_eltwiseOnlyTwoInputs), ::testing::ValuesIn(s_eltwiseDims)) ); -INSTANTIATE_TEST_CASE_P(accuracy, myriadTestsEltwiseMul_nightly, +INSTANTIATE_TEST_CASE_P(accuracy, myriadTestsEltwiseMul_smoke, ::testing::Combine( ::testing::ValuesIn(s_eltwiseTensors), ::testing::ValuesIn(s_eltwiseInputs), ::testing::ValuesIn(s_eltwiseDims)) ); -INSTANTIATE_TEST_CASE_P(accuracy, myriadTestsEltwiseSumWithCoeff_nightly, +INSTANTIATE_TEST_CASE_P(accuracy, myriadTestsEltwiseSumWithCoeff_smoke, ::testing::Combine( ::testing::ValuesIn(s_eltwiseTensors), ::testing::ValuesIn(s_eltwiseInputs), ::testing::ValuesIn(s_eltwiseDims)) ); -INSTANTIATE_TEST_CASE_P(accuracy, myriadTestsEltwiseSumWithBroadcast_nightly, +INSTANTIATE_TEST_CASE_P(accuracy, myriadTestsEltwiseSumWithBroadcast_smoke, ::testing::Combine( ::testing::ValuesIn(s_eltwiseTensors), ::testing::ValuesIn(s_eltwiseInputs), ::testing::Values(4)) ); -INSTANTIATE_TEST_CASE_P(accuracy, myriadTestsEltwiseSubWithCoeff_nightly, +INSTANTIATE_TEST_CASE_P(accuracy, myriadTestsEltwiseSubWithCoeff_smoke, ::testing::Combine( ::testing::ValuesIn(s_eltwiseTensors), ::testing::ValuesIn(s_eltwiseOnlyTwoInputs), ::testing::ValuesIn(s_eltwiseDims)) ); -INSTANTIATE_TEST_CASE_P(accuracy, myriadTestsEltwiseSubWithBroadcast_nightly, +INSTANTIATE_TEST_CASE_P(accuracy, myriadTestsEltwiseSubWithBroadcast_smoke, ::testing::Combine( ::testing::ValuesIn(s_eltwiseTensors), ::testing::ValuesIn(s_eltwiseOnlyTwoInputs), ::testing::Values(4)) ); -INSTANTIATE_TEST_CASE_P(accuracy, myriadTestsEltwiseDiv_nightly, +INSTANTIATE_TEST_CASE_P(accuracy, myriadTestsEltwiseDiv_smoke, ::testing::Combine( ::testing::ValuesIn(s_eltwiseTensors), ::testing::ValuesIn(s_eltwiseOnlyTwoInputs), ::testing::ValuesIn(s_eltwiseDims)) ); -INSTANTIATE_TEST_CASE_P(accuracy, myriadTestsEltwiseMin_nightly, +INSTANTIATE_TEST_CASE_P(accuracy, myriadTestsEltwiseMin_smoke, ::testing::Combine( ::testing::ValuesIn(s_eltwiseTensors), ::testing::ValuesIn(s_eltwiseInputs), ::testing::ValuesIn(s_eltwiseDims)) ); -INSTANTIATE_TEST_CASE_P(accuracy, myriadTestsEltwiseSqDiff_nightly, +INSTANTIATE_TEST_CASE_P(accuracy, myriadTestsEltwiseSqDiff_smoke, ::testing::Combine( ::testing::ValuesIn(s_eltwiseTensors), ::testing::ValuesIn(s_eltwiseOnlyTwoInputs), ::testing::ValuesIn(s_eltwiseDims)) ); -INSTANTIATE_TEST_CASE_P(accuracy, myriadTestsEltwisePow_nightly, +INSTANTIATE_TEST_CASE_P(accuracy, myriadTestsEltwisePow_smoke, ::testing::Combine( ::testing::ValuesIn(s_eltwiseTensors), ::testing::ValuesIn(s_eltwiseOnlyTwoInputs), ::testing::ValuesIn(s_eltwiseDims)) ); -INSTANTIATE_TEST_CASE_P(accuracy, myriadTestsEltwiseFloorMod_nightly, +INSTANTIATE_TEST_CASE_P(accuracy, myriadTestsEltwiseFloorMod_smoke, ::testing::Combine( ::testing::ValuesIn(s_eltwiseTensors), ::testing::ValuesIn(s_eltwiseOnlyTwoInputs), ::testing::ValuesIn(s_eltwiseDims)) ); -INSTANTIATE_TEST_CASE_P(accuracy, myriadTestsEltwiseEqual_nightly, +INSTANTIATE_TEST_CASE_P(accuracy, myriadTestsEltwiseEqual_smoke, ::testing::Combine( ::testing::ValuesIn(s_eltwiseTensors), ::testing::ValuesIn(s_eltwiseOnlyTwoInputs), ::testing::ValuesIn(s_eltwiseDims)) ); -INSTANTIATE_TEST_CASE_P(accuracy, myriadTestsEltwiseNotEqual_nightly, +INSTANTIATE_TEST_CASE_P(accuracy, myriadTestsEltwiseNotEqual_smoke, ::testing::Combine( ::testing::ValuesIn(s_eltwiseTensors), ::testing::ValuesIn(s_eltwiseOnlyTwoInputs), ::testing::ValuesIn(s_eltwiseDims)) ); -INSTANTIATE_TEST_CASE_P(accuracy, myriadTestsEltwiseGreater_nightly, +INSTANTIATE_TEST_CASE_P(accuracy, myriadTestsEltwiseGreater_smoke, ::testing::Combine( ::testing::ValuesIn(s_eltwiseTensors), ::testing::ValuesIn(s_eltwiseOnlyTwoInputs), ::testing::ValuesIn(s_eltwiseDims)) ); -INSTANTIATE_TEST_CASE_P(accuracy, myriadTestsEltwiseGreaterEqual_nightly, +INSTANTIATE_TEST_CASE_P(accuracy, myriadTestsEltwiseGreaterEqual_smoke, ::testing::Combine( ::testing::ValuesIn(s_eltwiseTensors), ::testing::ValuesIn(s_eltwiseOnlyTwoInputs), ::testing::ValuesIn(s_eltwiseDims)) ); -INSTANTIATE_TEST_CASE_P(accuracy, myriadTestsEltwiseLess_nightly, +INSTANTIATE_TEST_CASE_P(accuracy, myriadTestsEltwiseLess_smoke, ::testing::Combine( ::testing::ValuesIn(s_eltwiseTensors), ::testing::ValuesIn(s_eltwiseOnlyTwoInputs), ::testing::ValuesIn(s_eltwiseDims)) ); -INSTANTIATE_TEST_CASE_P(accuracy, myriadTestsEltwiseLessEqual_nightly, +INSTANTIATE_TEST_CASE_P(accuracy, myriadTestsEltwiseLessEqual_smoke, ::testing::Combine( ::testing::ValuesIn(s_eltwiseTensors), ::testing::ValuesIn(s_eltwiseOnlyTwoInputs), ::testing::ValuesIn(s_eltwiseDims)) ); -INSTANTIATE_TEST_CASE_P(accuracy, myriadTestsEltwiseLogicalNot_nightly, +INSTANTIATE_TEST_CASE_P(accuracy, myriadTestsEltwiseLogicalNot_smoke, ::testing::Combine( ::testing::ValuesIn(s_eltwiseTensors), ::testing::ValuesIn(s_eltwiseOnlyOneInput), ::testing::ValuesIn(s_eltwiseDims)) ); -INSTANTIATE_TEST_CASE_P(accuracy, myriadTestsEltwiseLogicalAnd_nightly, +INSTANTIATE_TEST_CASE_P(accuracy, myriadTestsEltwiseLogicalAnd_smoke, ::testing::Combine( ::testing::ValuesIn(s_eltwiseTensors), ::testing::ValuesIn(s_eltwiseInputs), ::testing::ValuesIn(s_eltwiseDims)) ); -INSTANTIATE_TEST_CASE_P(accuracy, myriadTestsEltwiseLogicalOr_nightly, +INSTANTIATE_TEST_CASE_P(accuracy, myriadTestsEltwiseLogicalOr_smoke, ::testing::Combine( ::testing::ValuesIn(s_eltwiseTensors), ::testing::ValuesIn(s_eltwiseInputs), ::testing::ValuesIn(s_eltwiseDims)) ); -INSTANTIATE_TEST_CASE_P(accuracy, myriadTestsEltwiseLogicalXor_nightly, +INSTANTIATE_TEST_CASE_P(accuracy, myriadTestsEltwiseLogicalXor_smoke, ::testing::Combine( ::testing::ValuesIn(s_eltwiseTensors), ::testing::ValuesIn(s_eltwiseInputs), ::testing::ValuesIn(s_eltwiseDims)) ); -INSTANTIATE_TEST_CASE_P(accuracy, myriadTestsEltwiseMean_nightly, +INSTANTIATE_TEST_CASE_P(accuracy, myriadTestsEltwiseMean_smoke, ::testing::Combine( ::testing::ValuesIn(s_eltwiseTensors), ::testing::ValuesIn(s_eltwiseOnlyTwoInputs), diff --git a/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_eltwise_test.hpp b/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_eltwise_test.hpp index ae216bbcc35..c4201201bdd 100644 --- a/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_eltwise_test.hpp +++ b/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_eltwise_test.hpp @@ -375,51 +375,51 @@ protected: } }; -class myriadTestsEltwiseMax_nightly: public EltwiseTest +class myriadTestsEltwiseMax_smoke: public EltwiseTest { }; -class myriadTestsEltwiseSum_nightly: public EltwiseTest +class myriadTestsEltwiseSum_smoke: public EltwiseTest { }; -class myriadTestsEltwiseSub_nightly: public EltwiseTest +class myriadTestsEltwiseSub_smoke: public EltwiseTest { }; -class myriadTestsEltwiseMul_nightly: public EltwiseTest +class myriadTestsEltwiseMul_smoke: public EltwiseTest { }; -class myriadTestsEltwiseSumWithCoeff_nightly: public EltwiseTest +class myriadTestsEltwiseSumWithCoeff_smoke: public EltwiseTest { }; -class myriadTestsEltwiseSubWithCoeff_nightly: public EltwiseTest +class myriadTestsEltwiseSubWithCoeff_smoke: public EltwiseTest { }; -class myriadTestsEltwiseSumWithBroadcast_nightly: public EltwiseTest +class myriadTestsEltwiseSumWithBroadcast_smoke: public EltwiseTest { }; -class myriadTestsEltwiseSubWithBroadcast_nightly: public EltwiseTest +class myriadTestsEltwiseSubWithBroadcast_smoke: public EltwiseTest { }; -class myriadTestsEltwiseDiv_nightly: public EltwiseTest +class myriadTestsEltwiseDiv_smoke: public EltwiseTest { }; -class myriadTestsEltwiseMin_nightly: public EltwiseTest +class myriadTestsEltwiseMin_smoke: public EltwiseTest { }; -class myriadTestsEltwiseSqDiff_nightly: public EltwiseTest +class myriadTestsEltwiseSqDiff_smoke: public EltwiseTest { }; -class myriadTestsEltwisePow_nightly: public EltwiseTest +class myriadTestsEltwisePow_smoke: public EltwiseTest { void SetUp() override { EltwiseTest::SetUp(); @@ -427,35 +427,35 @@ class myriadTestsEltwisePow_nightly: public EltwiseTest } }; -class myriadTestsEltwiseFloorMod_nightly: public EltwiseTest +class myriadTestsEltwiseFloorMod_smoke: public EltwiseTest { }; -class myriadTestsEltwiseEqual_nightly: public EltwiseTest +class myriadTestsEltwiseEqual_smoke: public EltwiseTest { }; -class myriadTestsEltwiseNotEqual_nightly: public EltwiseTest +class myriadTestsEltwiseNotEqual_smoke: public EltwiseTest { }; -class myriadTestsEltwiseGreater_nightly: public EltwiseTest +class myriadTestsEltwiseGreater_smoke: public EltwiseTest { }; -class myriadTestsEltwiseGreaterEqual_nightly: public EltwiseTest +class myriadTestsEltwiseGreaterEqual_smoke: public EltwiseTest { }; -class myriadTestsEltwiseLess_nightly: public EltwiseTest +class myriadTestsEltwiseLess_smoke: public EltwiseTest { }; -class myriadTestsEltwiseLessEqual_nightly: public EltwiseTest +class myriadTestsEltwiseLessEqual_smoke: public EltwiseTest { }; -class myriadTestsEltwiseLogicalNot_nightly: public EltwiseTest +class myriadTestsEltwiseLogicalNot_smoke: public EltwiseTest { void SetUp() override { EltwiseTest::SetUp(); @@ -463,7 +463,7 @@ class myriadTestsEltwiseLogicalNot_nightly: public EltwiseTest +class myriadTestsEltwiseLogicalAnd_smoke: public EltwiseTest { void SetUp() override { EltwiseTest::SetUp(); @@ -471,7 +471,7 @@ class myriadTestsEltwiseLogicalAnd_nightly: public EltwiseTest +class myriadTestsEltwiseLogicalOr_smoke: public EltwiseTest { void SetUp() override { EltwiseTest::SetUp(); @@ -479,7 +479,7 @@ class myriadTestsEltwiseLogicalOr_nightly: public EltwiseTest +class myriadTestsEltwiseLogicalXor_smoke: public EltwiseTest { void SetUp() override { EltwiseTest::SetUp(); @@ -487,126 +487,126 @@ class myriadTestsEltwiseLogicalXor_nightly: public EltwiseTest +class myriadTestsEltwiseMean_smoke: public EltwiseTest { }; -TEST_P(myriadTestsEltwiseMax_nightly, Max) +TEST_P(myriadTestsEltwiseMax_smoke, Max) { InitBody(); } -TEST_P(myriadTestsEltwiseSum_nightly, Sum) +TEST_P(myriadTestsEltwiseSum_smoke, Sum) { InitBody(); } -TEST_P(myriadTestsEltwiseSub_nightly, Sub) +TEST_P(myriadTestsEltwiseSub_smoke, Sub) { InitBody(); } -TEST_P(myriadTestsEltwiseMul_nightly, Mul) +TEST_P(myriadTestsEltwiseMul_smoke, Mul) { InitBody(); } -TEST_P(myriadTestsEltwiseSumWithCoeff_nightly, Sum) +TEST_P(myriadTestsEltwiseSumWithCoeff_smoke, Sum) { InitBody(true); } -TEST_P(myriadTestsEltwiseSubWithCoeff_nightly, Sub) +TEST_P(myriadTestsEltwiseSubWithCoeff_smoke, Sub) { InitBody(true); } -TEST_P(myriadTestsEltwiseSumWithBroadcast_nightly, Sum) +TEST_P(myriadTestsEltwiseSumWithBroadcast_smoke, Sum) { InitBody(false, true); } -TEST_P(myriadTestsEltwiseSubWithBroadcast_nightly, Sub) +TEST_P(myriadTestsEltwiseSubWithBroadcast_smoke, Sub) { InitBody(false, true); } -TEST_P(myriadTestsEltwiseDiv_nightly, Div) +TEST_P(myriadTestsEltwiseDiv_smoke, Div) { InitBody(); } -TEST_P(myriadTestsEltwiseMin_nightly, Min) +TEST_P(myriadTestsEltwiseMin_smoke, Min) { InitBody(); } -TEST_P(myriadTestsEltwiseSqDiff_nightly, SqDiff) +TEST_P(myriadTestsEltwiseSqDiff_smoke, SqDiff) { InitBody(); } -TEST_P(myriadTestsEltwisePow_nightly, Pow) +TEST_P(myriadTestsEltwisePow_smoke, Pow) { InitBody(); } -TEST_P(myriadTestsEltwiseFloorMod_nightly, FloorMod) +TEST_P(myriadTestsEltwiseFloorMod_smoke, FloorMod) { InitBody(); } -TEST_P(myriadTestsEltwiseEqual_nightly, Equal) +TEST_P(myriadTestsEltwiseEqual_smoke, Equal) { InitBody(false, false, true); } -TEST_P(myriadTestsEltwiseNotEqual_nightly, NotEqual) +TEST_P(myriadTestsEltwiseNotEqual_smoke, NotEqual) { InitBody(false, false, true); } -TEST_P(myriadTestsEltwiseGreater_nightly, Greater) +TEST_P(myriadTestsEltwiseGreater_smoke, Greater) { InitBody(false, false, true); } -TEST_P(myriadTestsEltwiseGreaterEqual_nightly, GreaterEqual) +TEST_P(myriadTestsEltwiseGreaterEqual_smoke, GreaterEqual) { InitBody(false, false, true); } -TEST_P(myriadTestsEltwiseLess_nightly, Less) +TEST_P(myriadTestsEltwiseLess_smoke, Less) { InitBody(false, false, true); } -TEST_P(myriadTestsEltwiseLessEqual_nightly, LessEqual) +TEST_P(myriadTestsEltwiseLessEqual_smoke, LessEqual) { InitBody(false, false, true); } -TEST_P(myriadTestsEltwiseLogicalNot_nightly, LogicalNot) +TEST_P(myriadTestsEltwiseLogicalNot_smoke, LogicalNot) { InitBody(false, false, true); } -TEST_P(myriadTestsEltwiseLogicalAnd_nightly, LogicalAnd) +TEST_P(myriadTestsEltwiseLogicalAnd_smoke, LogicalAnd) { InitBody(false, false, true); } -TEST_P(myriadTestsEltwiseLogicalOr_nightly, LogicalOr) +TEST_P(myriadTestsEltwiseLogicalOr_smoke, LogicalOr) { InitBody(false, false, true); } -TEST_P(myriadTestsEltwiseLogicalXor_nightly, LogicalXor) +TEST_P(myriadTestsEltwiseLogicalXor_smoke, LogicalXor) { InitBody(false, false, true); } -TEST_P(myriadTestsEltwiseMean_nightly, Mean) +TEST_P(myriadTestsEltwiseMean_smoke, Mean) { InitBody(); } diff --git a/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_elu_test.cpp b/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_elu_test.cpp index c40101bcfda..bd7f236d7b9 100644 --- a/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_elu_test.cpp +++ b/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_elu_test.cpp @@ -4,7 +4,7 @@ #include "myriad_layers_elu_test.hpp" -INSTANTIATE_TEST_CASE_P( accuracy, myriadLayersTestsELUParams, +INSTANTIATE_TEST_CASE_P( accuracy, myriadLayersTestsELUParams_smoke, ::testing::Combine( ::testing::ValuesIn(s_powerTensors), ::testing::ValuesIn(s_powerParams)) diff --git a/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_elu_test.hpp b/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_elu_test.hpp index 9a80695c828..83b7e4eb998 100644 --- a/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_elu_test.hpp +++ b/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_elu_test.hpp @@ -29,9 +29,9 @@ void gen_ref_elu(const InferenceEngine::Blob::Ptr src, } } -typedef myriadLayerTestBaseWithParam> myriadLayersTestsELUParams; +typedef myriadLayerTestBaseWithParam> myriadLayersTestsELUParams_smoke; -TEST_P(myriadLayersTestsELUParams, TestsELU) { +TEST_P(myriadLayersTestsELUParams_smoke, TestsELU) { _config[VPU_CONFIG_KEY(DETECT_NETWORK_BATCH)] = CONFIG_VALUE(NO); auto param = GetParam(); diff --git a/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_erf_test.cpp b/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_erf_test.cpp index 9034960cb99..8f5ef6a2caf 100644 --- a/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_erf_test.cpp +++ b/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_erf_test.cpp @@ -5,5 +5,5 @@ #include "myriad_layers_erf_test.hpp" INSTANTIATE_TEST_CASE_P( - accuracy, myriadLayersTestsErf_nightly, + accuracy, myriadLayersTestsErf_smoke, ::testing::ValuesIn(s_ErfDims)); diff --git a/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_erf_test.hpp b/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_erf_test.hpp index d9986746617..07de3354c60 100644 --- a/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_erf_test.hpp +++ b/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_erf_test.hpp @@ -26,12 +26,12 @@ void ref_erf(const InferenceEngine::Blob::Ptr src, } } -class myriadLayersTestsErf_nightly: public myriadLayersTests_nightly, +class myriadLayersTestsErf_smoke: public myriadLayersTests_nightly, public testing::WithParamInterface { public: }; -TEST_P(myriadLayersTestsErf_nightly, TestsErf) +TEST_P(myriadLayersTestsErf_smoke, TestsErf) { _config[VPU_CONFIG_KEY(DETECT_NETWORK_BATCH)] = CONFIG_VALUE(NO); auto p = ::testing::WithParamInterface::GetParam(); diff --git a/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_exp_detectionoutput_test.cpp b/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_exp_detectionoutput_test.cpp index d0b928788f7..969ffdc03b0 100644 --- a/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_exp_detectionoutput_test.cpp +++ b/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_exp_detectionoutput_test.cpp @@ -18,7 +18,7 @@ static const std::vector s_layerParams_list = {{ 10.0, 10.0, 5.0, 5.0 }, 4.135166645050049, 0.5, 0.05, _MaxDetections, _NumClasses, 2000, 0 }, }; -INSTANTIATE_TEST_CASE_P(accuracy, myriadTestsExpDetectionOutput_nightly, +INSTANTIATE_TEST_CASE_P(accuracy, myriadTestsExpDetectionOutput_smoke, ::testing::Combine( ::testing::ValuesIn(s_sizeParams_list), ::testing::ValuesIn(s_layerParams_list)) diff --git a/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_exp_detectionoutput_test.hpp b/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_exp_detectionoutput_test.hpp index 12eb0481ef1..5d168f6ff97 100644 --- a/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_exp_detectionoutput_test.hpp +++ b/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_exp_detectionoutput_test.hpp @@ -381,11 +381,11 @@ protected: } }; -class myriadTestsExpDetectionOutput_nightly: public ExpDetectionOutputTest +class myriadTestsExpDetectionOutput_smoke: public ExpDetectionOutputTest { }; -TEST_P(myriadTestsExpDetectionOutput_nightly, ExpDetectionOutput) +TEST_P(myriadTestsExpDetectionOutput_smoke, ExpDetectionOutput) { testExpDetectionOutput(); } diff --git a/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_exp_generateproposals.cpp b/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_exp_generateproposals.cpp index 546e74ef07d..bedf24f7f15 100644 --- a/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_exp_generateproposals.cpp +++ b/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_exp_generateproposals.cpp @@ -4,7 +4,7 @@ #include "myriad_layers_exp_generateproposals_test.hpp" -INSTANTIATE_TEST_CASE_P(accuracy, myriadLayersTestsExpGenerateProposals_nightly, +INSTANTIATE_TEST_CASE_P(accuracy, myriadLayersTestsExpGenerateProposals_smoke, ::testing::Combine( ::testing::ValuesIn(s_ExpGenerateProposalsLayerScores), ::testing::ValuesIn(s_ExpGenerateProposalsLayerImInfo), diff --git a/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_exp_generateproposals_test.hpp b/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_exp_generateproposals_test.hpp index 976b445c682..433caca1c71 100644 --- a/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_exp_generateproposals_test.hpp +++ b/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_exp_generateproposals_test.hpp @@ -30,7 +30,7 @@ struct GenerateProposalsParam { using ExpGenerateProposalsTestParams = std::tuple, GenerateProposalsParam>; -typedef myriadLayerTestBaseWithParam myriadLayersTestsExpGenerateProposals_nightly; +typedef myriadLayerTestBaseWithParam myriadLayersTestsExpGenerateProposals_smoke; static void genInputs(InferenceEngine::BlobMap inputMap, const int numProposals, @@ -140,7 +140,7 @@ static void genInputs(InferenceEngine::BlobMap inputMap, inputIMinfo[1] = PrecisionUtils::f32tof16( (float) imgW ); } -TEST_P(myriadLayersTestsExpGenerateProposals_nightly, ExpGenerateProposals) { +TEST_P(myriadLayersTestsExpGenerateProposals_smoke, ExpGenerateProposals) { tensor_test_params scoresDims = std::get<0>(GetParam()); std::vector im_info = std::get<1>(GetParam()); GenerateProposalsParam opParams = std::get<2>(GetParam()); diff --git a/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_exp_priorgridgenerator_test.cpp b/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_exp_priorgridgenerator_test.cpp index 12283f03355..f0aa7bb1c0e 100644 --- a/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_exp_priorgridgenerator_test.cpp +++ b/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_exp_priorgridgenerator_test.cpp @@ -4,7 +4,7 @@ #include "myriad_layers_exp_priorgridgenerator_test.hpp" -INSTANTIATE_TEST_CASE_P(accuracy, myriadLayersTestsExpPriorGridGenerator_nightly, +INSTANTIATE_TEST_CASE_P(accuracy, myriadLayersTestsExpPriorGridGenerator_smoke, ::testing::Combine( ::testing::ValuesIn(s_ExpPriorGridGeneratorLayerInputs), ::testing::ValuesIn(s_ExpPriorGridGeneratorLayerParam)) diff --git a/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_exp_priorgridgenerator_test.hpp b/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_exp_priorgridgenerator_test.hpp index 780b614ff7f..18177d8e69b 100644 --- a/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_exp_priorgridgenerator_test.hpp +++ b/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_exp_priorgridgenerator_test.hpp @@ -42,7 +42,7 @@ struct InputDims { using ExpPriorGridGeneratorTestParams = std::tuple; -typedef myriadLayerTestBaseWithParam myriadLayersTestsExpPriorGridGenerator_nightly; +typedef myriadLayerTestBaseWithParam myriadLayersTestsExpPriorGridGenerator_smoke; static void genPriors(InferenceEngine::Blob::Ptr rois, const tensor_test_params& params, @@ -64,7 +64,7 @@ static void genPriors(InferenceEngine::Blob::Ptr rois, } } -TEST_P(myriadLayersTestsExpPriorGridGenerator_nightly, ExpPriorGridGenerator) { +TEST_P(myriadLayersTestsExpPriorGridGenerator_smoke, ExpPriorGridGenerator) { InputDims inputTensorsDims = std::get<0>(GetParam()); PriorGridGeneratorParam opParams = std::get<1>(GetParam()); diff --git a/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_exp_test.cpp b/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_exp_test.cpp index 71a38140b60..f5ce39ba41b 100644 --- a/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_exp_test.cpp +++ b/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_exp_test.cpp @@ -5,5 +5,5 @@ #include "myriad_layers_exp_test.hpp" INSTANTIATE_TEST_CASE_P( - accuracy, myriadLayersTestsExp_nightly, + accuracy, myriadLayersTestsExp_smoke, ::testing::ValuesIn(s_expParams)); diff --git a/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_exp_test.hpp b/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_exp_test.hpp index 1a95aaf7f65..c8ea03e20bb 100644 --- a/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_exp_test.hpp +++ b/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_exp_test.hpp @@ -11,10 +11,10 @@ using namespace InferenceEngine; -class myriadLayersTestsExp_nightly: public myriadLayersTests_nightly, +class myriadLayersTestsExp_smoke: public myriadLayersTests_nightly, public testing::WithParamInterface {}; -TEST_P(myriadLayersTestsExp_nightly, TestsExp) +TEST_P(myriadLayersTestsExp_smoke, TestsExp) { auto p = ::testing::WithParamInterface::GetParam(); SetInputTensor(p); diff --git a/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_exp_topkrois_test.cpp b/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_exp_topkrois_test.cpp index 80793c66518..bd8a826672e 100644 --- a/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_exp_topkrois_test.cpp +++ b/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_exp_topkrois_test.cpp @@ -4,7 +4,7 @@ #include "myriad_layers_exp_topkrois_test.hpp" -INSTANTIATE_TEST_CASE_P(accuracy, myriadLayersTestsExpTopKROIs_nightly, +INSTANTIATE_TEST_CASE_P(accuracy, myriadLayersTestsExpTopKROIs_smoke, ::testing::Combine( ::testing::ValuesIn(s_ExpTopKROIsInputRoisNum), ::testing::ValuesIn(s_ExpTopKROIsMaxRoisNum)) diff --git a/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_exp_topkrois_test.hpp b/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_exp_topkrois_test.hpp index f00be2409e3..a220de35ae2 100644 --- a/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_exp_topkrois_test.hpp +++ b/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_exp_topkrois_test.hpp @@ -22,7 +22,7 @@ struct TopKROIsParam { using ExpTopKROIsTestParams = std::tuple; -typedef myriadLayerTestBaseWithParam myriadLayersTestsExpTopKROIs_nightly; +typedef myriadLayerTestBaseWithParam myriadLayersTestsExpTopKROIs_smoke; static void genInputs(InferenceEngine::BlobMap inputMap) { const std::string INPUT_ROIS = "input0"; @@ -101,7 +101,7 @@ static void genInputs(InferenceEngine::BlobMap inputMap) { } } -TEST_P(myriadLayersTestsExpTopKROIs_nightly, ExpTopKROIs) { +TEST_P(myriadLayersTestsExpTopKROIs_smoke, ExpTopKROIs) { int inputRoisNum = std::get<0>(GetParam()); TopKROIsParam opParams = std::get<1>(GetParam()); diff --git a/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_flatten_test.cpp b/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_flatten_test.cpp index 261a6824060..c98d36fff21 100644 --- a/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_flatten_test.cpp +++ b/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_flatten_test.cpp @@ -4,7 +4,7 @@ #include "myriad_layers_flatten_test.hpp" -INSTANTIATE_TEST_CASE_P(accuracy, myriadLayersTestsFlatten_nightly, +INSTANTIATE_TEST_CASE_P(accuracy, myriadLayersTestsFlatten_smoke, ::testing::Combine( ::testing::ValuesIn(s_flattenTensors), ::testing::ValuesIn(s_flattenAxis) diff --git a/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_flatten_test.hpp b/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_flatten_test.hpp index 833bf8729ea..7dde0103154 100644 --- a/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_flatten_test.hpp +++ b/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_flatten_test.hpp @@ -4,7 +4,7 @@ #include "myriad_layers_tests.hpp" -typedef myriadLayerTestBaseWithParam> myriadLayersTestsFlatten_nightly; +typedef myriadLayerTestBaseWithParam> myriadLayersTestsFlatten_smoke; static void ref_flatten(const InferenceEngine::Blob::Ptr src, InferenceEngine::Blob::Ptr dst) { @@ -53,7 +53,7 @@ static void ref_flatten(const InferenceEngine::Blob::Ptr src, } } -TEST_P(myriadLayersTestsFlatten_nightly, Flatten) { +TEST_P(myriadLayersTestsFlatten_smoke, Flatten) { auto input = std::get<0>(GetParam()); int32_t axis_val = std::get<1>(GetParam()); IN_OUT_desc input_tensor; diff --git a/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_floor_test.cpp b/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_floor_test.cpp index 9342ee03882..351dae0bf6f 100644 --- a/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_floor_test.cpp +++ b/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_floor_test.cpp @@ -5,5 +5,5 @@ #include "myriad_layers_floor_test.hpp" INSTANTIATE_TEST_CASE_P( - accuracy, myriadLayersTestsFloor_nightly, + accuracy, myriadLayersTestsFloor_smoke, ::testing::ValuesIn(s_FloorParams)); diff --git a/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_floor_test.hpp b/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_floor_test.hpp index a086ac96a6c..8b52f4cf088 100644 --- a/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_floor_test.hpp +++ b/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_floor_test.hpp @@ -25,12 +25,12 @@ void ref_floor(const InferenceEngine::Blob::Ptr src, } } -class myriadLayersTestsFloor_nightly: public myriadLayersTests_nightly, +class myriadLayersTestsFloor_smoke: public myriadLayersTests_nightly, public testing::WithParamInterface { public: }; -TEST_P(myriadLayersTestsFloor_nightly, TestsFloor) +TEST_P(myriadLayersTestsFloor_smoke, TestsFloor) { auto p = ::testing::WithParamInterface::GetParam(); SetInputTensor(p); diff --git a/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_fully_connected_tests.cpp b/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_fully_connected_tests.cpp index fa2f928ee93..31e8a73e866 100644 --- a/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_fully_connected_tests.cpp +++ b/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_fully_connected_tests.cpp @@ -4,18 +4,18 @@ #include "myriad_layers_fully_connected_tests.hpp" INSTANTIATE_TEST_CASE_P( - accuracy, myriadLayersTestsFullyConnected_nightly, + accuracy, myriadLayersTestsFullyConnected_smoke, ::testing::ValuesIn(s_fcTestParams) ); -INSTANTIATE_TEST_CASE_P(accuracy, myriadLayersTestsFullyConnectedBatch_nightly, +INSTANTIATE_TEST_CASE_P(accuracy, myriadLayersTestsFullyConnectedBatch_smoke, ::testing::Combine( ::testing::ValuesIn(s_fcTestBatchParams) , ::testing::ValuesIn(s_fcTestBatchOutSizes) ) ); -INSTANTIATE_TEST_CASE_P(accuracy, myriadLayersTestsFullyConnectedPVA_nightly, +INSTANTIATE_TEST_CASE_P(accuracy, myriadLayersTestsFullyConnectedPVA_smoke, ::testing::Combine( ::testing::ValuesIn(s_fcTestPVAParams) , ::testing::ValuesIn(s_fcTestPVAOutSizes) diff --git a/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_fully_connected_tests.hpp b/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_fully_connected_tests.hpp index 791e1a8b936..b5c9ef536f0 100644 --- a/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_fully_connected_tests.hpp +++ b/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_fully_connected_tests.hpp @@ -7,16 +7,16 @@ using namespace InferenceEngine; -class myriadLayersTestsFullyConnected_nightly: public myriadLayersTests_nightly, +class myriadLayersTestsFullyConnected_smoke: public myriadLayersTests_nightly, public testing::WithParamInterface { }; typedef std::tuple IR3_FC_params; -class myriadLayersTestsFullyConnectedBatch_nightly: public myriadLayersTests_nightly, +class myriadLayersTestsFullyConnectedBatch_smoke: public myriadLayersTests_nightly, public testing::WithParamInterface { }; -TEST_P(myriadLayersTestsFullyConnected_nightly, TestsFullyConnected) +TEST_P(myriadLayersTestsFullyConnected_smoke, TestsFullyConnected) { fcon_test_params p = ::testing::WithParamInterface::GetParam(); @@ -83,7 +83,7 @@ static void genTestData1(InferenceEngine::Blob::Ptr blob) { } -TEST_P(myriadLayersTestsFullyConnectedBatch_nightly, TestsFullyConnected) +TEST_P(myriadLayersTestsFullyConnectedBatch_smoke, TestsFullyConnected) { auto p = ::testing::WithParamInterface::GetParam(); auto input_tensor = std::get<0>(p); @@ -117,11 +117,11 @@ TEST_P(myriadLayersTestsFullyConnectedBatch_nightly, TestsFullyConnected) CompareCommonAbsolute(_outputMap.begin()->second, getReferenceOutput(), 0.02); } -class myriadLayersTestsFullyConnectedPVA_nightly: public myriadLayersTests_nightly, +class myriadLayersTestsFullyConnectedPVA_smoke: public myriadLayersTests_nightly, public testing::WithParamInterface { }; -TEST_P(myriadLayersTestsFullyConnectedPVA_nightly, TestsFullyConnected) +TEST_P(myriadLayersTestsFullyConnectedPVA_smoke, TestsFullyConnected) { auto p = ::testing::WithParamInterface::GetParam(); auto input_tensor = std::get<0>(p); diff --git a/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_gather_test.cpp b/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_gather_test.cpp index 251c65d446b..e86055727ed 100644 --- a/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_gather_test.cpp +++ b/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_gather_test.cpp @@ -6,7 +6,7 @@ using namespace testing; -INSTANTIATE_TEST_CASE_P(accuracy, myriadLayerGather_nightly, +INSTANTIATE_TEST_CASE_P(accuracy, myriadLayerGather_smoke, Values(GatherTestParams { {36549, 1024}, {16}, 0, "FP16" }, GatherTestParams { {10}, {10}, 0, "FP16" }, GatherTestParams { {36549, 1024}, {10}, 0, "FP16" }, diff --git a/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_gather_test.hpp b/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_gather_test.hpp index 868858fd44e..512fda7585c 100644 --- a/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_gather_test.hpp +++ b/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_gather_test.hpp @@ -24,7 +24,7 @@ using GatherTestParams = std::tuple; -class myriadLayerGather_nightly : +class myriadLayerGather_smoke : public myriadLayerTestBaseWithParam { protected: @@ -305,6 +305,6 @@ private: } }; -TEST_P(myriadLayerGather_nightly, Gather) { +TEST_P(myriadLayerGather_smoke, Gather) { testGather(); } diff --git a/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_gemm_test.cpp b/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_gemm_test.cpp index 8baa645a208..2f0aafdea56 100644 --- a/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_gemm_test.cpp +++ b/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_gemm_test.cpp @@ -4,7 +4,7 @@ #include "myriad_layers_gemm_test.hpp" -INSTANTIATE_TEST_CASE_P(accuracy, myriadLayerGEMM, +INSTANTIATE_TEST_CASE_P(accuracy, myriadLayerGEMM_smoke, ::testing::Combine( ::testing::Values( MAKE_STRUCT(gemm_parameters, 4.7f, 2.3f, 5, 7, 11, 1, 2, 3, 4, 5, 6, 7, 8), diff --git a/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_gemm_test.hpp b/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_gemm_test.hpp index a9ed573f1ef..65380edc079 100644 --- a/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_gemm_test.hpp +++ b/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_gemm_test.hpp @@ -103,9 +103,9 @@ static void gemm_ref(int M, int N, int K, } } -typedef myriadLayerTestBaseWithParam> myriadLayerGEMM; +typedef myriadLayerTestBaseWithParam> myriadLayerGEMM_smoke; -TEST_P(myriadLayerGEMM, GEMM) { +TEST_P(myriadLayerGEMM_smoke, GEMM) { gemm_parameters gemm_parameter = get<0>(GetParam()); auto layoutPreference = get<1>(GetParam()); auto hasThreeInputs = get<2>(GetParam()); diff --git a/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_grn_test.cpp b/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_grn_test.cpp index 7a004ed7b92..3d2f15df078 100644 --- a/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_grn_test.cpp +++ b/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_grn_test.cpp @@ -4,96 +4,11 @@ #include "myriad_layers_grn_test.hpp" -INSTANTIATE_TEST_CASE_P(accuracy, myriadLayersTestsGRN_nightly, - ::testing::Combine( - ::testing::ValuesIn(s_GRNTensors), - ::testing::ValuesIn(s_GRN_bias), - ::testing::ValuesIn(s_MVNCustomConfig))); - - -TEST_F(myriadLayersTests_nightly, GRN_CHW_Input) -{ - std::string model = R"V0G0N( - - - - - - 1 - 24 - 128 - 224 - - - - - - - - 1 - 24 - 128 - 224 - - - - - 1 - 24 - 128 - 224 - - - - - - - - - )V0G0N"; - - StatusCode st; - - ASSERT_NO_THROW(readNetwork(model)); - - const auto& network = _cnnNetwork; - - _inputsInfo = network.getInputsInfo(); - _inputsInfo["data"]->setPrecision(Precision::FP16); - - _outputsInfo = network.getOutputsInfo(); - _outputsInfo["grn"]->setPrecision(Precision::FP16); - - ASSERT_NO_THROW(st = _vpuPluginPtr->LoadNetwork(_exeNetwork, network, {}, &_resp)); - ASSERT_EQ(StatusCode::OK, st) << _resp.msg; - ASSERT_NE(_exeNetwork, nullptr) << _resp.msg; - - ASSERT_NO_THROW(st = _exeNetwork->CreateInferRequest(_inferRequest, &_resp)); - ASSERT_EQ(StatusCode::OK, st) << _resp.msg; - - auto tensorDesc = TensorDesc(Precision::FP16, _inputsInfo["data"]->getTensorDesc().getDims(), Layout::NCHW); - - auto inputNCHW = make_shared_blob(tensorDesc); - ASSERT_NO_THROW(inputNCHW->allocate()); - - auto outputNCHW = make_shared_blob(tensorDesc); - ASSERT_NO_THROW(outputNCHW->allocate()); - - auto output_ref = make_shared_blob(tensorDesc); - ASSERT_NO_THROW(output_ref->allocate()); - - ASSERT_NO_THROW(GenRandomData(inputNCHW)); - - ASSERT_NO_THROW(st = _inferRequest->SetBlob("data", inputNCHW, &_resp)); - ASSERT_EQ(StatusCode::OK, st) << _resp.msg; - - ASSERT_NO_THROW(st = _inferRequest->SetBlob("grn", outputNCHW, &_resp)); - ASSERT_EQ(StatusCode::OK, st) << _resp.msg; - - ASSERT_NO_THROW(st = _inferRequest->Infer(&_resp)); - ASSERT_EQ(StatusCode::OK, st) << _resp.msg; - - ASSERT_NO_FATAL_FAILURE(refGRN(inputNCHW, output_ref, 0.5f, true)); - - CompareCommonAbsolute(outputNCHW, output_ref, 0.003); -} +INSTANTIATE_TEST_CASE_P( + accuracy, myriadLayersTestsGRN_smoke, + ::testing::Combine( + ::testing::ValuesIn(s_GRNInputs), + ::testing::Values(0.5f, 10.f, 1.f), + ::testing::Values(IRVersion::v7, IRVersion::v10), + ::testing::ValuesIn(s_CustomConfig) +)); diff --git a/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_grn_test.hpp b/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_grn_test.hpp index 768cf523595..5a2cb7eba17 100644 --- a/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_grn_test.hpp +++ b/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_grn_test.hpp @@ -43,46 +43,47 @@ static void refGRN(const Blob::Ptr src, } PRETTY_PARAM(Bias, float) +PRETTY_PARAM(CustomConfig, std::string) -typedef myriadLayerTestBaseWithParam> myriadLayersTestsGRN_nightly; +typedef myriadLayerTestBaseWithParam> myriadLayersTestsGRN_smoke; -TEST_P(myriadLayersTestsGRN_nightly, GRN) { - tensor_test_params dims = std::get<0>(GetParam()); - float bias = std::get<1>(GetParam()); - std::string customConfig = std::get<2>(GetParam()); +TEST_P(myriadLayersTestsGRN_smoke, GRN) { + const SizeVector dims = std::get<0>(GetParam()); + const float bias = std::get<1>(GetParam()); + _irVersion = std::get<2>(GetParam()); + const std::string customConfig = std::get<3>(GetParam()); - if(!customConfig.empty() && !CheckMyriadX()) { - GTEST_SKIP()<<"Custom layers for MYRIAD2 not supported"; + if (!customConfig.empty() && !CheckMyriadX()) { + GTEST_SKIP() << "Custom layers for MYRIAD2 not supported"; } _config[VPU_CONFIG_KEY(CUSTOM_LAYERS)] = customConfig; - SetInputTensor(dims); - SetOutputTensor(dims); + SetInputTensors({dims}); + SetOutputTensors({dims}); std::map params; params["bias"] = std::to_string(bias); - ASSERT_NO_FATAL_FAILURE(makeSingleLayerNetwork(LayerInitParams("GRN").params(params))); + ASSERT_NO_FATAL_FAILURE(makeSingleLayerNetwork(LayerInitParams("GRN").params(params), + NetworkInitParams() + .layoutPreference(vpu::LayoutPreference::ChannelMajor) + .lockLayout(true))); ASSERT_TRUE(Infer()); - ASSERT_NO_FATAL_FAILURE(refGRN(_inputMap.begin()->second, _refBlob, bias, false)); + ASSERT_NO_FATAL_FAILURE(refGRN(_inputMap.begin()->second, _refBlob, bias, true)); CompareCommonAbsolute(_outputMap.begin()->second, _refBlob, ERROR_BOUND); } -static std::vector s_GRNTensors = { - {{1, 3, 16, 224}}, - {{1, 24, 128, 224}}, -}; - -static std::vector s_GRN_bias = { - 0.5f, 10.f -}; - -static std::vector s_MVNCustomConfig = { - "" , +static std::vector s_CustomConfig = { + {""} , #ifdef VPU_HAS_CUSTOM_KERNELS getIELibraryPath() + "/vpu_custom_kernels/customLayerBindings.xml" #endif }; + +static std::vector s_GRNInputs = { + {1, 3, 16, 224}, + {1, 24, 128, 224}, +}; \ No newline at end of file diff --git a/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_interp_test.cpp b/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_interp_test.cpp index 44eb70f6302..1628d021f2e 100644 --- a/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_interp_test.cpp +++ b/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_interp_test.cpp @@ -5,7 +5,7 @@ #include "myriad_layers_interp_test.hpp" INSTANTIATE_TEST_CASE_P( - accuracy, myriadLayersTestsInterp_nightly, + accuracy, myriadLayersTestsInterp_smoke, ::testing::Combine( ::testing::Values( diff --git a/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_interp_test.hpp b/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_interp_test.hpp index 533940bddcd..834461632eb 100644 --- a/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_interp_test.hpp +++ b/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_interp_test.hpp @@ -14,7 +14,7 @@ PRETTY_PARAM(layoutPreference, vpu::LayoutPreference) PRETTY_PARAM(SizeInputOutput, interp_test_params) PRETTY_PARAM(align_corners, bool) -typedef myriadLayerTestBaseWithParam> myriadLayersTestsInterp_nightly; +typedef myriadLayerTestBaseWithParam> myriadLayersTestsInterp_smoke; void ref_interp(const Blob::Ptr src, @@ -103,7 +103,7 @@ void ref_interp(const Blob::Ptr src, } } -TEST_P(myriadLayersTestsInterp_nightly, Interp) +TEST_P(myriadLayersTestsInterp_smoke, Interp) { interp_test_params test_params = get<0>(GetParam()); auto layoutPreference = get<1>(GetParam()); diff --git a/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_log_test.cpp b/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_log_test.cpp index 3b23651a776..24d235e3d18 100644 --- a/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_log_test.cpp +++ b/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_log_test.cpp @@ -5,5 +5,5 @@ #include "myriad_layers_log_test.hpp" INSTANTIATE_TEST_CASE_P( - accuracy, myriadLayersTestsLog_nightly, + accuracy, myriadLayersTestsLog_smoke, ::testing::ValuesIn(s_logParams)); diff --git a/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_log_test.hpp b/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_log_test.hpp index 14c4db5071d..7a6abd749c9 100644 --- a/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_log_test.hpp +++ b/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_log_test.hpp @@ -12,12 +12,12 @@ using namespace InferenceEngine; -class myriadLayersTestsLog_nightly: public myriadLayersTests_nightly, +class myriadLayersTestsLog_smoke: public myriadLayersTests_nightly, public testing::WithParamInterface { public: }; -TEST_P(myriadLayersTestsLog_nightly, TestsLog) +TEST_P(myriadLayersTestsLog_smoke, TestsLog) { auto p = ::testing::WithParamInterface::GetParam(); SetInputTensor(p); diff --git a/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_lrn_test.cpp b/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_lrn_test.cpp index ff6f0cd260d..c0d9b153ca1 100644 --- a/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_lrn_test.cpp +++ b/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_lrn_test.cpp @@ -4,7 +4,7 @@ #include "myriad_layers_lrn_test.hpp" -INSTANTIATE_TEST_CASE_P(accuracy, myriadLayersTestsLRN_nightly, +INSTANTIATE_TEST_CASE_P(accuracy, myriadLayersTestsLRN_smoke, ::testing::Combine( ::testing::ValuesIn(s_LRNTensors), ::testing::ValuesIn(s_LRNlocal_size), diff --git a/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_lrn_test.hpp b/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_lrn_test.hpp index 7137ffca295..dcb4f765244 100644 --- a/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_lrn_test.hpp +++ b/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_lrn_test.hpp @@ -98,9 +98,9 @@ PRETTY_PARAM(k_val, float) PRETTY_PARAM(alpha, float) PRETTY_PARAM(beta, float) -typedef myriadLayerTestBaseWithParam> myriadLayersTestsLRN_nightly; +typedef myriadLayerTestBaseWithParam> myriadLayersTestsLRN_smoke; -TEST_P(myriadLayersTestsLRN_nightly, LRN) { +TEST_P(myriadLayersTestsLRN_smoke, LRN) { tensor_test_params dims = std::get<0>(GetParam()); uint32_t local_v = std::get<1>(GetParam()); float k = std::get<2>(GetParam()); @@ -128,7 +128,7 @@ TEST_P(myriadLayersTestsLRN_nightly, LRN) { CompareCommonAbsolute(dst, _refBlob, ERROR_BOUND); } -TEST_P(myriadLayersTestsLRN_nightly, InnerLRN) { +TEST_P(myriadLayersTestsLRN_smoke, InnerLRN) { tensor_test_params dims = std::get<0>(GetParam()); uint32_t local_v = std::get<1>(GetParam()); float k = std::get<2>(GetParam()); diff --git a/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_lstm_cell.cpp b/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_lstm_cell.cpp index 2eebd191d41..1b779792952 100644 --- a/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_lstm_cell.cpp +++ b/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_lstm_cell.cpp @@ -172,6 +172,6 @@ TEST_F(myriadLayersTests_nightly, LSTMCellSequenceNet) { CompareCommonAbsolute(output, refOut0, ERROR_BOUND); } -INSTANTIATE_TEST_CASE_P(accuracy, myriadLayersTestsLSTMCell_nightly, +INSTANTIATE_TEST_CASE_P(accuracy, myriadLayersTestsLSTMCell_smoke, ::testing::Values(MAKE_STRUCT(lstmcell_test_params, 512, 128)), ); diff --git a/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_lstm_cell.hpp b/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_lstm_cell.hpp index 1491f728be9..860b8089223 100644 --- a/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_lstm_cell.hpp +++ b/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_lstm_cell.hpp @@ -162,7 +162,7 @@ struct lstmcell_test_params { << ", state size = " << tst.state_size; }; }; -typedef myriadLayerTestBaseWithParam myriadLayersTestsLSTMCell_nightly; +typedef myriadLayerTestBaseWithParam myriadLayersTestsLSTMCell_smoke; #define f32Tof16 PrecisionUtils::f32tof16 #define f16Tof32 PrecisionUtils::f16tof32 @@ -304,7 +304,7 @@ static void matrix_copy_transpose_repack(const ie_fp16 *psrc, ie_fp16 *pdst, int } } -TEST_P(myriadLayersTestsLSTMCell_nightly, LSTMCell) { +TEST_P(myriadLayersTestsLSTMCell_smoke, LSTMCell) { auto param = GetParam(); lstmcell_test_params test_params = param; diff --git a/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_mvn_test.cpp b/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_mvn_test.cpp index a54ed4a0836..825b5773e01 100644 --- a/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_mvn_test.cpp +++ b/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_mvn_test.cpp @@ -4,12 +4,13 @@ #include "myriad_layers_mvn_test.hpp" -INSTANTIATE_TEST_CASE_P(accuracy, myriadLayersTestsMVN_nightly, +INSTANTIATE_TEST_CASE_P(accuracy, myriadLayersTestsMVN_smoke, ::testing::Combine( ::testing::ValuesIn(s_MVNTensors), ::testing::ValuesIn(s_MVN_acrossChannels), ::testing::ValuesIn(s_MVN_normalize), ::testing::ValuesIn(s_MVN_epsilon), + ::testing::Values(IRVersion::v7, IRVersion::v10), ::testing::ValuesIn(s_MVNCustomConfig))); TEST_F(myriadLayersTests_nightly, MVN_CHW_Input) diff --git a/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_mvn_test.hpp b/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_mvn_test.hpp index 79def375dd4..ae7741b6ffd 100644 --- a/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_mvn_test.hpp +++ b/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_mvn_test.hpp @@ -136,15 +136,16 @@ PRETTY_PARAM(AcrossChannels, int) PRETTY_PARAM(Normalize, int) PRETTY_PARAM(Epsilon, float) -typedef myriadLayerTestBaseWithParam> myriadLayersTestsMVN_nightly; +typedef myriadLayerTestBaseWithParam> myriadLayersTestsMVN_smoke; -TEST_P(myriadLayersTestsMVN_nightly, MVN) +TEST_P(myriadLayersTestsMVN_smoke, MVN) { tensor_test_params dims = std::get<0>(GetParam()); int acrossChannels = std::get<1>(GetParam()); int normalize = std::get<2>(GetParam()); float eps = std::get<3>(GetParam()); - std::string customConfig = std::get<4>(GetParam()); + _irVersion = std::get<4>(GetParam()); + std::string customConfig = std::get<5>(GetParam()); if(!customConfig.empty() && !CheckMyriadX()) { GTEST_SKIP()<<"Custom layers for MYRIAD2 not supported"; diff --git a/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_nms_test.cpp b/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_nms_test.cpp index d93cfebd34c..a8c7fc63fb9 100644 --- a/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_nms_test.cpp +++ b/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_nms_test.cpp @@ -4,7 +4,7 @@ #include "myriad_layers_nms_test.hpp" -INSTANTIATE_TEST_CASE_P(accuracy, myriadLayersTestsNonMaxSuppression_nightly, +INSTANTIATE_TEST_CASE_P(accuracy, myriadLayersTestsNonMaxSuppression_smoke, ::testing::Values( MAKE_STRUCT(NMS_testParams, {6, 1, 1}, // {spatial_dimension, num_classes, num_batches} diff --git a/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_nms_test.hpp b/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_nms_test.hpp index ec6340f3e80..6acf0e7c3d7 100644 --- a/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_nms_test.hpp +++ b/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_nms_test.hpp @@ -174,9 +174,9 @@ static void copyReference(const Blob::Ptr& blob, const refType src) { } } -typedef myriadLayerTestBaseWithParam myriadLayersTestsNonMaxSuppression_nightly; +typedef myriadLayerTestBaseWithParam myriadLayersTestsNonMaxSuppression_smoke; -TEST_P(myriadLayersTestsNonMaxSuppression_nightly, NonMaxSuppression) { +TEST_P(myriadLayersTestsNonMaxSuppression_smoke, NonMaxSuppression) { const auto params = GetParam(); const int spatDim = params.dims[0]; const int numClasses = params.dims[1]; diff --git a/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_nonzero_test.cpp b/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_nonzero_test.cpp index a75812d01e9..bbcd9e37314 100644 --- a/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_nonzero_test.cpp +++ b/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_nonzero_test.cpp @@ -4,5 +4,5 @@ #include "myriad_layers_nonzero_test.hpp" -INSTANTIATE_TEST_CASE_P(accuracy, myriadLayerTestNonZero_nightly, +INSTANTIATE_TEST_CASE_P(accuracy, myriadLayerTestNonZero_smoke, ::testing::ValuesIn(inputDims)); diff --git a/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_nonzero_test.hpp b/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_nonzero_test.hpp index c2af76b24f9..d294a183ced 100644 --- a/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_nonzero_test.hpp +++ b/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_nonzero_test.hpp @@ -11,7 +11,7 @@ using namespace InferenceEngine; -class myriadLayerTestNonZero_nightly: public myriadLayersTests_nightly, +class myriadLayerTestNonZero_smoke: public myriadLayersTests_nightly, public testing::WithParamInterface { public: void testNonZero(vpu::LayoutPreference preference, Precision precision); @@ -71,7 +71,7 @@ protected: } }; -void myriadLayerTestNonZero_nightly::testNonZero(vpu::LayoutPreference preference, Precision precision) { +void myriadLayerTestNonZero_smoke::testNonZero(vpu::LayoutPreference preference, Precision precision) { _config[VPU_CONFIG_KEY(DETECT_NETWORK_BATCH)] = CONFIG_VALUE(NO); const auto& inputDims = GetParam(); @@ -111,19 +111,19 @@ void myriadLayerTestNonZero_nightly::testNonZero(vpu::LayoutPreference preferenc CompareNonZero(outputIndicesBlob, refIndicesBlob, outputDimsBlob, refDimsBlob); } -TEST_P(myriadLayerTestNonZero_nightly, NonZero) { +TEST_P(myriadLayerTestNonZero_smoke, NonZero) { testNonZero(vpu::LayoutPreference::ChannelMajor, Precision::FP16); } -TEST_P(myriadLayerTestNonZero_nightly, NonZeroNHWC) { +TEST_P(myriadLayerTestNonZero_smoke, NonZeroNHWC) { testNonZero(vpu::LayoutPreference::ChannelMinor, Precision::FP16); } -TEST_P(myriadLayerTestNonZero_nightly, NonZeroI32) { +TEST_P(myriadLayerTestNonZero_smoke, NonZeroI32) { testNonZero(vpu::LayoutPreference::ChannelMajor, Precision::I32); } -TEST_P(myriadLayerTestNonZero_nightly, NonZeroU8) { +TEST_P(myriadLayerTestNonZero_smoke, NonZeroU8) { testNonZero(vpu::LayoutPreference::ChannelMajor, Precision::U8); } diff --git a/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_normalize_test.cpp b/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_normalize_test.cpp index 35277909d71..a9a70a92611 100644 --- a/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_normalize_test.cpp +++ b/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_normalize_test.cpp @@ -4,7 +4,7 @@ #include "myriad_layers_normalize_test.hpp" -INSTANTIATE_TEST_CASE_P(accuracy, myriadLayersTestsNormalize_nightly, ::testing::Combine( +INSTANTIATE_TEST_CASE_P(accuracy, myriadLayersTestsNormalize_smoke, ::testing::Combine( ::testing::Values( // small size, num_channels is not divisible by 8 MAKE_STRUCT(tensor_test_params, 1, 33, 1, 1), @@ -21,7 +21,7 @@ INSTANTIATE_TEST_CASE_P(accuracy, myriadLayersTestsNormalize_nightly, ::testing: )); -INSTANTIATE_TEST_CASE_P(accuracy_more, myriadLayersTestsNormalize_nightly, ::testing::Combine( +INSTANTIATE_TEST_CASE_P(accuracy_more, myriadLayersTestsNormalize_smoke, ::testing::Combine( ::testing::Values( //more tests MAKE_STRUCT(tensor_test_params, 1, 1, 38, 38), diff --git a/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_normalize_test.hpp b/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_normalize_test.hpp index e060fab8ed6..64c24edaff9 100644 --- a/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_normalize_test.hpp +++ b/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_normalize_test.hpp @@ -99,9 +99,9 @@ PRETTY_PARAM(AcrossSpatial, bool) PRETTY_PARAM(ChannelSharedNormalize, bool) PRETTY_PARAM(EPS, float) -typedef myriadLayerTestBaseWithParam> myriadLayersTestsNormalize_nightly; +typedef myriadLayerTestBaseWithParam> myriadLayersTestsNormalize_smoke; -TEST_P(myriadLayersTestsNormalize_nightly, Normalize) { +TEST_P(myriadLayersTestsNormalize_smoke, Normalize) { tensor_test_params dims = std::get<0>(GetParam()); int across_spatial = std::get<1>(GetParam()); int channel_shared = std::get<2>(GetParam()); diff --git a/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_oneHot_test.cpp b/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_oneHot_test.cpp index 3834b2b6317..59fa5635dae 100644 --- a/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_oneHot_test.cpp +++ b/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_oneHot_test.cpp @@ -4,7 +4,7 @@ #include "myriad_layers_oneHot_test.hpp" -INSTANTIATE_TEST_CASE_P(accuracy, myriadLayerTestOneHot_nightly, +INSTANTIATE_TEST_CASE_P(accuracy, myriadLayerTestOneHot_smoke, ::testing::Values( MAKE_STRUCT(OneHotParams, {64}, 2, {0}, {}, {}), MAKE_STRUCT(OneHotParams, {64}, 2, {-1}, {}, {}), @@ -22,7 +22,7 @@ INSTANTIATE_TEST_CASE_P(accuracy, myriadLayerTestOneHot_nightly, MAKE_STRUCT(OneHotParams, {4, 8, 16, 32, 64}, 2, {-1}, {}, {}) )); -INSTANTIATE_TEST_CASE_P(accuracy_add, myriadLayerTestOneHot_nightly, +INSTANTIATE_TEST_CASE_P(accuracy_add, myriadLayerTestOneHot_smoke, ::testing::Values( MAKE_STRUCT(OneHotParams, {16, 32, 64}, 2, {2}, {}, {}), MAKE_STRUCT(OneHotParams, {8, 16, 32,64}, 2, {2}, {}, {}), diff --git a/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_oneHot_test.hpp b/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_oneHot_test.hpp index a12982f0459..58f4fc6193a 100644 --- a/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_oneHot_test.hpp +++ b/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_oneHot_test.hpp @@ -51,9 +51,9 @@ void ref_oneHot(const InferenceEngine::Blob::Ptr src, } } -typedef myriadLayerTestBaseWithParam myriadLayerTestOneHot_nightly; +typedef myriadLayerTestBaseWithParam myriadLayerTestOneHot_smoke; -TEST_P(myriadLayerTestOneHot_nightly, OneHot) { +TEST_P(myriadLayerTestOneHot_smoke, OneHot) { _config[VPU_CONFIG_KEY(DETECT_NETWORK_BATCH)] = CONFIG_VALUE(NO); OneHotParams testParams = GetParam(); diff --git a/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_pad_test.cpp b/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_pad_test.cpp index fbbbf928246..abe65e9f722 100644 --- a/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_pad_test.cpp +++ b/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_pad_test.cpp @@ -4,7 +4,7 @@ #include "myriad_layers_pad_test.hpp" -INSTANTIATE_TEST_CASE_P(accuracy, myriadLayerPad, +INSTANTIATE_TEST_CASE_P(accuracy, myriadLayerPad_smoke, ::testing::Combine( ::testing::Values(MAKE_STRUCT(tensor_test_params, 1, 64, 16, 16)), ::testing::Values(MAKE_STRUCT(pad_parameters, 0, 32, 1, 2, 0, 32, 3, 4)), diff --git a/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_pad_test.hpp b/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_pad_test.hpp index 82a375cf05b..29b61b981d6 100644 --- a/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_pad_test.hpp +++ b/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_pad_test.hpp @@ -31,7 +31,7 @@ struct pad_parameters { PRETTY_PARAM(layoutPreference, vpu::LayoutPreference); PRETTY_PARAM(pad_mode, std::string); -typedef myriadLayerTestBaseWithParam> myriadLayerPad; +typedef myriadLayerTestBaseWithParam> myriadLayerPad_smoke; const float pad_value = 42.0f; @@ -126,7 +126,7 @@ void ref_pad(const Blob::Ptr src, } } -TEST_P(myriadLayerPad, Pad) { +TEST_P(myriadLayerPad_smoke, Pad) { tensor_test_params input_dims = get<0>(GetParam()); pad_parameters pad_parameter = get<1>(GetParam()); auto layoutPreference = get<2>(GetParam()); diff --git a/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_permute_nd_test.cpp b/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_permute_nd_test.cpp index 8d8894611b4..453e15552f9 100644 --- a/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_permute_nd_test.cpp +++ b/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_permute_nd_test.cpp @@ -4,7 +4,7 @@ #include "myriad_layers_permute_nd_test.hpp" -INSTANTIATE_TEST_CASE_P(accuracy_2D, myriadLayersPermuteNDTests_nightly, +INSTANTIATE_TEST_CASE_P(accuracy_2D, myriadLayersPermuteNDTests_smoke, ::testing::Combine( ::testing::ValuesIn(s_inTensors_2D) , ::testing::ValuesIn(s_permuteTensors_2D) @@ -12,7 +12,7 @@ INSTANTIATE_TEST_CASE_P(accuracy_2D, myriadLayersPermuteNDTests_nightly, , ::testing::ValuesIn(s_permutePrecisions) )); -INSTANTIATE_TEST_CASE_P(accuracy_3D, myriadLayersPermuteNDTests_nightly, +INSTANTIATE_TEST_CASE_P(accuracy_3D, myriadLayersPermuteNDTests_smoke, ::testing::Combine( ::testing::ValuesIn(s_inTensors_3D) , ::testing::ValuesIn(s_permuteTensors_3D) @@ -20,7 +20,7 @@ INSTANTIATE_TEST_CASE_P(accuracy_3D, myriadLayersPermuteNDTests_nightly, , ::testing::ValuesIn(s_permutePrecisions) )); -INSTANTIATE_TEST_CASE_P(accuracy_4D, myriadLayersPermuteNDTests_nightly, +INSTANTIATE_TEST_CASE_P(accuracy_4D, myriadLayersPermuteNDTests_smoke, ::testing::Combine( ::testing::ValuesIn(s_inTensors_4D) , ::testing::ValuesIn(s_permuteTensors_4D) @@ -28,7 +28,7 @@ INSTANTIATE_TEST_CASE_P(accuracy_4D, myriadLayersPermuteNDTests_nightly, , ::testing::ValuesIn(s_permutePrecisions) )); -INSTANTIATE_TEST_CASE_P(accuracy_5D, myriadLayersPermuteNDTests_nightly, +INSTANTIATE_TEST_CASE_P(accuracy_5D, myriadLayersPermuteNDTests_smoke, ::testing::Combine( ::testing::ValuesIn(s_inTensors_5D) , ::testing::ValuesIn(s_permuteTensors_5D) @@ -36,7 +36,7 @@ INSTANTIATE_TEST_CASE_P(accuracy_5D, myriadLayersPermuteNDTests_nightly, , ::testing::ValuesIn(s_permutePrecisions) )); -INSTANTIATE_TEST_CASE_P(fc_to_conv_case, myriadLayersPermuteNDTests_nightly, +INSTANTIATE_TEST_CASE_P(fc_to_conv_case, myriadLayersPermuteNDTests_smoke, ::testing::Values( std::make_tuple( SizeVector{8, 50, 256, 7, 7}, @@ -53,7 +53,7 @@ INSTANTIATE_TEST_CASE_P(fc_to_conv_case, myriadLayersPermuteNDTests_nightly, ) ); -INSTANTIATE_TEST_CASE_P(accuracy_FasterRCNN, myriadLayersPermuteNDTests_nightly, +INSTANTIATE_TEST_CASE_P(accuracy_FasterRCNN, myriadLayersPermuteNDTests_smoke, ::testing::Combine( ::testing::Values({1, 24, 14, 14}) ,::testing::Values({0, 2, 3, 1}) @@ -61,7 +61,7 @@ INSTANTIATE_TEST_CASE_P(accuracy_FasterRCNN, myriadLayersPermuteNDTests_nightly, ,::testing::ValuesIn(s_permutePrecisions) )); -INSTANTIATE_TEST_CASE_P(accuracy_MaskRCNN, myriadLayersPermuteNDTests_nightly, +INSTANTIATE_TEST_CASE_P(accuracy_MaskRCNN, myriadLayersPermuteNDTests_smoke, ::testing::Combine( ::testing::Values({4, 3, 1, 88, 120}) ,::testing::Values({0, 3, 4, 1, 2}) diff --git a/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_permute_nd_test.hpp b/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_permute_nd_test.hpp index aac7cc2b8ae..736716d2b1f 100644 --- a/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_permute_nd_test.hpp +++ b/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_permute_nd_test.hpp @@ -64,13 +64,13 @@ using PermuteNDParams = std::tuple; -class myriadLayersPermuteNDTests_nightly: +class myriadLayersPermuteNDTests_smoke: public myriadLayersTests_nightly, public testing::WithParamInterface { }; -TEST_P(myriadLayersPermuteNDTests_nightly, Permute) { +TEST_P(myriadLayersPermuteNDTests_smoke, Permute) { const auto& testParams = GetParam(); const auto& inputTensorSizes = std::get<0>(testParams); const auto& permutationVector = std::get<1>(testParams); diff --git a/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_permute_test.cpp b/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_permute_test.cpp index 3638bd2da8f..41973e348c3 100644 --- a/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_permute_test.cpp +++ b/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_permute_test.cpp @@ -4,13 +4,13 @@ #include "myriad_layers_permute_test.hpp" -INSTANTIATE_TEST_CASE_P(accuracy, myriadLayersPermuteTests_nightly, +INSTANTIATE_TEST_CASE_P(accuracy, myriadLayersPermuteTests_smoke, ::testing::Combine( ::testing::ValuesIn(s_inTensors) , ::testing::ValuesIn(s_permuteTensors) )); -INSTANTIATE_TEST_CASE_P(accuracyFasterRCNN, myriadLayersPermuteTests_nightly, +INSTANTIATE_TEST_CASE_P(accuracyFasterRCNN, myriadLayersPermuteTests_smoke, ::testing::Combine( ::testing::Values({1, 24, 14, 14}) ,::testing::Values({0, 2, 3, 1}) diff --git a/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_permute_test.hpp b/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_permute_test.hpp index 17110869863..cbc8bc8b5af 100644 --- a/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_permute_test.hpp +++ b/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_permute_test.hpp @@ -22,7 +22,7 @@ static inline void PrintTo(const offset_test_params& param, ::std::ostream* os) } typedef std::tuple PermuteParams; -class myriadLayersPermuteTests_nightly: public myriadLayersTests_nightly, /*input tensor, order */ +class myriadLayersPermuteTests_smoke: public myriadLayersTests_nightly, /*input tensor, order */ public testing::WithParamInterface { }; @@ -56,7 +56,7 @@ static void genRefData(InferenceEngine::Blob::Ptr blob) { } } -TEST_P(myriadLayersPermuteTests_nightly, Permute) { +TEST_P(myriadLayersPermuteTests_smoke, Permute) { std::map params; InferenceEngine::SizeVector output_tensor; int32_t IW = 0; diff --git a/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_pool_nd_test.cpp b/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_pool_nd_test.cpp index a004fb70bb1..e696c2b4b07 100644 --- a/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_pool_nd_test.cpp +++ b/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_pool_nd_test.cpp @@ -13,7 +13,7 @@ using namespace testing; //====================================================================== INSTANTIATE_TEST_CASE_P(tricky_ncdhw_avg_userpad, - myriadLayersPoolNDTest_nightly, + myriadLayersPoolNDTest_smoke, Combine( Values(InputShape {1, 3, 19, 65, 47}), Values(KernelShape {1, 3, 5}), @@ -29,7 +29,7 @@ INSTANTIATE_TEST_CASE_P(tricky_ncdhw_avg_userpad, ); INSTANTIATE_TEST_CASE_P(tricky_ncdhw_max_userpad, - myriadLayersPoolNDTest_nightly, + myriadLayersPoolNDTest_smoke, Combine( Values(InputShape {1, 3, 19, 65, 47}), Values(KernelShape {1, 3, 5}), @@ -44,7 +44,7 @@ INSTANTIATE_TEST_CASE_P(tricky_ncdhw_max_userpad, ); INSTANTIATE_TEST_CASE_P(tricky_ncdhw_avg_autopad, - myriadLayersPoolNDTest_nightly, + myriadLayersPoolNDTest_smoke, Combine( Values(InputShape {1, 3, 19, 65, 47}), Values(KernelShape {1, 3, 5}), @@ -62,7 +62,7 @@ INSTANTIATE_TEST_CASE_P(tricky_ncdhw_avg_autopad, ); INSTANTIATE_TEST_CASE_P(tricky_ncdhw_max_autopad, - myriadLayersPoolNDTest_nightly, + myriadLayersPoolNDTest_smoke, Combine( Values(InputShape {1, 3, 19, 65, 47}), Values(KernelShape {1, 3, 5}), @@ -85,7 +85,7 @@ INSTANTIATE_TEST_CASE_P(tricky_ncdhw_max_autopad, //====================================================================== INSTANTIATE_TEST_CASE_P(simple_ncdhw_avg_userpad, - myriadLayersPoolNDTest_nightly, + myriadLayersPoolNDTest_smoke, Combine( Values(InputShape {1, 3, 20, 64, 48}), Values(KernelShape {3, 3, 3}), @@ -101,7 +101,7 @@ INSTANTIATE_TEST_CASE_P(simple_ncdhw_avg_userpad, ); INSTANTIATE_TEST_CASE_P(simple_ncdhw_max_userpad, - myriadLayersPoolNDTest_nightly, + myriadLayersPoolNDTest_smoke, Combine( Values(InputShape {1, 3, 20, 64, 48}), Values(KernelShape {3, 3, 3}), @@ -125,7 +125,7 @@ INSTANTIATE_TEST_CASE_P(simple_ncdhw_max_userpad, //---------------------------------------------------------------------- INSTANTIATE_TEST_CASE_P(simple_ncdhw_avg_autopad_1, - myriadLayersPoolNDTest_nightly, + myriadLayersPoolNDTest_smoke, Combine( Values(InputShape {1, 3, 20, 64, 48}), Values(KernelShape {3, 3, 3}), @@ -142,7 +142,7 @@ INSTANTIATE_TEST_CASE_P(simple_ncdhw_avg_autopad_1, ); INSTANTIATE_TEST_CASE_P(simple_ncdhw_avg_autopad_2, - myriadLayersPoolNDTest_nightly, + myriadLayersPoolNDTest_smoke, Combine( Values(InputShape {1, 3, 20, 64, 48}), Values(KernelShape {3, 3, 3}), @@ -159,7 +159,7 @@ INSTANTIATE_TEST_CASE_P(simple_ncdhw_avg_autopad_2, //---------------------------------------------------------------------- INSTANTIATE_TEST_CASE_P(simple_ncdhw_max_autopad, - myriadLayersPoolNDTest_nightly, + myriadLayersPoolNDTest_smoke, Combine( Values(InputShape {1, 3, 20, 64, 48}), Values(KernelShape {3, 3, 3}), @@ -182,7 +182,7 @@ INSTANTIATE_TEST_CASE_P(simple_ncdhw_max_autopad, //====================================================================== INSTANTIATE_TEST_CASE_P(tricky_nchw_avg_userpad, - myriadLayersPoolNDTest_nightly, + myriadLayersPoolNDTest_smoke, Combine( Values(InputShape {1, 3, 65, 47}), Values(KernelShape {1, 5}), @@ -198,7 +198,7 @@ INSTANTIATE_TEST_CASE_P(tricky_nchw_avg_userpad, ); INSTANTIATE_TEST_CASE_P(tricky_nchw_max_userpad, - myriadLayersPoolNDTest_nightly, + myriadLayersPoolNDTest_smoke, Combine( Values(InputShape {1, 3, 65, 47}), Values(KernelShape {1, 5}), @@ -213,7 +213,7 @@ INSTANTIATE_TEST_CASE_P(tricky_nchw_max_userpad, ); INSTANTIATE_TEST_CASE_P(tricky_nchw_avg_autopad, - myriadLayersPoolNDTest_nightly, + myriadLayersPoolNDTest_smoke, Combine( Values(InputShape {1, 3, 65, 47}), Values(KernelShape {1, 5}), @@ -231,7 +231,7 @@ INSTANTIATE_TEST_CASE_P(tricky_nchw_avg_autopad, ); INSTANTIATE_TEST_CASE_P(tricky_nchw_max_autopad, - myriadLayersPoolNDTest_nightly, + myriadLayersPoolNDTest_smoke, Combine( Values(InputShape {1, 3, 65, 47}), Values(KernelShape {1, 5}), @@ -254,7 +254,7 @@ INSTANTIATE_TEST_CASE_P(tricky_nchw_max_autopad, //====================================================================== INSTANTIATE_TEST_CASE_P(simple_nchw_avg_userpad, - myriadLayersPoolNDTest_nightly, + myriadLayersPoolNDTest_smoke, Combine( Values(InputShape {1, 3, 64, 48}), Values(KernelShape {3, 3}), @@ -270,7 +270,7 @@ INSTANTIATE_TEST_CASE_P(simple_nchw_avg_userpad, ); INSTANTIATE_TEST_CASE_P(simple_nchw_max_userpad, - myriadLayersPoolNDTest_nightly, + myriadLayersPoolNDTest_smoke, Combine( Values(InputShape {1, 3, 64, 48}), Values(KernelShape {3, 3}), @@ -294,7 +294,7 @@ INSTANTIATE_TEST_CASE_P(simple_nchw_max_userpad, //---------------------------------------------------------------------- INSTANTIATE_TEST_CASE_P(simple_nchw_avg_autopad_1, - myriadLayersPoolNDTest_nightly, + myriadLayersPoolNDTest_smoke, Combine( Values(InputShape {1, 3, 64, 48}), Values(KernelShape {3, 3}), @@ -311,7 +311,7 @@ INSTANTIATE_TEST_CASE_P(simple_nchw_avg_autopad_1, ); INSTANTIATE_TEST_CASE_P(simple_nchw_avg_autopad_2, - myriadLayersPoolNDTest_nightly, + myriadLayersPoolNDTest_smoke, Combine( Values(InputShape {1, 3, 64, 48}), Values(KernelShape {3, 3}), @@ -328,7 +328,7 @@ INSTANTIATE_TEST_CASE_P(simple_nchw_avg_autopad_2, //---------------------------------------------------------------------- INSTANTIATE_TEST_CASE_P(simple_nchw_max_autopad, - myriadLayersPoolNDTest_nightly, + myriadLayersPoolNDTest_smoke, Combine( Values(InputShape {1, 3, 64, 48}), Values(KernelShape {3, 3}), @@ -351,7 +351,7 @@ INSTANTIATE_TEST_CASE_P(simple_nchw_max_autopad, //====================================================================== INSTANTIATE_TEST_CASE_P(i3d_id10, - myriadLayersPoolNDTest_nightly, + myriadLayersPoolNDTest_smoke, Combine( Values(InputShape {1, 64, 40, 112, 112}), Values(KernelShape {1, 3, 3}), @@ -364,7 +364,7 @@ INSTANTIATE_TEST_CASE_P(i3d_id10, Values(ExcludePad(true)))); INSTANTIATE_TEST_CASE_P(i3d_id47, - myriadLayersPoolNDTest_nightly, + myriadLayersPoolNDTest_smoke, Combine( Values(InputShape {1, 192, 40, 28, 28}), Values(KernelShape {3, 3, 3}), @@ -377,7 +377,7 @@ INSTANTIATE_TEST_CASE_P(i3d_id47, Values(ExcludePad(true)))); INSTANTIATE_TEST_CASE_P(i3d_id247, - myriadLayersPoolNDTest_nightly, + myriadLayersPoolNDTest_smoke, Combine( Values(InputShape {1, 832, 20, 14, 14}), Values(KernelShape {2, 2, 2}), @@ -390,7 +390,7 @@ INSTANTIATE_TEST_CASE_P(i3d_id247, Values(ExcludePad(true)))); INSTANTIATE_TEST_CASE_P(i3d_id312, - myriadLayersPoolNDTest_nightly, + myriadLayersPoolNDTest_smoke, Combine( Values(InputShape {1, 1024, 10, 7, 7}), Values(KernelShape {2, 7, 7}), diff --git a/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_pool_nd_test.hpp b/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_pool_nd_test.hpp index b1043930e86..232953e223b 100644 --- a/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_pool_nd_test.hpp +++ b/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_pool_nd_test.hpp @@ -775,8 +775,8 @@ private: } }; -class myriadLayersPoolNDTest_nightly: public PoolNDTest {}; +class myriadLayersPoolNDTest_smoke: public PoolNDTest {}; -TEST_P(myriadLayersPoolNDTest_nightly, PoolND) { +TEST_P(myriadLayersPoolNDTest_smoke, PoolND) { testPoolND(); } diff --git a/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_pooling_test.cpp b/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_pooling_test.cpp index b312c137408..1564201cb34 100644 --- a/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_pooling_test.cpp +++ b/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_pooling_test.cpp @@ -4,7 +4,7 @@ #include "myriad_layers_pooling_test.hpp" -INSTANTIATE_TEST_CASE_P(accuracy, myriadLayers_IR3_BatchPoolingTests_nightly, +INSTANTIATE_TEST_CASE_P(accuracy, myriadLayers_IR3_BatchPoolingTests_smoke, ::testing::Combine( ::testing::Values({10, 192, 56, 56}) , ::testing::Values(MAKE_STRUCT(param_size, 3, 3)) /* kernel */ @@ -17,7 +17,7 @@ INSTANTIATE_TEST_CASE_P(accuracy, myriadLayers_IR3_BatchPoolingTests_nightly, ) ); -INSTANTIATE_TEST_CASE_P(accuracy_1, myriadLayers_IR3_BatchPoolingTests_nightly, +INSTANTIATE_TEST_CASE_P(accuracy_1, myriadLayers_IR3_BatchPoolingTests_smoke, ::testing::Combine( ::testing::Values({10, 576, 14, 14}) , ::testing::Values(MAKE_STRUCT(param_size, 2, 2)) /* kernel */ @@ -31,7 +31,7 @@ INSTANTIATE_TEST_CASE_P(accuracy_1, myriadLayers_IR3_BatchPoolingTests_nightly, ); -INSTANTIATE_TEST_CASE_P(accuracy_4X4, myriadLayers_IR3_PoolingTests_nightly, +INSTANTIATE_TEST_CASE_P(accuracy_4X4, myriadLayers_IR3_PoolingTests_smoke, ::testing::Combine( ::testing::Values({10, 1024, 4, 4}) , ::testing::Values(MAKE_STRUCT(param_size, 4, 4)) /* kernel */ @@ -44,7 +44,7 @@ INSTANTIATE_TEST_CASE_P(accuracy_4X4, myriadLayers_IR3_PoolingTests_nightly, ) ); -INSTANTIATE_TEST_CASE_P(accuracy_1X1, myriadLayers_IR3_BatchPoolingTests_nightly, +INSTANTIATE_TEST_CASE_P(accuracy_1X1, myriadLayers_IR3_BatchPoolingTests_smoke, ::testing::Combine( ::testing::Values({1, 3, 5, 7}) , ::testing::Values(MAKE_STRUCT(param_size, 1, 1)) /* kernel */ @@ -57,7 +57,7 @@ INSTANTIATE_TEST_CASE_P(accuracy_1X1, myriadLayers_IR3_BatchPoolingTests_nightly ) ); -INSTANTIATE_TEST_CASE_P(accuracy_2X2p0000, myriadLayers_IR3_BatchPoolingTests_nightly, +INSTANTIATE_TEST_CASE_P(accuracy_2X2p0000, myriadLayers_IR3_BatchPoolingTests_smoke, ::testing::Combine( ::testing::Values({1, 512, 26, 26}) , ::testing::Values(MAKE_STRUCT(param_size, 2, 2)) /* kernel */ @@ -70,7 +70,7 @@ INSTANTIATE_TEST_CASE_P(accuracy_2X2p0000, myriadLayers_IR3_BatchPoolingTests_ni ) ); -INSTANTIATE_TEST_CASE_P(accuracy_2X2p0001, myriadLayers_IR3_BatchPoolingTests_nightly, +INSTANTIATE_TEST_CASE_P(accuracy_2X2p0001, myriadLayers_IR3_BatchPoolingTests_smoke, ::testing::Combine( ::testing::Values({1, 512, 26, 26}) , ::testing::Values(MAKE_STRUCT(param_size, 2, 2)) /* kernel */ @@ -82,7 +82,7 @@ INSTANTIATE_TEST_CASE_P(accuracy_2X2p0001, myriadLayers_IR3_BatchPoolingTests_ni , ::testing::ValuesIn(s_poolingMethod) ) ); -INSTANTIATE_TEST_CASE_P(accuracy_2X2p0011, myriadLayers_IR3_BatchPoolingTests_nightly, +INSTANTIATE_TEST_CASE_P(accuracy_2X2p0011, myriadLayers_IR3_BatchPoolingTests_smoke, ::testing::Combine( ::testing::Values({1, 512, 26, 26}) , ::testing::Values(MAKE_STRUCT(param_size, 2, 2)) /* kernel */ @@ -94,7 +94,7 @@ INSTANTIATE_TEST_CASE_P(accuracy_2X2p0011, myriadLayers_IR3_BatchPoolingTests_ni , ::testing::ValuesIn(s_poolingMethod) ) ); -INSTANTIATE_TEST_CASE_P(accuracy_2X2p0111, myriadLayers_IR3_BatchPoolingTests_nightly, +INSTANTIATE_TEST_CASE_P(accuracy_2X2p0111, myriadLayers_IR3_BatchPoolingTests_smoke, ::testing::Combine( ::testing::Values({1, 512, 26, 26}) , ::testing::Values(MAKE_STRUCT(param_size, 2, 2)) /* kernel */ @@ -106,7 +106,7 @@ INSTANTIATE_TEST_CASE_P(accuracy_2X2p0111, myriadLayers_IR3_BatchPoolingTests_ni , ::testing::ValuesIn(s_poolingMethod) ) ); -INSTANTIATE_TEST_CASE_P(accuracy_2X2p1111, myriadLayers_IR3_BatchPoolingTests_nightly, +INSTANTIATE_TEST_CASE_P(accuracy_2X2p1111, myriadLayers_IR3_BatchPoolingTests_smoke, ::testing::Combine( ::testing::Values({1, 512, 26, 26}) , ::testing::Values(MAKE_STRUCT(param_size, 2, 2)) /* kernel */ @@ -118,7 +118,7 @@ INSTANTIATE_TEST_CASE_P(accuracy_2X2p1111, myriadLayers_IR3_BatchPoolingTests_ni , ::testing::ValuesIn(s_poolingMethod) ) ); -INSTANTIATE_TEST_CASE_P(accuracy_2X2p1110, myriadLayers_IR3_BatchPoolingTests_nightly, +INSTANTIATE_TEST_CASE_P(accuracy_2X2p1110, myriadLayers_IR3_BatchPoolingTests_smoke, ::testing::Combine( ::testing::Values({1, 512, 26, 26}) , ::testing::Values(MAKE_STRUCT(param_size, 2, 2)) /* kernel */ @@ -130,7 +130,7 @@ INSTANTIATE_TEST_CASE_P(accuracy_2X2p1110, myriadLayers_IR3_BatchPoolingTests_ni , ::testing::ValuesIn(s_poolingMethod) ) ); -INSTANTIATE_TEST_CASE_P(accuracy_2X2p1100, myriadLayers_IR3_BatchPoolingTests_nightly, +INSTANTIATE_TEST_CASE_P(accuracy_2X2p1100, myriadLayers_IR3_BatchPoolingTests_smoke, ::testing::Combine( ::testing::Values({1, 512, 26, 26}) , ::testing::Values(MAKE_STRUCT(param_size, 2, 2)) /* kernel */ @@ -142,7 +142,7 @@ INSTANTIATE_TEST_CASE_P(accuracy_2X2p1100, myriadLayers_IR3_BatchPoolingTests_ni , ::testing::ValuesIn(s_poolingMethod) ) ); -INSTANTIATE_TEST_CASE_P(accuracy_2X2p1000, myriadLayers_IR3_BatchPoolingTests_nightly, +INSTANTIATE_TEST_CASE_P(accuracy_2X2p1000, myriadLayers_IR3_BatchPoolingTests_smoke, ::testing::Combine( ::testing::Values({1, 512, 26, 26}) , ::testing::Values(MAKE_STRUCT(param_size, 2, 2)) /* kernel */ @@ -154,7 +154,7 @@ INSTANTIATE_TEST_CASE_P(accuracy_2X2p1000, myriadLayers_IR3_BatchPoolingTests_ni , ::testing::ValuesIn(s_poolingMethod) ) ); -INSTANTIATE_TEST_CASE_P(accuracy_2X2p1101, myriadLayers_IR3_BatchPoolingTests_nightly, +INSTANTIATE_TEST_CASE_P(accuracy_2X2p1101, myriadLayers_IR3_BatchPoolingTests_smoke, ::testing::Combine( ::testing::Values({1, 512, 26, 26}) , ::testing::Values(MAKE_STRUCT(param_size, 2, 2)) /* kernel */ @@ -166,7 +166,7 @@ INSTANTIATE_TEST_CASE_P(accuracy_2X2p1101, myriadLayers_IR3_BatchPoolingTests_ni , ::testing::ValuesIn(s_poolingMethod) ) ); -INSTANTIATE_TEST_CASE_P(accuracy_2X2p1011, myriadLayers_IR3_BatchPoolingTests_nightly, +INSTANTIATE_TEST_CASE_P(accuracy_2X2p1011, myriadLayers_IR3_BatchPoolingTests_smoke, ::testing::Combine( ::testing::Values({1, 512, 26, 26}) , ::testing::Values(MAKE_STRUCT(param_size, 2, 2)) /* kernel */ @@ -179,14 +179,14 @@ INSTANTIATE_TEST_CASE_P(accuracy_2X2p1011, myriadLayers_IR3_BatchPoolingTests_ni ) ); -INSTANTIATE_TEST_CASE_P(accuracy, myriadLayersTestsMax_nightly, +INSTANTIATE_TEST_CASE_P(accuracy, myriadLayersTestsMax_smoke, ::testing::Combine( ::testing::ValuesIn(g_poolingInput), ::testing::ValuesIn(g_poolingLayerParamsFull), ::testing::ValuesIn(g_poolingLayout)) ); -INSTANTIATE_TEST_CASE_P(accuracy, myriadLayersTestsMaxOverlappedByKernel_nightly, +INSTANTIATE_TEST_CASE_P(accuracy, myriadLayersTestsMaxOverlappedByKernel_smoke, ::testing::Combine( ::testing::Values({1, 1024, 6, 6}), ::testing::Values(MAKE_STRUCT(param_size, 7, 7)), @@ -195,7 +195,7 @@ INSTANTIATE_TEST_CASE_P(accuracy, myriadLayersTestsMaxOverlappedByKernel_nightly ::testing::ValuesIn(g_poolingLayout)) ); -INSTANTIATE_TEST_CASE_P(accuracy, myriadLayersTestsMaxPad4_nightly, +INSTANTIATE_TEST_CASE_P(accuracy, myriadLayersTestsMaxPad4_smoke, ::testing::Combine( ::testing::ValuesIn(g_poolingInputPad4), ::testing::ValuesIn(g_poolingKernelPad4), @@ -204,7 +204,7 @@ INSTANTIATE_TEST_CASE_P(accuracy, myriadLayersTestsMaxPad4_nightly, ::testing::ValuesIn(g_poolingLayout)) ); -INSTANTIATE_TEST_CASE_P(accuracy, myriadLayersTestsAvgPad4_nightly, +INSTANTIATE_TEST_CASE_P(accuracy, myriadLayersTestsAvgPad4_smoke, ::testing::Combine( ::testing::ValuesIn(g_poolingInputPad4), ::testing::ValuesIn(g_poolingKernelPad4), @@ -213,24 +213,24 @@ INSTANTIATE_TEST_CASE_P(accuracy, myriadLayersTestsAvgPad4_nightly, ::testing::ValuesIn(g_poolingLayout)) ); -INSTANTIATE_TEST_CASE_P(accuracy, myriadLayersTestsGlobalMax_nightly, +INSTANTIATE_TEST_CASE_P(accuracy, myriadLayersTestsGlobalMax_smoke, ::testing::ValuesIn(g_GlobalPoolingInput )); -INSTANTIATE_TEST_CASE_P(accuracy_3x3, myriadLayersTestsMax_nightly, +INSTANTIATE_TEST_CASE_P(accuracy_3x3, myriadLayersTestsMax_smoke, ::testing::Combine( ::testing::ValuesIn(g_poolingInput), ::testing::ValuesIn(s_poolingLayerParams_k3x3), ::testing::ValuesIn(g_poolingLayout)) ); -INSTANTIATE_TEST_CASE_P(accuracy, myriadLayersTestsAvg_nightly, +INSTANTIATE_TEST_CASE_P(accuracy, myriadLayersTestsAvg_smoke, ::testing::Combine( ::testing::ValuesIn(g_poolingInput), ::testing::ValuesIn(g_poolingLayerParamsFull), ::testing::ValuesIn(g_poolingLayout)) ); -INSTANTIATE_TEST_CASE_P(accuracy, myriadLayersTestsAvgOverlappedByKernel_nightly, +INSTANTIATE_TEST_CASE_P(accuracy, myriadLayersTestsAvgOverlappedByKernel_smoke, ::testing::Combine( ::testing::Values({1, 1024, 6, 6}), ::testing::Values(MAKE_STRUCT(param_size, 7, 7)), @@ -239,12 +239,12 @@ INSTANTIATE_TEST_CASE_P(accuracy, myriadLayersTestsAvgOverlappedByKernel_nightly ::testing::ValuesIn(g_poolingLayout)) ); -INSTANTIATE_TEST_CASE_P(accuracy_3x3, myriadLayersTestsAvg_nightly, +INSTANTIATE_TEST_CASE_P(accuracy_3x3, myriadLayersTestsAvg_smoke, ::testing::Combine( ::testing::ValuesIn(g_poolingInput), ::testing::ValuesIn(s_poolingLayerParams_k3x3), ::testing::ValuesIn(g_poolingLayout)) ); -INSTANTIATE_TEST_CASE_P(accuracy, myriadLayersTestsGlobalAvg_nightly, +INSTANTIATE_TEST_CASE_P(accuracy, myriadLayersTestsGlobalAvg_smoke, ::testing::ValuesIn(g_GlobalPoolingInput)); diff --git a/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_pooling_test.hpp b/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_pooling_test.hpp index 73123ac0d27..c1923c65257 100644 --- a/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_pooling_test.hpp +++ b/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_pooling_test.hpp @@ -15,35 +15,35 @@ extern const char POOLING_MAX[] = "max"; extern const char POOLING_AVG[] = "avg"; -class myriadLayersTestsMax_nightly: public PoolingTest +class myriadLayersTestsMax_smoke: public PoolingTest { }; -class myriadLayersTestsMaxOverlappedByKernel_nightly: public PoolingTestPad4 +class myriadLayersTestsMaxOverlappedByKernel_smoke: public PoolingTestPad4 { }; -class myriadLayersTestsMaxPad4_nightly: public PoolingTestPad4 +class myriadLayersTestsMaxPad4_smoke: public PoolingTestPad4 { }; -class myriadLayersTestsGlobalMax_nightly: public GlobalPoolingTest +class myriadLayersTestsGlobalMax_smoke: public GlobalPoolingTest { }; -class myriadLayersTestsAvg_nightly: public PoolingTest +class myriadLayersTestsAvg_smoke: public PoolingTest { }; -class myriadLayersTestsAvgOverlappedByKernel_nightly: public PoolingTestPad4 +class myriadLayersTestsAvgOverlappedByKernel_smoke: public PoolingTestPad4 { }; -class myriadLayersTestsAvgPad4_nightly: public PoolingTestPad4 +class myriadLayersTestsAvgPad4_smoke: public PoolingTestPad4 { }; -class myriadLayersTestsGlobalAvg_nightly: public GlobalPoolingTest +class myriadLayersTestsGlobalAvg_smoke: public GlobalPoolingTest { }; @@ -51,7 +51,7 @@ class myriadLayersTestsGlobalAvg_nightly: public GlobalPoolingTest /* input tensor, kernel, stride, pads_begin, pads_end, auto_pad, exclude_pad method */ typedef std::tuple IR3_PoolParams; -class myriadLayers_IR3_PoolingTests_nightly: public myriadLayersTests_nightly, /*input tensor, kernel, stride, pads_begin, pads_end, out_channel, group */ +class myriadLayers_IR3_PoolingTests_smoke: public myriadLayersTests_nightly, /*input tensor, kernel, stride, pads_begin, pads_end, out_channel, group */ public testing::WithParamInterface { }; @@ -90,7 +90,7 @@ static void genTestData(InferenceEngine::Blob::Ptr blob) { } -TEST_P(myriadLayers_IR3_PoolingTests_nightly, Pooling) { +TEST_P(myriadLayers_IR3_PoolingTests_smoke, Pooling) { std::map params; InferenceEngine::SizeVector output_tensor; int32_t IW = 0; @@ -166,11 +166,11 @@ TEST_P(myriadLayers_IR3_PoolingTests_nightly, Pooling) { CompareCommonAbsolute(_outputMap.begin()->second, getReferenceOutput(), maxerr); } -class myriadLayers_IR3_BatchPoolingTests_nightly: public myriadLayersTests_nightly, /*input tensor, kernel, stride, pads_begin, pads_end, out_channel, group */ +class myriadLayers_IR3_BatchPoolingTests_smoke: public myriadLayersTests_nightly, /*input tensor, kernel, stride, pads_begin, pads_end, out_channel, group */ public testing::WithParamInterface { }; -TEST_P(myriadLayers_IR3_BatchPoolingTests_nightly, Pooling) { +TEST_P(myriadLayers_IR3_BatchPoolingTests_smoke, Pooling) { std::map params; InferenceEngine::SizeVector output_tensor; int32_t IW = 0; @@ -259,52 +259,52 @@ static const std::vector s_poolingMethod = { "max" }; -TEST_P(myriadLayersTestsMax_nightly, MaxPooling) +TEST_P(myriadLayersTestsMax_smoke, MaxPooling) { ASSERT_TRUE(generateNetAndInfer(NetworkInitParams().layoutPreference(_layout_preference))); CompareCommonAbsolute(_outputMap.begin()->second, getReferenceOutput(), ERROR_BOUND); } -TEST_P(myriadLayersTestsMaxOverlappedByKernel_nightly, MaxPooling) +TEST_P(myriadLayersTestsMaxOverlappedByKernel_smoke, MaxPooling) { ASSERT_TRUE(generateNetAndInfer(NetworkInitParams().layoutPreference(_layout_preference))); CompareCommonAbsolute(_outputMap.begin()->second, getReferenceOutput(), ERROR_BOUND); } -TEST_P(myriadLayersTestsMaxPad4_nightly, MaxPoolingPad4) +TEST_P(myriadLayersTestsMaxPad4_smoke, MaxPoolingPad4) { ASSERT_TRUE(generateNetAndInfer(NetworkInitParams().layoutPreference(_layout_preference))); auto refBlob = getReferenceOutput(); CompareCommonAbsolute(_outputMap.begin()->second, refBlob, ERROR_BOUND); } -TEST_P(myriadLayersTestsAvg_nightly, AvgPooling) +TEST_P(myriadLayersTestsAvg_smoke, AvgPooling) { ASSERT_TRUE(generateNetAndInfer(NetworkInitParams().layoutPreference(_layout_preference))); CompareCommonAbsolute(_outputMap.begin()->second, getReferenceOutput(), ERROR_BOUND); } -TEST_P(myriadLayersTestsAvgOverlappedByKernel_nightly, AvgPooling) +TEST_P(myriadLayersTestsAvgOverlappedByKernel_smoke, AvgPooling) { ASSERT_TRUE(generateNetAndInfer(NetworkInitParams().layoutPreference(_layout_preference))); CompareCommonAbsolute(_outputMap.begin()->second, getReferenceOutput(), ERROR_BOUND); } -TEST_P(myriadLayersTestsAvgPad4_nightly, AvgPoolingPad4) +TEST_P(myriadLayersTestsAvgPad4_smoke, AvgPoolingPad4) { ASSERT_TRUE(generateNetAndInfer(NetworkInitParams().layoutPreference(_layout_preference))); auto refBlob = getReferenceOutput(); CompareCommonAbsolute(_outputMap.begin()->second, refBlob, ERROR_BOUND); } -TEST_P(myriadLayersTestsGlobalMax_nightly, GlobalMaxPooling) +TEST_P(myriadLayersTestsGlobalMax_smoke, GlobalMaxPooling) { ASSERT_TRUE(generateNetAndInfer(NetworkInitParams())); auto refBlob = getReferenceOutput(); CompareCommonAbsolute(_outputMap.begin()->second, refBlob, ERROR_BOUND); } -TEST_P(myriadLayersTestsGlobalAvg_nightly, GlobalAvgPooling) +TEST_P(myriadLayersTestsGlobalAvg_smoke, GlobalAvgPooling) { if(_pad_val.x != 0 || _pad_val.y != 0) { GTEST_SKIP() << "paddings should not be exist for GlobalAvgPool"; diff --git a/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_power_test.cpp b/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_power_test.cpp index 5ed5eb65dbe..69142a11c05 100644 --- a/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_power_test.cpp +++ b/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_power_test.cpp @@ -3,7 +3,7 @@ // #include "myriad_layers_power_test.hpp" -INSTANTIATE_TEST_CASE_P( accuracy, myriadLayersTestsPowerParams_nightly, +INSTANTIATE_TEST_CASE_P( accuracy, myriadLayersTestsPowerParams_smoke, ::testing::Combine( ::testing::ValuesIn(s_powerTensors), ::testing::ValuesIn(s_powerParams)) diff --git a/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_power_test.hpp b/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_power_test.hpp index ebe4eb90961..c2086c75727 100644 --- a/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_power_test.hpp +++ b/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_power_test.hpp @@ -39,9 +39,9 @@ static void gen_ref_power(const InferenceEngine::Blob::Ptr src, } } -typedef myriadLayerTestBaseWithParam> myriadLayersTestsPowerParams_nightly; +typedef myriadLayerTestBaseWithParam> myriadLayersTestsPowerParams_smoke; -TEST_P(myriadLayersTestsPowerParams_nightly, TestsPower) { +TEST_P(myriadLayersTestsPowerParams_smoke, TestsPower) { _config[VPU_CONFIG_KEY(DETECT_NETWORK_BATCH)] = CONFIG_VALUE(NO); auto param = GetParam(); SizeVector tensor = std::get<0>(param); diff --git a/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_prelu_test.cpp b/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_prelu_test.cpp index 3f952ce1aea..f15f0f2eb47 100644 --- a/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_prelu_test.cpp +++ b/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_prelu_test.cpp @@ -4,7 +4,7 @@ #include "myriad_layers_prelu_test.hpp" -INSTANTIATE_TEST_CASE_P(accuracy_PReLU, myriadLayerPReLU_nightly, +INSTANTIATE_TEST_CASE_P(accuracy_PReLU, myriadLayerPReLU_smoke, ::testing::Combine( ::testing::ValuesIn(s_PReLUTensors) , ::testing::Values(0, 1) @@ -12,7 +12,7 @@ INSTANTIATE_TEST_CASE_P(accuracy_PReLU, myriadLayerPReLU_nightly, ); INSTANTIATE_TEST_CASE_P( - accuracy, myriadLayerFullyConnectedWithPReLU_nightly, + accuracy, myriadLayerFullyConnectedWithPReLU_smoke, ::testing::Combine( ::testing::ValuesIn(g_fcTestParamsSubset), ::testing::Values(g_dimensionsFC[0]), @@ -21,7 +21,7 @@ INSTANTIATE_TEST_CASE_P( ) ); -INSTANTIATE_TEST_CASE_P(accuracy, myriadLayersTestsMaxPoolingWithPReLU_nightly, +INSTANTIATE_TEST_CASE_P(accuracy, myriadLayersTestsMaxPoolingWithPReLU_smoke, ::testing::Combine( ::testing::ValuesIn(g_poolingInput), ::testing::ValuesIn(g_poolingLayerParamsLite), @@ -29,7 +29,7 @@ INSTANTIATE_TEST_CASE_P(accuracy, myriadLayersTestsMaxPoolingWithPReLU_nightly, ::testing::ValuesIn(s_PReluLayerParams)) ); -INSTANTIATE_TEST_CASE_P(accuracy, myriadLayersTestsAvgPoolingWithPReLU_nightly, +INSTANTIATE_TEST_CASE_P(accuracy, myriadLayersTestsAvgPoolingWithPReLU_smoke, ::testing::Combine( ::testing::ValuesIn(g_poolingInput), ::testing::ValuesIn(g_poolingLayerParamsLite), @@ -37,7 +37,7 @@ INSTANTIATE_TEST_CASE_P(accuracy, myriadLayersTestsAvgPoolingWithPReLU_nightly, ::testing::ValuesIn(s_PReluLayerParams)) ); -INSTANTIATE_TEST_CASE_P(accuracy_postop, myriadLayersTestsMaxPoolingWithPReLU_nightly, +INSTANTIATE_TEST_CASE_P(accuracy_postop, myriadLayersTestsMaxPoolingWithPReLU_smoke, ::testing::Combine( ::testing::ValuesIn(g_poolingInput_postOp), ::testing::Values(MAKE_STRUCT(pooling_layer_params, {3, 3}, {1, 1}, {1, 1})), @@ -45,7 +45,7 @@ INSTANTIATE_TEST_CASE_P(accuracy_postop, myriadLayersTestsMaxPoolingWithPReLU_ni ::testing::Values(MAKE_STRUCT(PReLULayerDef, {{{PRELU_PARAM, "0"}}}))) ); -INSTANTIATE_TEST_CASE_P(accuracy_postop, myriadLayersTestsAvgPoolingWithPReLU_nightly, +INSTANTIATE_TEST_CASE_P(accuracy_postop, myriadLayersTestsAvgPoolingWithPReLU_smoke, ::testing::Combine( ::testing::ValuesIn(g_poolingInput_postOp), ::testing::Values(MAKE_STRUCT(pooling_layer_params, {3, 3}, {1, 1}, {1, 1})), @@ -53,7 +53,7 @@ INSTANTIATE_TEST_CASE_P(accuracy_postop, myriadLayersTestsAvgPoolingWithPReLU_ni ::testing::Values(MAKE_STRUCT(PReLULayerDef, {{{PRELU_PARAM, "0"}}}))) ); -INSTANTIATE_TEST_CASE_P(accuracy, myriadLayerConvolutionWithPReLU_nightly, +INSTANTIATE_TEST_CASE_P(accuracy, myriadLayerConvolutionWithPReLU_smoke, ::testing::Combine( ::testing::ValuesIn(g_convolutionTensors) , ::testing::Values(MAKE_STRUCT(param_size, 3, 3)) @@ -65,7 +65,7 @@ INSTANTIATE_TEST_CASE_P(accuracy, myriadLayerConvolutionWithPReLU_nightly, ) ); -INSTANTIATE_TEST_CASE_P(accuracy_postop, myriadLayerConvolutionWithPReLU_nightly, +INSTANTIATE_TEST_CASE_P(accuracy_postop, myriadLayerConvolutionWithPReLU_smoke, ::testing::Combine( ::testing::ValuesIn(g_poolingInput_postOp) , ::testing::Values(MAKE_STRUCT(param_size, 3, 3)) diff --git a/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_prelu_test.hpp b/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_prelu_test.hpp index ca1a14e16b1..78394dd209b 100644 --- a/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_prelu_test.hpp +++ b/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_prelu_test.hpp @@ -12,9 +12,9 @@ using std::get; using namespace InferenceEngine; PRETTY_PARAM(ChannelSharedPrelu, int); -typedef myriadLayerTestBaseWithParam> myriadLayerPReLU_nightly; +typedef myriadLayerTestBaseWithParam> myriadLayerPReLU_smoke; -TEST_P(myriadLayerPReLU_nightly, PReLU) { +TEST_P(myriadLayerPReLU_smoke, PReLU) { _config[VPU_CONFIG_KEY(DETECT_NETWORK_BATCH)] = CONFIG_VALUE(NO); SizeVector dims = get<0>(GetParam()); @@ -62,7 +62,7 @@ static std::vector s_PReluLayerParams = { {{{PRELU_PARAM, "1"}}} }; -class myriadLayerFullyConnectedWithPReLU_nightly: public FCTest{ +class myriadLayerFullyConnectedWithPReLU_smoke: public FCTest{ }; #define TEST_BODY \ @@ -89,7 +89,7 @@ class myriadLayerFullyConnectedWithPReLU_nightly: public FCTest{ ref_PReLU_wrap);\ ASSERT_TRUE(generateNetAndInfer(NetworkInitParams())); -TEST_P(myriadLayerFullyConnectedWithPReLU_nightly, TestsFullyConnected) +TEST_P(myriadLayerFullyConnectedWithPReLU_smoke, TestsFullyConnected) { auto p = ::testing::WithParamInterface>::GetParam(); auto extraLayerParams = std::get<3>(p); @@ -99,13 +99,13 @@ TEST_P(myriadLayerFullyConnectedWithPReLU_nightly, TestsFullyConnected) #define ERROR_BOUND_WITH_RELU (4.e-3f) -class myriadLayersTestsMaxPoolingWithPReLU_nightly: public PoolingTest{ +class myriadLayersTestsMaxPoolingWithPReLU_smoke: public PoolingTest{ }; -class myriadLayersTestsAvgPoolingWithPReLU_nightly: public PoolingTest{ +class myriadLayersTestsAvgPoolingWithPReLU_smoke: public PoolingTest{ }; -TEST_P(myriadLayersTestsMaxPoolingWithPReLU_nightly, TestsMaxPoolingWithPReLU) +TEST_P(myriadLayersTestsMaxPoolingWithPReLU_smoke, TestsMaxPoolingWithPReLU) { auto p = ::testing::WithParamInterface>::GetParam(); auto extraLayerParams = std::get<3>(p); @@ -113,7 +113,7 @@ TEST_P(myriadLayersTestsMaxPoolingWithPReLU_nightly, TestsMaxPoolingWithPReLU) CompareCommonAbsolute(_outputMap.begin()->second, getReferenceOutput(), ERROR_BOUND_WITH_RELU); } -TEST_P(myriadLayersTestsAvgPoolingWithPReLU_nightly, TestsAvgPoolingWithPReLU) +TEST_P(myriadLayersTestsAvgPoolingWithPReLU_smoke, TestsAvgPoolingWithPReLU) { auto p = ::testing::WithParamInterface>::GetParam(); auto extraLayerParams = std::get<3>(p); @@ -121,10 +121,10 @@ TEST_P(myriadLayersTestsAvgPoolingWithPReLU_nightly, TestsAvgPoolingWithPReLU) CompareCommonAbsolute(_outputMap.begin()->second, getReferenceOutput(), ERROR_BOUND_WITH_RELU); } -class myriadLayerConvolutionWithPReLU_nightly: public ConvolutionTest{ +class myriadLayerConvolutionWithPReLU_smoke: public ConvolutionTest{ }; -TEST_P(myriadLayerConvolutionWithPReLU_nightly, Convolution) { +TEST_P(myriadLayerConvolutionWithPReLU_smoke, Convolution) { auto p = ::testing::WithParamInterface>::GetParam(); auto extraLayerParams = std::get<6>(p); TEST_BODY; diff --git a/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_prior_box_test.cpp b/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_prior_box_test.cpp index 34aad160a92..c0334fc710f 100644 --- a/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_prior_box_test.cpp +++ b/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_prior_box_test.cpp @@ -267,7 +267,7 @@ void refPriorBox(Blob::Ptr dst, const PriorBoxParams &p) { } } -class myriadLayersPriorBoxTests_nightly : public myriadLayersTests_nightly { +class myriadLayersPriorBoxTests_smoke : public myriadLayersTests_nightly { public: Blob::Ptr getFp16Blob(const Blob::Ptr& in) { if (in->getTensorDesc().getPrecision() == Precision::FP16) @@ -342,7 +342,7 @@ public: } }; -TEST_F(myriadLayersPriorBoxTests_nightly, NotLastLayer) +TEST_F(myriadLayersPriorBoxTests_smoke, NotLastLayer) { std::string model = R"V0G0N( @@ -476,7 +476,7 @@ TEST_F(myriadLayersPriorBoxTests_nightly, NotLastLayer) RunOnModel(model, "priorbox_copy"); } -TEST_F(myriadLayersPriorBoxTests_nightly, LastLayer_FP16) +TEST_F(myriadLayersPriorBoxTests_smoke, LastLayer_FP16) { std::string model = R"V0G0N( @@ -592,7 +592,7 @@ TEST_F(myriadLayersPriorBoxTests_nightly, LastLayer_FP16) RunOnModel(model, "priorbox", Precision::FP16); } -TEST_F(myriadLayersPriorBoxTests_nightly, LastLayer_FP32) +TEST_F(myriadLayersPriorBoxTests_smoke, LastLayer_FP32) { std::string model = R"V0G0N( @@ -1532,7 +1532,7 @@ TEST_F(myriadLayersTests_nightly, PriorBox_WithConcat) CompareCommonAbsolute(_refBlob, outputBlob, 0.0); } -TEST_F(myriadLayersPriorBoxTests_nightly, FaceBoxLayer) +TEST_F(myriadLayersPriorBoxTests_smoke, FaceBoxLayer) { std::string model = R"V0G0N( @@ -1664,7 +1664,7 @@ TEST_F(myriadLayersPriorBoxTests_nightly, FaceBoxLayer) RunOnModelWithParams(model, "priorbox", params, Precision::FP16); } -TEST_F(myriadLayersPriorBoxTests_nightly, TwoPriorBoxLayersWithUnusedInput) +TEST_F(myriadLayersPriorBoxTests_smoke, TwoPriorBoxLayersWithUnusedInput) { std::string model = R"V0G0N( diff --git a/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_proposal_test.cpp b/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_proposal_test.cpp index e70318b5a64..9844cee0c95 100644 --- a/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_proposal_test.cpp +++ b/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_proposal_test.cpp @@ -13,7 +13,7 @@ using namespace InferenceEngine; #define OUTPUT_SAMPLING_NUM (20) // Validate only top 20 rois #define OUTPUT_ROI_MATCH_THRESHOLD (18) // At least 18 rois should be matched -class myriadLayersTestsProposal_nightly : public myriadLayersTests_nightly { +class myriadLayersTestsProposal_smoke : public myriadLayersTests_nightly { protected: std::string model; @@ -277,7 +277,7 @@ std::string caffeModel() { )V0G0N"; } -TEST_F(myriadLayersTestsProposal_nightly, Caffe) { +TEST_F(myriadLayersTestsProposal_smoke, Caffe) { // Verify only 20 ranked proposal output with GT values std::vector gt_values = { @@ -313,7 +313,7 @@ TEST_F(myriadLayersTestsProposal_nightly, Caffe) { ASSERT_NO_FATAL_FAILURE(compareOutputSampleToRef(gt_values, 0.26f)); } -TEST_F(myriadLayersTestsProposal_nightly, CaffeNoClipBeforeNms) { +TEST_F(myriadLayersTestsProposal_smoke, CaffeNoClipBeforeNms) { // Verify only 20 ranked proposal output with GT values - reference get from MKLDNN plugin std::vector gt_values = { @@ -352,7 +352,7 @@ TEST_F(myriadLayersTestsProposal_nightly, CaffeNoClipBeforeNms) { ASSERT_NO_FATAL_FAILURE(compareOutputSampleToRef(gt_values, 0.26f)); } -TEST_F(myriadLayersTestsProposal_nightly, CaffeClipAfterNms) { +TEST_F(myriadLayersTestsProposal_smoke, CaffeClipAfterNms) { // Verify only 20 ranked proposal output with GT values std::vector gt_values = { @@ -394,7 +394,7 @@ TEST_F(myriadLayersTestsProposal_nightly, CaffeClipAfterNms) { ASSERT_NO_FATAL_FAILURE(compareOutputSampleToRef(gt_values, 0.26f)); } -TEST_F(myriadLayersTestsProposal_nightly, CaffeNormalizedOutput) { +TEST_F(myriadLayersTestsProposal_smoke, CaffeNormalizedOutput) { // Verify only 20 ranked proposal output with GT values std::vector gt_values = { @@ -436,7 +436,7 @@ TEST_F(myriadLayersTestsProposal_nightly, CaffeNormalizedOutput) { ASSERT_NO_FATAL_FAILURE(compareOutputSampleToRef(gt_values, 0.026f)); } -TEST_F(myriadLayersTestsProposal_nightly, TensorFlow) { +TEST_F(myriadLayersTestsProposal_smoke, TensorFlow) { model = R"V0G0N( diff --git a/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_psroipooling_test.cpp b/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_psroipooling_test.cpp index ae8f1015496..535cdf1284e 100644 --- a/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_psroipooling_test.cpp +++ b/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_psroipooling_test.cpp @@ -4,7 +4,7 @@ #include "myriad_layers_psroipooling_test.hpp" -INSTANTIATE_TEST_CASE_P(accuracy, myriadLayersTestsPSROIPooling_nightly, +INSTANTIATE_TEST_CASE_P(accuracy, myriadLayersTestsPSROIPooling_smoke, ::testing::Combine( ::testing::ValuesIn(s_PSROIPoolingLayerInput), ::testing::ValuesIn(s_PSROIPoolingLayerParam), diff --git a/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_psroipooling_test.hpp b/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_psroipooling_test.hpp index abc95848110..66195e6bb30 100644 --- a/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_psroipooling_test.hpp +++ b/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_psroipooling_test.hpp @@ -27,7 +27,7 @@ static inline void PrintTo(const PSROIPoolingParams& param, ::std::ostream* os) using PSROIPoolingTestParams = std::tuple; -class myriadLayersTestsPSROIPooling_nightly: public myriadLayerTestBaseWithParam { +class myriadLayersTestsPSROIPooling_smoke: public myriadLayerTestBaseWithParam { public: void genROIs(InferenceEngine::Blob::Ptr rois, const PSROIPoolingParams& params, @@ -200,7 +200,7 @@ static std::vector s_PSROIPoolingNumROIs = { 1, 10, 30, 50, 100, 300 }; -TEST_P(myriadLayersTestsPSROIPooling_nightly, PSROIPooling) { +TEST_P(myriadLayersTestsPSROIPooling_smoke, PSROIPooling) { #if defined(_WIN32) || defined(WIN32) SKIP() << "Disabled for Windows. CVS-13239"; #endif diff --git a/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_reduce_test.cpp b/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_reduce_test.cpp index f9620a34120..525691f3a39 100644 --- a/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_reduce_test.cpp +++ b/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_reduce_test.cpp @@ -4,42 +4,42 @@ #include "myriad_layers_reduce_test.hpp" -INSTANTIATE_TEST_CASE_P(accuracy, myriadTestsReduceAnd_nightly, +INSTANTIATE_TEST_CASE_P(accuracy, myriadTestsReduceAnd_smoke, ::testing::Combine( - ::testing::ValuesIn(s_input_dims), + ::testing::ValuesIn(s_input_pair), ::testing::ValuesIn(s_axes_list), ::testing::ValuesIn(s_data_precision), ::testing::ValuesIn(s_keep_dims)) ); -INSTANTIATE_TEST_CASE_P(accuracy, myriadTestsReduceMin_nightly, +INSTANTIATE_TEST_CASE_P(accuracy, myriadTestsReduceMin_smoke, ::testing::Combine( - ::testing::ValuesIn(s_input_dims), + ::testing::ValuesIn(s_input_pair), ::testing::ValuesIn(s_axes_list), ::testing::ValuesIn(s_data_precision), ::testing::ValuesIn(s_keep_dims)) ); -INSTANTIATE_TEST_CASE_P(accuracy, myriadTestsReduceMax_nightly, +INSTANTIATE_TEST_CASE_P(accuracy, myriadTestsReduceMax_smoke, ::testing::Combine( - ::testing::ValuesIn(s_input_dims), + ::testing::ValuesIn(s_input_pair), ::testing::ValuesIn(s_axes_list), ::testing::ValuesIn(s_data_precision), ::testing::ValuesIn(s_keep_dims)) ); -INSTANTIATE_TEST_CASE_P(accuracy, myriadTestsReduceSum_nightly, +INSTANTIATE_TEST_CASE_P(accuracy, myriadTestsReduceSum_smoke, ::testing::Combine( - ::testing::ValuesIn(s_input_dims), + ::testing::ValuesIn(s_input_pair), ::testing::ValuesIn(s_axes_list), ::testing::ValuesIn(s_data_precision), ::testing::ValuesIn(s_keep_dims)) ); -INSTANTIATE_TEST_CASE_P(accuracy, myriadTestsReduceMean_nightly, +INSTANTIATE_TEST_CASE_P(accuracy, myriadTestsReduceMean_smoke, ::testing::Combine( - ::testing::ValuesIn(s_input_dims), + ::testing::ValuesIn(s_input_pair), ::testing::ValuesIn(s_axes_list), ::testing::ValuesIn(s_data_precision), ::testing::ValuesIn(s_keep_dims)) -); +); \ No newline at end of file diff --git a/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_reduce_test.hpp b/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_reduce_test.hpp index aa49a09cca0..4de534921b6 100644 --- a/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_reduce_test.hpp +++ b/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_reduce_test.hpp @@ -245,7 +245,7 @@ static const std::map> refMapI32 = {REDUCE_MEAN, {&refReduceMeanI32, 0.0f, RefReduceMean::generateData}}, }; -using ReduceTestParams = std::tuple; +using ReduceTestParams = std::tuple, SizeVector, Precision, bool>; static const Precision axesPrecision = Precision::I32; @@ -349,24 +349,13 @@ public: for (int i : list) { if (i < 0) // handle negative indices - i = ndims - i; + i = ndims - std::abs(i); EXPECT_TRUE((i >= 0) && (i < ndims)); mask |= (1 << i); } return mask; } - static Layout defaultLayout(int ndims) - { - switch (ndims) - { - case 5: return NCDHW; - case 4: return NCHW; - case 3: return CHW; - case 2: return NC; - case 1: return C; - } - return ANY; - } + static void getAxesBlob(const SizeVector& axesList, TBlob::Ptr& weightsBlob, TBlob::Ptr& axesBlob) { size_t axes_size = axesList.size(); @@ -400,11 +389,14 @@ protected: _config[VPU_CONFIG_KEY(DETECT_NETWORK_BATCH)] = CONFIG_VALUE(NO); const auto params = GetParam(); - const auto inputDims = std::get<0>(params); - const auto axesList = std::get<1>(params); + const auto inputPair = std::get<0>(params); + auto axesList = std::get<1>(params); const auto dataPrecision = std::get<2>(params); const int keepDims = std::get<3>(params) ? 1 : 0; + const auto inputDims = inputPair.first; + const auto layoutPreference = inputPair.second; + const auto outputDims = ReduceUtils::calcOutputDims(inputDims, axesList, keepDims); const auto model = ReduceUtils::getModel(inputDims, axesList, outputDims, ReduceType, dataPrecision, keepDims); @@ -412,19 +404,18 @@ protected: TBlob::Ptr axesBlob; ReduceUtils::getAxesBlob(axesList, weightsBlob, axesBlob); ASSERT_NE(weightsBlob, nullptr); - + ASSERT_NO_THROW(readNetwork(model, weightsBlob)); const auto& network = _cnnNetwork; _inputsInfo = network.getInputsInfo(); _inputsInfo["reduce_input"]->setPrecision(dataPrecision); - _inputsInfo["reduce_input"]->setLayout(ReduceUtils::defaultLayout(inputDims.size())); + _inputsInfo["reduce_input"]->setLayout(vpu::deviceLayout(TensorDesc::getLayoutByDims(inputDims), layoutPreference)); _outputsInfo = network.getOutputsInfo(); _outputsInfo["reduce"]->setPrecision(dataPrecision); - _outputsInfo["reduce"]->setLayout(ReduceUtils::defaultLayout(outputDims.size())); - + _outputsInfo["reduce"]->setLayout(vpu::deviceLayout(TensorDesc::getLayoutByDims(outputDims), layoutPreference)); StatusCode st = OK; ASSERT_NO_THROW(st = _vpuPluginPtr->LoadNetwork(_exeNetwork, network, _config, &_resp)); @@ -457,87 +448,95 @@ protected: refBlob = make_shared_blob(outputBlob->getTensorDesc()); refBlob->allocate(); - ref_reduce(inputBlob, axesBlob, refBlob, keepDims, reduceOp); + ref_reduce(inputBlob, axesBlob, refBlob, keepDims, layoutPreference, reduceOp); CompareCommonAbsolute(outputBlob, refBlob, compareThreshold); - } else if (dataPrecision == Precision::I32) { - auto opIt = refMapI32.find(ReduceType); - ASSERT_TRUE(opIt != refMapI32.end()); - auto reduceOp = opIt->second.op; - auto generateData = opIt->second.generateData; - generateData(inputBlob); + } else if (dataPrecision == Precision::I32) { + auto opIt = refMapI32.find(ReduceType); + ASSERT_TRUE(opIt != refMapI32.end()); + auto reduceOp = opIt->second.op; + auto generateData = opIt->second.generateData; + generateData(inputBlob); - ASSERT_NO_THROW(st = _inferRequest->Infer(&_resp)); - ASSERT_EQ(StatusCode::OK, st) << _resp.msg; + ASSERT_NO_THROW(st = _inferRequest->Infer(&_resp)); + ASSERT_EQ(StatusCode::OK, st) << _resp.msg; - refBlob = make_shared_blob(outputBlob->getTensorDesc()); - refBlob->allocate(); - ref_reduce(inputBlob, axesBlob, refBlob, keepDims, reduceOp); - CompareCommonExact(outputBlob, refBlob); - } + refBlob = make_shared_blob(outputBlob->getTensorDesc()); + refBlob->allocate(); + ref_reduce(inputBlob, axesBlob, refBlob, keepDims, layoutPreference, reduceOp); + CompareCommonExact(outputBlob, refBlob); + } } }; -class myriadTestsReduceAnd_nightly: public ReduceTest +class myriadTestsReduceAnd_smoke: public ReduceTest { }; -class myriadTestsReduceMin_nightly: public ReduceTest +class myriadTestsReduceMin_smoke: public ReduceTest { }; -class myriadTestsReduceMax_nightly: public ReduceTest +class myriadTestsReduceMax_smoke: public ReduceTest { }; -class myriadTestsReduceSum_nightly: public ReduceTest +class myriadTestsReduceSum_smoke: public ReduceTest { }; -class myriadTestsReduceMean_nightly: public ReduceTest +class myriadTestsReduceMean_smoke: public ReduceTest { }; // Tests are disabled due to hang: #-28315 -TEST_P(myriadTestsReduceAnd_nightly, And) +TEST_P(myriadTestsReduceAnd_smoke, And) { testReduce(); } -TEST_P(myriadTestsReduceMin_nightly, Min) +TEST_P(myriadTestsReduceMin_smoke, Min) { testReduce(); } -TEST_P(myriadTestsReduceMax_nightly, Max) +TEST_P(myriadTestsReduceMax_smoke, Max) { testReduce(); } -TEST_P(myriadTestsReduceSum_nightly, Sum) +TEST_P(myriadTestsReduceSum_smoke, Sum) { testReduce(); } -TEST_P(myriadTestsReduceMean_nightly, Mean) +TEST_P(myriadTestsReduceMean_smoke, Mean) { testReduce(); } -static const std::vector s_input_dims = +static const std::vector> s_input_pair = { - {1, 3, 2, 14, 32}, - {2, 2, 2, 14, 32}, - {3, 5, 4, 8, 16}, - {4, 2, 16, 16, 8}, + {{1, 3, 2, 14, 32}, vpu::LayoutPreference::ChannelMinor}, + {{1, 3, 2, 14, 32}, vpu::LayoutPreference::ChannelMajor}, + {{2, 2, 2, 14, 32}, vpu::LayoutPreference::ChannelMinor}, + {{2, 2, 2, 14, 32}, vpu::LayoutPreference::ChannelMajor}, + {{3, 5, 4, 8, 16}, vpu::LayoutPreference::ChannelMinor}, + {{3, 5, 4, 8, 16}, vpu::LayoutPreference::ChannelMajor}, + {{4, 2, 16, 16, 8}, vpu::LayoutPreference::ChannelMinor}, + {{4, 2, 16, 16, 8}, vpu::LayoutPreference::ChannelMajor}, - {3, 2, 14, 32}, - {2, 2, 14, 32}, - {5, 4, 8, 16}, - {2, 16, 16, 8}, + {{3, 2, 14, 32}, vpu::LayoutPreference::ChannelMinor}, + {{3, 2, 14, 32}, vpu::LayoutPreference::ChannelMajor}, + {{2, 2, 14, 32}, vpu::LayoutPreference::ChannelMinor}, + {{2, 2, 14, 32}, vpu::LayoutPreference::ChannelMajor}, + {{5, 4, 8, 16}, vpu::LayoutPreference::ChannelMinor}, + {{5, 4, 8, 16}, vpu::LayoutPreference::ChannelMajor}, + {{2, 16, 16, 8}, vpu::LayoutPreference::ChannelMinor}, + {{2, 16, 16, 8}, vpu::LayoutPreference::ChannelMajor}, - {3, 2, 14}, - {2, 2, 14}, - {5, 4, 8}, - {2, 16, 16}, + {{3, 2, 14}, vpu::LayoutPreference::ChannelMajor}, + {{2, 2, 14}, vpu::LayoutPreference::ChannelMajor}, + {{5, 4, 8}, vpu::LayoutPreference::ChannelMajor}, + {{2, 16, 16}, vpu::LayoutPreference::ChannelMajor}, - { 7, 3, 5, 1, 7, 11, 12}, + {{7, 3, 5, 1, 7, 11, 12}, vpu::LayoutPreference::ChannelMajor}, }; static const std::vector s_axes_list = diff --git a/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_region_test.cpp b/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_region_test.cpp index cad6b54d219..50eb4eb5541 100644 --- a/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_region_test.cpp +++ b/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_region_test.cpp @@ -5,32 +5,14 @@ #include "myriad_layers_region_test.hpp" INSTANTIATE_TEST_CASE_P( - accuracy, myriadLayerRegionYolo_nightly, - ::testing::ValuesIn(s_regionData) -); - -INSTANTIATE_TEST_CASE_P(accuracy, myriadLayersTestsRegion_CHW_HW_nightly, - ::testing::Combine( - ::testing::Values({1, 125, 13, 13}) - , ::testing::Values(MAKE_STRUCT(param_size, 1, 1)) - , ::testing::Values(MAKE_STRUCT(param_size, 1, 1)) - , ::testing::Values(MAKE_STRUCT(param_size, 0, 0)) - , ::testing::Values(125) - , ::testing::Values(1) - ) -); - -INSTANTIATE_TEST_CASE_P(accuracy, myriadLayersTestsRegion_CHW_HW_80cl_nightly, - ::testing::Combine( - ::testing::Values({1, 425, 13, 13}) - , ::testing::Values(MAKE_STRUCT(param_size, 1, 1)) - , ::testing::Values(MAKE_STRUCT(param_size, 1, 1)) - , ::testing::Values(MAKE_STRUCT(param_size, 0, 0)) - , ::testing::Values(425) - , ::testing::Values(1) - ) -); - -INSTANTIATE_TEST_CASE_P(accuracy, myriadLayerRegionYolo_CHW_nightly, - ::testing::ValuesIn(s_classes) -); + accuracy, myriadLayersTestsRegionYolo_smoke, + ::testing::Combine( + ::testing::Values(4), + ::testing::Values(20, 80), + ::testing::Values(5, 10), + ::testing::Values(3), + ::testing::Values(1, 0), + ::testing::Values(vpu::LayoutPreference::ChannelMajor, vpu::LayoutPreference::ChannelMinor), + ::testing::Values(IRVersion::v7, IRVersion::v10), + ::testing::ValuesIn(s_CustomConfig) +)); diff --git a/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_region_test.hpp b/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_region_test.hpp index 768aba55c62..71090b00ea6 100644 --- a/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_region_test.hpp +++ b/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_region_test.hpp @@ -4,327 +4,82 @@ #include #include "myriad_layers_tests.hpp" -#include +#include using namespace InferenceEngine; -struct region_test_params { - tensor_test_params in; - int coords; - int classes; - int num; - int maskSize; - int doSoftMax; - std::string customLayers; - friend std::ostream& operator<<(std::ostream& os, region_test_params const& tst) - { - return os << "tensor (" << tst.in - << "),coords=" << tst.coords - << ", classes=" << tst.classes - << ", num=" << tst.num - << ", maskSize=" << tst.maskSize - << ", doSoftMax=" << tst.doSoftMax - << ", by using custom layer=" << (tst.customLayers.empty() ? "no" : "yes"); - }; -}; +#define ERROR_BOUND 0.0005f -class myriadLayerRegionYolo_nightly: public myriadLayersTests_nightly, - public testing::WithParamInterface { -}; +PRETTY_PARAM(Coords, int) +PRETTY_PARAM(Classes, int) +PRETTY_PARAM(Num, int) +PRETTY_PARAM(MaskSize, int) +PRETTY_PARAM(DoSoftmax, int) +PRETTY_PARAM(CustomConfig, std::string) -TEST_P(myriadLayerRegionYolo_nightly, BaseTestsRegion) { - region_test_params p = ::testing::WithParamInterface::GetParam(); +typedef myriadLayerTestBaseWithParam> myriadLayersTestsRegionYolo_smoke; - // TODO: M2 mode is not working for OpenCL compiler - if(!p.customLayers.empty() && !CheckMyriadX()) { - GTEST_SKIP()<<"Custom layers for MYRIAD2 not supported"; +TEST_P(myriadLayersTestsRegionYolo_smoke, RegionYolo) { + const int coords = std::get<0>(GetParam()); + const int classes = std::get<1>(GetParam()); + const int num = std::get<2>(GetParam()); + const int maskSize = std::get<3>(GetParam()); + const int doSoftmax = std::get<4>(GetParam()); + const auto layoutPreference = std::get<5>(GetParam()); + _irVersion = std::get<6>(GetParam()); + const std::string customConfig = std::get<7>(GetParam()); + + if (!customConfig.empty() && !CheckMyriadX()) { + GTEST_SKIP() << "Custom layers for MYRIAD2 not supported"; } + _config[VPU_CONFIG_KEY(CUSTOM_LAYERS)] = customConfig; + + const auto mask = [&] { + std::string mask; + for (int i = 0; i < maskSize; i++) { + mask += std::to_string(i) + ','; + } + if (!mask.empty()) mask.pop_back(); + return mask; + }(); + std::map params; + params["coords"] = std::to_string(coords); + params["classes"] = std::to_string(classes); + params["num"] = std::to_string(num); + params["mask"] = mask; + params["do_softmax"] = std::to_string(doSoftmax); + params["axis"] = "0"; + params["end_axis"] = "0"; - params["coords"] = std::to_string(p.coords); - params["classes"] = std::to_string(p.classes); - params["num"] = std::to_string(p.num); - params["mask"] = "0,1,2"; - params["do_softmax"] = std::to_string(p.doSoftMax); + const auto dims = [&] { + const auto regions = doSoftmax ? num : maskSize; + const uint32_t channels = (coords + classes + 1) * regions; + IE_ASSERT(channels > 0); + return tensor_test_params{1, channels, 13, 13}; + }(); - InferenceEngine::SizeVector tensor; - tensor.resize(4); - tensor[3] = p.in.w; - tensor[2] = p.in.h; - tensor[1] = p.in.c; - tensor[0] = 1; - _config[VPU_CONFIG_KEY(CUSTOM_LAYERS)] = p.customLayers; - _testNet.addLayer(LayerInitParams("RegionYolo") - .params(params) - .in({tensor}) - .out({tensor}), - ref_RegionYolo_wrap); - ASSERT_TRUE(generateNetAndInfer(NetworkInitParams().layoutPreference(vpu::LayoutPreference::ChannelMinor))); - CompareCommonAbsolute(_outputMap.begin()->second, getReferenceOutput(), 0.0025); + SetInputTensor(dims); + SetOutputTensor(dims); + + ASSERT_NO_FATAL_FAILURE(makeSingleLayerNetwork(LayerInitParams("RegionYolo").params(params), + NetworkInitParams() + .layoutPreference(layoutPreference) + .lockLayout(true))); + + ASSERT_TRUE(Infer()); + + ASSERT_NO_FATAL_FAILURE(ref_RegionYolo(_inputMap.begin()->second, _refBlob, + coords, classes, num, maskSize, doSoftmax)); + + CompareCommonAbsolute(_outputMap.begin()->second, _refBlob, ERROR_BOUND); } -static std::vector s_regionData = { - region_test_params{{1, (4+20+1)*5, 13, 13}, 4, 20, 5, 3, 1, ""}, - region_test_params{{1, (4+80+1)*5, 13, 13}, 4, 80, 5, 3, 1, ""}, - region_test_params{{1, (4+20+1)*3, 13, 13}, 4, 20, 9, 3, 0, ""}, - region_test_params{{1, (4+80+1)*3, 13, 13}, 4, 80, 9, 3, 0, ""}, - +std::vector s_CustomConfig = { + {""}, #ifdef VPU_HAS_CUSTOM_KERNELS - region_test_params{{1, (4+20+1)*5, 13, 13}, 4, 20, 5, 3, 1, getIELibraryPath() + "/vpu_custom_kernels/customLayerBindings.xml"}, - region_test_params{{1, (4+80+1)*5, 13, 13}, 4, 80, 5, 3, 1, getIELibraryPath() + "/vpu_custom_kernels/customLayerBindings.xml"}, - region_test_params{{1, (4+20+1)*3, 13, 13}, 4, 20, 9, 3, 0, getIELibraryPath() + "/vpu_custom_kernels/customLayerBindings.xml"}, - region_test_params{{1, (4+80+1)*3, 13, 13}, 4, 80, 9, 3, 0, getIELibraryPath() + "/vpu_custom_kernels/customLayerBindings.xml"}, + getIELibraryPath() + "/vpu_custom_kernels/customLayerBindings.xml" #endif -}; - -/* HW network needs to be created to test strides influence to RegionYolo input */ -/* so convolution layer added as the first layer to this test */ -class myriadLayersTestsRegion_CHW_HW_nightly: public ConvolutionTest<>{ -}; - -/*80 input classes */ -class myriadLayersTestsRegion_CHW_HW_80cl_nightly: public ConvolutionTest<>{ -}; - -/* to passthrough "original" data */ -template -void constWeightsRange(uint16_t* ptr, size_t weightsSize) { - ASSERT_NE(ptr, nullptr); - ASSERT_EQ(weightsSize, width * width); - std::memset(ptr, 0, sizeof(uint16_t) * (weightsSize)); - for (int i = 0; i < weightsSize/width; ++i) { - ptr[i * width + i] = PrecisionUtils::f32tof16(1.0f); - } -} - -void constBiasesRange(uint16_t* ptr, size_t weightsSize) { - std::memset(ptr, 0, sizeof(uint16_t) * (weightsSize)); -} - -void loadData(InferenceEngine::Blob::Ptr blob) { - /* input blob has predefined size and CHW layout */ - ASSERT_NE(blob, nullptr); - auto inDims = blob->getTensorDesc().getDims(); - InferenceEngine::Blob::Ptr inputBlobRef = - InferenceEngine::make_shared_blob({InferenceEngine::Precision::FP32, inDims, InferenceEngine::NCHW}); - inputBlobRef->allocate(); - const float* ref_values = inputBlobRef->buffer(); - - std::string inputTensorBinary = TestDataHelpers::get_data_path(); - inputTensorBinary += "/vpu/InputYoLoV2Tiny.bin"; - ASSERT_TRUE(fromBinaryFile(inputTensorBinary, inputBlobRef)); - uint16_t *inputBlobRawDataFp16 = static_cast(blob->buffer()); - ASSERT_NE(inputBlobRawDataFp16, nullptr); - - switch(blob->getTensorDesc().getLayout()) { - case InferenceEngine::NCHW: - for (int indx = 0; indx < blob->size(); indx++) { - inputBlobRawDataFp16[indx] = PrecisionUtils::f32tof16(ref_values[indx]); - } - break; - case InferenceEngine::NHWC: - for (int h = 0 ; h < inDims[2]; ++h) { - for (int w = 0 ; w < inDims[3]; ++w) { - for (int c = 0 ; c < inDims[1]; ++c) { - int src_i = w + inDims[3] * h + inDims[3] * inDims[2] * c; - int dst_i = c + inDims[1] * w + inDims[3] * inDims[1] * h; - inputBlobRawDataFp16[dst_i] = PrecisionUtils::f32tof16(ref_values[src_i]); - } - } - } - break; - default: - FAIL() << "unsupported layout: " << blob->getTensorDesc().getLayout(); - } -} - -void loadData_80cl(InferenceEngine::Blob::Ptr blob) { - /* input blob has predefined size and CHW layout */ - ASSERT_NE(blob, nullptr); - auto inDims = blob->getTensorDesc().getDims(); - InferenceEngine::Blob::Ptr inputBlobRef = - InferenceEngine::make_shared_blob({InferenceEngine::Precision::FP32, inDims, InferenceEngine::NCHW}); - inputBlobRef->allocate(); - const float* ref_values = inputBlobRef->buffer(); - - std::string inputTensorBinary = TestDataHelpers::get_data_path(); - inputTensorBinary += "/vpu/InputYoLoV2_80cl.bin"; - ASSERT_TRUE(fromBinaryFile(inputTensorBinary, inputBlobRef)); - uint16_t *inputBlobRawDataFp16 = static_cast(blob->buffer()); - ASSERT_NE(inputBlobRawDataFp16, nullptr); - - switch(blob->getTensorDesc().getLayout()) { - case InferenceEngine::NCHW: - for (int indx = 0; indx < blob->size(); indx++) { - inputBlobRawDataFp16[indx] = PrecisionUtils::f32tof16(ref_values[indx]); - } - break; - case InferenceEngine::NHWC: - for (int h = 0 ; h < inDims[2]; ++h) { - for (int w = 0 ; w < inDims[3]; ++w) { - for (int c = 0 ; c < inDims[1]; ++c) { - int src_i = w + inDims[3] * h + inDims[3] * inDims[2] * c; - int dst_i = c + inDims[1] * w + inDims[3] * inDims[1] * h; - inputBlobRawDataFp16[dst_i] = PrecisionUtils::f32tof16(ref_values[src_i]); - } - } - } - break; - default: - FAIL() << "unsupported layout: " << blob->getTensorDesc().getLayout(); - } -} - -TEST_P(myriadLayersTestsRegion_CHW_HW_nightly, RegionYolo) { - std::map params; - params["coords"] = "4"; - params["classes"] = "20"; - params["num"] = "5"; - params["mask"] = std::string("0,1,2"); - params["do_softmax"] = "1"; - _testNet.addLayer(LayerInitParams("RegionYolo") - .params(params) - .in({_output_tensor}) - .out({{1, _output_tensor[0] * _output_tensor[1] * _output_tensor[2] * _output_tensor[3]}}), - ref_RegionYolo_wrap); - _testNet.setWeightsCallbackForLayer(0, constWeightsRange<125>); - _testNet.setBiasesCallbackForLayer(0, constBiasesRange); - _genDataCallback = loadData; - ASSERT_TRUE(generateNetAndInfer(NetworkInitParams().useHWOpt(true))); - CompareCommonAbsolute(_outputMap.begin()->second, getReferenceOutput(), 0.0035); -} - -TEST_P(myriadLayersTestsRegion_CHW_HW_80cl_nightly, RegionYolol) { - std::map params; - params["coords"] = "4"; - params["classes"] = "80"; - params["num"] = "5"; - params["mask"] = std::string("0,1,2"); - params["do_softmax"] = "1"; - _testNet.addLayer(LayerInitParams("RegionYolo") - .params(params) - .in({_output_tensor}) - .out({{1, _output_tensor[0] * _output_tensor[1] * _output_tensor[2] * _output_tensor[3]}}), - ref_RegionYolo_wrap); - _testNet.setWeightsCallbackForLayer(0, constWeightsRange<425>); - _testNet.setBiasesCallbackForLayer(0, constBiasesRange); - _genDataCallback = loadData_80cl; - ASSERT_TRUE(generateNetAndInfer(NetworkInitParams().useHWOpt(true))); - CompareCommonAbsolute(_outputMap.begin()->second, getReferenceOutput(), 0.0060); -} - -class myriadLayerRegionYolo_CHW_nightly: public myriadLayersTests_nightly, - public testing::WithParamInterface { -}; - -TEST_P(myriadLayerRegionYolo_CHW_nightly, TestsRegion) { - auto classes = GetParam(); - InferenceEngine::SizeVector input_dims = {1, 125, 13, 13}; - if (classes == 80) { - input_dims[1] = 425; - } - IN_OUT_desc input_tensor; - input_tensor.push_back(input_dims); - - std::map params; - params["coords"] = "4"; - params["classes"] = std::to_string(classes); - params["num"] = "5"; - params["mask"] = std::string("0,1,2"); - params["do_softmax"] = "1"; - _testNet.addLayer(LayerInitParams("RegionYolo") - .params(params) - .in(input_tensor) - .out({{1, input_dims[0] * input_dims[1] * input_dims[2] * input_dims[3]}}), - ref_RegionYolo_wrap); - _genDataCallback = loadData; - if (classes == 80) { - _genDataCallback = loadData_80cl; - } - ASSERT_TRUE(generateNetAndInfer(NetworkInitParams())); - /* bound is too high , set for M2 tests */ - CompareCommonAbsolute(_outputMap.begin()->second, getReferenceOutput(), 0.006); -} - -TEST_P(myriadLayerRegionYolo_CHW_nightly, Test_CHW_HWC_Compare) { - auto classes = GetParam(); - IN_OUT_desc input_tensor; - InferenceEngine::SizeVector input_dims = {1, 125, 13, 13}; - if (classes == 80) { - input_dims[1] = 425; - } - - input_tensor.push_back(input_dims); - - std::map params; - params["coords"] = "4"; - params["classes"] = std::to_string(classes); - params["num"] = "5"; - params["mask"] = std::string("0,1,2"); - params["do_softmax"] = "1"; - _testNet.addLayer(LayerInitParams("RegionYolo") - .params(params) - .in(input_tensor) - .out({{1, input_dims[0] * input_dims[1] * input_dims[2] * input_dims[3]}}), - ref_RegionYolo_wrap); - if (classes == 80) { - _genDataCallback = loadData_80cl; - } - _config[VPU_CONFIG_KEY(HW_STAGES_OPTIMIZATION)] = CONFIG_VALUE(NO); - ASSERT_TRUE(generateNetAndInfer(NetworkInitParams().useHWOpt(false).runRefGraph(false))); - /* create NHWC version */ - /* we cannot use the same generateNetAndInfer call due */ - /* to IE bug. */ - InferenceEngine::InputsDataMap inputsInfo; - InferenceEngine::BlobMap outputMap; - InferenceEngine::OutputsDataMap outputsInfo; - InferenceEngine::IExecutableNetwork::Ptr exeNetwork; - InferenceEngine::IInferRequest::Ptr inferRequest; - - _inputsInfo.begin()->second->setLayout(NHWC); - _outputsInfo.begin()->second->setLayout(NC); - - InferenceEngine::StatusCode st = InferenceEngine::StatusCode::GENERAL_ERROR; - ASSERT_NO_THROW(st = _vpuPluginPtr->LoadNetwork(exeNetwork, _cnnNetwork, _config, &_resp)); - ASSERT_NE(exeNetwork, nullptr) << _resp.msg; - ASSERT_NO_THROW(exeNetwork->CreateInferRequest(inferRequest, &_resp)) << _resp.msg; - ASSERT_NE(inferRequest, nullptr) << _resp.msg; - ASSERT_NO_THROW(inputsInfo = _cnnNetwork.getInputsInfo()); - auto inIt = _inputsInfo.begin(); - for (auto in = _inputsInfo.begin(); in != _inputsInfo.end(); in++) { - Blob::Ptr inpt; - ASSERT_NO_THROW(_inferRequest->GetBlob(inIt->first.c_str(), inpt, &_resp)); - ASSERT_NO_THROW(inferRequest->SetBlob(inIt->first.c_str(), inpt, &_resp)); - ++inIt; - } - ASSERT_NO_THROW(outputsInfo = _cnnNetwork.getOutputsInfo()); - auto outIt = _outputsInfo.begin(); - for (auto outputInfo : outputsInfo) { - outputInfo.second->setPrecision(outIt->second->getTensorDesc().getPrecision()); - InferenceEngine::SizeVector outputDims = outputInfo.second->getTensorDesc().getDims(); - Blob::Ptr outputBlob = nullptr; - Layout layout = outIt->second->getTensorDesc().getLayout(); - // work only with NHWC layout if size of the input dimensions == NHWC - switch (outputInfo.second->getPrecision()) { - case Precision::FP16: - outputBlob = InferenceEngine::make_shared_blob({Precision::FP16, outputDims, layout}); - break; - case Precision::FP32: - outputBlob = InferenceEngine::make_shared_blob({Precision::FP32, outputDims, layout}); - break; - default: - THROW_IE_EXCEPTION << "Unsupported precision for output. Supported FP16, FP32"; - } - outputBlob->allocate(); - st = inferRequest->SetBlob(outputInfo.first.c_str(), outputBlob, &_resp); - outputMap[outputInfo.first] = outputBlob; - ASSERT_EQ((int) InferenceEngine::StatusCode::OK, st) << _resp.msg; - ++outIt; - } - ASSERT_EQ(inferRequest->Infer(&_resp), InferenceEngine::OK); - /* bound is too high !!!! investigation TBD */ - CompareCommonAbsolute(_outputMap.begin()->second, outputMap.begin()->second, 0.001); -} - -const std::vector s_classes = {20, 80}; +}; \ No newline at end of file diff --git a/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_relu_test.cpp b/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_relu_test.cpp index 63218e57b79..0fee57bbf64 100644 --- a/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_relu_test.cpp +++ b/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_relu_test.cpp @@ -4,7 +4,7 @@ #include "myriad_layers_relu_test.hpp" -INSTANTIATE_TEST_CASE_P(accuracy, myriadLayerReLU_nightly, +INSTANTIATE_TEST_CASE_P(accuracy, myriadLayerReLU_smoke, ::testing::Combine( ::testing::ValuesIn(s_copyTensors), ::testing::ValuesIn(s_reluLayerParams) @@ -12,7 +12,7 @@ INSTANTIATE_TEST_CASE_P(accuracy, myriadLayerReLU_nightly, ); INSTANTIATE_TEST_CASE_P( - accuracy, myriadLayerFullyConnectedWithReLU_nightly, + accuracy, myriadLayerFullyConnectedWithReLU_smoke, ::testing::Combine( ::testing::ValuesIn(g_fcTestParamsSubset), ::testing::Values(g_dimensionsFC[0]), @@ -21,7 +21,7 @@ INSTANTIATE_TEST_CASE_P( ) ); -INSTANTIATE_TEST_CASE_P(accuracy, myriadLayersTestsMaxPoolingWithReLU_nightly, +INSTANTIATE_TEST_CASE_P(accuracy, myriadLayersTestsMaxPoolingWithReLU_smoke, ::testing::Combine( ::testing::ValuesIn(g_poolingInput), ::testing::ValuesIn(g_poolingLayerParamsLite), @@ -29,7 +29,7 @@ INSTANTIATE_TEST_CASE_P(accuracy, myriadLayersTestsMaxPoolingWithReLU_nightly, ::testing::ValuesIn(s_reluLayerParams)) ); -INSTANTIATE_TEST_CASE_P(accuracy, myriadLayersTestsAvgPoolingWithReLU_nightly, +INSTANTIATE_TEST_CASE_P(accuracy, myriadLayersTestsAvgPoolingWithReLU_smoke, ::testing::Combine( ::testing::ValuesIn(g_poolingInput), ::testing::ValuesIn(g_poolingLayerParamsLite), @@ -37,7 +37,7 @@ INSTANTIATE_TEST_CASE_P(accuracy, myriadLayersTestsAvgPoolingWithReLU_nightly, ::testing::ValuesIn(s_reluLayerParams)) ); -INSTANTIATE_TEST_CASE_P(accuracy_postop, myriadLayersTestsMaxPoolingWithReLU_nightly, +INSTANTIATE_TEST_CASE_P(accuracy_postop, myriadLayersTestsMaxPoolingWithReLU_smoke, ::testing::Combine( ::testing::ValuesIn(g_poolingInput_postOp), ::testing::Values(MAKE_STRUCT(pooling_layer_params, {3, 3}, {1, 1}, {1, 1})), @@ -45,7 +45,7 @@ INSTANTIATE_TEST_CASE_P(accuracy_postop, myriadLayersTestsMaxPoolingWithReLU_nig ::testing::Values(MAKE_STRUCT(ReLULayerDef, {{{"negative_slope", "0.0"}}}))) ); -INSTANTIATE_TEST_CASE_P(accuracy_postop, myriadLayersTestsAvgPoolingWithReLU_nightly, +INSTANTIATE_TEST_CASE_P(accuracy_postop, myriadLayersTestsAvgPoolingWithReLU_smoke, ::testing::Combine( ::testing::ValuesIn(g_poolingInput_postOp), ::testing::Values(MAKE_STRUCT(pooling_layer_params, {3, 3}, {1, 1}, {1, 1})), @@ -53,7 +53,7 @@ INSTANTIATE_TEST_CASE_P(accuracy_postop, myriadLayersTestsAvgPoolingWithReLU_nig ::testing::Values(MAKE_STRUCT(ReLULayerDef, {{{"negative_slope", "0.0"}}}))) ); -INSTANTIATE_TEST_CASE_P(accuracy, myriadLayerConvolutionWithReLU_nightly, +INSTANTIATE_TEST_CASE_P(accuracy, myriadLayerConvolutionWithReLU_smoke, ::testing::Combine( ::testing::ValuesIn(g_convolutionTensors) , ::testing::Values(MAKE_STRUCT(param_size, 3, 3)) @@ -65,7 +65,7 @@ INSTANTIATE_TEST_CASE_P(accuracy, myriadLayerConvolutionWithReLU_nightly, ) ); -INSTANTIATE_TEST_CASE_P(accuracy_postop, myriadLayerConvolutionWithReLU_nightly, +INSTANTIATE_TEST_CASE_P(accuracy_postop, myriadLayerConvolutionWithReLU_smoke, ::testing::Combine( ::testing::ValuesIn(g_poolingInput_postOp) , ::testing::Values(MAKE_STRUCT(param_size, 3, 3)) diff --git a/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_relu_test.hpp b/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_relu_test.hpp index eb1e2cea9e2..4337eda7440 100644 --- a/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_relu_test.hpp +++ b/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_relu_test.hpp @@ -11,7 +11,7 @@ using namespace InferenceEngine; const std::string relu_param = "negative_slope"; -class myriadLayersTestsReLUMergeWithBias_nightly : public myriadLayersTests_nightly { +class myriadLayersTestsReLUMergeWithBias_smoke : public myriadLayersTests_nightly { public: void RunTest(const std::string& model, size_t num_weights, size_t num_bias) { StatusCode st; @@ -65,9 +65,9 @@ static std::vector s_reluLayerParams = { {{{"negative_slope", "0.1"}}}, }; -typedef myriadLayerTestBaseWithParam> myriadLayerReLU_nightly; +typedef myriadLayerTestBaseWithParam> myriadLayerReLU_smoke; -TEST_P(myriadLayerReLU_nightly, ReLU) { +TEST_P(myriadLayerReLU_smoke, ReLU) { _config[VPU_CONFIG_KEY(DETECT_NETWORK_BATCH)] = CONFIG_VALUE(NO); auto input_dims = std::get<0>(GetParam()); auto extraLayerParams = std::get<1>(GetParam()); @@ -99,10 +99,10 @@ static std::vector s_copyTensors = { }, }; -class myriadLayerFullyConnectedWithReLU_nightly: public FCTest{ +class myriadLayerFullyConnectedWithReLU_smoke: public FCTest{ }; -TEST_P(myriadLayerFullyConnectedWithReLU_nightly, TestsFullyConnected) +TEST_P(myriadLayerFullyConnectedWithReLU_smoke, TestsFullyConnected) { auto p = ::testing::WithParamInterface>::GetParam(); auto extraLayerParams = std::get<3>(p); @@ -117,13 +117,13 @@ TEST_P(myriadLayerFullyConnectedWithReLU_nightly, TestsFullyConnected) #define ERROR_BOUND_WITH_RELU (4.e-3f) -class myriadLayersTestsMaxPoolingWithReLU_nightly: public PoolingTest{ +class myriadLayersTestsMaxPoolingWithReLU_smoke: public PoolingTest{ }; -class myriadLayersTestsAvgPoolingWithReLU_nightly: public PoolingTest{ +class myriadLayersTestsAvgPoolingWithReLU_smoke: public PoolingTest{ }; -TEST_P(myriadLayersTestsMaxPoolingWithReLU_nightly, TestsMaxPoolingWithReLU) +TEST_P(myriadLayersTestsMaxPoolingWithReLU_smoke, TestsMaxPoolingWithReLU) { auto p = ::testing::WithParamInterface>::GetParam(); auto extraLayerParams = std::get<3>(p); @@ -136,7 +136,7 @@ TEST_P(myriadLayersTestsMaxPoolingWithReLU_nightly, TestsMaxPoolingWithReLU) CompareCommonAbsolute(_outputMap.begin()->second, getReferenceOutput(), ERROR_BOUND_WITH_RELU); } -TEST_P(myriadLayersTestsAvgPoolingWithReLU_nightly, TestsAvgPoolingWithReLU) +TEST_P(myriadLayersTestsAvgPoolingWithReLU_smoke, TestsAvgPoolingWithReLU) { auto p = ::testing::WithParamInterface>::GetParam(); auto extraLayerParams = std::get<3>(p); @@ -149,10 +149,10 @@ TEST_P(myriadLayersTestsAvgPoolingWithReLU_nightly, TestsAvgPoolingWithReLU) CompareCommonAbsolute(_outputMap.begin()->second, getReferenceOutput(), ERROR_BOUND_WITH_RELU); } -class myriadLayerConvolutionWithReLU_nightly: public ConvolutionTest{ +class myriadLayerConvolutionWithReLU_smoke: public ConvolutionTest{ }; -TEST_P(myriadLayerConvolutionWithReLU_nightly, Convolution) { +TEST_P(myriadLayerConvolutionWithReLU_smoke, Convolution) { auto p = ::testing::WithParamInterface>::GetParam(); auto ReLUParam = std::get<6>(p); _testNet.addLayer(LayerInitParams("ReLU") diff --git a/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_reorg_test.cpp b/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_reorg_test.cpp index bd604f426b7..d60a7d4b55a 100644 --- a/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_reorg_test.cpp +++ b/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_reorg_test.cpp @@ -4,29 +4,10 @@ #include "myriad_layers_reorg_test.hpp" -static std::vector s_CustomConfig = { - "", -#ifdef VPU_HAS_CUSTOM_KERNELS - getIELibraryPath() + "/vpu_custom_kernels/customLayerBindings.xml" -#endif -}; - -static std::vector layoutPreferences = { - vpu::LayoutPreference::ChannelMajor, -#ifndef VPU_HAS_CUSTOM_KERNELS - vpu::LayoutPreference::ChannelMinor -#endif -}; - -INSTANTIATE_TEST_CASE_P(accuracy, myriadLayersTestsReorg_nightly, ::testing::Combine( - ::testing::Values( - MAKE_STRUCT(tensor_test_params, 1, 64, 26, 26), - MAKE_STRUCT(tensor_test_params, 1, 192, 6 * 26, 6 * 26), - MAKE_STRUCT(tensor_test_params, 1, 4, 6, 6) - ), - ::testing::Values(2), +INSTANTIATE_TEST_CASE_P(accuracy, myriadLayersTestsReorg_smoke, ::testing::Combine( + ::testing::ValuesIn(s_ReorgInputs), ::testing::Values(2), - ::testing::ValuesIn(layoutPreferences), - ::testing::ValuesIn(s_CustomConfig), - ::testing::Values(IRVersion::v7, IRVersion::v10) + ::testing::Values(vpu::LayoutPreference::ChannelMinor, vpu::LayoutPreference::ChannelMajor), + ::testing::Values(IRVersion::v7, IRVersion::v10), + ::testing::ValuesIn(s_CustomConfig) )); diff --git a/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_reorg_test.hpp b/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_reorg_test.hpp index be5cdad9e24..1fa387b6420 100644 --- a/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_reorg_test.hpp +++ b/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_reorg_test.hpp @@ -5,121 +5,109 @@ #include #include "myriad_layers_tests.hpp" -using std::tuple; -using std::get; - using namespace InferenceEngine; -static void reorg_calculate(short *inp, int w, int h, int c, int batch, int stride, float *out) +static void reorg_calculate(const Blob::Ptr src, Blob::Ptr dst, int stride) { - int out_c = c / (stride*stride); + ASSERT_NE(src, nullptr); + ASSERT_NE(dst, nullptr); + const uint16_t *src_data = src->buffer(); + uint16_t *dst_data = dst->buffer(); + ASSERT_NE(src_data, nullptr); + ASSERT_NE(dst_data, nullptr); - int oc = c * (stride*stride); - int oh = h / stride; - int ow = w / stride; + const auto inputDims = src->getTensorDesc().getDims(); + const int C = inputDims[1]; + const int H = inputDims[2]; + const int W = inputDims[3]; - for(int b = 0; b < batch; ++b) - { - for(int k = 0; k < c; ++k) - { - for(int j = 0; j < h; ++j) - { - for(int i = 0; i < w; ++i) - { - int in_index = i + w * (j + h * (k + c * b)); + const auto inputCHW = [&] { + auto inputCHW = std::vector(C*H*W); + if (Layout::NCHW == src->getTensorDesc().getLayout()) { + std::copy(src_data, src_data + C*H*W, begin(inputCHW)); + } else { + for (int c = 0; c < C; c++) { + for (int h = 0; h < H; h++) { + for (int w = 0; w < W; w++) { + inputCHW[c*H*W + h*W + w] = src_data[h*W*C + w*C + c]; + } + } + } + } + return inputCHW; + }(); - int new_z = in_index / (oh*ow); - int new_y = (in_index %(oh*ow)) / ow; - int new_x = (in_index %(oh*ow)) % ow; - int new_index = new_z + new_x * oc + new_y * oc * ow; + const int C2 = C/(stride*stride); + const int H2 = H*stride; + const int W2 = W*stride; - int c2 = k % out_c; - int offset = k / out_c; - int w2 = i*stride + offset % stride; - int h2 = j*stride + offset / stride; - int out_index = w2 + w*stride*(h2 + h*stride*(c2 + out_c*b)); + for (int c = 0; c < C; ++c) { + for (int h = 0; h < H; ++h) { + for (int w = 0; w < W; ++w) { + const int offset = c/C2; + const int c2 = c - C2*offset; + const int h2 = h*stride + offset/stride; + const int w2 = w*stride + offset - stride*(offset/stride); - out[new_index] = PrecisionUtils::f16tof32(inp[out_index]); - } - } - } - } + dst_data[c*H*W + h*W + w] = inputCHW[c2*H2*W2 + h2*W2 + w2]; + } + } + } + + dst->getTensorDesc().setLayout(Layout::NCHW); } PRETTY_PARAM(Stride, int); -PRETTY_PARAM(ScaleOutput, int); PRETTY_PARAM(layoutPreference, vpu::LayoutPreference); +PRETTY_PARAM(CustomConfig, std::string) +typedef myriadLayerTestBaseWithParam> + myriadLayersTestsReorg_smoke; -typedef myriadLayerTestBaseWithParam> myriadLayersTestsReorg_nightly; +TEST_P(myriadLayersTestsReorg_smoke, TestsReorg) { + const SizeVector dimsInput = std::get<0>(GetParam()); + const int stride = std::get<1>(GetParam()); + const auto layoutPreference = std::get<2>(GetParam()); + _irVersion = std::get<3>(GetParam()); + const std::string customConfig = std::get<4>(GetParam()); -TEST_P(myriadLayersTestsReorg_nightly, TestsReorg) { + if(!customConfig.empty() && !CheckMyriadX()) { + GTEST_SKIP() << "Custom layers for MYRIAD2 not supported"; + } + _config[VPU_CONFIG_KEY(CUSTOM_LAYERS)] = customConfig; - // TODO: M2 mode is not working for OpenCL compiler - if(!get<4>(GetParam()).empty() && !CheckMyriadX()) { - GTEST_SKIP()<<"Custom layers for MYRIAD2 not supported"; - } + const auto dimsOutput = SizeVector{dimsInput[0], + dimsInput[1] * (stride * stride), + dimsInput[2] / stride, + dimsInput[3] / stride}; - tensor_test_params dimsInput = get<0>(GetParam()); + SetInputTensors({dimsInput}); + SetOutputTensors({dimsOutput}); - int scaleOutput = get<1>(GetParam()); - tensor_test_params dimsOutput = {dimsInput.n, dimsInput.c * (scaleOutput * scaleOutput), dimsInput.h / scaleOutput, dimsInput.w / scaleOutput}; - - int stride = get<2>(GetParam()); - auto layoutPreference = get<3>(GetParam()); - _irVersion = get<5>(GetParam()); std::map params; - std::string type = "ReorgYolo"; - params["stride"] = std::to_string(stride); - SetInputTensor(dimsInput); - SetOutputTensor(dimsOutput); - _config[VPU_CONFIG_KEY(CUSTOM_LAYERS)] = get<4>(GetParam()); - ASSERT_NO_FATAL_FAILURE(makeSingleLayerNetwork(LayerInitParams(type) - .params(params), - NetworkInitParams().layoutPreference(layoutPreference) - .outputPrecision(InferenceEngine::Precision::FP32))); - /* input data preparation */ - SetInputInOrder(); + + ASSERT_NO_FATAL_FAILURE(makeSingleLayerNetwork(LayerInitParams("ReorgYolo").params(params), + NetworkInitParams() + .layoutPreference(layoutPreference) + .lockLayout(true))); ASSERT_TRUE(Infer()); - InferenceEngine::SizeVector inputDims = _inputsInfo.begin()->second->getTensorDesc().getDims(); - InferenceEngine::Blob::Ptr inputBlobRef = - InferenceEngine::make_shared_blob({InferenceEngine::Precision::FP16, inputDims, InferenceEngine::NHWC}); - inputBlobRef->allocate(); - short *inputBlobRefRawData = inputBlobRef->buffer(); - int c = inputDims[1]; - int h = inputDims[2]; - int w = inputDims[3]; + ASSERT_NO_FATAL_FAILURE(reorg_calculate(_inputMap.begin()->second, _refBlob, stride)); - auto inputBlob =_inputMap[_inputsInfo.begin()->first]; - short * inputBlob_data = inputBlob->buffer(); - - /* Preliminary repacking */ - for(int k = 0; k < c; k++) - { - for(int j = 0; j < h; j++) - { - for(int i = 0; i < w; i++) - { - int dst_index = i + w * j + w * h * k; - int src_index = k + c * i + c * w * j; - - inputBlobRefRawData[dst_index] = inputBlob_data[src_index]; - } - } - } - - auto outputBlob =_outputMap[_outputsInfo.begin()->first]; - InferenceEngine::SizeVector outputDims = _outputsInfo.begin()->second->getTensorDesc().getDims(); - - InferenceEngine::TBlob::Ptr outputBlobRef = - InferenceEngine::make_shared_blob(TensorDesc(InferenceEngine::Precision::FP32, outputDims, InferenceEngine::NCHW)); - outputBlobRef->allocate(); - float *outputBlobRefRawData = outputBlobRef->buffer(); - - reorg_calculate(inputBlobRefRawData, w, h, c, 1, stride, outputBlobRefRawData); - - compare(outputBlob->buffer(), outputBlobRef->buffer(), outputBlob->size(), 0.0); + CompareCommonAbsolute(_outputMap.begin()->second, _refBlob, 0); } + +static std::vector s_CustomConfig = { + {""}, +#ifdef VPU_HAS_CUSTOM_KERNELS + getIELibraryPath() + "/vpu_custom_kernels/customLayerBindings.xml" +#endif +}; + +static std::vector s_ReorgInputs = { + {1, 64, 26, 26}, + {1, 192, 6 * 26, 6 * 26}, + {1, 4, 6, 6} +}; \ No newline at end of file diff --git a/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_resample_test.cpp b/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_resample_test.cpp index 7528199af11..6030976b32e 100644 --- a/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_resample_test.cpp +++ b/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_resample_test.cpp @@ -4,8 +4,13 @@ #include "myriad_layers_resample_test.hpp" -INSTANTIATE_TEST_CASE_P(myriad, myriadResampleLayerTests_nightly, - ::testing::Combine( - ::testing::Values(CONFIG_VALUE(NO), CONFIG_VALUE(YES)), - ::testing::ValuesIn(s_ResampleCustomConfig), - ::testing::ValuesIn(s_ResampleAntialias))); +// #-31522 +INSTANTIATE_TEST_CASE_P( + DISABLED_accuracy, myriadResampleLayerTests_smoke, + ::testing::Combine( + ::testing::ValuesIn(s_ResampleInput), + ::testing::Values(2.0f, 0.5f), + ::testing::Values(false, true), + ::testing::Values(false, true), + ::testing::ValuesIn(s_CustomConfig)) +); diff --git a/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_resample_test.hpp b/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_resample_test.hpp index 40b2e76e8dd..ada3a740900 100644 --- a/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_resample_test.hpp +++ b/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_resample_test.hpp @@ -4,16 +4,24 @@ #include #include "myriad_layers_tests.hpp" -// #include using namespace InferenceEngine; #define ERROR_BOUND 1e-3 +PRETTY_PARAM(Factor, float) +PRETTY_PARAM(Antialias, int) +PRETTY_PARAM(HwOptimization, bool); +PRETTY_PARAM(CustomConfig, std::string); + +typedef myriadLayerTestBaseWithParam> + myriadResampleLayerTests_smoke; + static inline float triangleCoeff(float x) { return (1.0f - fabsf(x)); } + void refResample(const Blob::Ptr src, Blob::Ptr dst, int antialias) { ie_fp16 *src_data = static_cast(src->buffer()); ie_fp16 *output_sequences = static_cast(dst->buffer()); @@ -31,14 +39,7 @@ void refResample(const Blob::Ptr src, Blob::Ptr dst, int antialias) { if (IH == OH && IW == OW) { - int b = 0; - for (int c = 0; c < C; c++) - for (int h = 0; h < IH; h++) - for (int w = 0; w < IW; w++){ - int dst_index = w + IW * h + IW * IH * c; - int src_index = dst_index; - output_sequences[dst_index] = src_data[src_index]; - } + std::copy(src_data, src_data + C*IH*IW, output_sequences); return; } @@ -96,115 +97,59 @@ void refResample(const Blob::Ptr src, Blob::Ptr dst, int antialias) { } } -PRETTY_PARAM(hwAcceleration, std::string); -PRETTY_PARAM(customConfig, std::string); -PRETTY_PARAM(Antialias, int) +TEST_P(myriadResampleLayerTests_smoke, Resample) { + const SizeVector inputDims = std::get<0>(GetParam()); + const float factor = std::get<1>(GetParam()); + const bool antialias = std::get<2>(GetParam()); + const bool hwOptimization = std::get<3>(GetParam()); + const std::string customConfig = std::get<4>(GetParam()); -typedef myriadLayerTestBaseWithParam> myriadResampleLayerTests_nightly; + ASSERT_GT(factor, 0); -TEST_P(myriadResampleLayerTests_nightly, Resample) { - std::string model = R"V0G0N( - - - - - - 1 - 128 - 26 - 26 - - - - - - - - 1 - 128 - 26 - 26 - - - - - 1 - 128 - 52 - 52 - - - - - - - - - )V0G0N"; - - SetSeed(DEFAULT_SEED_VALUE + 6); - - std::string HWConfigValue = std::get<0>(GetParam()); - std::string customConfig = std::get<1>(GetParam()); - int antialias = std::get<2>(GetParam()); - - model.replace( model.find("@TEST@"), sizeof("@TEST@") -1, std::to_string(antialias)); - if((customConfig != "") || (antialias != 1)){ - if(!customConfig.empty() && !CheckMyriadX()) { - GTEST_SKIP()<<"Custom layers for MYRIAD2 not supported"; - } - _config[VPU_CONFIG_KEY(HW_STAGES_OPTIMIZATION)] = HWConfigValue; - _config[VPU_CONFIG_KEY(CUSTOM_LAYERS)] = customConfig; - StatusCode st; - - ASSERT_NO_THROW(readNetwork(model)); - - const auto& network = _cnnNetwork; - - _inputsInfo = network.getInputsInfo(); - _inputsInfo["data"]->setPrecision(Precision::FP16); - _inputsInfo["data"]->setLayout(NCHW); - - _outputsInfo = network.getOutputsInfo(); - _outputsInfo["detector/yolo-v3/ResizeNearestNeighbor"]->setPrecision(Precision::FP16); - - ASSERT_NO_THROW(st = _vpuPluginPtr->LoadNetwork(_exeNetwork, network, - {{VPU_CONFIG_KEY(CUSTOM_LAYERS), customConfig}, {VPU_CONFIG_KEY(HW_STAGES_OPTIMIZATION), HWConfigValue}}, &_resp)); - ASSERT_EQ(StatusCode::OK, st) << _resp.msg; - ASSERT_NE(_exeNetwork, nullptr) << _resp.msg; - - ASSERT_NO_THROW(st = _exeNetwork->CreateInferRequest(_inferRequest, &_resp)); - ASSERT_EQ(StatusCode::OK, st) << _resp.msg; - - Blob::Ptr data; - ASSERT_NO_THROW(st = _inferRequest->GetBlob("data", data, &_resp)); - ASSERT_EQ(StatusCode::OK, st) << _resp.msg; - - GenRandomData(data); - - ASSERT_NO_THROW(st = _inferRequest->Infer(&_resp)); - ASSERT_EQ(StatusCode::OK, st) << _resp.msg; - - Blob::Ptr outputBlob; - ASSERT_NO_THROW(_inferRequest->GetBlob("detector/yolo-v3/ResizeNearestNeighbor", outputBlob, &_resp)); - ASSERT_EQ(StatusCode::OK, st) << _resp.msg; - - _refBlob = make_shared_blob(TensorDesc(Precision::FP16, outputBlob->getTensorDesc().getDims(), NCHW)); - _refBlob->allocate(); - - refResample(data, _refBlob, antialias); - - CompareCommonAbsolute(outputBlob, _refBlob, ERROR_BOUND); + if (customConfig.empty() && antialias) { + GTEST_SKIP() << "Native Resample with antialiasing is not supported"; } + + if (!customConfig.empty() && !CheckMyriadX()) { + GTEST_SKIP() << "Custom layers for MYRIAD2 not supported"; + } + + _config[VPU_CONFIG_KEY(CUSTOM_LAYERS)] = customConfig; + + const auto outputDims = SizeVector{inputDims[0], + inputDims[1], + (size_t)(inputDims[2] * factor), + (size_t)(inputDims[3] * factor)}; + + SetInputTensors({inputDims}); + SetOutputTensors({outputDims}); + + std::map params; + params["antialias"] = std::to_string((int)antialias); + params["factor"] = std::to_string(factor); + + ASSERT_NO_FATAL_FAILURE(makeSingleLayerNetwork(LayerInitParams("Resample").params(params), + NetworkInitParams() + .useHWOpt(hwOptimization) + .lockLayout(true))); + + ASSERT_TRUE(Infer()); + + ASSERT_NO_FATAL_FAILURE(refResample(_inputMap.begin()->second, _refBlob, antialias)); + + CompareCommonAbsolute(_outputMap.begin()->second, _refBlob, ERROR_BOUND); } -static std::vector s_ResampleCustomConfig = { - "", +static std::vector s_ResampleInput = { + {1, 128, 26, 26}, + {1, 64, 52, 52}, + {1, 23, 14, 14} +}; + +static std::vector s_CustomConfig = { + {""}, #ifdef VPU_HAS_CUSTOM_KERNELS getIELibraryPath() + "/vpu_custom_kernels/customLayerBindings.xml" #endif }; -static std::vector s_ResampleAntialias = { - {0, 1} -}; diff --git a/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_reshape_test.cpp b/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_reshape_test.cpp index 3a9f302cded..a5abd89aeba 100644 --- a/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_reshape_test.cpp +++ b/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_reshape_test.cpp @@ -5,7 +5,7 @@ #include "ngraph_functions/subgraph_builders.hpp" #include "myriad_layers_reshape_test.hpp" -TEST_F(myriadEliminateReshapeTests_nightly, SplitConvConcat) { +TEST_F(myriadEliminateReshapeTests_smoke, SplitConvConcat) { ASSERT_NO_THROW(_cnnNetwork = InferenceEngine::CNNNetwork(ngraph::builder::subgraph::makeSplitConvConcat())); StatusCode st; @@ -265,7 +265,7 @@ TEST_F(myriadLayersTests_nightly, ReshapeAfterConcat_Eliminate) { EXPECT_EQ(InferenceEngineProfileInfo::NOT_RUN, layerInfo.status); } -TEST_F(myriadLayerReshapeFasterRCNN_nightly, Reshape) { +TEST_F(myriadLayerReshapeFasterRCNN_smoke, Reshape) { InferenceEngine::SizeVector input_tensor = {1, 14, 14, 24}; InferenceEngine::SizeVector output_tensor = {1, 2352, 2}; std::map layer_params = { @@ -281,13 +281,13 @@ TEST_F(myriadLayerReshapeFasterRCNN_nightly, Reshape) { ASSERT_TRUE(generateNetAndInfer(NetworkInitParams().useHWOpt( CheckMyriadX()))); } -INSTANTIATE_TEST_CASE_P(accuracy, myriadLayerReshape_nightly, +INSTANTIATE_TEST_CASE_P(accuracy, myriadLayerReshape_smoke, ::testing::Combine( ::testing::ValuesIn(s_reshapeInParams), ::testing::ValuesIn(s_reshapeOutParams)) ); -INSTANTIATE_TEST_CASE_P(fc_to_conv_case, myriadLayerReshape_nightly, +INSTANTIATE_TEST_CASE_P(fc_to_conv_case, myriadLayerReshape_smoke, ::testing::Values( std::make_tuple( SizeVector{400, 12544}, @@ -308,11 +308,11 @@ INSTANTIATE_TEST_CASE_P(fc_to_conv_case, myriadLayerReshape_nightly, ) ); -INSTANTIATE_TEST_CASE_P(accuracy, myriadLayersTestsReshapeBeforeFC_nightly, +INSTANTIATE_TEST_CASE_P(accuracy, myriadLayersTestsReshapeBeforeFC_smoke, ::testing::Values(CONFIG_VALUE(YES), CONFIG_VALUE(NO)) ); -INSTANTIATE_TEST_CASE_P(accuracy, myriadLayersTestsReshapeFasterRCNN_nightly, +INSTANTIATE_TEST_CASE_P(accuracy, myriadLayersTestsReshapeFasterRCNN_smoke, ::testing::Combine( ::testing::ValuesIn(s_convTensor) , ::testing::Values(MAKE_STRUCT(param_size, 1, 1)) diff --git a/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_reshape_test.hpp b/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_reshape_test.hpp index 22fa2540e5c..942c6551e66 100644 --- a/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_reshape_test.hpp +++ b/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_reshape_test.hpp @@ -10,11 +10,11 @@ using namespace InferenceEngine; -using myriadEliminateReshapeTests_nightly = myriadLayersTests_nightly; +using myriadEliminateReshapeTests_smoke = myriadLayersTests_nightly; -typedef myriadLayerTestBaseWithParam> myriadLayerReshape_nightly; +typedef myriadLayerTestBaseWithParam> myriadLayerReshape_smoke; -TEST_P(myriadLayerReshape_nightly, Reshape) { +TEST_P(myriadLayerReshape_smoke, Reshape) { auto input_tensor = std::get<0>(GetParam()); auto output_tensor = std::get<1>(GetParam()); @@ -38,7 +38,7 @@ TEST_P(myriadLayerReshape_nightly, Reshape) { } -typedef myriadLayersTests_nightly myriadLayerReshapeFasterRCNN_nightly; +typedef myriadLayersTests_nightly myriadLayerReshapeFasterRCNN_smoke; static std::vector s_reshapeInParams = { {{1, 4, 2, 16}}, @@ -198,9 +198,9 @@ std::string MODEL_WITHOUT_FLATTEN = R"V0G0N( )V0G0N"; -typedef myriadLayerTestBaseWithParam myriadLayersTestsReshapeBeforeFC_nightly; +typedef myriadLayerTestBaseWithParam myriadLayersTestsReshapeBeforeFC_smoke; -TEST_P(myriadLayersTestsReshapeBeforeFC_nightly, OptimizeReshapeIfItIsPlacedBeforeFC) { +TEST_P(myriadLayersTestsReshapeBeforeFC_smoke, OptimizeReshapeIfItIsPlacedBeforeFC) { std::string HWConfigValue = GetParam(); if (!CheckMyriadX() && HWConfigValue == CONFIG_VALUE(YES)) { std::cout << "Disable for non-MyriadX devices" << std::endl; @@ -247,11 +247,11 @@ TEST_P(myriadLayersTestsReshapeBeforeFC_nightly, OptimizeReshapeIfItIsPlacedBefo EXPECT_EQ(InferenceEngineProfileInfo::NOT_RUN, layerInfo.status); } -class myriadLayersTestsReshapeFasterRCNN_nightly: public ConvolutionTest<>{ +class myriadLayersTestsReshapeFasterRCNN_smoke: public ConvolutionTest<>{ }; // FIXME: rewrite the test (it doesn't use Convolution) avoid HWC layout for 3D tensor in reference code -TEST_P(myriadLayersTestsReshapeFasterRCNN_nightly, DISABLED_Convolution) { +TEST_P(myriadLayersTestsReshapeFasterRCNN_smoke, DISABLED_Convolution) { std::map permute_params = { {"order", "0,2,3,1"} }; diff --git a/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_reverse_sequence_test.cpp b/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_reverse_sequence_test.cpp index 2a9dfab9bb5..bc5c38e449e 100644 --- a/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_reverse_sequence_test.cpp +++ b/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_reverse_sequence_test.cpp @@ -4,7 +4,7 @@ #include "myriad_layers_reverse_sequence_test.hpp" -INSTANTIATE_TEST_CASE_P(accuracy, myriadLayerReverseSequence_nightly, +INSTANTIATE_TEST_CASE_P(accuracy, myriadLayerReverseSequence_smoke, ::testing::Combine( ::testing::Values( MAKE_STRUCT(reverse_sequence_test_params, {5, 6, 18}, 0, 0) diff --git a/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_reverse_sequence_test.hpp b/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_reverse_sequence_test.hpp index 3481c9a5cc5..829f3e9821d 100644 --- a/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_reverse_sequence_test.hpp +++ b/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_reverse_sequence_test.hpp @@ -30,7 +30,7 @@ struct reverse_sequence_test_params { }; PRETTY_PARAM(ReverseSequence, reverse_sequence_test_params); -typedef myriadLayerTestBaseWithParam> myriadLayerReverseSequence_nightly; +typedef myriadLayerTestBaseWithParam> myriadLayerReverseSequence_smoke; static int nchw_to_nhwc(InferenceEngine::SizeVector dims, int ind) { @@ -104,7 +104,7 @@ static void ref_reverse_sequence( } } -TEST_P(myriadLayerReverseSequence_nightly, ReverseSequence) { +TEST_P(myriadLayerReverseSequence_smoke, ReverseSequence) { _config[VPU_CONFIG_KEY(DETECT_NETWORK_BATCH)] = CONFIG_VALUE(NO); reverse_sequence_test_params input_dims = std::get<0>(GetParam()); diff --git a/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_rfcn_test.cpp b/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_rfcn_test.cpp index 627b4597d60..8204fbf5882 100644 --- a/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_rfcn_test.cpp +++ b/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_rfcn_test.cpp @@ -647,7 +647,7 @@ static void refGlobalAvgPooling7x7Rfcn(const Blob::Ptr src, } } -class myriadLayersRfcnTests_nightly: public myriadLayersTests_nightly { +class myriadLayersRfcnTests_smoke: public myriadLayersTests_nightly { public: void GenROIs(InferenceEngine::Blob::Ptr rois, const uint32_t in_width, const uint32_t in_height, @@ -796,7 +796,7 @@ public: Blob::Ptr outputBlob; }; -TEST_F(myriadLayersRfcnTests_nightly, ReshapeRfcn) +TEST_F(myriadLayersRfcnTests_smoke, ReshapeRfcn) { StatusCode st = GENERAL_ERROR; @@ -812,7 +812,7 @@ TEST_F(myriadLayersRfcnTests_nightly, ReshapeRfcn) CompareCommonAbsolute(outputBlob, prior_network_output, 0.0f); } -TEST_F(myriadLayersRfcnTests_nightly, SoftmaxRfcn) +TEST_F(myriadLayersRfcnTests_smoke, SoftmaxRfcn) { StatusCode st = GENERAL_ERROR; @@ -830,7 +830,7 @@ TEST_F(myriadLayersRfcnTests_nightly, SoftmaxRfcn) CompareCommonAbsolute(outputBlob, _refBlob, ERROR_BOUND); } -TEST_F(myriadLayersRfcnTests_nightly, GlobalAvgPooling7x7Rfcn) +TEST_F(myriadLayersRfcnTests_smoke, GlobalAvgPooling7x7Rfcn) { StatusCode st = GENERAL_ERROR; diff --git a/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_roi_align_test.cpp b/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_roi_align_test.cpp index 84649ea0940..b9b7a7f5387 100644 --- a/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_roi_align_test.cpp +++ b/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_roi_align_test.cpp @@ -4,7 +4,7 @@ #include "myriad_layers_roi_align_test.hpp" -INSTANTIATE_TEST_CASE_P(accuracy, myriadLayersTestsROIAlign_nightly, +INSTANTIATE_TEST_CASE_P(accuracy, myriadLayersTestsROIAlign_smoke, ::testing::Combine( ::testing::ValuesIn(s_ROIAlignLayerInput), ::testing::ValuesIn(s_ROIAlignLayerParam), diff --git a/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_roi_align_test.hpp b/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_roi_align_test.hpp index 0326e834aff..f2c3021ae52 100644 --- a/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_roi_align_test.hpp +++ b/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_roi_align_test.hpp @@ -35,7 +35,7 @@ PRETTY_PARAM(roi_align_mode, std::string); PRETTY_PARAM(number_rois, uint32_t); using ROIAlignTestParams = std::tuple; -typedef myriadLayerTestBaseWithParam myriadLayersTestsROIAlign_nightly; +typedef myriadLayerTestBaseWithParam myriadLayersTestsROIAlign_smoke; const int roi_cols = 4; @@ -161,7 +161,7 @@ static std::string getModel(const int batches, const int channels, const int hei return model; } -TEST_P(myriadLayersTestsROIAlign_nightly, ROIAlign) { +TEST_P(myriadLayersTestsROIAlign_smoke, ROIAlign) { _config[VPU_CONFIG_KEY(DETECT_NETWORK_BATCH)] = CONFIG_VALUE(NO); const tensor_test_params dims_layer_in = std::get<0>(GetParam()); diff --git a/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_roi_feature_extractor_test.cpp b/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_roi_feature_extractor_test.cpp index bfe13074f4a..4c44ef6a380 100644 --- a/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_roi_feature_extractor_test.cpp +++ b/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_roi_feature_extractor_test.cpp @@ -4,7 +4,7 @@ #include "myriad_layers_roi_feature_extractor_test.hpp" -INSTANTIATE_TEST_CASE_P(accuracy, myriadLayersTestsROIFeatureExtractor_nightly, +INSTANTIATE_TEST_CASE_P(accuracy, myriadLayersTestsROIFeatureExtractor_smoke, ::testing::Combine( ::testing::ValuesIn(s_ROIFeatureExtractorLayerInput), ::testing::ValuesIn(s_ROIFeatureExtractorLayerParam), diff --git a/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_roi_feature_extractor_test.hpp b/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_roi_feature_extractor_test.hpp index 6ad35a63a2d..2d3933e3ba4 100644 --- a/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_roi_feature_extractor_test.hpp +++ b/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_roi_feature_extractor_test.hpp @@ -30,7 +30,7 @@ PRETTY_PARAM(number_rois, uint32_t); using ROIFeatureExtractorTestParams = std::tuple; -typedef myriadLayerTestBaseWithParam myriadLayersTestsROIFeatureExtractor_nightly; +typedef myriadLayerTestBaseWithParam myriadLayersTestsROIFeatureExtractor_smoke; static void genROIs(InferenceEngine::Blob::Ptr rois, const roi_feature_extractor_param& params, @@ -55,7 +55,7 @@ static void genROIs(InferenceEngine::Blob::Ptr rois, } } -TEST_P(myriadLayersTestsROIFeatureExtractor_nightly, ROIFeatureExtractor) { +TEST_P(myriadLayersTestsROIFeatureExtractor_smoke, ROIFeatureExtractor) { tensor_test_params dims_layer_in = std::get<0>(GetParam()); roi_feature_extractor_param test_params = std::get<1>(GetParam()); const uint32_t num_rois = std::get<2>(GetParam()); diff --git a/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_roi_pooling_test.cpp b/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_roi_pooling_test.cpp index 8f875a1bfc9..ff45363c66d 100644 --- a/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_roi_pooling_test.cpp +++ b/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_roi_pooling_test.cpp @@ -4,7 +4,7 @@ #include "myriad_layers_roi_pooling_test.hpp" -INSTANTIATE_TEST_CASE_P(accuracy, myriadLayersTestsROIPooling_nightly, +INSTANTIATE_TEST_CASE_P(accuracy, myriadLayersTestsROIPooling_smoke, ::testing::Combine( ::testing::ValuesIn(s_ROIPoolingLayerInput), ::testing::ValuesIn(s_ROIPoolingLayerParam), diff --git a/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_roi_pooling_test.hpp b/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_roi_pooling_test.hpp index 6b8d98835c5..68b89f87b7b 100644 --- a/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_roi_pooling_test.hpp +++ b/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_roi_pooling_test.hpp @@ -42,7 +42,7 @@ static inline void PrintTo(const t_ROIPooling_method& param, ::std::ostream* os) using ROIPoolingTestParams = std::tuple; -class myriadLayersTestsROIPooling_nightly: public myriadLayerTestBaseWithParam { +class myriadLayersTestsROIPooling_smoke: public myriadLayerTestBaseWithParam { public: void genROIs(InferenceEngine::Blob::Ptr rois, const ROIPoolingParams& params, @@ -260,7 +260,7 @@ public: } }; -TEST_P(myriadLayersTestsROIPooling_nightly, ROIPooling) { +TEST_P(myriadLayersTestsROIPooling_smoke, ROIPooling) { tensor_test_params dims_layer_in = std::get<0>(GetParam()); ROIPoolingParams test_params = std::get<1>(GetParam()); const uint32_t num_rois = std::get<2>(GetParam()); diff --git a/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_scale_test.cpp b/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_scale_test.cpp index 05cedf0eb37..8c8de925791 100644 --- a/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_scale_test.cpp +++ b/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_scale_test.cpp @@ -5,7 +5,7 @@ #include "myriad_layers_scale_test.hpp" INSTANTIATE_TEST_CASE_P( - accuracy, myriadLayersTestsScale_nightly, + accuracy, myriadLayersTestsScale_smoke, ::testing::Combine( ::testing::ValuesIn(s_inputScaleTensors), ::testing::ValuesIn(s_inputBiasScale))); diff --git a/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_scale_test.hpp b/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_scale_test.hpp index cdad5d77157..956e025080b 100644 --- a/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_scale_test.hpp +++ b/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_scale_test.hpp @@ -97,11 +97,11 @@ void ref_scale(const InferenceEngine::Blob::Ptr src, typedef std::tuple TestScaleShift; -class myriadLayersTestsScale_nightly: public myriadLayersTests_nightly, +class myriadLayersTestsScale_smoke: public myriadLayersTests_nightly, public testing::WithParamInterface { }; -TEST_P(myriadLayersTestsScale_nightly, TestsScale) +TEST_P(myriadLayersTestsScale_smoke, TestsScale) { _config[VPU_CONFIG_KEY(DETECT_NETWORK_BATCH)] = CONFIG_VALUE(NO); diff --git a/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_scatter_elements_update_test.cpp b/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_scatter_elements_update_test.cpp index 8ecc122bd6f..7d7b6a3054f 100644 --- a/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_scatter_elements_update_test.cpp +++ b/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_scatter_elements_update_test.cpp @@ -53,12 +53,12 @@ static const std::vector dataShapeList_useCases = { { 16, 512, 56, 56 }, }; -INSTANTIATE_TEST_CASE_P(nd_tensors, myriadLayersScatterElementsUpdateTest_nightly, +INSTANTIATE_TEST_CASE_P(nd_tensors, myriadLayersScatterElementsUpdateTest_smoke, Combine( ValuesIn(dataShapeList_ndTensors), ValuesIn(dataTypeList))); -INSTANTIATE_TEST_CASE_P(use_cases, myriadLayersScatterElementsUpdateTest_nightly, +INSTANTIATE_TEST_CASE_P(use_cases, myriadLayersScatterElementsUpdateTest_smoke, Combine( ValuesIn(dataShapeList_useCases), ValuesIn(dataTypeList))); diff --git a/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_scatter_elements_update_test.hpp b/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_scatter_elements_update_test.hpp index acfa1b6b35b..57b49de0fea 100644 --- a/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_scatter_elements_update_test.hpp +++ b/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_scatter_elements_update_test.hpp @@ -41,7 +41,7 @@ using DataType = std::string; // "FP16", "I32" using ScatterElementsUpdateTestParams = std::tuple; -class myriadLayersScatterElementsUpdateTest_nightly : +class myriadLayersScatterElementsUpdateTest_smoke : public myriadLayerTestBaseWithParam { protected: @@ -392,6 +392,6 @@ private: std::mt19937 m_gen; }; -TEST_P(myriadLayersScatterElementsUpdateTest_nightly, accuracy) { +TEST_P(myriadLayersScatterElementsUpdateTest_smoke, accuracy) { testScatterElementsUpdate(); } diff --git a/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_scatter_update_test.cpp b/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_scatter_update_test.cpp index 1d3d7afb71f..6f5fda6d856 100644 --- a/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_scatter_update_test.cpp +++ b/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_scatter_update_test.cpp @@ -14,7 +14,7 @@ using namespace testing; INSTANTIATE_TEST_CASE_P( nd_tensors, - myriadLayersScatterUpdateTest_nightly, + myriadLayersScatterUpdateTest_smoke, Values( // 1-dimensional `indices` ScatterUpdateTestParams { { 1000 }, { 100000 } }, @@ -51,7 +51,7 @@ INSTANTIATE_TEST_CASE_P( INSTANTIATE_TEST_CASE_P( use_cases, - myriadLayersScatterUpdateTest_nightly, + myriadLayersScatterUpdateTest_smoke, Values( // use case from Mask R-CNN: N = 1000, C = 256, HxW = 7x7 ScatterUpdateTestParams { { 32 }, { 1000, 256, 7, 7} }, diff --git a/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_scatter_update_test.hpp b/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_scatter_update_test.hpp index 6685bbecd3b..f9352f39a00 100644 --- a/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_scatter_update_test.hpp +++ b/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_scatter_update_test.hpp @@ -43,7 +43,7 @@ using IndicesShape = SizeVector; using ScatterUpdateTestParams = std::tuple; -class myriadLayersScatterUpdateTest_nightly: +class myriadLayersScatterUpdateTest_smoke: public myriadLayerTestBaseWithParam { protected: @@ -459,6 +459,6 @@ private: } }; -TEST_P(myriadLayersScatterUpdateTest_nightly, accuracy) { +TEST_P(myriadLayersScatterUpdateTest_smoke, accuracy) { testScatterUpdate(); } diff --git a/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_select_test.cpp b/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_select_test.cpp index d5db411ff11..0d63d0fc03f 100644 --- a/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_select_test.cpp +++ b/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_select_test.cpp @@ -4,7 +4,7 @@ #include "myriad_layers_select_test.hpp" -INSTANTIATE_TEST_CASE_P(accuracy, myriadTestsSelect_nightly, +INSTANTIATE_TEST_CASE_P(accuracy, myriadTestsSelect_smoke, ::testing::Combine( ::testing::ValuesIn(s_eltwiseTensors), ::testing::ValuesIn(s_eltwiseDims)) diff --git a/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_select_test.hpp b/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_select_test.hpp index 560728b68ab..ac7d8d84e88 100644 --- a/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_select_test.hpp +++ b/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_select_test.hpp @@ -116,7 +116,7 @@ protected: } }; -class myriadTestsSelect_nightly: public SelectTest +class myriadTestsSelect_smoke: public SelectTest { void SetUp() override { SelectTest::SetUp(); @@ -124,7 +124,7 @@ class myriadTestsSelect_nightly: public SelectTest } }; -TEST_P(myriadTestsSelect_nightly, Select) +TEST_P(myriadTestsSelect_smoke, Select) { InitBody(); } diff --git a/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_sigmoid_test.cpp b/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_sigmoid_test.cpp index 8d79d804f56..89d8f407d25 100644 --- a/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_sigmoid_test.cpp +++ b/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_sigmoid_test.cpp @@ -5,24 +5,24 @@ #include "myriad_layers_sigmoid_test.hpp" INSTANTIATE_TEST_CASE_P( - accuracy, myriadLayersTestsSigmoid_nightly, + accuracy, myriadLayersTestsSigmoid_smoke, ::testing::ValuesIn(s_sigmoidParams)); -INSTANTIATE_TEST_CASE_P(accuracy, myriadLayersTestsMaxPoolingWithSigmoid_nightly, +INSTANTIATE_TEST_CASE_P(accuracy, myriadLayersTestsMaxPoolingWithSigmoid_smoke, ::testing::Combine( ::testing::ValuesIn(g_poolingInput), ::testing::ValuesIn(g_poolingLayerParamsLite), ::testing::ValuesIn(g_poolingLayout)) ); -INSTANTIATE_TEST_CASE_P(accuracy, myriadLayersTestsAvgPoolingWithSigmoid_nightly, +INSTANTIATE_TEST_CASE_P(accuracy, myriadLayersTestsAvgPoolingWithSigmoid_smoke, ::testing::Combine( ::testing::ValuesIn(g_poolingInput), ::testing::ValuesIn(g_poolingLayerParamsLite), ::testing::ValuesIn(g_poolingLayout)) ); -INSTANTIATE_TEST_CASE_P(accuracy, myriadLayerConvolutionWithSigmoid_nightly, +INSTANTIATE_TEST_CASE_P(accuracy, myriadLayerConvolutionWithSigmoid_smoke, ::testing::Combine( ::testing::ValuesIn(g_convolutionTensors) , ::testing::Values(MAKE_STRUCT(param_size, 3, 3)) @@ -35,7 +35,7 @@ INSTANTIATE_TEST_CASE_P(accuracy, myriadLayerConvolutionWithSigmoid_nightly, ); INSTANTIATE_TEST_CASE_P( - accuracy, myriadLayerFullyConnectedWithSigmoid_nightly, + accuracy, myriadLayerFullyConnectedWithSigmoid_smoke, ::testing::Combine( ::testing::ValuesIn(g_fcTestParamsSubset), ::testing::Values(g_dimensionsFC[0]), diff --git a/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_sigmoid_test.hpp b/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_sigmoid_test.hpp index dc25cb652ba..c4ec91e16b1 100644 --- a/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_sigmoid_test.hpp +++ b/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_sigmoid_test.hpp @@ -13,12 +13,12 @@ using namespace InferenceEngine; -class myriadLayersTestsSigmoid_nightly: public myriadLayersTests_nightly, +class myriadLayersTestsSigmoid_smoke: public myriadLayersTests_nightly, public testing::WithParamInterface { public: }; -TEST_P(myriadLayersTestsSigmoid_nightly, TestsSigmoid) +TEST_P(myriadLayersTestsSigmoid_smoke, TestsSigmoid) { _config[VPU_CONFIG_KEY(DETECT_NETWORK_BATCH)] = CONFIG_VALUE(NO); @@ -52,13 +52,13 @@ static std::vector s_sigmoidParams = { {{1, 3, 277, 230}} }; -class myriadLayersTestsMaxPoolingWithSigmoid_nightly: public PoolingTest{ +class myriadLayersTestsMaxPoolingWithSigmoid_smoke: public PoolingTest{ }; -class myriadLayersTestsAvgPoolingWithSigmoid_nightly: public PoolingTest{ +class myriadLayersTestsAvgPoolingWithSigmoid_smoke: public PoolingTest{ }; -TEST_P(myriadLayersTestsMaxPoolingWithSigmoid_nightly, TestsMaxPoolingWithSigmoid) +TEST_P(myriadLayersTestsMaxPoolingWithSigmoid_smoke, TestsMaxPoolingWithSigmoid) { _testNet.addLayer(LayerInitParams("Sigmoid") .in({_output_tensor}) @@ -68,7 +68,7 @@ TEST_P(myriadLayersTestsMaxPoolingWithSigmoid_nightly, TestsMaxPoolingWithSigmoi CompareCommonAbsolute(_outputMap.begin()->second, getReferenceOutput(), ERROR_BOUND_WITH_SIGMOID); } -TEST_P(myriadLayersTestsAvgPoolingWithSigmoid_nightly, TestsAvgPoolingWithSigmoid) +TEST_P(myriadLayersTestsAvgPoolingWithSigmoid_smoke, TestsAvgPoolingWithSigmoid) { _testNet.addLayer(LayerInitParams("Sigmoid") .in({_output_tensor}) @@ -78,10 +78,10 @@ TEST_P(myriadLayersTestsAvgPoolingWithSigmoid_nightly, TestsAvgPoolingWithSigmoi CompareCommonAbsolute(_outputMap.begin()->second, getReferenceOutput(), ERROR_BOUND_WITH_SIGMOID); } -class myriadLayerConvolutionWithSigmoid_nightly: public ConvolutionTest{ +class myriadLayerConvolutionWithSigmoid_smoke: public ConvolutionTest{ }; -TEST_P(myriadLayerConvolutionWithSigmoid_nightly, Convolution) { +TEST_P(myriadLayerConvolutionWithSigmoid_smoke, Convolution) { _irVersion = std::get<6>(GetParam()); _testNet.addLayer(LayerInitParams("Sigmoid") .in({_output_tensor}) @@ -97,10 +97,10 @@ TEST_P(myriadLayerConvolutionWithSigmoid_nightly, Convolution) { CompareCommonAbsolute(_outputMap.begin()->second, getReferenceOutput(), maxerr); } -class myriadLayerFullyConnectedWithSigmoid_nightly: public FCTest<>{ +class myriadLayerFullyConnectedWithSigmoid_smoke: public FCTest<>{ }; -TEST_P(myriadLayerFullyConnectedWithSigmoid_nightly, TestsFullyConnected) +TEST_P(myriadLayerFullyConnectedWithSigmoid_smoke, TestsFullyConnected) { _testNet.addLayer(LayerInitParams("Sigmoid") .in({_output_tensor}) diff --git a/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_slice_test.cpp b/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_slice_test.cpp index 71eae36f9dc..d5a5ee1d220 100644 --- a/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_slice_test.cpp +++ b/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_slice_test.cpp @@ -4,7 +4,7 @@ #include "myriad_layers_slice_test.hpp" -INSTANTIATE_TEST_CASE_P(accuracy, myriadLayersTestsSlice_nightly, +INSTANTIATE_TEST_CASE_P(accuracy, myriadLayersTestsSlice_smoke, ::testing::Values( MAKE_STRUCT(SliceParams, {4, 8, 16, 32, 64}, {{4, 8, 16, 10, 64}, {4, 8, 16, 22, 64}}, 3), MAKE_STRUCT(SliceParams, {4, 8, 16, 32}, {{4, 8, 2, 32}, {4, 8, 14, 32}}, 2)) diff --git a/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_slice_test.hpp b/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_slice_test.hpp index 6f794767919..1a8f2094a1a 100644 --- a/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_slice_test.hpp +++ b/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_slice_test.hpp @@ -16,9 +16,9 @@ struct SliceParams { PRETTY_PARAM(SliceTestParams, SliceParams); -typedef myriadLayerTestBaseWithParam myriadLayersTestsSlice_nightly; +typedef myriadLayerTestBaseWithParam myriadLayersTestsSlice_smoke; -TEST_P(myriadLayersTestsSlice_nightly, Slice) { +TEST_P(myriadLayersTestsSlice_smoke, Slice) { _config[VPU_CONFIG_KEY(DETECT_NETWORK_BATCH)] = CONFIG_VALUE(NO); const SliceParams testParams = GetParam(); diff --git a/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_softmax_test.cpp b/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_softmax_test.cpp index 236329a1ea7..8e3bd5683c8 100644 --- a/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_softmax_test.cpp +++ b/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_softmax_test.cpp @@ -5,7 +5,7 @@ #include "myriad_layers_softmax_test.hpp" INSTANTIATE_TEST_CASE_P( - accuracy, myriadLayersTestsSoftMax_nightly, + accuracy, myriadLayersTestsSoftMax_smoke, ::testing::Combine( ::testing::ValuesIn(s_softMaxTensors) , ::testing::Values(IRVersion::v7, IRVersion::v10) diff --git a/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_softmax_test.hpp b/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_softmax_test.hpp index 3f2729350e8..93d8eb76b66 100644 --- a/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_softmax_test.hpp +++ b/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_softmax_test.hpp @@ -18,20 +18,20 @@ void PrintTo(const SoftmaxAxisSizes& p, std::ostream* os) { *os << "axis=" << p.axis << ", sizes=" << testing::PrintToString(p.sizes); } -using myriadLayersTestsSoftMaxParams_nightly = myriadLayerTestBaseWithParam>; +using myriadLayersTestsSoftMaxParams_smoke = myriadLayerTestBaseWithParam>; -class myriadLayersTestsSoftMax_nightly: public myriadLayersTestsSoftMaxParams_nightly { +class myriadLayersTestsSoftMax_smoke: public myriadLayersTestsSoftMaxParams_smoke { protected: SoftmaxAxisSizes _testingInput; void SetUp() override { - myriadLayersTestsSoftMaxParams_nightly::SetUp(); + myriadLayersTestsSoftMaxParams_smoke::SetUp(); _testingInput = std::get<0>(GetParam()); _irVersion = std::get<1>(GetParam()); } }; -TEST_P(myriadLayersTestsSoftMax_nightly, TestsSoftMax) +TEST_P(myriadLayersTestsSoftMax_smoke, TestsSoftMax) { _config[VPU_CONFIG_KEY(DETECT_NETWORK_BATCH)] = CONFIG_VALUE(NO); SetInputTensors({_testingInput.sizes}); diff --git a/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_split_test.cpp b/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_split_test.cpp index 45bdd62d9d4..72ba0c199dc 100644 --- a/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_split_test.cpp +++ b/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_split_test.cpp @@ -4,7 +4,7 @@ #include "myriad_layers_split_test.hpp" -INSTANTIATE_TEST_CASE_P(accuracy, myriadLayersTestsSplit_nightly, +INSTANTIATE_TEST_CASE_P(accuracy, myriadLayersTestsSplit_smoke, ::testing::Values( MAKE_STRUCT(SplitParams, {4, 8, 16, 32, 64}, 2, 6), MAKE_STRUCT(SplitParams, {4, 8, 16, 32}, 2, 6), diff --git a/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_split_test.hpp b/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_split_test.hpp index bba4236ab8b..a4cbe23b30c 100644 --- a/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_split_test.hpp +++ b/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_split_test.hpp @@ -16,9 +16,9 @@ struct SplitParams { PRETTY_PARAM(SplitTestParams, SplitParams); -typedef myriadLayerTestBaseWithParam myriadLayersTestsSplit_nightly; +typedef myriadLayerTestBaseWithParam myriadLayersTestsSplit_smoke; -TEST_P(myriadLayersTestsSplit_nightly, Split) { +TEST_P(myriadLayersTestsSplit_smoke, Split) { _config[VPU_CONFIG_KEY(DETECT_NETWORK_BATCH)] = CONFIG_VALUE(NO); const SplitParams testParams = GetParam(); diff --git a/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_squeeze_test.cpp b/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_squeeze_test.cpp index c8c2eeeb6ca..3ab61dfd70c 100644 --- a/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_squeeze_test.cpp +++ b/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_squeeze_test.cpp @@ -4,7 +4,7 @@ #include "myriad_layers_squeeze_test.hpp" -INSTANTIATE_TEST_CASE_P(accuracy, myriadLayersTestsSqueezeTC1, +INSTANTIATE_TEST_CASE_P(accuracy, myriadLayersTestsSqueezeTC1_smoke, ::testing::Combine( ::testing::ValuesIn(s_squeezeTensorsTC1), ::testing::ValuesIn(s_squeezeIndicesTC1), @@ -13,7 +13,7 @@ INSTANTIATE_TEST_CASE_P(accuracy, myriadLayersTestsSqueezeTC1, ) ); -INSTANTIATE_TEST_CASE_P(accuracy, myriadLayersTestsSqueezeTC2, +INSTANTIATE_TEST_CASE_P(accuracy, myriadLayersTestsSqueezeTC2_smoke, ::testing::Combine( ::testing::ValuesIn(s_squeezeTensorsTC2), ::testing::ValuesIn(s_squeezeIndicesTC2), @@ -22,7 +22,7 @@ INSTANTIATE_TEST_CASE_P(accuracy, myriadLayersTestsSqueezeTC2, ) ); -INSTANTIATE_TEST_CASE_P(accuracy, myriadLayersTestsSqueezeTC3, +INSTANTIATE_TEST_CASE_P(accuracy, myriadLayersTestsSqueezeTC3_smoke, ::testing::Combine( ::testing::ValuesIn(s_squeezeTensorsTC3), ::testing::ValuesIn(s_squeezeIndicesTC3), @@ -31,7 +31,7 @@ INSTANTIATE_TEST_CASE_P(accuracy, myriadLayersTestsSqueezeTC3, ) ); -INSTANTIATE_TEST_CASE_P(accuracy, myriadLayersTestsSqueezeTC4, +INSTANTIATE_TEST_CASE_P(accuracy, myriadLayersTestsSqueezeTC4_smoke, ::testing::Combine( ::testing::ValuesIn(s_squeezeTensorsTC4), ::testing::ValuesIn(s_squeezeIndicesTC4), @@ -40,7 +40,7 @@ INSTANTIATE_TEST_CASE_P(accuracy, myriadLayersTestsSqueezeTC4, ) ); -INSTANTIATE_TEST_CASE_P(accuracy, myriadLayersTestsSqueezeTC5, +INSTANTIATE_TEST_CASE_P(accuracy, myriadLayersTestsSqueezeTC5_smoke, ::testing::Combine( ::testing::ValuesIn(s_squeezeTensorsTC5), ::testing::ValuesIn(s_squeezeIndicesTC5), diff --git a/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_squeeze_test.hpp b/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_squeeze_test.hpp index fc510ebc277..c0d8ef8e8df 100644 --- a/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_squeeze_test.hpp +++ b/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_squeeze_test.hpp @@ -169,47 +169,47 @@ protected: } }; -class myriadLayersTestsSqueezeTC1 : public myriadLayersTestsSqueezeBase +class myriadLayersTestsSqueezeTC1_smoke : public myriadLayersTestsSqueezeBase { }; -class myriadLayersTestsSqueezeTC2 : public myriadLayersTestsSqueezeBase +class myriadLayersTestsSqueezeTC2_smoke : public myriadLayersTestsSqueezeBase { }; -class myriadLayersTestsSqueezeTC3 : public myriadLayersTestsSqueezeBase +class myriadLayersTestsSqueezeTC3_smoke : public myriadLayersTestsSqueezeBase { }; -class myriadLayersTestsSqueezeTC4 : public myriadLayersTestsSqueezeBase +class myriadLayersTestsSqueezeTC4_smoke : public myriadLayersTestsSqueezeBase { }; -class myriadLayersTestsSqueezeTC5 : public myriadLayersTestsSqueezeBase +class myriadLayersTestsSqueezeTC5_smoke : public myriadLayersTestsSqueezeBase { }; -TEST_P(myriadLayersTestsSqueezeTC1, Squeeze) { +TEST_P(myriadLayersTestsSqueezeTC1_smoke, Squeeze) { DISABLE_IF(!CheckMyriadX()); InitBody(); } -TEST_P(myriadLayersTestsSqueezeTC2, Squeeze) { +TEST_P(myriadLayersTestsSqueezeTC2_smoke, Squeeze) { DISABLE_IF(!CheckMyriadX()); InitBody(); } -TEST_P(myriadLayersTestsSqueezeTC3, Squeeze) { +TEST_P(myriadLayersTestsSqueezeTC3_smoke, Squeeze) { DISABLE_IF(!CheckMyriadX()); InitBody(); } -TEST_P(myriadLayersTestsSqueezeTC4, Squeeze) { +TEST_P(myriadLayersTestsSqueezeTC4_smoke, Squeeze) { DISABLE_IF(!CheckMyriadX()); InitBody(); } -TEST_P(myriadLayersTestsSqueezeTC5, Squeeze) { +TEST_P(myriadLayersTestsSqueezeTC5_smoke, Squeeze) { DISABLE_IF(!CheckMyriadX()); InitBody(); } diff --git a/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_strided_slice_test.cpp b/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_strided_slice_test.cpp index 249c5893916..5be47e61122 100644 --- a/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_strided_slice_test.cpp +++ b/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_strided_slice_test.cpp @@ -5,5 +5,5 @@ #include "myriad_layers_strided_slice_test.h" INSTANTIATE_TEST_CASE_P( - accuracy, myriadLayersTestsStridedSlice_nightly, + accuracy, myriadLayersTestsStridedSlice_smoke, ::testing::ValuesIn(s_stridedSliceParams)); diff --git a/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_strided_slice_test.h b/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_strided_slice_test.h index e62dfbf4ce2..4f324e979cd 100644 --- a/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_strided_slice_test.h +++ b/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_strided_slice_test.h @@ -25,7 +25,7 @@ struct strided_slice_test_param { InferenceEngine::SizeVector out_shape; }; -class myriadLayersTestsStridedSlice_nightly: public myriadLayersTests_nightly, +class myriadLayersTestsStridedSlice_smoke: public myriadLayersTests_nightly, public testing::WithParamInterface { public: std::string model_t = R"V0G0N( @@ -222,7 +222,7 @@ std::string stridesEdge = R"V0G0N( } }; -TEST_P(myriadLayersTestsStridedSlice_nightly, TestsStridedSlice) { +TEST_P(myriadLayersTestsStridedSlice_smoke, TestsStridedSlice) { auto p = ::testing::WithParamInterface::GetParam(); std::string model = getModel(p); diff --git a/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_tanh_test.cpp b/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_tanh_test.cpp index c2129b5fba7..20268ffa540 100644 --- a/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_tanh_test.cpp +++ b/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_tanh_test.cpp @@ -5,10 +5,10 @@ #include "myriad_layers_tanh_test.hpp" INSTANTIATE_TEST_CASE_P( - accuracy, myriadLayersTestsTanh_nightly, + accuracy, myriadLayersTestsTanh_smoke, ::testing::ValuesIn(s_tanhParams)); -INSTANTIATE_TEST_CASE_P(accuracy, myriadLayerConvolutionWithTanH_nightly, +INSTANTIATE_TEST_CASE_P(accuracy, myriadLayerConvolutionWithTanH_smoke, ::testing::Combine( ::testing::ValuesIn(g_convolutionTensors) , ::testing::Values(MAKE_STRUCT(param_size, 3, 3)) @@ -20,14 +20,14 @@ INSTANTIATE_TEST_CASE_P(accuracy, myriadLayerConvolutionWithTanH_nightly, ) ); -INSTANTIATE_TEST_CASE_P(accuracy, myriadLayersTestsMaxPoolingWithTanh_nightly, +INSTANTIATE_TEST_CASE_P(accuracy, myriadLayersTestsMaxPoolingWithTanh_smoke, ::testing::Combine( ::testing::ValuesIn(g_poolingInput), ::testing::ValuesIn(g_poolingLayerParamsLite), ::testing::ValuesIn(g_poolingLayout)) ); -INSTANTIATE_TEST_CASE_P(accuracy, myriadLayersTestsAvgPoolingWithTanh_nightly, +INSTANTIATE_TEST_CASE_P(accuracy, myriadLayersTestsAvgPoolingWithTanh_smoke, ::testing::Combine( ::testing::ValuesIn(g_poolingInput), ::testing::ValuesIn(g_poolingLayerParamsLite), @@ -35,7 +35,7 @@ INSTANTIATE_TEST_CASE_P(accuracy, myriadLayersTestsAvgPoolingWithTanh_nightly, ); INSTANTIATE_TEST_CASE_P( - accuracy, myriadLayerFullyConnectedWithTanH_nightly, + accuracy, myriadLayerFullyConnectedWithTanH_smoke, ::testing::Combine( ::testing::ValuesIn(g_fcTestParamsSubset), ::testing::Values(g_dimensionsFC[0]), diff --git a/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_tanh_test.hpp b/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_tanh_test.hpp index af95678efd9..a72e3d022c5 100644 --- a/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_tanh_test.hpp +++ b/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_tanh_test.hpp @@ -10,11 +10,11 @@ #define ERROR_BOUND_WITH_TANH (1.0e-3f) using namespace InferenceEngine; -class myriadLayersTestsTanh_nightly: public myriadLayersTests_nightly, +class myriadLayersTestsTanh_smoke: public myriadLayersTests_nightly, public testing::WithParamInterface { }; -TEST_P(myriadLayersTestsTanh_nightly, TestsTanh) +TEST_P(myriadLayersTestsTanh_smoke, TestsTanh) { _config[VPU_CONFIG_KEY(DETECT_NETWORK_BATCH)] = CONFIG_VALUE(NO); auto p = ::testing::WithParamInterface::GetParam(); @@ -71,10 +71,10 @@ static std::vector s_fcTestParamsSubset = { {{1, 16, 8, 8}, 8, 0.065f} }; -class myriadLayerConvolutionWithTanH_nightly: public ConvolutionTest{ +class myriadLayerConvolutionWithTanH_smoke: public ConvolutionTest{ }; -TEST_P(myriadLayerConvolutionWithTanH_nightly, Convolution) { +TEST_P(myriadLayerConvolutionWithTanH_smoke, Convolution) { auto param = GetParam(); _irVersion = std::get<6>(param); @@ -92,13 +92,13 @@ TEST_P(myriadLayerConvolutionWithTanH_nightly, Convolution) { CompareCommonAbsolute(_outputMap.begin()->second, getReferenceOutput(), maxerr); } -class myriadLayersTestsMaxPoolingWithTanh_nightly: public PoolingTest{ +class myriadLayersTestsMaxPoolingWithTanh_smoke: public PoolingTest{ }; -class myriadLayersTestsAvgPoolingWithTanh_nightly: public PoolingTest{ +class myriadLayersTestsAvgPoolingWithTanh_smoke: public PoolingTest{ }; -TEST_P(myriadLayersTestsMaxPoolingWithTanh_nightly, TestsMaxPoolingWithTanh) +TEST_P(myriadLayersTestsMaxPoolingWithTanh_smoke, TestsMaxPoolingWithTanh) { _testNet.addLayer(LayerInitParams("TanH") .in({_output_tensor}) @@ -108,7 +108,7 @@ TEST_P(myriadLayersTestsMaxPoolingWithTanh_nightly, TestsMaxPoolingWithTanh) CompareCommonAbsolute(_outputMap.begin()->second, getReferenceOutput(), ERROR_BOUND_WITH_TANH); } -TEST_P(myriadLayersTestsAvgPoolingWithTanh_nightly, TestsAvgPoolingWithTanh) +TEST_P(myriadLayersTestsAvgPoolingWithTanh_smoke, TestsAvgPoolingWithTanh) { _testNet.addLayer(LayerInitParams("TanH") .in({_output_tensor}) @@ -118,10 +118,10 @@ TEST_P(myriadLayersTestsAvgPoolingWithTanh_nightly, TestsAvgPoolingWithTanh) CompareCommonAbsolute(_outputMap.begin()->second, getReferenceOutput(), ERROR_BOUND_WITH_TANH); } -class myriadLayerFullyConnectedWithTanH_nightly: public FCTest<>{ +class myriadLayerFullyConnectedWithTanH_smoke: public FCTest<>{ }; -TEST_P(myriadLayerFullyConnectedWithTanH_nightly, TestsFullyConnected) +TEST_P(myriadLayerFullyConnectedWithTanH_smoke, TestsFullyConnected) { _testNet.addLayer(LayerInitParams("TanH") .in({_output_tensor}) diff --git a/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_tensor_iterator_test.cpp b/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_tensor_iterator_test.cpp deleted file mode 100644 index e18562dcdc2..00000000000 --- a/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_tensor_iterator_test.cpp +++ /dev/null @@ -1,66 +0,0 @@ -// Copyright (C) 2019 Intel Corporation -// SPDX-License-Identifier: Apache-2.0 -// - -#include "vpu_layers_tests.hpp" -#include "vpu_case_params.hpp" -#include "common/include/vpu/utils/error.hpp" - -#include "single_layer_common.hpp" - -#include "gtest/gtest.h" - -#include -#include -#include -#include -#include - -namespace { - -class MyriadLayersTestsTensorIterator : public CommonTestUtils::TestsCommon { -public: - void SetUp() override { - fn_ptr = ngraph::builder::subgraph::makeTIwithLSTMcell(); - } -protected: - std::shared_ptr fn_ptr; -}; - -// TODO: Issue: 29485 -TEST_F(MyriadLayersTestsTensorIterator, CompareNativeVersionWithUnrolledLoop) { - DISABLE_IF(!CheckMyriadX () && !CheckMA2085()); - CNNNetwork network(fn_ptr); - network.getInputsInfo().begin()->second->setPrecision(Precision::FP16); - - - auto ie = PluginCache::get().ie(); - - ExecutableNetwork exeNetworkWithConfig = ie->LoadNetwork(network, CommonTestUtils::DEVICE_MYRIAD, - {{VPU_CONFIG_KEY(FORCE_PURE_TENSOR_ITERATOR), CONFIG_VALUE(NO)}, - {VPU_CONFIG_KEY(ENABLE_TENSOR_ITERATOR_UNROLLING), CONFIG_VALUE(YES)}}); - InferRequest inferRequestWithConfig = exeNetworkWithConfig.CreateInferRequest(); - auto blobWithConfig = FuncTestUtils::createAndFillBlob(network.getInputsInfo().begin()->second->getTensorDesc()); - inferRequestWithConfig.SetBlob(network.getInputsInfo().begin()->first, blobWithConfig); - inferRequestWithConfig.Infer(); - auto* outRawDataWithConfig = inferRequestWithConfig.GetBlob(network.getOutputsInfo().begin()->first)->cbuffer().as(); - - ExecutableNetwork exeNetworkWithoutConfig = ie->LoadNetwork(network, CommonTestUtils::DEVICE_MYRIAD, - {{VPU_CONFIG_KEY(FORCE_PURE_TENSOR_ITERATOR), CONFIG_VALUE(YES)}, - {VPU_CONFIG_KEY(ENABLE_TENSOR_ITERATOR_UNROLLING), CONFIG_VALUE(NO)}}); - InferRequest inferRequestWithoutConfig = exeNetworkWithoutConfig.CreateInferRequest(); - auto blobWithoutConfig = FuncTestUtils::createAndFillBlob(network.getInputsInfo().begin()->second->getTensorDesc()); - inferRequestWithoutConfig.SetBlob(network.getInputsInfo().begin()->first, blobWithoutConfig); - inferRequestWithoutConfig.Infer(); - auto* outRawDataWithoutConfig = inferRequestWithoutConfig.GetBlob(network.getOutputsInfo().begin()->first)->cbuffer().as(); - - auto thr = FuncTestUtils::GetComparisonThreshold(InferenceEngine::Precision::FP16); - size_t outElementsCount = std::accumulate(begin(fn_ptr->get_output_shape(0)), end(fn_ptr->get_output_shape(0)), 1, - std::multiplies()); - - FuncTestUtils::compareRawBuffers(outRawDataWithoutConfig, outRawDataWithConfig, outElementsCount, - outElementsCount, - thr); - -} -} diff --git a/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_tile_test.cpp b/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_tile_test.cpp index bf23c58ac49..e4eb5bcd251 100644 --- a/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_tile_test.cpp +++ b/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_tile_test.cpp @@ -4,7 +4,7 @@ #include "myriad_layers_tile_test.hpp" -INSTANTIATE_TEST_CASE_P(accuracyAdd, myriadLayerTestTile_nightly, +INSTANTIATE_TEST_CASE_P(accuracyAdd, myriadLayerTestTile_smoke, ::testing::Combine( ::testing::Values( MAKE_STRUCT(tile_test::nd_tensor_test_params, {4, 5, 6}, 0) @@ -21,7 +21,7 @@ INSTANTIATE_TEST_CASE_P(accuracyAdd, myriadLayerTestTile_nightly, , ::testing::Values(2, 3, 5) )); -INSTANTIATE_TEST_CASE_P(accuracy, myriadLayerTestTile_nightly, +INSTANTIATE_TEST_CASE_P(accuracy, myriadLayerTestTile_smoke, ::testing::Combine( ::testing::Values( MAKE_STRUCT(tile_test::nd_tensor_test_params, {4, 5, 6}, 1) diff --git a/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_tile_test.hpp b/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_tile_test.hpp index 1d20b1ae718..8424212fa24 100644 --- a/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_tile_test.hpp +++ b/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_tile_test.hpp @@ -106,9 +106,9 @@ void ref_tile(const InferenceEngine::Blob::Ptr src, } } -typedef myriadLayerTestBaseWithParam> myriadLayerTestTile_nightly; +typedef myriadLayerTestBaseWithParam> myriadLayerTestTile_smoke; -TEST_P(myriadLayerTestTile_nightly, Tile) { +TEST_P(myriadLayerTestTile_smoke, Tile) { _config[VPU_CONFIG_KEY(DETECT_NETWORK_BATCH)] = CONFIG_VALUE(NO); tile_test::nd_tensor_test_params input_dims = get<0>(GetParam()); diff --git a/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_topk_test.cpp b/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_topk_test.cpp index e31adc85f3a..6f5f795495a 100644 --- a/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_topk_test.cpp +++ b/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_topk_test.cpp @@ -32,7 +32,7 @@ static const std::vector s_sorts_list = // "none", // currently is not supported by firmware }; -INSTANTIATE_TEST_CASE_P(accuracy, myriadTestsTopK_nightly, +INSTANTIATE_TEST_CASE_P(accuracy, myriadTestsTopK_smoke, ::testing::Combine( ::testing::ValuesIn(s_geometries_list), ::testing::ValuesIn(s_modes_list), diff --git a/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_topk_test.hpp b/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_topk_test.hpp index 53baba2e36a..6b589068ed8 100644 --- a/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_topk_test.hpp +++ b/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_topk_test.hpp @@ -32,17 +32,6 @@ static const Precision indexPrecision = Precision::I32; class TopKTest: public myriadLayerTestBaseWithParam { protected: - std::set getExecutedStagesTypes() const { - std::set result; - std::map perfMap; - _inferRequest->GetPerformanceCounts(perfMap, nullptr); - - for (const auto& perf : perfMap) - result.emplace(perf.second.exec_type); - - return result; - } - void testTopK(const IRVersion irVersion, const bool outputValues, const bool outputIndices) { _config[VPU_CONFIG_KEY(DETECT_NETWORK_BATCH)] = CONFIG_VALUE(NO); _config[CONFIG_KEY(PERF_COUNT)] = CONFIG_VALUE(YES); @@ -105,16 +94,6 @@ protected: ASSERT_NO_THROW(st = _inferRequest->Infer(&_resp)); ASSERT_EQ(StatusCode::OK, st) << _resp.msg; - const auto executedTypes = getExecutedStagesTypes(); - - // This logic must be synchronized with TopKStage class. - const bool useArgMaxOptimization = (!outputValues || !outputIndices) - && mode == "max" - && ((sort == "value" && outputValues) || (sort == "index" && outputIndices)); - - ASSERT_EQ(executedTypes.count("ArgMax"), useArgMaxOptimization); - ASSERT_EQ(executedTypes.count("TopK"), !useArgMaxOptimization); - Blob::Ptr outputValuesBlob, outputIndicesBlob; if (outputValues) { ASSERT_NO_THROW(st = _inferRequest->GetBlob("topk.0", outputValuesBlob, &_resp)); @@ -326,26 +305,26 @@ protected: } }; -class myriadTestsTopK_nightly: public TopKTest +class myriadTestsTopK_smoke: public TopKTest { }; -TEST_P(myriadTestsTopK_nightly, TopKv7) +TEST_P(myriadTestsTopK_smoke, TopKv7) { testTopK(IRVersion::v7, true, true); } -TEST_P(myriadTestsTopK_nightly, TopKv10_All) +TEST_P(myriadTestsTopK_smoke, TopKv10_All) { testTopK(IRVersion::v10, true, true); } -TEST_P(myriadTestsTopK_nightly, TopKv10_ArgMaxValues) +TEST_P(myriadTestsTopK_smoke, TopKv10_ArgMaxValues) { testTopK(IRVersion::v10, true, false); } -TEST_P(myriadTestsTopK_nightly, TopKv10_ArgMaxIndices) +TEST_P(myriadTestsTopK_smoke, TopKv10_ArgMaxIndices) { testTopK(IRVersion::v10, false, true); } diff --git a/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_unsqueeze_test.cpp b/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_unsqueeze_test.cpp index 3b254e9610f..78bfc189e9b 100644 --- a/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_unsqueeze_test.cpp +++ b/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_unsqueeze_test.cpp @@ -4,7 +4,7 @@ #include "myriad_layers_unsqueeze_test.hpp" -INSTANTIATE_TEST_CASE_P(accuracy, myriadLayersTestsUnsqueeze, +INSTANTIATE_TEST_CASE_P(accuracy, myriadLayersTestsUnsqueeze_smoke, ::testing::Combine( ::testing::ValuesIn(s_squeezeTensors), ::testing::ValuesIn(s_squeezeIndices) diff --git a/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_unsqueeze_test.hpp b/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_unsqueeze_test.hpp index 2b4ae6d7ab3..71604b149ec 100644 --- a/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_unsqueeze_test.hpp +++ b/inference-engine/tests_deprecated/functional/vpu/common/layers/myriad_layers_unsqueeze_test.hpp @@ -12,7 +12,7 @@ using namespace InferenceEngine; typedef std::vector IndicesVector; -typedef myriadLayerTestBaseWithParam> myriadLayersTestsUnsqueeze; +typedef myriadLayerTestBaseWithParam> myriadLayersTestsUnsqueeze_smoke; static void ref_unsqueeze(const InferenceEngine::Blob::Ptr src, InferenceEngine::Blob::Ptr dst) { @@ -44,7 +44,7 @@ static void ref_unsqueeze(const InferenceEngine::Blob::Ptr src, ie_memcpy(dst_data, dst_size * sizeof(ie_fp16), src_data, src_size * sizeof(ie_fp16)); } -TEST_P (myriadLayersTestsUnsqueeze, Unsqueeze){ +TEST_P(myriadLayersTestsUnsqueeze_smoke, Unsqueeze){ auto input = std::get<0>(GetParam()); auto indices = std::get<1>(GetParam()); diff --git a/inference-engine/tests_deprecated/functional/vpu/vpu_base/myriad_layers_reference_functions.cpp b/inference-engine/tests_deprecated/functional/vpu/vpu_base/myriad_layers_reference_functions.cpp index 27df402e0dd..1aced5f00bb 100644 --- a/inference-engine/tests_deprecated/functional/vpu/vpu_base/myriad_layers_reference_functions.cpp +++ b/inference-engine/tests_deprecated/functional/vpu/vpu_base/myriad_layers_reference_functions.cpp @@ -12,6 +12,7 @@ #include "pool_ref.hpp" #include "ie_memcpy.h" #include +#include #include "common_test_utils/common_layers_params.hpp" #include "vpu/utils/error.hpp" @@ -1034,7 +1035,6 @@ namespace reduceImpl for (int i = 1; i < ndims; ++i) offset = offset * dims[i] + indices[i]; } - return data[offset]; } @@ -1182,55 +1182,65 @@ namespace reduceImpl } } -template<> -void ref_reduce(const Blob::Ptr& in, - const Blob::Ptr& axes, - Blob::Ptr& out, - int keep_dims, - IReduceKernel* op) +template void ref_reduce(const Blob::Ptr& in, + const Blob::Ptr& axes, + Blob::Ptr& out, + int keep_dims, + vpu::LayoutPreference layoutPreference, + IReduceKernel* op); + +template void ref_reduce(const Blob::Ptr& in, + const Blob::Ptr& axes, + Blob::Ptr& out, + int keep_dims, + vpu::LayoutPreference layoutPreference, + IReduceKernel* op); + +template +void ref_reduce(const Blob::Ptr& in, + const Blob::Ptr& axes, + Blob::Ptr& out, + int keep_dims, + vpu::LayoutPreference layoutPreference, + IReduceKernel* op) { ASSERT_NE(in, nullptr); ASSERT_NE(axes, nullptr); ASSERT_NE(out, nullptr); - const int16_t* inData = in->cbuffer().as(); - int16_t* outData = out->buffer().as(); - - ASSERT_NE(inData, nullptr); - ASSERT_NE(outData, nullptr); - const auto axesDims = axes->getTensorDesc().getDims(); ASSERT_EQ(axesDims.size(), 1); const auto axesSize = axesDims[0]; - const int32_t* axesData = axes->cbuffer().as(); - ASSERT_TRUE(!(axesSize > 0) || (axesData != nullptr)); + int32_t* axesData = axes->cbuffer().as(); - reduceImpl::refReduce(in, out, axesSize, axesData, keep_dims, op); -} + if (layoutPreference == vpu::LayoutPreference::ChannelMinor) { + auto inDims = in->getTensorDesc().getDims(); + const auto ndims = inDims.size(); + auto newDims = inDims; -template<> -void ref_reduce(const Blob::Ptr& in, - const Blob::Ptr& axes, - Blob::Ptr& out, - int keep_dims, - IReduceKernel* op) -{ - ASSERT_NE(in, nullptr); - ASSERT_NE(axes, nullptr); - ASSERT_NE(out, nullptr); + const auto dimsOrder = vpu::DimsOrder::fromLayout(in->getTensorDesc().getLayout()); + const auto defPerm = vpu::DimsOrder::fromNumDims(ndims).toPermutation(); - const int32_t* inData = in->cbuffer().as(); - int32_t* outData = out->buffer().as(); + for (int i = 0; i < ndims; ++i) { + auto newInd = ndims - 1 - dimsOrder.dimInd(defPerm[ndims - i - 1]); + newDims[newInd] = inDims[i]; + } - ASSERT_NE(inData, nullptr); - ASSERT_NE(outData, nullptr); + in->getTensorDesc().setDims(newDims); - const auto axesDims = axes->getTensorDesc().getDims(); - ASSERT_EQ(axesDims.size(), 1); + for (int i = 0; i < axesSize; ++i) { + axesData[i] = ndims - 1 - dimsOrder.dimInd(defPerm[ndims - axesData[i] - 1]); + newDims[axesData[i]] = keep_dims ? 1 : 0; + } + + if (!keep_dims) { + newDims.erase(std::remove(newDims.begin(), newDims.end(), 0), newDims.end()); + } + + out->getTensorDesc().setDims(newDims); + } - const auto axesSize = axesDims[0]; - const int32_t* axesData = axes->cbuffer().as(); ASSERT_TRUE(!(axesSize > 0) || (axesData != nullptr)); reduceImpl::refReduce(in, out, axesSize, axesData, keep_dims, op); diff --git a/inference-engine/tests_deprecated/functional/vpu/vpu_base/myriad_layers_reference_functions.hpp b/inference-engine/tests_deprecated/functional/vpu/vpu_base/myriad_layers_reference_functions.hpp index edbbe17dc65..6c8a746f142 100644 --- a/inference-engine/tests_deprecated/functional/vpu/vpu_base/myriad_layers_reference_functions.hpp +++ b/inference-engine/tests_deprecated/functional/vpu/vpu_base/myriad_layers_reference_functions.hpp @@ -9,6 +9,9 @@ #include // std::setw +#include +#include + typedef std::map ParamsStruct; typedef float (*eltwise_kernel)(float a, float b, float c); @@ -273,6 +276,7 @@ void ref_reduce(const InferenceEngine::Blob::Ptr& src, const InferenceEngine::Blob::Ptr& axes, InferenceEngine::Blob::Ptr& dst, int keep_dims, + vpu::LayoutPreference layoutPreference, IReduceKernel* op); void ref_topk(const InferenceEngine::Blob::Ptr& srcValues, diff --git a/inference-engine/tests_deprecated/functional/vpu/vpu_base/vpu_layers_tests.cpp b/inference-engine/tests_deprecated/functional/vpu/vpu_base/vpu_layers_tests.cpp index d58909742ec..81196de0abd 100644 --- a/inference-engine/tests_deprecated/functional/vpu/vpu_base/vpu_layers_tests.cpp +++ b/inference-engine/tests_deprecated/functional/vpu/vpu_base/vpu_layers_tests.cpp @@ -92,6 +92,15 @@ void vpuLayersTests::dumpPerformance() { } } +bool vpuLayersTests::wasCustomLayerInferred() const { + auto perfMap = std::map{}; + _inferRequest->GetPerformanceCounts(perfMap, nullptr); + const auto isCustomLayer = [&](const std::pair& info) { + return !strcmp(info.second.exec_type, "Custom"); + }; + return std::any_of(begin(perfMap), end(perfMap), isCustomLayer); +} + namespace { template @@ -240,7 +249,11 @@ bool vpuLayersTests::Infer() { return false; const auto st = _inferRequest->Infer(&_resp); EXPECT_EQ(InferenceEngine::StatusCode::OK, st) << _resp.msg; - //dumpPerformance(); +// dumpPerformance(); + if (!_config[VPU_CONFIG_KEY(CUSTOM_LAYERS)].empty()) { + EXPECT_TRUE(wasCustomLayerInferred()) + << "CustomBindings.xml has been provided but Custom layer was not inferred"; + } return true; } diff --git a/inference-engine/tests_deprecated/functional/vpu/vpu_base/vpu_layers_tests.hpp b/inference-engine/tests_deprecated/functional/vpu/vpu_base/vpu_layers_tests.hpp index e67d3aea41a..2f4c8d47cb4 100644 --- a/inference-engine/tests_deprecated/functional/vpu/vpu_base/vpu_layers_tests.hpp +++ b/inference-engine/tests_deprecated/functional/vpu/vpu_base/vpu_layers_tests.hpp @@ -69,6 +69,7 @@ protected: void TearDown() override; bool CheckMyriadX(); void dumpPerformance(); + bool wasCustomLayerInferred() const; // For historical reasons, gen-blob functions use to 'hack' blob layout: // replace NCHW with NHWC even if you explicitly setup layout preference diff --git a/inference-engine/tests_deprecated/helpers/CMakeLists.txt b/inference-engine/tests_deprecated/helpers/CMakeLists.txt index 281f2838e7a..1777ac9071c 100644 --- a/inference-engine/tests_deprecated/helpers/CMakeLists.txt +++ b/inference-engine/tests_deprecated/helpers/CMakeLists.txt @@ -37,7 +37,14 @@ function(add_helpers target_name) endfunction() add_helpers(${TARGET_NAME}) + target_link_libraries(${TARGET_NAME} PUBLIC commonTestUtils) add_helpers(${TARGET_NAME}_s USE_STATIC_IE) + target_link_libraries(${TARGET_NAME}_s PUBLIC commonTestUtils_s) + +if (ENABLE_DATA) + add_dependencies(${TARGET_NAME} data) + add_dependencies(${TARGET_NAME}_s data) +endif() diff --git a/inference-engine/tests_deprecated/helpers/single_layer_common.hpp b/inference-engine/tests_deprecated/helpers/single_layer_common.hpp index 622af44e8b3..7b23da41a5c 100644 --- a/inference-engine/tests_deprecated/helpers/single_layer_common.hpp +++ b/inference-engine/tests_deprecated/helpers/single_layer_common.hpp @@ -5,6 +5,7 @@ #pragma once #include +#include #include #include #include @@ -75,9 +76,8 @@ struct MapStrStr { }; template -inline InferenceEngine::details::CNNNetworkImplPtr -buildSingleLayerNetworkCommon(InferenceEngine::details::IFormatParser *parser, - const std::string &layerType, +inline InferenceEngine::CNNNetwork +buildSingleLayerNetworkCommon(const std::string &layerType, const CommonTestUtils::InOutShapes &inOutShapes, std::map *params, const std::string &layerDataName = "data", @@ -85,8 +85,6 @@ buildSingleLayerNetworkCommon(InferenceEngine::details::IFormatParser *parser, size_t weightsSize = 0, size_t biasesSize = 0, const InferenceEngine::TBlob::Ptr &weights = nullptr) { - IE_ASSERT(parser); - testing::XMLHelper xmlHelper(parser); std::string precisionStr = precision.name(); auto netBuilder = CommonTestUtils::XmlNetBuilder::buildNetworkWithOneInput("Mock", inOutShapes.inDims[0], precisionStr); @@ -105,10 +103,9 @@ buildSingleLayerNetworkCommon(InferenceEngine::details::IFormatParser *parser, } else { testContent = netBuilder.finish(); } - xmlHelper.loadContent(testContent); - auto result = xmlHelper.parseWithReturningNetwork(); - if (weights) xmlHelper.setWeights(weights); - return result; + + InferenceEngine::Core ie; + return ie.ReadNetwork(testContent, weights); } void GenRandomDataCommon(InferenceEngine::Blob::Ptr blob); diff --git a/inference-engine/tests_deprecated/helpers/tests_utils.hpp b/inference-engine/tests_deprecated/helpers/tests_utils.hpp deleted file mode 100644 index eed7e142a68..00000000000 --- a/inference-engine/tests_deprecated/helpers/tests_utils.hpp +++ /dev/null @@ -1,26 +0,0 @@ -// Copyright (C) 2018-2020 Intel Corporation -// SPDX-License-Identifier: Apache-2.0 -// - -/** -* \brief TODO: short file description -* \file file_utils.h -*/ -#pragma once - -#include -#include - -namespace { - bool strContains(const std::string & str, const std::string & substr) { - return str.find(substr) != std::string::npos; - } - bool strDoesnotContain(const std::string & str, const std::string & substr) { - (void)strDoesnotContain; // to overcome unused warning - return !strContains(str, substr); - } -} - -#define ASSERT_STR_CONTAINS(str, substr) ASSERT_PRED2(&strContains, str, substr) -#define ASSERT_STR_DOES_NOT_CONTAIN(str, substr) ASSERT_PRED2 (&strDoesnotContain, str, substr) -#define EXPECT_STR_CONTAINS(str, substr) EXPECT_PRED2(&strContains, str, substr) \ No newline at end of file diff --git a/inference-engine/tests_deprecated/mock_engine/mock_plugin.cpp b/inference-engine/tests_deprecated/mock_engine/mock_plugin.cpp index 2012c8b15af..ae2ee0117ab 100644 --- a/inference-engine/tests_deprecated/mock_engine/mock_plugin.cpp +++ b/inference-engine/tests_deprecated/mock_engine/mock_plugin.cpp @@ -37,6 +37,7 @@ void MockPlugin::SetLogCallback(InferenceEngine::IErrorListener &listener) noexc } void MockPlugin::GetVersion(const Version *&versionInfo) noexcept { + versionInfo = &version; } StatusCode MockPlugin::AddExtension(IExtensionPtr extension, InferenceEngine::ResponseDesc *resp) noexcept { diff --git a/inference-engine/tests_deprecated/mock_engine/mock_plugin.hpp b/inference-engine/tests_deprecated/mock_engine/mock_plugin.hpp index c6e38f6c8fc..abf793431de 100644 --- a/inference-engine/tests_deprecated/mock_engine/mock_plugin.hpp +++ b/inference-engine/tests_deprecated/mock_engine/mock_plugin.hpp @@ -14,6 +14,7 @@ IE_SUPPRESS_DEPRECATED_START class MockPlugin : public InferenceEngine::IInferencePlugin { InferenceEngine::IInferencePlugin * _target = nullptr; + InferenceEngine::Version version; public: explicit MockPlugin(InferenceEngine::IInferencePlugin*target); diff --git a/inference-engine/tests_deprecated/unit/CMakeLists.txt b/inference-engine/tests_deprecated/unit/CMakeLists.txt index dac4a97d0d7..0f6a70005f2 100644 --- a/inference-engine/tests_deprecated/unit/CMakeLists.txt +++ b/inference-engine/tests_deprecated/unit/CMakeLists.txt @@ -167,7 +167,7 @@ if(CMAKE_CXX_COMPILER_ID STREQUAL "GNU") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fuse-ld=gold") endif() -add_test(NAME ${TARGET_NAME} - COMMAND ${TARGET_NAME}) +add_test(NAME ${TARGET_NAME} COMMAND ${TARGET_NAME}) +set_property(TEST ${TARGET_NAME} PROPERTY LABELS IE) add_dependencies(${TARGET_NAME} mock_engine) diff --git a/inference-engine/tests_deprecated/unit/cnn_network/cnn_net_reader_impl_test.cpp b/inference-engine/tests_deprecated/unit/cnn_network/cnn_net_reader_impl_test.cpp index 1ffba477fa8..7c940a6fe06 100644 --- a/inference-engine/tests_deprecated/unit/cnn_network/cnn_net_reader_impl_test.cpp +++ b/inference-engine/tests_deprecated/unit/cnn_network/cnn_net_reader_impl_test.cpp @@ -3,7 +3,6 @@ // #include -#include #include #include #include "cnn_network_impl.hpp" diff --git a/inference-engine/tests_deprecated/unit/engines/vpu/eliminate_copy_tests.cpp b/inference-engine/tests_deprecated/unit/engines/vpu/eliminate_copy_tests.cpp index eeccb27c3aa..6fa314b58c5 100644 --- a/inference-engine/tests_deprecated/unit/engines/vpu/eliminate_copy_tests.cpp +++ b/inference-engine/tests_deprecated/unit/engines/vpu/eliminate_copy_tests.cpp @@ -89,6 +89,6 @@ TEST_F(VPU_EliminateCopyTest, OneInputTwoConcats) { ASSERT_EQ(hwOutput->parentData(), outputCopy1); ASSERT_EQ(hwOutput->numConsumers(), 2); - ASSERT_TRUE(contains(hwOutput->consumers(), [](const Stage& stage) { return stage->type() == StageType::Concat; })); + ASSERT_TRUE(contains(hwOutput->consumers(), [](const Stage& stage) { return stage->type() == StageType::StubConcat; })); ASSERT_TRUE(contains(hwOutput->consumers(), [](const Stage& stage) { return stage->type() == StageType::Copy; })); } diff --git a/inference-engine/tests_deprecated/unit/graph_tools/graph_copy_tests.cpp b/inference-engine/tests_deprecated/unit/graph_tools/graph_copy_tests.cpp index 21370f4d68d..0541458b06d 100644 --- a/inference-engine/tests_deprecated/unit/graph_tools/graph_copy_tests.cpp +++ b/inference-engine/tests_deprecated/unit/graph_tools/graph_copy_tests.cpp @@ -4,7 +4,7 @@ #include #include -#include "test_assertions.hpp" +#include #include #include #include diff --git a/inference-engine/tests_deprecated/unit/inference_engine_tests/cnn_network_test.cpp b/inference-engine/tests_deprecated/unit/inference_engine_tests/cnn_network_test.cpp index f9ed79c1289..a3efb8944de 100644 --- a/inference-engine/tests_deprecated/unit/inference_engine_tests/cnn_network_test.cpp +++ b/inference-engine/tests_deprecated/unit/inference_engine_tests/cnn_network_test.cpp @@ -7,19 +7,69 @@ using namespace InferenceEngine; -class CNNNetworkTests : public ::testing::Test { -protected: - virtual void TearDown() { - } - - virtual void SetUp() { - } - -public: - -}; +using CNNNetworkTests = ::testing::Test; TEST_F(CNNNetworkTests, throwsOnInitWithNull) { std::shared_ptr nlptr = nullptr; ASSERT_THROW(CNNNetwork network(nlptr), InferenceEngine::details::InferenceEngineException); } + +TEST_F(CNNNetworkTests, throwsOnInitWithNullNgraph) { + std::shared_ptr nlptr = nullptr; + ASSERT_THROW(CNNNetwork network(nlptr), InferenceEngine::details::InferenceEngineException); +} + +TEST_F(CNNNetworkTests, throwsOnUninitializedGetPrecision) { + CNNNetwork network; + ASSERT_THROW(network.getPrecision(), InferenceEngine::details::InferenceEngineException); +} + +TEST_F(CNNNetworkTests, throwsOnUninitializedGetOutputsInfo) { + CNNNetwork network; + ASSERT_THROW(network.getOutputsInfo(), InferenceEngine::details::InferenceEngineException); +} + +TEST_F(CNNNetworkTests, throwsOnUninitializedGetInputsInfo) { + CNNNetwork network; + ASSERT_THROW(network.getInputsInfo(), InferenceEngine::details::InferenceEngineException); +} + +TEST_F(CNNNetworkTests, throwsOnUninitializedLayerCount) { + CNNNetwork network; + ASSERT_THROW(network.layerCount(), InferenceEngine::details::InferenceEngineException); +} + +TEST_F(CNNNetworkTests, throwsOnUninitializedGetName) { + CNNNetwork network; + ASSERT_THROW(network.getName(), InferenceEngine::details::InferenceEngineException); +} + +TEST_F(CNNNetworkTests, throwsOnUninitializedCastToICNNNetwork) { + CNNNetwork network; + ASSERT_THROW(auto & net = static_cast(network), InferenceEngine::details::InferenceEngineException); +} + +TEST_F(CNNNetworkTests, throwsOnConstUninitializedCastToICNNNetwork) { + const CNNNetwork network; + ASSERT_THROW(const auto & net = static_cast(network), InferenceEngine::details::InferenceEngineException); +} + +TEST_F(CNNNetworkTests, throwsOnUninitializedGetFunction) { + CNNNetwork network; + ASSERT_THROW(network.getFunction(), InferenceEngine::details::InferenceEngineException); +} + +TEST_F(CNNNetworkTests, throwsOnConstUninitializedGetFunction) { + const CNNNetwork network; + ASSERT_THROW(network.getFunction(), InferenceEngine::details::InferenceEngineException); +} + +TEST_F(CNNNetworkTests, throwsOnConstUninitializedBegin) { + CNNNetwork network; + ASSERT_THROW(network.getFunction(), InferenceEngine::details::InferenceEngineException); +} + +TEST_F(CNNNetworkTests, throwsOnConstUninitializedGetInputShapes) { + CNNNetwork network; + ASSERT_THROW(network.getInputShapes(), InferenceEngine::details::InferenceEngineException); +} diff --git a/inference-engine/tests_deprecated/unit/inference_engine_tests/cpp_interfaces/async_infer_request_tests.cpp b/inference-engine/tests_deprecated/unit/inference_engine_tests/cpp_interfaces/async_infer_request_tests.cpp index d26ba87d372..311cc34e229 100644 --- a/inference-engine/tests_deprecated/unit/inference_engine_tests/cpp_interfaces/async_infer_request_tests.cpp +++ b/inference-engine/tests_deprecated/unit/inference_engine_tests/cpp_interfaces/async_infer_request_tests.cpp @@ -291,3 +291,76 @@ TEST_F(InferRequestTests, failToSetInputWithEmptyDimensions) { auto exceptionMessage = getExceptionMessage([&]() { InferRequest->SetInput(blobMap); }); ASSERT_EQ(_inputDataIsEmptyError, exceptionMessage.substr(0, _inputDataIsEmptyError.size())); } + +using InferRequestCPPTests = ::testing::Test; + +TEST_F(InferRequestCPPTests, throwsOnInitWithNull) { + IInferRequest::Ptr nlptr = nullptr; + ASSERT_THROW(InferRequest req(nlptr), InferenceEngine::details::InferenceEngineException); +} + +TEST_F(InferRequestCPPTests, throwsOnUninitializedSetBlob) { + InferRequest req; + ASSERT_THROW(req.SetBlob({}, {}), InferenceEngine::details::InferenceEngineException); +} + +TEST_F(InferRequestCPPTests, throwsOnUninitializedGetBlob) { + InferRequest req; + ASSERT_THROW(req.GetBlob({}), InferenceEngine::details::InferenceEngineException); +} + +TEST_F(InferRequestCPPTests, throwsOnUninitializedSetBlobPreproc) { + InferRequest req; + ASSERT_THROW(req.SetBlob({}, {}, {}), InferenceEngine::details::InferenceEngineException); +} + +TEST_F(InferRequestCPPTests, throwsOnUninitializedGetPreProcess) { + InferRequest req; + ASSERT_THROW(req.GetPreProcess({}), InferenceEngine::details::InferenceEngineException); +} + +TEST_F(InferRequestCPPTests, throwsOnUninitializedInfer) { + InferRequest req; + ASSERT_THROW(req.Infer(), InferenceEngine::details::InferenceEngineException); +} + +TEST_F(InferRequestCPPTests, throwsOnUninitializedGetPerformanceCounts) { + InferRequest req; + ASSERT_THROW(req.GetPerformanceCounts(), InferenceEngine::details::InferenceEngineException); +} + +TEST_F(InferRequestCPPTests, throwsOnUninitializedSetInput) { + InferRequest req; + ASSERT_THROW(req.SetInput({{}}), InferenceEngine::details::InferenceEngineException); +} + +TEST_F(InferRequestCPPTests, throwsOnUninitializedSetOutput) { + InferRequest req; + ASSERT_THROW(req.SetOutput({{}}), InferenceEngine::details::InferenceEngineException); +} + +TEST_F(InferRequestCPPTests, throwsOnUninitializedSetBatch) { + InferRequest req; + ASSERT_THROW(req.SetBatch({}), InferenceEngine::details::InferenceEngineException); +} + +TEST_F(InferRequestCPPTests, throwsOnUninitializedStartAsync) { + InferRequest req; + ASSERT_THROW(req.StartAsync(), InferenceEngine::details::InferenceEngineException); +} + +TEST_F(InferRequestCPPTests, throwsOnUninitializedWait) { + InferRequest req; + ASSERT_THROW(req.Wait({}), InferenceEngine::details::InferenceEngineException); +} + +TEST_F(InferRequestCPPTests, throwsOnUninitializedSetCompletionCallback) { + InferRequest req; + std::function f; + ASSERT_THROW(req.SetCompletionCallback(f), InferenceEngine::details::InferenceEngineException); +} + +TEST_F(InferRequestCPPTests, throwsOnUninitializedCast) { + InferRequest req; + ASSERT_THROW(auto & ireq = static_cast(req), InferenceEngine::details::InferenceEngineException); +} diff --git a/inference-engine/tests_deprecated/unit/inference_engine_tests/cpp_interfaces/executable_network_base_tests.cpp b/inference-engine/tests_deprecated/unit/inference_engine_tests/cpp_interfaces/executable_network_base_tests.cpp index 35b60936d66..10c97f8856e 100644 --- a/inference-engine/tests_deprecated/unit/inference_engine_tests/cpp_interfaces/executable_network_base_tests.cpp +++ b/inference-engine/tests_deprecated/unit/inference_engine_tests/cpp_interfaces/executable_network_base_tests.cpp @@ -66,3 +66,65 @@ TEST_F(ExecutableNetworkBaseTests, canCatchUnknownErrorInExport) { EXPECT_CALL(*mock_impl.get(), Export(_)).WillOnce(Throw(5)); ASSERT_EQ(UNEXPECTED, exeNetwork->Export({}, nullptr)); } + +using ExecutableNetworkTests = ::testing::Test; + +TEST_F(ExecutableNetworkTests, throwsOnInitWithNull) { + std::shared_ptr nlptr = nullptr; + ASSERT_THROW(ExecutableNetwork exec(nlptr), InferenceEngine::details::InferenceEngineException); +} + +TEST_F(ExecutableNetworkTests, throwsOnUninitializedGetOutputsInfo) { + ExecutableNetwork exec; + ASSERT_THROW(exec.GetOutputsInfo(), InferenceEngine::details::InferenceEngineException); +} + +TEST_F(ExecutableNetworkTests, throwsOnUninitializedGetInputsInfo) { + ExecutableNetwork exec; + ASSERT_THROW(exec.GetInputsInfo(), InferenceEngine::details::InferenceEngineException); +} + +TEST_F(ExecutableNetworkTests, throwsOnUninitializedExport) { + ExecutableNetwork exec; + ASSERT_THROW(exec.Export(std::string()), InferenceEngine::details::InferenceEngineException); +} + +TEST_F(ExecutableNetworkTests, throwsOnUninitializedExportStream) { + ExecutableNetwork exec; + ASSERT_THROW(exec.Export(std::cout), InferenceEngine::details::InferenceEngineException); +} + +TEST_F(ExecutableNetworkTests, nothrowsOnUninitializedCast) { + ExecutableNetwork exec; + ASSERT_NO_THROW(auto & enet = static_cast(exec)); +} + +TEST_F(ExecutableNetworkTests, throwsOnUninitializedGetExecGraphInfo) { + ExecutableNetwork exec; + ASSERT_THROW(exec.GetExecGraphInfo(), InferenceEngine::details::InferenceEngineException); +} + +TEST_F(ExecutableNetworkTests, throwsOnUninitializedQueryState) { + ExecutableNetwork exec; + ASSERT_THROW(exec.QueryState(), InferenceEngine::details::InferenceEngineException); +} + +TEST_F(ExecutableNetworkTests, throwsOnUninitializedSetConfig) { + ExecutableNetwork exec; + ASSERT_THROW(exec.SetConfig({{}}), InferenceEngine::details::InferenceEngineException); +} + +TEST_F(ExecutableNetworkTests, throwsOnUninitializedGetConfig) { + ExecutableNetwork exec; + ASSERT_THROW(exec.GetConfig({}), InferenceEngine::details::InferenceEngineException); +} + +TEST_F(ExecutableNetworkTests, throwsOnUninitializedGetMetric) { + ExecutableNetwork exec; + ASSERT_THROW(exec.GetMetric({}), InferenceEngine::details::InferenceEngineException); +} + +TEST_F(ExecutableNetworkTests, throwsOnUninitializedGetContext) { + ExecutableNetwork exec; + ASSERT_THROW(exec.GetContext(), InferenceEngine::details::InferenceEngineException); +} diff --git a/inference-engine/tests_deprecated/unit/inference_engine_tests/cpp_interfaces/iinference_plugin_internal_tests.cpp b/inference-engine/tests_deprecated/unit/inference_engine_tests/cpp_interfaces/iinference_plugin_internal_tests.cpp index de0694f1201..43981f740e9 100644 --- a/inference-engine/tests_deprecated/unit/inference_engine_tests/cpp_interfaces/iinference_plugin_internal_tests.cpp +++ b/inference-engine/tests_deprecated/unit/inference_engine_tests/cpp_interfaces/iinference_plugin_internal_tests.cpp @@ -61,7 +61,7 @@ protected: mockNotEmptyNet.getOutputsInfo(outputsInfo); mockInferRequestInternal = make_shared(inputsInfo, outputsInfo); mockExeNetworkTS = make_shared(); - EXPECT_CALL(*mock_plugin_impl.get(), LoadExeNetworkImpl(_, _, _)).WillOnce(Return(mockExeNetworkTS)); + EXPECT_CALL(*mock_plugin_impl.get(), LoadExeNetworkImpl(_, _)).WillOnce(Return(mockExeNetworkTS)); EXPECT_CALL(*mockExeNetworkTS.get(), CreateInferRequestImpl(_, _)).WillOnce(Return(mockInferRequestInternal)); sts = plugin->LoadNetwork(exeNetwork, mockNotEmptyNet, {}, &dsc); ASSERT_EQ((int) StatusCode::OK, sts) << dsc.msg; diff --git a/inference-engine/tests_deprecated/unit/inference_engine_tests/cpp_interfaces/plugin_base_tests.cpp b/inference-engine/tests_deprecated/unit/inference_engine_tests/cpp_interfaces/plugin_base_tests.cpp index 9e457836c04..a63acb4b7e6 100644 --- a/inference-engine/tests_deprecated/unit/inference_engine_tests/cpp_interfaces/plugin_base_tests.cpp +++ b/inference-engine/tests_deprecated/unit/inference_engine_tests/cpp_interfaces/plugin_base_tests.cpp @@ -5,6 +5,7 @@ #include #include #include +#include #include "cpp_interfaces/base/ie_plugin_base.hpp" #include "unit_test_utils/mocks/cpp_interfaces/mock_plugin_impl.hpp" @@ -84,3 +85,42 @@ TEST_F(PluginBaseTests, canCatchUnknownErrorInSetConfig) { const std::map config; ASSERT_EQ(UNEXPECTED, plugin->SetConfig(config, nullptr)); } + +using InferencePluginTests = testing::Test; + +TEST_F(InferencePluginTests, throwsOnNullptrCreation) { + InferenceEnginePluginPtr nulptr; + InferencePlugin plugin; + ASSERT_THROW(plugin = InferencePlugin(nulptr), details::InferenceEngineException); +} + +TEST_F(InferencePluginTests, throwsOnUninitializedGetVersion) { + InferencePlugin plg; + ASSERT_THROW(plg.GetVersion(), details::InferenceEngineException); +} + +TEST_F(InferencePluginTests, throwsOnUninitializedLoadNetwork) { + InferencePlugin plg; + QueryNetworkResult r; + ASSERT_THROW(plg.LoadNetwork(CNNNetwork(), {}), details::InferenceEngineException); +} + +TEST_F(InferencePluginTests, throwsOnUninitializedImportNetwork) { + InferencePlugin plg; + ASSERT_THROW(plg.ImportNetwork({}, {}), details::InferenceEngineException); +} + +TEST_F(InferencePluginTests, throwsOnUninitializedAddExtension) { + InferencePlugin plg; + ASSERT_THROW(plg.AddExtension(IExtensionPtr()), details::InferenceEngineException); +} + +TEST_F(InferencePluginTests, throwsOnUninitializedSetConfig) { + InferencePlugin plg; + ASSERT_THROW(plg.SetConfig({{}}), details::InferenceEngineException); +} + +TEST_F(InferencePluginTests, nothrowsUninitializedCast) { + InferencePlugin plg; + ASSERT_NO_THROW(auto plgPtr = static_cast(plg)); +} diff --git a/inference-engine/tests_deprecated/unit/inference_engine_tests/locked_memory_test.cpp b/inference-engine/tests_deprecated/unit/inference_engine_tests/locked_memory_test.cpp index 31cd97885e9..6eccab9dde4 100644 --- a/inference-engine/tests_deprecated/unit/inference_engine_tests/locked_memory_test.cpp +++ b/inference-engine/tests_deprecated/unit/inference_engine_tests/locked_memory_test.cpp @@ -5,23 +5,13 @@ #include "tests_common.hpp" #include "unit_test_utils/mocks/mock_allocator.hpp" -using namespace std; - -class LockedMemoryTest : public TestsCommon { -protected: - unique_ptr createMockAllocator() { - return unique_ptr(new MockAllocator()); - } -}; - using namespace InferenceEngine; using namespace ::testing; +using LockedMemoryTest = testing::Test; TEST_F(LockedMemoryTest, canUnlockMemoryAfterUsage) { - - auto allocator = createMockAllocator(); - + std::unique_ptr allocator(new MockAllocator()); char array [] = {1,2,3}; EXPECT_CALL(*allocator.get(), lock((void*)1, _)).WillRepeatedly(Return((void*)array)); @@ -34,11 +24,8 @@ TEST_F(LockedMemoryTest, canUnlockMemoryAfterUsage) { } } - TEST_F(LockedMemoryTest, canReadFromLockedMemory) { - - auto allocator = createMockAllocator(); - + std::unique_ptr allocator(new MockAllocator()); char array [] = {1,2,3,4,5}; EXPECT_CALL(*allocator.get(), lock((void*)1, _)).WillRepeatedly(Return((void*)array)); @@ -50,11 +37,8 @@ TEST_F(LockedMemoryTest, canReadFromLockedMemory) { } } - TEST_F(LockedMemoryTest, canWriteToLockedMemory) { - - auto allocator = createMockAllocator(); - + std::unique_ptr allocator(new MockAllocator()); char array [] = {1,2,3,4,5}; EXPECT_CALL(*allocator.get(), lock((void*)1, _)).WillRepeatedly(Return((void*)array)); diff --git a/inference-engine/thirdparty/clDNN/api/tensor.hpp b/inference-engine/thirdparty/clDNN/api/tensor.hpp index b662f018951..cc2ddec47ca 100644 --- a/inference-engine/thirdparty/clDNN/api/tensor.hpp +++ b/inference-engine/thirdparty/clDNN/api/tensor.hpp @@ -184,6 +184,7 @@ struct format { g_os_iyx_osv16, ///< format used for weights for 2D convolution g_os_iyx_osv32, ///< format used for weights for 2D convolution gs_oiyx_gsv16, ///< format used for weights for 2D convolution + gs_oizyx_gsv16, ///< format used for weights for 3D convolution gs_oiyx_gsv32, ///< format used for weights for 2D convolution g_is_os_zyx_osv16_isv16, ///< format used for grouped weights for blocked 3D deconvolution g_os_is_yx_osv16_isv4, @@ -191,6 +192,12 @@ struct format { g_os_is_zyx_isv8_osv16_isv2, g_os_is_yx_isv8_osv16_isv2, g_os_is_zyx_isv16_osv16, + g_os_zyx_is_osv16_isv4, ///< format for imad deconvolution + g_os_zyx_is_osv16_isv16, ///< format for imad deconvolution + g_os_zyx_is_osv16_isv32, ///< format for imad deconvolution + g_os_zyx_is_osv32_isv4, ///< format for imad deconvolution + g_os_zyx_is_osv32_isv16, ///< format for imad deconvolution + g_os_zyx_is_osv32_isv32, ///< format for imad deconvolution format_num, ///< number of format types any = -1 @@ -264,6 +271,7 @@ struct format { { os_is_yx_osv32_isv32p, { 1, 1, 1, 0, 0, "bfxy", "bfxy?", {}}}, { os_is_zyx_isv16_osv16, { 1, 1, 3, 0, 0, "bfzyx", "bfxyz", {{0, 16}, {1, 16}}}}, { is_os_zyx_osv16_isv16, { 1, 1, 3, 0, 0, "fbzyx", "bfxyz", {{0, 16}, {1, 16}}}}, + { is_os_yx_osv16_isv16, { 1, 1, 2, 0, 0, "fbyx", "bfxyz", {{0, 16}, {1, 16}}}}, { os_is_osv32_isv32_swizzled_by_4, { 1, 1, 0, 0, 0, "bfxy", "bfxy?", {{0, 32}, {1, 32}}}}, { os_is_zyx_isv8_osv16_isv2, { 1, 1, 3, 0, 0, "bfzyx", "bfxyz", {{1, 8}, {0, 16}, {1, 2}}}}, { os_zyxi_osv16, { 1, 1, 3, 0, 0, "bzyxf", "bfxyz", {{0, 16}}}}, @@ -275,6 +283,7 @@ struct format { { g_os_iyx_osv16, { 1, 1, 2, 0, 1, "gbfyx", "bfxy????g", {{0, 16}}}}, { g_os_iyx_osv32, { 1, 1, 2, 0, 1, "gbfyx", "bfxy????g", {{0, 32}}}}, { gs_oiyx_gsv16, { 1, 1, 2, 0, 1, "gbfyx", "bfxy????g", {{8, 16}}}}, + { gs_oizyx_gsv16, { 1, 1, 3, 0, 1, "gbfzyx", "bfxyz???g", {{8, 16}}}}, { gs_oiyx_gsv32, { 1, 1, 2, 0, 1, "gbfyx", "bfxy????g", {{8, 32}}}}, { gyxio, { 1, 1, 2, 0, 1, "gyxfb", "bfxy????g", {}}}, { g_is_os_zyx_osv16_isv16, { 1, 1, 3, 0, 1, "gfbzyx", "bfxyz???g", {{0, 16}, {1, 16}}}}, @@ -283,6 +292,12 @@ struct format { { g_os_is_yx_isv8_osv16_isv2, { 1, 1, 2, 0, 1, "gbfyx", "bfxy????g", {{1, 8}, {0, 16}, {1, 2}}}}, { g_os_is_zyx_isv16_osv16, { 1, 1, 3, 0, 1, "gbfzyx", "bfxyz???g", {{0, 16}, {1, 16}}}}, { g_os_is_yx_osv16_isv4, { 1, 1, 2, 0, 1, "gbfxy", "bfxy????g", {{0, 16}, {1, 4}}}}, + { g_os_zyx_is_osv16_isv4, { 1, 1, 3, 0, 1, "gbzyxi", "bfxyz???g", {{0, 16}, {1, 4}}}}, + { g_os_zyx_is_osv16_isv16, { 1, 1, 3, 0, 1, "gbzyxi", "bfxyz???g", {{0, 16}, {1, 16}}}}, + { g_os_zyx_is_osv16_isv32, { 1, 1, 3, 0, 1, "gbzyxi", "bfxyz???g", {{0, 16}, {1, 32}}}}, + { g_os_zyx_is_osv32_isv4, { 1, 1, 3, 0, 1, "gbzyxi", "bfxyz???g", {{0, 32}, {1, 4}}}}, + { g_os_zyx_is_osv32_isv16, { 1, 1, 3, 0, 1, "gbzyxi", "bfxyz???g", {{0, 32}, {1, 16}}}}, + { g_os_zyx_is_osv32_isv32, { 1, 1, 3, 0, 1, "gbzyxi", "bfxyz???g", {{0, 32}, {1, 32}}}}, }; return traits.at(fmt); } diff --git a/inference-engine/thirdparty/clDNN/kernel_selector/common/tensor_type.cpp b/inference-engine/thirdparty/clDNN/kernel_selector/common/tensor_type.cpp index cb29d22ff95..02ade1b5b6d 100644 --- a/inference-engine/thirdparty/clDNN/kernel_selector/common/tensor_type.cpp +++ b/inference-engine/thirdparty/clDNN/kernel_selector/common/tensor_type.cpp @@ -129,6 +129,12 @@ WeightsTensor::WeightsChannelArray WeightsTensor::weightsChannelArray {{ { WeightsLayout::gs_oi_yxs_gsv16_yxsv4, { 0, 1, -1, 2, 3, -1, -1, 4 } }, { WeightsLayout::gs_oi_yxs_gsv32_yxsv4, { 0, 1, -1, 2, 3, -1, -1, 4 } }, { WeightsLayout::g_os_is_yx_osv16_isv4, { 0, 1, -1, 2, 3, -1, -1, 4 } }, + { WeightsLayout::g_os_zyx_is_osv16_isv4, { 1, 2, 3, 0, 4, -1, -1, 5 } }, + { WeightsLayout::g_os_zyx_is_osv16_isv16, { 1, 2, 3, 0, 4, -1, -1, 5 } }, + { WeightsLayout::g_os_zyx_is_osv16_isv32, { 1, 2, 3, 0, 4, -1, -1, 5 } }, + { WeightsLayout::g_os_zyx_is_osv32_isv4, { 1, 2, 3, 0, 4, -1, -1, 5 } }, + { WeightsLayout::g_os_zyx_is_osv32_isv16, { 1, 2, 3, 0, 4, -1, -1, 5 } }, + { WeightsLayout::g_os_zyx_is_osv32_isv32, { 1, 2, 3, 0, 4, -1, -1, 5 } }, }}; NDims DataTensor::GetSimpleDims(const std::vector& d, DataLayout l) { @@ -638,6 +644,30 @@ NDims WeightsTensor::GetSimpleDims(const std::vector& d, WeightsLayout l newDims[2] = RoundUp(newDims[2], 4); newDims[3] = RoundUp(newDims[3], 16); break; + case g_os_zyx_is_osv16_isv4: + newDims[0] = RoundUp(newDims[0], 4); + newDims[4] = RoundUp(newDims[4], 16); + break; + case g_os_zyx_is_osv16_isv16: + newDims[0] = RoundUp(newDims[0], 16); + newDims[4] = RoundUp(newDims[4], 16); + break; + case g_os_zyx_is_osv16_isv32: + newDims[0] = RoundUp(newDims[0], 32); + newDims[4] = RoundUp(newDims[4], 16); + break; + case g_os_zyx_is_osv32_isv4: + newDims[0] = RoundUp(newDims[0], 4); + newDims[4] = RoundUp(newDims[4], 32); + break; + case g_os_zyx_is_osv32_isv16: + newDims[0] = RoundUp(newDims[0], 16); + newDims[4] = RoundUp(newDims[4], 32); + break; + case g_os_zyx_is_osv32_isv32: + newDims[0] = RoundUp(newDims[0], 32); + newDims[4] = RoundUp(newDims[4], 32); + break; default: break; } @@ -760,6 +790,12 @@ WeightsTensor WeightsTensor::TransformIgnorePadding(WeightsLayout l, WeightsType vec[Channelndex(l, WeightsChannelName::OFM)] = OFM().v; vec[Channelndex(l, WeightsChannelName::LX)] = LX().v; vec[Channelndex(l, WeightsChannelName::LY)] = LY().v; + } else if (src_channels == 4 && dst_channels == 5) { + vec[Channelndex(l, WeightsChannelName::X)] = X().v; + vec[Channelndex(l, WeightsChannelName::Y)] = Y().v; + vec[Channelndex(l, WeightsChannelName::Z)] = 1; + vec[Channelndex(l, WeightsChannelName::IFM)] = IFM().v; + vec[Channelndex(l, WeightsChannelName::OFM)] = OFM().v; } else { assert(0); } diff --git a/inference-engine/thirdparty/clDNN/kernel_selector/common/tensor_type.h b/inference-engine/thirdparty/clDNN/kernel_selector/common/tensor_type.h index 4932bbcec4b..7b7064fe2ed 100644 --- a/inference-engine/thirdparty/clDNN/kernel_selector/common/tensor_type.h +++ b/inference-engine/thirdparty/clDNN/kernel_selector/common/tensor_type.h @@ -147,6 +147,14 @@ enum WeightsLayout { gs_oi_yxs_gsv32_yxsv4, // grouped weights for depthwise IMAD convolution (b_fs_yx_fsv32 format) g_os_is_yx_osv16_isv4, + + g_os_zyx_is_osv16_isv4, + g_os_zyx_is_osv16_isv16, + g_os_zyx_is_osv16_isv32, + g_os_zyx_is_osv32_isv4, + g_os_zyx_is_osv32_isv16, + g_os_zyx_is_osv32_isv32, + WeightsLayoutCount // NUMBER OF ELEMENTS IN ENUM }; @@ -212,32 +220,7 @@ inline bool SimpleLayout(DataLayout l) { } } -inline bool GroupedLayout(WeightsLayout l) { - switch (l) { - case WeightsLayout::goiyx: - case WeightsLayout::goizyx: - case WeightsLayout::g_os_iyx_osv16: - case WeightsLayout::g_os_iyx_osv32: - case WeightsLayout::gs_oiyx_gsv16: - case WeightsLayout::gs_oizyx_gsv16: - case WeightsLayout::gs_oiyx_gsv32: - case WeightsLayout::g_os_iyx_osv16_rotate_180: - case WeightsLayout::gyxio: - case WeightsLayout::gi_yxs_os_yxsv2_osv16: - case WeightsLayout::g_is_os_zyx_osv16_isv16: - case WeightsLayout::g_is_os_yx_osv16_isv16: - case WeightsLayout::g_os_is_zyx_isv8_osv16_isv2: - case WeightsLayout::g_os_is_yx_isv8_osv16_isv2: - case WeightsLayout::g_os_is_zyx_isv16_osv16: - case WeightsLayout::giy_xs_os_xsv2_osv16__ao32: - case WeightsLayout::giy_xs_os_xsv2_osv8__ao32: - case WeightsLayout::gs_oi_yxs_gsv4_yxsv4: - case WeightsLayout::g_os_is_yx_osv16_isv4: - return true; - default: - return false; - } -} +inline bool GroupedLayout(WeightsLayout l); inline bool GroupedLayout(DataLayout) { return false; @@ -588,5 +571,10 @@ private: static WeightsChannelArray weightsChannelArray; static NDims GetSimpleDims(const std::vector& d, WeightsLayout l); }; + +inline bool GroupedLayout(WeightsLayout l) { + return WeightsTensor::DoesGroupDimExist(l); +} + } // namespace Tensor } // namespace kernel_selector diff --git a/inference-engine/thirdparty/clDNN/kernel_selector/core/actual_kernels/activation/activation_kernel_base.cpp b/inference-engine/thirdparty/clDNN/kernel_selector/core/actual_kernels/activation/activation_kernel_base.cpp index 41ab10199db..e85a6e0eaaf 100644 --- a/inference-engine/thirdparty/clDNN/kernel_selector/core/actual_kernels/activation/activation_kernel_base.cpp +++ b/inference-engine/thirdparty/clDNN/kernel_selector/core/actual_kernels/activation/activation_kernel_base.cpp @@ -26,17 +26,14 @@ ActivationKernelBase::DispatchData ActivationKernelBase::SetDefault(const activa DispatchData runInfo; std::vector global; std::vector local; - if (out.GetLayout() == DataLayout::bfzyx) { - global = {out.X().v, out.Y().v * out.Z().v, out.Feature().v * out.Batch().v}; - local = GetOptimalLocalWorkGroupSizes(global, arg.engineInfo); - } else if (out.GetLayout() == DataLayout::yxfb) { + if (out.GetLayout() == DataLayout::yxfb) { global = {out.Feature().v * out.Batch().v, out.X().v, out.Y().v}; local = GetOptimalLocalWorkGroupSizes(global, arg.engineInfo); } else if (out.GetLayout() == DataLayout::b_fs_yx_fsv16) { global = {Align(out.Feature().v, 16) * out.Batch().v, out.X().v, out.Y().v}; local = {16, 1, 1}; } else { - global = {out.X().v, out.Y().v, out.Feature().v * out.Batch().v}; + global = {out.X().v, out.Y().v * out.Z().v, out.Feature().v * out.Batch().v}; local = GetOptimalLocalWorkGroupSizes(global, arg.engineInfo); } @@ -77,6 +74,12 @@ bool ActivationKernelBase::Validate(const Params& p, const optional_params& o) c o.GetType() != KernelType::ACTIVATION) { return false; } + const activation_params& orgParams = static_cast(p); + + for (auto& fused_op : orgParams.fused_ops) { + if (!IsFusedPrimitiveSupported(fused_op)) + return false; + } return true; } diff --git a/inference-engine/thirdparty/clDNN/kernel_selector/core/actual_kernels/activation/activation_kernel_opt.cpp b/inference-engine/thirdparty/clDNN/kernel_selector/core/actual_kernels/activation/activation_kernel_opt.cpp index 29d7742a974..f48b0e275fe 100644 --- a/inference-engine/thirdparty/clDNN/kernel_selector/core/actual_kernels/activation/activation_kernel_opt.cpp +++ b/inference-engine/thirdparty/clDNN/kernel_selector/core/actual_kernels/activation/activation_kernel_opt.cpp @@ -28,6 +28,7 @@ ParamsKey ActivationKernelOpt::GetSupportedKey() const { k.EnableOutputDataType(Datatype::INT32); k.EnableOutputDataType(Datatype::F16); k.EnableOutputDataType(Datatype::F32); + k.EnableDifferentTypes(); k.EnableAllInputLayout(); k.EnableAllOutputLayout(); k.EnableTensorOffset(); @@ -75,34 +76,33 @@ bool ActivationKernelOpt::Validate(const Params& p, const optional_params& o) co return false; } - if (params.gradient) { - if (params.inputs[0].GetLayout() != params.inputs[1].GetLayout()) - return false; - } + if (params.output.GetLayout() != params.inputs[0].GetLayout()) + return false; - // Opt kernel supports fused activations without extra inputs, since - // it can't calculate correct offset for tensors with different layout. - for (auto& op : params.fused_ops) { - if (!op.tensors.empty()) { - for (auto& t : op.tensors) { - if (!(t == params.inputs[0])) - return false; - } - } - } + if (!params.fused_ops.empty() && params.output.GetLayout() != DataLayout::bfyx && + params.output.GetLayout() != DataLayout::bfzyx) + return false; return true; } JitConstants ActivationKernelOpt::GetJitConstants(const activation_params& params, DispatchData kd) const { auto jit = ActivationKernelBase::GetJitConstants(params, kd); + auto input_dt = params.inputs[0].GetDType(); jit.AddConstant(MakeJitConstant("NUM_COLS_WI", NUM_COLS_WI)); if (!params.fused_ops.empty()) { - auto input_dt = GetUnitType(params); - FusedOpsConfiguration conf = {"", {"x"}, "v", input_dt, 4, LoadType::LT_UNALIGNED, BoundaryCheck::DISABLED, IndexType::LINEAR_OFFSET }; + std::vector idx_order; + if (params.inputs[0].GetDims().size() <= 4) { + idx_order = {"fo_b", "fo_f", "fo_y", "fo_x"}; + } else if (params.inputs[0].GetDims().size() == 5) { + idx_order = {"fo_b", "fo_f", "fo_z", "fo_y", "fo_x"}; + } + FusedOpsConfiguration conf = + {"", idx_order, "v", input_dt, 4, LoadType::LT_UNALIGNED, BoundaryCheck::DISABLED, IndexType::TENSOR_COORD}; jit.Merge(MakeFusedOpsJitConstants(params, {conf})); } + jit.Merge(MakeActivationJitConstants(params.activations, input_dt, "_KERNEL")); return jit; } diff --git a/inference-engine/thirdparty/clDNN/kernel_selector/core/actual_kernels/activation/activation_kernel_opt.h b/inference-engine/thirdparty/clDNN/kernel_selector/core/actual_kernels/activation/activation_kernel_opt.h index 67a2a7c59af..e2db8123f26 100644 --- a/inference-engine/thirdparty/clDNN/kernel_selector/core/actual_kernels/activation/activation_kernel_opt.h +++ b/inference-engine/thirdparty/clDNN/kernel_selector/core/actual_kernels/activation/activation_kernel_opt.h @@ -17,6 +17,8 @@ #include "activation_kernel_base.h" +#include + namespace kernel_selector { class ActivationKernelOpt : public ActivationKernelBase { public: @@ -32,5 +34,8 @@ protected: DispatchData SetDefault(const activation_params& arg) const override; bool Validate(const Params& p, const optional_params& o) const override; JitConstants GetJitConstants(const activation_params& params, DispatchData kd) const override; + std::vector GetSupportedFusedOps() const override { + return { FusedOpType::QUANTIZE }; + } }; } // namespace kernel_selector diff --git a/inference-engine/thirdparty/clDNN/kernel_selector/core/actual_kernels/activation/activation_kernel_ref.cpp b/inference-engine/thirdparty/clDNN/kernel_selector/core/actual_kernels/activation/activation_kernel_ref.cpp index 41f9729cbdc..cc3231946a7 100644 --- a/inference-engine/thirdparty/clDNN/kernel_selector/core/actual_kernels/activation/activation_kernel_ref.cpp +++ b/inference-engine/thirdparty/clDNN/kernel_selector/core/actual_kernels/activation/activation_kernel_ref.cpp @@ -31,6 +31,7 @@ ParamsKey ActivationKernelRef::GetSupportedKey() const { k.EnableOutputDataType(Datatype::UINT8); k.EnableOutputDataType(Datatype::F16); k.EnableOutputDataType(Datatype::F32); + k.EnableDifferentTypes(); k.EnableActivationAdditionalParamsAsInput(); k.EnableAllInputLayout(); k.EnableAllOutputLayout(); @@ -43,13 +44,20 @@ ParamsKey ActivationKernelRef::GetSupportedKey() const { JitConstants ActivationKernelRef::GetJitConstants(const activation_params& params, DispatchData kd) const { auto jit = ActivationKernelBase::GetJitConstants(params, kd); + auto input_dt = params.inputs[0].GetDType(); if (!params.fused_ops.empty()) { - auto input_dt = GetUnitType(params); - FusedOpsConfiguration conf = {"", {"batch", "feature", "y", "x"}, "dst", input_dt, 1 }; + std::vector idx_order; + if (params.inputs[0].GetDims().size() <= 4) { + idx_order = {"batch", "feature", "y", "x"}; + } else if (params.inputs[0].GetDims().size() == 5) { + idx_order = {"batch", "feature", "z", "y", "x"}; + } + FusedOpsConfiguration conf = {"", idx_order, "dst", input_dt, 1}; jit.Merge(MakeFusedOpsJitConstants(params, {conf})); } + jit.Merge(MakeActivationJitConstants(params.activations, input_dt, "_KERNEL")); return jit; } diff --git a/inference-engine/thirdparty/clDNN/kernel_selector/core/actual_kernels/activation/activation_kernel_ref.h b/inference-engine/thirdparty/clDNN/kernel_selector/core/actual_kernels/activation/activation_kernel_ref.h index a0d8850fb50..ad15f0a5fae 100644 --- a/inference-engine/thirdparty/clDNN/kernel_selector/core/actual_kernels/activation/activation_kernel_ref.h +++ b/inference-engine/thirdparty/clDNN/kernel_selector/core/actual_kernels/activation/activation_kernel_ref.h @@ -17,6 +17,8 @@ #include "activation_kernel_base.h" +#include + namespace kernel_selector { class ActivationKernelRef : public ActivationKernelBase { public: @@ -26,5 +28,8 @@ public: KernelsData GetKernelsData(const Params& params, const optional_params& options) const override; ParamsKey GetSupportedKey() const override; JitConstants GetJitConstants(const activation_params& params, DispatchData kd) const override; + std::vector GetSupportedFusedOps() const override { + return { FusedOpType::QUANTIZE }; + } }; } // namespace kernel_selector diff --git a/inference-engine/thirdparty/clDNN/kernel_selector/core/actual_kernels/convolution/convolution_kernel_b_fs_yx_fsv16_1x1.cpp b/inference-engine/thirdparty/clDNN/kernel_selector/core/actual_kernels/convolution/convolution_kernel_b_fs_yx_fsv16_1x1.cpp index aadb1c38390..b0284dbaf56 100644 --- a/inference-engine/thirdparty/clDNN/kernel_selector/core/actual_kernels/convolution/convolution_kernel_b_fs_yx_fsv16_1x1.cpp +++ b/inference-engine/thirdparty/clDNN/kernel_selector/core/actual_kernels/convolution/convolution_kernel_b_fs_yx_fsv16_1x1.cpp @@ -118,8 +118,9 @@ bool ConvolutionKernel_b_fs_yx_fsv16_1x1::Validate(const Params& p, const option output.X().v != input.X().v || output.Y().v != input.Y().v || output.Feature().v % 16 != 0; const bool bFilterSize = params.filterSize.x != 1 || params.filterSize.y != 1; const bool bStride = params.stride.x != 1 || params.stride.y != 1; + const bool bPadding = input.Feature().pad.before % feature_block_size != 0 || output.Feature().pad.before % feature_block_size != 0; - if (bOutputSizes || bFilterSize || bStride) { + if (bOutputSizes || bFilterSize || bStride || bPadding) { return false; } diff --git a/inference-engine/thirdparty/clDNN/kernel_selector/core/actual_kernels/convolution/convolution_kernel_b_fs_yx_fsv16_depthwise.cpp b/inference-engine/thirdparty/clDNN/kernel_selector/core/actual_kernels/convolution/convolution_kernel_b_fs_yx_fsv16_depthwise.cpp index 05f35c51c1f..16782e098e8 100644 --- a/inference-engine/thirdparty/clDNN/kernel_selector/core/actual_kernels/convolution/convolution_kernel_b_fs_yx_fsv16_depthwise.cpp +++ b/inference-engine/thirdparty/clDNN/kernel_selector/core/actual_kernels/convolution/convolution_kernel_b_fs_yx_fsv16_depthwise.cpp @@ -55,6 +55,10 @@ bool ConvolutionKernel_b_fs_yx_fsv16_depthwise::Validate(const Params& p, const if (cp.inputs[0].Feature().v != cp.groups || cp.output.Feature().v != cp.groups) return false; + // Check that padding features doesn't miss-align the blocks + if (cp.inputs[0].Feature().pad.before % feature_block_size != 0 || cp.output.Feature().pad.before % feature_block_size != 0) + return false; + return true; } diff --git a/inference-engine/thirdparty/clDNN/kernel_selector/core/actual_kernels/convolution/convolution_kernel_b_fs_zyx_fsv16.cpp b/inference-engine/thirdparty/clDNN/kernel_selector/core/actual_kernels/convolution/convolution_kernel_b_fs_zyx_fsv16.cpp index 4e26fc000d8..756269686a6 100644 --- a/inference-engine/thirdparty/clDNN/kernel_selector/core/actual_kernels/convolution/convolution_kernel_b_fs_zyx_fsv16.cpp +++ b/inference-engine/thirdparty/clDNN/kernel_selector/core/actual_kernels/convolution/convolution_kernel_b_fs_zyx_fsv16.cpp @@ -33,7 +33,7 @@ FusedOpsConfiguration GenerateFusedOpsConfiguration_f16(size_t conf_id, std::str if (is_vector) idx_order = {"(mb)", "(oc*OC_BLOCK + g*OC)", "od", "oh", "(ow + " + std::to_string(conf_id * 8) + ")"}; else - idx_order = {"(mb)", "(oc*OC_BLOCK + g*OC + local_id)", "od", "oh", "(ow + i)"}; + idx_order = {"(mb)", "(oc*OC_BLOCK + g*OC + local_id)", "od", "oh", "(ow + " + std::to_string(conf_id * 8) + " + i)"}; return { suffix, idx_order, diff --git a/inference-engine/thirdparty/clDNN/kernel_selector/core/actual_kernels/convolution/convolution_kernel_base.cpp b/inference-engine/thirdparty/clDNN/kernel_selector/core/actual_kernels/convolution/convolution_kernel_base.cpp index d2167508d07..b15ad49c4cd 100644 --- a/inference-engine/thirdparty/clDNN/kernel_selector/core/actual_kernels/convolution/convolution_kernel_base.cpp +++ b/inference-engine/thirdparty/clDNN/kernel_selector/core/actual_kernels/convolution/convolution_kernel_base.cpp @@ -232,7 +232,8 @@ KernelsData ConvolutionKernelBase::GetCommonKernelsData(const Params& params, GetPreferredWeightsLayout(newParams), kd.weightsReorderParams, GetSupportedKey(), - newParams.groups); + newParams.groups, + newParams.transposed); if (!succeed) { return {}; diff --git a/inference-engine/thirdparty/clDNN/kernel_selector/core/actual_kernels/convolution/convolution_kernel_bfyx_os_iyx_osv16.cpp b/inference-engine/thirdparty/clDNN/kernel_selector/core/actual_kernels/convolution/convolution_kernel_bfyx_os_iyx_osv16.cpp index a15d21d5d8d..eb641bc3c27 100644 --- a/inference-engine/thirdparty/clDNN/kernel_selector/core/actual_kernels/convolution/convolution_kernel_bfyx_os_iyx_osv16.cpp +++ b/inference-engine/thirdparty/clDNN/kernel_selector/core/actual_kernels/convolution/convolution_kernel_bfyx_os_iyx_osv16.cpp @@ -63,7 +63,6 @@ ParamsKey ConvolutionKernel_bfyx_os_iyx_osv16::GetSupportedKey() const { k.EnableBatching(); k.EnableSplitSupport(); k.EnableDilation(); - k.EnableTranspose(); k.EnableGroupedConvolution(); return k; } @@ -237,11 +236,7 @@ JitConstants ConvolutionKernel_bfyx_os_iyx_osv16::GetJitConstants(const convolut WeightsLayout ConvolutionKernel_bfyx_os_iyx_osv16::GetPreferredWeightsLayout( const convolution_params ¶ms) const { - if (!params.transposed) { - return (params.groups > 1) ? WeightsLayout::g_os_iyx_osv16 : WeightsLayout::os_iyx_osv16; - } else { - return (params.groups > 1) ? WeightsLayout::g_os_iyx_osv16_rotate_180 : WeightsLayout::os_iyx_osv16_rotate_180; - } + return (params.groups > 1) ? WeightsLayout::g_os_iyx_osv16 : WeightsLayout::os_iyx_osv16; } KernelsData ConvolutionKernel_bfyx_os_iyx_osv16::GetKernelsData(const Params& params, diff --git a/inference-engine/thirdparty/clDNN/kernel_selector/core/actual_kernels/convolution/convolution_kernel_bfyx_os_iyx_osv16_2_sg.cpp b/inference-engine/thirdparty/clDNN/kernel_selector/core/actual_kernels/convolution/convolution_kernel_bfyx_os_iyx_osv16_2_sg.cpp index 047148cebbb..152fb25241e 100644 --- a/inference-engine/thirdparty/clDNN/kernel_selector/core/actual_kernels/convolution/convolution_kernel_bfyx_os_iyx_osv16_2_sg.cpp +++ b/inference-engine/thirdparty/clDNN/kernel_selector/core/actual_kernels/convolution/convolution_kernel_bfyx_os_iyx_osv16_2_sg.cpp @@ -63,7 +63,6 @@ ParamsKey ConvolutionKernel_bfyx_os_iyx_osv16_2_sg::GetSupportedKey() const { k.EnableBatching(); k.EnableSplitSupport(); k.EnableDilation(); - k.EnableTranspose(); return k; } @@ -235,11 +234,7 @@ JitConstants ConvolutionKernel_bfyx_os_iyx_osv16_2_sg::GetJitConstants(const con WeightsLayout ConvolutionKernel_bfyx_os_iyx_osv16_2_sg::GetPreferredWeightsLayout( const convolution_params ¶ms) const { - if (!params.transposed) { - return WeightsLayout::os_iyx_osv16; - } else { - return WeightsLayout::os_iyx_osv16_rotate_180; - } + return params.groups == 1 ? WeightsLayout::os_iyx_osv16 : WeightsLayout::g_os_iyx_osv16; } KernelsData ConvolutionKernel_bfyx_os_iyx_osv16_2_sg::GetKernelsData(const Params& params, @@ -265,4 +260,4 @@ KernelsData ConvolutionKernel_bfyx_os_iyx_osv16_2_sg::GetKernelsDataForAutoTune( return res; } -} // namespace kernel_selector \ No newline at end of file +} // namespace kernel_selector diff --git a/inference-engine/thirdparty/clDNN/kernel_selector/core/actual_kernels/convolution/convolution_kernel_imad.cpp b/inference-engine/thirdparty/clDNN/kernel_selector/core/actual_kernels/convolution/convolution_kernel_imad.cpp index 20e2c9d2c2e..53ed2c97d25 100644 --- a/inference-engine/thirdparty/clDNN/kernel_selector/core/actual_kernels/convolution/convolution_kernel_imad.cpp +++ b/inference-engine/thirdparty/clDNN/kernel_selector/core/actual_kernels/convolution/convolution_kernel_imad.cpp @@ -194,7 +194,7 @@ bool ConvolutionKernel_imad::Validate(const Params& params, const optional_param } auto& newParams = static_cast(params); - if ((newParams.inputs[0].Feature().v / newParams.groups) % 4 != 0) + if (newParams.groups > 1 && newParams.weights.IFM().v % 4 != 0) return false; size_t min_block_size_x = (newParams.weights.X().v - 1) * newParams.dilation.x + 1; diff --git a/inference-engine/thirdparty/clDNN/kernel_selector/core/actual_kernels/convolution/convolution_params.cpp b/inference-engine/thirdparty/clDNN/kernel_selector/core/actual_kernels/convolution/convolution_params.cpp index 2e253bea912..44bd574cc91 100644 --- a/inference-engine/thirdparty/clDNN/kernel_selector/core/actual_kernels/convolution/convolution_params.cpp +++ b/inference-engine/thirdparty/clDNN/kernel_selector/core/actual_kernels/convolution/convolution_params.cpp @@ -67,10 +67,6 @@ ParamsKey convolution_params::GetParamsKey() const { k.EnableDepthwiseSeparableOpt(); } - if (transposed) { - k.EnableTranspose(); - } - if (local_convolution) { k.EnableLocalConvolution(); } diff --git a/inference-engine/thirdparty/clDNN/kernel_selector/core/actual_kernels/deconvolution/deconvolution_kernel_b_fs_zyx_fsv16.cpp b/inference-engine/thirdparty/clDNN/kernel_selector/core/actual_kernels/deconvolution/deconvolution_kernel_b_fs_zyx_fsv16.cpp index 2b5c961cd04..dbbc4a9538c 100644 --- a/inference-engine/thirdparty/clDNN/kernel_selector/core/actual_kernels/deconvolution/deconvolution_kernel_b_fs_zyx_fsv16.cpp +++ b/inference-engine/thirdparty/clDNN/kernel_selector/core/actual_kernels/deconvolution/deconvolution_kernel_b_fs_zyx_fsv16.cpp @@ -52,13 +52,16 @@ DeconvolutionKernelBase::DispatchData DeconvolutionKernel_b_fs_zyx_fsv16::SetDef const auto& out = params.output; + bool ver_bsv16_fsv16 = params.output.GetLayout() == DataLayout::bs_fs_yx_bsv16_fsv16 + || params.output.GetLayout() == DataLayout::bs_fs_zyx_bsv16_fsv16; + auto x = out.X().v; auto y = out.Y().v; auto z = out.Z().v; auto f = Align(out.Feature().v, 16); auto b = out.Batch().v; - if (out.Batch().v % 16 == 0) { + if (ver_bsv16_fsv16) { if (params.depthwise_separable_opt) { kd.gws0 = x * y * z; kd.gws1 = f; @@ -120,6 +123,17 @@ bool DeconvolutionKernel_b_fs_zyx_fsv16::Validate(const Params& p, const optiona if (!DeconvolutionKernelBase::Validate(p, o)) { return false; } + auto& deconv_params = static_cast(p); + + if (deconv_params.output.GetLayout() != deconv_params.inputs[0].GetLayout()) + return false; + + const auto& params = static_cast(p); + const auto feature_block_size = 16; + + // Check that padding features doesn't miss-align the blocks + if (params.inputs[0].Feature().pad.before % feature_block_size != 0 || params.output.Feature().pad.before % feature_block_size != 0) + return false; return true; } @@ -129,7 +143,10 @@ JitConstants DeconvolutionKernel_b_fs_zyx_fsv16::GetJitConstants(const deconvolu auto output = params.output; auto jit = Parent::GetJitConstants(params); - if (output.Batch().v % 16 == 0) { + bool ver_bsv16_fsv16 = params.output.GetLayout() == DataLayout::bs_fs_yx_bsv16_fsv16 + || params.output.GetLayout() == DataLayout::bs_fs_zyx_bsv16_fsv16; + + if (ver_bsv16_fsv16) { jit.AddConstant(MakeJitConstant("VER_16MB16C", 1)); } else { jit.AddConstant(MakeJitConstant("VER_8OW16C", 1)); @@ -150,7 +167,7 @@ JitConstants DeconvolutionKernel_b_fs_zyx_fsv16::GetJitConstants(const deconvolu icb /= 2; } - if (output.Batch().v % 16 == 0) { + if (ver_bsv16_fsv16) { mb_block = 16; jit.AddConstant(MakeJitConstant("MB_BLOCK", mb_block)); jit.AddConstant(MakeJitConstant("IC_BLOCK", ic_block)); @@ -218,6 +235,47 @@ JitConstants DeconvolutionKernel_b_fs_zyx_fsv16::GetJitConstants(const deconvolu jit.AddConstant(MakeJitConstant("LWS_1", runInfo.lws1)); jit.AddConstant(MakeJitConstant("LWS_2", runInfo.lws2)); + if (!params.fused_ops.empty()) { + auto fused_dt = GetActivationType(params); + std::vector idx_order_block_c00; + std::vector idx_order_block_c01; + std::vector idx_order_block_ci; + + if (params.output.Dimentions() <= 4) { + idx_order_block_c00 = { "mb", "(g * IC + gic * IC_BLOCK)", "ih", "iw" }; + idx_order_block_c01 = { "(mb + 8)", "(g * IC + gic * IC_BLOCK)", "ih", "iw" }; + idx_order_block_ci = { "mb", "(g * IC + gic * IC_BLOCK)", "ih", "(iw + i)" }; + } else { + idx_order_block_c00 = { "mb", "(g * IC + gic * IC_BLOCK)", "id", "ih", "iw" }; + idx_order_block_c01 = { "(mb + 8)", "(g * IC + gic * IC_BLOCK)", "id", "ih", "iw" }; + idx_order_block_ci = { "mb", "(g * IC + gic * IC_BLOCK)", "id", "ih", "(iw + i)" }; + } + + FusedOpsConfiguration conf_c00 = { + "_BLOCK_C00", + idx_order_block_c00, + "blockC00", + fused_dt, + 8, + LoadType::LT_ALIGNED_READ, + BoundaryCheck::ENABLED, + IndexType::TENSOR_COORD, + Tensor::DataChannelName::BATCH }; + FusedOpsConfiguration conf_c01 = { + "_BLOCK_C01", + idx_order_block_c01, + "blockC01", + fused_dt, + 8, + LoadType::LT_ALIGNED_READ, + BoundaryCheck::ENABLED, + IndexType::TENSOR_COORD, + Tensor::DataChannelName::BATCH }; + FusedOpsConfiguration conf_ci = { "_BLOCK_CI", idx_order_block_ci, "blockC00[i]", fused_dt, 1, LoadType::LT_ALIGNED_READ }; + + jit.Merge(MakeFusedOpsJitConstants(params, { conf_c00, conf_c01, conf_ci })); + } + return jit; } diff --git a/inference-engine/thirdparty/clDNN/kernel_selector/core/actual_kernels/deconvolution/deconvolution_kernel_b_fs_zyx_fsv16.h b/inference-engine/thirdparty/clDNN/kernel_selector/core/actual_kernels/deconvolution/deconvolution_kernel_b_fs_zyx_fsv16.h index ba7bd58a45c..7785877a3b9 100644 --- a/inference-engine/thirdparty/clDNN/kernel_selector/core/actual_kernels/deconvolution/deconvolution_kernel_b_fs_zyx_fsv16.h +++ b/inference-engine/thirdparty/clDNN/kernel_selector/core/actual_kernels/deconvolution/deconvolution_kernel_b_fs_zyx_fsv16.h @@ -31,7 +31,7 @@ public: protected: WeightsLayout GetPreferredWeightsLayout(const deconvolution_params& p) const override { - if (p.output.GetLayout() == DataLayout::b_fs_yx_fsv16) + if (p.output.Dimentions() == 4) return WeightsLayout::is_os_yx_osv16_isv16; else return WeightsLayout::is_os_zyx_osv16_isv16; @@ -39,5 +39,14 @@ protected: bool Validate(const Params& p, const optional_params& o) const override; CommonDispatchData SetDefault(const deconvolution_params& arg) const override; JitConstants GetJitConstants(const deconvolution_params& params) const override; + + std::vector GetSupportedFusedOps() const override { + return { + FusedOpType::ACTIVATION, + FusedOpType::ELTWISE, + FusedOpType::SCALE, + FusedOpType::QUANTIZE + }; + } }; } // namespace kernel_selector diff --git a/inference-engine/thirdparty/clDNN/kernel_selector/core/actual_kernels/deconvolution/deconvolution_kernel_b_fs_zyx_fsv16_dw.cpp b/inference-engine/thirdparty/clDNN/kernel_selector/core/actual_kernels/deconvolution/deconvolution_kernel_b_fs_zyx_fsv16_dw.cpp index 083766f611b..cafa959944b 100644 --- a/inference-engine/thirdparty/clDNN/kernel_selector/core/actual_kernels/deconvolution/deconvolution_kernel_b_fs_zyx_fsv16_dw.cpp +++ b/inference-engine/thirdparty/clDNN/kernel_selector/core/actual_kernels/deconvolution/deconvolution_kernel_b_fs_zyx_fsv16_dw.cpp @@ -18,29 +18,108 @@ #include "kernel_selector_utils.h" #include +#include +#include +#include namespace kernel_selector { static const size_t sub_group_size = 16; static const size_t feature_block_size = 16; +static const float max_reg_pressure = 3.f / 4.f; -size_t DeconvolutionKernel_b_fs_zyx_fsv16_dw::GetBlockSizeX(const deconvolution_params& params) const { - std::vector blockWidths = {8, 4, 2, 1}; - for (auto& blockSize : blockWidths) - if (params.output.X().v % blockSize == 0) { - return blockSize; +float DeconvolutionKernel_b_fs_zyx_fsv16_dw::EstimateRegPressure(const deconvolution_params& params, + const dispatch_params& d_params) const { + size_t usage_bytes = 0; + + usage_bytes += d_params.block_size_x * BytesPerElement(GetAccumulatorType(params)); + + if (d_params.preload_weights == weights_preload::all) { + usage_bytes += params.weights.X().v * params.weights.Y().v * params.weights.Z().v * BytesPerElement(params.weights.GetDType()); + } else if (d_params.preload_weights == weights_preload::line) { + usage_bytes += params.weights.X().v * BytesPerElement(params.weights.GetDType()); + } else { + usage_bytes += BytesPerElement(params.weights.GetDType()); + } + + if (d_params.preload_input == input_preload::line) { + size_t input_line_size = CeilDiv(d_params.block_size_x + params.weights.X().v - 1, params.stride.x); + usage_bytes += input_line_size * BytesPerElement(params.inputs[0].GetDType()); + } else { + usage_bytes += BytesPerElement(params.inputs[0].GetDType()); + } + + constexpr size_t register_num = 128; + constexpr size_t register_bytes = 32; + constexpr size_t max_register_bytes = register_num * register_bytes; + + return static_cast(usage_bytes * sub_group_size) / static_cast(max_register_bytes); +} + +DeconvolutionKernel_b_fs_zyx_fsv16_dw::dispatch_params +DeconvolutionKernel_b_fs_zyx_fsv16_dw::GetDispatchParams(const deconvolution_params& params) const { + std::vector ordered_params; + if (params.inputs[0].GetDType() == Datatype::F16 || params.inputs[0].GetDType() == Datatype::F32) { + ordered_params = { + // Preload weights + dispatch_params{8, input_preload::none, weights_preload::all}, + dispatch_params{4, input_preload::none, weights_preload::all}, + dispatch_params{2, input_preload::none, weights_preload::all}, + dispatch_params{1, input_preload::none, weights_preload::all}, + // No preloading + dispatch_params{8, input_preload::none, weights_preload::none}, + dispatch_params{4, input_preload::none, weights_preload::none}, + dispatch_params{2, input_preload::none, weights_preload::none}, + dispatch_params{1, input_preload::none, weights_preload::none}, + }; + } else { + ordered_params = { + dispatch_params{16, input_preload::line, weights_preload::line}, + dispatch_params{8, input_preload::line, weights_preload::line}, + dispatch_params{4, input_preload::line, weights_preload::line}, + dispatch_params{16, input_preload::line, weights_preload::none}, + dispatch_params{8, input_preload::line, weights_preload::none}, + dispatch_params{4, input_preload::line, weights_preload::none}, + dispatch_params{2, input_preload::line, weights_preload::line}, + dispatch_params{2, input_preload::line, weights_preload::none}, + dispatch_params{1, input_preload::line, weights_preload::none}, + dispatch_params{1, input_preload::none, weights_preload::none}, + }; + } + + dispatch_params best_params = dispatch_params{ 1, input_preload::none, weights_preload::none }; + + for (auto& d_params : ordered_params) { + bool good_block_size_x = params.output.X().v % d_params.block_size_x == 0 || params.output.X().v > d_params.block_size_x * 3; + bool good_reg_pressure = EstimateRegPressure(params, d_params) <= max_reg_pressure; + // No support for no input preload and weights line preload in kernel + bool good_preloads = !(d_params.preload_input == input_preload::none && d_params.preload_weights == weights_preload::line); + // At least one input preload + bool full_input_preload = d_params.preload_input != input_preload::line || + CeilDiv(d_params.block_size_x + params.filterSize.x - 1, params.stride.x) <= params.inputs[0].X().v; + + if (good_block_size_x && good_reg_pressure && good_preloads && full_input_preload) { + best_params = d_params; + break; } - return 1; + } + + return best_params; } ParamsKey DeconvolutionKernel_b_fs_zyx_fsv16_dw::GetSupportedKey() const { ParamsKey k; k.EnableInputDataType(Datatype::F32); - k.EnableOutputDataType(Datatype::F32); - k.EnableInputWeightsType(WeightsType::F32); k.EnableInputDataType(Datatype::F16); + k.EnableInputDataType(Datatype::INT8); + k.EnableInputDataType(Datatype::UINT8); + + k.EnableOutputDataType(Datatype::F32); k.EnableOutputDataType(Datatype::F16); - k.EnableInputWeightsType(WeightsType::F16); + k.EnableOutputDataType(Datatype::INT8); + k.EnableOutputDataType(Datatype::UINT8); + + k.EnableAllInputWeightsType(); k.EnableInputLayout(DataLayout::b_fs_yx_fsv16); k.EnableOutputLayout(DataLayout::b_fs_yx_fsv16); k.EnableInputLayout(DataLayout::b_fs_zyx_fsv16); @@ -53,6 +132,8 @@ ParamsKey DeconvolutionKernel_b_fs_zyx_fsv16_dw::GetSupportedKey() const { k.EnableSubGroup(); k.EnableSubGroupShort(); k.EnableGroupedConvolution(); + k.EnableDifferentTypes(); + k.EnableDifferentInputWeightsTypes(); return k; } @@ -67,7 +148,7 @@ DeconvolutionKernelBase::DispatchData DeconvolutionKernel_b_fs_zyx_fsv16_dw::Set auto f = out.Feature().v; auto b = out.Batch().v; - kd.gws0 = (x / GetBlockSizeX(params)) * y * z; + kd.gws0 = CeilDiv(x, GetDispatchParams(params).block_size_x) * y * z; kd.gws1 = Align(f, feature_block_size); kd.gws2 = b; @@ -85,7 +166,7 @@ bool DeconvolutionKernel_b_fs_zyx_fsv16_dw::Validate(const Params& p, const opti return false; } - const deconvolution_params& params = static_cast(p); + const auto& params = static_cast(p); if (params.groups == 1) return false; @@ -93,6 +174,10 @@ bool DeconvolutionKernel_b_fs_zyx_fsv16_dw::Validate(const Params& p, const opti if (params.weights.IFM().v != 1 || params.weights.OFM().v != 1) return false; + // Check that padding features doesn't miss-align the blocks + if (params.inputs[0].Feature().pad.before % feature_block_size != 0 || params.output.Feature().pad.before % feature_block_size != 0) + return false; + return true; } @@ -101,11 +186,43 @@ JitConstants DeconvolutionKernel_b_fs_zyx_fsv16_dw::GetJitConstants(const deconv auto output = params.output; auto jit = Parent::GetJitConstants(params); - jit.AddConstant(MakeJitConstant("X_BLOCK_SIZE", GetBlockSizeX(params))); + auto dp = GetDispatchParams(params); + auto& block_size_x = dp.block_size_x; + + jit.AddConstant(MakeJitConstant("X_BLOCK_SIZE", block_size_x)); jit.AddConstant(MakeJitConstant("SUB_GROUP_SIZE", sub_group_size)); if (params.output.Feature().v % feature_block_size != 0) { jit.AddConstant(MakeJitConstant("OUTPUT_LEFTOVERS", params.output.Feature().v % feature_block_size)); } + jit.AddConstant(MakeJitConstant("INPUT_BLOCK_SIZE_X", CeilDiv(block_size_x + params.filterSize.x - 1, params.stride.x))); + jit.AddConstant(MakeJitConstant("PRELOAD_INPUT_LINE", dp.preload_input == input_preload::line)); + jit.AddConstant(MakeJitConstant("PRELOAD_WEIGHTS", dp.preload_weights == weights_preload::all)); + jit.AddConstant(MakeJitConstant("PRELOAD_WEIGHTS_LINE", dp.preload_weights == weights_preload::line)); + + if (!params.fused_ops.empty()) { + auto fused_dt = GetActivationType(params); + std::vector idx_order; + if (params.output.Dimentions() <= 4) { + idx_order = {"b", "fg", "y", "x"}; + } else { + idx_order = { "b", "fg", "z", "y", "x" }; + } + auto boundary_check = BoundaryCheck::ENABLED; + if (params.output.Feature().v % feature_block_size == 0 && params.output.X().v % block_size_x == 0) { + boundary_check = BoundaryCheck::DISABLED; + } + FusedOpsConfiguration conf = { + "", + idx_order, + "dequantized", + fused_dt, + block_size_x, + LoadType::LT_ALIGNED_READ, + boundary_check, + IndexType::TENSOR_COORD, + Tensor::DataChannelName::X }; + jit.Merge(MakeFusedOpsJitConstants(params, { conf })); + } return jit; } diff --git a/inference-engine/thirdparty/clDNN/kernel_selector/core/actual_kernels/deconvolution/deconvolution_kernel_b_fs_zyx_fsv16_dw.h b/inference-engine/thirdparty/clDNN/kernel_selector/core/actual_kernels/deconvolution/deconvolution_kernel_b_fs_zyx_fsv16_dw.h index 518f6fc87ce..4b444504a51 100644 --- a/inference-engine/thirdparty/clDNN/kernel_selector/core/actual_kernels/deconvolution/deconvolution_kernel_b_fs_zyx_fsv16_dw.h +++ b/inference-engine/thirdparty/clDNN/kernel_selector/core/actual_kernels/deconvolution/deconvolution_kernel_b_fs_zyx_fsv16_dw.h @@ -39,6 +39,32 @@ protected: bool Validate(const Params& p, const optional_params& o) const override; CommonDispatchData SetDefault(const deconvolution_params& arg) const override; JitConstants GetJitConstants(const deconvolution_params& params) const override; - size_t GetBlockSizeX(const deconvolution_params& params) const; + + enum class weights_preload { + none, + line, + all + }; + enum class input_preload { + none, + line + }; + + struct dispatch_params { + size_t block_size_x; + input_preload preload_input; + weights_preload preload_weights; + }; + dispatch_params GetDispatchParams(const deconvolution_params& params) const; + float EstimateRegPressure(const deconvolution_params& params, const dispatch_params& disp_params) const; + + std::vector GetSupportedFusedOps() const override { + return { + FusedOpType::ACTIVATION, + FusedOpType::ELTWISE, + FusedOpType::SCALE, + FusedOpType::QUANTIZE + }; + } }; } // namespace kernel_selector diff --git a/inference-engine/thirdparty/clDNN/kernel_selector/core/actual_kernels/deconvolution/deconvolution_kernel_base.cpp b/inference-engine/thirdparty/clDNN/kernel_selector/core/actual_kernels/deconvolution/deconvolution_kernel_base.cpp index a83013989f2..4a7d89ed325 100644 --- a/inference-engine/thirdparty/clDNN/kernel_selector/core/actual_kernels/deconvolution/deconvolution_kernel_base.cpp +++ b/inference-engine/thirdparty/clDNN/kernel_selector/core/actual_kernels/deconvolution/deconvolution_kernel_base.cpp @@ -55,6 +55,11 @@ bool DeconvolutionKernelBase::Validate(const Params& p, const optional_params& o return false; } + for (auto& fused_op : params.fused_ops) { + if (!IsFusedPrimitiveSupported(fused_op)) + return false; + } + return true; } @@ -68,14 +73,15 @@ JitConstants DeconvolutionKernelBase::GetJitConstants(const deconvolution_params (dp.filterSize.y - 1 + padding.y) * input.Y().pitch; input_offset_with_padding = std::max(input_offset_with_padding, (int64_t)0); - jit.AddConstants({MakeJitConstant("STRIDE", dp.stride), - MakeJitConstant("PADDING", dp.padding), - MakeJitConstant("DILATION", dp.dilation), - MakeJitConstant("FILTER_ARRAY_NUM", dp.split), - MakeJitConstant("INPUT0_OFFSET_WITH_PADDING", input_offset_with_padding), - MakeJitConstant("DEPTHWISE_SEPARABLE_OPT", dp.depthwise_separable_opt), - MakeJitConstant("FUSED_ELTWISE", dp.fused_eltwise), - MakeJitConstant("GROUPED", (dp.groups > 1) ? 1 : 0)}); + jit.AddConstants({ MakeJitConstant("STRIDE", dp.stride), + MakeJitConstant("PADDING", dp.padding), + MakeJitConstant("DILATION", dp.dilation), + MakeJitConstant("FILTER_ARRAY_NUM", dp.split), + MakeJitConstant("INPUT0_OFFSET_WITH_PADDING", input_offset_with_padding), + MakeJitConstant("DEPTHWISE_SEPARABLE_OPT", dp.depthwise_separable_opt), + MakeJitConstant("GROUPED", (dp.groups > 1) ? 1 : 0) }); + jit.Merge(MakeTypeJitConstants(GetAccumulatorType(dp), "ACCUMULATOR")); + jit.Merge(MakeTypeJitConstants(GetActivationType(dp), "ACTIVATION")); return jit; } @@ -114,7 +120,12 @@ KernelsData DeconvolutionKernelBase::GetKernelsData(const Params& params, const KernelData kd = KernelData::Default(params); deconvolution_params& newParams = *static_cast(kd.params.get()); - bool succeed = UpdateWeightsParams(newParams, options, GetPreferredWeightsLayout(newParams), kd.weightsReorderParams); + bool succeed = UpdateWeightsParams(newParams, + options, + GetPreferredWeightsLayout(newParams), + kd.weightsReorderParams, + GetSupportedKey(), + newParams.groups); if (!succeed) { return {}; @@ -133,13 +144,33 @@ KernelsData DeconvolutionKernelBase::GetKernelsData(const Params& params, const entry_point, DEFAULT, true, - !newParams.bias.empty()); + !newParams.bias.empty(), + 1, + GetFusedPrimitiveInputsCount(params)); kernel.arguments.push_back({ArgumentDescriptor::Types::SPLIT, 0}); - if (orgParams.fused_eltwise) - kernel.arguments.push_back({ArgumentDescriptor::Types::INPUT, 1}); kd.estimatedTime = runInfo.efficiency; return {kd}; } -} // namespace kernel_selector \ No newline at end of file + +Datatype DeconvolutionKernelBase::GetAccumulatorType(const deconvolution_params& params) const { + if (params.inputs[0].GetDType() == Datatype::INT8 || params.inputs[0].GetDType() == Datatype::UINT8) + return Datatype::INT32; + + // input is either fp32 or fp16 + // for fp32->fp16 accumulate to fp16, otherwise accumulate to input type + if (params.output.GetDType() == Datatype::F16) + return Datatype::F16; + + return params.inputs[0].GetDType(); +} + +Datatype DeconvolutionKernelBase::GetActivationType(const deconvolution_params& params) const { + auto accumulator_dt = GetAccumulatorType(params); + if (accumulator_dt == Datatype::INT32) + return Datatype::F32; + return accumulator_dt; +} + +} // namespace kernel_selector diff --git a/inference-engine/thirdparty/clDNN/kernel_selector/core/actual_kernels/deconvolution/deconvolution_kernel_base.h b/inference-engine/thirdparty/clDNN/kernel_selector/core/actual_kernels/deconvolution/deconvolution_kernel_base.h index 1a80205f9f9..a1da638fd78 100644 --- a/inference-engine/thirdparty/clDNN/kernel_selector/core/actual_kernels/deconvolution/deconvolution_kernel_base.h +++ b/inference-engine/thirdparty/clDNN/kernel_selector/core/actual_kernels/deconvolution/deconvolution_kernel_base.h @@ -34,7 +34,6 @@ struct deconvolution_params : public weight_bias_params { uint32_t split = 1; uint32_t groups = 1; bool depthwise_separable_opt = false; - bool fused_eltwise = false; std::string to_string() const override; @@ -89,5 +88,8 @@ protected: return (params.groups > 1) ? WeightsLayout::goizyx : WeightsLayout::oizyx; } bool Validate(const Params& p, const optional_params& o) const override; + + virtual Datatype GetAccumulatorType(const deconvolution_params& params) const; + virtual Datatype GetActivationType(const deconvolution_params& params) const; }; -} // namespace kernel_selector \ No newline at end of file +} // namespace kernel_selector diff --git a/inference-engine/thirdparty/clDNN/kernel_selector/core/actual_kernels/deconvolution/deconvolution_kernel_bfyx_opt.cpp b/inference-engine/thirdparty/clDNN/kernel_selector/core/actual_kernels/deconvolution/deconvolution_kernel_bfyx_opt.cpp index 94fa41469b9..8ec74cd406f 100644 --- a/inference-engine/thirdparty/clDNN/kernel_selector/core/actual_kernels/deconvolution/deconvolution_kernel_bfyx_opt.cpp +++ b/inference-engine/thirdparty/clDNN/kernel_selector/core/actual_kernels/deconvolution/deconvolution_kernel_bfyx_opt.cpp @@ -55,4 +55,23 @@ CommonDispatchData DeconvolutionKernel_bfyx_opt::SetDefault(const deconvolution_ kd.efficiency = FORCE_PRIORITY_6; return kd; } -} // namespace kernel_selector \ No newline at end of file + +JitConstants DeconvolutionKernel_bfyx_opt::GetJitConstants(const deconvolution_params& params) const { + auto jit = Parent::GetJitConstants(params); + + if (!params.fused_ops.empty()) { + auto fused_dt = GetActivationType(params); + FusedOpsConfiguration conf = { + "", + {"batch_offset", "ofm_offset", "id_y", "id_x"}, + "result", + fused_dt, + 1, + LoadType::LT_UNALIGNED, + BoundaryCheck::DISABLED }; + jit.Merge(MakeFusedOpsJitConstants(params, { conf })); + } + return jit; +} + +} // namespace kernel_selector diff --git a/inference-engine/thirdparty/clDNN/kernel_selector/core/actual_kernels/deconvolution/deconvolution_kernel_bfyx_opt.h b/inference-engine/thirdparty/clDNN/kernel_selector/core/actual_kernels/deconvolution/deconvolution_kernel_bfyx_opt.h index 85c945c9017..1276cbf375c 100644 --- a/inference-engine/thirdparty/clDNN/kernel_selector/core/actual_kernels/deconvolution/deconvolution_kernel_bfyx_opt.h +++ b/inference-engine/thirdparty/clDNN/kernel_selector/core/actual_kernels/deconvolution/deconvolution_kernel_bfyx_opt.h @@ -21,6 +21,7 @@ namespace kernel_selector { class DeconvolutionKernel_bfyx_opt : public DeconvolutionKernelBase { public: + using Parent = DeconvolutionKernelBase; DeconvolutionKernel_bfyx_opt() : DeconvolutionKernelBase("deconvolution_gpu_bfyx_opt") {} virtual ~DeconvolutionKernel_bfyx_opt() {} @@ -28,5 +29,15 @@ public: protected: CommonDispatchData SetDefault(const deconvolution_params& params) const override; + JitConstants GetJitConstants(const deconvolution_params& params) const override; + + std::vector GetSupportedFusedOps() const override { + return { + FusedOpType::ACTIVATION, + FusedOpType::ELTWISE, + FusedOpType::SCALE, + FusedOpType::QUANTIZE + }; + } }; -} // namespace kernel_selector \ No newline at end of file +} // namespace kernel_selector diff --git a/inference-engine/thirdparty/clDNN/kernel_selector/core/actual_kernels/deconvolution/deconvolution_kernel_imad_along_f_tile_bfx.cpp b/inference-engine/thirdparty/clDNN/kernel_selector/core/actual_kernels/deconvolution/deconvolution_kernel_imad_along_f_tile_bfx.cpp new file mode 100644 index 00000000000..4c4e77a06d3 --- /dev/null +++ b/inference-engine/thirdparty/clDNN/kernel_selector/core/actual_kernels/deconvolution/deconvolution_kernel_imad_along_f_tile_bfx.cpp @@ -0,0 +1,285 @@ +// Copyright (c) 2020 Intel Corporation +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#include "deconvolution_kernel_imad_along_f_tile_bfx.hpp" + +#include "kernel_selector_utils.h" + +#include +#include +#include +#include + +namespace kernel_selector { + +namespace { + constexpr size_t simd = 16; +} + +ParamsKey DeconvolutionKernel_imad_along_f_tile_bfx::GetSupportedKey() const { + ParamsKey k; + k.EnableInputDataType(Datatype::INT8); + k.EnableInputDataType(Datatype::UINT8); + k.EnableOutputDataType(Datatype::F32); + k.EnableOutputDataType(Datatype::F16); + k.EnableOutputDataType(Datatype::INT8); + k.EnableOutputDataType(Datatype::UINT8); + k.EnableInputWeightsType(WeightsType::INT8); + k.EnableInputWeightsType(WeightsType::UINT8); + + k.EnableInputLayout(DataLayout::b_fs_yx_fsv16); + k.EnableOutputLayout(DataLayout::b_fs_yx_fsv16); + k.EnableInputLayout(DataLayout::b_fs_zyx_fsv16); + k.EnableOutputLayout(DataLayout::b_fs_zyx_fsv16); + + k.EnableInputLayout(DataLayout::b_fs_yx_fsv32); + k.EnableOutputLayout(DataLayout::b_fs_yx_fsv32); + k.EnableInputLayout(DataLayout::b_fs_zyx_fsv32); + k.EnableOutputLayout(DataLayout::b_fs_zyx_fsv32); + + k.EnableInputLayout(DataLayout::bs_fs_yx_bsv16_fsv16); + k.EnableOutputLayout(DataLayout::bs_fs_yx_bsv16_fsv16); + k.EnableInputLayout(DataLayout::bs_fs_zyx_bsv16_fsv16); + k.EnableOutputLayout(DataLayout::bs_fs_zyx_bsv16_fsv16); + + k.EnableInputLayout(DataLayout::byxf_af32); + k.EnableOutputLayout(DataLayout::byxf_af32); + + k.EnableDifferentTypes(); + k.EnableDifferentInputWeightsTypes(); + k.EnableBatching(); + k.EnableTensorPitches(); + k.EnableTensorOffset(); + k.EnableBiasPerFeature(); + k.EnableNonBiasTerm(); + k.EnableGroupedConvolution(); + + return k; +} + +bool DeconvolutionKernel_imad_along_f_tile_bfx::Validate(const Params& p, const optional_params& o) const { + if (!Parent::Validate(p, o)) + return false; + + auto& params = static_cast(p); + if (params.groups > 1 && params.weights.IFM().v % 4 != 0) + return false; + + // Consider loosening at the cost of performance + if (params.groups > 1 && params.weights.OFM().v % simd != 0) + return false; + + return true; +} + +WeightsLayout DeconvolutionKernel_imad_along_f_tile_bfx::GetPreferredWeightsLayout(const deconvolution_params& params) const { + // isv, osv + using layout_map_key = std::tuple; + using layout_map = std::map; + + layout_map lt_map = { + {layout_map_key((size_t)4, (size_t)16), WeightsLayout::g_os_zyx_is_osv16_isv4 }, + {layout_map_key((size_t)16, (size_t)16), WeightsLayout::g_os_zyx_is_osv16_isv16 }, + {layout_map_key((size_t)32, (size_t)16), WeightsLayout::g_os_zyx_is_osv16_isv32 }, + {layout_map_key((size_t)4, (size_t)32), WeightsLayout::g_os_zyx_is_osv32_isv4 }, + {layout_map_key((size_t)16, (size_t)32), WeightsLayout::g_os_zyx_is_osv32_isv16 }, + {layout_map_key((size_t)32, (size_t)32), WeightsLayout::g_os_zyx_is_osv32_isv32 }}; + + auto tile_ifm = GetTileIFM(params); + auto tile_ofm_simd = GetTileOFM(params) * simd; + auto key = layout_map_key(tile_ifm, tile_ofm_simd); + auto it = lt_map.find(key); + if (it == lt_map.end()) { + // Params are not valid for this implementation, return anything to allow Validate to reject + return WeightsLayout::goizyx; + } + auto layout = it->second; + return layout; +} + +DeconvolutionKernelBase::DispatchData DeconvolutionKernel_imad_along_f_tile_bfx::SetDefault(const deconvolution_params& params) const { + auto dispatch = Parent::SetDefault(params); + + auto tile_x = GetTileX(params); + auto tile_ofm = GetTileOFM(params); + auto tile_b = GetTileB(params); + + std::vector global = { + CeilDiv(params.output.X().v, tile_x) * params.output.Y().v * params.output.Z().v, + Align(CeilDiv(params.output.Feature().v, tile_ofm), simd), + CeilDiv(params.output.Batch().v, tile_b) + }; + + std::vector local = { 1, simd, 1 }; + + dispatch.gws0 = global[0]; + dispatch.gws1 = global[1]; + dispatch.gws2 = global[2]; + + dispatch.lws0 = local[0]; + dispatch.lws1 = local[1]; + dispatch.lws2 = local[2]; + + // Currently most optimized for fsv16 formats + if (params.inputs[0].GetLayout() == DataLayout::b_fs_yx_fsv16 || params.inputs[0].GetLayout() == DataLayout::b_fs_zyx_fsv16) { + dispatch.efficiency = FORCE_PRIORITY_7; + } else { + dispatch.efficiency = FORCE_PRIORITY_8; + } + + return dispatch; +} + +JitConstants DeconvolutionKernel_imad_along_f_tile_bfx::GetJitConstants(const deconvolution_params& params) const { + auto jit = Parent::GetJitConstants(params); + auto tile_ifm = GetTileIFM(params); + auto tile_x = GetTileX(params); + auto tile_ofm = GetTileOFM(params); + auto tile_b = GetTileB(params); + + jit.AddConstant(MakeJitConstant("TILE_IFM", tile_ifm)); + jit.AddConstant(MakeJitConstant("TILE_X", tile_x)); + jit.AddConstant(MakeJitConstant("TILE_OFM", tile_ofm)); + jit.AddConstant(MakeJitConstant("TILE_B", tile_b)); + jit.AddConstant(MakeJitConstant("SIMD", simd)); + + auto& in = params.inputs[0]; + auto in_layout = in.GetLayout(); + + // Layout specific params + size_t input_tile_ifm_pitch = 0; + size_t input_in_tile_batch_pitch = 0; + size_t zyx_pitch_factor = in.Z().LogicalDimPadded() * in.Y().LogicalDimPadded() * in.X().LogicalDimPadded(); + + if (in_layout == DataLayout::b_fs_yx_fsv16 || in_layout == DataLayout::b_fs_zyx_fsv16) { + if (tile_ifm == 16) { + input_tile_ifm_pitch = zyx_pitch_factor * 16; + } + input_in_tile_batch_pitch = Align(in.Feature().LogicalDimPadded(), 16) * zyx_pitch_factor; + } else if (in_layout == DataLayout::b_fs_yx_fsv32 || in_layout == DataLayout::b_fs_yx_fsv32) { + if (tile_ifm == 32) { + input_tile_ifm_pitch = zyx_pitch_factor * 32; + } + input_in_tile_batch_pitch = Align(in.Feature().LogicalDimPadded(), 32) * zyx_pitch_factor; + } else if (in_layout == DataLayout::bs_fs_yx_bsv16_fsv16 || in_layout == DataLayout::bs_fs_zyx_bsv16_fsv16) { + if (tile_ifm == 16) { + input_tile_ifm_pitch = zyx_pitch_factor * 16 * 16; + } + input_in_tile_batch_pitch = 16; + } else if (in_layout == DataLayout::byxf_af32) { + input_tile_ifm_pitch = tile_ifm; + input_in_tile_batch_pitch = zyx_pitch_factor * Align(in.Feature().LogicalDimPadded(), 32); + } + + jit.AddConstant(MakeJitConstant("INPUT_VALID_TILE_IFM_PITCH", input_tile_ifm_pitch != 0)); + jit.AddConstant(MakeJitConstant("INPUT_TILE_IFM_PITCH", input_tile_ifm_pitch)); + jit.AddConstant(MakeJitConstant("INPUT_IN_TILE_B_PITCH", input_in_tile_batch_pitch)); + + if (params.output.GetLayout() == DataLayout::b_fs_yx_fsv16 || params.output.GetLayout() == DataLayout::b_fs_zyx_fsv16) { + jit.AddConstant(MakeJitConstant("OUTPUT_BLOCK_X_STORE", true)); + } else { + jit.AddConstant(MakeJitConstant("OUTPUT_NAIVE_STORE", true)); + } + + if (!params.fused_ops.empty()) { + auto fused_in_dt = GetActivationType(params); + std::vector idx_order; + if (params.output.Dimentions() <= 4) { + idx_order = { "(out_b + ob)", "(out_f + of * SIMD)", "out_y", "(out_x + tx)" }; + } else { + idx_order = { "(out_b + ob)", "(out_f + of * SIMD)", "out_z", "out_y", "(out_x + tx)" }; + } + auto boundary_check = BoundaryCheck::DISABLED; + if (params.output.X().v % tile_x != 0 + || params.output.Feature().v % (tile_ofm * simd) != 0 + || params.output.Batch().v % tile_b != 0) { + boundary_check = BoundaryCheck::ENABLED; + } + std::vector loop_axes = { Tensor::DataChannelName::X }; + if (tile_b != 1) { + loop_axes.push_back(Tensor::DataChannelName::BATCH); + } else { + idx_order[0] = "out_b"; + } + + auto conf = FusedOpsConfiguration{ "", + idx_order, + "dequantized[ob][of][tx]", + fused_in_dt, + 1, + LoadType::LT_UNALIGNED, + boundary_check, + IndexType::TENSOR_COORD, + Tensor::DataChannelName::X, + loop_axes, + true }; + + jit.Merge(MakeFusedOpsJitConstants(params, { conf })); + } + + return jit; +} + +size_t DeconvolutionKernel_imad_along_f_tile_bfx::GetTileIFM(const deconvolution_params& params) const { + size_t fsv = 4; + if (params.inputs[0].GetLayout() == DataLayout::b_fs_yx_fsv16 + || params.inputs[0].GetLayout() == DataLayout::b_fs_zyx_fsv16 + || params.inputs[0].GetLayout() == DataLayout::bs_fs_yx_bsv16_fsv16 + || params.inputs[0].GetLayout() == DataLayout::bs_fs_zyx_bsv16_fsv16) { + fsv = 16; + } + if (params.inputs[0].GetLayout() == DataLayout::b_fs_yx_fsv32 + || params.inputs[0].GetLayout() == DataLayout::b_fs_zyx_fsv32 + || params.inputs[0].GetLayout() == DataLayout::byxf_af32) { + fsv = 32; + } + + auto ifm = params.weights.IFM().v; + bool grouped = params.groups > 1; + auto pref_tile_ifm = std::min(fsv, ifm); + + std::vector allowed_tile_ifm = { 4, 16, 32 }; + size_t tile_ifm = 1; + for (auto candidate : allowed_tile_ifm) { + if (candidate <= pref_tile_ifm + && (!grouped || ifm % candidate == 0)) + tile_ifm = candidate; + } + return tile_ifm; +} + +size_t DeconvolutionKernel_imad_along_f_tile_bfx::GetTileOFM(const deconvolution_params& params) const { + // TODO Loosen divisibility requirement for tile ofm 2 + if (params.weights.OFM().v % (simd * 2) == 0 && params.output.Batch().v % 2 != 0) + return 2; + + return 1; +} + +size_t DeconvolutionKernel_imad_along_f_tile_bfx::GetTileX(const deconvolution_params& params) const { + constexpr size_t max_tile_x = simd; + if (params.output.X().v <= max_tile_x) + return params.output.X().v; + + return max_tile_x; +} + +size_t DeconvolutionKernel_imad_along_f_tile_bfx::GetTileB(const deconvolution_params& params) const { + if (params.output.Batch().v % 2 == 0) + return 2; + + return 1; +} + +} // namespace kernel_selector diff --git a/inference-engine/thirdparty/clDNN/kernel_selector/core/actual_kernels/deconvolution/deconvolution_kernel_imad_along_f_tile_bfx.hpp b/inference-engine/thirdparty/clDNN/kernel_selector/core/actual_kernels/deconvolution/deconvolution_kernel_imad_along_f_tile_bfx.hpp new file mode 100644 index 00000000000..9732a1ca790 --- /dev/null +++ b/inference-engine/thirdparty/clDNN/kernel_selector/core/actual_kernels/deconvolution/deconvolution_kernel_imad_along_f_tile_bfx.hpp @@ -0,0 +1,51 @@ +// Copyright (c) 2020 Intel Corporation +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#pragma once + +#include "deconvolution_kernel_base.h" +#include + +namespace kernel_selector { + +class DeconvolutionKernel_imad_along_f_tile_bfx : public DeconvolutionKernelBase { +public: + using Parent = DeconvolutionKernelBase; + DeconvolutionKernel_imad_along_f_tile_bfx() : DeconvolutionKernelBase("deconvolution_gpu_imad_along_f_tile_bfx") {} + virtual ~DeconvolutionKernel_imad_along_f_tile_bfx() = default; + + ParamsKey GetSupportedKey() const override; + +protected: + bool Validate(const Params& p, const optional_params& o) const override; + WeightsLayout GetPreferredWeightsLayout(const deconvolution_params ¶ms) const override; + CommonDispatchData SetDefault(const deconvolution_params& params) const override; + JitConstants GetJitConstants(const deconvolution_params& params) const override; + + std::vector GetSupportedFusedOps() const override { + return { + FusedOpType::ACTIVATION, + FusedOpType::ELTWISE, + FusedOpType::SCALE, + FusedOpType::QUANTIZE + }; + } + + size_t GetTileIFM(const deconvolution_params& params) const; + size_t GetTileOFM(const deconvolution_params& params) const; + size_t GetTileX(const deconvolution_params& params) const; + size_t GetTileB(const deconvolution_params& params) const; +}; + +} // namespace kernel_selector diff --git a/inference-engine/thirdparty/clDNN/kernel_selector/core/actual_kernels/deconvolution/deconvolution_kernel_imad_ref.cpp b/inference-engine/thirdparty/clDNN/kernel_selector/core/actual_kernels/deconvolution/deconvolution_kernel_imad_ref.cpp new file mode 100644 index 00000000000..9edde95f13e --- /dev/null +++ b/inference-engine/thirdparty/clDNN/kernel_selector/core/actual_kernels/deconvolution/deconvolution_kernel_imad_ref.cpp @@ -0,0 +1,110 @@ +// Copyright (c) 2020 Intel Corporation +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#include "deconvolution_kernel_imad_ref.hpp" + +#include "kernel_selector_utils.h" + +#include +#include + +namespace kernel_selector { + +ParamsKey DeconvolutionKernel_imad_ref::GetSupportedKey() const { + ParamsKey k; + k.EnableInputDataType(Datatype::INT8); + k.EnableInputDataType(Datatype::UINT8); + k.EnableOutputDataType(Datatype::F32); + k.EnableOutputDataType(Datatype::F16); + k.EnableOutputDataType(Datatype::INT8); + k.EnableOutputDataType(Datatype::UINT8); + k.EnableInputWeightsType(WeightsType::INT8); + k.EnableInputWeightsType(WeightsType::UINT8); + + k.EnableInputLayout(DataLayout::b_fs_yx_fsv4); + k.EnableInputLayout(DataLayout::b_fs_yx_fsv16); + k.EnableInputLayout(DataLayout::b_fs_zyx_fsv16); + k.EnableInputLayout(DataLayout::bs_fs_yx_bsv16_fsv16); + k.EnableInputLayout(DataLayout::bs_fs_zyx_bsv16_fsv16); + k.EnableInputLayout(DataLayout::b_fs_yx_fsv32); + k.EnableInputLayout(DataLayout::b_fs_zyx_fsv32); + k.EnableInputLayout(DataLayout::byxf_af32); + k.EnableAllOutputLayout(); + + k.EnableDifferentTypes(); + k.EnableDifferentInputWeightsTypes(); + k.EnableBatching(); + k.EnableTensorPitches(); + k.EnableTensorOffset(); + k.EnableBiasPerFeature(); + k.EnableNonBiasTerm(); + k.EnableGroupedConvolution(); + + return k; +} + +WeightsLayout DeconvolutionKernel_imad_ref::GetPreferredWeightsLayout(const deconvolution_params&) const { + return WeightsLayout::g_os_zyx_is_osv32_isv4; +} + +DeconvolutionKernelBase::DispatchData DeconvolutionKernel_imad_ref::SetDefault(const deconvolution_params& params) const { + auto dispatch = Parent::SetDefault(params); + + std::vector global = { + params.output.Feature().v, + params.output.X().v * params.output.Y().v * params.output.Z().v, + params.output.Batch().v + }; + + auto local = GetOptimalLocalWorkGroupSizes(global, params.engineInfo); + + dispatch.gws0 = global[0]; + dispatch.gws1 = global[1]; + dispatch.gws2 = global[2]; + + dispatch.lws0 = local[0]; + dispatch.lws1 = local[1]; + dispatch.lws2 = local[2]; + + dispatch.efficiency = FORCE_PRIORITY_9; + + return dispatch; +} + +JitConstants DeconvolutionKernel_imad_ref::GetJitConstants(const deconvolution_params& params) const { + auto jit = Parent::GetJitConstants(params); + auto tile_ifm = GetTileIFM(params); + + jit.AddConstant(MakeJitConstant("TILE_IFM", tile_ifm)); + + if (!params.fused_ops.empty()) { + std::vector idx_order; + if (params.output.Dimentions() <= 4) { + idx_order = { "out_b", "out_f", "out_y", "out_x" }; + } else { + idx_order = { "out_b", "out_f", "out_z", "out_y", "out_x" }; + } + auto conf = FusedOpsConfiguration{ "", idx_order, "dequantized", GetActivationType(params), 1, LoadType::LT_UNALIGNED, BoundaryCheck::DISABLED }; + jit.Merge(MakeFusedOpsJitConstants(params, { conf })); + } + + return jit; +} + +size_t DeconvolutionKernel_imad_ref::GetTileIFM(const deconvolution_params&) const { + return 4; +} + + +} // namespace kernel_selector diff --git a/inference-engine/thirdparty/clDNN/kernel_selector/core/actual_kernels/deconvolution/deconvolution_kernel_imad_ref.hpp b/inference-engine/thirdparty/clDNN/kernel_selector/core/actual_kernels/deconvolution/deconvolution_kernel_imad_ref.hpp new file mode 100644 index 00000000000..297bb61bee2 --- /dev/null +++ b/inference-engine/thirdparty/clDNN/kernel_selector/core/actual_kernels/deconvolution/deconvolution_kernel_imad_ref.hpp @@ -0,0 +1,47 @@ +// Copyright (c) 2020 Intel Corporation +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#pragma once + +#include "deconvolution_kernel_base.h" +#include + +namespace kernel_selector { + +class DeconvolutionKernel_imad_ref : public DeconvolutionKernelBase { +public: + using Parent = DeconvolutionKernelBase; + DeconvolutionKernel_imad_ref() : DeconvolutionKernelBase("deconvolution_gpu_imad_ref") {} + virtual ~DeconvolutionKernel_imad_ref() = default; + + ParamsKey GetSupportedKey() const override; + +protected: + WeightsLayout GetPreferredWeightsLayout(const deconvolution_params ¶ms) const override; + CommonDispatchData SetDefault(const deconvolution_params& params) const override; + JitConstants GetJitConstants(const deconvolution_params& params) const override; + + std::vector GetSupportedFusedOps() const override { + return { + FusedOpType::ACTIVATION, + FusedOpType::ELTWISE, + FusedOpType::SCALE, + FusedOpType::QUANTIZE + }; + } + + size_t GetTileIFM(const deconvolution_params& params) const; +}; + +} // namespace kernel_selector diff --git a/inference-engine/thirdparty/clDNN/kernel_selector/core/actual_kernels/deconvolution/deconvolution_kernel_ref.cpp b/inference-engine/thirdparty/clDNN/kernel_selector/core/actual_kernels/deconvolution/deconvolution_kernel_ref.cpp index 90cb7f23e48..4f6bfc29ade 100644 --- a/inference-engine/thirdparty/clDNN/kernel_selector/core/actual_kernels/deconvolution/deconvolution_kernel_ref.cpp +++ b/inference-engine/thirdparty/clDNN/kernel_selector/core/actual_kernels/deconvolution/deconvolution_kernel_ref.cpp @@ -20,10 +20,19 @@ ParamsKey DeconvolutionKernelRef::GetSupportedKey() const { ParamsKey k; k.EnableInputDataType(Datatype::F16); k.EnableInputDataType(Datatype::F32); + k.EnableInputDataType(Datatype::INT8); + k.EnableInputDataType(Datatype::UINT8); + k.EnableInputWeightsType(WeightsType::F16); k.EnableInputWeightsType(WeightsType::F32); + k.EnableInputWeightsType(WeightsType::INT8); + k.EnableInputWeightsType(WeightsType::UINT8); + k.EnableOutputDataType(Datatype::F16); k.EnableOutputDataType(Datatype::F32); + k.EnableOutputDataType(Datatype::INT8); + k.EnableOutputDataType(Datatype::UINT8); + k.EnableInputLayout(DataLayout::yxfb); k.EnableInputLayout(DataLayout::bfyx); k.EnableInputLayout(DataLayout::byxf); @@ -38,6 +47,7 @@ ParamsKey DeconvolutionKernelRef::GetSupportedKey() const { k.EnableOutputLayout(DataLayout::b_fs_yx_fsv16); k.EnableOutputLayout(DataLayout::b_fs_zyx_fsv16); k.EnableOutputLayout(DataLayout::bs_fs_zyx_bsv16_fsv16); + k.EnableTensorOffset(); k.EnableTensorPitches(); k.EnableBiasPerFeature(); @@ -47,6 +57,8 @@ ParamsKey DeconvolutionKernelRef::GetSupportedKey() const { k.EnableDepthwiseSeparableOpt(); k.EnableGradient(); k.EnableGroupedConvolution(); + k.EnableDifferentTypes(); + k.EnableDifferentInputWeightsTypes(); return k; } @@ -73,6 +85,19 @@ JitConstants DeconvolutionKernelRef::GetJitConstants(const deconvolution_params& if (params.output.Feature().v * params.output.Batch().v <= 16) jit.AddConstant(MakeJitConstant("DIM_ORDER_XYBF", 1)); + if (!params.fused_ops.empty()) { + auto fused_dt = GetActivationType(params); + std::vector idx_order; + if (params.output.Dimentions() <= 4) { + idx_order = { "batch_offset", "ofm_offset", "out_y", "out_x" }; + } else { + idx_order = { "batch_offset", "ofm_offset", "out_z", "out_y", "out_x" }; + } + FusedOpsConfiguration conf = { "", idx_order, "post_activation", fused_dt, 1, LoadType::LT_UNALIGNED, BoundaryCheck::DISABLED }; + + jit.Merge(MakeFusedOpsJitConstants(params, { conf })); + } + return jit; } } // namespace kernel_selector diff --git a/inference-engine/thirdparty/clDNN/kernel_selector/core/actual_kernels/deconvolution/deconvolution_kernel_ref.h b/inference-engine/thirdparty/clDNN/kernel_selector/core/actual_kernels/deconvolution/deconvolution_kernel_ref.h index 34a4e2bec49..09c1dbd859c 100644 --- a/inference-engine/thirdparty/clDNN/kernel_selector/core/actual_kernels/deconvolution/deconvolution_kernel_ref.h +++ b/inference-engine/thirdparty/clDNN/kernel_selector/core/actual_kernels/deconvolution/deconvolution_kernel_ref.h @@ -29,5 +29,14 @@ public: protected: CommonDispatchData SetDefault(const deconvolution_params& params) const override; JitConstants GetJitConstants(const deconvolution_params& params) const override; + + std::vector GetSupportedFusedOps() const override { + return { + FusedOpType::ACTIVATION, + FusedOpType::ELTWISE, + FusedOpType::SCALE, + FusedOpType::QUANTIZE + }; + } }; -} // namespace kernel_selector \ No newline at end of file +} // namespace kernel_selector diff --git a/inference-engine/thirdparty/clDNN/kernel_selector/core/actual_kernels/deconvolution/deconvolution_kernel_selector.cpp b/inference-engine/thirdparty/clDNN/kernel_selector/core/actual_kernels/deconvolution/deconvolution_kernel_selector.cpp index 6c2852c3500..b8a02480456 100644 --- a/inference-engine/thirdparty/clDNN/kernel_selector/core/actual_kernels/deconvolution/deconvolution_kernel_selector.cpp +++ b/inference-engine/thirdparty/clDNN/kernel_selector/core/actual_kernels/deconvolution/deconvolution_kernel_selector.cpp @@ -18,6 +18,8 @@ #include "deconvolution_kernel_bfyx_opt.h" #include "deconvolution_kernel_b_fs_zyx_fsv16.h" #include "deconvolution_kernel_b_fs_zyx_fsv16_dw.h" +#include "deconvolution_kernel_imad_ref.hpp" +#include "deconvolution_kernel_imad_along_f_tile_bfx.hpp" namespace kernel_selector { deconvolution_kernel_selector::deconvolution_kernel_selector() { @@ -25,6 +27,8 @@ deconvolution_kernel_selector::deconvolution_kernel_selector() { Attach(); Attach(); Attach(); + Attach(); + Attach(); } KernelsData deconvolution_kernel_selector::GetBestKernels(const Params& params, const optional_params& options) const { diff --git a/inference-engine/thirdparty/clDNN/kernel_selector/core/actual_kernels/eltwise/eltwise_kernel_b_fs_yx_fsv16.cpp b/inference-engine/thirdparty/clDNN/kernel_selector/core/actual_kernels/eltwise/eltwise_kernel_b_fs_yx_fsv16.cpp index c1bbf41d94f..102fcf2a59f 100644 --- a/inference-engine/thirdparty/clDNN/kernel_selector/core/actual_kernels/eltwise/eltwise_kernel_b_fs_yx_fsv16.cpp +++ b/inference-engine/thirdparty/clDNN/kernel_selector/core/actual_kernels/eltwise/eltwise_kernel_b_fs_yx_fsv16.cpp @@ -163,9 +163,18 @@ bool EltwiseKernel_b_fs_yx_fsv16::Validate(const Params& params, const optional_ auto input0 = ewParams.inputs[0]; + // Check that padding before features doesn't miss-align the blocks + auto feature_block_size = 16; + if (input0.Feature().pad.before % feature_block_size != 0 || output.Feature().pad.before % feature_block_size != 0) { + return false; + } + for (size_t i = 1; i < ewParams.inputs.size(); i++) { if (ewParams.inputs[i].LogicalSize() == input0.LogicalSize() && !(ewParams.inputs[i] == input0)) return false; + if (ewParams.inputs[i].Feature().pad.before % feature_block_size != 0) { + return false; + } } return true; diff --git a/inference-engine/thirdparty/clDNN/kernel_selector/core/actual_kernels/pooling/pooling_kernel_gpu_b_fs_yx_fsv16.cpp b/inference-engine/thirdparty/clDNN/kernel_selector/core/actual_kernels/pooling/pooling_kernel_gpu_b_fs_yx_fsv16.cpp index 01e52ff7865..31a2ac39c40 100644 --- a/inference-engine/thirdparty/clDNN/kernel_selector/core/actual_kernels/pooling/pooling_kernel_gpu_b_fs_yx_fsv16.cpp +++ b/inference-engine/thirdparty/clDNN/kernel_selector/core/actual_kernels/pooling/pooling_kernel_gpu_b_fs_yx_fsv16.cpp @@ -99,6 +99,13 @@ bool PoolingKernel_b_fs_yx_fsv16::Validate(const Params& p, const optional_param return false; } + const auto& params = static_cast(p); + const auto feature_block_size = 16; + + // Check that padding features doesn't miss-align the blocks + if (params.inputs[0].Feature().pad.before % feature_block_size != 0 || params.output.Feature().pad.before % feature_block_size != 0) + return false; + return true; } diff --git a/inference-engine/thirdparty/clDNN/kernel_selector/core/actual_kernels/quantize/quantize_kernel_params.h b/inference-engine/thirdparty/clDNN/kernel_selector/core/actual_kernels/quantize/quantize_kernel_params.h index 250b6cb56f3..388c0d6fb56 100644 --- a/inference-engine/thirdparty/clDNN/kernel_selector/core/actual_kernels/quantize/quantize_kernel_params.h +++ b/inference-engine/thirdparty/clDNN/kernel_selector/core/actual_kernels/quantize/quantize_kernel_params.h @@ -54,6 +54,7 @@ struct quantize_fuse_params : fuse_params { bool has_post_scale, bool has_post_shift, bool has_pre_shift, + bool has_clamp, bool per_tensor_input_range, bool per_tensor_input_scale, bool per_tensor_input_shift, @@ -70,6 +71,7 @@ struct quantize_fuse_params : fuse_params { , has_post_scale(has_post_scale) , has_post_shift(has_post_shift) , has_pre_shift(has_pre_shift) + , has_clamp(has_clamp) , per_tensor_input_range(per_tensor_input_range) , per_tensor_input_scale(per_tensor_input_scale) , per_tensor_input_shift(per_tensor_input_shift) @@ -86,6 +88,7 @@ struct quantize_fuse_params : fuse_params { bool has_post_scale; bool has_post_shift; bool has_pre_shift; + bool has_clamp; bool per_tensor_input_range; bool per_tensor_input_scale; diff --git a/inference-engine/thirdparty/clDNN/kernel_selector/core/actual_kernels/reorder/reorder_kernel_base.cpp b/inference-engine/thirdparty/clDNN/kernel_selector/core/actual_kernels/reorder/reorder_kernel_base.cpp index 205cd16cd4d..b8536d75866 100644 --- a/inference-engine/thirdparty/clDNN/kernel_selector/core/actual_kernels/reorder/reorder_kernel_base.cpp +++ b/inference-engine/thirdparty/clDNN/kernel_selector/core/actual_kernels/reorder/reorder_kernel_base.cpp @@ -90,6 +90,10 @@ inline JitConstants MakeReorderWeightsJitConstants(const reorder_weights_params& MakeJitConstant("OUTPUT", output), }; + if (params.rotate_180) { + jit.AddConstant(MakeJitConstant("REORDER_ROTATE", params.rotate_180)); + } + if (fp16Supported) { jit.Merge(MakeUnitTypeJitConstants(Datatype::F16)); } else { diff --git a/inference-engine/thirdparty/clDNN/kernel_selector/core/actual_kernels/reorder/reorder_kernel_base.h b/inference-engine/thirdparty/clDNN/kernel_selector/core/actual_kernels/reorder/reorder_kernel_base.h index 68775383687..f10460f303c 100644 --- a/inference-engine/thirdparty/clDNN/kernel_selector/core/actual_kernels/reorder/reorder_kernel_base.h +++ b/inference-engine/thirdparty/clDNN/kernel_selector/core/actual_kernels/reorder/reorder_kernel_base.h @@ -63,6 +63,7 @@ struct reorder_weights_params : public Params { WeightsTensor input; WeightsTensor output; bool winograd = false; + bool rotate_180 = false; virtual ParamsKey GetParamsKey() const { ParamsKey k; @@ -82,6 +83,10 @@ struct reorder_weights_params : public Params { if (winograd) { k.EnableWinogradReorder(); } + + if (rotate_180) { + k.EnableRotateReorder(); + } return k; } }; diff --git a/inference-engine/thirdparty/clDNN/kernel_selector/core/actual_kernels/reorder/reorder_weights_kernel.cpp b/inference-engine/thirdparty/clDNN/kernel_selector/core/actual_kernels/reorder/reorder_weights_kernel.cpp index 164ec00834e..7d158ddd253 100644 --- a/inference-engine/thirdparty/clDNN/kernel_selector/core/actual_kernels/reorder/reorder_weights_kernel.cpp +++ b/inference-engine/thirdparty/clDNN/kernel_selector/core/actual_kernels/reorder/reorder_weights_kernel.cpp @@ -31,6 +31,7 @@ ParamsKey ReorderWeightsKernel::GetSupportedKey() const { k.EnableDifferentTypes(); k.EnableTensorOffset(); k.EnableTensorPitches(); + k.EnableRotateReorder(); return k; } @@ -38,4 +39,4 @@ KernelsData ReorderWeightsKernel::GetKernelsData(const Params& params, const opt const reorder_weights_params& orgParams = static_cast(params); return GetCommonKernelsData(orgParams, options, DONT_USE_IF_HAVE_SOMETHING_ELSE); } -} // namespace kernel_selector \ No newline at end of file +} // namespace kernel_selector diff --git a/inference-engine/thirdparty/clDNN/kernel_selector/core/cl_kernels/activation_opt.cl b/inference-engine/thirdparty/clDNN/kernel_selector/core/cl_kernels/activation_opt.cl index 026d717263b..6e34d064956 100644 --- a/inference-engine/thirdparty/clDNN/kernel_selector/core/cl_kernels/activation_opt.cl +++ b/inference-engine/thirdparty/clDNN/kernel_selector/core/cl_kernels/activation_opt.cl @@ -18,32 +18,40 @@ #include "include/data_types.cl" KERNEL(activation)( -#if GRADIENT - __global UNIT_TYPE* input_grad, - __global UNIT_TYPE* output, - __global UNIT_TYPE* input -#else - __global UNIT_TYPE* input, - __global UNIT_TYPE* output + __global INPUT0_TYPE* input, + __global OUTPUT_TYPE* output +#if HAS_FUSED_OPS_DECLS + , FUSED_OPS_DECLS #endif ) { const unsigned int x = (uint)get_global_id(0) * NUM_COLS_WI; +#if OUTPUT_DIMS == 5 + const unsigned int fo_x = x % OUTPUT_SIZE_X; + const unsigned int fo_y = x / OUTPUT_SIZE_X % OUTPUT_SIZE_Y; + const unsigned int fo_z = x / (OUTPUT_SIZE_X * OUTPUT_SIZE_Y) % OUTPUT_SIZE_Z; + const unsigned int fo_f = x / (OUTPUT_SIZE_X * OUTPUT_SIZE_Y * OUTPUT_SIZE_Z) % OUTPUT_FEATURE_NUM; + const unsigned int fo_b = x / (OUTPUT_SIZE_X * OUTPUT_SIZE_Y * OUTPUT_SIZE_Z* OUTPUT_FEATURE_NUM); +#elif OUTPUT_DIMS == 4 + const unsigned int fo_x = x % OUTPUT_SIZE_X; + const unsigned int fo_y = x / OUTPUT_SIZE_X % OUTPUT_SIZE_Y; + const unsigned int fo_f = x / (OUTPUT_SIZE_X * OUTPUT_SIZE_Y) % OUTPUT_FEATURE_NUM; + const unsigned int fo_b = x / (OUTPUT_SIZE_X * OUTPUT_SIZE_Y * OUTPUT_FEATURE_NUM); +#endif unsigned int input_offset = x + INPUT0_OFFSET; unsigned int output_offset = x + OUTPUT_OFFSET; - typedef CAT(UNIT_TYPE, 4) type_t; -#if GRADIENT - type_t g = ((__global type_t*) (input_grad + input_offset))[0]; -#endif - type_t v = ((__global type_t*) (input + input_offset))[0]; + typedef CAT(INPUT0_TYPE, 4) input_t; + typedef CAT(OUTPUT_TYPE, 4) output_t; -#if GRADIENT - v = ACTIVATION(g, v, ACTIVATION_PARAMS); + input_t v = ((__global input_t*) (input + input_offset))[0]; + + v = ACTIVATION_KERNEL(v, ACTIVATION_PARAMS_KERNEL); +#if HAS_FUSED_OPS + FUSED_OPS; + *((__global output_t*)(output + output_offset)) = FUSED_OPS_RESULT; #else - v = ACTIVATION(v, ACTIVATION_PARAMS); + *((__global output_t*)(output + output_offset)) = v; #endif - - *((__global type_t*)(output + output_offset)) = v; } diff --git a/inference-engine/thirdparty/clDNN/kernel_selector/core/cl_kernels/activation_ref.cl b/inference-engine/thirdparty/clDNN/kernel_selector/core/cl_kernels/activation_ref.cl index 90660861f6c..9caafc47a59 100644 --- a/inference-engine/thirdparty/clDNN/kernel_selector/core/cl_kernels/activation_ref.cl +++ b/inference-engine/thirdparty/clDNN/kernel_selector/core/cl_kernels/activation_ref.cl @@ -26,16 +26,13 @@ // TODO: move it from layout based to memory based KERNEL(activation)( -#if GRADIENT - __global UNIT_TYPE* input_grad, - __global UNIT_TYPE* output_grad, - __global UNIT_TYPE* input -#else - __global UNIT_TYPE* input, - __global UNIT_TYPE* output -#endif + __global INPUT0_TYPE* input, + __global OUTPUT_TYPE* output #ifdef PARAMETERIZED , __global ADDITIONAL_PARAMS_TYPE* params +#endif +#if HAS_FUSED_OPS_DECLS + , FUSED_OPS_DECLS #endif ) { @@ -45,7 +42,7 @@ KERNEL(activation)( #define ORDER batch,feature,y,x #endif -#if defined OUTPUT_LAYOUT_BFZYX +#if OUTPUT_DIMS == 5 const unsigned x = get_global_id(0); const uint y = (uint)get_global_id(1) % OUTPUT_SIZE_Y; const uint z = (uint)get_global_id(1) / OUTPUT_SIZE_Y; @@ -82,12 +79,7 @@ KERNEL(activation)( #endif #endif -#if GRADIENT - const unsigned src_grad_index = GET_INDEX(INPUT,0,ORDER); - const unsigned src_index = GET_INDEX(INPUT,1,ORDER); -#else const unsigned src_index = GET_INDEX(INPUT,0,ORDER); -#endif const unsigned dst_index = GET_INDEX(OUTPUT,,ORDER); #if defined PARAMETERIZED @@ -105,16 +97,20 @@ KERNEL(activation)( #endif #define PARAMETERIZED_ACTIVATION_PARAMS NL_M_PARAMETERIZED, NL_N_PARAMETERIZED - #if GRADIENT - output_grad[dst_index] = ACTIVATION(input_grad[src_grad_index], input[src_index], PARAMETERIZED_ACTIVATION_PARAMS); + INPUT0_TYPE dst = ACTIVATION_KERNEL(input[src_index], PARAMETERIZED_ACTIVATION_PARAMS); + #if HAS_FUSED_OPS + FUSED_OPS; + output[dst_index] = FUSED_OPS_RESULT; #else - output[dst_index] = ACTIVATION(input[src_index], PARAMETERIZED_ACTIVATION_PARAMS); + output[dst_index] = dst; #endif #else - #if GRADIENT - output_grad[dst_index] = ACTIVATION(input_grad[src_grad_index], input[src_index], ACTIVATION_PARAMS); + INPUT0_TYPE dst = ACTIVATION_KERNEL(input[src_index], ACTIVATION_PARAMS); + #if HAS_FUSED_OPS + FUSED_OPS; + output[dst_index] = FUSED_OPS_RESULT; #else - output[dst_index] = ACTIVATION(input[src_index], ACTIVATION_PARAMS); + output[dst_index] = dst; #endif #endif } diff --git a/inference-engine/thirdparty/clDNN/kernel_selector/core/cl_kernels/convolution_gpu_bfyx_to_bfyx_f16.cl b/inference-engine/thirdparty/clDNN/kernel_selector/core/cl_kernels/convolution_gpu_bfyx_to_bfyx_f16.cl index 302d75c0782..7c6b06daf71 100644 --- a/inference-engine/thirdparty/clDNN/kernel_selector/core/cl_kernels/convolution_gpu_bfyx_to_bfyx_f16.cl +++ b/inference-engine/thirdparty/clDNN/kernel_selector/core/cl_kernels/convolution_gpu_bfyx_to_bfyx_f16.cl @@ -112,9 +112,9 @@ KERNEL(convolution_bfyx_to_bfyx_f16)( __attribute__((opencl_unroll_hint(INPUT_BLOCK_SIZE))) for (int i = 0; i < INPUT_BLOCK_SIZE; i++) { - const uint in_elem = i * SUB_GROUP_SIZE + lid; - const uint xb = in_elem % INPUT_LINE_SIZE; - const uint yb = in_elem / INPUT_LINE_SIZE; + const int in_elem = i * SUB_GROUP_SIZE + lid; + const int xb = in_elem % INPUT_LINE_SIZE; + const int yb = in_elem / INPUT_LINE_SIZE; if (input_y + yb >= 0 && input_y + yb < INPUT0_SIZE_Y && input_x + xb >= 0 && input_x + xb < INPUT0_SIZE_X) line_cache[ic * INPUT_BLOCK_SIZE + i] = input[input_offset + diff --git a/inference-engine/thirdparty/clDNN/kernel_selector/core/cl_kernels/convolution_gpu_mmad_bfyx_to_b_fs_yx_fsv32.cl b/inference-engine/thirdparty/clDNN/kernel_selector/core/cl_kernels/convolution_gpu_mmad_bfyx_to_b_fs_yx_fsv32.cl index fe1c4064ba5..b30b27a4763 100644 --- a/inference-engine/thirdparty/clDNN/kernel_selector/core/cl_kernels/convolution_gpu_mmad_bfyx_to_b_fs_yx_fsv32.cl +++ b/inference-engine/thirdparty/clDNN/kernel_selector/core/cl_kernels/convolution_gpu_mmad_bfyx_to_b_fs_yx_fsv32.cl @@ -292,7 +292,7 @@ KERNEL(convolution_mmad_bfyx_to_b_fs_yx_fsv32)( #else // OUTPUT_FEATURE_NUM > 16 const uint dst_index = OUTPUT_GET_INDEX(b, fg*OSV + lid, y, x+i); if (x + i < OUTPUT_SIZE_X && fg*OSV + lid < OUTPUT_FEATURE_NUM) { - output[dst_index] = dst[ofm][i]; + output[dst_index] = dst[0][i]; } #endif // OUTPUT_FEATURE_NUM > 16 } diff --git a/inference-engine/thirdparty/clDNN/kernel_selector/core/cl_kernels/deconvolution_gpu_b_fs_zyx_fsv16_dw.cl b/inference-engine/thirdparty/clDNN/kernel_selector/core/cl_kernels/deconvolution_gpu_b_fs_zyx_fsv16_dw.cl index edb37951f1e..9b4408a4178 100644 --- a/inference-engine/thirdparty/clDNN/kernel_selector/core/cl_kernels/deconvolution_gpu_b_fs_zyx_fsv16_dw.cl +++ b/inference-engine/thirdparty/clDNN/kernel_selector/core/cl_kernels/deconvolution_gpu_b_fs_zyx_fsv16_dw.cl @@ -15,19 +15,58 @@ *******************************************************************************/ #include "include/include_all.cl" -#include "include/unit_type.cl" +#include "include/data_types.cl" + +#include "deconvolution_gpu_imad_common.cl" #define unroll_for __attribute__((opencl_unroll_hint)) for #define FEATURE_SLICE_SIZE 16 + #if X_BLOCK_SIZE == 1 - #define BLOCK_TYPE UNIT_TYPE - #define DST_VAR dst + #define GET_VEC_ELEM(var, idx) var #else - #define BLOCK_TYPE CAT(UNIT_TYPE, X_BLOCK_SIZE) - #define DST_VAR dst[x_block] + #define GET_VEC_ELEM(var, idx) var[idx] +#endif + +#define ACCUMULATOR_BLOCK_TYPE MAKE_VECTOR_TYPE(ACCUMULATOR_TYPE, X_BLOCK_SIZE) +#define ACTIVATION_BLOCK_TYPE MAKE_VECTOR_TYPE(ACTIVATION_TYPE, X_BLOCK_SIZE) +#define OUTPUT_BLOCK_TYPE MAKE_VECTOR_TYPE(OUTPUT_TYPE, X_BLOCK_SIZE) + +#define TO_ACTIVATION_BLOCK_TYPE(x) CAT(convert_, ACTIVATION_BLOCK_TYPE)(x) +#define TO_OUTPUT_BLOCK_TYPE(x) CAT(convert_, OUTPUT_BLOCK_TYPE)(x) + +#if FILTER_TYPE_SIZE == 1 +DECLARE_READ_BLOCK_16(load_weights, FILTER_TYPE) +#elif FILTER_TYPE_SIZE == 2 +DECLARE_READ_BLOCK_8(load_weights, FILTER_TYPE) +#else +DECLARE_READ_BLOCK_4(load_weights, FILTER_TYPE) +#endif + +#if OUTPUT_TYPE_SIZE == 1 +DECLARE_STORE_BLOCK_16(store_output, OUTPUT_TYPE) +#else +DECLARE_STORE_BLOCK_8(store_output, OUTPUT_TYPE) +#endif + +#if PRELOAD_INPUT_LINE +# if INPUT0_TYPE_SIZE +DECLARE_READ_BLOCK_16(preload_input, INPUT0_TYPE) +# else +DECLARE_READ_BLOCK_8(preload_input, INPUT0_TYPE) +# endif +#endif + +#if PRELOAD_WEIGHTS_LINE +# if FILTER_TYPE_SIZE == 1 +DECLARE_READ_BLOCK_16(preload_weights, FILTER_TYPE) +# else +DECLARE_READ_BLOCK_8(preload_weights, FILTER_TYPE) +# endif #endif __attribute__((intel_reqd_sub_group_size(FEATURE_SLICE_SIZE))) // attr:no-format +__attribute__((reqd_work_group_size(1, FEATURE_SLICE_SIZE, 1))) KERNEL(deconvolution_gpu_b_fs_zyx_fsv16_dw)( const __global INPUT0_TYPE *input, __global OUTPUT_TYPE *output, @@ -35,21 +74,26 @@ KERNEL(deconvolution_gpu_b_fs_zyx_fsv16_dw)( #if BIAS_TERM const __global BIAS_TYPE *bias, #endif - uint split_idx) +#if HAS_FUSED_OPS_DECLS + FUSED_OPS_DECLS, +#endif + uint split_idx + ) { const uint zyx = (uint)get_global_id(0); - const uint x = (zyx % (OUTPUT_SIZE_X / X_BLOCK_SIZE)) * X_BLOCK_SIZE; -#if INPUT0_LAYOUT_B_FS_YX_FSV16 - const uint y = zyx / (OUTPUT_SIZE_X / X_BLOCK_SIZE); + const uint x = (zyx % (CEIL_DIV(OUTPUT_SIZE_X, X_BLOCK_SIZE))) * X_BLOCK_SIZE; +#if OUTPUT_DIMS <= 4 + const uint y = zyx / (CEIL_DIV(OUTPUT_SIZE_X, X_BLOCK_SIZE)); const uint z = 0; #else - const uint zy = zyx / (OUTPUT_SIZE_X / X_BLOCK_SIZE); + const uint zy = zyx / (CEIL_DIV(OUTPUT_SIZE_X, X_BLOCK_SIZE)); const uint y = zy % OUTPUT_SIZE_Y; const uint z = zy / OUTPUT_SIZE_Y; #endif const uint f_block = get_group_id(1); const uint sglid = get_sub_group_local_id(); - const uint f = f_block * FEATURE_SLICE_SIZE + sglid; + const uint fg = f_block * FEATURE_SLICE_SIZE; + const uint f = fg + sglid; const uint b = (uint)get_global_id(2); const int input_x = x + PADDING_SIZE_X - (FILTER_SIZE_X - 1); @@ -75,27 +119,87 @@ KERNEL(deconvolution_gpu_b_fs_zyx_fsv16_dw)( const uint filter_offset = f_block * FEATURE_SLICE_SIZE * FILTER_SIZE_X * FILTER_SIZE_Y * FILTER_SIZE_Z; -#if BIAS_TERM - BLOCK_TYPE dst = (BLOCK_TYPE)(UNIT_BLOCK_READ(bias, f_block * FEATURE_SLICE_SIZE)); +#if BIAS_TERM && ACCUMULATOR_IS_FP + ACCUMULATOR_BLOCK_TYPE dst = (ACCUMULATOR_BLOCK_TYPE)(DT_BIAS_BLOCK_READ(bias, f_block * FEATURE_SLICE_SIZE)); #else - BLOCK_TYPE dst = (BLOCK_TYPE)(UNIT_VAL_ZERO); + ACCUMULATOR_BLOCK_TYPE dst = (ACCUMULATOR_BLOCK_TYPE)(ACCUMULATOR_VAL_ZERO); #endif - UNIT_TYPE wei[FILTER_SIZE_Z * FILTER_SIZE_Y * FILTER_SIZE_X]; +#if PRELOAD_WEIGHTS + FILTER_TYPE wei[FILTER_SIZE_Z * FILTER_SIZE_Y * FILTER_SIZE_X]; + + FUNC_CALL(load_weights)(weights, filter_offset, FILTER_SIZE_X * FILTER_SIZE_Y * FILTER_SIZE_Z, wei); +#endif + + INPUT0_TYPE src_val = INPUT0_VAL_ZERO; + +#if PRELOAD_INPUT_LINE + int first_input_x = input_x; + if (first_input_x % STRIDE_SIZE_X != 0) { + if (first_input_x >= 0) + first_input_x = ALIGN(first_input_x, STRIDE_SIZE_X); + else + first_input_x = first_input_x / STRIDE_SIZE_X * STRIDE_SIZE_X; + } + first_input_x = first_input_x / STRIDE_SIZE_X; unroll_for (uint k_z = 0; k_z < FILTER_SIZE_Z; k_z++) { + const int input_offset_z = input_z + k_z; + const bool zero_z = (input_offset_z >= INPUT0_SIZE_Z * STRIDE_SIZE_Z) || (input_offset_z < 0) || ((input_offset_z % STRIDE_SIZE_Z) != 0); unroll_for (uint k_y = 0; k_y < FILTER_SIZE_Y; k_y++) { - unroll_for (uint k_x = 0; k_x < FILTER_SIZE_X; k_x++) { - const uint wei_idx = (FILTER_SIZE_Z - k_z - 1) * FILTER_Z_PITCH + (FILTER_SIZE_Y - k_y - 1) * FILTER_Y_PITCH + (FILTER_SIZE_X - k_x - 1); - wei[wei_idx] = UNIT_BLOCK_READ(weights, filter_offset + k_z * FILTER_Z_PITCH * FEATURE_SLICE_SIZE - + k_y * FILTER_Y_PITCH * FEATURE_SLICE_SIZE - + k_x * FEATURE_SLICE_SIZE); - } - } - } + const int input_offset_y = input_y + k_y; + const bool zero_y = (input_offset_y >= INPUT0_SIZE_Y * STRIDE_SIZE_Y) || (input_offset_y < 0) || ((input_offset_y % STRIDE_SIZE_Y) != 0); + if (!zero_y && !zero_z) { + INPUT0_TYPE input_line[INPUT_BLOCK_SIZE_X] = { }; + uint fixed_input_offset_y = (uint)input_offset_y / STRIDE_SIZE_Y; + uint fixed_input_offset_z = (uint)input_offset_z / STRIDE_SIZE_Z; + uint preload_input_offset = input_offset + fixed_input_offset_z * input_z_pitch + + fixed_input_offset_y * input_y_pitch; - UNIT_TYPE src_val = UNIT_VAL_ZERO; + if (first_input_x >= 0) { + FUNC_CALL(preload_input)(input, preload_input_offset + first_input_x * input_x_pitch, INPUT_BLOCK_SIZE_X, input_line); + } else { + unroll_for (uint xi = 0; xi < INPUT_BLOCK_SIZE_X; ++xi) { + if (first_input_x + xi >= 0) { + input_line[xi] = DT_INPUT_BLOCK_READ(input, preload_input_offset + first_input_x * input_x_pitch + xi * input_x_pitch); + } else { + input_line[xi] = 0; + } + } + } +#if PRELOAD_WEIGHTS_LINE + FILTER_TYPE wei[FILTER_SIZE_X] = { }; + FUNC_CALL(preload_weights)(weights, + filter_offset + (FILTER_SIZE_Z - k_z - 1) * FILTER_Z_PITCH * FEATURE_SLICE_SIZE + + (FILTER_SIZE_Y - k_y - 1) * FILTER_Y_PITCH * FEATURE_SLICE_SIZE, + FILTER_SIZE_X, + wei); +#endif + + unroll_for (uint k_x = 0; k_x < FILTER_SIZE_X; k_x++) { +# if PRELOAD_WEIGHTS + const uint in_idx = (FILTER_SIZE_Z - k_z - 1) * FILTER_Z_PITCH + (FILTER_SIZE_Y - k_y - 1) * FILTER_Y_PITCH + (FILTER_SIZE_X - k_x - 1); + FILTER_TYPE wei_val = wei[in_idx]; +# elif PRELOAD_WEIGHTS_LINE + FILTER_TYPE wei_val = wei[(FILTER_SIZE_X - k_x - 1)]; +# else + const uint in_idx = (FILTER_SIZE_Z - k_z - 1) * FILTER_Z_PITCH + (FILTER_SIZE_Y - k_y - 1) * FILTER_Y_PITCH + (FILTER_SIZE_X - k_x - 1); + FILTER_TYPE wei_val = DT_FILTER_BLOCK_READ(weights, filter_offset + in_idx * FEATURE_SLICE_SIZE); +# endif + unroll_for (uint x_block = 0; x_block < X_BLOCK_SIZE; x_block++) { + const int input_offset_x = input_x + k_x + x_block; + const bool zero_x = (input_offset_x >= INPUT0_SIZE_X * STRIDE_SIZE_X) || (input_offset_x < 0) || ((input_offset_x % STRIDE_SIZE_X) != 0); + if (!zero_x) { + src_val = input_line[(x_block + k_x) / STRIDE_SIZE_X]; + GET_VEC_ELEM(dst, x_block) += src_val * wei_val; + } // if !zero_x + } // for X_BLOCK_SIZE + } // for FILTER_SIZE_X + } // if !zero_y && !zero_z + } // for FILTER_SIZE_Y + } // for FILTER_SIZE_Z +#else unroll_for (uint x_block = 0; x_block < X_BLOCK_SIZE; x_block++) { unroll_for (uint k_z = 0; k_z < FILTER_SIZE_Z; k_z++) { const int input_offset_z = input_z + k_z; @@ -106,24 +210,41 @@ KERNEL(deconvolution_gpu_b_fs_zyx_fsv16_dw)( unroll_for (uint k_x = 0; k_x < FILTER_SIZE_X; k_x++) { const int input_offset_x = input_x + k_x + x_block; const bool zero_x = (input_offset_x >= INPUT0_SIZE_X * STRIDE_SIZE_X) || (input_offset_x < 0) || ((input_offset_x % STRIDE_SIZE_X) != 0); - const uint in_idx = k_z * FILTER_Z_PITCH + k_y * FILTER_Y_PITCH + k_x; + const uint in_idx = (FILTER_SIZE_Z - k_z - 1) * FILTER_Z_PITCH + (FILTER_SIZE_Y - k_y - 1) * FILTER_Y_PITCH + (FILTER_SIZE_X - k_x - 1); if (!zero_z && !zero_y && !zero_x) { uint fixed_input_offset_x = (uint)input_offset_x / STRIDE_SIZE_X; uint fixed_input_offset_y = (uint)input_offset_y / STRIDE_SIZE_Y; uint fixed_input_offset_z = (uint)input_offset_z / STRIDE_SIZE_Z; - src_val = UNIT_BLOCK_READ(input, input_offset + - fixed_input_offset_z * input_z_pitch + - fixed_input_offset_y * input_y_pitch + - fixed_input_offset_x * input_x_pitch); - DST_VAR = mad(src_val, wei[in_idx], DST_VAR); - } - } - } - } - } + src_val = DT_INPUT_BLOCK_READ(input, input_offset + + fixed_input_offset_z * input_z_pitch + + fixed_input_offset_y * input_y_pitch + + fixed_input_offset_x * input_x_pitch); +# if PRELOAD_WEIGHTS + FILTER_TYPE wei_val = wei[in_idx]; +# else + FILTER_TYPE wei_val = DT_FILTER_BLOCK_READ(weights, filter_offset + in_idx * FEATURE_SLICE_SIZE); +# endif + GET_VEC_ELEM(dst, x_block) += src_val * wei_val; + } // if !zero_z && !zero_y && !zero_x + } // for FILTER_SIZE_X + } // for FILTER_SIZE_Y + } // for FILTER_SIZE_Z + } // for X_BLOCK_SIZE +#endif - dst = ACTIVATION(dst, ACTIVATION_PARAMS); + ACTIVATION_BLOCK_TYPE dequantized = TO_ACTIVATION_BLOCK_TYPE(dst); +#if BIAS_TERM && !ACCUMULATOR_IS_FP + dequantized += TO_ACTIVATION_TYPE(DT_BIAS_BLOCK_READ(bias, f_block * FEATURE_SLICE_SIZE)); +#endif + + OUTPUT_BLOCK_TYPE result; +#if HAS_FUSED_OPS + FUSED_OPS; + result = FUSED_OPS_RESULT; +#else + result = TO_OUTPUT_BLOCK_TYPE(ACTIVATION(dequantized, ACTIVATION_PARAMS)); +#endif const uint output_x_pitch = FEATURE_SLICE_SIZE; const uint output_y_pitch = output_x_pitch * (OUTPUT_PAD_BEFORE_SIZE_X + OUTPUT_SIZE_X + OUTPUT_PAD_AFTER_SIZE_X); @@ -144,15 +265,32 @@ KERNEL(deconvolution_gpu_b_fs_zyx_fsv16_dw)( if ((f_block + 1) * FEATURE_SLICE_SIZE >= OUTPUT_FEATURE_NUM) { unroll_for (uint x_block = 0; x_block < X_BLOCK_SIZE; x_block++) { + if (OUTPUT_SIZE_X % X_BLOCK_SIZE != 0 && x + X_BLOCK_SIZE >= OUTPUT_SIZE_X && x_block >= OUTPUT_SIZE_X % X_BLOCK_SIZE) + break; if (f_block * FEATURE_SLICE_SIZE + sglid < OUTPUT_FEATURE_NUM) - output[output_offset + (x + x_block) * output_x_pitch + sglid] = DST_VAR; + output[output_offset + (x + x_block) * output_x_pitch + sglid] = GET_VEC_ELEM(result, x_block); } } else #endif // OUTPUT_LEFTOVERS +#if OUTPUT_SIZE_X % X_BLOCK_SIZE != 0 + if (x + X_BLOCK_SIZE >= OUTPUT_SIZE_X) { + FUNC_CALL(store_output)(output, output_offset + x * output_x_pitch, OUTPUT_SIZE_X % X_BLOCK_SIZE, (OUTPUT_TYPE *)&result); + } else +#endif { - unroll_for (uint x_block = 0; x_block < X_BLOCK_SIZE; x_block++) { - UNIT_BLOCK_WRITE(output, output_offset + (x + x_block) * output_x_pitch, DST_VAR); - } + FUNC_CALL(store_output)(output, output_offset + x * output_x_pitch, X_BLOCK_SIZE, (OUTPUT_TYPE *)&result); } } + +#undef unroll_for +#undef FEATURE_SLICE_SIZE + +#undef GET_VEC_ELEM + +#undef ACCUMULATOR_BLOCK_TYPE +#undef ACTIVATION_BLOCK_TYPE +#undef OUTPUT_BLOCK_TYPE + +#undef TO_ACTIVATION_BLOCK_TYPE +#undef TO_OUTPUT_BLOCK_TYPE diff --git a/inference-engine/thirdparty/clDNN/kernel_selector/core/cl_kernels/deconvolution_gpu_bfyx_opt.cl b/inference-engine/thirdparty/clDNN/kernel_selector/core/cl_kernels/deconvolution_gpu_bfyx_opt.cl index d34ef721694..c36cb5a07ce 100644 --- a/inference-engine/thirdparty/clDNN/kernel_selector/core/cl_kernels/deconvolution_gpu_bfyx_opt.cl +++ b/inference-engine/thirdparty/clDNN/kernel_selector/core/cl_kernels/deconvolution_gpu_bfyx_opt.cl @@ -24,13 +24,13 @@ KERNEL(deconvolution_gpu_bfyx_opt)( #if BIAS_TERM const __global BIAS_TYPE* bias, #endif - uint split_idx -#if FUSED_ELTWISE - , const __global UNIT_TYPE* fuse_input +#if HAS_FUSED_OPS_DECLS + FUSED_OPS_DECLS, #endif - ) + uint split_idx + ) { - UNIT_TYPE result = UNIT_VAL_ZERO; + ACCUMULATOR_TYPE acc = ACCUMULATOR_VAL_ZERO; const uint b_f = get_global_id(2); const uint batch_offset = b_f / OUTPUT_FEATURE_NUM; @@ -93,7 +93,7 @@ KERNEL(deconvolution_gpu_bfyx_opt)( uint filter_idx = filter_offset + of*FILTER_IFM_PITCH + (FILTER_SIZE_Y - i - 1)*FILTER_Y_PITCH + (FILTER_SIZE_X - j - 1)*FILTER_X_PITCH; for (uint h = 0; h < FILTER_OFM_NUM; h++) { - result = fma(input[input_idx], filter[filter_idx], result); + acc += TO_ACCUMULATOR_TYPE(input[input_idx]) * TO_ACCUMULATOR_TYPE(filter[filter_idx]); filter_idx += FILTER_OFM_PITCH; input_idx += INPUT0_FEATURE_PITCH; } @@ -101,7 +101,7 @@ KERNEL(deconvolution_gpu_bfyx_opt)( uint filter_idx = filter_offset + of*FILTER_OFM_PITCH + (FILTER_SIZE_Y - i - 1)*FILTER_Y_PITCH + (FILTER_SIZE_X - j - 1)*FILTER_X_PITCH; for (uint h = 0; h < FILTER_IFM_NUM; h++) { - result = fma(input[input_idx], filter[filter_idx], result); + acc += TO_ACCUMULATOR_TYPE(input[input_idx]) * TO_ACCUMULATOR_TYPE(filter[filter_idx]); filter_idx += FILTER_IFM_PITCH; input_idx += INPUT0_FEATURE_PITCH; } @@ -110,20 +110,21 @@ KERNEL(deconvolution_gpu_bfyx_opt)( } } } + + ACTIVATION_TYPE result = TO_ACTIVATION_TYPE(acc); #if BIAS_TERM result += bias[ofm_offset]; #endif + result = ACTIVATION(result, ACTIVATION_PARAMS); + const uint out_split_offset = g * OUTPUT_FEATURE_PITCH * FILTER_OFM_NUM; const uint dst_index = OUTPUT_OFFSET + out_split_offset + batch_offset*OUTPUT_BATCH_PITCH + of*OUTPUT_FEATURE_PITCH + id_y*OUTPUT_Y_PITCH + id_x*OUTPUT_X_PITCH; -#if FUSED_ELTWISE - const uint fused_index = INPUT1_OFFSET + g * INPUT1_FEATURE_PITCH * FILTER_OFM_NUM + batch_offset*INPUT1_BATCH_PITCH + of*INPUT1_FEATURE_PITCH + id_y*INPUT1_Y_PITCH + id_x*INPUT1_X_PITCH; -#if !GRADIENT - output[dst_index] = ACTIVATION(result + fuse_input[fused_index], ACTIVATION_PARAMS); + +#if HAS_FUSED_OPS + FUSED_OPS; + output[dst_index] = FUSED_OPS_RESULT; #else - output[dst_index] = result + fuse_input[fused_index]; -#endif -#else - output[dst_index] = ACTIVATION(result, ACTIVATION_PARAMS); + output[dst_index] = TO_OUTPUT_TYPE(result); #endif } diff --git a/inference-engine/thirdparty/clDNN/kernel_selector/core/cl_kernels/deconvolution_gpu_imad_along_f_tile_bfx.cl b/inference-engine/thirdparty/clDNN/kernel_selector/core/cl_kernels/deconvolution_gpu_imad_along_f_tile_bfx.cl new file mode 100644 index 00000000000..7bc15bd0237 --- /dev/null +++ b/inference-engine/thirdparty/clDNN/kernel_selector/core/cl_kernels/deconvolution_gpu_imad_along_f_tile_bfx.cl @@ -0,0 +1,297 @@ +// Copyright (c) 2020 Intel Corporation +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#include "include/fetch.cl" +#include "include/imad.cl" +#include "include/data_types.cl" + +#include "deconvolution_gpu_imad_common.cl" + +DECLARE_LOAD_CONTINOUS_4(load_input_ui, uint) +DECLARE_LOAD_CONTINOUS_4(load_weights_ui, uint) + +#if OUTPUT_TYPE_SIZE == 1 +DECLARE_STORE_BLOCK_16(store_output, OUTPUT_TYPE) +#elif OUTPUT_TYPE_SIZE == 2 +DECLARE_STORE_BLOCK_8(store_output, OUTPUT_TYPE) +#else +DECLARE_STORE_BLOCK_4(store_output, OUTPUT_TYPE) +#endif + +#define FILTER_TYPE4 MAKE_VECTOR_TYPE(FILTER_TYPE, 4) +#define INPUT_TYPE4 MAKE_VECTOR_TYPE(INPUT0_TYPE, 4) + +#define AS_FILTER_TYPE4 CAT(as_, FILTER_TYPE4) +#define AS_INPUT_TYPE4 CAT(as_, INPUT_TYPE4) + +#define WEIGHTS_GET_INDEX(g, o, i, z, y, x) GET_FILTER_G_OS_ZYX_IS_OSV_ISV_INDEX(FILTER, g, o, i, z, y, x, (SIMD * TILE_OFM), TILE_IFM) +#define WEIGHTS_TILE_IFM_PITCH (TILE_IFM * SIMD * TILE_OFM) +#define WEIGHTS_IN_TILE_OFM_PITCH (TILE_IFM * SIMD) + +__attribute__((reqd_work_group_size(1, SIMD, 1))) +__attribute__((intel_reqd_sub_group_size(SIMD))) +KERNEL(deconvolution_gpu_imad_ref)( + const __global INPUT0_TYPE* input, + __global OUTPUT_TYPE* restrict output, + const __global FILTER_TYPE* weights, +#if BIAS_TERM + const __global BIAS_TYPE* bias, +#endif +#if HAS_FUSED_OPS_DECLS + FUSED_OPS_DECLS, +#endif + uint split_idx +) { + const __global uint* input_ui = (const __global uint*)input; + const __global uint* weights_ui = (const __global uint*)weights; + + uint out_b = get_global_id(2) * TILE_B; + uint out_fg = get_group_id(1) * SIMD * TILE_OFM; + uint out_f = out_fg + get_sub_group_local_id(); + uint out_x = (uint)get_global_id(0) * TILE_X % ALIGN(OUTPUT_SIZE_X, TILE_X); +#if OUTPUT_DIMS <= 4 + uint out_y = (uint)get_global_id(0) / CEIL_DIV(OUTPUT_SIZE_X, TILE_X); + uint out_z = 0; +#elif OUTPUT_DIMS == 5 + uint out_y = (uint)get_global_id(0) / CEIL_DIV(OUTPUT_SIZE_X, TILE_X) % OUTPUT_SIZE_Y; + uint out_z = (uint)get_global_id(0) / (CEIL_DIV(OUTPUT_SIZE_X, TILE_X) * OUTPUT_SIZE_Y); +#endif + const uint sglid = get_sub_group_local_id(); + +#if GROUPED + uint group = out_fg / FILTER_OFM_NUM; + uint ofm = out_fg % FILTER_OFM_NUM + sglid; +#else + uint group = 0; + uint ofm = out_f; +#endif + uint if_start = group * FILTER_IFM_NUM; + + int in_x_start = (int)out_x + (PADDING_SIZE_X - FILTER_SIZE_X + 1); + int in_y_start = (int)out_y + (PADDING_SIZE_Y - FILTER_SIZE_Y + 1); + int in_z_start = (int)out_z + (PADDING_SIZE_Z - FILTER_SIZE_Z + 1); + + uint fy_start = 0; + uint fy_end = FILTER_SIZE_Y; + uint fy_inc = STRIDE_SIZE_Y; + if (in_y_start < 0) + fy_start = -in_y_start; + else if (in_y_start % STRIDE_SIZE_Y != 0) + fy_start = STRIDE_SIZE_Y - in_y_start % STRIDE_SIZE_Y; + if (in_y_start + FILTER_SIZE_Y - 1 >= INPUT0_SIZE_Y * STRIDE_SIZE_Y) + fy_end = INPUT0_SIZE_Y * STRIDE_SIZE_Y - in_y_start; + + uint fz_start = 0; + uint fz_end = FILTER_SIZE_Z; + uint fz_inc = STRIDE_SIZE_Z; + if (in_z_start < 0) + fz_start = -in_z_start; + else if (in_z_start % STRIDE_SIZE_Z != 0) + fz_start = STRIDE_SIZE_Z - in_z_start % STRIDE_SIZE_Z; + if (in_z_start + FILTER_SIZE_Z - 1 >= INPUT0_SIZE_Z * STRIDE_SIZE_Z) + fz_end = INPUT0_SIZE_Z * STRIDE_SIZE_Z - in_z_start; + + ACCUMULATOR_TYPE acc[TILE_B][TILE_OFM][TILE_X] = { }; + uint in[TILE_B][TILE_IFM / 4]; + uint wei[TILE_OFM][TILE_IFM / 4]; + + for (uint fz = fz_start; fz < fz_end; fz += fz_inc) { + int in_z = in_z_start + fz; + uint fixed_in_z = in_z / STRIDE_SIZE_Z; + + for (uint fy = fy_start; fy < fy_end; fy += fy_inc) { + int in_y = in_y_start + fy; + uint fixed_in_y = in_y / STRIDE_SIZE_Y; + + for (uint fx = 0; fx < FILTER_SIZE_X; fx += 1) { + int in_x = in_x_start + fx + ((TILE_X == SIMD || sglid < TILE_X) ? sglid : 0); + bool zero_x = false; + zero_x |= in_x < 0; + zero_x |= in_x >= INPUT0_SIZE_X * STRIDE_SIZE_X; + zero_x |= in_x % STRIDE_SIZE_X != 0; + in_x = max(in_x, 0); + in_x = min(in_x, INPUT0_SIZE_X * STRIDE_SIZE_X); + uint fixed_in_x = in_x / STRIDE_SIZE_X; + + uint weights_offset = WEIGHTS_GET_INDEX(group, ofm, 0, FILTER_SIZE_Z - fz - 1, FILTER_SIZE_Y - fy - 1, FILTER_SIZE_X - fx - 1) / 4; + +#if INPUT_VALID_TILE_IFM_PITCH +# if OUTPUT_DIMS <= 4 + uint input_offset = INPUT0_GET_INDEX(out_b, if_start, fixed_in_y, fixed_in_x) / 4; +# elif OUTPUT_DIMS == 5 + uint input_offset = INPUT0_GET_INDEX(out_b, if_start, fixed_in_z, fixed_in_y, fixed_in_x) / 4; +# endif +#endif + + for (uint fi = 0; fi < FILTER_IFM_NUM; fi += TILE_IFM) { + // Load weights [TILE_OFM, TILE_IFM, 1, 1] + __attribute__((opencl_unroll_hint)) + for (uint of = 0; of < TILE_OFM; ++of) { + uint weights_idx = weights_offset + of * WEIGHTS_IN_TILE_OFM_PITCH / 4; + FUNC_CALL(load_weights_ui)(weights_ui, weights_idx, TILE_IFM / 4, wei[of]); + } + weights_offset += WEIGHTS_TILE_IFM_PITCH / 4; + + // Load input [TILE_B, TILE_IFM, 1, 1] +#if !INPUT_VALID_TILE_IFM_PITCH +# if OUTPUT_DIMS <= 4 + uint input_offset = INPUT0_GET_INDEX(out_b, if_start + fi, fixed_in_y, fixed_in_x) / 4; +# elif OUTPUT_DIMS == 5 + uint input_offset = INPUT0_GET_INDEX(out_b, if_start + fi, fixed_in_z, fixed_in_y, fixed_in_x) / 4; +# endif +#endif + __attribute__((opencl_unroll_hint)) + for (uint ob = 0; ob < TILE_B; ++ob) { + uint input_idx = input_offset + ob * INPUT_IN_TILE_B_PITCH / 4; + FUNC_CALL(load_input_ui)(input_ui, input_idx, TILE_IFM / 4, in[ob]); + } +#if INPUT_VALID_TILE_IFM_PITCH + input_offset += INPUT_TILE_IFM_PITCH / 4; +#endif + if (zero_x) { + __attribute__((opencl_unroll_hint)) + for (uint ob = 0; ob < TILE_B; ++ob) { + __attribute__((opencl_unroll_hint)) + for (uint ifp = 0; ifp < TILE_IFM / 4; ++ifp) { + in[ob][ifp] = 0; + } + } + } + + __attribute__((opencl_unroll_hint)) + for (uint ob = 0; ob < TILE_B; ++ob) { + __attribute__((opencl_unroll_hint)) + for (uint of = 0; of < TILE_OFM; ++of) { + __attribute__((opencl_unroll_hint)) + for (uint tx = 0; tx < TILE_X; ++tx) { + __attribute__((opencl_unroll_hint)) + for (uint imad_it = 0; imad_it < TILE_IFM / 4; ++imad_it) { + uint in_val = intel_sub_group_shuffle(in[ob][imad_it], tx); + acc[ob][of][tx] = IMAD(acc[ob][of][tx], AS_INPUT_TYPE4(in_val), AS_FILTER_TYPE4(wei[of][imad_it])); + } + } + } + } + } + } + } + } + + ACTIVATION_TYPE dequantized[TILE_B][TILE_OFM][TILE_X]; + __attribute__((opencl_unroll_hint)) + for (uint ob = 0; ob < TILE_B; ++ob) { + __attribute__((opencl_unroll_hint)) + for (uint of = 0; of < TILE_OFM; ++of) { + __attribute__((opencl_unroll_hint)) + for (uint tx = 0; tx < TILE_X; ++tx) { + dequantized[ob][of][tx] = TO_ACTIVATION_TYPE(acc[ob][of][tx]); + } + } + } + +#if BIAS_TERM + __attribute__((opencl_unroll_hint)) + for (uint of = 0; of < TILE_OFM; ++of) { + BIAS_TYPE bias_val = bias[out_f + of * SIMD]; + __attribute__((opencl_unroll_hint)) + for (uint ob = 0; ob < TILE_B; ++ob) { + __attribute__((opencl_unroll_hint)) + for (uint tx = 0; tx < TILE_X; ++tx) { + dequantized[ob][of][tx] += TO_ACTIVATION_TYPE(bias_val); + } + } + } +#endif + + OUTPUT_TYPE result[TILE_B][TILE_OFM][TILE_X]; + __attribute__((opencl_unroll_hint)) + for (uint of = 0; of < TILE_OFM; ++of) { +#if FUSED_OPS_CAN_USE_PRELOAD + FUSED_OPS_PRELOAD; +#endif + __attribute__((opencl_unroll_hint)) + for (uint ob = 0; ob < TILE_B; ++ob) { + __attribute__((opencl_unroll_hint)) + for (uint tx = 0; tx < TILE_X; ++tx) { +#if HAS_FUSED_OPS +# if FUSED_OPS_CAN_USE_PRELOAD + FUSED_OPS_CALC; +# else + FUSED_OPS; +# endif + result[ob][of][tx] = FUSED_OPS_RESULT; +#else + result[ob][of][tx] = TO_OUTPUT_TYPE(dequantized[ob][of][tx]); +#endif + } + } + } + + bool leftovers_x = OUTPUT_SIZE_X % TILE_X != 0 && out_x + TILE_X >= OUTPUT_SIZE_X; + bool leftovers_f = OUTPUT_FEATURE_NUM % SIMD != 0 && out_f + SIMD >= OUTPUT_FEATURE_NUM; + +#if OUTPUT_NAIVE_STORE + __attribute__((opencl_unroll_hint)) + for (uint ob = 0; ob < TILE_B; ++ob) { + __attribute__((opencl_unroll_hint)) + for (uint of = 0; of < TILE_OFM; ++of) { + __attribute__((opencl_unroll_hint)) + for (uint tx = 0; tx < TILE_X; ++tx) { + if ((leftovers_x && tx >= OUTPUT_SIZE_X % TILE_X) || + (leftovers_f && out_f + of * SIMD >= OUTPUT_FEATURE_NUM)) + break; +#if OUTPUT_DIMS <= 4 + uint output_idx = OUTPUT_GET_INDEX(out_b + ob, out_f + of * SIMD, out_y, out_x + tx); +#elif OUTPUT_DIMS == 5 + uint output_idx = OUTPUT_GET_INDEX(out_b + ob, out_f + of * SIMD, out_z, out_y, out_x + tx); +#endif + output[output_idx] = result[ob][of][tx]; + } + } + } +#elif OUTPUT_BLOCK_X_STORE + __attribute__((opencl_unroll_hint)) + for (uint ob = 0; ob < TILE_B; ++ob) { + __attribute__((opencl_unroll_hint)) + for (uint of = 0; of < TILE_OFM; ++of) { +#if OUTPUT_DIMS <= 4 + uint output_idx = OUTPUT_GET_INDEX(out_b + ob, out_fg + of * SIMD, out_y, out_x); +#elif OUTPUT_DIMS == 5 + uint output_idx = OUTPUT_GET_INDEX(out_b + ob, out_fg + of * SIMD, out_z, out_y, out_x); +#endif + if (!leftovers_x && !leftovers_f) { + FUNC_CALL(store_output)(output, output_idx, TILE_X, result[ob][of]); + } else if (!leftovers_f) { + FUNC_CALL(store_output)(output, output_idx, OUTPUT_SIZE_X % TILE_X, result[ob][of]); + } else { + __attribute__((opencl_unroll_hint)) + for (uint tx = 0; tx < TILE_X; ++tx) { + if (out_f + of * SIMD < OUTPUT_FEATURE_NUM && out_x + tx < OUTPUT_SIZE_X) { + output[output_idx + sglid + tx * SIMD] = result[ob][of][tx]; + } + } + } + } + } +#endif +} + +#undef FILTER_TYPE4 +#undef INPUT_TYPE4 +#undef AS_FILTER_TYPE4 +#undef AS_INPUT_TYPE4 + +#undef WEIGHTS_GET_INDEX +#undef WEIGHTS_TILE_IFM_PITCH +#undef WEIGHTS_IN_TILE_OFM_PITCH diff --git a/inference-engine/thirdparty/clDNN/kernel_selector/core/cl_kernels/deconvolution_gpu_imad_common.cl b/inference-engine/thirdparty/clDNN/kernel_selector/core/cl_kernels/deconvolution_gpu_imad_common.cl new file mode 100644 index 00000000000..902b7be23f9 --- /dev/null +++ b/inference-engine/thirdparty/clDNN/kernel_selector/core/cl_kernels/deconvolution_gpu_imad_common.cl @@ -0,0 +1,245 @@ +// Copyright (c) 2020 Intel Corporation +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#include "include/data_types.cl" + +#define CEIL_DIV(a, b) (((a) + ((b) - 1)) / (b)) +#define ALIGN(a, b) (CEIL_DIV(a, b) * (b)) + +#define VEC_TO_ARR_1(var, arr, idx) \ + arr[idx] = var +#define VEC_TO_ARR_2(vec, arr, idx) \ + VEC_TO_ARR_1((vec).lo, arr, idx); \ + VEC_TO_ARR_1((vec).hi, arr, (idx) + 1) +#define VEC_TO_ARR_4(vec, arr, idx) \ + VEC_TO_ARR_2((vec).lo, arr, idx); \ + VEC_TO_ARR_2((vec).hi, arr, (idx) + 2) +#define VEC_TO_ARR_8(vec, arr, idx) \ + VEC_TO_ARR_4((vec).lo, arr, idx); \ + VEC_TO_ARR_4((vec).hi, arr, (idx) + 4) +#define VEC_TO_ARR_16(vec, arr, idx) \ + VEC_TO_ARR_8((vec).lo, arr, idx); \ + VEC_TO_ARR_8((vec).hi, arr, (idx) + 8) + +#define ARR_TO_VEC_1(arr, var, idx) \ + var = arr[idx] +#define ARR_TO_VEC_2(arr, vec, idx) \ + ARR_TO_VEC_1(arr, (vec).lo, idx); \ + ARR_TO_VEC_1(arr, (vec).hi, (idx) + 1) +#define ARR_TO_VEC_4(arr, vec, idx) \ + ARR_TO_VEC_2(arr, (vec).lo, idx); \ + ARR_TO_VEC_2(arr, (vec).hi, (idx) + 2) +#define ARR_TO_VEC_8(arr, vec, idx) \ + ARR_TO_VEC_4(arr, (vec).lo, idx); \ + ARR_TO_VEC_4(arr, (vec).hi, (idx) + 4) +#define ARR_TO_VEC_16(arr, vec, idx) \ + ARR_TO_VEC_8(arr, (vec).lo, idx); \ + ARR_TO_VEC_8(arr, (vec).hi, (idx) + 8) + +#define DECLARE_LOAD_CONTINOUS_16(name, type) \ +inline void FUNC(name)(const __global type* src, uint offset, uint size, type* dst) { \ + uint i = 0; \ + for (; i + 16 <= size; i += 16) { \ + MAKE_VECTOR_TYPE(type, 16) tmp = ((const __global MAKE_VECTOR_TYPE(type, 16)*)(src + offset + i))[0]; \ + VEC_TO_ARR_16(tmp, dst, i); \ + } \ + if (size % 16 >= 8) { \ + MAKE_VECTOR_TYPE(type, 8) tmp = ((const __global MAKE_VECTOR_TYPE(type, 8)*)(src + offset + i))[0]; \ + VEC_TO_ARR_8(tmp, dst, i); \ + i += 8; \ + } \ + if (size % 8 >= 4) { \ + MAKE_VECTOR_TYPE(type, 4) tmp = ((const __global MAKE_VECTOR_TYPE(type, 4)*)(src + offset + i))[0]; \ + VEC_TO_ARR_4(tmp, dst, i); \ + i += 4; \ + } \ + if (size % 4 >= 2) { \ + MAKE_VECTOR_TYPE(type, 2) tmp = ((const __global MAKE_VECTOR_TYPE(type, 2)*)(src + offset + i))[0]; \ + VEC_TO_ARR_2(tmp, dst, i); \ + i += 2; \ + } \ + if (size % 2 == 1) { \ + dst[i] = src[offset + i]; \ + } \ +} + +#define DECLARE_LOAD_CONTINOUS_4(name, type) \ +inline void FUNC(name)(const __global type* src, uint offset, uint size, type* dst) { \ + uint i = 0; \ + for (; i + 4 <= size; i += 4) { \ + MAKE_VECTOR_TYPE(type, 4) tmp = ((const __global MAKE_VECTOR_TYPE(type, 4)*)(src + offset + i))[0]; \ + VEC_TO_ARR_4(tmp, dst, i); \ + } \ + if (size % 4 >= 2) { \ + MAKE_VECTOR_TYPE(type, 2) tmp = ((const __global MAKE_VECTOR_TYPE(type, 2)*)(src + offset + i))[0]; \ + VEC_TO_ARR_2(tmp, dst, i); \ + i += 2; \ + } \ + if (size % 2 == 1) { \ + dst[i] = src[offset + i]; \ + } \ +} + +#define DECLARE_STORE_BLOCK_16(name, type) \ +inline void FUNC(name)(__global type* dst, uint offset, uint size, type* src) { \ + uint i = 0; \ + const uint sg_size = get_max_sub_group_size(); \ + for (; i + 16 <= size; i += 16) { \ + MAKE_VECTOR_TYPE(type, 16) tmp; \ + ARR_TO_VEC_16(src, tmp, i); \ + BLOCK_WRITEN(type, 16, dst, offset + i * sg_size, tmp); \ + } \ + if (size % 16 >= 8) { \ + MAKE_VECTOR_TYPE(type, 8) tmp; \ + ARR_TO_VEC_8(src, tmp, i); \ + BLOCK_WRITEN(type, 8, dst, offset + i * sg_size, tmp); \ + i += 8; \ + } \ + if (size % 8 >= 4) { \ + MAKE_VECTOR_TYPE(type, 4) tmp; \ + ARR_TO_VEC_4(src, tmp, i); \ + BLOCK_WRITEN(type, 4, dst, offset + i * sg_size, tmp); \ + i += 4; \ + } \ + if (size % 4 >= 2) { \ + MAKE_VECTOR_TYPE(type, 2) tmp; \ + ARR_TO_VEC_2(src, tmp, i); \ + BLOCK_WRITEN(type, 2, dst, offset + i * sg_size, tmp); \ + i += 2; \ + } \ + if (size % 2 == 1) { \ + type tmp = src[i]; \ + BLOCK_WRITEN(type, 1, dst, offset + i * sg_size, tmp); \ + } \ +} + +#define DECLARE_STORE_BLOCK_8(name, type) \ +inline void FUNC(name)(__global type* dst, uint offset, uint size, type* src) { \ + uint i = 0; \ + const uint sg_size = get_max_sub_group_size(); \ + for (; i + 8 <= size; i += 8) { \ + MAKE_VECTOR_TYPE(type, 8) tmp; \ + ARR_TO_VEC_8(src, tmp, i); \ + BLOCK_WRITEN(type, 8, dst, offset + i * sg_size, tmp); \ + } \ + if (size % 8 >= 4) { \ + MAKE_VECTOR_TYPE(type, 4) tmp; \ + ARR_TO_VEC_4(src, tmp, i); \ + BLOCK_WRITEN(type, 4, dst, offset + i * sg_size, tmp); \ + i += 4; \ + } \ + if (size % 4 >= 2) { \ + MAKE_VECTOR_TYPE(type, 2) tmp; \ + ARR_TO_VEC_2(src, tmp, i); \ + BLOCK_WRITEN(type, 2, dst, offset + i * sg_size, tmp); \ + i += 2; \ + } \ + if (size % 2 == 1) { \ + type tmp = src[i]; \ + BLOCK_WRITEN(type, 1, dst, offset + i * sg_size, tmp); \ + } \ +} + +#define DECLARE_STORE_BLOCK_4(name, type) \ +inline void FUNC(name)(__global type* dst, uint offset, uint size, type* src) { \ + uint i = 0; \ + const uint sg_size = get_max_sub_group_size(); \ + for (; i + 4 <= size; i += 4) { \ + MAKE_VECTOR_TYPE(type, 4) tmp; \ + ARR_TO_VEC_4(src, tmp, i); \ + BLOCK_WRITEN(type, 4, dst, offset + i * sg_size, tmp); \ + } \ + if (size % 4 >= 2) { \ + MAKE_VECTOR_TYPE(type, 2) tmp; \ + ARR_TO_VEC_2(src, tmp, i); \ + BLOCK_WRITEN(type, 2, dst, offset + i * sg_size, tmp); \ + i += 2; \ + } \ + if (size % 2 == 1) { \ + type tmp = src[i]; \ + BLOCK_WRITEN(type, 1, dst, offset + i * sg_size, tmp); \ + } \ +} + +#define DECLARE_READ_BLOCK_16(name, type) \ +inline void FUNC(name)(const __global type* src, uint offset, uint size, type* dst) { \ + uint i = 0; \ + const uint sg_size = get_max_sub_group_size(); \ + for (; i + 16 <= size; i += 16) { \ + MAKE_VECTOR_TYPE(type, 16) tmp = BLOCK_READN(type, 16, src, offset + i * sg_size); \ + VEC_TO_ARR_16(tmp, dst, i); \ + } \ + if (size % 16 >= 8) { \ + MAKE_VECTOR_TYPE(type, 8) tmp = BLOCK_READN(type, 8, src, offset + i * sg_size); \ + VEC_TO_ARR_8(tmp, dst, i); \ + i += 8; \ + } \ + if (size % 8 >= 4) { \ + MAKE_VECTOR_TYPE(type, 4) tmp = BLOCK_READN(type, 4, src, offset + i * sg_size); \ + VEC_TO_ARR_4(tmp, dst, i); \ + i += 4; \ + } \ + if (size % 4 >= 2) { \ + MAKE_VECTOR_TYPE(type, 2) tmp = BLOCK_READN(type, 2, src, offset + i * sg_size); \ + VEC_TO_ARR_2(tmp, dst, i); \ + i += 2; \ + } \ + if (size % 2 == 1) { \ + type tmp = BLOCK_READN(type, 1, src, offset + i * sg_size); \ + dst[i] = tmp; \ + } \ +} + +#define DECLARE_READ_BLOCK_8(name, type) \ +inline void FUNC(name)(const __global type* src, uint offset, uint size, type* dst) { \ + uint i = 0; \ + const uint sg_size = get_max_sub_group_size(); \ + for (; i + 8 <= size; i += 8) { \ + MAKE_VECTOR_TYPE(type, 8) tmp = BLOCK_READN(type, 8, src, offset + i * sg_size); \ + VEC_TO_ARR_8(tmp, dst, i); \ + } \ + if (size % 8 >= 4) { \ + MAKE_VECTOR_TYPE(type, 4) tmp = BLOCK_READN(type, 4, src, offset + i * sg_size); \ + VEC_TO_ARR_4(tmp, dst, i); \ + i += 4; \ + } \ + if (size % 4 >= 2) { \ + MAKE_VECTOR_TYPE(type, 2) tmp = BLOCK_READN(type, 2, src, offset + i * sg_size); \ + VEC_TO_ARR_2(tmp, dst, i); \ + i += 2; \ + } \ + if (size % 2 == 1) { \ + type tmp = BLOCK_READN(type, 1, src, offset + i * sg_size); \ + dst[i] = tmp; \ + } \ +} + +#define DECLARE_READ_BLOCK_4(name, type) \ +inline void FUNC(name)(const __global type* src, uint offset, uint size, type* dst) { \ + uint i = 0; \ + const uint sg_size = get_max_sub_group_size(); \ + for (; i + 4 <= size; i += 4) { \ + MAKE_VECTOR_TYPE(type, 4) tmp = BLOCK_READN(type, 4, src, offset + i * sg_size); \ + VEC_TO_ARR_4(tmp, dst, i); \ + } \ + if (size % 4 >= 2) { \ + MAKE_VECTOR_TYPE(type, 2) tmp = BLOCK_READN(type, 2, src, offset + i * sg_size); \ + VEC_TO_ARR_2(tmp, dst, i); \ + i += 2; \ + } \ + if (size % 2 == 1) { \ + type tmp = BLOCK_READN(type, 1, src, offset + i * sg_size); \ + dst[i] = tmp; \ + } \ +} diff --git a/inference-engine/thirdparty/clDNN/kernel_selector/core/cl_kernels/deconvolution_gpu_imad_ref.cl b/inference-engine/thirdparty/clDNN/kernel_selector/core/cl_kernels/deconvolution_gpu_imad_ref.cl new file mode 100644 index 00000000000..29f8865bedf --- /dev/null +++ b/inference-engine/thirdparty/clDNN/kernel_selector/core/cl_kernels/deconvolution_gpu_imad_ref.cl @@ -0,0 +1,179 @@ +// Copyright (c) 2020 Intel Corporation +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#include "include/fetch.cl" +#include "include/imad.cl" +#include "include/data_types.cl" + +#include "deconvolution_gpu_imad_common.cl" + +DECLARE_LOAD_CONTINOUS_4(load_input_ui, uint) +DECLARE_LOAD_CONTINOUS_4(load_weights_ui, uint) + +#define FILTER_TYPE4 MAKE_VECTOR_TYPE(FILTER_TYPE, 4) +#define INPUT_TYPE4 MAKE_VECTOR_TYPE(INPUT0_TYPE, 4) + +#define AS_FILTER_TYPE4 CAT(as_, FILTER_TYPE4) +#define AS_INPUT_TYPE4 CAT(as_, INPUT_TYPE4) + +#define WEIGHTS_GET_INDEX(g, o, i, z, y, x) GET_FILTER_G_OS_ZYX_IS_OSV32_ISV4_INDEX(FILTER, g, o, i, z, y, x) + +KERNEL(deconvolution_gpu_imad_ref)( + const __global INPUT0_TYPE* input, + __global OUTPUT_TYPE* restrict output, + const __global FILTER_TYPE* weights, +#if BIAS_TERM + const __global BIAS_TYPE* bias, +#endif +#if HAS_FUSED_OPS_DECLS + FUSED_OPS_DECLS, +#endif + uint split_idx +) { + const __global uint* input_ui = (const __global uint*)input; + const __global uint* weights_ui = (const __global uint*)weights; + + uint out_b = get_global_id(2); + uint out_f = get_global_id(0); + uint out_x = (uint)get_global_id(1) % OUTPUT_SIZE_X; +#if OUTPUT_DIMS <= 4 + uint out_y = (uint)get_global_id(1) / OUTPUT_SIZE_X; + uint out_z = 0; +#elif OUTPUT_DIMS == 5 + uint out_y = (uint)get_global_id(1) / OUTPUT_SIZE_X % OUTPUT_SIZE_Y; + uint out_z = (uint)get_global_id(1) / (OUTPUT_SIZE_X * OUTPUT_SIZE_Y); +#endif + +#if GROUPED + uint group = out_f / FILTER_OFM_NUM; + uint ofm = out_f % FILTER_OFM_NUM; +#else + uint group = 0; + uint ofm = out_f; +#endif + uint if_start = group * FILTER_IFM_NUM; + + int in_x_start = (int)out_x + (PADDING_SIZE_X - FILTER_SIZE_X + 1); + int in_y_start = (int)out_y + (PADDING_SIZE_Y - FILTER_SIZE_Y + 1); + int in_z_start = (int)out_z + (PADDING_SIZE_Z - FILTER_SIZE_Z + 1); + + uint fx_start = 0; + uint fx_end = FILTER_SIZE_X; + uint fx_inc = STRIDE_SIZE_X; + if (in_x_start < 0) + fx_start = -in_x_start; + else if (in_x_start % STRIDE_SIZE_X != 0) + fx_start = STRIDE_SIZE_X - in_x_start % STRIDE_SIZE_X; + if (in_x_start + FILTER_SIZE_X - 1 >= INPUT0_SIZE_X * STRIDE_SIZE_X) + fx_end = INPUT0_SIZE_X * STRIDE_SIZE_X - in_x_start; + + uint fy_start = 0; + uint fy_end = FILTER_SIZE_Y; + uint fy_inc = STRIDE_SIZE_Y; + if (in_y_start < 0) + fy_start = -in_y_start; + else if (in_y_start % STRIDE_SIZE_Y != 0) + fy_start = STRIDE_SIZE_Y - in_y_start % STRIDE_SIZE_Y; + if (in_y_start + FILTER_SIZE_Y - 1 >= INPUT0_SIZE_Y * STRIDE_SIZE_Y) + fy_end = INPUT0_SIZE_Y * STRIDE_SIZE_Y - in_y_start; + + uint fz_start = 0; + uint fz_end = FILTER_SIZE_Z; + uint fz_inc = STRIDE_SIZE_Z; + if (in_z_start < 0) + fz_start = -in_z_start; + else if (in_z_start % STRIDE_SIZE_Z != 0) + fz_start = STRIDE_SIZE_Z - in_z_start % STRIDE_SIZE_Z; + if (in_z_start + FILTER_SIZE_Z - 1 >= INPUT0_SIZE_Z * STRIDE_SIZE_Z) + fz_end = INPUT0_SIZE_Z * STRIDE_SIZE_Z - in_z_start; + + ACCUMULATOR_TYPE acc = 0; + uint in[TILE_IFM / 4]; + uint wei[TILE_IFM / 4]; + + for (uint fz = fz_start; fz < fz_end; fz += fz_inc) { + int in_z = in_z_start + fz; + uint fixed_in_z = in_z / STRIDE_SIZE_Z; + + for (uint fy = fy_start; fy < fy_end; fy += fy_inc) { + int in_y = in_y_start + fy; + uint fixed_in_y = in_y / STRIDE_SIZE_Y; + + for (uint fx = fx_start; fx < fx_end; fx += fx_inc) { + int in_x = in_x_start + fx; + uint fixed_in_x = in_x / STRIDE_SIZE_X; + + for (uint fi = 0; fi < FILTER_IFM_NUM; fi += TILE_IFM) { + // Load weights [1, TILE_IFM, 1, 1] + uint weights_idx = WEIGHTS_GET_INDEX(group, ofm, fi, FILTER_SIZE_Z - fz - 1, FILTER_SIZE_Y - fy - 1, FILTER_SIZE_X - fx - 1); + FUNC_CALL(load_weights_ui)(weights_ui, weights_idx / 4, TILE_IFM / 4, wei); + + // Load input [1, TILE_IFM, 1, 1] +#if FILTER_GROUPS_NUM == 1 || FILTER_IFM_NUM % TILE_IFM == 0 +# if OUTPUT_DIMS <= 4 + uint input_idx = INPUT0_GET_INDEX(out_b, fi + if_start, fixed_in_y, fixed_in_x); +# elif OUTPUT_DIMS == 5 + uint input_idx = INPUT0_GET_INDEX(out_b, fi + if_start, fixed_in_z, fixed_in_y, fixed_in_x); +# endif + FUNC_CALL(load_input_ui)(input_ui, input_idx / 4, TILE_IFM / 4, in); +#else + for (uint tifm = 0; tifm < TILE_IFM; ++tifm) { +# if OUTPUT_DIMS <= 4 + uint input_idx = INPUT0_GET_INDEX(out_b, fi + if_start + tifm, fixed_in_y, fixed_in_x); +# elif OUTPUT_DIMS == 5 + uint input_idx = INPUT0_GET_INDEX(out_b, fi + if_start + tifm, fixed_in_z, fixed_in_y, fixed_in_x); +# endif + ((INPUT0_TYPE*)(in))[tifm] = input[input_idx]; + } +#endif + + __attribute__((opencl_unroll_hint)) + for (uint imad_it = 0; imad_it < TILE_IFM / 4; ++imad_it) { + acc = IMAD(acc, AS_INPUT_TYPE4(in[imad_it]), AS_FILTER_TYPE4(wei[imad_it])); + } + } + } + } + } + + ACTIVATION_TYPE dequantized; + dequantized = TO_ACTIVATION_TYPE(acc); + +#if BIAS_TERM + BIAS_TYPE bias_val = bias[out_f]; + dequantized += TO_ACTIVATION_TYPE(bias_val); +#endif + + OUTPUT_TYPE result; +#if HAS_FUSED_OPS + FUSED_OPS; + result = FUSED_OPS_RESULT; +#else + result = TO_OUTPUT_TYPE(dequantized); +#endif + +#if OUTPUT_DIMS <= 4 + uint output_idx = OUTPUT_GET_INDEX(out_b, out_f, out_y, out_x); +#elif OUTPUT_DIMS == 5 + uint output_idx = OUTPUT_GET_INDEX(out_b, out_f, out_z, out_y, out_x); +#endif + output[output_idx] = result; +} + +#undef FILTER_TYPE4 +#undef INPUT_TYPE4 +#undef AS_FILTER_TYPE4 +#undef AS_INPUT_TYPE4 + +#undef WEIGHTS_GET_INDEX diff --git a/inference-engine/thirdparty/clDNN/kernel_selector/core/cl_kernels/deconvolution_gpu_ref.cl b/inference-engine/thirdparty/clDNN/kernel_selector/core/cl_kernels/deconvolution_gpu_ref.cl index 1929806cfd9..f7fd8ee408a 100644 --- a/inference-engine/thirdparty/clDNN/kernel_selector/core/cl_kernels/deconvolution_gpu_ref.cl +++ b/inference-engine/thirdparty/clDNN/kernel_selector/core/cl_kernels/deconvolution_gpu_ref.cl @@ -21,13 +21,13 @@ KERNEL(deconvolution_gpu_yxfb_ref)( #if BIAS_TERM const __global BIAS_TYPE* bias, #endif - uint split_idx -#if FUSED_ELTWISE - , const __global UNIT_TYPE* fuse_input +#if HAS_FUSED_OPS_DECLS + FUSED_OPS_DECLS, #endif - ) + uint split_idx + ) { - UNIT_TYPE result = UNIT_VAL_ZERO; + ACCUMULATOR_TYPE acc = ACCUMULATOR_VAL_ZERO; #if DIM_ORDER_XYBF == 1 const uint out_x = get_global_id(0); @@ -99,42 +99,47 @@ KERNEL(deconvolution_gpu_yxfb_ref)( uint fixed_input_offset_x = (uint)input_offset_x / STRIDE_SIZE_X; uint fixed_input_offset_y = (uint)input_offset_y / STRIDE_SIZE_Y; uint fixed_input_offset_z = (uint)input_offset_z / STRIDE_SIZE_Z; -#if OUTPUT_LAYOUT_B_FS_ZYX_FSV16 || OUTPUT_LAYOUT_B_FS_YX_FSV16 || OUTPUT_LAYOUT_BS_FS_ZYX_BSV16_FSV16 + uint input_idx; -#else - uint input_idx = input_offset + (uint)fixed_input_offset_x*INPUT0_X_PITCH + (uint)fixed_input_offset_y*INPUT0_Y_PITCH + (uint)fixed_input_offset_z*INPUT0_Z_PITCH; +#if INPUT0_SIMPLE + input_idx = input_offset + (uint)fixed_input_offset_x*INPUT0_X_PITCH + (uint)fixed_input_offset_y*INPUT0_Y_PITCH + (uint)fixed_input_offset_z*INPUT0_Z_PITCH; #endif + #if GRADIENT uint filter_idx = filter_offset + of*FILTER_IFM_PITCH + (FILTER_SIZE_Z - k - 1)*FILTER_Z_PITCH + (FILTER_SIZE_Y - i - 1)*FILTER_Y_PITCH + (FILTER_SIZE_X - j - 1)*FILTER_X_PITCH; - for (uint h = 0; h < FILTER_OFM_NUM; h++) - { -#if INPUT0_LAYOUT_B_FS_ZYX_FSV16 || INPUT0_LAYOUT_BS_FS_ZYX_BSV16_FSV16 - input_idx = INPUT0_GET_INDEX(batch_offset, h + g*FILTER_IFM_NUM, fixed_input_offset_z, fixed_input_offset_y, fixed_input_offset_x); -#elif INPUT0_LAYOUT_BS_FS_YX_FSV16 + for (uint h = 0; h < FILTER_OFM_NUM; h++) { +#if !INPUT0_SIMPLE +# if INPUT0_DIMS <= 4 input_idx = INPUT0_GET_INDEX(batch_offset, h + g*FILTER_IFM_NUM, fixed_input_offset_y, fixed_input_offset_x); +# elif INPUT0_DIMS == 5 + input_idx = INPUT0_GET_INDEX(batch_offset, h + g*FILTER_IFM_NUM, fixed_input_offset_z, fixed_input_offset_y, fixed_input_offset_x); +# endif #endif - result = fma(input[input_idx], filter[filter_idx], result); + + acc += TO_ACCUMULATOR_TYPE(input[input_idx]) * TO_ACCUMULATOR_TYPE(filter[filter_idx]); filter_idx += FILTER_OFM_PITCH; -#if !INPUT0_LAYOUT_B_FS_ZYX_FSV16 && !INPUT0_LAYOUT_BS_FS_ZYX_BSV16_FSV16 && !INPUT0_LAYOUT_B_FS_YX_FSV16 +#if INPUT0_SIMPLE input_idx += INPUT0_FEATURE_PITCH; #endif } -#else +#else // GRADIENT uint filter_idx = filter_offset + of*FILTER_OFM_PITCH + (FILTER_SIZE_Z - k - 1)*FILTER_Z_PITCH + (FILTER_SIZE_Y - i - 1)*FILTER_Y_PITCH + (FILTER_SIZE_X - j - 1)*FILTER_X_PITCH; - for (uint h = 0; h < FILTER_IFM_NUM; h++) - { -#if OUTPUT_LAYOUT_B_FS_ZYX_FSV16 || OUTPUT_LAYOUT_BS_FS_ZYX_BSV16_FSV16 - input_idx = INPUT0_GET_INDEX(batch_offset, h + g*FILTER_IFM_NUM, fixed_input_offset_z, fixed_input_offset_y, fixed_input_offset_x); -#elif OUTPUT_LAYOUT_B_FS_YX_FSV16 + for (uint h = 0; h < FILTER_IFM_NUM; h++) { +#if !INPUT0_SIMPLE +# if INPUT0_DIMS <= 4 input_idx = INPUT0_GET_INDEX(batch_offset, h + g*FILTER_IFM_NUM, fixed_input_offset_y, fixed_input_offset_x); +# elif INPUT0_DIMS == 5 + input_idx = INPUT0_GET_INDEX(batch_offset, h + g*FILTER_IFM_NUM, fixed_input_offset_z, fixed_input_offset_y, fixed_input_offset_x); +# endif #endif - result = fma(input[input_idx], filter[filter_idx], result); + + acc += TO_ACCUMULATOR_TYPE(input[input_idx]) * TO_ACCUMULATOR_TYPE(filter[filter_idx]); filter_idx += FILTER_IFM_PITCH; -#if !OUTPUT_LAYOUT_B_FS_ZYX_FSV16 && !OUTPUT_LAYOUT_B_FS_YX_FSV16 && !OUTPUT_LAYOUT_BS_FS_ZYX_BSV16_FSV16 +#if INPUT0_SIMPLE input_idx += INPUT0_FEATURE_PITCH; #endif } -#endif +#endif // GRADIENT } } } @@ -142,35 +147,27 @@ KERNEL(deconvolution_gpu_yxfb_ref)( } } + ACTIVATION_TYPE pre_activation = TO_ACTIVATION_TYPE(acc); #if BIAS_TERM - result += bias[ofm_offset]; + pre_activation += TO_ACTIVATION_TYPE(bias[ofm_offset]); #endif - const uint out_split_offset = g * OUTPUT_FEATURE_PITCH * FILTER_OFM_NUM; -#if OUTPUT_LAYOUT_B_FS_ZYX_FSV16 || OUTPUT_LAYOUT_BS_FS_ZYX_BSV16_FSV16 - const uint dst_index = OUTPUT_OFFSET + OUTPUT_GET_INDEX(batch_offset, g * FILTER_OFM_NUM + of, out_z, out_y, out_x); -#elif OUTPUT_LAYOUT_B_FS_YX_FSV16 - const uint dst_index = OUTPUT_OFFSET + OUTPUT_GET_INDEX(batch_offset, g * FILTER_OFM_NUM + of, out_y, out_x); + ACTIVATION_TYPE post_activation = ACTIVATION(pre_activation, ACTIVATION_PARAMS); + + OUTPUT_TYPE result; +#if HAS_FUSED_OPS + FUSED_OPS; + result = FUSED_OPS_RESULT; #else - const uint dst_index = OUTPUT_OFFSET + out_split_offset + batch_offset*OUTPUT_BATCH_PITCH + of*OUTPUT_FEATURE_PITCH + out_z*OUTPUT_Z_PITCH + out_y*OUTPUT_Y_PITCH + out_x*OUTPUT_X_PITCH; -#endif -#if FUSED_ELTWISE -#if OUTPUT_LAYOUT_B_FS_ZYX_FSV16 || OUTPUT_LAYOUT_BS_FS_ZYX_BSV16_FSV16 - const uint fused_index = INPUT1_OFFSET + INPUT1_GET_INDEX(batch_offset, g * FILTER_OFM_NUM + of, out_z, out_y, out_x); -#elif OUTPUT_LAYOUT_B_FS_YX_FSV16 - const uint fused_index = INPUT1_OFFSET + INPUT1_GET_INDEX(batch_offset, g * FILTER_OFM_NUM + of, out_y, out_x); -#else - const uint fused_index = INPUT1_OFFSET + split_idx * INPUT1_FEATURE_PITCH * FILTER_OFM_NUM + batch_offset*INPUT1_BATCH_PITCH + of*INPUT1_FEATURE_PITCH + out_z*INPUT1_Z_PITCH + out_y*INPUT1_Y_PITCH + out_x*INPUT1_X_PITCH; -#endif -#if !GRADIENT - output[dst_index] = ACTIVATION(result + fuse_input[fused_index], ACTIVATION_PARAMS); -#else - output[dst_index] = result + fuse_input[fused_index]; + result = TO_OUTPUT_TYPE(post_activation); #endif +#if OUTPUT_DIMS <= 4 + const uint dst_index = OUTPUT_GET_INDEX(batch_offset, g * FILTER_OFM_NUM + of, out_y, out_x); +#elif OUTPUT_DIMS == 5 + const uint dst_index = OUTPUT_GET_INDEX(batch_offset, g * FILTER_OFM_NUM + of, out_z, out_y, out_x); #else - output[dst_index] = ACTIVATION(result, ACTIVATION_PARAMS); +# error deconvolution_gpu_ref.cl - Unsupported number of output dimensions. #endif + output[dst_index] = result; } - -#undef ACTIVATION diff --git a/inference-engine/thirdparty/clDNN/kernel_selector/core/cl_kernels/gen9_common_conv_bwd_data.cl b/inference-engine/thirdparty/clDNN/kernel_selector/core/cl_kernels/gen9_common_conv_bwd_data.cl index 30e1ebf3164..12935b052f8 100644 --- a/inference-engine/thirdparty/clDNN/kernel_selector/core/cl_kernels/gen9_common_conv_bwd_data.cl +++ b/inference-engine/thirdparty/clDNN/kernel_selector/core/cl_kernels/gen9_common_conv_bwd_data.cl @@ -15,6 +15,8 @@ *******************************************************************************/ #include "ocl_types.h" +#include "include/fetch.cl" +#include "include/data_types.cl" #if ID > 1 #define CASE_3D 1 @@ -30,12 +32,16 @@ __attribute__((intel_reqd_sub_group_size(SUB_GROUP_SIZE))) // attr:no-format #endif KERNEL(gen9_common_conv_bwd_data_kernel)( const __global DATA_T *diff_dst, - __global DATA_T *diff_src, + __global DATA_T * restrict diff_src, const __global DATA_T *wei, #if WITH_BIAS const __global DATA_T *bias, #endif - uint split_idx) +#if HAS_FUSED_OPS_DECLS + FUSED_OPS_DECLS, +#endif + uint split_idx + ) { const int input_offset = (INPUT0_PAD_BEFORE_FEATURE_NUM / OC_BLOCK) * OD_FULL * OH_FULL * OW_FULL * OC_BLOCK * MB_BLOCK + (INPUT0_PAD_BEFORE_SIZE_Z) * OH_FULL * OW_FULL * OC_BLOCK * MB_BLOCK + @@ -235,6 +241,17 @@ KERNEL(gen9_common_conv_bwd_data_kernel)( blockC00 = ACTIVATION(blockC00, ACTIVATION_PARAMS); blockC01 = ACTIVATION(blockC01, ACTIVATION_PARAMS); +#if HAS_FUSED_OPS + { + FUSED_OPS_BLOCK_C00; + blockC00 = FUSED_OPS_RESULT_BLOCK_C00; + } + { + FUSED_OPS_BLOCK_C01; + blockC01 = FUSED_OPS_RESULT_BLOCK_C01; + } +#endif + SAVE_SRC_DIFF(blockC00, src_write0, 0); SAVE_SRC_DIFF(blockC01, src_write0, 8); @@ -426,6 +443,10 @@ KERNEL(gen9_common_conv_bwd_data_kernel)( for (int i = 0; i < IW_BLOCK; i++) { blockC00[i] = ACTIVATION(blockC00[i], ACTIVATION_PARAMS); if (iw + i >= IW) continue; +#if HAS_FUSED_OPS + FUSED_OPS_BLOCK_CI; + blockC00[i] = FUSED_OPS_RESULT_BLOCK_CI; +#endif BLOCK_WRITE((__global BLOCK_DATA_T *)(&(src_write0)[i * IC_BLOCK]), AS_BLOCK_DATA_T(blockC00[i])); } diff --git a/inference-engine/thirdparty/clDNN/kernel_selector/core/cl_kernels/include/fetch.cl b/inference-engine/thirdparty/clDNN/kernel_selector/core/cl_kernels/include/fetch.cl index 485d24ba340..f51dcb7a395 100644 --- a/inference-engine/thirdparty/clDNN/kernel_selector/core/cl_kernels/include/fetch.cl +++ b/inference-engine/thirdparty/clDNN/kernel_selector/core/cl_kernels/include/fetch.cl @@ -118,18 +118,17 @@ inline uint FUNC(get_b_fs_yx_fsv_index)(uint b, uint f, uint y, uint x, uint f_pad_before, uint f_pad_after, uint y_pad_before, uint y_pad_after, uint x_pad_before, uint x_pad_after, uint alignment) { - const uint fs = f / alignment; - const uint fsv = f % alignment; + const uint feature = f + f_pad_before; + const uint fs = feature / alignment; + const uint fsv = feature % alignment; const uint x_pitch = alignment; const uint y_pitch = x_pitch * (x_pad_before + x_size + x_pad_after); const uint total_f_size = f_pad_before + f_size + f_pad_after; const uint fs_pitch = y_pitch * (y_pad_before + y_size + y_pad_after); const uint b_pitch = fs_pitch * ((total_f_size + alignment - 1) / alignment); - const uint fs_pad_before = f_pad_before / alignment; - const uint output_offset = b * b_pitch + - (fs + fs_pad_before) * fs_pitch + + fs * fs_pitch + (y_pad_before + y) * y_pitch + (x_pad_before + x) * x_pitch + fsv; @@ -142,7 +141,7 @@ inline uint FUNC(get_b_fs_yx_fsv_index_safe)(uint b, uint f, uint y, uint x, uint f_pad_before, uint f_pad_after, uint y_pad_before, uint y_pad_after, uint x_pad_before, uint x_pad_after, uint alignment) { - const uint f_mod = f % f_size; + const uint f_mod = f_pad_before + (f % f_size); const uint fs = f_mod / alignment; const uint fsv = f_mod % alignment; const uint x_pitch = alignment; @@ -151,10 +150,8 @@ inline uint FUNC(get_b_fs_yx_fsv_index_safe)(uint b, uint f, uint y, uint x, const uint fs_pitch = y_pitch * (y_pad_before + y_size + y_pad_after); const uint b_pitch = fs_pitch * ((total_f_size + alignment - 1) / alignment); - const uint fs_pad_before = f_pad_before / alignment; - const uint output_offset = b * b_pitch + - (fs_pad_before + fs) * fs_pitch + + fs * fs_pitch + (y_pad_before + (y % y_size)) * y_pitch + (x_pad_before + (x % x_size)) * x_pitch + fsv; @@ -1103,8 +1100,9 @@ inline uint FUNC(get_b_fs_zyx_fsv_index)(uint b, uint f, uint z, uint y, uint x uint x_pad_before, uint x_pad_after, uint alignment) { - const uint fs = f / alignment; - const uint fsv = f % alignment; + const uint feature = f + f_pad_before; + const uint fs = feature / alignment; + const uint fsv = feature % alignment; const uint x_pitch = alignment; const uint y_pitch = x_pitch * (x_pad_before + x_size + x_pad_after); const uint z_pitch = y_pitch * (y_pad_before + y_size + y_pad_after); @@ -1112,10 +1110,8 @@ inline uint FUNC(get_b_fs_zyx_fsv_index)(uint b, uint f, uint z, uint y, uint x const uint total_f_size = f_pad_before + f_size + f_pad_after; const uint b_pitch = fs_pitch * ((total_f_size + alignment - 1) / alignment); - const uint fs_pad_before = f_pad_before / alignment; - const uint output_offset = b * b_pitch + - (fs_pad_before + fs) * fs_pitch + + fs * fs_pitch + (z_pad_before + z) * z_pitch + (y_pad_before + y) * y_pitch + (x_pad_before + x) * x_pitch @@ -1131,7 +1127,7 @@ inline uint FUNC(get_b_fs_zyx_fsv_index_safe)(uint b, uint f, uint z, uint y, u uint y_pad_before, uint y_pad_after, uint x_pad_before, uint x_pad_after, uint alignment) { - const uint f_mod = f % f_size; + const uint f_mod = f_pad_before + (f % f_size); const uint fs = f_mod / alignment; const uint fsv = f_mod % alignment; const uint x_pitch = alignment; @@ -1141,10 +1137,8 @@ inline uint FUNC(get_b_fs_zyx_fsv_index_safe)(uint b, uint f, uint z, uint y, u const uint total_f_size = f_pad_before + f_size + f_pad_after; const uint b_pitch = fs_pitch * ((total_f_size + alignment - 1) / alignment); - const uint fs_pad_before = f_pad_before / alignment; - const uint output_offset = b * b_pitch + - (fs_pad_before + fs) * fs_pitch + + fs * fs_pitch + (z_pad_before + (z % z_size)) * z_pitch + (y_pad_before + (y % y_size)) * y_pitch + (x_pad_before + (x % x_size)) * x_pitch @@ -1160,7 +1154,7 @@ inline uint FUNC(get_bs_fs_zyx_bsv_fsv_index_safe)(uint b, uint f, uint z, uint uint y_pad_before, uint y_pad_after, uint x_pad_before, uint x_pad_after, uint alignmentF, uint alignmentB) { const uint b_mod = b % b_size; - const uint f_mod = f % f_size; + const uint f_mod = f_pad_before + (f % f_size); const uint fs = f_mod / alignmentF; const uint fsv = f_mod % alignmentF; const uint bs = b_mod / alignmentB; @@ -1172,10 +1166,8 @@ inline uint FUNC(get_bs_fs_zyx_bsv_fsv_index_safe)(uint b, uint f, uint z, uint const uint fs_pitch = z_pitch * (z_pad_before + z_size + z_pad_after); const uint b_pitch = fs_pitch * ((total_f_size + alignmentF - 1) / alignmentF); - const uint fs_pad_before = f_pad_before / alignmentF; - const uint output_offset = (bs * b_pitch) + (bsv * alignmentF) + - (fs_pad_before + fs) * fs_pitch + + fs * fs_pitch + (z_pad_before + (z % z_size)) * z_pitch + (y_pad_before + (y % y_size)) * y_pitch + (x_pad_before + (x % x_size)) * x_pitch @@ -1191,8 +1183,9 @@ inline uint FUNC(get_bs_fs_zyx_bsv16_fsv16_index)(uint b, uint f, uint z, uint uint y_pad_before, uint y_pad_after, uint x_pad_before, uint x_pad_after) { const uint alignment = 16; - const uint fs = f / alignment; - const uint fsv = f % alignment; + const uint feature = f + f_pad_before; + const uint fs = feature / alignment; + const uint fsv = feature % alignment; const uint bs = b / alignment; const uint bsv = b % alignment; @@ -1204,10 +1197,8 @@ inline uint FUNC(get_bs_fs_zyx_bsv16_fsv16_index)(uint b, uint f, uint z, uint const uint total_f_size = f_pad_before + f_size + f_pad_after; const uint bs_pitch = fs_pitch * ((total_f_size + alignment - 1) / alignment); - const uint fs_pad_before = f_pad_before / alignment; - const uint output_offset = bs * bs_pitch + - (fs_pad_before + fs) * fs_pitch + + fs * fs_pitch + (z_pad_before + z) * z_pitch + (y_pad_before + y) * y_pitch + (x_pad_before + x) * x_pitch + @@ -1510,6 +1501,56 @@ inline uint FUNC(get_gs_oi_yxs_gsv_yxsv4_index)(uint g, uint o, uint i, uint y, ((o) / (sub_group_size))*CAT(prefix, _OFM_PITCH) \ ) +inline uint FUNC(get_g_os_zyx_is_osv_isv_index)(uint g, uint o, uint i, uint z, uint y, uint x, + uint g_size, uint o_size, uint i_size, uint z_size, uint y_size, uint x_size, + uint osv, uint isv) { + uint is_size = (i_size + isv - 1) / isv; + uint os_size = (o_size + osv - 1) / osv; + + uint isv_index = i % isv; + uint osv_index = o % osv; + uint is_index = i / isv; + uint os_index = o / osv; + + uint isv_pitch = 1; + uint osv_pitch = isv_pitch * isv; + uint is_pitch = osv_pitch * osv; + uint x_pitch = is_pitch * is_size; + uint y_pitch = x_pitch * x_size; + uint z_pitch = y_pitch * y_size; + uint os_pitch = z_pitch * z_size; + uint g_pitch = os_pitch * os_size; + + uint index = 0; + index += isv_index * isv_pitch; + index += osv_index * osv_pitch; + index += is_index * is_pitch; + index += x * x_pitch; + index += y * y_pitch; + index += z * z_pitch; + index += os_index * os_pitch; + index += g * g_pitch; + return index; +} + +#define GET_FILTER_G_OS_ZYX_IS_OSV_ISV_INDEX(tensor, g, o, i, z, y, x, osv, isv) \ + FUNC_CALL(get_g_os_zyx_is_osv_isv_index)( \ + g, o, i, z, y, x, \ + CAT(tensor, _GROUPS_NUM), \ + CAT(tensor, _OFM_NUM), \ + CAT(tensor, _IFM_NUM), \ + CAT(tensor, _SIZE_Z), \ + CAT(tensor, _SIZE_Y), \ + CAT(tensor, _SIZE_X), \ + osv, isv) + +#define GET_FILTER_G_OS_ZYX_IS_OSV16_ISV4_INDEX(tensor, g, o, i, z, y, x) GET_FILTER_G_OS_ZYX_IS_OSV_ISV_INDEX(tensor, g, o, i, z, y, x, 16, 4) +#define GET_FILTER_G_OS_ZYX_IS_OSV16_ISV16_INDEX(tensor, g, o, i, z, y, x) GET_FILTER_G_OS_ZYX_IS_OSV_ISV_INDEX(tensor, g, o, i, z, y, x, 16, 16) +#define GET_FILTER_G_OS_ZYX_IS_OSV16_ISV32_INDEX(tensor, g, o, i, z, y, x) GET_FILTER_G_OS_ZYX_IS_OSV_ISV_INDEX(tensor, g, o, i, z, y, x, 16, 32) +#define GET_FILTER_G_OS_ZYX_IS_OSV32_ISV4_INDEX(tensor, g, o, i, z, y, x) GET_FILTER_G_OS_ZYX_IS_OSV_ISV_INDEX(tensor, g, o, i, z, y, x, 32, 4) +#define GET_FILTER_G_OS_ZYX_IS_OSV32_ISV16_INDEX(tensor, g, o, i, z, y, x) GET_FILTER_G_OS_ZYX_IS_OSV_ISV_INDEX(tensor, g, o, i, z, y, x, 32, 16) +#define GET_FILTER_G_OS_ZYX_IS_OSV32_ISV32_INDEX(tensor, g, o, i, z, y, x) GET_FILTER_G_OS_ZYX_IS_OSV_ISV_INDEX(tensor, g, o, i, z, y, x, 32, 32) + #define DECLARE_SAMPLER const sampler_t imageSampler = CLK_NORMALIZED_COORDS_FALSE | CLK_ADDRESS_CLAMP | CLK_FILTER_NEAREST #if FP16_UNIT_USED diff --git a/inference-engine/thirdparty/clDNN/kernel_selector/core/cl_kernels/include/reshape_dims.cl b/inference-engine/thirdparty/clDNN/kernel_selector/core/cl_kernels/include/reshape_dims.cl index 8fa7b51b46c..4d53bc3d264 100644 --- a/inference-engine/thirdparty/clDNN/kernel_selector/core/cl_kernels/include/reshape_dims.cl +++ b/inference-engine/thirdparty/clDNN/kernel_selector/core/cl_kernels/include/reshape_dims.cl @@ -125,15 +125,16 @@ inline uint8 FUNC(reshape_6_to_4)(uint o, uint i, uint w, uint z, uint y, uint x return (uint8)(0, dst_b, dst_f, 0, 0, dst_y, dst_x, 0); } -inline uint8 FUNC(reshape_grouped_to_simple)(uint g, uint o, uint i, uint z, uint y, uint x, uint src_size_groups, uint dst_size_ofm) +inline uint8 FUNC(reshape_grouped)(uint g, uint o, uint i, uint z, uint y, uint x, uint src_size_ofm, uint dst_size_ofm) { - const uint ofm_per_group = dst_size_ofm / src_size_groups; - const uint dst_ofm = g * ofm_per_group + (o % ofm_per_group); + const uint flat_ofm = g * src_size_ofm + o; + const uint dst_ofm = flat_ofm % dst_size_ofm; + const uint dst_g = flat_ofm / dst_size_ofm; const uint dst_ifm = i; const uint dst_z = z; const uint dst_y = y; const uint dst_x = x; - return (uint8)(0, dst_ofm, dst_ifm, 0, dst_z, dst_y, dst_x, 0); + return (uint8)(dst_g, dst_ofm, dst_ifm, 0, dst_z, dst_y, dst_x, 0); } inline uint8 FUNC(reshape_dims)( @@ -178,11 +179,15 @@ inline uint8 FUNC(reshape_dims_with_groups)( { if (src_dims == 5 && dst_dims == 4) // goiyx -> oiyx { - return FUNC_CALL(reshape_grouped_to_simple)(g, o, i, 0, y, x, src_size_groups, dst_size_ofm); + return FUNC_CALL(reshape_grouped)(g, o, i, 0, y, x, src_size_ofm, dst_size_ofm); } - else if (src_dims == 6 && dst_dims == 5) // goizyx -> oizyx + else if (src_dims == 6 && dst_dims == 5) // goizyx -> oizyx or goizyx -> goiyx { - return FUNC_CALL(reshape_grouped_to_simple)(g, o, i, z, y, x, src_size_groups, dst_size_ofm); + return FUNC_CALL(reshape_grouped)(g, o, i, z, y, x, src_size_ofm, dst_size_ofm); + } + else if (src_dims == 6 && dst_dims == 4) // goizyx -> oiyx + { + return FUNC_CALL(reshape_grouped)(g, o, i, 0, y, x, src_size_ofm, dst_size_ofm); } return (uint8)(g, o, i, w, z, y, x, 0); diff --git a/inference-engine/thirdparty/clDNN/kernel_selector/core/cl_kernels/reorder_weights.cl b/inference-engine/thirdparty/clDNN/kernel_selector/core/cl_kernels/reorder_weights.cl index c5a130db22a..5bdb29ecde9 100644 --- a/inference-engine/thirdparty/clDNN/kernel_selector/core/cl_kernels/reorder_weights.cl +++ b/inference-engine/thirdparty/clDNN/kernel_selector/core/cl_kernels/reorder_weights.cl @@ -97,6 +97,18 @@ inline uint FUNC(get_input_index)(uint g, uint o, uint i, uint z, uint y, uint x return GET_FILTER_GS_OI_YXS_GSV16_YXSV4_INDEX(INPUT0, g, o, i, y, x); #elif defined INPUT0_LAYOUT_GS_OI_YXS_GSV32_YXSV4 return GET_FILTER_GS_OI_YXS_GSV32_YXSV4_INDEX(INPUT0, g, o, i, y, x); +#elif defined INPUT0_LAYOUT_G_OS_ZYX_IS_OSV16_ISV4 + return GET_FILTER_G_OS_ZYX_IS_OSV16_ISV4_INDEX(INPUT0, g, o, i, z, y, x); +#elif defined INPUT0_LAYOUT_G_OS_ZYX_IS_OSV16_ISV16 + return GET_FILTER_G_OS_ZYX_IS_OSV16_ISV16_INDEX(INPUT0, g, o, i, z, y, x); +#elif defined INPUT0_LAYOUT_G_OS_ZYX_IS_OSV16_ISV32 + return GET_FILTER_G_OS_ZYX_IS_OSV16_ISV32_INDEX(INPUT0, g, o, i, z, y, x); +#elif defined INPUT0_LAYOUT_G_OS_ZYX_IS_OSV32_ISV4 + return GET_FILTER_G_OS_ZYX_IS_OSV32_ISV4_INDEX(INPUT0, g, o, i, z, y, x); +#elif defined INPUT0_LAYOUT_G_OS_ZYX_IS_OSV32_ISV16 + return GET_FILTER_G_OS_ZYX_IS_OSV32_ISV16_INDEX(INPUT0, g, o, i, z, y, x); +#elif defined INPUT0_LAYOUT_G_OS_ZYX_IS_OSV32_ISV32 + return GET_FILTER_G_OS_ZYX_IS_OSV32_ISV32_INDEX(INPUT0, g, o, i, z, y, x); #else #error reorder_weights.cl: input format - not supported #endif @@ -214,6 +226,18 @@ inline uint FUNC(get_output_index)(uint g, uint o, uint i, uint z, uint y, uint return GET_FILTER_GS_OI_YXS_GSV32_YXSV4_INDEX(OUTPUT, g, o, i, y, x); #elif defined OUTPUT_LAYOUT_G_OS_IS_YX_OSV16_ISV4 return GET_FILTER_G_OS_IS_YX_OSV16_ISV4_INDEX(OUTPUT, g, o, i, y, x); +#elif defined OUTPUT_LAYOUT_G_OS_ZYX_IS_OSV16_ISV4 + return GET_FILTER_G_OS_ZYX_IS_OSV16_ISV4_INDEX(OUTPUT, g, o, i, z, y, x); +#elif defined OUTPUT_LAYOUT_G_OS_ZYX_IS_OSV16_ISV16 + return GET_FILTER_G_OS_ZYX_IS_OSV16_ISV16_INDEX(OUTPUT, g, o, i, z, y, x); +#elif defined OUTPUT_LAYOUT_G_OS_ZYX_IS_OSV16_ISV32 + return GET_FILTER_G_OS_ZYX_IS_OSV16_ISV32_INDEX(OUTPUT, g, o, i, z, y, x); +#elif defined OUTPUT_LAYOUT_G_OS_ZYX_IS_OSV32_ISV4 + return GET_FILTER_G_OS_ZYX_IS_OSV32_ISV4_INDEX(OUTPUT, g, o, i, z, y, x); +#elif defined OUTPUT_LAYOUT_G_OS_ZYX_IS_OSV32_ISV16 + return GET_FILTER_G_OS_ZYX_IS_OSV32_ISV16_INDEX(OUTPUT, g, o, i, z, y, x); +#elif defined OUTPUT_LAYOUT_G_OS_ZYX_IS_OSV32_ISV32 + return GET_FILTER_G_OS_ZYX_IS_OSV32_ISV32_INDEX(OUTPUT, g, o, i, z, y, x); #else #error reorder_weights.cl: output format - not supported #endif @@ -240,35 +264,26 @@ KERNEL (reorder_weights)(const __global INPUT0_TYPE* input, __global OUTPUT_TYPE #if OUTPUT_GROUPS_NUM > 1 const unsigned g = (uint)get_global_id(0) / OUTPUT_OFM_NUM; const unsigned o = (uint)get_global_id(0) % OUTPUT_OFM_NUM; - const unsigned i = (uint)get_global_id(1); -#if OUTPUT_DIMS == 5 - const unsigned z = 0; - const unsigned y = (uint)get_global_id(2) / OUTPUT_SIZE_X; - const unsigned x = (uint)get_global_id(2) % OUTPUT_SIZE_X; -#elif OUTPUT_DIMS == 6 - const unsigned zyx = get_global_id(2); - const unsigned x = zyx % INPUT0_SIZE_X; - const unsigned y = (zyx / INPUT0_SIZE_X) % INPUT0_SIZE_Y; - const unsigned z = (zyx / INPUT0_SIZE_X) / INPUT0_SIZE_Y; -#endif #else - const unsigned o = (uint)get_global_id(0); - const unsigned i = (uint)get_global_id(1); const unsigned g = 0; -#if OUTPUT_DIMS == 2 - const unsigned z = 0; - const unsigned y = 0; - const unsigned x = 0; -#elif OUTPUT_DIMS == 4 - const unsigned z = 0; - const unsigned y = (uint)get_global_id(2) / INPUT0_SIZE_X; - const unsigned x = (uint)get_global_id(2) % INPUT0_SIZE_X; -#elif OUTPUT_DIMS == 5 - const unsigned zyx = get_global_id(2); - const unsigned x = zyx % INPUT0_SIZE_X; - const unsigned y = (zyx / INPUT0_SIZE_X) % INPUT0_SIZE_Y; - const unsigned z = (zyx / INPUT0_SIZE_X) / INPUT0_SIZE_Y; + const unsigned o = (uint)get_global_id(0); #endif + + const unsigned i = (uint)get_global_id(1); + +#if OUTPUT_DIMS == 2 || (OUTPUT_DIMS == 3 && OUTPUT_GROUPED) + const unsigned x = 0; + const unsigned y = 0; + const unsigned z = 0; +#elif OUTPUT_DIMS == 4 || (OUTPUT_DIMS == 5 && OUTPUT_GROUPED) + const unsigned x = (uint)get_global_id(2) % OUTPUT_SIZE_X; + const unsigned y = (uint)get_global_id(2) / OUTPUT_SIZE_X; + const unsigned z = 0; +#elif OUTPUT_DIMS == 5 || (OUTPUT_DIMS == 6 && OUTPUT_GROUPED) + const unsigned zyx = get_global_id(2); + const unsigned x = zyx % OUTPUT_SIZE_X; + const unsigned y = (zyx / OUTPUT_SIZE_X) % OUTPUT_SIZE_Y; + const unsigned z = (zyx / OUTPUT_SIZE_X) / OUTPUT_SIZE_Y; #endif #if OUTPUT_GROUPS_NUM > 1 // Add grouped macro instead this check @@ -276,6 +291,14 @@ KERNEL (reorder_weights)(const __global INPUT0_TYPE* input, __global OUTPUT_TYPE #else uint8 ir = RESHAPE_WEIGHT_DIMS(OUTPUT, INPUT0, o, i, 0, z, y, x); #endif - output[FUNC_CALL(get_output_index)(g, o, i, z, y, x)] = TO_OUTPUT_TYPE(input[FUNC_CALL(get_input_index)(ir[0],ir[1],ir[2],ir[4],ir[5],ir[6])]); + + uint input_idx = FUNC_CALL(get_input_index)(ir[0],ir[1],ir[2],ir[4],ir[5],ir[6]); +#if !REORDER_ROTATE + uint output_idx = FUNC_CALL(get_output_index)(g, o, i, z, y, x); +#else + uint output_idx = FUNC_CALL(get_output_index)(g, o, i, OUTPUT_SIZE_Z - z - 1, OUTPUT_SIZE_Y - y - 1, OUTPUT_SIZE_X - x - 1); +#endif + + output[output_idx] = TO_OUTPUT_TYPE(input[input_idx]); } #endif diff --git a/inference-engine/thirdparty/clDNN/kernel_selector/core/common/jitter.cpp b/inference-engine/thirdparty/clDNN/kernel_selector/core/common/jitter.cpp index e6a3470e8ad..a1ad008b8cb 100644 --- a/inference-engine/thirdparty/clDNN/kernel_selector/core/common/jitter.cpp +++ b/inference-engine/thirdparty/clDNN/kernel_selector/core/common/jitter.cpp @@ -445,8 +445,8 @@ JitDefinitions DataTensorJitConstant::GetDefinitions() const { definitions.push_back({ safe_index_func_name, safe_index_func_val }); definitions.push_back({ index_func_name, index_func_val }); } else { - definitions.push_back({ safe_index_func_name, "f" }); - definitions.push_back({ index_func_name, "f" }); + definitions.push_back({ safe_index_func_name, "(f)" }); + definitions.push_back({ index_func_name, "(f)" }); } } else { definitions.push_back({ safe_index_func_name, safe_index_func_val }); @@ -1171,10 +1171,15 @@ JitConstants FusedOpsCodeGenerator::MakeOpJitConstants(const FusedOpsConfigurati auto in_lo = p->per_tensor_input_range ? Broadcast(std::to_string(p->in_lo), desc.tensors[0].GetDType(), vec_size) : GetInputVarName(0); auto in_hi = p->per_tensor_input_range ? Broadcast(std::to_string(p->in_hi), desc.tensors[0].GetDType(), vec_size) : GetInputVarName(1); - op_decls += "\\\n\t" + tmp_type + " " + tmp_var + " = min(max(" + in_lo + ", " + in_converted + "), " + in_hi + ");"; + if (p->has_clamp) { + op_decls += "\\\n\t" + tmp_type + " " + tmp_var + " = min(max(" + in_lo + ", " + in_converted + "), " + in_hi + ");"; + } else { + op_decls += "\\\n\t" + tmp_type + " " + tmp_var + " = " + in_converted + ";"; + } op_decls += "\\\n\t" + tmp_var + " = " + tmp_var + "*" + pre_scale + ";"; if (p->has_pre_shift) op_decls += "\\\n\t" + tmp_var + " = " + tmp_var + " + " + pre_shift + ";"; + op_decls += "\\\n\t" + tmp_var + " = round(" + tmp_var + ");"; bool need_round = (p->has_post_scale || p->has_post_shift) && @@ -1254,9 +1259,9 @@ std::string FusedOpsCodeGenerator::GetIdx(size_t input_id, idx_desc idx, bool sh } if (should_be_safe) { - return GetInputTensorName(input_id) + "_GET_INDEX_SAFE(" + idx_order +")"; + return GetInputTensorName(input_id) + "_GET_INDEX_SAFE(" + idx_order + ")"; } else { - return GetInputTensorName(input_id) + "_GET_INDEX(" + idx_order +")"; + return GetInputTensorName(input_id) + "_GET_INDEX(" + idx_order + ")"; } } @@ -1349,11 +1354,10 @@ std::string FusedOpsCodeGenerator::GetInputVarName(size_t input_id) const { } std::string FusedOpsCodeGenerator::GetOutputVarName(std::string input_var) const { - static int i = 0; std::replace(input_var.begin(), input_var.end(), '[', '_'); std::replace(input_var.begin(), input_var.end(), ']', '_'); std::replace(input_var.begin(), input_var.end(), ' ', '_'); - return input_var + "_" + std::to_string(i++); + return input_var + "_out"; } std::string FusedOpsCodeGenerator::GetType(Datatype dt, size_t vec_size) const { @@ -1396,7 +1400,7 @@ std::vector FusedOpsCodeGenerator::GetRequiredInputs() const { auto p = std::dynamic_pointer_cast(desc.op_params); if (p) { std::vector res = {}; - if (!p->per_tensor_input_range) { + if (!p->per_tensor_input_range && p->has_clamp) { res.push_back(0); res.push_back(1); } diff --git a/inference-engine/thirdparty/clDNN/kernel_selector/core/common/jitter.h b/inference-engine/thirdparty/clDNN/kernel_selector/core/common/jitter.h index 89dad7dc015..8814b35547e 100644 --- a/inference-engine/thirdparty/clDNN/kernel_selector/core/common/jitter.h +++ b/inference-engine/thirdparty/clDNN/kernel_selector/core/common/jitter.h @@ -306,7 +306,8 @@ public: std::string y; std::string x; size_t dims; - explicit idx_desc(std::vector idx, DataTensor t) : b("0"), f("0"), z("0"), y("0"), x("0"), dims(0) { + explicit idx_desc(std::vector idx, DataTensor t) + : b("0"), f("0"), z("0"), y("0"), x("0"), dims(0) { dims = idx.size(); switch (dims) { case 1: f = idx[0]; break; diff --git a/inference-engine/thirdparty/clDNN/kernel_selector/core/common/kernel_selector_utils.cpp b/inference-engine/thirdparty/clDNN/kernel_selector/core/common/kernel_selector_utils.cpp index f0859bfaf1f..106ec8b3fa9 100644 --- a/inference-engine/thirdparty/clDNN/kernel_selector/core/common/kernel_selector_utils.cpp +++ b/inference-engine/thirdparty/clDNN/kernel_selector/core/common/kernel_selector_utils.cpp @@ -43,7 +43,8 @@ static WeightsType DataTypeToWeightsType(Datatype t) { static WeightsFormatSupportType CheckWeights(const weight_bias_params& newParams, WeightsType reqType, WeightsLayout reqLayouts, - const ParamsKey& paramsKey) { + const ParamsKey& paramsKey, + bool rotate) { // validate if weights type is image and if device supports requested sizes if (Tensor::IsImageType(reqLayouts)) { if (!CheckImageSize(newParams, reqLayouts)) @@ -59,8 +60,9 @@ static WeightsFormatSupportType CheckWeights(const weight_bias_params& newParams } reorderNeeded |= tensor.GetLayout() != reqLayouts; + reorderNeeded |= rotate; - if (reorderNeeded && !pitchesDifferFromLS) { + if (reorderNeeded && !pitchesDifferFromLS && !rotate) { reorderNeeded = !((reqLayouts == WeightsLayout::io && tensor.GetLayout() == WeightsLayout::iyxo) || (reqLayouts == WeightsLayout::oi && tensor.GetLayout() == WeightsLayout::oiyx)); } @@ -104,11 +106,12 @@ bool UpdateWeightsParams(weight_bias_params& newParams, WeightsLayout reqLayout, WeightsReorderParams& weightsReorderParams, const ParamsKey& paramsKey, - size_t groups) { + size_t groups, + bool rotate) { const auto& optParams = static_cast(options); const auto inType = DataTypeToWeightsType(newParams.inputs[0].GetDType()); const auto dtype = paramsKey.isEnabledDifferentInputWeightsTypes() ? newParams.weights.GetDType() : inType; - switch (CheckWeights(newParams, inType, reqLayout, paramsKey)) { + switch (CheckWeights(newParams, inType, reqLayout, paramsKey, rotate)) { case SUPPORTED: return true; case UNSUPPORTED: @@ -124,6 +127,7 @@ bool UpdateWeightsParams(weight_bias_params& newParams, r_params.layerID = newParams.layerID + "_reorder_"; r_params.input = newParams.weights; r_params.output = newParams.weights.TransformIgnorePadding(reqLayout, dtype, groups, false); + r_params.rotate_180 = rotate; r_params.engineInfo = newParams.engineInfo; reorder_optional_params op; @@ -132,7 +136,8 @@ bool UpdateWeightsParams(weight_bias_params& newParams, if (kernels_data.empty()) { throw std::runtime_error("No suitable kernel found for weights reorder from " + toString(r_params.input.GetLayout()) + " to " + - toString(r_params.output.GetLayout())); + toString(r_params.output.GetLayout()) + + (rotate ? " with rotate" : "")); } weightsReorderParams.engine = WeightsReorderParams::Engine::GPU; @@ -228,13 +233,15 @@ bool CheckInputsOutputNoPitchSameDims(const base_params& params) { if (params.inputs.size()) { no_pitch_same_dims = !params.inputs[0].PitchesDifferFromLogicalDims(); - if (params.inputs[0].GetLayout() == DataLayout::b_fs_yx_fsv16 && params.inputs[0].Feature().v % 16 != 0) + if ((params.inputs[0].GetLayout() == DataLayout::b_fs_yx_fsv16 && params.inputs[0].Feature().v % 16 != 0) || + (params.inputs[0].GetLayout() == DataLayout::b_fs_zyx_fsv16 && params.inputs[0].Feature().v % 16 != 0)) return false; for (size_t i = 1; i < params.inputs.size(); i++) { no_pitch_same_dims = no_pitch_same_dims && (params.inputs[0] == params.inputs[i]); - if (params.inputs[i].GetLayout() == DataLayout::b_fs_yx_fsv16 && params.inputs[i].Feature().v % 16 != 0) + if ((params.inputs[i].GetLayout() == DataLayout::b_fs_yx_fsv16 && params.inputs[i].Feature().v % 16 != 0) || + (params.inputs[0].GetLayout() == DataLayout::b_fs_zyx_fsv16 && params.inputs[0].Feature().v % 16 != 0)) return false; } diff --git a/inference-engine/thirdparty/clDNN/kernel_selector/core/common/kernel_selector_utils.h b/inference-engine/thirdparty/clDNN/kernel_selector/core/common/kernel_selector_utils.h index 22f077a54a2..9d1880c2063 100644 --- a/inference-engine/thirdparty/clDNN/kernel_selector/core/common/kernel_selector_utils.h +++ b/inference-engine/thirdparty/clDNN/kernel_selector/core/common/kernel_selector_utils.h @@ -30,7 +30,8 @@ bool UpdateWeightsParams(weight_bias_params& newParams, WeightsLayout layout, WeightsReorderParams& weightsReorderParams, const ParamsKey& paramsKey = ParamsKey(), - size_t groups = 1); + size_t groups = 1, + bool rotate = false); JitConstants GetTensorFriendlyWorkGroupsJit(const DataTensor& t); std::vector GetTensorFriendlyWorkGroups(const DataTensor& t); std::vector GetOptimalLocalWorkGroupSizes(std::vector gws, const EngineInfo& info); diff --git a/inference-engine/thirdparty/clDNN/kernel_selector/core/kernel_base.cpp b/inference-engine/thirdparty/clDNN/kernel_selector/core/kernel_base.cpp index 3c35eea802b..322842f2e1d 100644 --- a/inference-engine/thirdparty/clDNN/kernel_selector/core/kernel_base.cpp +++ b/inference-engine/thirdparty/clDNN/kernel_selector/core/kernel_base.cpp @@ -64,8 +64,9 @@ JitConstants KernelBase::MakeBaseParamsJitConstants(const base_params& params) c jit.AddConstant(MakeJitConstant("INPUT" + toCodeString(i), params.inputs[i])); } +#if !NDEBUG jit.AddConstant(MakeJitConstant("LayerID", params.layerID)); - +#endif return jit; } diff --git a/inference-engine/thirdparty/clDNN/kernel_selector/core/kernel_base.h b/inference-engine/thirdparty/clDNN/kernel_selector/core/kernel_base.h index 3d6abfd34ea..ae2c23a7eb3 100644 --- a/inference-engine/thirdparty/clDNN/kernel_selector/core/kernel_base.h +++ b/inference-engine/thirdparty/clDNN/kernel_selector/core/kernel_base.h @@ -50,6 +50,7 @@ public: virtual const std::string GetName() const { return kernelName; } static const primitive_db& get_db() { return db; } + static void ResetCounter() { counter = 0; } protected: static const primitive_db db; diff --git a/inference-engine/thirdparty/clDNN/kernel_selector/core/kernel_selector_common.cpp b/inference-engine/thirdparty/clDNN/kernel_selector/core/kernel_selector_common.cpp index be16f4bef5e..04d72b396ee 100644 --- a/inference-engine/thirdparty/clDNN/kernel_selector/core/kernel_selector_common.cpp +++ b/inference-engine/thirdparty/clDNN/kernel_selector/core/kernel_selector_common.cpp @@ -370,6 +370,12 @@ std::string toString(WeightsLayout layout) { case WeightsLayout::gs_oi_yxs_gsv32_yxsv4: return "GS_OI_YXS_GSV32_YXSV4"; case WeightsLayout::g_os_is_yx_isv16_osv16: return "G_OS_IS_YX_ISV16_OSV16"; case WeightsLayout::g_os_is_yx_osv16_isv4: return "G_OS_IS_YX_OSV16_ISV4"; + case WeightsLayout::g_os_zyx_is_osv16_isv4: return "G_OS_ZYX_IS_OSV16_ISV4"; + case WeightsLayout::g_os_zyx_is_osv16_isv16: return "G_OS_ZYX_IS_OSV16_ISV16"; + case WeightsLayout::g_os_zyx_is_osv16_isv32: return "G_OS_ZYX_IS_OSV16_ISV32"; + case WeightsLayout::g_os_zyx_is_osv32_isv4: return "G_OS_ZYX_IS_OSV32_ISV4"; + case WeightsLayout::g_os_zyx_is_osv32_isv16: return "G_OS_ZYX_IS_OSV32_ISV16"; + case WeightsLayout::g_os_zyx_is_osv32_isv32: return "G_OS_ZYX_IS_OSV32_ISV32"; default: throw std::invalid_argument("Failed to convert WeightsLayout " + std::to_string(layout) + " to string"); } } diff --git a/inference-engine/thirdparty/clDNN/kernel_selector/core/kernel_selector_params.h b/inference-engine/thirdparty/clDNN/kernel_selector/core/kernel_selector_params.h index 9ac8306dfdc..f5484896c01 100644 --- a/inference-engine/thirdparty/clDNN/kernel_selector/core/kernel_selector_params.h +++ b/inference-engine/thirdparty/clDNN/kernel_selector/core/kernel_selector_params.h @@ -143,7 +143,6 @@ public: uint32_t split : 1; uint32_t dilation : 1; uint32_t depthwise_separable_opt : 1; - uint32_t transposed : 1; uint32_t local : 1; uint32_t grouped : 1; uint32_t deformable : 1; @@ -186,6 +185,7 @@ public: } resample; struct reorder_t { uint32_t winograd : 1; + uint32_t rotate : 1; } reorder; struct eltwise_t { uint32_t stride : 1; @@ -317,7 +317,6 @@ public: void EnableDepthwiseSeparableOpt() { key.restrict.val.dedicated.conv.depthwise_separable_opt = 1; } void EnableLocalConvolution() { key.restrict.val.dedicated.conv.local = 1; } void EnableGroupedConvolution() { key.restrict.val.dedicated.conv.grouped = 1; } - void EnableTranspose() { key.restrict.val.dedicated.conv.transposed = 1; } void EnableInt8Quantization() { key.restrict.val.quantization = 1; } void EnableOutputCalibration() { key.restrict.val.output_calibration = 1; } void EnableDeformableMode() { key.restrict.val.dedicated.conv.deformable = 1; } @@ -339,6 +338,7 @@ public: void EnableQuantizeScaleShiftOpt() { key.restrict.val.dedicated.quantize.scale_shift_opt = 1; } void EnableWinogradReorder() { key.restrict.val.dedicated.reorder.winograd = 1; } + void EnableRotateReorder() { key.restrict.val.dedicated.reorder.rotate = 1; } void EnableSoftmaxDim(SoftmaxDim d); void EnableConcatAxis(ConcatAxis a); void EnableReampleType(ResampleType a); diff --git a/inference-engine/thirdparty/clDNN/src/activation.cpp b/inference-engine/thirdparty/clDNN/src/activation.cpp index b7b0bbcd2e6..621a2d64865 100644 --- a/inference-engine/thirdparty/clDNN/src/activation.cpp +++ b/inference-engine/thirdparty/clDNN/src/activation.cpp @@ -46,6 +46,10 @@ layout activation_inst::calc_output_layout(activation_node const& node) { CLDNN_ERROR_MESSAGE(node.id(), "Requested activation is not supported for integer type."); } + if (node.has_fused_primitives()) { + input_node_layout.data_type = node.get_fused_output_layout().data_type; + } + return input_node_layout; } diff --git a/inference-engine/thirdparty/clDNN/src/deconvolution.cpp b/inference-engine/thirdparty/clDNN/src/deconvolution.cpp index fa64e155db3..d74aafc3c8e 100644 --- a/inference-engine/thirdparty/clDNN/src/deconvolution.cpp +++ b/inference-engine/thirdparty/clDNN/src/deconvolution.cpp @@ -36,6 +36,15 @@ layout deconvolution_inst::calc_output_layout(deconvolution_node const& node) { auto input_layout = node.input().get_output_layout(); auto weights_layout = node.weights(0).get_output_layout(); // weights are stored after inputs + auto data_type = input_layout.data_type; + if ((input_layout.data_type == data_types::i8 || input_layout.data_type == data_types::u8) && !node.has_fused_primitives()) { + data_type = data_types::f32; + } + + if (node.has_fused_primitives()) { + data_type = node.get_fused_output_layout().data_type; + } + auto input_offset = desc->input_offset; auto strd = desc->stride; auto group = desc->groups; @@ -71,7 +80,7 @@ layout deconvolution_inst::calc_output_layout(deconvolution_node const& node) { desc->output_size.spatial[0], desc->output_size.spatial[1], desc->output_size.spatial[2]); - return {input_layout.data_type, input_layout.format, output_size}; + return {data_type, input_layout.format, output_size}; } // compute output_dim <= stride * (input_size - 1) + kernel_size + 2 * input_offset; @@ -98,7 +107,7 @@ layout deconvolution_inst::calc_output_layout(deconvolution_node const& node) { tensor output_size(input_layout.size.batch[0], number_of_features, x, y, z); - return {input_layout.data_type, input_layout.format, output_size}; + return {data_type, input_layout.format, output_size}; } std::string deconvolution_inst::to_string(deconvolution_node const& node) { diff --git a/inference-engine/thirdparty/clDNN/src/gpu/crop_gpu.cpp b/inference-engine/thirdparty/clDNN/src/gpu/crop_gpu.cpp index 9a3e1e10bd5..3df324804d6 100644 --- a/inference-engine/thirdparty/clDNN/src/gpu/crop_gpu.cpp +++ b/inference-engine/thirdparty/clDNN/src/gpu/crop_gpu.cpp @@ -106,6 +106,9 @@ attach_crop_gpu::attach_crop_gpu() { implementation_map::add(std::make_tuple(engine_types::ocl, data_types::i8, format::b_fs_zyx_fsv16), val_fw); implementation_map::add(std::make_tuple(engine_types::ocl, data_types::u8, format::b_fs_zyx_fsv16), val_fw); + implementation_map::add(std::make_tuple(engine_types::ocl, data_types::f32, format::bs_fs_yx_bsv16_fsv16), val_fw); + implementation_map::add(std::make_tuple(engine_types::ocl, data_types::f16, format::bs_fs_yx_bsv16_fsv16), val_fw); + implementation_map::add(std::make_tuple(engine_types::ocl, data_types::f32, format::bs_fs_zyx_bsv16_fsv16), val_fw); implementation_map::add(std::make_tuple(engine_types::ocl, data_types::f16, format::bs_fs_zyx_bsv16_fsv16), val_fw); implementation_map::add(std::make_tuple(engine_types::ocl, data_types::i64, format::bs_fs_zyx_bsv16_fsv16), val_fw); diff --git a/inference-engine/thirdparty/clDNN/src/gpu/deconvolution_gpu.cpp b/inference-engine/thirdparty/clDNN/src/gpu/deconvolution_gpu.cpp index b2412ce648d..5b137d9138b 100644 --- a/inference-engine/thirdparty/clDNN/src/gpu/deconvolution_gpu.cpp +++ b/inference-engine/thirdparty/clDNN/src/gpu/deconvolution_gpu.cpp @@ -32,7 +32,7 @@ struct deconvolution_gpu : typed_primitive_gpu_impl { protected: // TODO: share it with convolution and fully connected - bool validate_impl(const typed_primitive_inst& instance) const override { + bool validate_impl(const typed_primitive_inst&) const override { bool res = true; CLDNN_ERROR_NOT_EQUAL(_outer.id(), @@ -41,23 +41,6 @@ protected: "padding mode", 0.0f, "Unknown padding mode in deconvolution."); - // Check whether all memory elements use the same unit type (FP16 or FP32). - auto input_count = instance.inputs_memory_count(); - auto input_data_type = 0 == input_count ? - instance.node.input().get_output_layout().data_type : - instance.input_memory().get_layout().data_type; - CLDNN_ERROR_DATA_TYPES_MISMATCH(_outer.id(), - "Input memory", - input_data_type, - "output memory", - instance.output_memory().get_layout().data_type, - ""); - CLDNN_ERROR_DATA_TYPES_MISMATCH(_outer.id(), - "Input memory", - input_data_type, - "filter memory", - instance.weights_memory(0).get_layout().data_type, - ""); return res; } @@ -65,15 +48,10 @@ protected: kernel::kernel_arguments_data get_arguments(typed_primitive_inst& instance, int32_t split) const override { kernel::kernel_arguments_data args = parent::get_arguments(instance, split); - auto* desc = static_cast(instance.desc().get()); - int dep_size = static_cast((desc->weights.size() + desc->bias.size() + 1)); args.weights = (memory_impl::cptr) &instance.weights_memory(split); args.bias = (memory_impl::cptr) (instance.bias_term() ? &instance.bias_memory(split) : nullptr); - if (static_cast(instance.dependencies().size()) > dep_size) - args.inputs.emplace_back(&instance.dep_memory(dep_size)); - return args; } @@ -86,27 +64,6 @@ public: const auto& primitive = arg.get_primitive(); const auto& weights_layout = arg.weights(0).get_output_layout(); - switch (weights_layout.fused_format()) { - // FP32 (float) - case fuse(data_types::f32, format::goiyx): - case fuse(data_types::f32, format::yxio): - case fuse(data_types::f32, format::gyxio): - case fuse(data_types::f32, format::goizyx): - case fuse(data_types::f16, format::goiyx): - case fuse(data_types::f16, format::yxio): - case fuse(data_types::f16, format::gyxio): - case fuse(data_types::f16, format::goizyx): - case fuse(data_types::f32, format::oiyx): - case fuse(data_types::f32, format::yxfb): - case fuse(data_types::f32, format::oizyx): - case fuse(data_types::f16, format::oiyx): - case fuse(data_types::f16, format::yxfb): - case fuse(data_types::f16, format::oizyx): - break; - default: - throw std::runtime_error("deconvolution weights format unsupported"); - } - const auto& weights_size = weights_layout.size; const auto& split = primitive->split(); @@ -146,11 +103,6 @@ public: deconv_params.gradient = primitive->gradient(); - if (arg.get_dependencies().size() > primitive->weights.size() + primitive->bias.size() + 1) { - deconv_params.fused_eltwise = true; - deconv_params.inputs.push_back(convert_data_tensor(arg.fused_sum().get_output_layout())); - } - auto& kernel_selector = kernel_selector::deconvolution_kernel_selector::Instance(); auto best_kernels = kernel_selector.GetBestKernels(deconv_params, deconv_optional_params); @@ -179,6 +131,8 @@ attach_deconvolution_gpu::attach_deconvolution_gpu() { deconvolution_gpu::create); implementation_map::add(std::make_tuple(engine_types::ocl, data_types::f32, format::b_fs_yx_fsv16), deconvolution_gpu::create); + implementation_map::add(std::make_tuple(engine_types::ocl, data_types::f32, format::bs_fs_yx_bsv16_fsv16), + deconvolution_gpu::create); implementation_map::add(std::make_tuple(engine_types::ocl, data_types::f16, format::yxfb), deconvolution_gpu::create); implementation_map::add(std::make_tuple(engine_types::ocl, data_types::f16, format::bfyx), @@ -195,6 +149,30 @@ attach_deconvolution_gpu::attach_deconvolution_gpu() { deconvolution_gpu::create); implementation_map::add(std::make_tuple(engine_types::ocl, data_types::f16, format::byxf), deconvolution_gpu::create); + implementation_map::add(std::make_tuple(engine_types::ocl, data_types::i8, format::bfyx), + deconvolution_gpu::create); + implementation_map::add(std::make_tuple(engine_types::ocl, data_types::u8, format::bfyx), + deconvolution_gpu::create); + implementation_map::add(std::make_tuple(engine_types::ocl, data_types::i8, format::bfzyx), + deconvolution_gpu::create); + implementation_map::add(std::make_tuple(engine_types::ocl, data_types::u8, format::bfzyx), + deconvolution_gpu::create); + implementation_map::add(std::make_tuple(engine_types::ocl, data_types::i8, format::b_fs_yx_fsv16), + deconvolution_gpu::create); + implementation_map::add(std::make_tuple(engine_types::ocl, data_types::u8, format::b_fs_yx_fsv16), + deconvolution_gpu::create); + implementation_map::add(std::make_tuple(engine_types::ocl, data_types::i8, format::b_fs_zyx_fsv16), + deconvolution_gpu::create); + implementation_map::add(std::make_tuple(engine_types::ocl, data_types::u8, format::b_fs_zyx_fsv16), + deconvolution_gpu::create); + implementation_map::add(std::make_tuple(engine_types::ocl, data_types::i8, format::bs_fs_yx_bsv16_fsv16), + deconvolution_gpu::create); + implementation_map::add(std::make_tuple(engine_types::ocl, data_types::u8, format::bs_fs_yx_bsv16_fsv16), + deconvolution_gpu::create); + implementation_map::add(std::make_tuple(engine_types::ocl, data_types::i8, format::bs_fs_zyx_bsv16_fsv16), + deconvolution_gpu::create); + implementation_map::add(std::make_tuple(engine_types::ocl, data_types::u8, format::bs_fs_zyx_bsv16_fsv16), + deconvolution_gpu::create); } } // namespace detail diff --git a/inference-engine/thirdparty/clDNN/src/gpu/device_info.cpp b/inference-engine/thirdparty/clDNN/src/gpu/device_info.cpp index d4072dc4ae9..1402e05d551 100644 --- a/inference-engine/thirdparty/clDNN/src/gpu/device_info.cpp +++ b/inference-engine/thirdparty/clDNN/src/gpu/device_info.cpp @@ -61,7 +61,7 @@ device_info_internal::device_info_internal(const cl::Device& device) { supports_subgroups_short = extensions.find("cl_intel_subgroups_short") != std::string::npos; - supports_imad = true; + supports_imad = dev_name.find("Gen12") != std::string::npos; supports_immad = false; dev_type = static_cast(device.getInfo()); diff --git a/inference-engine/thirdparty/clDNN/src/gpu/primitive_gpu_base.h b/inference-engine/thirdparty/clDNN/src/gpu/primitive_gpu_base.h index b9898a7ea33..11a76b62ca7 100644 --- a/inference-engine/thirdparty/clDNN/src/gpu/primitive_gpu_base.h +++ b/inference-engine/thirdparty/clDNN/src/gpu/primitive_gpu_base.h @@ -53,6 +53,11 @@ struct typed_primitive_gpu_impl : public typed_primitive_impl { _outer(arg), _device_info(arg.get_program().get_engine().get_context()->get_device_info()), _kernel_data(kd) { + // weights reorder params got copied to parent, clear in _kernel_data to release shared ptr + _kernel_data.weightsReorderParams.engine = kernel_selector::generic_kernel_params::Engine::NONE; + _kernel_data.weightsReorderParams.cpuKernel = nullptr; + _kernel_data.weightsReorderParams.clKernel = nullptr; + _kernels.reserve(kd.kernels.size()); for (size_t i = 0; i < kd.kernels.size(); ++i) { gpu::kernel kernel(_outer.get_program().get_engine().get_context(), diff --git a/inference-engine/thirdparty/clDNN/src/graph_optimizer/post_optimize_weights.cpp b/inference-engine/thirdparty/clDNN/src/graph_optimizer/post_optimize_weights.cpp index 8e19ddd48f8..d9c90f85280 100644 --- a/inference-engine/thirdparty/clDNN/src/graph_optimizer/post_optimize_weights.cpp +++ b/inference-engine/thirdparty/clDNN/src/graph_optimizer/post_optimize_weights.cpp @@ -48,13 +48,15 @@ post_optimize_weights::weights_bias_offset post_optimize_weights::get_weights_bi template void post_optimize_weights::optimize_weights(T& node, program_impl& p) { auto offsets = get_weights_bias_offset(node); + auto* impl = node.get_selected_impl().get(); + auto output_layout = node.get_output_layout(); + auto& weights_reorder_params = impl->_weights_reorder_params; + for (auto i = offsets.weights_offset; i < offsets.bias_offset; i++) { auto& weights_node = node.get_dependency(i); - auto* impl = node.get_selected_impl().get(); - auto output_layout = node.get_output_layout(); auto weights_layout = weights_node.get_output_layout(); - auto reorders = _rf.get_weights_reorder(weights_node.id(), weights_layout, impl->_weights_reorder_params); + auto reorders = _rf.get_weights_reorder(weights_node.id(), weights_layout, weights_reorder_params); for (auto& reorder : reorders) { // insert new generic_layer node to topology @@ -64,9 +66,15 @@ void post_optimize_weights::optimize_weights(T& node, program_impl& p) { g_node.get_output_layout(false); g_node.selected_impl = g_node.type()->choose_impl(p.get_engine(), g_node); } - // set the old output layout and do not invalidate users as change of weights will not affect output layout - node.set_output_layout(output_layout, false); } + + // Reset weights reorder params to not keep source code pointer + weights_reorder_params.engine = kernel_selector::generic_kernel_params::Engine::NONE; + weights_reorder_params.clKernel = nullptr; + weights_reorder_params.cpuKernel = nullptr; + + // set the old output layout and do not invalidate users as change of weights will not affect output layout + node.set_output_layout(output_layout, false); } void post_optimize_weights::run(program_impl& p) { diff --git a/inference-engine/thirdparty/clDNN/src/graph_optimizer/pre_replace_deconv.cpp b/inference-engine/thirdparty/clDNN/src/graph_optimizer/pre_replace_deconv.cpp index 59ca9135d08..9e182726ee5 100644 --- a/inference-engine/thirdparty/clDNN/src/graph_optimizer/pre_replace_deconv.cpp +++ b/inference-engine/thirdparty/clDNN/src/graph_optimizer/pre_replace_deconv.cpp @@ -41,8 +41,10 @@ void pre_replace_deconv::run(program_impl& p) { if (!p.get_options().get()->enabled()) continue; + auto& deconv_node = node->as(); + auto& weights_node = deconv_node.weights(); auto deconv_prim = node->as().typed_desc(); - tensor filter_size = { 1, 1, 1, 1, 1 }; + tensor filter_size = weights_node.get_output_layout().size; auto weights = deconv_prim->weights; std::vector weights_vec; @@ -52,28 +54,33 @@ void pre_replace_deconv::run(program_impl& p) { for (auto& weights_id : weights_vec) { auto weights_iter = p.nodes_map.find(weights_id); if (weights_iter == p.nodes_map.end()) continue; - - auto weights_node_ptr = weights_iter->second; - // get filter spatial sizes for input offset adjustment, perform this only once as all filters should - // have same size - if (weights_id == weights_vec[0]) - filter_size = weights_node_ptr->get_output_layout().size; } // limit optimization to stride = 1 - if (deconv_prim->stride.spatial[0] == 1 && deconv_prim->stride.spatial[1] == 1 && !deconv_prim->gradient()) { + bool unit_stride = std::all_of(deconv_prim->stride.spatial.begin(), + deconv_prim->stride.spatial.end(), + [](tensor::value_type v) { return v == 1; }); + if (unit_stride && !deconv_prim->gradient()) { primitive_id deconv_id = node->id(); auto& input_node = node->get_dependency(0); + auto groups = deconv_node.get_groups(); - // disable for 5D - if (cldnn::format::dimension(input_node.get_output_layout().format) == 5) - continue; + bool perform_opt = false; + // fp16 and fp32 bfyx implementation supports transposed convolution + perform_opt |= cldnn::format::dimension(input_node.get_output_layout().format) == 4 && + (input_node.get_output_layout().data_type == data_types::f32 || input_node.get_output_layout().data_type == data_types::f16) && + !((_lo.get_optimization_attributes().b_fs_yx_fsv16_network || input_node.get_output_layout().format == format::b_fs_yx_fsv16) && + _lo.is_format_optimized(node->as(), format::b_fs_yx_fsv16)); + // int8/uint8 input + perform_opt |= (input_node.get_output_layout().data_type == data_types::i8 || input_node.get_output_layout().data_type == data_types::u8) && + // imad convolution kernel limitation for groups + (groups == 1 || weights_node.get_output_layout().size.feature[0] % 4 == 0 || + groups == static_cast(input_node.get_output_layout().size.feature[0])) && + // no uint8/int8 3D convolution support + input_node.get_output_layout().format.dimension() == 4; - // Disable for blocked formats - if ((_lo.get_optimization_attributes().b_fs_yx_fsv16_network || input_node.get_output_layout().format == format::b_fs_yx_fsv16) && - _lo.is_format_optimized(node->as(), format::b_fs_yx_fsv16)) { + if (!perform_opt) continue; - } primitive_id input_id = deconv_prim->input[0]; @@ -110,27 +117,35 @@ void pre_replace_deconv::run(program_impl& p) { } } auto rename_id = deconv_id + "_tmp"; + auto was_output = node->is_output(); + if (was_output) { + node->set_output(false); + auto& outputs = p.get_outputs(); + outputs.erase(std::remove(outputs.begin(), outputs.end(), node.get()), outputs.end()); + } p.rename(*node, rename_id); // create convolution primitive if (biases.size() != 0) { auto conv_prim = std::make_shared(deconv_id, - input_id, - weights_vec, - bias_vec, - stride, - input_offset, - tensor{ 1, 1, 1, 1 }, - output_padding); + input_id, + weights_vec, + bias_vec, + groups, + stride, + input_offset, + tensor{ 1, 1, 1, 1 }, + output_padding); p.get_or_create(conv_prim); } else { auto conv_prim = std::make_shared(deconv_id, - input_id, - weights_vec, - stride, - input_offset, - tensor{ 1, 1, 1, 1 }, - output_padding); + input_id, + weights_vec, + groups, + stride, + input_offset, + tensor{ 1, 1, 1, 1 }, + output_padding); p.get_or_create(conv_prim); } @@ -170,8 +185,10 @@ void pre_replace_deconv::run(program_impl& p) { p.nodes_map.erase(rename_id); } - update_processing_order = true; - + if (was_output) { + conv_node->set_output(true); + p.get_outputs().push_back(conv_node); + } p.mark_if_data_flow(*conv_node); conv_node->recalc_output_layout(true); diff --git a/inference-engine/thirdparty/clDNN/src/graph_optimizer/prepare_primitive_fusing.cpp b/inference-engine/thirdparty/clDNN/src/graph_optimizer/prepare_primitive_fusing.cpp index 66d1ce4e562..b48728b1f3d 100644 --- a/inference-engine/thirdparty/clDNN/src/graph_optimizer/prepare_primitive_fusing.cpp +++ b/inference-engine/thirdparty/clDNN/src/graph_optimizer/prepare_primitive_fusing.cpp @@ -60,7 +60,7 @@ void prepare_primitive_fusing::run(program_impl& p) { fuse_sigmoid_mul_to_swish(p); fuse_simple_primitives(p); fuse_activations(p); - fuse_skip_layers(p); + optimize_fused_ops(p); } void prepare_primitive_fusing::fuse_sigmoid_mul_to_swish(program_impl &p) { @@ -230,45 +230,6 @@ void prepare_primitive_fusing::fuse_activations(program_impl &p) { } } -void prepare_primitive_fusing::fuse_skip_layers(program_impl& p) { - // This loop tries fusing eltwise (sum) with deconvolution - auto itr = p.get_processing_order().begin(); - while (itr != p.get_processing_order().end()) { - auto node_itr = itr++; - auto& node = (*node_itr); - - program_helpers::do_for_types(*node, [&p](eltwise_node& node) { - if (node.get_primitive()->mode != eltwise_mode::sum || node.inputs_count() != 2) - return; - - // both inputs should be deconvolutions - if (!(node.input(0).is_type() && node.input(1).is_type())) { - return; - } - - auto& to_fuse_with = node.input(0); - int to_fuse_index = 1; - - // remove dependencies and users of elwtise that is going to be extracted - p.add_connection(node.input(to_fuse_index), to_fuse_with); - p.remove_connection(node.input(to_fuse_index), node); - - p.get_processing_order().erase(&to_fuse_with); - p.get_processing_order().insert(&node, &to_fuse_with); - - if (!node.get_fused_activations_funcs().empty()) { - for (size_t i = 0; i < node.get_fused_activations_funcs().size(); i++) { - to_fuse_with.add_fused_activation(node.get_fused_activations_funcs()[i], - node.get_fused_activations_params()[i]); - } - } - to_fuse_with.set_output_padding(node.get_output_layout().data_padding); - - p.extract_and_remove(node); - }); - } -} - void prepare_primitive_fusing::fuse_simple_primitives(program_impl &p) { bool recalc_processing_order = false; @@ -389,6 +350,8 @@ void prepare_primitive_fusing::fuse_simple_primitives(program_impl &p) { should_fuse |= input_data.is_type(); + should_fuse |= input_data.is_type(); + if (!should_fuse) return; @@ -424,6 +387,8 @@ void prepare_primitive_fusing::fuse_simple_primitives(program_impl &p) { should_fuse |= input_data.is_type() && mvn_supports_fusings(input_data.as()); + should_fuse |= input_data.is_type(); + if (!should_fuse) return; @@ -488,6 +453,14 @@ void prepare_primitive_fusing::fuse_simple_primitives(program_impl &p) { should_fuse |= input_data.is_type() && mvn_supports_fusings(input_data.as()) && quantize_node.get_scale_shift_opt(); + should_fuse |= input_data.is_type() && quantize_node.get_scale_shift_opt(); + + should_fuse |= input_data.is_type() && quantize_node.get_scale_shift_opt() && + // fp16/fp32 optimized kernels don't support chaning data type + (input_data.get_dependency(0).get_output_layout().data_type == data_types::u8 || + input_data.get_dependency(0).get_output_layout().data_type == data_types::i8 || + input_data.get_output_layout().data_type == out_layout.data_type); + if (!should_fuse) return; @@ -507,10 +480,12 @@ void prepare_primitive_fusing::fuse_simple_primitives(program_impl &p) { auto parent2 = parents[1]; bool can_fuse_parent1 = (parent1->is_type() && conv_supports_fusings(parent1->as())) || - (parent1->is_type() && mvn_supports_fusings(parent1->as())); + (parent1->is_type() && mvn_supports_fusings(parent1->as())) || + (parent1->is_type()); bool can_fuse_parent2 = (parent2->is_type() && conv_supports_fusings(parent2->as())) || - (parent2->is_type() && mvn_supports_fusings(parent2->as())); + (parent2->is_type() && mvn_supports_fusings(parent2->as())) || + (parent2->is_type()); std::vector can_fuse_parents = { can_fuse_parent1, can_fuse_parent2 }; @@ -577,6 +552,49 @@ void prepare_primitive_fusing::fuse_simple_primitives(program_impl &p) { p.get_processing_order().calc_processing_order(p); } +void prepare_primitive_fusing::optimize_fused_ops(program_impl& p) { + auto itr = p.get_processing_order().begin(); + while (itr != p.get_processing_order().end()) { + auto node_itr = itr++; + auto& node = (*node_itr); + + if (!node->has_fused_primitives()) + continue; + + // TODO: try more optimizations: + // 1. clamp optimization + // 2. fuse conv bias to quantize shift + auto& fused_prims = node->get_fused_primitives(); + + // Drop relu if the next fused op is quantize with u8 output and no in_shift + auto fp_itr = fused_prims.begin(); + while (fp_itr != fused_prims.end()) { + auto curr_itr = fp_itr++; + if (fp_itr == fused_prims.end()) + break; + + auto& fp = *curr_itr; + auto& fp_next = *fp_itr; + + if (fp.node->is_type() && fp_next.node->is_type()) { + auto& activation_node = fp.node->as(); + auto& quantize_node = fp_next.node->as(); + bool can_skip = activation_node.get_primitive()->activation_function == activation_func::relu && + activation_node.get_primitive()->additional_params.a == 0.0f && + fp.deps.empty() && + (quantize_node.get_output_layout().data_type == data_types::u8 || + quantize_node.get_output_layout().data_type == data_types::i8) && + quantize_node.get_scale_shift_opt() && + !quantize_node.get_need_pre_shift(); + + if (can_skip) { + fused_prims.erase(curr_itr); + } + } + } + } +} + void prepare_conv_eltw_fusing::fuse_conv_depth_to_space(program_impl& p, program_node* node) { // make sure this convolution have only 1 user and it's depth_to_space // make sure convolution is not an output diff --git a/inference-engine/thirdparty/clDNN/src/graph_optimizer/prepare_quantization.cpp b/inference-engine/thirdparty/clDNN/src/graph_optimizer/prepare_quantization.cpp index bb81b6dadcf..5eb670fd294 100644 --- a/inference-engine/thirdparty/clDNN/src/graph_optimizer/prepare_quantization.cpp +++ b/inference-engine/thirdparty/clDNN/src/graph_optimizer/prepare_quantization.cpp @@ -145,9 +145,12 @@ void prepare_quantization::prepare_scale_shift_opt(program_impl &p) { return offset; }; + bool has_negative_scales = false; bool need_post_scale = false; bool need_post_shift = false; bool need_pre_shift = false; + auto out_dt = quantize_node.get_output_layout().data_type; + bool need_clamp = levels != 256 || (out_dt != data_types::u8 && out_dt != data_types::i8); bool per_tensor_in_scale = true; bool per_tensor_in_shift = true; bool per_tensor_in_range = true; @@ -193,6 +196,9 @@ void prepare_quantization::prepare_scale_shift_opt(program_impl &p) { if (data_output_shift[s_offset] != 0.0f) { need_post_shift = true; } + if (data_input_scale[s_offset] < 0.0f) { + has_negative_scales = true; + } } } } @@ -255,6 +261,9 @@ void prepare_quantization::prepare_scale_shift_opt(program_impl &p) { if (half_to_float(data_output_shift[s_offset]) != 0.0f) { need_post_shift = true; } + if (half_to_float(data_input_scale[s_offset]) < 0.0f) { + has_negative_scales = true; + } } } } @@ -288,6 +297,10 @@ void prepare_quantization::prepare_scale_shift_opt(program_impl &p) { throw std::runtime_error("prepare_quantization: Unsupported precision of quantize output values"); } + if (has_negative_scales) { + return; + } + layout dummy_layout(data_types::f32, format::bfyx, tensor(1, 1, 1, 1)); float zero = 0.f; auto in_scale_prim = std::make_shared(quantize_node.id() + "_in_scale", memory::attach(dummy_layout, &zero, 1)); @@ -348,6 +361,10 @@ void prepare_quantization::prepare_scale_shift_opt(program_impl &p) { quantize_node.set_input_shift_val(in_shift_val); } + if (need_clamp) { + quantize_node.set_need_clamp(); + } + if (per_tensor_in_range) { quantize_node.set_per_tensor_input_range(); quantize_node.set_input_lo_val(in_lo_val); diff --git a/inference-engine/thirdparty/clDNN/src/include/pass_manager.h b/inference-engine/thirdparty/clDNN/src/include/pass_manager.h index 34f8c96cfa6..46ea00903a6 100644 --- a/inference-engine/thirdparty/clDNN/src/include/pass_manager.h +++ b/inference-engine/thirdparty/clDNN/src/include/pass_manager.h @@ -200,8 +200,8 @@ private: void fuse_sigmoid_mul_to_swish(program_impl &p); void fuse_reorders(program_impl& p); void fuse_activations(program_impl& p); - void fuse_skip_layers(program_impl& p); void fuse_simple_primitives(program_impl &p); + void optimize_fused_ops(program_impl &p); layout_optimizer& _lo; }; diff --git a/inference-engine/thirdparty/clDNN/src/include/primitive_inst.h b/inference-engine/thirdparty/clDNN/src/include/primitive_inst.h index 6896c984433..d43f2803178 100644 --- a/inference-engine/thirdparty/clDNN/src/include/primitive_inst.h +++ b/inference-engine/thirdparty/clDNN/src/include/primitive_inst.h @@ -59,7 +59,7 @@ struct primitive_impl { virtual bool validate(const primitive_inst& instance) const = 0; std::string get_kernel_name() const { return _kernel_name; } // TODO: added a derived class for weights reordering (maybe for all static data reordering) - const kernel_selector::weights_reorder_params _weights_reorder_params; + kernel_selector::weights_reorder_params _weights_reorder_params; // class typed_primitive_gpu_impl override this with return false; virtual bool is_cpu() const { return true; } diff --git a/inference-engine/thirdparty/clDNN/src/include/program_node.h b/inference-engine/thirdparty/clDNN/src/include/program_node.h index c3a420422d5..63130afc94f 100644 --- a/inference-engine/thirdparty/clDNN/src/include/program_node.h +++ b/inference-engine/thirdparty/clDNN/src/include/program_node.h @@ -297,6 +297,7 @@ public: } const std::vector& get_fused_primitives() const { return fused_prims; } + std::vector& get_fused_primitives() { return fused_prims; } size_t get_fused_inputs_count() const { size_t count = 0; diff --git a/inference-engine/thirdparty/clDNN/src/include/quantize_inst.h b/inference-engine/thirdparty/clDNN/src/include/quantize_inst.h index 8af76142a39..6e05a4fa3e1 100644 --- a/inference-engine/thirdparty/clDNN/src/include/quantize_inst.h +++ b/inference-engine/thirdparty/clDNN/src/include/quantize_inst.h @@ -35,10 +35,12 @@ public: program_node& input(size_t index = 0) const { return get_dependency(index); } size_t inputs_count() const { return get_dependencies().size(); } bool get_scale_shift_opt() const { return scale_shift_opt; } + bool get_need_pre_shift() { return need_pre_shift; } void set_scale_shift_opt() { scale_shift_opt = true; } void set_need_post_scale() { need_post_scale = true; } void set_need_post_shift() { need_post_shift = true; } void set_need_pre_shift() { need_pre_shift = true; } + void set_need_clamp() { need_clamp = true; } void set_per_tensor_input_scale() { per_tensor_input_scale = true; } void set_per_tensor_input_shift() { per_tensor_input_shift = true; } void set_per_tensor_input_range() { per_tensor_input_range = true; } @@ -57,6 +59,7 @@ public: need_post_scale, need_post_shift, need_pre_shift, + need_clamp, per_tensor_input_range, per_tensor_input_scale, per_tensor_input_shift, @@ -79,6 +82,7 @@ private: bool need_post_scale = false; bool need_post_shift = false; bool need_pre_shift = false; + bool need_clamp = false; bool per_tensor_input_range = false; bool per_tensor_input_scale = false; diff --git a/inference-engine/thirdparty/clDNN/src/include/to_string_utils.h b/inference-engine/thirdparty/clDNN/src/include/to_string_utils.h index f4e5157e1ad..f2d835373f2 100644 --- a/inference-engine/thirdparty/clDNN/src/include/to_string_utils.h +++ b/inference-engine/thirdparty/clDNN/src/include/to_string_utils.h @@ -205,6 +205,18 @@ inline std::string fmt_to_str(format fmt) { return "g_os_is_zyx_isv16_osv16"; case format::g_os_is_yx_osv16_isv4: return "g_os_is_yx_osv16_isv4"; + case format::g_os_zyx_is_osv16_isv4: + return "g_os_zyx_is_osv16_isv4"; + case format::g_os_zyx_is_osv16_isv16: + return "g_os_zyx_is_osv16_isv16"; + case format::g_os_zyx_is_osv16_isv32: + return "g_os_zyx_is_osv16_isv32"; + case format::g_os_zyx_is_osv32_isv4: + return "g_os_zyx_is_osv32_isv4"; + case format::g_os_zyx_is_osv32_isv16: + return "g_os_zyx_is_osv32_isv16"; + case format::g_os_zyx_is_osv32_isv32: + return "g_os_zyx_is_osv32_isv32"; default: return "unknown (" + std::to_string(fmt.value) + ")"; } diff --git a/inference-engine/thirdparty/clDNN/src/kernel_selector_helper.cpp b/inference-engine/thirdparty/clDNN/src/kernel_selector_helper.cpp index a10f9262568..84fd606aab1 100644 --- a/inference-engine/thirdparty/clDNN/src/kernel_selector_helper.cpp +++ b/inference-engine/thirdparty/clDNN/src/kernel_selector_helper.cpp @@ -308,6 +308,8 @@ kernel_selector::weights_layout to_weights_layout(format f) { return kernel_selector::weights_layout::g_os_iyx_osv32; case format::gs_oiyx_gsv16: return kernel_selector::weights_layout::gs_oiyx_gsv16; + case format::gs_oizyx_gsv16: + return kernel_selector::weights_layout::gs_oizyx_gsv16; case format::gs_oiyx_gsv32: return kernel_selector::weights_layout::gs_oiyx_gsv32; case format::gyxio: @@ -324,6 +326,18 @@ kernel_selector::weights_layout to_weights_layout(format f) { return kernel_selector::weights_layout::g_os_is_zyx_isv16_osv16; case format::g_os_is_yx_osv16_isv4: return kernel_selector::weights_layout::g_os_is_yx_osv16_isv4; + case format::g_os_zyx_is_osv16_isv4: + return kernel_selector::weights_layout::g_os_zyx_is_osv16_isv4; + case format::g_os_zyx_is_osv16_isv16: + return kernel_selector::weights_layout::g_os_zyx_is_osv16_isv16; + case format::g_os_zyx_is_osv16_isv32: + return kernel_selector::weights_layout::g_os_zyx_is_osv16_isv32; + case format::g_os_zyx_is_osv32_isv4: + return kernel_selector::weights_layout::g_os_zyx_is_osv32_isv4; + case format::g_os_zyx_is_osv32_isv16: + return kernel_selector::weights_layout::g_os_zyx_is_osv32_isv16; + case format::g_os_zyx_is_osv32_isv32: + return kernel_selector::weights_layout::g_os_zyx_is_osv32_isv32; default: throw std::invalid_argument("Unable to convert tensor layout " + fmt_to_str(f) + " to weights layout"); } @@ -417,6 +431,8 @@ cldnn::format::type from_weights_layout(kernel_selector::weights_layout l) { return cldnn::format::g_os_iyx_osv32; case kernel_selector::weights_layout::gs_oiyx_gsv16: return cldnn::format::gs_oiyx_gsv16; + case kernel_selector::weights_layout::gs_oizyx_gsv16: + return cldnn::format::gs_oizyx_gsv16; case kernel_selector::weights_layout::gs_oiyx_gsv32: return cldnn::format::gs_oiyx_gsv32; case kernel_selector::weights_layout::gyxio: @@ -433,6 +449,18 @@ cldnn::format::type from_weights_layout(kernel_selector::weights_layout l) { return cldnn::format::g_os_is_zyx_isv16_osv16; case kernel_selector::weights_layout::os_is_yx_osv16_isv4: return cldnn::format::g_os_is_yx_osv16_isv4; + case kernel_selector::weights_layout::g_os_zyx_is_osv16_isv4: + return cldnn::format::g_os_zyx_is_osv16_isv4; + case kernel_selector::weights_layout::g_os_zyx_is_osv16_isv16: + return cldnn::format::g_os_zyx_is_osv16_isv16; + case kernel_selector::weights_layout::g_os_zyx_is_osv16_isv32: + return cldnn::format::g_os_zyx_is_osv16_isv32; + case kernel_selector::weights_layout::g_os_zyx_is_osv32_isv4: + return cldnn::format::g_os_zyx_is_osv32_isv4; + case kernel_selector::weights_layout::g_os_zyx_is_osv32_isv16: + return cldnn::format::g_os_zyx_is_osv32_isv16; + case kernel_selector::weights_layout::g_os_zyx_is_osv32_isv32: + return cldnn::format::g_os_zyx_is_osv32_isv32; default: return cldnn::format::bfyx; } @@ -487,6 +515,14 @@ kernel_selector::data_tensor convert_data_tensor(const layout& l, uint32_t split new_vals[3] = align_to(vals[3], 4); new_vals[2] = align_to(vals[2], 8); } + if (ks_layout == kernel_selector::Tensor::bs_fs_yx_bsv16_fsv16) { + new_vals[0] = align_to(vals[0], 16); + new_vals[1] = align_to(vals[1], 16); + } + if (ks_layout == kernel_selector::Tensor::bs_fs_zyx_bsv16_fsv16) { + new_vals[0] = align_to(vals[0], 16); + new_vals[1] = align_to(vals[1], 16); + } for (size_t i = 0; i < vec.size(); i++) { const size_t tensor_index = vec.size() - 1 - i; @@ -505,6 +541,15 @@ kernel_selector::data_tensor convert_data_tensor(const layout& l, uint32_t split pitch *= (reserved_in_mem_count + lp + up); } + if (ks_layout == kernel_selector::Tensor::bs_fs_yx_bsv16_fsv16) { + vec[2].pitch = (vec[0].v * vec[1].v) * 16; + vec[3].pitch = vec[2].pitch * vec[2].v; + } + if (ks_layout == kernel_selector::Tensor::bs_fs_zyx_bsv16_fsv16) { + vec[3].pitch = (vec[0].v * vec[1].v * vec[2].v) * 16; + vec[4].pitch = vec[3].pitch * vec[3].v; + } + const int feature_index = kernel_selector::DataTensor::Channelndex(ks_layout, kernel_selector::Tensor::DataChannelName::FEATURE); vec[feature_index].v /= split; diff --git a/inference-engine/thirdparty/clDNN/src/layout_optimizer.cpp b/inference-engine/thirdparty/clDNN/src/layout_optimizer.cpp index bf9ce7f43cc..02d5dfc4649 100644 --- a/inference-engine/thirdparty/clDNN/src/layout_optimizer.cpp +++ b/inference-engine/thirdparty/clDNN/src/layout_optimizer.cpp @@ -425,7 +425,7 @@ bool layout_optimizer::convolution_b_fs_zyx_fsv16_opt(layout const &input_layout (input_layout.data_type == data_types::f32 || input_layout.data_type == data_types::f16) && ((input_layout.size.feature[0] / conv->split()) % 16 == 0 || input_layout.size.feature[0] == 3) && weights_layout.data_type == input_layout.data_type && - (weights_layout.size.batch[0] % 16 == 0 || weights_layout.size.batch[0] % 8 == 0) && + (weights_layout.size.batch[0] % 16 == 0 || (weights_layout.size.batch[0] == 8 && conv->groups > 1)) && conv->dilation == tensor(1)) return true; return false; @@ -477,6 +477,12 @@ bool layout_optimizer::deconvolution_b_fs_zyx_fsv16_opt(layout const &input_layo (input_layout.data_type == data_types::f32 || input_layout.data_type == data_types::f16) && deconv->split() == 1) return true; + + if (input_layout.format.dimension() == 5 && + (input_layout.data_type == data_types::i8 || input_layout.data_type == data_types::u8) && + deconv->split() == 1) + return true; + return false; } @@ -489,6 +495,12 @@ bool layout_optimizer::deconvolution_b_fs_yx_fsv16_opt(layout const &input_layou deconv->split() == 1 && (deconv->groups == 1 || (static_cast(deconv->groups) == weights_layout.size.group[0]))) return true; + + if (input_layout.format.dimension() == 4 && + (input_layout.data_type == data_types::i8 || input_layout.data_type == data_types::u8) && + deconv->split() == 1) + return true; + return false; } diff --git a/inference-engine/thirdparty/clDNN/src/program.cpp b/inference-engine/thirdparty/clDNN/src/program.cpp index 4d2c0497ce1..bade80bc005 100644 --- a/inference-engine/thirdparty/clDNN/src/program.cpp +++ b/inference-engine/thirdparty/clDNN/src/program.cpp @@ -62,6 +62,8 @@ #include "gpu/ocl_toolkit.h" +#include "kernel_base.h" + #include #include #include @@ -95,6 +97,7 @@ program_impl::program_impl(engine_impl& engine_ref, : engine(&engine_ref), options(options), processing_order() { + kernel_selector::KernelBase::ResetCounter(); set_options(); pm = std::unique_ptr(new pass_manager(*this)); prepare_nodes(topology); diff --git a/inference-engine/thirdparty/clDNN/tests/test_cases/activation_grad_gpu_test.cpp b/inference-engine/thirdparty/clDNN/tests/test_cases/activation_grad_gpu_test.cpp deleted file mode 100644 index 263714495ff..00000000000 --- a/inference-engine/thirdparty/clDNN/tests/test_cases/activation_grad_gpu_test.cpp +++ /dev/null @@ -1,231 +0,0 @@ -/* -// Copyright (c) 2016 Intel Corporation -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -*/ - -/////////////////////////////////////////////////////////////////////////////////////////////////// - -#include -#include -#include -#include "api/memory.hpp" -#include -#include "api/activation_grad.hpp" -#include -#include -#include -#include -#include "test_utils/test_utils.h" -#include "test_utils/float16.h" - -using namespace cldnn; -using namespace tests; - -TEST(activation_grad_f16_fw_gpu, basic_bfyx_all_functions) -{ - // Input: - // 1 -2 -3 4 5 - // 2 2 3 4 -6 - // 3 -3 3 5 1 - // 1 1 1 -1 1 - // - // a: 0.5, b: 2.5 - // - - const auto& engine = get_test_engine(); - - auto input_grad = memory::allocate(engine, { data_types::f16, format::bfyx,{ 1, 1, 5, 4 } }); - auto input = memory::allocate(engine, { data_types::f16, format::bfyx,{ 1, 1, 5, 4 } }); - auto input_params = memory::allocate(engine, { data_types::f16, format::bfyx,{ 1, 1, 2, 1 } }); - set_values(input_grad, - { FLOAT16(1.0f), FLOAT16(-2.0f),FLOAT16(-3.0f), FLOAT16(4.0f), FLOAT16(5.0f), - FLOAT16(2.0f), FLOAT16(2.0f), FLOAT16(3.0f), FLOAT16(4.0f), FLOAT16(-6.0f), - FLOAT16(3.0f), FLOAT16(-3.0f),FLOAT16(3.0f), FLOAT16(5.0f), FLOAT16(1.0f), - FLOAT16(1.0f), FLOAT16(1.0f), FLOAT16(1.0f), FLOAT16(-1.0f), FLOAT16(1.0f) }); - - set_values(input, - { FLOAT16(12.0f), FLOAT16(-22.0f), FLOAT16(-32.0f), FLOAT16(42.0f), FLOAT16(52.0f), - FLOAT16(22.0f),FLOAT16(22.0f), FLOAT16(32.0f), FLOAT16(42.0f), FLOAT16(-62.0f), - FLOAT16(32.0f), FLOAT16(-32.0f), FLOAT16(32.0f), FLOAT16(52.0f), FLOAT16(12.0f), - FLOAT16(12.0f), FLOAT16(12.0f), FLOAT16(12.0f), FLOAT16(-12.0f), FLOAT16(12.0f) }); - - std::vector funcs = { - activation_grad_func::none, - activation_grad_func::relu, - activation_grad_func::relu_negative_slope, - }; - - activation_additional_params params = { 0.5f, 2.5f }; - set_values(input_params, { FLOAT16(params.a), FLOAT16(params.b) }); - - for (uint8_t i = 0; i < 2; i++) - { - for (auto func : funcs) - { - topology topology(input_layout("input_grad", input_grad.get_layout())); - topology.add(data("input", input)); - - if (i == 0) - { - topology.add(activation_grad("activation_grad", "input_grad", "input", func, params)); - } - else - { - topology.add(data("input_params", input_params)); - topology.add(activation_grad("activation_grad", "input_grad", "input", "input_params", func)); - } - - network network(engine, topology); - network.set_input_data("input_grad", input_grad); - auto outputs = network.execute(); - EXPECT_EQ(outputs.size(), size_t(1)); - EXPECT_EQ(outputs.begin()->first, "activation_grad"); - - auto output_memory = outputs.at("activation_grad").get_memory(); - auto output_layout = output_memory.get_layout(); - auto output_ptr = output_memory.pointer(); - auto input_grad_ptr = input_grad.pointer(); - auto input_ptr = input.pointer(); - - int y_size = output_layout.size.spatial[1]; - int x_size = output_layout.size.spatial[0]; - int f_size = output_layout.size.feature[0]; - int b_size = output_layout.size.batch[0]; - EXPECT_EQ(output_layout.format, format::bfyx); - EXPECT_EQ(y_size, 4); - EXPECT_EQ(x_size, 5); - EXPECT_EQ(f_size, 1); - EXPECT_EQ(b_size, 1); - - std::vector out; - - for (size_t i = 0; i < output_layout.get_linear_size(); ++i) - { - switch (func) - { - case activation_grad_func::none: - EXPECT_FLOAT_EQ(float16_to_float32(input_grad_ptr[i]), float16_to_float32(output_ptr[i])); - break; - case activation_grad_func::relu: - EXPECT_FLOAT_EQ(float16_to_float32(input_grad_ptr[i]) * (float16_to_float32(input_ptr[i]) > 0), float16_to_float32(output_ptr[i])); - break; - case activation_grad_func::relu_negative_slope: - EXPECT_FLOAT_EQ(float16_to_float32(input_grad_ptr[i]) * ((float16_to_float32(input_ptr[i]) > 0) + params.a * (float16_to_float32(input_ptr[i]) <= 0)), float16_to_float32(output_ptr[i])); - break; - default: - break; - } - } - } - } -} - -TEST(activation_grad_f32_fw_gpu, basic_bfyx_all_functions) -{ - // Input: - // 1 -2 -3 4 5 - // 2 2 3 4 -6 - // 3 -3 3 5 1 - // 1 1 1 -1 1 - // - // a: 0.5, b: 2.5 - // - - const auto& engine = get_test_engine(); - - auto input_grad = memory::allocate(engine, { data_types::f32, format::bfyx,{ 1, 1, 5, 4 } }); - auto input = memory::allocate(engine, { data_types::f32, format::bfyx,{ 1, 1, 5, 4 } }); - auto input_params = memory::allocate(engine, { data_types::f32, format::bfyx,{ 1, 1, 2, 1 } }); - set_values(input_grad, - { 1.0f, -2.0f, -3.0f, 4.0f, 5.0f, - 2.0f, 2.0f, 3.0f, 4.0f, -6.0f, - 3.0f, -3.0f, 3.0f, 5.0f, 1.0f, - 1.0f, 1.0f, 1.0f, -1.0f, 1.0f }); - - set_values(input, - { 12.0f, -22.0f, -32.0f, 42.0f, 52.0f, - 22.0f, 22.0f, 32.0f, 42.0f, -62.0f, - 32.0f, -32.0f, 32.0f, 52.0f, 12.0f, - 12.0f, 12.0f, 12.0f, -12.0f, 12.0f }); - - std::vector funcs = { - activation_grad_func::none, - activation_grad_func::relu, - activation_grad_func::relu_negative_slope, - }; - - activation_additional_params params = { 0.5f, 2.5f }; - set_values(input_params, { params.a, params.b }); - - for (uint8_t i = 0; i < 2; i++) - { - for (auto func : funcs) - { - topology topology(input_layout("input_grad", input_grad.get_layout())); - topology.add(data("input", input)); - - if (i == 0) - { - topology.add(activation_grad("activation_grad", "input_grad", "input", func, params)); - } - else - { - topology.add(data("input_params", input_params)); - topology.add(activation_grad("activation_grad", "input_grad", "input", "input_params", func)); - } - - network network(engine, topology); - network.set_input_data("input_grad", input_grad); - auto outputs = network.execute(); - EXPECT_EQ(outputs.size(), size_t(1)); - EXPECT_EQ(outputs.begin()->first, "activation_grad"); - - auto output_memory = outputs.at("activation_grad").get_memory(); - auto output_layout = output_memory.get_layout(); - auto output_ptr = output_memory.pointer(); - auto input_grad_ptr = input_grad.pointer(); - auto input_ptr = input.pointer(); - - int y_size = output_layout.size.spatial[1]; - int x_size = output_layout.size.spatial[0]; - int f_size = output_layout.size.feature[0]; - int b_size = output_layout.size.batch[0]; - EXPECT_EQ(output_layout.format, format::bfyx); - EXPECT_EQ(y_size, 4); - EXPECT_EQ(x_size, 5); - EXPECT_EQ(f_size, 1); - EXPECT_EQ(b_size, 1); - - std::vector out; - - for (size_t i = 0; i < output_layout.get_linear_size(); ++i) - { - switch (func) - { - case activation_grad_func::none: - EXPECT_FLOAT_EQ(input_grad_ptr[i], output_ptr[i]); - break; - case activation_grad_func::relu: - EXPECT_FLOAT_EQ(input_grad_ptr[i] * (input_ptr[i] > 0), output_ptr[i]); - break; - case activation_grad_func::relu_negative_slope: - EXPECT_FLOAT_EQ(input_grad_ptr[i] * ((input_ptr[i] > 0) + params.a * (input_ptr[i] <= 0)), output_ptr[i]); - break; - default: - break; - } - } - } - } -} diff --git a/inference-engine/thirdparty/clDNN/tests/test_cases/concatenation_gpu_test.cpp b/inference-engine/thirdparty/clDNN/tests/test_cases/concatenation_gpu_test.cpp index 9678e61fa92..37c57a6f032 100644 --- a/inference-engine/thirdparty/clDNN/tests/test_cases/concatenation_gpu_test.cpp +++ b/inference-engine/thirdparty/clDNN/tests/test_cases/concatenation_gpu_test.cpp @@ -182,6 +182,280 @@ TEST(concat_gpu, mixed_input_types_5d) { } } +TEST(concat_gpu, i8_optimization_with_pool) { + const auto& engine = get_test_engine(); + + auto input0 = memory::allocate(engine, {data_types::i8, format::bfyx, {1, 1, 8, 3}}); + auto input1 = memory::allocate(engine, {data_types::i8, format::bfyx, {1, 1, 8, 3}}); + + + set_values(input0, { 11, 12, 13, + 14, 12, 12, + 13, -14, 13, + 13, -13, 15, + 16, -16, -13, + -14, 12, 11, + 16, -14, -13, + 18, -13, -15, }); + set_values(input1, { 11, 12, 13, + 15, 12, 12, + 13, 14, 12, + 13, 13, 15, + 12, 14, 13, + 14, 17, 18, + 13, 14, 11, + 13, 13, 15 }); + + + VF output_vec = {13, 13, 13, 13, 15, 15, + 16, 15, 16, 14, 13, 14, + 13, 14, 13, 18, 16, 18, + 16, 15, 16, 15, 18, 14, + 18, 14, -13, 15}; + + layout reorder_layout(data_types::i8, format::yxfb, {7, 2, 2, 1}); + topology topology(input_layout("input0", input0.get_layout()), + input_layout("input1", input1.get_layout()), + pooling("pool0", "input0", pooling_mode::max, {1, 1, 2, 2}, {1, 1, 1, 1}), + pooling("pool1", "input1", pooling_mode::max, {1, 1, 2, 2}, {1, 1, 1, 1}), + concatenation("concat", + {"pool0", "pool1"}, + concatenation::concatenation_axis::along_f, + data_types::i8, + padding{{0, 0, 0, 0}, 0}), + reorder("reorder", "concat", reorder_layout)); + cldnn::build_options options; + options.set_option(cldnn::build_option::optimize_data(true)); + network network(engine, topology, options); + network.set_input_data("input0", input0); + network.set_input_data("input1", input1); + auto outputs = network.execute(); + + EXPECT_EQ(outputs.size(), size_t(1)); + EXPECT_EQ(outputs.begin()->first, "reorder"); + + auto output_memory = outputs.at("reorder").get_memory(); + auto output_layout = output_memory.get_layout(); + auto output_ptr = output_memory.pointer(); + + int y_size = output_layout.size.spatial[0]; + int x_size = output_layout.size.spatial[1]; + int f_size = output_layout.size.feature[0]; + int b_size = output_layout.size.batch[0]; + EXPECT_EQ(output_layout.format, format::yxfb); + EXPECT_EQ(y_size, 7); + EXPECT_EQ(x_size, 2); + EXPECT_EQ(f_size, 2); + EXPECT_EQ(b_size, 1); + + for (size_t x = 0; x < output_layout.count(); ++x) { + EXPECT_EQ(output_vec[x], output_ptr[x]); + } +} + +TEST(concat_gpu, i8_optimization_with_conv) { + // Filter : 3x2x3 + // Stride : 2x1 + // Input1 : 4x5 + // Input2 : 4x5 + // Input3 : 4x5 + // Concat output : 3x4x5 + // Conv input : 3x4x5 + // Output : 2x3 + // + // Input0: + // 1 2 3 -4 5 + // 2 2 3 4 -6 + // -3 3 3 5 1 + // -1 1 1 1 -1 + // Input1: + // 5 5 3 -4 5 + // 2 -2 5 4 6 + // 6 1 3 5 1 + // 1 2 -3 -4 5 + // Input2: + // -2 1 3 2 -5 + // 1 2 -2 4 2 + // 3 5 3 -3 1 + // 5 4 3 2 1 + // + // Filter: + // 1 2 1 1 2 1 1 2 1 + // 2 1 2 2 1 2 2 1 2 + // + // Output: + // 53 54 30 + // 52 47 37 + const auto& engine = get_test_engine(); + + auto input0 = memory::allocate(engine, {data_types::i8, format::bfyx, {1, 1, 5, 4}}); + auto input1 = memory::allocate(engine, {data_types::i8, format::bfyx, {1, 1, 5, 4}}); + auto input2 = memory::allocate(engine, {data_types::i8, format::bfyx, {1, 1, 5, 4}}); + auto weights = memory::allocate(engine, { data_types::i8, format::bfyx, { 1, 3, 3, 2 } }); + + set_values(weights, { 1, 2, 1, + 2, 1, 2, 1, 2, 1, + 2, 1, 2, 1, 2, 1, + 2, 1, 2 }); + + set_values(input0, { 1, 2, 3, -4, 5, + 2, 2, 3, 4, -6, + -3, 3, 3, 5, 1, + -1, 1, 1, 1, -1 }); + set_values(input1, { 5, 5, 3, -4, 5, + 2, -2, 5, 4, 6, + 6, 1, 3, 5, 1, + 1, 2, -3, -4, 5 }); + set_values(input2, { -2, 1, 3, 2, -5, + 1, 2, -2, 4, 2, + 3, 5, 3, -3, 1, + 5, 4, 3, 2, 1 }); + + VF output_vec = { 53, 54, 30, 52, 47, 37 }; + + + layout reorder_layout(data_types::i8, format::bfyx, {1, 1, 2, 3}); + topology topology(input_layout("input0", input0.get_layout()), + input_layout("input1", input1.get_layout()), + input_layout("input2", input2.get_layout()), + concatenation("concat", + {"input0", "input1", "input2"}, + concatenation::concatenation_axis::along_f, + data_types::i8, + padding{{0, 0, 0, 0}, 0}), + data("weights", weights), + convolution("conv", "concat", { "weights" }, { 1,1,1,2 }), + reorder("output", "conv", reorder_layout)); + cldnn::build_options options; + options.set_option(cldnn::build_option::optimize_data(true)); + network network(engine, topology, options); + network.set_input_data("input0", input0); + network.set_input_data("input1", input1); + network.set_input_data("input2", input2); + auto outputs = network.execute(); + + EXPECT_EQ(outputs.size(), size_t(1)); + EXPECT_EQ(outputs.begin()->first, "output"); + + auto output_memory = outputs.at("output").get_memory(); + auto output_layout = output_memory.get_layout(); + auto output_ptr = output_memory.pointer(); + + int y_size = output_layout.size.spatial[1]; + int x_size = output_layout.size.spatial[0]; + int f_size = output_layout.size.feature[0]; + int b_size = output_layout.size.batch[0]; + EXPECT_EQ(output_layout.format, format::bfyx); + EXPECT_EQ(y_size, 2); + EXPECT_EQ(x_size, 3); + EXPECT_EQ(f_size, 1); + EXPECT_EQ(b_size, 1); + + for (size_t x = 0; x < output_layout.count(); ++x) { + EXPECT_EQ(output_vec[x], output_ptr[x]); + } +} + +TEST(concat_gpu, i8_optimization_with_pool_conv) { + // Filter : 32x2x1 + // Input offset : 0x0x-1x0 + // Stride : 1x1 + // Input0 : 16x3x2 + // Input1 : 16x3x2 + // Output : 1x1x3 + // + // Input0: + // -3 6 0 2 -1 -1 6 0 5 4 1 6 2 4 0 5 + // -2 -1 1 0 2 3 3 3 6 2 4 7 3 6 7 -1 + // 7 7 5 -3 1 -1 5 4 0 3 -2 6 2 5 2 4 + // 5 -1 3 6 2 0 -3 -1 0 3 0 -1 1 6 1 6 + // 5 -2 2 -1 5 6 3 4 1 0 6 6 7 2 6 3 + // 6 7 -1 5 5 6 -1 0 -1 5 5 2 3 -1 -3 4 + // + // Input1: + // 4 -2 0 0 6 2 0 4 6 4 4 4 -3 -1 4 -3 + // 1 0 -1 5 -1 1 4 2 7 7 0 2 3 4 -1 3 + // 7 7 2 -3 -1 5 -2 2 6 -3 0 7 0 3 3 3 + // -1 0 -2 -2 7 -3 -3 -1 5 0 3 4 0 -1 2 5 + // 2 -1 2 -3 0 -3 -3 2 4 3 3 5 5 7 5 1 + // 2 2 -3 6 6 7 1 -1 -2 5 1 -1 4 5 -3 -2 + // + // Filters: + // -1, 2, -2, 2, -2, 1, 1, 0, -1, 1, 2, -2, 2, 1, -2, 0, + // 0, -2, -2, -2, -2, -1, 2, 1, 2, -1, -1, 0, 2, -2, -2, 1, + // 0, -2, 0, 1, -2, -1, -2, 0, -1, -1, -2, 1, -2, 0, 1, 2, + // 2, 2, 2, -2, 0, 2, 1, -2, -1, -1, 0, -2, 2, -1, 2, -1 + // + // Output: + // -14, -35, -10 + + const auto& engine = get_test_engine(); + + auto input0 = memory::allocate(engine, {data_types::i8, format::bfyx, {1, 16, 3, 2}}); + auto input1 = memory::allocate(engine, {data_types::i8, format::bfyx, {1, 16, 3, 2}}); + auto weights = memory::allocate(engine, {data_types::i8, format::bfyx, {1, 32, 2, 1}}); + + set_values(weights, {-1, 2, -2, 2, -2, 1, 1, 0, -1, 1, 2, -2, 2, 1, -2, 0, 0, -2, -2, -2, -2, -1, 2, 1, 2, -1, -1, 0, 2, -2, -2, 1, + 0, -2, 0, 1, -2, -1, -2, 0, -1, -1, -2, 1, -2, 0, 1, 2, 2, 2, 2, -2, 0, 2, 1, -2, -1, -1, 0, -2, 2, -1, 2, -1}); + + set_values(input0, {-3, 6, 0, 2, -1, -1, 6, 0, 5, 4, 1, 6, 2, 4, 0, 5, + -2, -1, 1, 0, 2, 3, 3, 3, 6, 2, 4, 7, 3, 6, 7, -1, + 7, 7, 5, -3, 1, -1, 5, 4, 0, 3, -2, 6, 2, 5, 2, 4, + 5, -1, 3, 6, 2, 0, -3, -1, 0, 3, 0, -1, 1, 6, 1, 6, + 5, -2, 2, -1, 5, 6, 3, 4, 1, 0, 6, 6, 7, 2, 6, 3, + 6, 7, -1, 5, 5, 6, -1, 0, -1, 5, 5, 2, 3, -1, -3, 4 }); + + set_values(input1, { 4, -2, 0, 0, 6, 2, 0, 4, 6, 4, 4, 4, -3, -1, 4, -3, + 1, 0, -1, 5, -1, 1, 4, 2, 7, 7, 0, 2, 3, 4, -1, 3, + 7, 7, 2, -3, -1, 5, -2, 2, 6, -3, 0, 7, 0, 3, 3, 3, + -1, 0, -2, -2, 7, -3, -3, -1, 5, 0, 3, 4, 0, -1, 2, 5, + 2, -1, 2, -3, 0, -3, -3, 2, 4, 3, 3, 5, 5, 7, 5, 1, + 2, 2, -3, 6, 6, 7, 1, -1, -2, 5, 1, -1, 4, 5, -3, -2}); + + VF output_vec = { -14, -35, -10 }; + + layout reorder_layout(data_types::i8, format::bfyx, {1, 1, 3, 1}); + topology topology(input_layout("input0", input0.get_layout()), + input_layout("input1", input1.get_layout()), + pooling("pool0", "input0", pooling_mode::max, {1, 1, 2, 2}, {1, 1, 1, 1}), + pooling("pool1", "input1", pooling_mode::max, {1, 1, 2, 2}, {1, 1, 1, 1}), + concatenation("concat", + {"pool0", "pool1"}, + concatenation::concatenation_axis::along_f, + data_types::i8, + padding{{0, 0, 0, 0}, 0}), + data("weights", weights), + convolution("conv", "concat", {"weights"}, {1, 1, 1, 1}, {0, 0, -1, 0}), + reorder("output", "conv", reorder_layout) ); + cldnn::build_options options; + options.set_option(cldnn::build_option::optimize_data(true)); + network network(engine, topology, options); + network.set_input_data("input0", input0); + network.set_input_data("input1", input1); + auto outputs = network.execute(); + + EXPECT_EQ(outputs.size(), size_t(1)); + EXPECT_EQ(outputs.begin()->first, "output"); + + auto output_memory = outputs.at("output").get_memory(); + auto output_layout = output_memory.get_layout(); + auto output_ptr = output_memory.pointer(); + + int y_size = output_layout.size.spatial[0]; + int x_size = output_layout.size.spatial[1]; + int f_size = output_layout.size.feature[0]; + int b_size = output_layout.size.batch[0]; + EXPECT_EQ(output_layout.format, format::bfyx); + EXPECT_EQ(y_size, 3); + EXPECT_EQ(x_size, 1); + EXPECT_EQ(f_size, 1); + EXPECT_EQ(b_size, 1); + + for (size_t x = 0; x < output_layout.count(); ++x) { + EXPECT_EQ(output_vec[x], output_ptr[x]); + } +} + using TestParamType_concat = ::testing::tuple, // 1 - Inputs Features Sizes size_t, // 2 - Input Y Size diff --git a/inference-engine/thirdparty/clDNN/tests/test_cases/crop_gpu_test.cpp b/inference-engine/thirdparty/clDNN/tests/test_cases/crop_gpu_test.cpp index eda32d662bd..50ab7f31397 100644 --- a/inference-engine/thirdparty/clDNN/tests/test_cases/crop_gpu_test.cpp +++ b/inference-engine/thirdparty/clDNN/tests/test_cases/crop_gpu_test.cpp @@ -19,6 +19,7 @@ #include "api/memory.hpp" #include #include "api/crop.hpp" +#include #include #include #include @@ -794,3 +795,84 @@ TEST(crop_gpu, basic_in3x1x2x2x1_crop_all_bfzyx) { } } } + +// batch size, input feature, crop out feature, (in_out format, crop format) +using crop_test_params = std::tuple>; + +class crop_gpu : public ::testing::TestWithParam {}; + +TEST_P(crop_gpu, pad_test) { + auto p = GetParam(); + + const auto& engine = get_test_engine(); + + auto batch_num = std::get<0>(p); + auto feature_num = std::get<1>(p); + auto x_size = 1; + auto y_size = 1; + auto z_size = 1; + + auto crop_batch_num = batch_num; + auto crop_feature_num_1 = std::get<2>(p); + auto crop_x_size = 1; + auto crop_y_size = 1; + auto crop_z_size = 1; + auto feature_offset_1 = feature_num - crop_feature_num_1; + + auto in_out_format = std::get<3>(p).first; + auto crop_format = std::get<3>(p).second; + + auto input = memory::allocate(engine, { data_types::f32, in_out_format, { tensor(spatial(x_size, y_size, z_size), feature(feature_num), batch(batch_num)) } }); + + topology topology; + topology.add(input_layout("input", input.get_layout())); + topology.add(reorder("reorder", "input", crop_format, data_types::f32)); + topology.add(crop("crop1", "reorder", tensor(batch(crop_batch_num), spatial(crop_x_size, crop_y_size, crop_z_size), feature(crop_feature_num_1)), { tensor(feature(feature_offset_1), spatial(0,0,0), batch(0)) })); + topology.add(reorder("out", "crop1", in_out_format, data_types::f32)); + + std::vector input_vec; + std::vector res; + std::vector input_data; + std::vector res_data; + for (size_t i = 0; i < feature_num; i++) { + input_data.push_back(static_cast(i)); + } + for (size_t i = 0; i < crop_feature_num_1; i++) { + res_data.push_back(input_data[feature_offset_1 + i]); + } + for (size_t i = 0; i < batch_num; i++) { + input_vec.insert(input_vec.end(), input_data.begin(), input_data.end()); + res.insert(res.end(), res_data.begin(), res_data.end()); + } + set_values(input, input_vec); + build_options bo; + bo.set_option(build_option::optimize_data(true)); + + network network(engine, topology, bo); + network.set_input_data("input", input); + auto outputs = network.execute(); + + auto output = outputs.at("out").get_memory(); + auto output_ptr = output.pointer(); + + for (size_t i = 0; i < res.size(); i++) + EXPECT_EQ(output_ptr[i], res[i]); +} + +static std::vector> formats = { + std::make_pair(format::bfyx, format::b_fs_yx_fsv16), + std::make_pair(format::bfzyx, format::b_fs_zyx_fsv16), + std::make_pair(format::bfyx, format::bs_fs_yx_bsv16_fsv16), + std::make_pair(format::bfzyx, format::bs_fs_zyx_bsv16_fsv16), + }; +static std::vector batches = {1, 8, 16, 17}; +static std::vector in_features = {18, 24, 32}; +static std::vector crop_features = {4, 8, 12, 17}; + +INSTANTIATE_TEST_CASE_P(crop_test, crop_gpu, + ::testing::Combine( + ::testing::ValuesIn(batches), + ::testing::ValuesIn(in_features), + ::testing::ValuesIn(crop_features), + ::testing::ValuesIn(formats) + ), ); diff --git a/inference-engine/thirdparty/clDNN/tests/test_cases/deconvolution_gpu_test.cpp b/inference-engine/thirdparty/clDNN/tests/test_cases/deconvolution_gpu_test.cpp index 3a1210e08ea..289d9c4c648 100644 --- a/inference-engine/thirdparty/clDNN/tests/test_cases/deconvolution_gpu_test.cpp +++ b/inference-engine/thirdparty/clDNN/tests/test_cases/deconvolution_gpu_test.cpp @@ -28,10 +28,116 @@ #include "test_utils/test_utils.h" #include "test_utils/float16.h" #include "api/reorder.hpp" +#include "src/include/to_string_utils.h" + +namespace cldnn { +template<> struct type_to_data_type { static const data_types value = data_types::f16; }; +} using namespace cldnn; using namespace tests; +template +struct deconvolution_traits { + using accumulator_type = InputT; +}; + +template <> +struct deconvolution_traits { + using accumulator_type = int; +}; + +template <> +struct deconvolution_traits { + using accumulator_type = int; +}; + +template <> +struct deconvolution_traits { + using accumulator_type = float; +}; + +template +T kahan_summation(std::vector &input) { + T sum = 0; + T c = 0; + for (T x : input) { + T y = x - c; + T t = sum + y; + c = (t - sum) - y; + sum = t; + } + return sum; +} + +template ::accumulator_type> +VVVF reference_deconvolution( + const VVVVF& input, // fyx dimensions order + const VVVVF& weights, + float bias, + tensor stride, + tensor offset, + size_t input_f_start +) { + auto ifm = weights.size(); + auto filter_z = static_cast(weights[0].size()); + auto filter_y = static_cast(weights[0][0].size()); + auto filter_x = static_cast(weights[0][0][0].size()); + + auto in_z = static_cast(input[0].size()); + auto in_y = static_cast(input[0][0].size()); + auto in_x = static_cast(input[0][0][0].size()); + + auto stride_x = stride.spatial[0]; + auto stride_y = stride.spatial[1]; + auto stride_z = stride.spatial[2]; + + auto offset_x = offset.spatial[0]; + auto offset_y = offset.spatial[1]; + auto offset_z = offset.spatial[2]; + + int out_x = 2 * offset_x + (in_x - 1) * stride_x + filter_x; + int out_y = 2 * offset_y + (in_y - 1) * stride_y + filter_y; + int out_z = 2 * offset_z + (in_z - 1) * stride_z + filter_z; + VVVF output(static_cast(out_z), VVF(static_cast(out_y), VF(static_cast(out_x)))); + + for (int oz = 0; oz < out_z; ++oz) { + for (int oy = 0; oy < out_y; ++oy) { + for (int ox = 0; ox < out_x; ++ox) { + VF values; + for (int fz = 0; fz < filter_z; ++fz) { + int iz = oz - filter_z + 1 - offset_z + fz; + if (iz < 0 || iz >= in_z * stride_z || iz % stride_z != 0) + continue; + iz = iz / stride_z; + + for (int fy = 0; fy < filter_y; ++fy) { + int iy = oy - filter_y + 1 - offset_y + fy; + if (iy < 0 || iy >= in_y * stride_y || iy % stride_y != 0) + continue; + iy = iy / stride_y; + + for (int fx = 0; fx < filter_x; ++fx) { + int ix = ox - filter_x + 1 - offset_x + fx; + if (ix < 0 || ix >= in_x * stride_x || ix % stride_x != 0) + continue; + ix = ix / stride_x; + + for (size_t ifi = 0; ifi < ifm; ++ifi) { + auto in_val = input[input_f_start + ifi][iz][iy][ix]; + auto wei_val = weights[ifi][filter_z - fz - 1][filter_y - fy - 1][filter_x - fx - 1]; + values.push_back(static_cast(in_val) * static_cast(wei_val)); + } + } + } + } + output[oz][oy][ox] = static_cast(kahan_summation(values)) + static_cast(bias); + } + } + } + return output; +} + TEST(deconvolution_f32_fw_gpu, basic_wsiz2x2_in2x2x1x1_nopad) { // Filter : 2x2 // Input : 2x2 @@ -2257,3 +2363,500 @@ TEST(deconvolution_f16_fw_gpu, basic_wsiz2x2_in1x2x2x2_fs_b_yx_fsv32_stride1_pad EXPECT_FLOAT_EQ(expected_output_vec[i], output_ptr[i]) << " index=" << i; } } + +struct deconvolution_random_test_params { + data_types input_type; + format::type input_format; + tensor input_size; + data_types weights_type; + format::type weights_format; + tensor weights_size; + tensor strides; + tensor input_offset; + bool with_bias; + data_types output_type; + cldnn::implementation_desc deconv_desc; + + static std::string print_params(const testing::TestParamInfo& param_info) { + auto& param = param_info.param; + auto to_string_neg = [](int v) { + if (v >= 0) { + return std::to_string(v); + } else { + return "m" + std::to_string(-v); + } + }; + + auto print_tensor = [&](const tensor& size) { + return to_string_neg(size.batch[0]) + "x" + + to_string_neg(size.feature[0]) + "x" + + to_string_neg(size.spatial[0]) + "x" + + to_string_neg(size.spatial[1]) + "x" + + to_string_neg(size.spatial[2]); + }; + + // construct a readable name + return "in_" + dt_to_str(param.input_type) + + "_" + fmt_to_str(param.input_format) + + "_" + print_tensor(param.input_size) + + "_wei_" + dt_to_str(param.weights_type) + + "_" + fmt_to_str(param.weights_format) + + "_" + print_tensor(param.weights_size) + + (param.with_bias ? "_bias" : "") + + "_s_" + print_tensor(param.strides) + + "_off_" + print_tensor(param.input_offset) + + "_out_" + dt_to_str(param.output_type) + + (!param.deconv_desc.kernel_name.empty() ? "_kernel_" + param.deconv_desc.kernel_name : "") + + (param.deconv_desc.output_format != format::any ? "_fmt_" + fmt_to_str(param.deconv_desc.output_format) : ""); + } +}; + +template +struct typed_comparator { + static ::testing::AssertionResult compare(const char* lhs_expr, const char* rhs_expr, T ref, T val) { + return ::testing::internal::EqHelper::Compare(lhs_expr, rhs_expr, ref, val); + } +}; + +template <> +struct typed_comparator { + static ::testing::AssertionResult compare(const char* lhs_expr, const char* rhs_expr, float ref, float val) { + return ::testing::internal::CmpHelperFloatingPointEQ(lhs_expr, rhs_expr, ref, val); + } +}; + +template <> +struct typed_comparator { + static ::testing::AssertionResult compare(const char* lhs_expr, const char* rhs_expr, FLOAT16 ref, FLOAT16 val) { + double abs_error = std::abs(0.05 * (double)ref); + return ::testing::internal::DoubleNearPredFormat(lhs_expr, rhs_expr, "5 percent", (double)ref, (double)val, abs_error); + } +}; + +template +struct type_test_ranges { + static constexpr int min = -1; + static constexpr int max = 1; +}; + +template <> +struct type_test_ranges { + static constexpr int min = 0; + static constexpr int max = 255; +}; + +template <> +struct type_test_ranges { + static constexpr int min = -127; + static constexpr int max = 127; +}; + +#define TYPED_ASSERT_EQ(ref, val) \ + ASSERT_PRED_FORMAT2(typed_comparator::compare, ref, val) + +#define TYPED_EXPECT_EQ(ref, val) \ + EXPECT_PRED_FORMAT2(typed_comparator::compare, ref, val) + +template +class deconvolution_random_test_base { +public: + template + void set_memory(cldnn::memory& mem, const VVVVVF& data) { + auto ptr = mem.pointer(); + + auto b = data.size(); + auto f = data[0].size(); + auto z = data[0][0].size(); + auto y = data[0][0][0].size(); + auto x = data[0][0][0][0].size(); + + for (size_t bi = 0; bi < b; ++bi) { + for (size_t fi = 0; fi < f; ++fi) { + for (size_t zi = 0; zi < z; ++zi) { + for (size_t yi = 0; yi < y; ++yi) { + for (size_t xi = 0; xi < x; ++xi) { + auto coords = cldnn::tensor(batch(bi), feature(fi), spatial(xi, yi, zi, 0)); + auto offset = mem.get_layout().get_linear_offset(coords); + ptr[offset] = data[bi][fi][zi][yi][xi]; + } + } + } + } + } + } + + template + void set_memory_weights(cldnn::memory& mem, const VVVVVVF& data) { + auto ptr = mem.pointer(); + + auto g = data.size(); + auto b = data[0].size(); + auto f = data[0][0].size(); + auto z = data[0][0][0].size(); + auto y = data[0][0][0][0].size(); + auto x = data[0][0][0][0][0].size(); + + for (size_t gi = 0; gi < g; ++gi) { + for (size_t bi = 0; bi < b; ++bi) { + for (size_t fi = 0; fi < f; ++fi) { + for (size_t zi = 0; zi < z; ++zi) { + for (size_t yi = 0; yi < y; ++yi) { + for (size_t xi = 0; xi < x; ++xi) { + auto coords = cldnn::tensor(group(gi), batch(bi), feature(fi), spatial(xi, yi, zi, 0)); + auto offset = mem.get_layout().get_linear_offset(coords); + ptr[offset] = data[gi][bi][fi][zi][yi][xi]; + } + } + } + } + } + } + } + + template + VVVVVF generate_random(cldnn::tensor size) { + return generate_random_5d( + size.batch[0], + size.feature[0], + size.spatial[2], + size.spatial[1], + size.spatial[0], + type_test_ranges::min, + type_test_ranges::max); + } + + template + VVVVVVF generate_random_weights(cldnn::tensor size) { + return generate_random_6d( + size.group[0], + size.batch[0], + size.feature[0], + size.spatial[2], + size.spatial[1], + size.spatial[0], + type_test_ranges::min, + type_test_ranges::max); + } + + void run(cldnn::engine eng, const deconvolution_random_test_params& params, cldnn::build_options build_opts) { + uint32_t groups = params.weights_size.group[0]; + size_t ifm = params.weights_size.feature[0]; + size_t ofm = params.weights_size.batch[0]; + + auto input_data = generate_random(params.input_size); + auto weights_data = generate_random_weights(params.weights_size); + + auto in_layout = cldnn::layout(cldnn::type_to_data_type::value, params.input_format, params.input_size); + auto wei_layout = cldnn::layout(cldnn::type_to_data_type::value, params.weights_format, params.weights_size); + + auto wei_mem = cldnn::memory::allocate(eng, wei_layout); + auto in_mem = cldnn::memory::allocate(eng, in_layout); + + this->set_memory_weights(wei_mem, weights_data); + this->set_memory(in_mem, input_data); + + auto topo = cldnn::topology( + cldnn::input_layout("input", in_layout), + cldnn::data("weights", wei_mem) + ); + + VF bias_data; + + if (params.with_bias) { + auto bias_size = cldnn::tensor(feature(params.weights_size.batch[0] * params.weights_size.group[0])); + auto bias_lay = cldnn::layout(cldnn::type_to_data_type::value, cldnn::format::bfyx, bias_size); + auto bias_mem = cldnn::memory::allocate(eng, bias_lay); + bias_data = generate_random_1d(bias_lay.size.feature[0], -1, 1); + set_values(bias_mem, bias_data); + topo.add(cldnn::data("bias", bias_mem)); + topo.add(cldnn::deconvolution("deconv", "input", { "weights" }, { "bias" }, groups, params.strides, params.input_offset)); + } else { + topo.add(cldnn::deconvolution("deconv", "input", { "weights" }, groups, params.strides, params.input_offset)); + } + + if (!params.deconv_desc.kernel_name.empty() || params.deconv_desc.output_format != cldnn::format::any) { + build_opts.set_option(cldnn::build_option::force_implementations({ { "deconv", params.deconv_desc } })); + } + + auto net = cldnn::network(eng, topo, build_opts); + net.set_input_data("input", in_mem); + + auto result = net.execute(); + + std::string kernel; + for (auto i : net.get_primitives_info()) { + if (i.original_id == "deconv") + kernel = i.kernel_id; + } + + auto out_mem = result.at("deconv").get_memory(); + + // Compare results + { + auto ptr = out_mem.pointer(); + + auto b = static_cast(out_mem.get_layout().size.batch[0]); + auto of = static_cast(out_mem.get_layout().size.feature[0]); + + for (size_t bi = 0; bi < b; ++bi) { + for (size_t fi = 0; fi < of; ++fi) { + size_t group = fi / ofm; + auto reference = reference_deconvolution( + input_data[bi], + weights_data[group][fi % ofm], + bias_data.empty() ? 0.f : static_cast(bias_data[fi]), + params.strides, + params.input_offset, + group * ifm); + + ASSERT_EQ(reference.size(), out_mem.get_layout().size.spatial[2]); + ASSERT_EQ(reference[0].size(), out_mem.get_layout().size.spatial[1]); + ASSERT_EQ(reference[0][0].size(), out_mem.get_layout().size.spatial[0]); + + for (size_t zi = 0; zi < reference.size(); zi++) { + for (size_t yi = 0; yi < reference[0].size(); yi++) { + for (size_t xi = 0; xi < reference[0][0].size(); xi++) { + auto ref_val = reference[zi][yi][xi]; + auto out_coords = cldnn::tensor(batch(bi), feature(fi), spatial(xi, yi, zi, 0)); + auto out_offset = out_mem.get_layout().get_linear_offset(out_coords); + auto out_val = ptr[out_offset]; + TYPED_ASSERT_EQ(ref_val, out_val) + << "at b=" << bi << ", f=" << fi << ", z=" << zi << ", y=" << yi << ", x=" << xi << std::endl + << " kernel: " << kernel; + } + } + } + } + } + } + } +}; + +#undef TYPED_ASSERT_EQ +#undef TYPED_EXPECT_EQ + +class deconvolution_random_test : public testing::TestWithParam { +protected: + void SetUp() override { + eng = get_test_engine(); + build_opts.set_option(cldnn::build_option::optimize_data(true)); + } + + void run() { + auto params = GetParam(); + switch (params.input_type) { + case data_types::f32: + run_typed_in(); + break; + case data_types::f16: + run_typed_in(); + break; + case data_types::i8: + run_typed_in(); + break; + case data_types::u8: + run_typed_in(); + break; + default: + break; + } + } + + cldnn::engine eng; + cldnn::build_options build_opts; + +private: + template + void run_typed() { + auto& params = GetParam(); + deconvolution_random_test_base test; + test.run(eng, params, build_opts); + } + + template + void run_typed_in_wei() { + auto& params = GetParam(); + switch (params.output_type) { + case data_types::f32: + run_typed(); + break; + case data_types::f16: + run_typed(); + break; + default: + break; + } + } + + template + void run_typed_in() { + auto& params = GetParam(); + switch (params.weights_type) { + case data_types::f32: + run_typed_in_wei(); + break; + case data_types::f16: + run_typed_in_wei(); + break; + case data_types::i8: + run_typed_in_wei(); + break; + case data_types::u8: + run_typed_in_wei(); + break; + default: + break; + } + } +}; + +class deconvolution_random_test_params_generator : public std::vector { +public: + using self = deconvolution_random_test_params_generator; + self& add(const deconvolution_random_test_params& params) { + push_back(params); + return *this; + } + + self& add_smoke_2d(data_types in_dt, data_types wei_dt, data_types out_dt, format::type in_fmt, format::type out_fmt) { + std::vector batches = { 1, 2 }; + for (auto b : batches) { + // 1x1 + push_back(deconvolution_random_test_params{ in_dt, in_fmt, {b, 15, 7, 7}, wei_dt, format::oiyx, {15, 15, 1, 1}, tensor(1), tensor(0), true, out_dt, implementation_desc{out_fmt, ""} }); + push_back(deconvolution_random_test_params{ in_dt, in_fmt, {b, 15, 7, 7}, wei_dt, format::oiyx, {15, 15, 1, 1}, {1, 1, 2, 2}, tensor(0), true, out_dt, implementation_desc{out_fmt, ""} }); + // 3x3 + push_back(deconvolution_random_test_params{ in_dt, in_fmt, {b, 15, 7, 7}, wei_dt, format::oiyx, {15, 15, 3, 3}, tensor(1), {0, 0, -1, -1, 0}, true, out_dt, implementation_desc{out_fmt, ""} }); + push_back(deconvolution_random_test_params{ in_dt, in_fmt, {b, 15, 7, 7}, wei_dt, format::oiyx, {15, 15, 3, 3}, {1, 1, 2, 2}, {0, 0, -1, -1, 0}, true, out_dt, implementation_desc{out_fmt, ""} }); + // Grouped + push_back(deconvolution_random_test_params{ in_dt, in_fmt, {b, 8, 7, 7}, wei_dt, format::goiyx, tensor(group(2), batch(16), feature(4), spatial(1, 1)), tensor(1), tensor(0), true, out_dt, implementation_desc{out_fmt, ""} }); + push_back(deconvolution_random_test_params{ in_dt, in_fmt, {b, 8, 7, 7}, wei_dt, format::goiyx, tensor(group(2), batch(16), feature(4), spatial(1, 1)), {1, 1, 2, 2}, tensor(0), true, out_dt, implementation_desc{out_fmt, ""} }); + push_back(deconvolution_random_test_params{ in_dt, in_fmt, {b, 8, 7, 7}, wei_dt, format::goiyx, tensor(group(2), batch(16), feature(4), spatial(3, 3)), tensor(1), {0, 0, -1, -1, 0}, true, out_dt, implementation_desc{out_fmt, ""} }); + push_back(deconvolution_random_test_params{ in_dt, in_fmt, {b, 8, 7, 7}, wei_dt, format::goiyx, tensor(group(2), batch(16), feature(4), spatial(3, 3)), {1, 1, 2, 2}, {0, 0, -1, -1, 0}, true, out_dt, implementation_desc{out_fmt, ""} }); + // Depthwise + push_back(deconvolution_random_test_params{ in_dt, in_fmt, {b, 16, 7, 7}, wei_dt, format::goiyx, tensor(group(16), spatial(1, 1)), tensor(1), tensor(0), true, out_dt, implementation_desc{out_fmt, ""} }); + push_back(deconvolution_random_test_params{ in_dt, in_fmt, {b, 16, 7, 7}, wei_dt, format::goiyx, tensor(group(16), spatial(1, 1)), {1, 1, 2, 2}, tensor(0), true, out_dt, implementation_desc{out_fmt, ""} }); + push_back(deconvolution_random_test_params{ in_dt, in_fmt, {b, 16, 7, 7}, wei_dt, format::goiyx, tensor(group(16), spatial(3, 3)), tensor(1), {0, 0, -1, -1, 0}, true, out_dt, implementation_desc{out_fmt, ""} }); + push_back(deconvolution_random_test_params{ in_dt, in_fmt, {b, 16, 7, 7}, wei_dt, format::goiyx, tensor(group(16), spatial(3, 3)), {1, 1, 2, 2}, {0, 0, -1, -1, 0}, true, out_dt, implementation_desc{out_fmt, ""} }); + + } + return *this; + } + + self& add_smoke_3d(data_types in_dt, data_types wei_dt, data_types out_dt, format::type in_fmt, format::type out_fmt) { + std::vector batches = { 1, 2 }; + for (auto b : batches) { + // 1x1 + push_back(deconvolution_random_test_params{ in_dt, in_fmt, {b, 15, 7, 7, 7}, wei_dt, format::oizyx, {15, 15, 1, 1, 1}, tensor(1), tensor(0), true, out_dt, implementation_desc{out_fmt, ""} }); + push_back(deconvolution_random_test_params{ in_dt, in_fmt, {b, 15, 7, 7, 7}, wei_dt, format::oizyx, {15, 15, 1, 1, 1}, {1, 1, 2, 2, 2}, tensor(0), true, out_dt, implementation_desc{out_fmt, ""} }); + // 3x3 + push_back(deconvolution_random_test_params{ in_dt, in_fmt, {b, 15, 7, 7, 7}, wei_dt, format::oizyx, {15, 15, 3, 3, 3}, tensor(1), {0, 0, -1, -1, -1}, true, out_dt, implementation_desc{out_fmt, ""} }); + push_back(deconvolution_random_test_params{ in_dt, in_fmt, {b, 15, 7, 7, 7}, wei_dt, format::oizyx, {15, 15, 3, 3, 3}, {1, 1, 2, 2, 2}, {0, 0, -1, -1, -1}, true, out_dt, implementation_desc{out_fmt, ""} }); + // Grouped + push_back(deconvolution_random_test_params{ in_dt, in_fmt, {b, 8, 7, 7, 7}, wei_dt, format::goizyx, tensor(group(2), batch(16), feature(4), spatial(1, 1, 1)), tensor(1), tensor(0), true, out_dt, implementation_desc{out_fmt, ""} }); + push_back(deconvolution_random_test_params{ in_dt, in_fmt, {b, 8, 7, 7, 7}, wei_dt, format::goizyx, tensor(group(2), batch(16), feature(4), spatial(1, 1, 1)), {1, 1, 2, 2, 2}, tensor(0), true, out_dt, implementation_desc{out_fmt, ""} }); + push_back(deconvolution_random_test_params{ in_dt, in_fmt, {b, 8, 7, 7, 7}, wei_dt, format::goizyx, tensor(group(2), batch(16), feature(4), spatial(3, 3, 3)), tensor(1), {0, 0, -1, -1, -1}, true, out_dt, implementation_desc{out_fmt, ""} }); + push_back(deconvolution_random_test_params{ in_dt, in_fmt, {b, 8, 7, 7, 7}, wei_dt, format::goizyx, tensor(group(2), batch(16), feature(4), spatial(3, 3, 3)), {1, 1, 2, 2, 2}, {0, 0, -1, -1, -1}, true, out_dt, implementation_desc{out_fmt, ""} }); + // Depthwise + push_back(deconvolution_random_test_params{ in_dt, in_fmt, {b, 16, 7, 7, 7}, wei_dt, format::goizyx, tensor(group(16), spatial(1, 1, 1)), tensor(1), tensor(0), true, out_dt, implementation_desc{out_fmt, ""} }); + push_back(deconvolution_random_test_params{ in_dt, in_fmt, {b, 16, 7, 7, 7}, wei_dt, format::goizyx, tensor(group(16), spatial(1, 1, 1)), {1, 1, 2, 2, 2}, tensor(0), true, out_dt, implementation_desc{out_fmt, ""} }); + push_back(deconvolution_random_test_params{ in_dt, in_fmt, {b, 16, 7, 7, 7}, wei_dt, format::goizyx, tensor(group(16), spatial(3, 3, 3)), tensor(1), {0, 0, -1, -1, -1}, true, out_dt, implementation_desc{out_fmt, ""} }); + push_back(deconvolution_random_test_params{ in_dt, in_fmt, {b, 16, 7, 7, 7}, wei_dt, format::goizyx, tensor(group(16), spatial(3, 3, 3)), {1, 1, 2, 2, 2}, {0, 0, -1, -1, -1}, true, out_dt, implementation_desc{out_fmt, ""} }); + } + return *this; + } + + self& add_extra_2d(data_types in_dt, data_types wei_dt, data_types out_dt, format::type in_fmt, format::type out_fmt) { + std::vector batches = { 1, 2, 16 }; + for (auto b : batches) { + // 1x1 + push_back(deconvolution_random_test_params{ in_dt, in_fmt, {b, 31, 19, 17}, wei_dt, format::oiyx, {41, 31, 1, 1}, tensor(1), tensor(0), true, out_dt, implementation_desc{out_fmt, ""} }); + push_back(deconvolution_random_test_params{ in_dt, in_fmt, {b, 31, 19, 17}, wei_dt, format::oiyx, {41, 31, 1, 1}, {1, 1, 2, 2}, tensor(0), true, out_dt, implementation_desc{out_fmt, ""} }); + // 3x3 + push_back(deconvolution_random_test_params{ in_dt, in_fmt, {b, 31, 19, 17}, wei_dt, format::oiyx, {41, 31, 3, 3}, tensor(1), {0, 0, -1, -1, 0}, true, out_dt, implementation_desc{out_fmt, ""} }); + push_back(deconvolution_random_test_params{ in_dt, in_fmt, {b, 31, 19, 17}, wei_dt, format::oiyx, {41, 31, 3, 3}, {1, 1, 2, 2}, {0, 0, -1, -1, 0}, true, out_dt, implementation_desc{out_fmt, ""} }); + // Asymmetric weights + push_back(deconvolution_random_test_params{ in_dt, in_fmt, {b, 31, 19, 17}, wei_dt, format::oiyx, {41, 31, 3, 2}, tensor(1), {0, 0, 0, -1, 0}, true, out_dt, implementation_desc{out_fmt, ""} }); + push_back(deconvolution_random_test_params{ in_dt, in_fmt, {b, 31, 19, 17}, wei_dt, format::oiyx, {41, 31, 3, 2}, {1, 1, 2, 2}, {0, 0, 0, -1, 0}, true, out_dt, implementation_desc{out_fmt, ""} }); + // Uneven groups + push_back(deconvolution_random_test_params{ in_dt, in_fmt, {b, 27, 19, 17}, wei_dt, format::goiyx, tensor(group(3), batch(7), feature(9), spatial(1, 1)), tensor(1), tensor(0), true, out_dt, implementation_desc{out_fmt, ""} }); + push_back(deconvolution_random_test_params{ in_dt, in_fmt, {b, 27, 19, 17}, wei_dt, format::goiyx, tensor(group(3), batch(7), feature(9), spatial(1, 1)), {1, 1, 2, 2}, tensor(0), true, out_dt, implementation_desc{out_fmt, ""} }); + push_back(deconvolution_random_test_params{ in_dt, in_fmt, {b, 27, 19, 17}, wei_dt, format::goiyx, tensor(group(3), batch(7), feature(9), spatial(3, 3)), tensor(1), {0, 0, -1, -1, 0}, true, out_dt, implementation_desc{out_fmt, ""} }); + push_back(deconvolution_random_test_params{ in_dt, in_fmt, {b, 27, 19, 17}, wei_dt, format::goiyx, tensor(group(3), batch(7), feature(9), spatial(3, 3)), {1, 1, 2, 2}, {0, 0, -1, -1, 0}, true, out_dt, implementation_desc{out_fmt, ""} }); + } + return *this; + } + + self& add_extra_3d(data_types in_dt, data_types wei_dt, data_types out_dt, format::type in_fmt, format::type out_fmt) { + std::vector batches = { 1, 2, 16 }; + for (auto b : batches) { + // 1x1 + push_back(deconvolution_random_test_params{ in_dt, in_fmt, {b, 31, 19, 17, 11}, wei_dt, format::oizyx, {41, 31, 1, 1, 1}, tensor(1), tensor(0), true, out_dt, implementation_desc{out_fmt, ""} }); + push_back(deconvolution_random_test_params{ in_dt, in_fmt, {b, 31, 19, 17, 11}, wei_dt, format::oizyx, {41, 31, 1, 1, 1}, {1, 1, 2, 2, 2}, tensor(0), true, out_dt, implementation_desc{out_fmt, ""} }); + // 3x3 + push_back(deconvolution_random_test_params{ in_dt, in_fmt, {b, 31, 19, 17, 11}, wei_dt, format::oizyx, {41, 31, 3, 3, 3}, tensor(1), {0, 0, -1, -1, -1}, true, out_dt, implementation_desc{out_fmt, ""} }); + push_back(deconvolution_random_test_params{ in_dt, in_fmt, {b, 31, 19, 17, 11}, wei_dt, format::oizyx, {41, 31, 3, 3, 3}, {1, 1, 2, 2, 2}, {0, 0, -1, -1, -1}, true, out_dt, implementation_desc{out_fmt, ""} }); + // Asymmetric weights + push_back(deconvolution_random_test_params{ in_dt, in_fmt, {b, 31, 19, 17, 11}, wei_dt, format::oizyx, {41, 31, 3, 2, 4}, tensor(1), {0, 0, 0, -1, -2}, true, out_dt, implementation_desc{out_fmt, ""} }); + push_back(deconvolution_random_test_params{ in_dt, in_fmt, {b, 31, 19, 17, 11}, wei_dt, format::oizyx, {41, 31, 3, 2, 4}, {1, 1, 2, 2, 2}, {0, 0, 0, -1, -2}, true, out_dt, implementation_desc{out_fmt, ""} }); + // Uneven groups + push_back(deconvolution_random_test_params{ in_dt, in_fmt, {b, 27, 19, 17, 11}, wei_dt, format::goizyx, tensor(group(3), batch(7), feature(9), spatial(1, 1, 1)), tensor(1), tensor(0), true, out_dt, implementation_desc{out_fmt, ""} }); + push_back(deconvolution_random_test_params{ in_dt, in_fmt, {b, 27, 19, 17, 11}, wei_dt, format::goizyx, tensor(group(3), batch(7), feature(9), spatial(1, 1, 1)), {1, 1, 2, 2, 2}, tensor(0), true, out_dt, implementation_desc{out_fmt, ""} }); + push_back(deconvolution_random_test_params{ in_dt, in_fmt, {b, 27, 19, 17, 11}, wei_dt, format::goizyx, tensor(group(3), batch(7), feature(9), spatial(3, 3, 3)), tensor(1), {0, 0, -1, -1, -1}, true, out_dt, implementation_desc{out_fmt, ""} }); + push_back(deconvolution_random_test_params{ in_dt, in_fmt, {b, 27, 19, 17, 11}, wei_dt, format::goizyx, tensor(group(3), batch(7), feature(9), spatial(3, 3, 3)), {1, 1, 2, 2, 2}, {0, 0, -1, -1, -1}, true, out_dt, implementation_desc{out_fmt, ""} }); + } + return *this; + } + + self& add_all_2d(data_types in_dt, data_types wei_dt, data_types out_dt, format::type in_fmt, format::type out_fmt) { + return add_smoke_2d(in_dt, wei_dt, out_dt, in_fmt, out_fmt) + .add_extra_2d(in_dt, wei_dt, out_dt, in_fmt, out_fmt); + } + + self& add_all_3d(data_types in_dt, data_types wei_dt, data_types out_dt, format::type in_fmt, format::type out_fmt) { + return add_smoke_3d(in_dt, wei_dt, out_dt, in_fmt, out_fmt) + .add_extra_3d(in_dt, wei_dt, out_dt, in_fmt, out_fmt); + } +}; + +TEST_P(deconvolution_random_test, basic) { + run(); +} + +INSTANTIATE_TEST_CASE_P(smoke, deconvolution_random_test, testing::ValuesIn( + deconvolution_random_test_params_generator() + .add_smoke_2d(data_types::f32, data_types::f32, data_types::f32, format::bfyx, format::any) + .add_smoke_3d(data_types::f32, data_types::f32, data_types::f32, format::bfzyx, format::any) + .add_smoke_2d(data_types::f32, data_types::f32, data_types::f32, format::b_fs_yx_fsv16, format::b_fs_yx_fsv16) + .add_smoke_3d(data_types::f32, data_types::f32, data_types::f32, format::b_fs_zyx_fsv16, format::b_fs_zyx_fsv16) + + .add_smoke_2d(data_types::f16, data_types::f16, data_types::f16, format::bfyx, format::any) + .add_smoke_3d(data_types::f16, data_types::f16, data_types::f16, format::bfzyx, format::any) + .add_smoke_2d(data_types::f16, data_types::f16, data_types::f16, format::b_fs_yx_fsv16, format::b_fs_yx_fsv16) + .add_smoke_3d(data_types::f16, data_types::f16, data_types::f16, format::b_fs_zyx_fsv16, format::b_fs_zyx_fsv16) + + .add_smoke_2d(data_types::i8, data_types::i8, data_types::f32, format::b_fs_yx_fsv16, format::b_fs_yx_fsv16) + .add_smoke_3d(data_types::i8, data_types::i8, data_types::f32, format::b_fs_zyx_fsv16, format::b_fs_zyx_fsv16) +), deconvolution_random_test_params::print_params); + +INSTANTIATE_TEST_CASE_P(DISABLED_extended, deconvolution_random_test, testing::ValuesIn( + deconvolution_random_test_params_generator() + .add_extra_2d(data_types::f32, data_types::f32, data_types::f32, format::bfyx, format::any) + .add_extra_3d(data_types::f32, data_types::f32, data_types::f32, format::bfzyx, format::any) + .add_extra_2d(data_types::f32, data_types::f32, data_types::f32, format::b_fs_yx_fsv16, format::b_fs_yx_fsv16) + .add_extra_3d(data_types::f32, data_types::f32, data_types::f32, format::b_fs_zyx_fsv16, format::b_fs_zyx_fsv16) + + .add_extra_2d(data_types::f16, data_types::f16, data_types::f16, format::bfyx, format::any) + .add_extra_3d(data_types::f16, data_types::f16, data_types::f16, format::bfzyx, format::any) + .add_extra_2d(data_types::f16, data_types::f16, data_types::f16, format::b_fs_yx_fsv16, format::b_fs_yx_fsv16) + .add_extra_3d(data_types::f16, data_types::f16, data_types::f16, format::b_fs_zyx_fsv16, format::b_fs_zyx_fsv16) + + .add_extra_2d(data_types::i8, data_types::i8, data_types::f32, format::b_fs_yx_fsv16, format::b_fs_yx_fsv16) + .add_all_2d(data_types::u8, data_types::i8, data_types::f32, format::b_fs_yx_fsv16, format::b_fs_yx_fsv16) + .add_extra_3d(data_types::i8, data_types::i8, data_types::f32, format::b_fs_zyx_fsv16, format::b_fs_zyx_fsv16) + .add_all_3d(data_types::u8, data_types::i8, data_types::f32, format::b_fs_zyx_fsv16, format::b_fs_zyx_fsv16) + + .add_all_2d(data_types::i8, data_types::i8, data_types::f32, format::bs_fs_yx_bsv16_fsv16, format::bs_fs_yx_bsv16_fsv16) + .add_all_2d(data_types::u8, data_types::i8, data_types::f32, format::bs_fs_yx_bsv16_fsv16, format::bs_fs_yx_bsv16_fsv16) + .add_all_3d(data_types::i8, data_types::i8, data_types::f32, format::bs_fs_zyx_bsv16_fsv16, format::bs_fs_zyx_bsv16_fsv16) + .add_all_3d(data_types::u8, data_types::i8, data_types::f32, format::bs_fs_zyx_bsv16_fsv16, format::bs_fs_zyx_bsv16_fsv16) +), deconvolution_random_test_params::print_params); diff --git a/inference-engine/thirdparty/clDNN/tests/test_cases/fusings_gpu_test.cpp b/inference-engine/thirdparty/clDNN/tests/test_cases/fusings_gpu_test.cpp index a90428e1805..31dc29d04b3 100644 --- a/inference-engine/thirdparty/clDNN/tests/test_cases/fusings_gpu_test.cpp +++ b/inference-engine/thirdparty/clDNN/tests/test_cases/fusings_gpu_test.cpp @@ -31,6 +31,7 @@ #include "api/data.hpp" #include "api/resample.hpp" #include "api/mvn.hpp" +#include "api/deconvolution.hpp" #include "test_utils/test_utils.h" @@ -126,6 +127,17 @@ public: size_t reorders_count_fused = get_reorders_count(fused); size_t reorders_count_not_fused = get_reorders_count(not_fused); + std::stringstream description; + description << std::endl << "not fused: " << std::endl; + for (auto i : not_fused.get_primitives_info()) { + description << " " << i.original_id << " " << i.kernel_id << std::endl; + } + description << "fused: " << std::endl; + for (auto i : fused.get_primitives_info()) { + description << " " << i.original_id << " " << i.kernel_id << std::endl; + } + SCOPED_TRACE(description.str()); + // Subtract reorders count to handle execution in different layouts when input/output reorders can be added in the graph ASSERT_EQ(fused.get_executed_primitives().size() - reorders_count_fused, p.expected_fused_primitives); ASSERT_EQ(not_fused.get_executed_primitives().size() - reorders_count_not_fused, p.expected_not_fused_primitives); @@ -350,6 +362,7 @@ public: #define CASE_CONV_FP32_10 {32, 16, 4, 5, 4}, {32, 32, 4, 5, 4}, {1, 1, 1, 1, 1}, tensor{1}, tensor{0}, tensor{1}, 1, data_types::f32, format::bs_fs_zyx_bsv16_fsv16, data_types::f32, format::bfzyx, data_types::f32, format::bfzyx #define CASE_CONV_FP32_11 {1, 32, 4, 5, 4}, {1, 16, 2, 3, 2}, {1, 1, 3, 3, 3}, tensor{1}, tensor{0}, tensor{1}, 2, data_types::f32, format::b_fs_zyx_fsv16, data_types::f32, format::os_is_zyx_isv16_osv16, data_types::f32, format::bfzyx #define CASE_CONV_FP32_12 {1, 16, 4, 5, 4}, {1, 16, 2, 3, 2}, {1, 1, 3, 3, 3}, tensor{1}, tensor{0}, tensor{1}, 2, data_types::f32, format::b_fs_zyx_fsv16, data_types::f32, format::os_is_zyx_isv16_osv16, data_types::f32, format::bfzyx +#define CASE_CONV_FP32_13 {1, 16, 18, 5, 4}, {1, 16, 16, 3, 2}, {1, 1, 3, 3, 3}, tensor{1}, tensor{0}, tensor{1}, 2, data_types::f32, format::b_fs_zyx_fsv16, data_types::f32, format::os_is_zyx_isv16_osv16, data_types::f32, format::bfzyx #define CASE_CONV_FP16_1 {1, 15, 4, 5}, {1, 30, 2, 3}, {1, 1, 3, 3}, tensor{1}, tensor{0}, tensor{1}, 1, data_types::f16, format::bfyx, data_types::f16, format::bfyx, data_types::f16, format::bfyx #define CASE_CONV_FP16_2 {1, 16, 4, 5}, {1, 32, 2, 3}, {1, 1, 3, 3}, tensor{1}, tensor{0}, tensor{1}, 1, data_types::f16, format::b_fs_yx_fsv16, data_types::f16, format::os_is_yx_isv16_osv16, data_types::f16, format::bfyx @@ -654,6 +667,7 @@ INSTANTIATE_TEST_CASE_P(fusings_gpu, conv_fp32_eltwise_b_fs_zyx_fsv16, bc_test_params{CASE_CONV_FP32_9, 2, 3}, bc_test_params{CASE_CONV_FP32_11, 2, 3}, bc_test_params{CASE_CONV_FP32_12, 2, 3}, + // bc_test_params{CASE_CONV_FP32_13, 2, 3}, - leads to mvn_scale_activation_quantize_i8_eltwise_fp32_quantize_i8.basic/11 test failure bc_test_params{CASE_CONV_FP16_6, 2, 3}, bc_test_params{CASE_CONV_FP16_7, 2, 3}, @@ -1498,6 +1512,67 @@ INSTANTIATE_TEST_CASE_P(fusings_gpu, conv_int8_scale_quantize_i8, bc_test_params{CASE_CONV3D_S8S8_4, 2, 4}, }), ); +class conv_int8_relu_quantize : public ConvFusingTest {}; +TEST_P(conv_int8_relu_quantize, i8) { + auto p = GetParam(); + create_topologies(input_layout("input", get_input_layout(p)), + data("weights", get_mem(get_weights_layout(p))), + data("bias", get_mem(get_bias_layout(p))), + data("in_lo", get_mem(get_per_channel_layout(p), min_random, 0)), + data("in_hi", get_mem(get_per_channel_layout(p), 1, max_random)), + data("out_lo", get_mem(get_single_element_layout(p), -127)), + data("out_hi", get_mem(get_single_element_layout(p), 127)), + convolution("conv_prim", "input", {"weights"}, {"bias"}, p.groups, p.stride, p.pad, p.dilation), + activation("relu", "conv_prim", activation_func::relu), + quantize("quantize", "relu", "in_lo", "in_hi", "out_lo", "out_hi", 256, data_types::i8), + reorder("reorder_bfyx", "quantize", p.default_format, data_types::f32) + ); + // Output elements are in range [-127, 127] + // 1.0f difference is allowed, since quantize can return different values in ref and scale_shift kernels + // due to big error of division (in ref kernel). + tolerance = 1.0f; + execute(p); +} + +TEST_P(conv_int8_relu_quantize, u8) { + auto p = GetParam(); + create_topologies(input_layout("input", get_input_layout(p)), + data("weights", get_mem(get_weights_layout(p))), + data("bias", get_mem(get_bias_layout(p))), + data("in_lo", get_mem(get_per_channel_layout(p), 0)), + data("in_hi", get_mem(get_per_channel_layout(p), 1, max_random)), + data("out_lo", get_mem(get_single_element_layout(p), 0)), + data("out_hi", get_mem(get_single_element_layout(p), 255)), + convolution("conv_prim", "input", {"weights"}, {"bias"}, p.groups, p.stride, p.pad, p.dilation), + activation("relu", "conv_prim", activation_func::relu), + quantize("quantize", "relu", "in_lo", "in_hi", "out_lo", "out_hi", 256, data_types::u8), + reorder("reorder_bfyx", "quantize", p.default_format, data_types::f32) + ); + tolerance = 1.0f; + execute(p); +} + +INSTANTIATE_TEST_CASE_P(fusings_gpu, conv_int8_relu_quantize, + ::testing::ValuesIn(std::vector{ + bc_test_params{CASE_CONV_U8S8_1, 2, 4}, + bc_test_params{CASE_CONV_U8S8_2, 2, 4}, + bc_test_params{CASE_CONV_U8S8_3, 2, 4}, + bc_test_params{CASE_CONV_U8S8_4, 2, 4}, + bc_test_params{CASE_CONV_S8S8_1, 2, 4}, + bc_test_params{CASE_CONV_S8S8_2, 2, 4}, + bc_test_params{CASE_CONV_S8S8_3, 2, 4}, + bc_test_params{CASE_CONV_S8S8_4, 2, 4}, + + bc_test_params{CASE_CONV3D_U8S8_1, 2, 4}, + bc_test_params{CASE_CONV3D_U8S8_2, 2, 4}, + bc_test_params{CASE_CONV3D_U8S8_3, 2, 4}, + bc_test_params{CASE_CONV3D_U8S8_4, 2, 4}, + bc_test_params{CASE_CONV3D_S8S8_1, 2, 4}, + bc_test_params{CASE_CONV3D_S8S8_2, 2, 4}, + bc_test_params{CASE_CONV3D_S8S8_3, 2, 4}, + bc_test_params{CASE_CONV3D_S8S8_4, 2, 4}, + }), ); + class conv_int8_scale_activation_quantize_i8 : public ConvFusingTest {}; TEST_P(conv_int8_scale_activation_quantize_i8, basic) { auto p = GetParam(); @@ -2842,3 +2917,650 @@ INSTANTIATE_TEST_CASE_P(fusings_gpu, lrn_test_params{CASE_LRN_FP16_5, 2, 4, lrn_norm_region_across_channel, "lrn_gpu_across_channel_multiple_features"}, }), ); + +/* ----------------------------------------------------------------------------------------------------- */ +/* -------------------------------- Activation cases --------------------------------------------------- */ +/* ----------------------------------------------------------------------------------------------------- */ +struct activation_test_params { + tensor input_size; + data_types input_type; + format input_format; + activation_func activation_function; + activation_additional_params additional_params; + data_types default_type; + format default_format; + size_t expected_fused_primitives; + size_t expected_not_fused_primitives; +}; + +#define CASE_ACTIVATION_F32_1 {1, 16, 8, 8}, data_types::f32, format::bfyx, activation_func::hyperbolic_tan, {0.f, 0.f}, data_types::f32, format::bfyx +#define CASE_ACTIVATION_F32_2 {1, 16, 8, 8}, data_types::f32, format::bfyx, activation_func::hard_sigmoid, {1.f, 1.f}, data_types::f32, format::bfyx +#define CASE_ACTIVATION_F32_3 {1, 16, 8, 8}, data_types::f32, format::bfyx, activation_func::relu, {0.f, 0.f}, data_types::f32, format::bfyx +#define CASE_ACTIVATION_F32_4 {1, 16, 8, 8}, data_types::f32, format::b_fs_yx_fsv16, activation_func::hyperbolic_tan, {0.f, 0.f}, data_types::f32, format::bfyx +#define CASE_ACTIVATION_F32_5 {1, 16, 8, 8}, data_types::f32, format::b_fs_yx_fsv16, activation_func::hard_sigmoid, {1.f, 1.f}, data_types::f32, format::bfyx +#define CASE_ACTIVATION_F32_6 {1, 16, 8, 8}, data_types::f32, format::b_fs_yx_fsv16, activation_func::relu, {0.f, 0.f}, data_types::f32, format::bfyx +#define CASE_ACTIVATION_3D_F32_1 {1, 16, 8, 8, 8}, data_types::f32, format::bfzyx, activation_func::hyperbolic_tan, {0.f, 0.f}, data_types::f32, format::bfyx +#define CASE_ACTIVATION_3D_F32_2 {1, 16, 8, 8, 8}, data_types::f32, format::bfzyx, activation_func::hard_sigmoid, {0.f, 0.f}, data_types::f32, format::bfyx +#define CASE_ACTIVATION_3D_F32_3 {1, 16, 8, 8, 8}, data_types::f32, format::bfzyx, activation_func::relu, {0.f, 0.f}, data_types::f32, format::bfyx +#define CASE_ACTIVATION_F16_1 {1, 16, 8, 8}, data_types::f16, format::bfyx, activation_func::hyperbolic_tan, {0.f, 0.f}, data_types::f32, format::bfyx +#define CASE_ACTIVATION_F16_2 {1, 16, 8, 8}, data_types::f16, format::bfyx, activation_func::hard_sigmoid, {1.f, 1.f}, data_types::f32, format::bfyx +#define CASE_ACTIVATION_F16_3 {1, 16, 8, 8}, data_types::f16, format::bfyx, activation_func::relu, {0.f, 0.f}, data_types::f32, format::bfyx +#define CASE_ACTIVATION_F16_4 {1, 16, 8, 8}, data_types::f16, format::b_fs_yx_fsv16, activation_func::hyperbolic_tan, {0.f, 0.f}, data_types::f32, format::bfyx +#define CASE_ACTIVATION_F16_5 {1, 16, 8, 8}, data_types::f16, format::b_fs_yx_fsv16, activation_func::hard_sigmoid, {1.f, 1.f}, data_types::f32, format::bfyx +#define CASE_ACTIVATION_F16_6 {1, 16, 8, 8}, data_types::f16, format::b_fs_yx_fsv16, activation_func::relu, {0.f, 0.f}, data_types::f32, format::bfyx +#define CASE_ACTIVATION_3D_F16_1 {1, 16, 8, 8, 8}, data_types::f16, format::bfzyx, activation_func::hyperbolic_tan, {0.f, 0.f}, data_types::f32, format::bfyx +#define CASE_ACTIVATION_3D_F16_2 {1, 16, 8, 8, 8}, data_types::f16, format::bfzyx, activation_func::hard_sigmoid, {0.f, 0.f}, data_types::f32, format::bfyx +#define CASE_ACTIVATION_3D_F16_3 {1, 16, 8, 8, 8}, data_types::f16, format::bfzyx, activation_func::relu, {0.f, 0.f}, data_types::f32, format::bfyx +#define CASE_ACTIVATION_U8_1 {1, 16, 8, 8}, data_types::u8, format::bfyx, activation_func::relu, {0.f, 0.f}, data_types::f32, format::bfyx +#define CASE_ACTIVATION_U8_2 {1, 16, 8, 8}, data_types::u8, format::b_fs_yx_fsv16, activation_func::relu, {0.f, 0.f}, data_types::f32, format::bfyx +#define CASE_ACTIVATION_3D_U8_1 {1, 16, 8, 8, 8}, data_types::u8, format::bfzyx, activation_func::relu, {0.f, 0.f}, data_types::f32, format::bfyx + +class ActivationFusingTest : public ::BaseFusingTest { +public: + void execute(activation_test_params& p) { + auto input_prim = get_mem(get_input_layout(p)); + + network network_not_fused(this->engine, this->topology_non_fused, bo_not_fused); + network network_fused(this->engine, this->topology_fused, bo_fused); + + network_fused.set_input_data("input", input_prim); + network_not_fused.set_input_data("input", input_prim); + + compare(network_not_fused, network_fused, p); + } + + layout get_input_layout(activation_test_params& p) { return layout{p.input_type, p.input_format, p.input_size}; } + + layout get_per_channel_layout(activation_test_params& p) { + return layout{p.default_type, p.default_format, tensor{1, p.input_size.feature[0], 1, 1}}; + } + activation_func get_activation_function(activation_test_params& p) { return p.activation_function; } + activation_additional_params get_activation_additional_params(activation_test_params& p) { return p.additional_params; } + format get_input_format(activation_test_params &p) { return p.input_format; } +}; + +class activation_quantize_i8 : public ActivationFusingTest {}; +TEST_P(activation_quantize_i8, basic) { + auto p = GetParam(); + create_topologies(input_layout("input", get_input_layout(p)), + activation("act", "input", get_activation_function(p), get_activation_additional_params(p)), + data("in_low", get_mem(get_per_channel_layout(p), min_random, 0)), + data("in_high", get_mem(get_per_channel_layout(p), 1, max_random)), + data("out_low", get_mem(get_single_element_layout(p), -127, 0)), + data("out_high", get_mem(get_single_element_layout(p), 0, 127)), + quantize("quant", "act", "in_low", "in_high", "out_low", "out_high", 255, data_types::i8), + reorder("reorder_bfyx", "quant", format::bfyx, data_types::f32)); + + tolerance = 1.f; + execute(p); +} + +INSTANTIATE_TEST_CASE_P( + fusings_gpu, + activation_quantize_i8, + ::testing::ValuesIn(std::vector{ + activation_test_params{CASE_ACTIVATION_F32_1, 2, 3}, + activation_test_params{CASE_ACTIVATION_F32_2, 2, 3}, + activation_test_params{CASE_ACTIVATION_F32_3, 2, 3}, + activation_test_params{CASE_ACTIVATION_F32_4, 2, 3}, + activation_test_params{CASE_ACTIVATION_F32_5, 2, 3}, + activation_test_params{CASE_ACTIVATION_F32_6, 2, 3}, + activation_test_params{CASE_ACTIVATION_3D_F32_1, 2, 3}, + activation_test_params{CASE_ACTIVATION_3D_F32_2, 2, 3}, + activation_test_params{CASE_ACTIVATION_3D_F32_3, 2, 3} + }), ); + +INSTANTIATE_TEST_CASE_P( + DISABLED_fusings_gpu, + activation_quantize_i8, + ::testing::ValuesIn(std::vector{ + // fp16 cases + activation_test_params{CASE_ACTIVATION_F16_1, 2, 3}, + activation_test_params{CASE_ACTIVATION_F16_2, 2, 3}, + activation_test_params{CASE_ACTIVATION_F16_3, 2, 3}, + activation_test_params{CASE_ACTIVATION_F16_4, 2, 3}, + activation_test_params{CASE_ACTIVATION_F16_5, 2, 3}, + activation_test_params{CASE_ACTIVATION_F16_6, 2, 3}, + activation_test_params{CASE_ACTIVATION_3D_F16_1, 2, 3}, + activation_test_params{CASE_ACTIVATION_3D_F16_2, 2, 3}, + activation_test_params{CASE_ACTIVATION_3D_F16_3, 2, 3}, + + // u8 cases + activation_test_params{CASE_ACTIVATION_U8_1, 2, 3}, + activation_test_params{CASE_ACTIVATION_U8_2, 2, 3}, + activation_test_params{CASE_ACTIVATION_3D_U8_1, 2, 3} + }), ); + +class activation_opt_quantize_i8 : public ActivationFusingTest {}; +TEST_P(activation_opt_quantize_i8, basic) { + auto p = GetParam(); + implementation_desc activation_impl = {get_input_format(p), "activation_opt"}; + this->bo_fused.set_option(build_option::force_implementations({{"act", activation_impl}})); + + create_topologies(input_layout("input", get_input_layout(p)), + activation("act", "input", get_activation_function(p), get_activation_additional_params(p)), + data("in_low", get_mem(get_per_channel_layout(p), min_random, 0)), + data("in_high", get_mem(get_per_channel_layout(p), 1, max_random)), + data("out_low", get_mem(get_single_element_layout(p), -127, 0)), + data("out_high", get_mem(get_single_element_layout(p), 0, 127)), + quantize("quant", "act", "in_low", "in_high", "out_low", "out_high", 255, data_types::i8), + reorder("reorder_bfyx", "quant", format::bfyx, data_types::f32)); + + tolerance = 1.f; + execute(p); +} + +INSTANTIATE_TEST_CASE_P( + fusings_gpu, + activation_opt_quantize_i8, + ::testing::ValuesIn(std::vector{ + activation_test_params{CASE_ACTIVATION_F32_1, 2, 3}, + activation_test_params{CASE_ACTIVATION_F32_2, 2, 3}, + activation_test_params{CASE_ACTIVATION_F32_3, 2, 3}, + activation_test_params{CASE_ACTIVATION_3D_F32_1, 2, 3}, + activation_test_params{CASE_ACTIVATION_3D_F32_2, 2, 3}, + activation_test_params{CASE_ACTIVATION_3D_F32_3, 2, 3} + }), ); + +INSTANTIATE_TEST_CASE_P( + DISABLED_fusings_gpu, + activation_opt_quantize_i8, + ::testing::ValuesIn(std::vector{ + // fp16 cases + activation_test_params{CASE_ACTIVATION_F16_1, 2, 3}, + activation_test_params{CASE_ACTIVATION_F16_2, 2, 3}, + activation_test_params{CASE_ACTIVATION_F16_3, 2, 3}, + activation_test_params{CASE_ACTIVATION_3D_F16_1, 2, 3}, + activation_test_params{CASE_ACTIVATION_3D_F16_2, 2, 3}, + activation_test_params{CASE_ACTIVATION_3D_F16_3, 2, 3}, + + // u8 cases + activation_test_params{CASE_ACTIVATION_U8_1, 2, 3}, + activation_test_params{CASE_ACTIVATION_3D_U8_1, 2, 3} + }), ); + +/* ----------------------------------------------------------------------------------------------------- */ +/* --------------------------------------- Deconvolution cases ----------------------------------------- */ +/* ----------------------------------------------------------------------------------------------------- */ +using deconv_test_params = bc_test_params; + +// in_shape; out_shape; kernel; stride; pad; dilation; groups; data_type; input_format; weights_type; weights_format; default_type; default_format; +#define CASE_DECONV_FP32_1 {1, 15, 4, 5}, {1, 30, 6, 7}, {1, 1, 3, 3}, tensor{1}, tensor{0}, tensor{1}, 1, data_types::f32, format::bfyx, data_types::f32, format::oiyx, data_types::f32, format::bfyx +#define CASE_DECONV_FP32_2 {1, 16, 4, 5}, {1, 32, 6, 7}, {1, 1, 3, 3}, tensor{1}, tensor{0}, tensor{1}, 1, data_types::f32, format::b_fs_yx_fsv16, data_types::f32, format::is_os_yx_osv16_isv16, data_types::f32, format::bfyx +#define CASE_DECONV_FP32_3 {1, 16, 4, 5}, {1, 32, 4, 5}, {1, 1, 1, 1}, tensor{1}, tensor{0}, tensor{1}, 1, data_types::f32, format::b_fs_yx_fsv16, data_types::f32, format::is_os_yx_osv16_isv16, data_types::f32, format::bfyx +#define CASE_DECONV_FP32_4 {1, 32, 4, 5}, {1, 32, 4, 5}, {1, 1, 3, 3}, tensor{1}, tensor{0, 0, -1, -1, 0, 0}, tensor{1}, 32, data_types::f32, format::b_fs_yx_fsv16, data_types::f32, format::gs_oiyx_gsv16, data_types::f32, format::bfyx +#define CASE_DECONV_FP32_5 {1, 15, 4, 5}, {1, 30, 9, 11}, {1, 1, 3, 3}, tensor{1, 1, 2, 2}, tensor{0}, tensor{1}, 1, data_types::f32, format::bfyx, data_types::f32, format::oiyx, data_types::f32, format::bfyx +#define CASE_DECONV_FP32_6 {1, 16, 4, 5}, {1, 32, 9, 11}, {1, 1, 3, 3}, tensor{1, 1, 2, 2}, tensor{0}, tensor{1}, 1, data_types::f32, format::b_fs_yx_fsv16, data_types::f32, format::is_os_yx_osv16_isv16, data_types::f32, format::bfyx +#define CASE_DECONV_FP32_7 {1, 16, 4, 5}, {1, 32, 7, 9}, {1, 1, 1, 1}, tensor{1, 1, 2, 2}, tensor{0}, tensor{1}, 1, data_types::f32, format::b_fs_yx_fsv16, data_types::f32, format::is_os_yx_osv16_isv16, data_types::f32, format::bfyx +#define CASE_DECONV_FP32_8 {1, 32, 4, 5}, {1, 32, 7, 9}, {1, 1, 3, 3}, tensor{1, 1, 2, 2}, tensor{0, 0, -1, -1, 0, 0}, tensor{1}, 32, data_types::f32, format::b_fs_yx_fsv16, data_types::f32, format::gs_oiyx_gsv16, data_types::f32, format::bfyx + +#define CASE_DECONV_FP16_1 {1, 15, 4, 5}, {1, 30, 6, 7}, {1, 1, 3, 3}, tensor{1}, tensor{0}, tensor{1}, 1, data_types::f16, format::bfyx, data_types::f16, format::oiyx, data_types::f16, format::bfyx +#define CASE_DECONV_FP16_2 {1, 16, 4, 5}, {1, 32, 6, 7}, {1, 1, 3, 3}, tensor{1}, tensor{0}, tensor{1}, 1, data_types::f16, format::b_fs_yx_fsv16, data_types::f16, format::is_os_yx_osv16_isv16, data_types::f16, format::bfyx +#define CASE_DECONV_FP16_3 {1, 16, 4, 5}, {1, 32, 4, 5}, {1, 1, 1, 1}, tensor{1}, tensor{0}, tensor{1}, 1, data_types::f16, format::b_fs_yx_fsv16, data_types::f16, format::is_os_yx_osv16_isv16, data_types::f16, format::bfyx +#define CASE_DECONV_FP16_4 {1, 32, 4, 5}, {1, 32, 4, 5}, {1, 1, 3, 3}, tensor{1}, tensor{0, 0, -1, -1, 0, 0}, tensor{1}, 32, data_types::f16, format::b_fs_yx_fsv16, data_types::f16, format::gs_oiyx_gsv16, data_types::f16, format::bfyx +#define CASE_DECONV_FP16_5 {1, 15, 4, 5}, {1, 30, 9, 11}, {1, 1, 3, 3}, tensor{1, 1, 2, 2}, tensor{0}, tensor{1}, 1, data_types::f16, format::bfyx, data_types::f16, format::oiyx, data_types::f16, format::bfyx +#define CASE_DECONV_FP16_6 {1, 16, 4, 5}, {1, 32, 9, 11}, {1, 1, 3, 3}, tensor{1, 1, 2, 2}, tensor{0}, tensor{1}, 1, data_types::f16, format::b_fs_yx_fsv16, data_types::f16, format::is_os_yx_osv16_isv16, data_types::f16, format::bfyx +#define CASE_DECONV_FP16_7 {1, 16, 4, 5}, {1, 32, 7, 9}, {1, 1, 1, 1}, tensor{1, 1, 2, 2}, tensor{0}, tensor{1}, 1, data_types::f16, format::b_fs_yx_fsv16, data_types::f16, format::is_os_yx_osv16_isv16, data_types::f16, format::bfyx +#define CASE_DECONV_FP16_8 {1, 32, 4, 5}, {1, 32, 7, 9}, {1, 1, 3, 3}, tensor{1, 1, 2, 2}, tensor{0, 0, -1, -1, 0, 0}, tensor{1}, 32, data_types::f16, format::b_fs_yx_fsv16, data_types::f16, format::gs_oiyx_gsv16, data_types::f16, format::bfyx + +#define CASE_DECONV_S8S8_1 {1, 15, 4, 5}, {1, 30, 6, 7}, {1, 1, 3, 3}, tensor{1}, tensor{0}, tensor{1}, 1, data_types::i8, format::bfyx, data_types::i8, format::oiyx, data_types::f32, format::bfyx +#define CASE_DECONV_S8S8_2 {1, 16, 4, 5}, {1, 32, 6, 7}, {1, 1, 3, 3}, tensor{1}, tensor{0}, tensor{1}, 1, data_types::i8, format::b_fs_yx_fsv16, data_types::i8, format::oiyx, data_types::f32, format::bfyx +#define CASE_DECONV_S8S8_3 {1, 16, 4, 5}, {1, 32, 4, 5}, {1, 1, 1, 1}, tensor{1}, tensor{0}, tensor{1}, 1, data_types::i8, format::b_fs_yx_fsv16, data_types::i8, format::oiyx, data_types::f32, format::bfyx +#define CASE_DECONV_S8S8_4 {1, 32, 4, 5}, {1, 32, 4, 5}, {1, 1, 3, 3}, tensor{1}, tensor{0, 0, -1, -1, 0, 0}, tensor{1}, 32, data_types::i8, format::b_fs_yx_fsv16, data_types::i8, format::goiyx, data_types::f32, format::bfyx +#define CASE_DECONV_S8S8_5 {1, 15, 4, 5}, {1, 30, 9, 11}, {1, 1, 3, 3}, tensor{1, 1, 2, 2}, tensor{0}, tensor{1}, 1, data_types::i8, format::bfyx, data_types::i8, format::oiyx, data_types::f32, format::bfyx +#define CASE_DECONV_S8S8_6 {1, 16, 4, 5}, {1, 32, 9, 11}, {1, 1, 3, 3}, tensor{1, 1, 2, 2}, tensor{0}, tensor{1}, 1, data_types::i8, format::b_fs_yx_fsv16, data_types::i8, format::oiyx, data_types::f32, format::bfyx +#define CASE_DECONV_S8S8_7 {1, 16, 4, 5}, {1, 32, 7, 9}, {1, 1, 1, 1}, tensor{1, 1, 2, 2}, tensor{0}, tensor{1}, 1, data_types::i8, format::b_fs_yx_fsv16, data_types::i8, format::oiyx, data_types::f32, format::bfyx +#define CASE_DECONV_S8S8_8 {1, 32, 4, 5}, {1, 32, 7, 9}, {1, 1, 3, 3}, tensor{1, 1, 2, 2}, tensor{0, 0, -1, -1, 0, 0}, tensor{1}, 32, data_types::i8, format::b_fs_yx_fsv16, data_types::i8, format::goiyx, data_types::f32, format::bfyx + +#define CASE_DECONV_U8S8_1 {1, 15, 4, 5}, {1, 30, 6, 7}, {1, 1, 3, 3}, tensor{1}, tensor{0}, tensor{1}, 1, data_types::u8, format::bfyx, data_types::i8, format::oiyx, data_types::f32, format::bfyx +#define CASE_DECONV_U8S8_2 {1, 16, 4, 5}, {1, 32, 6, 7}, {1, 1, 3, 3}, tensor{1}, tensor{0}, tensor{1}, 1, data_types::u8, format::b_fs_yx_fsv16, data_types::i8, format::oiyx, data_types::f32, format::bfyx +#define CASE_DECONV_U8S8_3 {1, 16, 4, 5}, {1, 32, 4, 5}, {1, 1, 1, 1}, tensor{1}, tensor{0}, tensor{1}, 1, data_types::u8, format::b_fs_yx_fsv16, data_types::i8, format::oiyx, data_types::f32, format::bfyx +#define CASE_DECONV_U8S8_4 {1, 32, 4, 5}, {1, 32, 4, 5}, {1, 1, 3, 3}, tensor{1}, tensor{0, 0, -1, -1, 0, 0}, tensor{1}, 32, data_types::u8, format::b_fs_yx_fsv16, data_types::i8, format::goiyx, data_types::f32, format::bfyx +#define CASE_DECONV_U8S8_5 {1, 15, 4, 5}, {1, 30, 9, 11}, {1, 1, 3, 3}, tensor{1, 1, 2, 2}, tensor{0}, tensor{1}, 1, data_types::u8, format::bfyx, data_types::i8, format::oiyx, data_types::f32, format::bfyx +#define CASE_DECONV_U8S8_6 {1, 16, 4, 5}, {1, 32, 9, 11}, {1, 1, 3, 3}, tensor{1, 1, 2, 2}, tensor{0}, tensor{1}, 1, data_types::u8, format::b_fs_yx_fsv16, data_types::i8, format::oiyx, data_types::f32, format::bfyx +#define CASE_DECONV_U8S8_7 {1, 16, 4, 5}, {1, 32, 7, 9}, {1, 1, 1, 1}, tensor{1, 1, 2, 2}, tensor{0}, tensor{1}, 1, data_types::u8, format::b_fs_yx_fsv16, data_types::i8, format::oiyx, data_types::f32, format::bfyx +#define CASE_DECONV_U8S8_8 {1, 32, 4, 5}, {1, 32, 7, 9}, {1, 1, 3, 3}, tensor{1, 1, 2, 2}, tensor{0, 0, -1, -1, 0, 0}, tensor{1}, 32, data_types::u8, format::b_fs_yx_fsv16, data_types::i8, format::goiyx, data_types::f32, format::bfyx + +// 3D +// in_shape; out_shape; kernel; stride; pad; dilation; groups; data_type; input_format; weights_type; weights_format; default_type; default_format; +#define CASE_DECONV_FP32_3D_1 {1, 15, 4, 5, 3}, {1, 30, 6, 7, 5}, {1, 1, 3, 3, 3}, tensor{1}, tensor{0}, tensor{1}, 1, data_types::f32, format::bfzyx, data_types::f32, format::oizyx, data_types::f32, format::bfzyx +#define CASE_DECONV_FP32_3D_2 {1, 16, 4, 5, 3}, {1, 32, 6, 7, 5}, {1, 1, 3, 3, 3}, tensor{1}, tensor{0}, tensor{1}, 1, data_types::f32, format::b_fs_zyx_fsv16, data_types::f32, format::is_os_zyx_osv16_isv16, data_types::f32, format::bfzyx +#define CASE_DECONV_FP32_3D_3 {1, 16, 4, 5, 3}, {1, 32, 4, 5, 3}, {1, 1, 1, 1, 1}, tensor{1}, tensor{0}, tensor{1}, 1, data_types::f32, format::b_fs_zyx_fsv16, data_types::f32, format::is_os_zyx_osv16_isv16, data_types::f32, format::bfzyx +#define CASE_DECONV_FP32_3D_4 {1, 32, 4, 5, 3}, {1, 32, 4, 5, 3}, {1, 1, 3, 3, 3}, tensor{1}, tensor{0, 0, -1, -1, -1}, tensor{1}, 32, data_types::f32, format::b_fs_zyx_fsv16, data_types::f32, format::gs_oizyx_gsv16, data_types::f32, format::bfzyx +#define CASE_DECONV_FP32_3D_5 {1, 15, 4, 5, 3}, {1, 30, 9, 11, 7}, {1, 1, 3, 3, 3}, tensor{1, 1, 2, 2, 2}, tensor{0}, tensor{1}, 1, data_types::f32, format::bfzyx, data_types::f32, format::oizyx, data_types::f32, format::bfzyx +#define CASE_DECONV_FP32_3D_6 {1, 16, 4, 5, 3}, {1, 32, 9, 11, 7}, {1, 1, 3, 3, 3}, tensor{1, 1, 2, 2, 2}, tensor{0}, tensor{1}, 1, data_types::f32, format::b_fs_zyx_fsv16, data_types::f32, format::is_os_zyx_osv16_isv16, data_types::f32, format::bfzyx +#define CASE_DECONV_FP32_3D_7 {1, 16, 4, 5, 3}, {1, 32, 7, 9, 5}, {1, 1, 1, 1, 1}, tensor{1, 1, 2, 2, 2}, tensor{0}, tensor{1}, 1, data_types::f32, format::b_fs_zyx_fsv16, data_types::f32, format::is_os_zyx_osv16_isv16, data_types::f32, format::bfzyx +#define CASE_DECONV_FP32_3D_8 {1, 32, 4, 5, 3}, {1, 32, 7, 9, 5}, {1, 1, 3, 3, 3}, tensor{1, 1, 2, 2, 2}, tensor{0, 0, -1, -1, -1}, tensor{1}, 32, data_types::f32, format::b_fs_zyx_fsv16, data_types::f32, format::gs_oizyx_gsv16, data_types::f32, format::bfzyx +#define CASE_DECONV_FP32_3D_9 {16, 16, 4, 5, 3}, {16, 32, 7, 9, 5}, {1, 1, 1, 1, 1}, tensor{1, 1, 2, 2, 2}, tensor{0}, tensor{1}, 1, data_types::f32, format::bs_fs_zyx_bsv16_fsv16, data_types::f32, format::is_os_zyx_osv16_isv16, data_types::f32, format::bfzyx + +#define CASE_DECONV_FP16_3D_1 {1, 15, 4, 5, 3}, {1, 30, 6, 7, 5}, {1, 1, 3, 3, 3}, tensor{1}, tensor{0}, tensor{1}, 1, data_types::f16, format::bfzyx, data_types::f16, format::oizyx, data_types::f16, format::bfzyx +#define CASE_DECONV_FP16_3D_2 {1, 16, 4, 5, 3}, {1, 32, 6, 7, 5}, {1, 1, 3, 3, 3}, tensor{1}, tensor{0}, tensor{1}, 1, data_types::f16, format::b_fs_zyx_fsv16, data_types::f16, format::is_os_zyx_osv16_isv16, data_types::f16, format::bfzyx +#define CASE_DECONV_FP16_3D_3 {1, 16, 4, 5, 3}, {1, 32, 4, 5, 3}, {1, 1, 1, 1, 1}, tensor{1}, tensor{0}, tensor{1}, 1, data_types::f16, format::b_fs_zyx_fsv16, data_types::f16, format::is_os_zyx_osv16_isv16, data_types::f16, format::bfzyx +#define CASE_DECONV_FP16_3D_4 {1, 32, 4, 5, 3}, {1, 32, 4, 5, 3}, {1, 1, 3, 3, 3}, tensor{1}, tensor{0, 0, -1, -1, -1}, tensor{1}, 32, data_types::f16, format::b_fs_zyx_fsv16, data_types::f16, format::gs_oizyx_gsv16, data_types::f16, format::bfzyx +#define CASE_DECONV_FP16_3D_5 {1, 15, 4, 5, 3}, {1, 30, 9, 11, 7}, {1, 1, 3, 3, 3}, tensor{1, 1, 2, 2, 2}, tensor{0}, tensor{1}, 1, data_types::f16, format::bfzyx, data_types::f16, format::oizyx, data_types::f16, format::bfzyx +#define CASE_DECONV_FP16_3D_6 {1, 16, 4, 5, 3}, {1, 32, 9, 11, 7}, {1, 1, 3, 3, 3}, tensor{1, 1, 2, 2, 2}, tensor{0}, tensor{1}, 1, data_types::f16, format::b_fs_zyx_fsv16, data_types::f16, format::is_os_zyx_osv16_isv16, data_types::f16, format::bfzyx +#define CASE_DECONV_FP16_3D_7 {1, 16, 4, 5, 3}, {1, 32, 7, 9, 5}, {1, 1, 1, 1, 1}, tensor{1, 1, 2, 2, 2}, tensor{0}, tensor{1}, 1, data_types::f16, format::b_fs_zyx_fsv16, data_types::f16, format::is_os_zyx_osv16_isv16, data_types::f16, format::bfzyx +#define CASE_DECONV_FP16_3D_8 {1, 32, 4, 5, 3}, {1, 32, 7, 9, 5}, {1, 1, 3, 3, 3}, tensor{1, 1, 2, 2, 2}, tensor{0, 0, -1, -1, -1}, tensor{1}, 32, data_types::f16, format::b_fs_zyx_fsv16, data_types::f16, format::gs_oizyx_gsv16, data_types::f16, format::bfzyx +#define CASE_DECONV_FP16_3D_9 {16, 16, 4, 5, 3}, {16, 32, 7, 9, 5}, {1, 1, 1, 1, 1}, tensor{1, 1, 2, 2, 2}, tensor{0}, tensor{1}, 1, data_types::f16, format::bs_fs_zyx_bsv16_fsv16, data_types::f16, format::is_os_zyx_osv16_isv16, data_types::f16, format::bfzyx + +#define CASE_DECONV_S8S8_3D_1 {1, 15, 4, 5, 3}, {1, 30, 6, 7, 5}, {1, 1, 3, 3, 3}, tensor{1}, tensor{0}, tensor{1}, 1, data_types::i8, format::bfzyx, data_types::i8, format::oizyx, data_types::f32, format::bfzyx +#define CASE_DECONV_S8S8_3D_2 {1, 16, 4, 5, 3}, {1, 32, 6, 7, 5}, {1, 1, 3, 3, 3}, tensor{1}, tensor{0}, tensor{1}, 1, data_types::i8, format::b_fs_zyx_fsv16, data_types::i8, format::oizyx, data_types::f32, format::bfzyx +#define CASE_DECONV_S8S8_3D_3 {1, 16, 4, 5, 3}, {1, 32, 4, 5, 3}, {1, 1, 1, 1, 1}, tensor{1}, tensor{0}, tensor{1}, 1, data_types::i8, format::b_fs_zyx_fsv16, data_types::i8, format::oizyx, data_types::f32, format::bfzyx +#define CASE_DECONV_S8S8_3D_4 {1, 32, 4, 5, 3}, {1, 32, 4, 5, 3}, {1, 1, 3, 3, 3}, tensor{1}, tensor{0, 0, -1, -1, -1}, tensor{1}, 32, data_types::i8, format::b_fs_zyx_fsv16, data_types::i8, format::goizyx, data_types::f32, format::bfzyx +#define CASE_DECONV_S8S8_3D_5 {1, 15, 4, 5, 3}, {1, 30, 9, 11, 7}, {1, 1, 3, 3, 3}, tensor{1, 1, 2, 2, 2}, tensor{0}, tensor{1}, 1, data_types::i8, format::bfzyx, data_types::i8, format::oizyx, data_types::f32, format::bfzyx +#define CASE_DECONV_S8S8_3D_6 {1, 16, 4, 5, 3}, {1, 32, 9, 11, 7}, {1, 1, 3, 3, 3}, tensor{1, 1, 2, 2, 2}, tensor{0}, tensor{1}, 1, data_types::i8, format::b_fs_zyx_fsv16, data_types::i8, format::oizyx, data_types::f32, format::bfzyx +#define CASE_DECONV_S8S8_3D_7 {1, 16, 4, 5, 3}, {1, 32, 7, 9, 5}, {1, 1, 1, 1, 1}, tensor{1, 1, 2, 2, 2}, tensor{0}, tensor{1}, 1, data_types::i8, format::b_fs_zyx_fsv16, data_types::i8, format::oizyx, data_types::f32, format::bfzyx +#define CASE_DECONV_S8S8_3D_8 {1, 32, 4, 5, 3}, {1, 32, 7, 9, 5}, {1, 1, 3, 3, 3}, tensor{1, 1, 2, 2, 2}, tensor{0, 0, -1, -1, -1}, tensor{1}, 32, data_types::i8, format::b_fs_zyx_fsv16, data_types::i8, format::goizyx, data_types::f32, format::bfzyx + +#define CASE_DECONV_U8S8_3D_1 {1, 15, 4, 5, 3}, {1, 30, 6, 7, 5}, {1, 1, 3, 3, 3}, tensor{1}, tensor{0}, tensor{1}, 1, data_types::u8, format::bfzyx, data_types::i8, format::oizyx, data_types::f32, format::bfzyx +#define CASE_DECONV_U8S8_3D_2 {1, 16, 4, 5, 3}, {1, 32, 6, 7, 5}, {1, 1, 3, 3, 3}, tensor{1}, tensor{0}, tensor{1}, 1, data_types::u8, format::b_fs_zyx_fsv16, data_types::i8, format::oizyx, data_types::f32, format::bfzyx +#define CASE_DECONV_U8S8_3D_3 {1, 16, 4, 5, 3}, {1, 32, 4, 5, 3}, {1, 1, 1, 1, 1}, tensor{1}, tensor{0}, tensor{1}, 1, data_types::u8, format::b_fs_zyx_fsv16, data_types::i8, format::oizyx, data_types::f32, format::bfzyx +#define CASE_DECONV_U8S8_3D_4 {1, 32, 4, 5, 3}, {1, 32, 4, 5, 3}, {1, 1, 3, 3, 3}, tensor{1}, tensor{0, 0, -1, -1, -1}, tensor{1}, 32, data_types::u8, format::b_fs_zyx_fsv16, data_types::i8, format::goizyx, data_types::f32, format::bfzyx +#define CASE_DECONV_U8S8_3D_5 {1, 15, 4, 5, 3}, {1, 30, 9, 11, 7}, {1, 1, 3, 3, 3}, tensor{1, 1, 2, 2, 2}, tensor{0}, tensor{1}, 1, data_types::u8, format::bfzyx, data_types::i8, format::oizyx, data_types::f32, format::bfzyx +#define CASE_DECONV_U8S8_3D_6 {1, 16, 4, 5, 3}, {1, 32, 9, 11, 7}, {1, 1, 3, 3, 3}, tensor{1, 1, 2, 2, 2}, tensor{0}, tensor{1}, 1, data_types::u8, format::b_fs_zyx_fsv16, data_types::i8, format::oizyx, data_types::f32, format::bfzyx +#define CASE_DECONV_U8S8_3D_7 {1, 16, 4, 5, 3}, {1, 32, 7, 9, 5}, {1, 1, 1, 1, 1}, tensor{1, 1, 2, 2, 2}, tensor{0}, tensor{1}, 1, data_types::u8, format::b_fs_zyx_fsv16, data_types::i8, format::oizyx, data_types::f32, format::bfzyx +#define CASE_DECONV_U8S8_3D_8 {1, 32, 4, 5, 3}, {1, 32, 7, 9, 5}, {1, 1, 3, 3, 3}, tensor{1, 1, 2, 2, 2}, tensor{0, 0, -1, -1, -1}, tensor{1}, 32, data_types::u8, format::b_fs_zyx_fsv16, data_types::i8, format::goizyx, data_types::f32, format::bfzyx + +class DeconvolutionFusingTest : public ::WeightsPrimitiveFusingTest {}; + +class deconv_actv : public DeconvolutionFusingTest {}; +TEST_P(deconv_actv, basic) { + auto p = GetParam(); + create_topologies( + input_layout("input", get_input_layout(p)), + data("weights", get_mem(get_weights_layout(p))), + deconvolution("deconv", "input", { "weights" }, p.groups, p.stride, p.pad), + activation("act", "deconv", activation_func::relu), + reorder("out", "act", p.default_format, data_types::f32) + ); + // Need much higher tolerance because of deconvolution -> convolution optimization + tolerance = 1.f; + execute(p); +} + +INSTANTIATE_TEST_CASE_P(fusings_gpu, deconv_actv, + ::testing::ValuesIn(std::vector{ + deconv_test_params{ CASE_DECONV_FP32_1, 2, 3 }, + deconv_test_params{ CASE_DECONV_FP32_2, 2, 3 }, + deconv_test_params{ CASE_DECONV_FP32_3, 2, 3 }, + deconv_test_params{ CASE_DECONV_FP32_4, 2, 3 }, + deconv_test_params{ CASE_DECONV_FP32_5, 2, 3 }, + deconv_test_params{ CASE_DECONV_FP32_6, 2, 3 }, + deconv_test_params{ CASE_DECONV_FP32_7, 2, 3 }, + deconv_test_params{ CASE_DECONV_FP32_8, 2, 3 }, + + deconv_test_params{ CASE_DECONV_FP16_1, 2, 3 }, + deconv_test_params{ CASE_DECONV_FP16_2, 2, 3 }, + deconv_test_params{ CASE_DECONV_FP16_3, 2, 3 }, + deconv_test_params{ CASE_DECONV_FP16_4, 2, 3 }, + deconv_test_params{ CASE_DECONV_FP16_5, 2, 3 }, + deconv_test_params{ CASE_DECONV_FP16_6, 2, 3 }, + deconv_test_params{ CASE_DECONV_FP16_7, 2, 3 }, + deconv_test_params{ CASE_DECONV_FP16_8, 2, 3 }, + + deconv_test_params{ CASE_DECONV_U8S8_1, 2, 3 }, + deconv_test_params{ CASE_DECONV_U8S8_2, 2, 3 }, + deconv_test_params{ CASE_DECONV_U8S8_3, 2, 3 }, + deconv_test_params{ CASE_DECONV_U8S8_4, 2, 3 }, + deconv_test_params{ CASE_DECONV_U8S8_5, 2, 3 }, + deconv_test_params{ CASE_DECONV_U8S8_6, 2, 3 }, + deconv_test_params{ CASE_DECONV_U8S8_7, 2, 3 }, + deconv_test_params{ CASE_DECONV_U8S8_8, 2, 3 }, + + deconv_test_params{ CASE_DECONV_S8S8_1, 2, 3 }, + deconv_test_params{ CASE_DECONV_S8S8_2, 2, 3 }, + deconv_test_params{ CASE_DECONV_S8S8_3, 2, 3 }, + deconv_test_params{ CASE_DECONV_S8S8_4, 2, 3 }, + deconv_test_params{ CASE_DECONV_S8S8_5, 2, 3 }, + deconv_test_params{ CASE_DECONV_S8S8_6, 2, 3 }, + deconv_test_params{ CASE_DECONV_S8S8_7, 2, 3 }, + deconv_test_params{ CASE_DECONV_S8S8_8, 2, 3 }, + + deconv_test_params{ CASE_DECONV_FP32_3D_1, 2, 3 }, + deconv_test_params{ CASE_DECONV_FP32_3D_2, 2, 3 }, + deconv_test_params{ CASE_DECONV_FP32_3D_3, 2, 3 }, + deconv_test_params{ CASE_DECONV_FP32_3D_4, 2, 3 }, + deconv_test_params{ CASE_DECONV_FP32_3D_5, 2, 3 }, + deconv_test_params{ CASE_DECONV_FP32_3D_6, 2, 3 }, + deconv_test_params{ CASE_DECONV_FP32_3D_7, 2, 3 }, + deconv_test_params{ CASE_DECONV_FP32_3D_8, 2, 3 }, + deconv_test_params{ CASE_DECONV_FP32_3D_9, 2, 3 }, + + deconv_test_params{ CASE_DECONV_FP16_3D_1, 2, 3 }, + deconv_test_params{ CASE_DECONV_FP16_3D_2, 2, 3 }, + deconv_test_params{ CASE_DECONV_FP16_3D_3, 2, 3 }, + deconv_test_params{ CASE_DECONV_FP16_3D_4, 2, 3 }, + deconv_test_params{ CASE_DECONV_FP16_3D_5, 2, 3 }, + deconv_test_params{ CASE_DECONV_FP16_3D_6, 2, 3 }, + deconv_test_params{ CASE_DECONV_FP16_3D_7, 2, 3 }, + deconv_test_params{ CASE_DECONV_FP16_3D_8, 2, 3 }, + deconv_test_params{ CASE_DECONV_FP16_3D_9, 2, 3 }, + + deconv_test_params{ CASE_DECONV_U8S8_3D_1, 2, 3 }, + deconv_test_params{ CASE_DECONV_U8S8_3D_2, 2, 3 }, + deconv_test_params{ CASE_DECONV_U8S8_3D_3, 2, 3 }, + deconv_test_params{ CASE_DECONV_U8S8_3D_4, 2, 3 }, + deconv_test_params{ CASE_DECONV_U8S8_3D_5, 2, 3 }, + deconv_test_params{ CASE_DECONV_U8S8_3D_6, 2, 3 }, + deconv_test_params{ CASE_DECONV_U8S8_3D_7, 2, 3 }, + deconv_test_params{ CASE_DECONV_U8S8_3D_8, 2, 3 }, + + deconv_test_params{ CASE_DECONV_S8S8_3D_1, 2, 3 }, + deconv_test_params{ CASE_DECONV_S8S8_3D_2, 2, 3 }, + deconv_test_params{ CASE_DECONV_S8S8_3D_3, 2, 3 }, + deconv_test_params{ CASE_DECONV_S8S8_3D_4, 2, 3 }, + deconv_test_params{ CASE_DECONV_S8S8_3D_5, 2, 3 }, + deconv_test_params{ CASE_DECONV_S8S8_3D_6, 2, 3 }, + deconv_test_params{ CASE_DECONV_S8S8_3D_7, 2, 3 }, + deconv_test_params{ CASE_DECONV_S8S8_3D_8, 2, 3 }, +}), ); + +class deconv_actv_eltw_actv : public DeconvolutionFusingTest {}; +TEST_P(deconv_actv_eltw_actv, basic) { + auto p = GetParam(); + create_topologies( + input_layout("input", get_input_layout(p)), + data("weights", get_mem(get_weights_layout(p))), + data("eltw_data", get_mem(get_output_layout(p))), + deconvolution("deconv", "input", { "weights" }, p.groups, p.stride, p.pad), + activation("act1", "deconv", activation_func::relu), + eltwise("eltw", {"act1", "eltw_data"}, eltwise_mode::sum), + activation("act2", "eltw", activation_func::relu), + reorder("out", "act2", p.default_format, data_types::f32) + ); + // Need much higher tolerance because of deconvolution -> convolution optimization + tolerance = 1.f; + execute(p); +} + +INSTANTIATE_TEST_CASE_P(fusings_gpu, deconv_actv_eltw_actv, + ::testing::ValuesIn(std::vector{ + // Some fusings disabled under deconvolution -> convolution optimization + deconv_test_params{ CASE_DECONV_FP32_1, 3, 5 }, + deconv_test_params{ CASE_DECONV_FP32_2, 2, 5 }, + deconv_test_params{ CASE_DECONV_FP32_3, 2, 5 }, + deconv_test_params{ CASE_DECONV_FP32_4, 2, 5 }, + deconv_test_params{ CASE_DECONV_FP32_5, 2, 5 }, + deconv_test_params{ CASE_DECONV_FP32_6, 2, 5 }, + deconv_test_params{ CASE_DECONV_FP32_7, 2, 5 }, + deconv_test_params{ CASE_DECONV_FP32_8, 2, 5 }, + + deconv_test_params{ CASE_DECONV_FP16_1, 3, 5 }, + deconv_test_params{ CASE_DECONV_FP16_2, 2, 5 }, + deconv_test_params{ CASE_DECONV_FP16_3, 2, 5 }, + deconv_test_params{ CASE_DECONV_FP16_4, 2, 5 }, + deconv_test_params{ CASE_DECONV_FP16_5, 2, 5 }, + deconv_test_params{ CASE_DECONV_FP16_6, 2, 5 }, + deconv_test_params{ CASE_DECONV_FP16_7, 2, 5 }, + deconv_test_params{ CASE_DECONV_FP16_8, 2, 5 }, + + deconv_test_params{ CASE_DECONV_U8S8_1, 2, 5 }, + deconv_test_params{ CASE_DECONV_U8S8_2, 2, 5 }, + deconv_test_params{ CASE_DECONV_U8S8_3, 2, 5 }, + deconv_test_params{ CASE_DECONV_U8S8_4, 2, 5 }, + deconv_test_params{ CASE_DECONV_U8S8_5, 2, 5 }, + deconv_test_params{ CASE_DECONV_U8S8_6, 2, 5 }, + deconv_test_params{ CASE_DECONV_U8S8_7, 2, 5 }, + deconv_test_params{ CASE_DECONV_U8S8_8, 2, 5 }, + + deconv_test_params{ CASE_DECONV_S8S8_1, 2, 5 }, + deconv_test_params{ CASE_DECONV_S8S8_2, 2, 5 }, + deconv_test_params{ CASE_DECONV_S8S8_3, 2, 5 }, + deconv_test_params{ CASE_DECONV_S8S8_4, 2, 5 }, + deconv_test_params{ CASE_DECONV_S8S8_5, 2, 5 }, + deconv_test_params{ CASE_DECONV_S8S8_6, 2, 5 }, + deconv_test_params{ CASE_DECONV_S8S8_7, 2, 5 }, + deconv_test_params{ CASE_DECONV_S8S8_8, 2, 5 }, + + deconv_test_params{ CASE_DECONV_FP32_3D_1, 2, 5 }, + deconv_test_params{ CASE_DECONV_FP32_3D_2, 2, 5 }, + deconv_test_params{ CASE_DECONV_FP32_3D_3, 2, 5 }, + deconv_test_params{ CASE_DECONV_FP32_3D_4, 2, 5 }, + deconv_test_params{ CASE_DECONV_FP32_3D_5, 2, 5 }, + deconv_test_params{ CASE_DECONV_FP32_3D_6, 2, 5 }, + deconv_test_params{ CASE_DECONV_FP32_3D_7, 2, 5 }, + deconv_test_params{ CASE_DECONV_FP32_3D_8, 2, 5 }, + deconv_test_params{ CASE_DECONV_FP32_3D_9, 2, 5 }, + + deconv_test_params{ CASE_DECONV_FP16_3D_1, 2, 5 }, + deconv_test_params{ CASE_DECONV_FP16_3D_2, 2, 5 }, + deconv_test_params{ CASE_DECONV_FP16_3D_3, 2, 5 }, + deconv_test_params{ CASE_DECONV_FP16_3D_4, 2, 5 }, + deconv_test_params{ CASE_DECONV_FP16_3D_5, 2, 5 }, + deconv_test_params{ CASE_DECONV_FP16_3D_6, 2, 5 }, + deconv_test_params{ CASE_DECONV_FP16_3D_7, 2, 5 }, + deconv_test_params{ CASE_DECONV_FP16_3D_8, 2, 5 }, + deconv_test_params{ CASE_DECONV_FP16_3D_9, 2, 5 }, + + deconv_test_params{ CASE_DECONV_U8S8_3D_1, 2, 5 }, + deconv_test_params{ CASE_DECONV_U8S8_3D_2, 2, 5 }, + deconv_test_params{ CASE_DECONV_U8S8_3D_3, 2, 5 }, + deconv_test_params{ CASE_DECONV_U8S8_3D_4, 2, 5 }, + deconv_test_params{ CASE_DECONV_U8S8_3D_5, 2, 5 }, + deconv_test_params{ CASE_DECONV_U8S8_3D_6, 2, 5 }, + deconv_test_params{ CASE_DECONV_U8S8_3D_7, 2, 5 }, + deconv_test_params{ CASE_DECONV_U8S8_3D_8, 2, 5 }, + + deconv_test_params{ CASE_DECONV_S8S8_3D_1, 2, 5 }, + deconv_test_params{ CASE_DECONV_S8S8_3D_2, 2, 5 }, + deconv_test_params{ CASE_DECONV_S8S8_3D_3, 2, 5 }, + deconv_test_params{ CASE_DECONV_S8S8_3D_4, 2, 5 }, + deconv_test_params{ CASE_DECONV_S8S8_3D_5, 2, 5 }, + deconv_test_params{ CASE_DECONV_S8S8_3D_6, 2, 5 }, + deconv_test_params{ CASE_DECONV_S8S8_3D_7, 2, 5 }, + deconv_test_params{ CASE_DECONV_S8S8_3D_8, 2, 5 }, +}), ); + +class deconv_scale_actv_quant_i8 : public DeconvolutionFusingTest {}; +TEST_P(deconv_scale_actv_quant_i8, basic) { + auto p = GetParam(); + create_topologies( + input_layout("input", get_input_layout(p)), + data("weights", get_mem(get_weights_layout(p))), + data("scale_data", get_mem(get_per_channel_layout(p), 1.f/p.kernel.count())), + data("in_lo", get_mem(get_per_channel_layout(p), min_random, 0)), + data("in_hi", get_mem(get_per_channel_layout(p), 1, max_random)), + data("out_lo", get_mem(get_single_element_layout(p), -127)), + data("out_hi", get_mem(get_single_element_layout(p), 127)), + deconvolution("deconv", "input", { "weights" }, p.groups, p.stride, p.pad), + scale("scale", "deconv", "scale_data"), + activation("actv", "scale", activation_func::softsign), + quantize("quant", "actv", "in_lo", "in_hi", "out_lo", "out_hi", 255, data_types::i8), + reorder("out", "quant", p.default_format, data_types::f32) + ); + + tolerance = 1.f; + execute(p); +} + +INSTANTIATE_TEST_CASE_P(fusings_gpu, deconv_scale_actv_quant_i8, + ::testing::ValuesIn(std::vector{ + // Some fusings disabled under deconvolution -> convolution optimization + // Quantize fusing disabled for fp16/fp32 for performance reasons + // deconv_test_params{ CASE_DECONV_FP32_1, 4, 5 }, FIXME Failure due to activation + quantization fusing + deconv_test_params{ CASE_DECONV_FP32_2, 3, 5 }, + deconv_test_params{ CASE_DECONV_FP32_3, 3, 5 }, + deconv_test_params{ CASE_DECONV_FP32_4, 3, 5 }, + deconv_test_params{ CASE_DECONV_FP32_5, 3, 5 }, + deconv_test_params{ CASE_DECONV_FP32_6, 3, 5 }, + deconv_test_params{ CASE_DECONV_FP32_7, 3, 5 }, + deconv_test_params{ CASE_DECONV_FP32_8, 3, 5 }, + + deconv_test_params{ CASE_DECONV_FP16_1, 4, 5 }, + deconv_test_params{ CASE_DECONV_FP16_2, 3, 5 }, + deconv_test_params{ CASE_DECONV_FP16_3, 3, 5 }, + deconv_test_params{ CASE_DECONV_FP16_4, 3, 5 }, + deconv_test_params{ CASE_DECONV_FP16_5, 3, 5 }, + deconv_test_params{ CASE_DECONV_FP16_6, 3, 5 }, + deconv_test_params{ CASE_DECONV_FP16_7, 3, 5 }, + deconv_test_params{ CASE_DECONV_FP16_8, 3, 5 }, + + deconv_test_params{ CASE_DECONV_U8S8_1, 2, 5 }, + deconv_test_params{ CASE_DECONV_U8S8_2, 2, 5 }, + deconv_test_params{ CASE_DECONV_U8S8_3, 2, 5 }, + deconv_test_params{ CASE_DECONV_U8S8_4, 2, 5 }, + deconv_test_params{ CASE_DECONV_U8S8_5, 2, 5 }, + deconv_test_params{ CASE_DECONV_U8S8_6, 2, 5 }, + deconv_test_params{ CASE_DECONV_U8S8_7, 2, 5 }, + deconv_test_params{ CASE_DECONV_U8S8_8, 2, 5 }, + + deconv_test_params{ CASE_DECONV_S8S8_1, 2, 5 }, + deconv_test_params{ CASE_DECONV_S8S8_2, 2, 5 }, + deconv_test_params{ CASE_DECONV_S8S8_3, 2, 5 }, + deconv_test_params{ CASE_DECONV_S8S8_4, 2, 5 }, + deconv_test_params{ CASE_DECONV_S8S8_5, 2, 5 }, + deconv_test_params{ CASE_DECONV_S8S8_6, 2, 5 }, + deconv_test_params{ CASE_DECONV_S8S8_7, 2, 5 }, + deconv_test_params{ CASE_DECONV_S8S8_8, 2, 5 }, + + deconv_test_params{ CASE_DECONV_FP32_3D_1, 3, 5 }, + deconv_test_params{ CASE_DECONV_FP32_3D_2, 3, 5 }, + deconv_test_params{ CASE_DECONV_FP32_3D_3, 3, 5 }, + deconv_test_params{ CASE_DECONV_FP32_3D_4, 3, 5 }, + deconv_test_params{ CASE_DECONV_FP32_3D_5, 3, 5 }, + deconv_test_params{ CASE_DECONV_FP32_3D_6, 3, 5 }, + deconv_test_params{ CASE_DECONV_FP32_3D_7, 3, 5 }, + deconv_test_params{ CASE_DECONV_FP32_3D_8, 3, 5 }, + // FIXME no quantize implementation for bs_fs_yx_bsv16_fsv16 format AND add_required_reorders pass completely ruins data types + // add_required_reorders pass tries to reorder everything to output type if no format exists, this ruins fp32 -> int8 quantize + // deconv_test_params{ CASE_DECONV_FP32_3D_9, 3, 5 }, + + deconv_test_params{ CASE_DECONV_FP16_3D_1, 3, 5 }, + deconv_test_params{ CASE_DECONV_FP16_3D_2, 3, 5 }, + deconv_test_params{ CASE_DECONV_FP16_3D_3, 3, 5 }, + deconv_test_params{ CASE_DECONV_FP16_3D_4, 3, 5 }, + deconv_test_params{ CASE_DECONV_FP16_3D_5, 3, 5 }, + deconv_test_params{ CASE_DECONV_FP16_3D_6, 3, 5 }, + deconv_test_params{ CASE_DECONV_FP16_3D_7, 3, 5 }, + deconv_test_params{ CASE_DECONV_FP16_3D_8, 3, 5 }, + // deconv_test_params{ CASE_DECONV_FP16_3D_9, 3, 5 }, + + deconv_test_params{ CASE_DECONV_U8S8_3D_1, 2, 5 }, + deconv_test_params{ CASE_DECONV_U8S8_3D_2, 2, 5 }, + deconv_test_params{ CASE_DECONV_U8S8_3D_3, 2, 5 }, + deconv_test_params{ CASE_DECONV_U8S8_3D_4, 2, 5 }, + deconv_test_params{ CASE_DECONV_U8S8_3D_5, 2, 5 }, + deconv_test_params{ CASE_DECONV_U8S8_3D_6, 2, 5 }, + deconv_test_params{ CASE_DECONV_U8S8_3D_7, 2, 5 }, + deconv_test_params{ CASE_DECONV_U8S8_3D_8, 2, 5 }, + + deconv_test_params{ CASE_DECONV_S8S8_3D_1, 2, 5 }, + deconv_test_params{ CASE_DECONV_S8S8_3D_2, 2, 5 }, + deconv_test_params{ CASE_DECONV_S8S8_3D_3, 2, 5 }, + deconv_test_params{ CASE_DECONV_S8S8_3D_4, 2, 5 }, + deconv_test_params{ CASE_DECONV_S8S8_3D_5, 2, 5 }, + deconv_test_params{ CASE_DECONV_S8S8_3D_6, 2, 5 }, + deconv_test_params{ CASE_DECONV_S8S8_3D_7, 2, 5 }, + deconv_test_params{ CASE_DECONV_S8S8_3D_8, 2, 5 }, +}), ); + +class deconv_scale_actv_quant_u8_eltw_scale_actv_quant_i8 : public DeconvolutionFusingTest {}; +TEST_P(deconv_scale_actv_quant_u8_eltw_scale_actv_quant_i8, basic) { + auto p = GetParam(); + create_topologies( + input_layout("input", get_input_layout(p)), + data("weights", get_mem(get_weights_layout(p))), + data("scale1_data", get_mem(get_per_channel_layout(p), 1.f / p.kernel.count())), + data("in1_lo", get_mem(get_per_channel_layout(p), min_random, 0)), + data("in1_hi", get_mem(get_per_channel_layout(p), 1, max_random)), + data("out1_lo", get_mem(get_single_element_layout(p), 0)), + data("out1_hi", get_mem(get_single_element_layout(p), 255)), + data("eltw_data", get_mem(layout(p.default_type, p.input_format, p.out_shape))), + data("scale2_data", get_mem(get_per_channel_layout(p), 1.f / p.kernel.count())), + data("in2_lo", get_mem(get_per_channel_layout(p), min_random, 0)), + data("in2_hi", get_mem(get_per_channel_layout(p), 1, max_random)), + data("out2_lo", get_mem(get_single_element_layout(p), -127)), + data("out2_hi", get_mem(get_single_element_layout(p), 127)), + deconvolution("deconv", "input", { "weights" }, p.groups, p.stride, p.pad), + scale("scale1", "deconv", "scale1_data"), + activation("actv1", "scale1", activation_func::relu), + quantize("quant1", "actv1", "in1_lo", "in1_hi", "out1_lo", "out1_hi", 256, data_types::u8), + eltwise("eltw", {"quant1", "eltw_data"}, eltwise_mode::sum, p.default_type), + scale("scale2", "eltw", "scale2_data"), + activation("actv2", "scale2", activation_func::relu), + quantize("quant2", "actv2", "in2_lo", "in2_hi", "out2_lo", "out2_hi", 255, data_types::i8), + reorder("out", "quant2", p.default_format, data_types::f32) + ); + + tolerance = 1.f; + execute(p); +} + +INSTANTIATE_TEST_CASE_P(fusings_gpu, deconv_scale_actv_quant_u8_eltw_scale_actv_quant_i8, + ::testing::ValuesIn(std::vector{ + // Some fusings disabled under deconvolution -> convolution optimization + // Quantize fusing disabled for fp16/fp32 for performance reasons + // deconv_test_params{ CASE_DECONV_FP32_1, 7, 9 }, FIXME Failure due to activation + quantization fusing + deconv_test_params{ CASE_DECONV_FP32_2, 6, 9 }, + deconv_test_params{ CASE_DECONV_FP32_3, 6, 9 }, + deconv_test_params{ CASE_DECONV_FP32_4, 6, 9 }, + deconv_test_params{ CASE_DECONV_FP32_5, 6, 9 }, + deconv_test_params{ CASE_DECONV_FP32_6, 6, 9 }, + deconv_test_params{ CASE_DECONV_FP32_7, 6, 9 }, + deconv_test_params{ CASE_DECONV_FP32_8, 6, 9 }, + + deconv_test_params{ CASE_DECONV_FP16_1, 7, 9 }, + deconv_test_params{ CASE_DECONV_FP16_2, 6, 9 }, + deconv_test_params{ CASE_DECONV_FP16_3, 6, 9 }, + deconv_test_params{ CASE_DECONV_FP16_4, 6, 9 }, + deconv_test_params{ CASE_DECONV_FP16_5, 6, 9 }, + deconv_test_params{ CASE_DECONV_FP16_6, 6, 9 }, + deconv_test_params{ CASE_DECONV_FP16_7, 6, 9 }, + deconv_test_params{ CASE_DECONV_FP16_8, 6, 9 }, + + deconv_test_params{ CASE_DECONV_U8S8_1, 2, 9 }, + deconv_test_params{ CASE_DECONV_U8S8_2, 2, 9 }, + deconv_test_params{ CASE_DECONV_U8S8_3, 2, 9 }, + deconv_test_params{ CASE_DECONV_U8S8_4, 2, 9 }, + deconv_test_params{ CASE_DECONV_U8S8_5, 2, 9 }, + deconv_test_params{ CASE_DECONV_U8S8_6, 2, 9 }, + deconv_test_params{ CASE_DECONV_U8S8_7, 2, 9 }, + deconv_test_params{ CASE_DECONV_U8S8_8, 2, 9 }, + + deconv_test_params{ CASE_DECONV_S8S8_1, 2, 9 }, + deconv_test_params{ CASE_DECONV_S8S8_2, 2, 9 }, + deconv_test_params{ CASE_DECONV_S8S8_3, 2, 9 }, + deconv_test_params{ CASE_DECONV_S8S8_4, 2, 9 }, + deconv_test_params{ CASE_DECONV_S8S8_5, 2, 9 }, + deconv_test_params{ CASE_DECONV_S8S8_6, 2, 9 }, + deconv_test_params{ CASE_DECONV_S8S8_7, 2, 9 }, + deconv_test_params{ CASE_DECONV_S8S8_8, 2, 9 }, + + // deconv_test_params{ CASE_DECONV_FP32_3D_1, 6, 9 }, FIXME Failure due to activation + quantization fusing + deconv_test_params{ CASE_DECONV_FP32_3D_2, 6, 9 }, + deconv_test_params{ CASE_DECONV_FP32_3D_3, 6, 9 }, + deconv_test_params{ CASE_DECONV_FP32_3D_4, 6, 9 }, + deconv_test_params{ CASE_DECONV_FP32_3D_5, 6, 9 }, + deconv_test_params{ CASE_DECONV_FP32_3D_6, 6, 9 }, + deconv_test_params{ CASE_DECONV_FP32_3D_7, 6, 9 }, + deconv_test_params{ CASE_DECONV_FP32_3D_8, 6, 9 }, + // deconv_test_params{ CASE_DECONV_FP32_3D_9, 6, 9 }, + + deconv_test_params{ CASE_DECONV_FP16_3D_1, 6, 9 }, + deconv_test_params{ CASE_DECONV_FP16_3D_2, 6, 9 }, + deconv_test_params{ CASE_DECONV_FP16_3D_3, 6, 9 }, + deconv_test_params{ CASE_DECONV_FP16_3D_4, 6, 9 }, + deconv_test_params{ CASE_DECONV_FP16_3D_5, 6, 9 }, + deconv_test_params{ CASE_DECONV_FP16_3D_6, 6, 9 }, + deconv_test_params{ CASE_DECONV_FP16_3D_7, 6, 9 }, + deconv_test_params{ CASE_DECONV_FP16_3D_8, 6, 9 }, + // deconv_test_params{ CASE_DECONV_FP16_3D_9, 6, 9 }, + + deconv_test_params{ CASE_DECONV_U8S8_3D_1, 2, 9 }, + deconv_test_params{ CASE_DECONV_U8S8_3D_2, 2, 9 }, + deconv_test_params{ CASE_DECONV_U8S8_3D_3, 2, 9 }, + deconv_test_params{ CASE_DECONV_U8S8_3D_4, 2, 9 }, + deconv_test_params{ CASE_DECONV_U8S8_3D_5, 2, 9 }, + deconv_test_params{ CASE_DECONV_U8S8_3D_6, 2, 9 }, + deconv_test_params{ CASE_DECONV_U8S8_3D_7, 2, 9 }, + deconv_test_params{ CASE_DECONV_U8S8_3D_8, 2, 9 }, + + deconv_test_params{ CASE_DECONV_S8S8_3D_1, 2, 9 }, + deconv_test_params{ CASE_DECONV_S8S8_3D_2, 2, 9 }, + deconv_test_params{ CASE_DECONV_S8S8_3D_3, 2, 9 }, + deconv_test_params{ CASE_DECONV_S8S8_3D_4, 2, 9 }, + deconv_test_params{ CASE_DECONV_S8S8_3D_5, 2, 9 }, + deconv_test_params{ CASE_DECONV_S8S8_3D_6, 2, 9 }, + deconv_test_params{ CASE_DECONV_S8S8_3D_7, 2, 9 }, + deconv_test_params{ CASE_DECONV_S8S8_3D_8, 2, 9 }, +}), ); diff --git a/inference-engine/thirdparty/clDNN/tests/test_utils/test_utils.h b/inference-engine/thirdparty/clDNN/tests/test_utils/test_utils.h index 230ded1c8fb..5ab013510ca 100644 --- a/inference-engine/thirdparty/clDNN/tests/test_utils/test_utils.h +++ b/inference-engine/thirdparty/clDNN/tests/test_utils/test_utils.h @@ -76,6 +76,8 @@ template using VVVVF = std::vector>; // batch of 3d feature maps template using VVVVVF = std::vector>; // split of bfyx filters +template +using VVVVVVF = std::vector>; // split of bfyx filters template inline VF flatten_4d(cldnn::format input_format, VVVVF &data) { @@ -173,6 +175,14 @@ std::vector>>>> generate_rand return v; } +template +VVVVVVF generate_random_6d(size_t a, size_t b, size_t c, size_t d, size_t e, size_t f, int min, int max, int k = 8) { + VVVVVVF v(a); + for (size_t i = 0; i < a; ++i) + v[i] = generate_random_5d(b, c, d, e, f, min, max, k); + return v; +} + template void set_value(const cldnn::pointer& ptr, uint32_t index, T value) { ptr[index] = value; } template T get_value(const cldnn::pointer& ptr, uint32_t index) { return ptr[index]; } diff --git a/inference-engine/thirdparty/mkl-dnn/src/cpu/gemm_bf16_convolution.cpp b/inference-engine/thirdparty/mkl-dnn/src/cpu/gemm_bf16_convolution.cpp index 963f7b37902..c39e52517d6 100644 --- a/inference-engine/thirdparty/mkl-dnn/src/cpu/gemm_bf16_convolution.cpp +++ b/inference-engine/thirdparty/mkl-dnn/src/cpu/gemm_bf16_convolution.cpp @@ -44,7 +44,9 @@ gemm_bf16_convolution_fwd_t::pp_ker_t::pp_ker_t( , do_sum_(false) , max_data_reg_idx_(31), max_unroll_(12), compute_reg_step_(1) , data_reg_base_idx_(0) - , bf16_emu_(nullptr), eltwise_injector_(nullptr) + , bf16_emu_(nullptr) + , attr_(pd->attr()) + , jit_eltwise_injectors_(0) { using namespace types; using namespace Xbyak; @@ -55,14 +57,20 @@ gemm_bf16_convolution_fwd_t::pp_ker_t::pp_ker_t( const auto dst_md = memory_desc_wrapper(pd->dst_pd()); dst_os_stride_ = dst_md.blk_off(0, 0, 0, 1); - + bool do_depthwise_ = false; auto &post_ops = pd->attr()->post_ops_; - const int eltwise_ind = post_ops.find(primitive_kind::eltwise); - do_eltwise_ = eltwise_ind != -1; - if (do_eltwise_) - eltwise_injector_ = new jit_uni_eltwise_injector_f32( - this, post_ops.entry_[eltwise_ind].eltwise, true, - reserved_eltwise_gpr, reserved_eltwise_maskr); + for (int i = 0; i < post_ops.len_; i++) { + auto& post_op = post_ops.entry_[i]; + if (post_op.is_eltwise()) { + jit_eltwise_injectors_.push_back(new jit_uni_eltwise_injector_f32(this, + post_op.eltwise.alg, + post_op.eltwise.alpha, + post_op.eltwise.beta, + true, reserved_eltwise_gpr, reserved_eltwise_maskr)); + } else if (post_op.is_depthwise()) { + do_depthwise_ = true; + } + } do_sum_ = dst_data_type != data_type::f32 && post_ops.contain(primitive_kind::sum, 0); @@ -75,6 +83,9 @@ gemm_bf16_convolution_fwd_t::pp_ker_t::pp_ker_t( if (do_bias_) vreg_bias = Zmm(data_reg_base_idx_++); + if (do_depthwise_) + vreg_dw = Zmm(data_reg_base_idx_++); + vlen_ = cpu_isa_traits::vlen / sizeof(float); if (!mayiuse(avx512_core_bf16)) { @@ -110,6 +121,8 @@ void gemm_bf16_convolution_fwd_t::pp_ker_t::generate() mov(reg_len, ptr[reg_param + PARAM_OFF(spatial_length)]); mov(reg_oc_iter, ptr[reg_param + PARAM_OFF(oc_work)]); + mov(reg_oc_offset, ptr[reg_param + PARAM_OFF(oc_offset)]); + if (do_sum_) vbroadcastss(vreg_sum_scale, ptr[reg_param + PARAM_OFF(sum_scale)]); #undef PARAM_OFF @@ -153,8 +166,38 @@ void gemm_bf16_convolution_fwd_t::pp_ker_t::generate() vfmadd231ps(vreg_dst(idx), vreg_prev_dst(idx), vreg_sum_scale); } - if (do_eltwise_) - eltwise_injector_->compute_vector(vreg_dst_idx(idx)); + int eltwise_inj_idx = 0; + const auto& p = attr_->post_ops_; + for (int i = 0; i < p.len_; i++) { + auto& post_op = p.entry_[i]; + if (post_op.is_eltwise()) { + jit_eltwise_injectors_[eltwise_inj_idx]->compute_vector(vreg_dst_idx(idx)); + eltwise_inj_idx++; + } else if (post_op.is_depthwise()) { + mov(reg_dw, reinterpret_cast(post_op.depthwise.weights_data)); + lea(reg_dw, ptr[reg_dw + reg_oc_offset]); + + switch (post_op.depthwise.alg) { + case alg_kind::depthwise_scale_shift: { + vbroadcastss(vreg_dw, ptr[reg_dw]); + vmulps(vreg_dst(idx), vreg_dst(idx), vreg_dw); + mov(reg_dw, reinterpret_cast(post_op.depthwise.biases_data)); + lea(reg_dw, ptr[reg_dw + reg_oc_offset]); + vbroadcastss(vreg_dw, ptr[reg_dw]); + vaddps(vreg_dst(idx), vreg_dst(idx), vreg_dw); + break; + } + case alg_kind::depthwise_prelu: { + vpxord(vreg_dw, vreg_dw, vreg_dw); + vcmpps(kmask, vreg_dst(idx), vreg_dw, _cmp_lt_os); + vbroadcastss(vreg_dw, ptr[reg_dw]); + vmulps(vreg_dst(idx) | kmask, vreg_dst(idx), vreg_dw); + break; + } + default: assert(!"unsupported depthwise algorithm"); + } + } + } if (dst_data_type == data_type::bf16) { // TODO: implement store by zmm registers for bf16 @@ -230,6 +273,8 @@ void gemm_bf16_convolution_fwd_t::pp_ker_t::generate() if (do_bias_) add(reg_bias, sizeof(acc_data_t)); + add(reg_oc_offset, sizeof(acc_data_t)); + dec(reg_oc_iter); jnz(oc_loop, T_NEAR); // oc_loop end @@ -237,17 +282,17 @@ void gemm_bf16_convolution_fwd_t::pp_ker_t::generate() postamble(); - if (do_eltwise_) - eltwise_injector_->prepare_table(); + for (auto& inj : jit_eltwise_injectors_) + inj->prepare_table(); ker_ = getCode(); } template void gemm_bf16_convolution_fwd_t::pp_ker_t::operator () - (dst_data_t *dst, const acc_data_t *acc, const acc_data_t *bias, + (dst_data_t *dst, const acc_data_t *acc, const acc_data_t *bias, size_t g_offset, float sum_scale, size_t dst_stride_in_elements, - size_t acc_stride_in_elements, size_t len, bool do_parallel) + size_t acc_stride_in_elements, size_t len, bool do_parallel, const post_ops_t& p) { assert(ker_); if (len == 0) @@ -260,7 +305,7 @@ void gemm_bf16_convolution_fwd_t::pp_ker_t::operator () ker_args args; args.acc = acc + start_oc * acc_stride_in_elements; args.dst = dst + start_oc * dst_stride_in_elements; - args.bias = bias + start_oc; + args.bias = bias + start_oc + g_offset; args.sum_scale = sum_scale; args.dst_stride_in_bytes = dst_stride_in_elements * sizeof(dst_data_t); @@ -268,6 +313,8 @@ void gemm_bf16_convolution_fwd_t::pp_ker_t::operator () acc_stride_in_elements * sizeof(acc_data_t); args.spatial_length = len; args.oc_work = end_oc - start_oc; + args.oc_offset = (start_oc + g_offset) * sizeof(acc_data_t); + ker_(&args); } }); @@ -287,6 +334,8 @@ void gemm_bf16_convolution_fwd_t::execute_forward() const { : nullptr; const jit_gemm_conv_conf_t &jcp = this->pd()->jcp_; + auto src_offset = this->pd()->src_pd()->desc()->layout_desc.blocking.offset_padding; + auto dst_offset = this->pd()->dst_pd()->desc()->layout_desc.blocking.offset_padding; float *bias = nullptr; if (pd()->desc()->bias_desc.data_type == data_type::bf16) { @@ -337,9 +386,9 @@ void gemm_bf16_convolution_fwd_t::execute_forward() const { for (size_t iwork = start; iwork < end; ++iwork) { int oh = ohb * jcp.oh_block; int ow = owb * jcp.ow_block; - const src_data_t *_src = src + (n * jcp.ngroups + g) * src_step; + const src_data_t *_src = src + (n * jcp.ngroups + g) * src_step + src_offset; const wei_data_t *_weights = weights + g * weights_g_size; - dst_data_t *_dst_im = dst + (n * jcp.ngroups + g) * dst_step; + dst_data_t *_dst_im = dst + (n * jcp.ngroups + g) * dst_step + dst_offset; const int h_step = nstl::min(jcp.oh_block, jcp.oh - oh); const int w_step = nstl::min(jcp.ow_block, jcp.ow - ow); if (jcp.im2col_sz) { @@ -369,8 +418,8 @@ void gemm_bf16_convolution_fwd_t::execute_forward() const { if (this->pd()->is_postprocess_required()) { size_t acc_str = LDC; size_t dst_str = M; - (*pp_ker_)(dst_local, _acc, bias + g * jcp.oc, - sum_scale, dst_str, acc_str, m, jcp.nthr == 1); + (*pp_ker_)(dst_local, _acc, bias, g * jcp.oc, + sum_scale, dst_str, acc_str, m, jcp.nthr == 1, post_ops); } nd_iterator_step(g, jcp.ngroups, n, jcp.mb, od, jcp.od, ohb, nb_oh, diff --git a/inference-engine/thirdparty/mkl-dnn/src/cpu/gemm_bf16_convolution.hpp b/inference-engine/thirdparty/mkl-dnn/src/cpu/gemm_bf16_convolution.hpp index 23839c1cc08..ef17f5d9e84 100644 --- a/inference-engine/thirdparty/mkl-dnn/src/cpu/gemm_bf16_convolution.hpp +++ b/inference-engine/thirdparty/mkl-dnn/src/cpu/gemm_bf16_convolution.hpp @@ -119,17 +119,25 @@ struct gemm_bf16_convolution_fwd_t: public cpu_primitive_t { } virtual bool is_gemm_conv_format() const { - auto const &po = this->attr()->post_ops_; - auto is_eltwise = [&](int idx) - { return po.entry_[idx].is_eltwise(); }; - auto is_sum = [&](int idx) { return po.entry_[idx].is_sum(); }; + auto const &p = this->attr()->post_ops_; + auto all_post_ops_supported = [&]() { + bool ok = true; - switch (po.len_) { - case 0: return true; // no post_ops - case 1: return is_eltwise(0) || is_sum(0); // sum OR eltwise - case 2: return is_sum(0) && is_eltwise(1); // sum -> eltwise - default: return false; - } + for (int i = 0; i < p.len_; i++) { + ok = ok && utils::one_of(p.entry_[i].kind, primitive_kind::sum, primitive_kind::eltwise, primitive_kind::depthwise); + } + return ok; + }; + + auto contain = [&](mkldnn::impl::primitive_kind_t kind) { return p.find(kind) != -1; }; + auto position = [&](mkldnn::impl::primitive_kind_t kind) { return p.find(kind); }; + auto count = [&](mkldnn::impl::primitive_kind_t kind) { return p.count(kind); }; + + return all_post_ops_supported() && + count(primitive_kind::sum) <= 1 && + IMPLICATION(contain(primitive_kind::sum), position(primitive_kind::sum) == 0); + + return false; } }; @@ -174,12 +182,14 @@ private: ~pp_ker_t() { delete bf16_emu_; - delete eltwise_injector_; + for (auto inj : jit_eltwise_injectors_) + delete inj; + jit_eltwise_injectors_.clear(); } void operator()(dst_data_t *dst, const acc_data_t *acc, - const acc_data_t *bias, float sum_scale, - size_t dst_str, size_t acc_str, size_t len, bool do_parallel); + const acc_data_t *bias, size_t g_offset, float sum_scale, + size_t dst_str, size_t acc_str, size_t len, bool do_parallel, const post_ops_t& p); size_t dst_os_stride_; @@ -193,6 +203,7 @@ private: size_t acc_stride_in_bytes; size_t spatial_length; size_t oc_work; + size_t oc_offset; }; enum { @@ -215,10 +226,16 @@ private: Xbyak::Reg64 reg_dst_str = r13; Xbyak::Reg64 reg_acc_str = r14; + using Vmm = typename cpu_isa_traits::Vmm; + Xbyak::Reg64 reg_oc_offset = r10; + Xbyak::Reg64 reg_dw = r9; + Xbyak::Opmask kmask = k7; + post_ops_t post_ops_; + Xbyak::Reg64 reserved_eltwise_gpr = r10; Xbyak::Opmask reserved_eltwise_maskr = k2; - Xbyak::Zmm vreg_sum_scale, vreg_bias; + Xbyak::Zmm vreg_sum_scale, vreg_bias, vreg_dw; Xbyak::Zmm bf16_emu_reserv_1 = Xbyak::Zmm(27); Xbyak::Zmm bf16_emu_reserv_2 = Xbyak::Zmm(28); @@ -237,7 +254,8 @@ private: int data_reg_base_idx_; size_t vlen_; bf16_emulation_t *bf16_emu_; - jit_uni_eltwise_injector_f32 *eltwise_injector_; + const primitive_attr_t* attr_; + nstl::vector*> jit_eltwise_injectors_; void generate(); int vreg_dst_idx(int iter) { diff --git a/inference-engine/thirdparty/mkl-dnn/src/cpu/gemm_bf16_inner_product.hpp b/inference-engine/thirdparty/mkl-dnn/src/cpu/gemm_bf16_inner_product.hpp index 0e131d01244..ee4675a539d 100644 --- a/inference-engine/thirdparty/mkl-dnn/src/cpu/gemm_bf16_inner_product.hpp +++ b/inference-engine/thirdparty/mkl-dnn/src/cpu/gemm_bf16_inner_product.hpp @@ -59,9 +59,7 @@ struct gemm_bf16_inner_product_fwd_t: public cpu_primitive_t { && IMPLICATION(this->with_bias(), one_of( desc()->bias_desc.data_type, data_type::f32, data_type::bf16)) - && attr()->post_ops_.len_ <= 1 - && IMPLICATION(attr()->post_ops_.len_ == 1, - attr()->post_ops_.entry_[0].is_eltwise()) + && is_supported_post_ops() && dense_gemm_consitency_check(src_pd(), weights_pd(), dst_pd()); if (!ok) return status::unimplemented; @@ -73,6 +71,21 @@ struct gemm_bf16_inner_product_fwd_t: public cpu_primitive_t { return status::success; } + virtual bool is_supported_post_ops() const { + const auto& p = this->attr()->post_ops_; + + auto all_post_ops_supported = [&]() { + bool ok = true; + + for (int i = 0; i < p.len_; i++) { + ok = ok && utils::one_of(p.entry_[i].kind, primitive_kind::eltwise, primitive_kind::depthwise); + } + return ok; + }; + + return all_post_ops_supported(); + } + bool dst_is_acc_; private: @@ -92,10 +105,9 @@ struct gemm_bf16_inner_product_fwd_t: public cpu_primitive_t { , pp_kernel_(nullptr) { bool has_bias = pd()->with_bias(), - has_eltwise = pd()->attr()->post_ops_.len_ == 1, - has_scale = !pd()->attr()->output_scales_.has_default_values(); - postops_in_ip_ = false - || !pd()->dst_is_acc_ || has_bias || has_eltwise || has_scale; + has_post_ops = pd()->attr()->post_ops_.len_ > 0, + has_scale = !pd()->attr()->output_scales_.has_default_values(); + postops_in_ip_ = has_bias || has_post_ops || has_scale; if (postops_in_ip_) { if (mayiuse(avx512_core_bf16)) { pp_kernel_ = new inner_product_utils::jit_pp_kernel_t(apd); diff --git a/inference-engine/thirdparty/mkl-dnn/src/cpu/jit_avx2_1x1_conv_kernel_f32.cpp b/inference-engine/thirdparty/mkl-dnn/src/cpu/jit_avx2_1x1_conv_kernel_f32.cpp index cc5c504d7bd..f88636a708c 100644 --- a/inference-engine/thirdparty/mkl-dnn/src/cpu/jit_avx2_1x1_conv_kernel_f32.cpp +++ b/inference-engine/thirdparty/mkl-dnn/src/cpu/jit_avx2_1x1_conv_kernel_f32.cpp @@ -589,7 +589,7 @@ status_t jit_avx2_1x1_conv_kernel_f32::init_conf(jit_1x1_conv_conf_t &jcp, if (post_op.is_eltwise()) { if (post_op.eltwise.alg != alg_kind::eltwise_relu) return status::unimplemented; - } else if (post_op.is_depthwise()) { + } else if (post_op.is_depthwise() || post_op.is_quantization()) { return status::unimplemented; } } diff --git a/inference-engine/thirdparty/mkl-dnn/src/cpu/jit_avx2_conv_kernel_f32.cpp b/inference-engine/thirdparty/mkl-dnn/src/cpu/jit_avx2_conv_kernel_f32.cpp index f2529f0ed9f..472f07fb31d 100644 --- a/inference-engine/thirdparty/mkl-dnn/src/cpu/jit_avx2_conv_kernel_f32.cpp +++ b/inference-engine/thirdparty/mkl-dnn/src/cpu/jit_avx2_conv_kernel_f32.cpp @@ -598,7 +598,7 @@ status_t jit_avx2_conv_fwd_kernel_f32::init_conf(jit_conv_conf_t &jcp, if (post_op.is_eltwise()) { if (post_op.eltwise.alg != alg_kind::eltwise_relu) return status::unimplemented; - } else if (post_op.is_depthwise()) { + } else if (post_op.is_depthwise() || post_op.is_quantization()) { return status::unimplemented; } } @@ -1054,7 +1054,7 @@ status_t jit_avx2_conv_bwd_data_kernel_f32::init_conf(jit_conv_conf_t &jcp, if (!mayiuse(avx2)) { for (int i = 0; i < p.len_; i++) { auto &post_op = p.entry_[i]; - if (post_op.is_depthwise()) { + if (post_op.is_depthwise() || post_op.is_quantization()) { return status::unimplemented; } } diff --git a/inference-engine/thirdparty/mkl-dnn/src/cpu/jit_avx512_core_bf16_1x1_conv_kernel.cpp b/inference-engine/thirdparty/mkl-dnn/src/cpu/jit_avx512_core_bf16_1x1_conv_kernel.cpp index ee1b9273df9..eecaa2e355d 100644 --- a/inference-engine/thirdparty/mkl-dnn/src/cpu/jit_avx512_core_bf16_1x1_conv_kernel.cpp +++ b/inference-engine/thirdparty/mkl-dnn/src/cpu/jit_avx512_core_bf16_1x1_conv_kernel.cpp @@ -102,7 +102,7 @@ void jit_avx512_core_bf16_1x1_conv_kernel::reduce_loop(int load_loop_blk, }; #endif auto vreg_accum = [=](int i_load, int i_ur) { - int idx = i_ur * load_loop_blk + i_load; + int idx = i_ur + i_load * ur; assert(idx < 31); return Zmm(idx); }; @@ -213,8 +213,36 @@ void jit_avx512_core_bf16_1x1_conv_kernel::reduce_loop(int load_loop_blk, } } /* Eltwise post-op */ - if (jcp.with_eltwise) - eltwise_injector_->compute_vector_range(0, ur * load_loop_blk); + int eltwise_inj_idx = 0; + int depthwise_inj_idx = 0; + const auto& p = attr_.post_ops_; + + for (int i = 0; i < p.len_; i++) { + auto& post_op = p.entry_[i]; + if (post_op.is_eltwise()) { + eltwise_injectors[eltwise_inj_idx]->compute_vector_range(0, ur * load_loop_blk); + eltwise_inj_idx++; + } else if (post_op.is_depthwise()) { + mov(reg_d_weights, reinterpret_cast(post_op.depthwise.weights_data)); + mov(reg_d_bias, reinterpret_cast(post_op.depthwise.biases_data)); + + add(reg_d_weights, reg_oc_off); + add(reg_d_bias, reg_oc_off); + + for (int j = 0; j < load_loop_blk; ++j) { + int start_idx = vreg_accum(j, 0).getIdx(); + int end_idx = start_idx + ur; + + depthwise_injectors[depthwise_inj_idx]->compute_vector_range( + start_idx, end_idx, reg_d_weights, reg_d_bias); + + add(reg_d_weights, jcp.oc_block * sizeof(float)); + add(reg_d_bias, jcp.oc_block * sizeof(float)); + } + + depthwise_inj_idx++; + } + } }; auto store_output = [=](bool output_is_aligned) { @@ -434,6 +462,24 @@ void jit_avx512_core_bf16_1x1_conv_kernel::reduce_loop(int load_loop_blk, void jit_avx512_core_bf16_1x1_conv_kernel::generate() { + const auto& p = attr_.post_ops_; + for (int i = 0; i < p.len_; i++) { + auto& post_op = p.entry_[i]; + if (post_op.is_eltwise()) { + eltwise_injectors.push_back(new jit_uni_eltwise_injector_f32( + this, + post_op.eltwise.alg, + post_op.eltwise.alpha, + post_op.eltwise.beta + )); + } else if (post_op.is_depthwise()) { + depthwise_injectors.push_back(new jit_uni_depthwise_injector_f32( + this, + post_op.depthwise.alg + )); + } + } + preamble(); mov(reg_bcast_data, ptr[param1 + GET_OFF(bcast_data)]); @@ -454,6 +500,7 @@ void jit_avx512_core_bf16_1x1_conv_kernel::generate() mov(reg_output_stride, ptr[param1 + GET_OFF(output_stride)]); } + mov(reg_oc_off, ptr[param1 + GET_OFF(oc_off)]); auto load_loop_body = [=](int load_loop_blk) { bcast_loop(load_loop_blk); add(reg_load_data, load_loop_blk * jcp.load_loop_load_step); @@ -479,6 +526,7 @@ void jit_avx512_core_bf16_1x1_conv_kernel::generate() assert(!"invalid prop_kind"); } sub(reg_load_loop_work, load_loop_blk * jcp.load_loop_iter_step); + add(reg_oc_off, load_loop_blk * jcp.oc_block * jcp.typesize_out); }; const int simd_w = 16; @@ -542,8 +590,8 @@ void jit_avx512_core_bf16_1x1_conv_kernel::generate() postamble(); - if (jcp.with_eltwise) - eltwise_injector_->prepare_table(); + for (auto& inj : eltwise_injectors) + inj->prepare_table(); if (jcp.prop_kind == backward_weights) { const uint16_t dst_prm_array[32] = @@ -561,15 +609,21 @@ bool jit_avx512_core_bf16_1x1_conv_kernel::post_ops_ok( jit_1x1_conv_conf_t &jcp, const primitive_attr_t &attr) { const auto &p = attr.post_ops_; - auto is_eltwise = [&](int idx) { return p.entry_[idx].is_eltwise(); }; - auto is_sum = [&](int idx) { return p.entry_[idx].is_sum(); }; + auto all_post_ops_supported = [&]() { + bool ok = true; - switch (p.len_) { - case 0: return true; // no post_ops - case 1: return is_eltwise(0) || is_sum(0); // sum OR eltwise - case 2: return is_sum(0) && is_eltwise(1); // sum -> eltwise - default: return false; - } + for (int i = 0; i < p.len_; i++) { + ok = ok && utils::one_of(p.entry_[i].kind, primitive_kind::sum, primitive_kind::eltwise, primitive_kind::depthwise); + } + return ok; + }; + auto contain = [&](mkldnn::impl::primitive_kind_t kind) { return p.find(kind) != -1; }; + auto position = [&](mkldnn::impl::primitive_kind_t kind) { return p.find(kind); }; + auto count = [&](mkldnn::impl::primitive_kind_t kind) { return p.count(kind); }; + + return all_post_ops_supported() && + count(primitive_kind::sum) <= 1 && + IMPLICATION(contain(primitive_kind::sum), position(primitive_kind::sum) == 0); return false; } diff --git a/inference-engine/thirdparty/mkl-dnn/src/cpu/jit_avx512_core_bf16_1x1_conv_kernel.hpp b/inference-engine/thirdparty/mkl-dnn/src/cpu/jit_avx512_core_bf16_1x1_conv_kernel.hpp index 7d681265135..3aebab823e8 100644 --- a/inference-engine/thirdparty/mkl-dnn/src/cpu/jit_avx512_core_bf16_1x1_conv_kernel.hpp +++ b/inference-engine/thirdparty/mkl-dnn/src/cpu/jit_avx512_core_bf16_1x1_conv_kernel.hpp @@ -22,6 +22,8 @@ #include "jit_primitive_conf.hpp" #include "jit_uni_eltwise.hpp" #include "jit_avx512_core_bf16cvt.hpp" +#include "jit_uni_depthwise.hpp" + //#define BF16_CONV_1x1_BWD_W_JIT_KER_USES_PERMW_TRANSPOSITION @@ -36,13 +38,8 @@ struct jit_avx512_core_bf16_1x1_conv_kernel : public jit_generator { const primitive_attr_t &attr) : jit_generator(nullptr, ker_code_size), jcp(ajcp), attr_(attr) - , eltwise_injector_(nullptr) , bf16_emu_(nullptr) { - if (jcp.with_eltwise) - eltwise_injector_ = new jit_uni_eltwise_injector_f32( - this, jcp.eltwise); - if (!mayiuse(avx512_core_bf16)) bf16_emu_ = new bf16_emulation_t(this, bf16_emu_reserv_1, bf16_emu_reserv_2, @@ -54,7 +51,13 @@ struct jit_avx512_core_bf16_1x1_conv_kernel : public jit_generator { } ~jit_avx512_core_bf16_1x1_conv_kernel() { - delete eltwise_injector_; + for (auto inj : eltwise_injectors) + delete inj; + eltwise_injectors.clear(); + + for (auto inj : depthwise_injectors) + delete inj; + depthwise_injectors.clear(); delete bf16_emu_; } @@ -98,7 +101,7 @@ struct jit_avx512_core_bf16_1x1_conv_kernel : public jit_generator { reg64_t reg_load_loop_work = rsi; reg64_t reg_reduce_loop_work = r11; reg64_t bcast_loop_iter = rdx; - reg64_t reduce_loop_iter = abi_param1; + reg64_t reduce_loop_iter = r13; reg64_t reg_reduce_pos_flag = rax; reg64_t reg_output_stride = r13; reg64_t reg_bias_data = r12; @@ -123,8 +126,12 @@ struct jit_avx512_core_bf16_1x1_conv_kernel : public jit_generator { Xbyak::Zmm zmm_bias = Xbyak::Zmm(31); Xbyak::Label dst_prm_table; + reg64_t reg_oc_off = abi_param1; + reg64_t reg_d_weights = imm_addr64; + reg64_t reg_d_bias = r13; - jit_uni_eltwise_injector_f32 *eltwise_injector_; + nstl::vector*> eltwise_injectors; + nstl::vector*> depthwise_injectors; int bcast_loop_work_offt = 0; #ifdef BF16_CONV_1x1_BWD_W_JIT_KER_USES_PERMW_TRANSPOSITION diff --git a/inference-engine/thirdparty/mkl-dnn/src/cpu/jit_avx512_core_bf16_1x1_convolution.cpp b/inference-engine/thirdparty/mkl-dnn/src/cpu/jit_avx512_core_bf16_1x1_convolution.cpp index a88c76e2aac..741c46864d6 100644 --- a/inference-engine/thirdparty/mkl-dnn/src/cpu/jit_avx512_core_bf16_1x1_convolution.cpp +++ b/inference-engine/thirdparty/mkl-dnn/src/cpu/jit_avx512_core_bf16_1x1_convolution.cpp @@ -193,6 +193,7 @@ const { } else p.bcast_data = src + data_blk_off(src_d, n, _icb, ih, iw); + p.oc_off = _ocb * jcp.oc_block * sizeof(dst_data_t); kernel_->jit_ker(&p); }; diff --git a/inference-engine/thirdparty/mkl-dnn/src/cpu/jit_avx512_core_bf16_conv_kernel.cpp b/inference-engine/thirdparty/mkl-dnn/src/cpu/jit_avx512_core_bf16_conv_kernel.cpp index a1a6b5fdc26..cff073b97dc 100644 --- a/inference-engine/thirdparty/mkl-dnn/src/cpu/jit_avx512_core_bf16_conv_kernel.cpp +++ b/inference-engine/thirdparty/mkl-dnn/src/cpu/jit_avx512_core_bf16_conv_kernel.cpp @@ -119,14 +119,39 @@ void jit_avx512_core_bf16_fwd_kernel::store_output(int ur_w) } } - if (jcp.with_eltwise) { - if (ur_w == jcp.ur_w) { - eltwise_injector_->compute_vector_range(0, - jcp.nb_oc_blocking * jcp.ur_w); - } else { - for (int k = 0; k < jcp.nb_oc_blocking; k++) - eltwise_injector_->compute_vector_range(k * jcp.ur_w, - k * jcp.ur_w + ur_w); + int eltwise_inj_idx = 0; + int depthwise_inj_idx = 0; + const auto &p = attr_.post_ops_; + + for (int i = 0; i < p.len_; i++) { + auto& post_op = p.entry_[i]; + if (post_op.is_eltwise()) { + if (ur_w == jcp.ur_w) { + eltwise_injectors[eltwise_inj_idx]->compute_vector_range(0, + jcp.nb_oc_blocking * jcp.ur_w); + } else { + for (int k = 0; k < jcp.nb_oc_blocking; k++) + eltwise_injectors[eltwise_inj_idx]->compute_vector_range(k * jcp.ur_w, + k * jcp.ur_w + ur_w); + } + + eltwise_inj_idx++; + } else if (post_op.is_depthwise()) { + mov(reg_d_weights, reinterpret_cast(post_op.depthwise.weights_data)); + mov(reg_d_bias, reinterpret_cast(post_op.depthwise.biases_data)); + + add(reg_d_weights, ptr[this->param1 + GET_OFF(oc_off)]); + add(reg_d_bias, ptr[this->param1 + GET_OFF(oc_off)]); + + for (int k = 0; k < jcp.nb_oc_blocking; k++) { + depthwise_injectors[depthwise_inj_idx]->compute_vector_range( + k*jcp.ur_w, k*jcp.ur_w + ur_w, reg_d_weights, reg_d_bias); + + add(reg_d_weights, jcp.oc_block * sizeof(float)); + add(reg_d_bias, jcp.oc_block * sizeof(float)); + } + + depthwise_inj_idx++; } } @@ -312,6 +337,24 @@ void jit_avx512_core_bf16_fwd_kernel::compute_loop( void jit_avx512_core_bf16_fwd_kernel::generate() { + const auto &p = attr_.post_ops_; + for (int i = 0; i < p.len_; i++) { + auto &post_op = p.entry_[i]; + if (post_op.is_eltwise()) { + eltwise_injectors.push_back(new jit_uni_eltwise_injector_f32( + this, + post_op.eltwise.alg, + post_op.eltwise.alpha, + post_op.eltwise.beta + )); + } else if (post_op.is_depthwise()) { + depthwise_injectors.push_back(new jit_uni_depthwise_injector_f32( + this, + post_op.depthwise.alg + )); + } + } + int iw = jcp.iw; int ow = jcp.ow; int ow_block = jcp.ow_block; @@ -500,23 +543,29 @@ void jit_avx512_core_bf16_fwd_kernel::generate() } postamble(); - if (jcp.with_eltwise) - eltwise_injector_->prepare_table(); + for (auto& inj : eltwise_injectors) + inj->prepare_table(); } bool jit_avx512_core_bf16_fwd_kernel::post_ops_ok( jit_conv_conf_t &jcp, const primitive_attr_t &attr) { const auto &p = attr.post_ops_; - auto is_eltwise = [&](int idx) { return p.entry_[idx].is_eltwise(); }; - auto is_sum = [&](int idx) { return p.entry_[idx].is_sum(); }; + auto all_post_ops_supported = [&]() { + bool ok = true; - switch (p.len_) { - case 0: return true; // no post_ops - case 1: return is_eltwise(0) || is_sum(0); // sum OR eltwise - case 2: return is_sum(0) && is_eltwise(1); // sum -> eltwise - default: return false; - } + for (int i = 0; i < p.len_; i++) { + ok = ok && utils::one_of(p.entry_[i].kind, primitive_kind::sum, primitive_kind::eltwise, primitive_kind::depthwise); + } + return ok; + }; + auto contain = [&](mkldnn::impl::primitive_kind_t kind) { return p.find(kind) != -1; }; + auto position = [&](mkldnn::impl::primitive_kind_t kind) { return p.find(kind); }; + auto count = [&](mkldnn::impl::primitive_kind_t kind) { return p.count(kind); }; + + return all_post_ops_supported() && + count(primitive_kind::sum) <= 1 && + IMPLICATION(contain(primitive_kind::sum), position(primitive_kind::sum) == 0); return false; } diff --git a/inference-engine/thirdparty/mkl-dnn/src/cpu/jit_avx512_core_bf16_conv_kernel.hpp b/inference-engine/thirdparty/mkl-dnn/src/cpu/jit_avx512_core_bf16_conv_kernel.hpp index 51298bf519b..d8a7258bc11 100644 --- a/inference-engine/thirdparty/mkl-dnn/src/cpu/jit_avx512_core_bf16_conv_kernel.hpp +++ b/inference-engine/thirdparty/mkl-dnn/src/cpu/jit_avx512_core_bf16_conv_kernel.hpp @@ -25,6 +25,7 @@ #include "jit_primitive_conf.hpp" #include "jit_uni_eltwise.hpp" #include "jit_avx512_core_bf16cvt.hpp" +#include "jit_uni_depthwise.hpp" //#define BF16_CONV_BWD_W_JIT_KER_USES_PERMW_TRANSPOSITION //#define BF16_CONV_BWD_W_DOES_NOT_USE_BARRIERS @@ -40,12 +41,8 @@ struct jit_avx512_core_bf16_fwd_kernel : public jit_generator { jit_generator(nullptr, ker_code_size), jcp(ajcp), attr_(attr), - eltwise_injector_(nullptr), bf16_emu_(nullptr) { - if (jcp.with_eltwise) - eltwise_injector_ = new jit_uni_eltwise_injector_f32( - this, jcp.eltwise); if (!mayiuse(avx512_core_bf16)) bf16_emu_ = new bf16_emulation_t(this, bf16_emu_reserv_1, bf16_emu_reserv_2, @@ -58,7 +55,13 @@ struct jit_avx512_core_bf16_fwd_kernel : public jit_generator { ~jit_avx512_core_bf16_fwd_kernel() { delete bf16_emu_; - delete eltwise_injector_; + for (auto inj : eltwise_injectors) + delete inj; + eltwise_injectors.clear(); + + for (auto inj : depthwise_injectors) + delete inj; + depthwise_injectors.clear(); } DECLARE_CPU_JIT_AUX_FUNCTIONS(jit_avx512_core_bf16_fwd_kernel) @@ -144,7 +147,12 @@ private: Xbyak::Zmm bf16_emu_reserv_5 = Xbyak::Zmm(29); Xbyak::Zmm bf16_emu_reserv_6 = Xbyak::Zmm(30); - jit_uni_eltwise_injector_f32 *eltwise_injector_; + reg64_t reg_d_weights = imm_addr64; + reg64_t reg_d_bias = reg_kj; + + nstl::vector*> eltwise_injectors; + nstl::vector*> depthwise_injectors; + bf16_emulation_t *bf16_emu_; inline void prepare_output(int ur_w); diff --git a/inference-engine/thirdparty/mkl-dnn/src/cpu/jit_avx512_core_bf16_convolution.cpp b/inference-engine/thirdparty/mkl-dnn/src/cpu/jit_avx512_core_bf16_convolution.cpp index 6ab2965bd46..ccd1d86cc65 100644 --- a/inference-engine/thirdparty/mkl-dnn/src/cpu/jit_avx512_core_bf16_convolution.cpp +++ b/inference-engine/thirdparty/mkl-dnn/src/cpu/jit_avx512_core_bf16_convolution.cpp @@ -117,6 +117,7 @@ void _jit_avx512_core_bf16_convolution_fwd_t::execute_forward_1d() auto src_w = src + src_d.blk_off(n, g_icb, iw_s); auto wht_w = weights + wht_blk_off(weights_d, g, ocb); + par_conv.oc_off = g_oc * sizeof(dst_data_t); par_conv.src = src_w; par_conv.dst = dst_w; par_conv.filt = wht_w; @@ -219,6 +220,7 @@ void _jit_avx512_core_bf16_convolution_fwd_t::execute_forward_2d() auto aux_src = src_w + i_t_overflow * dilate_h * src_h_stride; auto aux_wht = wht_w + i_t_overflow * wht_h_stride; + par_conv.oc_off = g_oc * sizeof(dst_data_t); par_conv.src = aux_src; par_conv.dst = dst_w; par_conv.filt = aux_wht; @@ -337,6 +339,7 @@ void _jit_avx512_core_bf16_convolution_fwd_t::execute_forward_3d() auto aux_src = src_w + i_t_overflow * dilate_h * src_h_stride; auto aux_wht = wht_w + i_t_overflow * wht_h_stride; + par_conv.oc_off = g_oc * sizeof(dst_data_t); par_conv.src = aux_src; par_conv.dst = dst_w; par_conv.filt = aux_wht; diff --git a/inference-engine/thirdparty/mkl-dnn/src/cpu/jit_avx512_core_bf16_dw_conv_kernel.cpp b/inference-engine/thirdparty/mkl-dnn/src/cpu/jit_avx512_core_bf16_dw_conv_kernel.cpp index 9925f8c2c85..cec8c088c96 100644 --- a/inference-engine/thirdparty/mkl-dnn/src/cpu/jit_avx512_core_bf16_dw_conv_kernel.cpp +++ b/inference-engine/thirdparty/mkl-dnn/src/cpu/jit_avx512_core_bf16_dw_conv_kernel.cpp @@ -164,11 +164,40 @@ void jit_avx512_dw_conv_fwd_kernel_bf16::apply_filter_unrolled( L(iter_exit_label); } -void jit_avx512_dw_conv_fwd_kernel_bf16::apply_activation( +void jit_avx512_dw_conv_fwd_kernel_bf16::apply_postprocess( int ur_ch_blocks, int ur_w) { - if (this->jcp.with_eltwise) { - eltwise_injector_->compute_vector_range( - acc_idx_start, ur_w * ur_ch_blocks + acc_idx_start); + int eltwise_inj_idx = 0; + int depthwise_inj_idx = 0; + const auto& p = attr_.post_ops_; + + for (int i = 0; i < p.len_; i++) { + auto& post_op = p.entry_[i]; + if (post_op.is_eltwise()) { + int start_idx = get_acc_reg(0).getIdx(); + int end_idx = get_acc_reg(ur_w * ur_ch_blocks).getIdx(); + + eltwise_injectors[eltwise_inj_idx]->compute_vector_range(start_idx, end_idx); + eltwise_inj_idx++; + } else if (post_op.is_depthwise()) { + mov(reg_d_weights, reinterpret_cast(post_op.depthwise.weights_data)); + mov(reg_d_bias, reinterpret_cast(post_op.depthwise.biases_data)); + + add(reg_d_weights, ptr[this->param1 + GET_OFF(oc_off)]); + add(reg_d_bias, ptr[this->param1 + GET_OFF(oc_off)]); + + for (int ch = 0; ch < ur_ch_blocks; ch++) { + int start_idx = get_acc_reg(ur_w * ch).getIdx(); + int end_idx = get_acc_reg(ur_w * ch + ur_w).getIdx(); + + depthwise_injectors[depthwise_inj_idx]->compute_vector_range( + start_idx, end_idx, reg_d_weights, reg_d_bias); + + add(reg_d_weights, jcp.ch_block * sizeof(float)); + add(reg_d_bias, jcp.ch_block * sizeof(float)); + } + + depthwise_inj_idx++; + } } } @@ -246,7 +275,7 @@ void jit_avx512_dw_conv_fwd_kernel_bf16::loop_ow(int ur_ch_blocks) { load_src(ur_ch_blocks, ur_w); apply_filter_unrolled(ur_ch_blocks, ur_w); - apply_activation(ur_ch_blocks, ur_w); + apply_postprocess(ur_ch_blocks, ur_w); store_dst(ur_ch_blocks, ur_w); add(reg_input, jcp.typesize_in * ur_w * jcp.ch_block * jcp.stride_w); @@ -267,7 +296,7 @@ void jit_avx512_dw_conv_fwd_kernel_bf16::loop_ow(int ur_ch_blocks) { load_src(ur_ch_blocks, ur_w); apply_filter(ur_ch_blocks, ur_w); - apply_activation(ur_ch_blocks, ur_w); + apply_postprocess(ur_ch_blocks, ur_w); store_dst(ur_ch_blocks, ur_w); add(reg_input, jcp.typesize_in * ur_w * jcp.ch_block * jcp.stride_w); @@ -281,6 +310,24 @@ void jit_avx512_dw_conv_fwd_kernel_bf16::loop_ow(int ur_ch_blocks) { } void jit_avx512_dw_conv_fwd_kernel_bf16::generate() { + const auto& p = attr_.post_ops_; + for (int i = 0; i < p.len_; i++) { + auto& post_op = p.entry_[i]; + if (post_op.is_eltwise()) { + eltwise_injectors.push_back(new jit_uni_eltwise_injector_f32( + this, + post_op.eltwise.alg, + post_op.eltwise.alpha, + post_op.eltwise.beta + )); + } else if (post_op.is_depthwise()) { + depthwise_injectors.push_back(new jit_uni_depthwise_injector_f32( + this, + post_op.depthwise.alg + )); + } + } + this->preamble(); mov(reg_input, ptr[this->param1 + GET_OFF(src)]); @@ -316,8 +363,8 @@ void jit_avx512_dw_conv_fwd_kernel_bf16::generate() { this->postamble(); - if (jcp.with_eltwise) - eltwise_injector_->prepare_table(); + for (auto& inj : eltwise_injectors) + inj->prepare_table(); } inline void jit_avx512_dw_conv_bwd_data_kernel_bf16::load_ddst( diff --git a/inference-engine/thirdparty/mkl-dnn/src/cpu/jit_avx512_core_bf16_dw_conv_kernel.hpp b/inference-engine/thirdparty/mkl-dnn/src/cpu/jit_avx512_core_bf16_dw_conv_kernel.hpp index d9cf5766fd5..3395ad22589 100644 --- a/inference-engine/thirdparty/mkl-dnn/src/cpu/jit_avx512_core_bf16_dw_conv_kernel.hpp +++ b/inference-engine/thirdparty/mkl-dnn/src/cpu/jit_avx512_core_bf16_dw_conv_kernel.hpp @@ -23,7 +23,7 @@ #include "jit_generator.hpp" #include "jit_primitive_conf.hpp" #include "jit_uni_eltwise.hpp" - +#include "jit_uni_depthwise.hpp" #include "jit_avx512_core_bf16cvt.hpp" namespace mkldnn { @@ -33,11 +33,8 @@ namespace cpu { struct jit_avx512_dw_conv_fwd_kernel_bf16 : public jit_generator { DECLARE_CPU_JIT_AUX_FUNCTIONS(jit_avx512_dw_conv_fwd_kernel_bf16) - jit_avx512_dw_conv_fwd_kernel_bf16(jit_conv_conf_t ajcp, const primitive_attr_t&) - : jcp(ajcp), eltwise_injector_(nullptr), bf16_emu_(nullptr) { - if (jcp.with_eltwise) - eltwise_injector_ = new jit_uni_eltwise_injector_f32( - this, jcp.eltwise); + jit_avx512_dw_conv_fwd_kernel_bf16(jit_conv_conf_t ajcp, const primitive_attr_t& attr) + : jcp(ajcp), attr_(attr), bf16_emu_(nullptr) { if (!mayiuse(avx512_core_bf16)) bf16_emu_ = new bf16_emulation_t(this, bf16_emu_reserv_1, bf16_emu_reserv_2, bf16_emu_reserv_3, bf16_emu_reserv_4, @@ -48,11 +45,19 @@ struct jit_avx512_dw_conv_fwd_kernel_bf16 : public jit_generator { } ~jit_avx512_dw_conv_fwd_kernel_bf16() { - delete eltwise_injector_; + for (auto inj : eltwise_injectors) + delete inj; + eltwise_injectors.clear(); + + for (auto inj : depthwise_injectors) + delete inj; + depthwise_injectors.clear(); + delete bf16_emu_; } jit_conv_conf_t jcp; + const primitive_attr_t& attr_; void (*jit_ker)(jit_conv_call_s *); private: @@ -78,6 +83,8 @@ private: reg64_t reg_ur_w = rbp; reg64_t reg_ch_blocks = aux1_reg_input; reg64_t imm_addr64 = aux1_reg_input; + reg64_t reg_d_weights = imm_addr64; + reg64_t reg_d_bias = iter_kh; Xbyak::Zmm zmm_ker_reg = Xbyak::Zmm(0); Xbyak::Zmm zmm_src_reg = Xbyak::Zmm(1); @@ -99,11 +106,12 @@ private: inline void load_src(int ur_ch_blocks, int ur_w); inline void apply_filter(int ur_ch_blocks, int ur_w); inline void apply_filter_unrolled(int ur_ch_blocks, int ur_w); - inline void apply_activation(int ur_ch_blocks, int ur_w); + inline void apply_postprocess(int ur_ch_blocks, int ur_w); inline void store_dst(int ur_ch_blocks, int ur_w); inline void loop_ow(int ur_ch_blocks); - jit_uni_eltwise_injector_f32 *eltwise_injector_; + nstl::vector*> eltwise_injectors; + nstl::vector*> depthwise_injectors; bf16_emulation_t *bf16_emu_; diff --git a/inference-engine/thirdparty/mkl-dnn/src/cpu/jit_uni_dw_conv_kernel_utils.hpp b/inference-engine/thirdparty/mkl-dnn/src/cpu/jit_uni_dw_conv_kernel_utils.hpp index bdc947fe6a2..0319c260c29 100644 --- a/inference-engine/thirdparty/mkl-dnn/src/cpu/jit_uni_dw_conv_kernel_utils.hpp +++ b/inference-engine/thirdparty/mkl-dnn/src/cpu/jit_uni_dw_conv_kernel_utils.hpp @@ -74,34 +74,21 @@ template bool jit_uni_dw_conv_fwd_kernel::post_ops_ok( jit_conv_conf_t &jcp, const primitive_attr_t &attr, bool is_bf16) { const auto &p = attr.post_ops_; + auto all_post_ops_supported = [&]() { + bool ok = true; - if (is_bf16) { - auto is_eltwise = [&](int idx) { return p.entry_[idx].is_eltwise(); }; - auto is_sum = [&](int idx) { return p.entry_[idx].is_sum(); }; - - switch (p.len_) { - case 0: return true; // no post_ops - case 1: return is_eltwise(0) || is_sum(0); // sum OR eltwise - case 2: return is_sum(0) && is_eltwise(1); // sum -> eltwise - default: return false; + for (int i = 0; i < p.len_; i++) { + ok = ok && utils::one_of(p.entry_[i].kind, primitive_kind::sum, primitive_kind::eltwise, primitive_kind::depthwise); } - } else { - auto all_post_ops_supported = [&]() { - bool ok = true; + return ok; + }; + auto contain = [&](mkldnn::impl::primitive_kind_t kind) { return p.find(kind) != -1; }; + auto position = [&](mkldnn::impl::primitive_kind_t kind) { return p.find(kind); }; + auto count = [&](mkldnn::impl::primitive_kind_t kind) { return p.count(kind); }; - for (int i = 0; i < p.len_; i++) { - ok = ok && utils::one_of(p.entry_[i].kind, primitive_kind::sum, primitive_kind::eltwise, primitive_kind::depthwise, primitive_kind::quantization); - } - return ok; - }; - auto contain = [&](mkldnn::impl::primitive_kind_t kind) { return p.find(kind) != -1; }; - auto position = [&](mkldnn::impl::primitive_kind_t kind) { return p.find(kind); }; - auto count = [&](mkldnn::impl::primitive_kind_t kind) { return p.count(kind); }; - - return all_post_ops_supported() && - count(primitive_kind::sum) <= 1 && - IMPLICATION(contain(primitive_kind::sum), position(primitive_kind::sum) == 0); - } + return all_post_ops_supported() && + count(primitive_kind::sum) <= 1 && + IMPLICATION(contain(primitive_kind::sum), position(primitive_kind::sum) == 0); return false; } diff --git a/inference-engine/thirdparty/mkl-dnn/src/cpu/ref_depthwise.cpp b/inference-engine/thirdparty/mkl-dnn/src/cpu/ref_depthwise.cpp index 28368f088a5..9e9b66a13c6 100644 --- a/inference-engine/thirdparty/mkl-dnn/src/cpu/ref_depthwise.cpp +++ b/inference-engine/thirdparty/mkl-dnn/src/cpu/ref_depthwise.cpp @@ -37,6 +37,32 @@ template inline T prelu_fwd(T s_val, T w_val) { return s_val >= 0 ? s_val : s_val*w_val; } +union float_raw { + float f; + unsigned short i[2]; +}; + +static float bf16tof32(mkldnn_bfloat16_t bf16) { + union float_raw t = { 0 }; + t.i[1] = bf16; + t.i[0] = 0; + return t.f; +} + +static mkldnn_bfloat16_t f32tobf16(float f32) { + union float_raw t = { 0 }; + t.f = f32; + return t.i[1]; +} + +inline mkldnn_bfloat16_t bf16_scale_shift_fwd(mkldnn_bfloat16_t s_val, mkldnn_bfloat16_t w_val, mkldnn_bfloat16_t b_val) { + return f32tobf16(bf16tof32(s_val) * bf16tof32(w_val) + bf16tof32(b_val)); +} + +inline mkldnn_bfloat16_t bf16_prelu_fwd(mkldnn_bfloat16_t s_val, mkldnn_bfloat16_t w_val) { + return s_val >= 0 ? s_val : f32tobf16(bf16tof32(s_val) * bf16tof32(w_val)); +} + ref_depthwise_scalar_fwd_t::ref_depthwise_scalar_fwd_t(const alg_kind_t alg_) : alg(alg_) { using namespace alg_kind; @@ -91,15 +117,24 @@ void ref_depthwise_fwd_t::execute_forward() const { data_t b_val = bias ? bias[bias_d.off(wei_idx)] : (data_t)0; data_t &d_val = dst[data_off]; - switch (alg_kind) { - case depthwise_scale_shift: d_val = scale_shift_fwd(s_val, w_val, b_val); break; - case depthwise_prelu: d_val = prelu_fwd(s_val, w_val); break; - default: assert(!"unknown depthwise alg_kind"); + if (data_type == mkldnn_bf16) { + switch (alg_kind) { + case depthwise_scale_shift: d_val = bf16_scale_shift_fwd(s_val, w_val, b_val); break; + case depthwise_prelu: d_val = bf16_prelu_fwd(s_val, w_val); break; + default: assert(!"unknown depthwise alg_kind"); + } + } else { + switch (alg_kind) { + case depthwise_scale_shift: d_val = scale_shift_fwd(s_val, w_val, b_val); break; + case depthwise_prelu: d_val = prelu_fwd(s_val, w_val); break; + default: assert(!"unknown depthwise alg_kind"); + } } }); } template struct ref_depthwise_fwd_t; +template struct ref_depthwise_fwd_t; } } diff --git a/inference-engine/thirdparty/mkl-dnn/tests/gtests/CMakeLists.txt b/inference-engine/thirdparty/mkl-dnn/tests/gtests/CMakeLists.txt index e850b9fac43..019d137f180 100644 --- a/inference-engine/thirdparty/mkl-dnn/tests/gtests/CMakeLists.txt +++ b/inference-engine/thirdparty/mkl-dnn/tests/gtests/CMakeLists.txt @@ -64,6 +64,7 @@ file(GLOB PRIM_TEST_CASES_SRC test_convolution_forward_x8s8fp.cpp test_convolution_forward_x8s8fp_3d.cpp test_convolution_eltwise_forward_f32.cpp + test_convolution_eltwise_forward_bf16.cpp test_convolution_eltwise_forward_x8s8f32s32.cpp test_convolution_backward_data_f32.cpp test_convolution_backward_data_s16s16s32.cpp @@ -77,6 +78,7 @@ file(GLOB PRIM_TEST_CASES_SRC test_rnn_forward.cpp test_roi_pooling_forward.cpp test_convolution_depthwise_forward_f32.cpp + test_convolution_depthwise_forward_bf16f32.cpp test_convolution_depthwise_forward_x8s8f32s32.cpp test_convolution_dw_conv_f32.cpp test_convolution_dw_conv_u8s8s32.cpp diff --git a/inference-engine/thirdparty/mkl-dnn/tests/gtests/test_convolution_depthwise_forward_bf16f32.cpp b/inference-engine/thirdparty/mkl-dnn/tests/gtests/test_convolution_depthwise_forward_bf16f32.cpp new file mode 100644 index 00000000000..50ef454e1ae --- /dev/null +++ b/inference-engine/thirdparty/mkl-dnn/tests/gtests/test_convolution_depthwise_forward_bf16f32.cpp @@ -0,0 +1,87 @@ +/******************************************************************************* +* Copyright 2020 Intel Corporation +* +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +*******************************************************************************/ + +#include "mkldnn_test_common.hpp" +#include "gtest/gtest.h" +#include "mkldnn.hpp" +#include "test_convolution_depthwise_forward_common.hpp" + +namespace mkldnn { + +using convolution_test = convolution_depthwise_test; + +TEST_P(convolution_test, TestConvolution) +{ +} + +#define EXPAND_FORMATS(src, weights, bias, dst) \ + { mkldnn::memory::format::src, mkldnn::memory::format::weights, \ + mkldnn::memory::format::bias, mkldnn::memory::format::dst } + +#define FMT_WEIGHTS_BLOCKED16 OIhw8i16o2i +#define FMT_WEIGHTS_BLOCKED16_DW Goihw16g + +#define ENGINE mkldnn::engine::kind::cpu +#define ALGORITHM mkldnn::convolution_direct + +#define CONCAT_WITH_UNDERSCORE_(a,b) a ## _ ## b +#define CONCAT_WITH_UNDERSCORE(a,b) CONCAT_WITH_UNDERSCORE_(a,b) + +#define INST_TEST_CASE_(str, ...) INSTANTIATE_TEST_CASE_P( \ + str, convolution_test, ::testing::Values(__VA_ARGS__)) + +#define INST_TEST_CASE(str, ...) INST_TEST_CASE_( \ + CONCAT_WITH_UNDERSCORE(CONCAT_WITH_UNDERSCORE(Convolution, \ + str), depthwise), __VA_ARGS__) + +#define EXPAND_ARGS(args) args + +#define PARAMS(...) \ + EXPAND_ARGS(PARAMS_CONV(depthwise_scale_shift, __VA_ARGS__)), \ + EXPAND_ARGS(PARAMS_CONV(depthwise_prelu, __VA_ARGS__)) + +#define PARAMS_CONV(alg, src, weights, bias, dst, ...) \ + test_convolution_depthwise_params_t {alg, ENGINE, ALGORITHM, \ + EXPAND_FORMATS(src, weights, bias, dst), /* empty attributes */ {}, \ + {__VA_ARGS__} } + + INST_TEST_CASE(SimpleSmall, + PARAMS(nchw, oihw, x, nchw, 2, 1, 32, 13, 13, 48, 11, 11, 3, 3, 0, 0, 1, 1), + PARAMS(nchw, oihw, x, nchw, 2, 1, 16, 13, 13, 48, 13, 13, 1, 1, 0, 0, 1, 1), + PARAMS(nchw, goihw, x, nchw, 2, 64, 64, 16, 16, 64, 16, 16, 3, 3, 0, 0, 1, 1), + PARAMS(nchw, goihw, x, nchw, 2, 2, 32, 9, 9, 32, 9, 9, 1, 1, 0, 0, 1, 1) + ); + + INST_TEST_CASE(SimpleSmall_Blocked16, + PARAMS(nChw16c, FMT_WEIGHTS_BLOCKED16, x, nChw16c, + 2, 1, 32, 13, 13, 48, 11, 11, 3, 3, 0, 0, 1, 1), + PARAMS(nChw16c, FMT_WEIGHTS_BLOCKED16, x, nChw16c, + 2, 1, 16, 13, 13, 48, 13, 13, 1, 1, 0, 0, 1, 1), + PARAMS(nChw16c, FMT_WEIGHTS_BLOCKED16_DW, x, nChw16c, + 2, 64, 64, 16, 16, 64, 16, 16, 3, 3, 0, 0, 1, 1), + PARAMS(nChw16c, FMT_WEIGHTS_BLOCKED16_DW, x, nChw16c, + 2, 32, 32, 9, 9, 32, 9, 9, 1, 1, 0, 0, 1, 1), + + PARAMS(nChw16c, FMT_WEIGHTS_BLOCKED16, x, nChw16c, + 2, 1, 8, 13, 13, 16, 13, 13, 1, 1, 0, 0, 1, 1), + PARAMS(nChw16c, FMT_WEIGHTS_BLOCKED16, x, nChw16c, + 2, 1, 8, 3, 3, 16, 3, 3, 1, 1, 0, 0, 1, 1), + PARAMS(nChw16c, FMT_WEIGHTS_BLOCKED16, x, nChw16c, + 2, 1, 16, 13, 13, 48, 13, 13, 1, 1, 0, 0, 1, 1), + PARAMS(nChw16c, FMT_WEIGHTS_BLOCKED16, x, nChw16c, + 2, 1, 16, 13, 13, 48, 13, 13, 3, 3, 0, 0, 1, 1) + ); +} diff --git a/inference-engine/thirdparty/mkl-dnn/tests/gtests/test_convolution_depthwise_forward_common.hpp b/inference-engine/thirdparty/mkl-dnn/tests/gtests/test_convolution_depthwise_forward_common.hpp index 730be03b7d2..875df0615ca 100644 --- a/inference-engine/thirdparty/mkl-dnn/tests/gtests/test_convolution_depthwise_forward_common.hpp +++ b/inference-engine/thirdparty/mkl-dnn/tests/gtests/test_convolution_depthwise_forward_common.hpp @@ -34,6 +34,13 @@ inline typename std::remove_reference::type rnd_up(const T a, const U b) { return div_up(a, b) * b; } +static float bf16tof32(mkldnn_bfloat16_t bf16) { + union float_raw t = { 0 }; + t.i[1] = bf16; + t.i[0] = 0; + return t.f; +} + template void compute_ref_conv_depthwise_fwd(const test_convolution_sizes_t &c, @@ -42,6 +49,7 @@ void compute_ref_conv_depthwise_fwd(const test_convolution_sizes_t &c, const memory &depthwise_weights, const memory &depthwise_bias) { data_t_src *src_data = (data_t_src *)src.get_data_handle(); + memory::data_type data_type_src = data_traits::data_type; data_t_wei *weights_data = (data_t_wei *)weights.get_data_handle(); data_t_dst *bias_data = (data_t_dst *)(w_bias ? bias.get_data_handle() : nullptr); @@ -90,8 +98,13 @@ void compute_ref_conv_depthwise_fwd(const test_convolution_sizes_t &c, + oc * padded_ic_w / c.ng * c.kh * c.kw + ic * c.kh * c.kw + kh * c.kw + kw; - dst_data[didx] += src_data[map_index(src_d, iidx)] + if (data_type_src == mkldnn_bf16) { + dst_data[didx] += bf16tof32(src_data[map_index(src_d, iidx)]) + * bf16tof32(weights_data[map_index(weights_d, widx)]); + } else { + dst_data[didx] += src_data[map_index(src_d, iidx)] * weights_data[map_index(weights_d, widx)]; + } } switch (depthwise_alg) { diff --git a/inference-engine/thirdparty/mkl-dnn/tests/gtests/test_convolution_eltwise_forward_bf16.cpp b/inference-engine/thirdparty/mkl-dnn/tests/gtests/test_convolution_eltwise_forward_bf16.cpp new file mode 100644 index 00000000000..3c3008b8797 --- /dev/null +++ b/inference-engine/thirdparty/mkl-dnn/tests/gtests/test_convolution_eltwise_forward_bf16.cpp @@ -0,0 +1,89 @@ +/******************************************************************************* +* Copyright 2020 Intel Corporation +* +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +*******************************************************************************/ + +#include "mkldnn_test_common.hpp" +#include "gtest/gtest.h" +#include "math_utils.hpp" +#include "mkldnn.hpp" +#include "test_convolution_eltwise_forward_common.hpp" + +namespace mkldnn { + +using convolution_test = convolution_eltwise_test; + +TEST_P(convolution_test, TestConvolutionEltwise) +{ +} + +#define EXPAND_FORMATS(src, weights, bias, dst) \ + { mkldnn::memory::format::src, mkldnn::memory::format::weights, \ + mkldnn::memory::format::bias, mkldnn::memory::format::dst } + +#define CONCAT_WITH_UNDERSCORE_(a,b) a ## _ ## b +#define CONCAT_WITH_UNDERSCORE(a,b) CONCAT_WITH_UNDERSCORE_(a,b) + +#define INST_TEST_CASE_(str, ...) INSTANTIATE_TEST_SUITE_P( \ + str, convolution_test, ::testing::Values(__VA_ARGS__)) + +#define INST_TEST_CASE(str, ...) INST_TEST_CASE_( \ + CONCAT_WITH_UNDERSCORE(CONCAT_WITH_UNDERSCORE(Convolution, \ + str), eltwise), __VA_ARGS__) + +#define EXPAND_ARGS(args) args + +#define PARAMS(...) \ + EXPAND_ARGS(PARAMS_CONV(eltwise_relu, __VA_ARGS__)), \ + EXPAND_ARGS(PARAMS_CONV(eltwise_tanh, __VA_ARGS__)), \ + EXPAND_ARGS(PARAMS_CONV(eltwise_elu, __VA_ARGS__)), \ + EXPAND_ARGS(PARAMS_CONV(eltwise_square, __VA_ARGS__)), \ + EXPAND_ARGS(PARAMS_CONV(eltwise_abs, __VA_ARGS__)), \ + EXPAND_ARGS(PARAMS_CONV(eltwise_sqrt, __VA_ARGS__)), \ + EXPAND_ARGS(PARAMS_CONV(eltwise_linear, __VA_ARGS__)), \ + EXPAND_ARGS(PARAMS_CONV(eltwise_bounded_relu, __VA_ARGS__)), \ + EXPAND_ARGS(PARAMS_CONV(eltwise_soft_relu, __VA_ARGS__)), \ + EXPAND_ARGS(PARAMS_CONV(eltwise_logistic, __VA_ARGS__)), \ + EXPAND_ARGS(PARAMS_CONV(eltwise_exp, __VA_ARGS__)), \ + EXPAND_ARGS(PARAMS_CONV(eltwise_swish, __VA_ARGS__)) + +#define ELTWISE_ALPHA 0.5f +#define ELTWISE_BETA 1.5f + +#define PARAMS_CONV(alg, src, weights, bias, dst, ...) \ + test_convolution_eltwise_params_t {alg, mkldnn::engine::kind::cpu, \ + mkldnn::convolution_direct, ELTWISE_ALPHA, ELTWISE_BETA, \ + EXPAND_FORMATS(src, weights, bias, dst), /* empty attributes */ {}, \ + {__VA_ARGS__} } + + INST_TEST_CASE(SimpleSmall, + PARAMS(nchw, oihw, x, nchw, 2, 1, 32, 13, 13, 48, 11, 11, 3, 3, 0, 0, 1, 1), + PARAMS(nchw, oihw, x, nchw, 2, 1, 16, 13, 13, 48, 13, 13, 1, 1, 0, 0, 1, 1), + PARAMS(nchw, goihw, x, nchw, 2, 64, 64, 16, 16, 64, 16, 16, 3, 3, 0, 0, 1, 1), + PARAMS(nchw, goihw, x, nchw, 2, 32, 32, 9, 9, 32, 9, 9, 1, 1, 0, 0, 1, 1) + ); + + INST_TEST_CASE(SimpleSmall_Blocked16, + PARAMS(nChw16c, Goihw16g, x, nChw16c, 1, 48, 48, 20, 20, 48, 20, 20, 3, 3, 1, 1, 1, 1), + PARAMS(nChw16c, OIhw8i16o2i, x, nChw16c, 1, 1, 48, 20, 20, 48, 20, 20, 1, 1, 0, 0, 1, 1), + PARAMS(nChw16c, OIhw8i16o2i, x, nChw16c, 1, 1, 48, 20, 20, 48, 20, 20, 3, 3, 0, 0, 1, 1), + PARAMS(nChw16c, OIhw8i16o2i, x, nChw16c, 2, 1, 32, 32, 32, 32, 32, 32, 3, 3, 0, 0, 1, 1) + ); + + INST_TEST_CASE(SimpleSmall_Blocked16_Tail, + PARAMS(nChw16c, Goihw16g, x, nChw16c, 1, 47, 47, 20, 20, 47, 20, 20, 3, 3, 1, 1, 1, 1), + PARAMS(nChw16c, OIhw8i16o2i, x, nChw16c, 1, 1, 47, 20, 20, 47, 20, 20, 1, 1, 0, 0, 1, 1), + PARAMS(nChw16c, OIhw8i16o2i, x, nChw16c, 2, 1, 32, 32, 32, 32, 32, 32, 3, 3, 0, 0, 1, 1) + ); +} diff --git a/inference-engine/thirdparty/mkl-dnn/tests/gtests/test_convolution_eltwise_forward_common.hpp b/inference-engine/thirdparty/mkl-dnn/tests/gtests/test_convolution_eltwise_forward_common.hpp index 6927c796638..5d8cfeed51b 100644 --- a/inference-engine/thirdparty/mkl-dnn/tests/gtests/test_convolution_eltwise_forward_common.hpp +++ b/inference-engine/thirdparty/mkl-dnn/tests/gtests/test_convolution_eltwise_forward_common.hpp @@ -23,6 +23,13 @@ using namespace mkldnn::impl::math; namespace mkldnn { +static float bf16tof32(mkldnn_bfloat16_t bf16) { + union float_raw t = { 0 }; + t.i[1] = bf16; + t.i[0] = 0; + return t.f; +} + template void compute_ref_conv_eltwise_fwd(const test_convolution_sizes_t &c, @@ -31,6 +38,7 @@ void compute_ref_conv_eltwise_fwd(const test_convolution_sizes_t &c, float elt_alpha, float elt_beta) { data_t_src *src_data = (data_t_src *)src.get_data_handle(); + memory::data_type data_type_src = data_traits::data_type; data_t_wei *weights_data = (data_t_wei *)weights.get_data_handle(); data_t_dst *bias_data = (data_t_dst *)(w_bias ? bias.get_data_handle() : nullptr); @@ -75,8 +83,13 @@ void compute_ref_conv_eltwise_fwd(const test_convolution_sizes_t &c, + oc * padded_ic_w / c.ng * c.kh * c.kw + ic * c.kh * c.kw + kh * c.kw + kw; - dst_data[didx] += src_data[map_index(src_d, iidx)] + if (data_type_src == mkldnn_bf16) { + dst_data[didx] += bf16tof32(src_data[map_index(src_d, iidx)]) + * bf16tof32(weights_data[map_index(weights_d, widx)]); + } else { + dst_data[didx] += src_data[map_index(src_d, iidx)] * weights_data[map_index(weights_d, widx)]; + } } auto &d = dst_data[didx]; @@ -92,6 +105,7 @@ void compute_ref_conv_eltwise_fwd(const test_convolution_sizes_t &c, case eltwise_soft_relu: d = soft_relu_fwd(d); break; case eltwise_logistic: d = logistic_fwd(d); break; case eltwise_exp: d = exp_fwd(d); break; + case eltwise_gelu: d = gelu_fwd(d); break; case eltwise_clamp: d = clamp_fwd(d, elt_alpha, elt_beta); break; case eltwise_swish: d = swish_fwd(d, elt_alpha); break; default: assert(!"unknown alg_kind"); diff --git a/inference-engine/thirdparty/mkldnn.cmake b/inference-engine/thirdparty/mkldnn.cmake index baabd04a1d7..9a82e874678 100644 --- a/inference-engine/thirdparty/mkldnn.cmake +++ b/inference-engine/thirdparty/mkldnn.cmake @@ -127,15 +127,15 @@ if(GEMM STREQUAL "OPENBLAS") list(APPEND ${TARGET}_LINKER_LIBS ${BLAS_LIBRARIES}) elseif (GEMM STREQUAL "MKL") ## enable cblas_gemm from mlkml package -if(WIN32 OR APPLE) - detect_mkl("mklml") -else() - if(CMAKE_CXX_COMPILER_ID STREQUAL "Intel") - detect_mkl("mklml_intel") + if(WIN32 OR APPLE) + detect_mkl("mklml") else() - detect_mkl("mklml_gnu") + if(CMAKE_CXX_COMPILER_ID STREQUAL "Intel") + detect_mkl("mklml_intel") + else() + detect_mkl("mklml_gnu") + endif() endif() -endif() add_definitions(-DUSE_MKL -DUSE_CBLAS) include_directories(AFTER ${MKLINC}) list(APPEND ${TARGET}_LINKER_LIBS ${MKLLIB}) diff --git a/inference-engine/thirdparty/movidius/CMakeLists.txt b/inference-engine/thirdparty/movidius/CMakeLists.txt index f75dfd724bf..8dacbc13fc9 100644 --- a/inference-engine/thirdparty/movidius/CMakeLists.txt +++ b/inference-engine/thirdparty/movidius/CMakeLists.txt @@ -20,4 +20,7 @@ if (ENABLE_MYRIAD) "${IE_MAIN_SOURCE_DIR}/thirdparty/movidius/mvnc" "${CMAKE_BINARY_DIR}/thirdparty/movidius/mvnc") + if(ENABLE_TESTS) + add_subdirectory(tests) + endif() endif() diff --git a/inference-engine/thirdparty/movidius/XLink/pc/Win/src/win_synchapi.c b/inference-engine/thirdparty/movidius/XLink/pc/Win/src/win_synchapi.c index 26bd365e9e2..a9e09c4f7db 100644 --- a/inference-engine/thirdparty/movidius/XLink/pc/Win/src/win_synchapi.c +++ b/inference-engine/thirdparty/movidius/XLink/pc/Win/src/win_synchapi.c @@ -34,7 +34,12 @@ int pthread_cond_timedwait(pthread_cond_t* __cond, msec = __abstime->tv_sec * 1000 + __abstime->tv_nsec / 1000000; } - return SleepConditionVariableCS(&__cond->_cv, __mutex, (DWORD)msec); + // SleepConditionVariableCS returns bool=true on success. + if (SleepConditionVariableCS(&__cond->_cv, __mutex, (DWORD)msec)) + return 0; + + const int rc = (int)GetLastError(); + return rc == ERROR_TIMEOUT ? ETIMEDOUT : rc; } int pthread_cond_broadcast(pthread_cond_t *__cond) diff --git a/inference-engine/thirdparty/movidius/mvnc/CMakeLists.txt b/inference-engine/thirdparty/movidius/mvnc/CMakeLists.txt index a0347ba7e1a..9b997a0aa2b 100644 --- a/inference-engine/thirdparty/movidius/mvnc/CMakeLists.txt +++ b/inference-engine/thirdparty/movidius/mvnc/CMakeLists.txt @@ -73,3 +73,7 @@ if(NOT WIN32) ${LIBUSB_LIBRARY}) endif() +if(ENABLE_TESTS AND ENABLE_MYRIAD_MVNC_TESTS) + add_subdirectory(tests) +endif() + diff --git a/inference-engine/thirdparty/movidius/mvnc/src/watchdog/watchdog.cpp b/inference-engine/thirdparty/movidius/mvnc/src/watchdog/watchdog.cpp index 778bac714cc..35e0316b2a2 100644 --- a/inference-engine/thirdparty/movidius/mvnc/src/watchdog/watchdog.cpp +++ b/inference-engine/thirdparty/movidius/mvnc/src/watchdog/watchdog.cpp @@ -202,9 +202,7 @@ class WatchdogImpl { using Devices = std::list; Devices watchedDevices; - std::mutex devicesListAcc; - std::atomic generation = {0}; - std::atomic_bool threadRunning; + std::atomic_bool threadRunning {false}; pthread_mutex_t routineLock; pthread_cond_t wakeUpPingThread; @@ -215,6 +213,17 @@ class WatchdogImpl { WatchdogImpl& operator = (const WatchdogImpl&) = delete; WatchdogImpl& operator = (WatchdogImpl&&) = delete; + class AutoScope { + public: + explicit AutoScope(const std::function& func) : _func(func) {} + ~AutoScope() { _func(); } + + AutoScope(const AutoScope&) = delete; + AutoScope& operator=(const AutoScope&) = delete; + private: + std::function _func; + }; + private: WatchdogImpl() { @@ -229,6 +238,10 @@ private: if (rc != 0) { throw std::runtime_error("failed to initialize condition variable attribute. rc: " + std::to_string(rc)); } + AutoScope attrDestroy([&attr]{ + if (pthread_condattr_destroy(&attr) != 0) + mvLog(MVLOG_ERROR, "Failed to destroy condition variable attribute."); + }); rc = pthread_condattr_setclock(&attr, CLOCK_MONOTONIC); if (rc != 0) { @@ -372,14 +385,44 @@ public: } private: + /// @note: We are using here pthread_cond_timedwait as a replacement for condition_variable::wait_for, + /// as libstdc++ has bug not using monotonic clock. When GCC 10.x became minimum supported version, + /// that code could be removed. + void wait_for(const milliseconds sleepInterval) { + struct timespec timeToWait = {0, 0}; + const auto sec = std::chrono::duration_cast(sleepInterval); + +#if (defined(__APPLE__) || defined(_WIN32)) + timeToWait.tv_sec = sec.count(); + timeToWait.tv_nsec = + std::chrono::duration_cast(sleepInterval).count() - + std::chrono::nanoseconds(sec).count(); +#else + clock_gettime(CLOCK_MONOTONIC, &timeToWait); + const auto secondInNanoSeconds = 1000000000L; + const auto nsecSum = std::chrono::duration_cast(sleepInterval).count() - + std::chrono::nanoseconds(sec).count() + timeToWait.tv_nsec; + timeToWait.tv_sec += sec.count() + nsecSum / secondInNanoSeconds; + timeToWait.tv_nsec = nsecSum % secondInNanoSeconds; +#endif // (defined(__APPLE__) || defined(_WIN32)) + +#if defined(__APPLE__) + const auto rc = pthread_cond_timedwait_relative_np(&wakeUpPingThread, &routineLock, &timeToWait); +#else + const auto rc = pthread_cond_timedwait(&wakeUpPingThread, &routineLock, &timeToWait); +#endif // defined(__APPLE__) + if (rc != 0 && rc != ETIMEDOUT) { + throw std::runtime_error("Failed to perform wait in a loop for " + std::to_string(sleepInterval.count()) + " ms. rc: " + std::to_string(rc)); + } + } void watchdog_routine() noexcept { try { mvLog(MVLOG_INFO, "thread started\n"); milliseconds sleepInterval; - struct timespec timeToWait = {0, 0}; + CustomUniqueLock lock {&routineLock}; do { @@ -416,29 +459,11 @@ public: } // TODO: no timer coalescing feature, to minimized thread wakes sleepInterval = std::get<0>(*minInterval)->dueIn(currentTime); + if (sleepInterval.count() <= 0) + continue; + mvLog(MVLOG_DEBUG, "sleep interval = %ld ms\n", sleepInterval.count()); - - auto sec = std::chrono::duration_cast(sleepInterval); - -#if (defined(__APPLE__) || defined(_WIN32)) - timeToWait.tv_sec = sec.count(); - timeToWait.tv_nsec = - std::chrono::duration_cast(sleepInterval).count() - - std::chrono::nanoseconds(sec).count(); -#else - clock_gettime(CLOCK_MONOTONIC, &timeToWait); - timeToWait.tv_sec += sec.count(); - timeToWait.tv_nsec += - std::chrono::duration_cast(sleepInterval).count() - - std::chrono::nanoseconds(sec).count(); -#endif // (defined(__APPLE__) || defined(_WIN32)) - -#if defined(__APPLE__) - pthread_cond_timedwait_relative_np(&wakeUpPingThread, &routineLock, &timeToWait); -#else - pthread_cond_timedwait(&wakeUpPingThread, &routineLock, &timeToWait); -#endif // defined(__APPLE__) - + wait_for(sleepInterval); mvLog(MVLOG_DEBUG, "waiting completed in %ld ms\n", duration_cast(steady_clock::now() - currentTime).count()); diff --git a/inference-engine/thirdparty/movidius/mvnc/tests/CMakeLists.txt b/inference-engine/thirdparty/movidius/mvnc/tests/CMakeLists.txt new file mode 100644 index 00000000000..dafab99eb80 --- /dev/null +++ b/inference-engine/thirdparty/movidius/mvnc/tests/CMakeLists.txt @@ -0,0 +1,74 @@ +# Copyright (C) 2018-2020 Intel Corporation +# SPDX-License-Identifier: Apache-2.0 +# + +set(CMAKE_CXX_STANDARD 11) + +include(${XLINK_DIR}/XLink.cmake) + +set(MVNC_TESTS_COMMON_INCLUDE + "cases" + "helpers" + ) + +file(GLOB MVNC_TESTS_COMMON_SOURCES + "helpers/mvnc_test_helper.cpp" + "cases/mvnc_common_test_cases.cpp") + +set(PRIVATE_INCLUDE + ${IE_MAIN_SOURCE_DIR}/tests_new/gtest/googletest/include + ${IE_MAIN_SOURCE_DIR}/tests_new/gtest/googletest/ + ${XLINK_INCLUDE} + ${XLINK_PLATFORM_INCLUDE} + ${WATCHDOG_INCLUDE}) + +function(add_mvnc_test_target TARGET_NAME TESTS_SOURCES) + add_executable(${TARGET_NAME} ${TESTS_SOURCES} ${MVNC_TESTS_COMMON_SOURCES}) + + target_include_directories(${TARGET_NAME} + PUBLIC + "../include" + PRIVATE + ${MVNC_TESTS_COMMON_INCLUDE} + ${PRIVATE_INCLUDE}) + + if(ENABLE_MYRIAD_NO_BOOT) + target_compile_definitions(${TARGET_NAME} PRIVATE NO_BOOT) + endif() + + target_compile_definitions(${TARGET_NAME} + PRIVATE + __PC__) + + target_link_libraries(${TARGET_NAME} gtest gtest_main mvnc) + add_dependencies(${TARGET_NAME} vpu_copy_firmware) +endfunction() + +################# MvncTests ################### + +if(ENABLE_MYRIAD_NO_BOOT) + set(MVNC_TESTS_SOURCES + mvnc_no_boot_tests.cpp + cases/mvnc_no_boot_test_cases.cpp + ) +else() + set(MVNC_TESTS_SOURCES + mvnc_tests_common.cpp + mvnc_tests_usb.cpp + cases/mvnc_usb_test_cases.cpp) +endif() + +add_mvnc_test_target("MvncTests" "${MVNC_TESTS_SOURCES}") + +################# MvncStressTests ################### + +set(MVNC_STRESS_TESTS_SOURCES + mvnc_stress_tests.cpp + cases/mvnc_stress_test_cases.cpp + ) +add_mvnc_test_target("MvncStressTests" "${MVNC_STRESS_TESTS_SOURCES}") + +################# MvncUtilsTests ################### + +set(MVNC_UTILS_TESTS_SOURCES mvnc_utils_tests.cpp) +add_mvnc_test_target("MvncUtilsTests" "${MVNC_UTILS_TESTS_SOURCES}") diff --git a/inference-engine/thirdparty/movidius/mvnc/tests/cases/mvnc_common_test_cases.cpp b/inference-engine/thirdparty/movidius/mvnc/tests/cases/mvnc_common_test_cases.cpp new file mode 100644 index 00000000000..8a710ac98f5 --- /dev/null +++ b/inference-engine/thirdparty/movidius/mvnc/tests/cases/mvnc_common_test_cases.cpp @@ -0,0 +1,122 @@ +// Copyright (C) 2018-2020 Intel Corporation +// SPDX-License-Identifier: Apache-2.0 +// + +#include "mvnc_common_test_cases.h" + +//------------------------------------------------------------------------------ +// Implementation of class MvncTestsCommon +//------------------------------------------------------------------------------ +MvncTestsCommon::MvncTestsCommon() { +#if !(defined(_WIN32) || defined(_WIN64)) + // On linux we should use custom path to firmware due to another searching mechanism for library + strcpy(firmwarePath, "./lib"); +#else + firmwarePath[0] = 0; +#endif +} + +void MvncTestsCommon::SetUp() { + initialize_usb_boot(); + ASSERT_NO_ERROR(setLogLevel(ncLogLevel)); + availableDevices_ = getAmountOfDevices(); +} + +void MvncTestsCommon::TearDown() { + ncDeviceResetAll(); +} + +int MvncTestsCommon::setLogLevel(const mvLog_t logLevel) { + ncStatus_t status = ncGlobalSetOption(NC_RW_LOG_LEVEL, &logLevel, + sizeof(logLevel)); + if (status != NC_OK) { + fprintf(stderr, + "WARNING: failed to set log level: %d with error: %d\n", + ncLogLevel, status); + return -1; + } + ncLogLevel = logLevel; + return 0; +} + +void MvncTestsCommon::openDevices(const int devicesToBoot, ncDeviceHandle_t **deviceHandlers, + int &amountOfBooted) { + ASSERT_TRUE(deviceHandlers != nullptr); + const int availableDevices = getAmountOfDevices(NC_USB); + if (availableDevices < devicesToBoot) { + GTEST_SKIP_("Not enough devices"); + } + + amountOfBooted = 0; + ncDeviceDescr_t ncDeviceDesc = {}; + ncDeviceDesc.protocol = NC_USB; + ncDeviceDesc.platform = NC_ANY_PLATFORM; + + for (int index = 0; index < devicesToBoot; ++index) { + ASSERT_NO_ERROR(ncDeviceOpen(&deviceHandlers[index], ncDeviceDesc, watchdogInterval, firmwarePath)); + ASSERT_TRUE(deviceHandlers[index] != nullptr); + ++amountOfBooted; + } + ASSERT_EQ(amountOfBooted, devicesToBoot) << "Not all devices was loaded"; +} + +void MvncTestsCommon::bootOneDevice(ncDeviceProtocol_t deviceProtocol) { + if (deviceProtocol == NC_PCIE) { + GTEST_FATAL_FAILURE_("Boot doesn't supported for PCIe protocol\n"); + } + ASSERT_NO_ERROR(ncDeviceLoadFirmware(NC_ANY_PLATFORM, firmwarePath)); +} + +//------------------------------------------------------------------------------ +// Implementation of class MvncOpenDevice +//------------------------------------------------------------------------------ +void MvncOpenDevice::SetUp() { + MvncTestsCommon::SetUp(); + + _deviceProtocol = GetParam(); + availableDevices_ = getAmountOfDevices(_deviceProtocol); +} + +//------------------------------------------------------------------------------ +// Implementation of class MvncLoggingTests +//------------------------------------------------------------------------------ +void MvncLoggingTests::SetUp() { + MvncOpenDevice::SetUp(); + + _deviceDesc.protocol = _deviceProtocol; + _deviceDesc.platform = NC_ANY_PLATFORM; + + for (int index = 0; index < availableDevices_; ++index) { + ASSERT_NO_ERROR(ncDeviceOpen(&_deviceHandles[index], _deviceDesc, watchdogInterval, firmwarePath)); + } + + setbuf(stdout, buff); + fprintf(stdout, "[workaround for getting full content from XLink]\n"); +} + +void MvncLoggingTests::TearDown() { + setbuf(stdout, NULL); + for (int index = 0; index < availableDevices_; ++index) { + ASSERT_NO_ERROR(ncDeviceClose(&_deviceHandles[index])); + } +} + +//------------------------------------------------------------------------------ +// Implementation of class MvncGraphAllocations +//------------------------------------------------------------------------------ +void MvncGraphAllocations::SetUp() { + MvncOpenDevice::SetUp(); + + // Load blob + blobLoaded = readBINFile(blobPath, _blob); + if (!blobLoaded) { + std::cout << blobPath << " blob for test not found\n"; + } +} + +void MvncGraphAllocations::TearDown() { + for (int index = 0; index < _bootedDevices; ++index) { + ASSERT_NO_ERROR(ncDeviceClose(&_deviceHandle[index])); + } + _bootedDevices = 0; +} diff --git a/inference-engine/thirdparty/movidius/mvnc/tests/cases/mvnc_common_test_cases.h b/inference-engine/thirdparty/movidius/mvnc/tests/cases/mvnc_common_test_cases.h new file mode 100644 index 00000000000..f2add94a82d --- /dev/null +++ b/inference-engine/thirdparty/movidius/mvnc/tests/cases/mvnc_common_test_cases.h @@ -0,0 +1,155 @@ +// Copyright (C) 2018-2020 Intel Corporation +// SPDX-License-Identifier: Apache-2.0 +// + +#pragma once + +#if (defined(_WIN32) || defined(_WIN64)) +#include "windows.h" +#endif + +#include +#include + +#include "mvnc.h" +#include "mvnc_ext.h" +#include "XLinkLog.h" +#include "mvnc_test_helper.h" + +//------------------------------------------------------------------------------ +// Helpers +//------------------------------------------------------------------------------ +constexpr std::chrono::seconds operator "" _sec(unsigned long long s) +{ + return std::chrono::seconds(s); +} + +//------------------------------------------------------------------------------ +// class MvncTestsCommon +//------------------------------------------------------------------------------ +class MvncTestsCommon : public ::testing::Test { +public: + char firmwarePath[MAX_PATH] = {}; + mvLog_t ncLogLevel = MVLOG_INFO; + int watchdogInterval = 1000; + int availableDevices_ = 0; + + ~MvncTestsCommon() override = default; + MvncTestsCommon(); +protected: + + void SetUp() override; + void TearDown() override; + +public: + int setLogLevel(const mvLog_t logLevel); + + /** + * @brief Boot and open selected amount of device + * @param[out] amountOfBooted Amount of device which was booted + * @param[out] deviceHandlers Pre-allocated array for handlers + */ + void openDevices(const int devicesToBoot, ncDeviceHandle_t** deviceHandlers, + int& amountOfBooted); + + /** + * @brief Load firmware to device + * @warning Only USB devices is supported + */ + virtual void bootOneDevice(ncDeviceProtocol_t deviceProtocol= NC_USB); +}; + +//------------------------------------------------------------------------------ +// class MvncOpenDevice +//------------------------------------------------------------------------------ +class MvncOpenDevice : public MvncTestsCommon, + public testing::WithParamInterface { +protected: + ncDeviceProtocol_t _deviceProtocol = NC_ANY_PROTOCOL; + + ~MvncOpenDevice() override = default; + void SetUp() override; + +}; + +//------------------------------------------------------------------------------ +// class MvncLoggingTests +//------------------------------------------------------------------------------ +class MvncLoggingTests : public MvncOpenDevice { +public: + char buff[BUFSIZ] = {}; +protected: + ncDeviceHandle_t * _deviceHandles[MAX_DEVICES] = {nullptr}; + ncDeviceDescr_t _deviceDesc = {}; + + void SetUp() override; + void TearDown() override; + ~MvncLoggingTests() override = default; +}; + +//------------------------------------------------------------------------------ +// class MvncGraphAllocations +//------------------------------------------------------------------------------ +/** + * @brief Test transfer data from host to device + * @detail Allocate 2 devices and test some graph allocate cases + * @warning For correct testing should be used blob with size more than 30mb + */ +class MvncGraphAllocations: public MvncOpenDevice { +public: + // Devices + ncDeviceHandle_t * _deviceHandle[MAX_DEVICES] = {nullptr}; + int _bootedDevices = 0; + + // Graphs + ncGraphHandle_t* _graphHandle[MAX_DEVICES] = {nullptr}; + + // Blob + const std::string blobPath = "bvlc_googlenet_fp16.blob"; + std::vector _blob; + bool blobLoaded = false; + +protected: + void SetUp() override; + void TearDown() override; + ~MvncGraphAllocations() override = default; +}; + +//------------------------------------------------------------------------------ +// class MvncCloseDevice +//------------------------------------------------------------------------------ +class MvncCloseDevice : public MvncTestsCommon { +protected: + ~MvncCloseDevice() override = default; +}; + +//------------------------------------------------------------------------------ +// Parametric tests initialization +//------------------------------------------------------------------------------ +static const std::vector myriadProtocols = { + NC_USB, + NC_PCIE +}; + +static const std::vector myriadPlatforms = { + NC_MYRIAD_2, + NC_MYRIAD_X +}; + + +namespace { + /** + * @brief Converter from enum to string + */ + struct PrintToStringParamName { + std::string operator()( + const ::testing::TestParamInfo &info) const { + return ncProtocolToStr(info.param); + } + + std::string operator()( + const ::testing::TestParamInfo &info) const { + return std::string("USB_") + ncPlatformToStr(info.param); + } + }; +} diff --git a/inference-engine/thirdparty/movidius/mvnc/tests/cases/mvnc_no_boot_test_cases.cpp b/inference-engine/thirdparty/movidius/mvnc/tests/cases/mvnc_no_boot_test_cases.cpp new file mode 100644 index 00000000000..adfef69bb77 --- /dev/null +++ b/inference-engine/thirdparty/movidius/mvnc/tests/cases/mvnc_no_boot_test_cases.cpp @@ -0,0 +1,27 @@ +// Copyright (C) 2018-2020 Intel Corporation +// SPDX-License-Identifier: Apache-2.0 +// + +#include "mvnc_no_boot_test_cases.h" + +//------------------------------------------------------------------------------ +// Implementation of class MvncNoBootTests +//------------------------------------------------------------------------------ +void MvncNoBootTests::bootOneDevice() { + // In case already booted device exist, do nothing + if (getAmountOfBootedDevices() == 0) { + MvncTestsCommon::bootOneDevice(NC_USB); + } +} + +//------------------------------------------------------------------------------ +// Implementation of class MvncNoBootOpenDevice +//------------------------------------------------------------------------------ +void MvncNoBootOpenDevice::SetUp() { + MvncNoBootTests::SetUp(); + available_devices = getAmountOfDevices(NC_USB); + ASSERT_TRUE(available_devices > 0); + + // With NO_BOOT option we should boot device with firmware before trying to open + bootOneDevice(); +} diff --git a/inference-engine/thirdparty/movidius/mvnc/tests/cases/mvnc_no_boot_test_cases.h b/inference-engine/thirdparty/movidius/mvnc/tests/cases/mvnc_no_boot_test_cases.h new file mode 100644 index 00000000000..d00ef1e2018 --- /dev/null +++ b/inference-engine/thirdparty/movidius/mvnc/tests/cases/mvnc_no_boot_test_cases.h @@ -0,0 +1,36 @@ +// Copyright (C) 2018-2020 Intel Corporation +// SPDX-License-Identifier: Apache-2.0 +// + +#pragma once + +#include "mvnc_common_test_cases.h" + +//------------------------------------------------------------------------------ +// class MvncNoBootTests +//------------------------------------------------------------------------------ +class MvncNoBootTests: public MvncTestsCommon { +public: + void bootOneDevice(); +protected: + ~MvncNoBootTests() override = default; +}; + +//------------------------------------------------------------------------------ +// class MvncNoBootOpenDevice +//------------------------------------------------------------------------------ +class MvncNoBootOpenDevice : public MvncNoBootTests { +public: + int available_devices = 0; +protected: + ~MvncNoBootOpenDevice() override = default; + void SetUp() override; +}; + +//------------------------------------------------------------------------------ +// class MvncNoBootCloseDevice +//------------------------------------------------------------------------------ +class MvncNoBootCloseDevice : public MvncNoBootTests { +protected: + ~MvncNoBootCloseDevice() override = default; +}; diff --git a/inference-engine/thirdparty/movidius/mvnc/tests/cases/mvnc_stress_test_cases.cpp b/inference-engine/thirdparty/movidius/mvnc/tests/cases/mvnc_stress_test_cases.cpp new file mode 100644 index 00000000000..fe108597210 --- /dev/null +++ b/inference-engine/thirdparty/movidius/mvnc/tests/cases/mvnc_stress_test_cases.cpp @@ -0,0 +1,25 @@ +// Copyright (C) 2018-2020 Intel Corporation +// SPDX-License-Identifier: Apache-2.0 +// + +#include "mvnc_stress_test_cases.h" + +//------------------------------------------------------------------------------ +// Implementation of class MvncStressTests +//------------------------------------------------------------------------------ +void MvncStressTests::SetUp() { + MvncTestsCommon::SetUp(); + + _deviceProtocol = GetParam(); + available_devices = getAmountOfDevices(_deviceProtocol); + ASSERT_TRUE(available_devices > 0) << ncProtocolToStr(_deviceProtocol) + << " devices not found"; + ASSERT_NO_ERROR(setLogLevel(MVLOG_WARN)); + +#ifdef NO_BOOT + // In case already booted device exist, do nothing + if (getAmountOfBootedDevices() == 0) { + MvncTestsCommon::bootOneDevice(NC_USB); + } +#endif +} diff --git a/inference-engine/thirdparty/movidius/mvnc/tests/cases/mvnc_stress_test_cases.h b/inference-engine/thirdparty/movidius/mvnc/tests/cases/mvnc_stress_test_cases.h new file mode 100644 index 00000000000..e536ecc7973 --- /dev/null +++ b/inference-engine/thirdparty/movidius/mvnc/tests/cases/mvnc_stress_test_cases.h @@ -0,0 +1,22 @@ +// Copyright (C) 2018-2020 Intel Corporation +// SPDX-License-Identifier: Apache-2.0 +// + +#pragma once + +#include "mvnc_common_test_cases.h" + +//------------------------------------------------------------------------------ +// class MvncStressTests +//------------------------------------------------------------------------------ +class MvncStressTests : public MvncTestsCommon, + public testing::WithParamInterface{ +public: + int available_devices = 0; + +protected: + ~MvncStressTests() override = default; + void SetUp() override; + + ncDeviceProtocol_t _deviceProtocol = NC_ANY_PROTOCOL; +}; diff --git a/inference-engine/thirdparty/movidius/mvnc/tests/cases/mvnc_usb_test_cases.cpp b/inference-engine/thirdparty/movidius/mvnc/tests/cases/mvnc_usb_test_cases.cpp new file mode 100644 index 00000000000..5a105980454 --- /dev/null +++ b/inference-engine/thirdparty/movidius/mvnc/tests/cases/mvnc_usb_test_cases.cpp @@ -0,0 +1,31 @@ +// Copyright (C) 2018-2020 Intel Corporation +// SPDX-License-Identifier: Apache-2.0 +// + +#include "mvnc_usb_test_cases.h" + +//------------------------------------------------------------------------------ +// Implementation of class MvncOpenUSBDevice +//------------------------------------------------------------------------------ +void MvncOpenUSBDevice::SetUp() { + ncDeviceResetAll(); + MvncTestsCommon::SetUp(); + + availableDevices_ = getAmountOfNotBootedDevices(NC_USB); + + deviceDesc_.protocol = NC_USB; + deviceDesc_.platform = NC_ANY_PLATFORM; +} + +//------------------------------------------------------------------------------ +// Implementation of class MvncDevicePlatform +//------------------------------------------------------------------------------ +void MvncDevicePlatform::SetUp() { + MvncOpenUSBDevice::SetUp(); + + available_myriadX_ = getAmountOfMyriadXDevices(NC_USB); + available_myriad2_ = getAmountOfMyriad2Devices(NC_USB); + + devicePlatform_ = GetParam(); + deviceDesc_.platform = devicePlatform_; +} diff --git a/inference-engine/thirdparty/movidius/mvnc/tests/cases/mvnc_usb_test_cases.h b/inference-engine/thirdparty/movidius/mvnc/tests/cases/mvnc_usb_test_cases.h new file mode 100644 index 00000000000..73ef6a220a4 --- /dev/null +++ b/inference-engine/thirdparty/movidius/mvnc/tests/cases/mvnc_usb_test_cases.h @@ -0,0 +1,43 @@ +// Copyright (C) 2018-2020 Intel Corporation +// SPDX-License-Identifier: Apache-2.0 +// + +#pragma once + +#include "mvnc_common_test_cases.h" + +//------------------------------------------------------------------------------ +// class MvncOpenUSBDevice +//------------------------------------------------------------------------------ +class MvncOpenUSBDevice : public MvncTestsCommon { +public: + ncDeviceHandle_t* deviceHandle_ = nullptr; + ncDeviceDescr_t deviceDesc_ = {}; + + ~MvncOpenUSBDevice() override = default; + +protected: + void SetUp() override; +}; + +//------------------------------------------------------------------------------ +// class MvncCloseUSBDevice +//------------------------------------------------------------------------------ +class MvncCloseUSBDevice : public MvncOpenUSBDevice { +}; + +//------------------------------------------------------------------------------ +// class MvncDevicePlatform +//------------------------------------------------------------------------------ +class MvncDevicePlatform : public MvncOpenUSBDevice, + public testing::WithParamInterface{ +public: + long available_myriadX_ = 0; + long available_myriad2_ = 0; + ncDevicePlatform_t devicePlatform_; + + ~MvncDevicePlatform() override = default; + +protected: + void SetUp() override; +}; diff --git a/inference-engine/thirdparty/movidius/mvnc/tests/helpers/mvnc_test_helper.cpp b/inference-engine/thirdparty/movidius/mvnc/tests/helpers/mvnc_test_helper.cpp new file mode 100644 index 00000000000..ef5c417c3cb --- /dev/null +++ b/inference-engine/thirdparty/movidius/mvnc/tests/helpers/mvnc_test_helper.cpp @@ -0,0 +1,140 @@ +// Copyright (C) 2018-2020 Intel Corporation +// SPDX-License-Identifier: Apache-2.0 +// + +#include +#include "mvnc_data.h" +#include "mvnc_test_helper.h" + +//------------------------------------------------------------------------------ +// Implementations of helpers - counters +//------------------------------------------------------------------------------ +int getAmountOfDevices(const ncDeviceProtocol_t deviceProtocol, + const ncDevicePlatform_t devicePlatform, + const XLinkDeviceState_t state) { + deviceDesc_t req_deviceDesc = {}; + req_deviceDesc.protocol = convertProtocolToXlink(deviceProtocol); + req_deviceDesc.platform = convertPlatformToXlink(devicePlatform); + + deviceDesc_t deviceDescArray[NC_MAX_DEVICES] = {}; + unsigned int foundDevices = 0; + XLinkFindAllSuitableDevices( + state, req_deviceDesc, deviceDescArray, NC_MAX_DEVICES, &foundDevices); + + return foundDevices; +} + +long getAmountOfMyriadXDevices(ncDeviceProtocol_t deviceProtocol) { + return getAmountOfDevices(deviceProtocol, NC_MYRIAD_X); +} + +long getAmountOfMyriad2Devices(ncDeviceProtocol_t deviceProtocol) { + return getAmountOfDevices(deviceProtocol, NC_MYRIAD_2); +} + +long getAmountOfBootedDevices(ncDeviceProtocol_t deviceProtocol) { + return getAmountOfDevices(deviceProtocol, NC_ANY_PLATFORM, X_LINK_BOOTED); +} + +long getAmountOfNotBootedDevices(ncDeviceProtocol_t deviceProtocol) { + return getAmountOfDevices(deviceProtocol, NC_ANY_PLATFORM, X_LINK_UNBOOTED); +} + +long getAmountOfPCIeDevices() { + return getAmountOfDevices(NC_PCIE); +} + +long getAmountOfUSBDevices() { + return getAmountOfDevices(NC_USB); +} + +//------------------------------------------------------------------------------ +// Implementations of helpers - get devices +//------------------------------------------------------------------------------ +std::vector getDevicesList(const ncDeviceProtocol_t deviceProtocol, + const ncDevicePlatform_t devicePlatform, + const XLinkDeviceState_t state) { + + deviceDesc_t req_deviceDesc = {}; + req_deviceDesc.protocol = convertProtocolToXlink(deviceProtocol); + req_deviceDesc.platform = convertPlatformToXlink(devicePlatform); + + deviceDesc_t deviceDescArray[NC_MAX_DEVICES] = {}; + unsigned int foundDevices = 0; + XLinkFindAllSuitableDevices( + state, req_deviceDesc, deviceDescArray, NC_MAX_DEVICES, &foundDevices); + + std::vector < std::string > devNames; + for (int i = 0; i < foundDevices; ++i) { + devNames.emplace_back(deviceDescArray[i].name); + } + + return devNames; +} + +//------------------------------------------------------------------------------ +// Implementation of helpers - comparators +//------------------------------------------------------------------------------ +bool isMyriadXUSBDevice(const std::string &deviceName) { + return (deviceName.find(MYRIAD_X_NAME_STR) != std::string::npos); +} + +bool isMyriad2USBDevice(const std::string &deviceName) { + return (deviceName.find(MYRIAD_2_NAME_STR) != std::string::npos); +} + +bool isMyriadPCIeDevice(const std::string &deviceName) { + return deviceName.find(std::string(PCIE_NAME_STR)) != std::string::npos; +} + +bool isMyriadUSBDevice(const std::string &deviceName) { + return (isMyriad2USBDevice(deviceName) + || isMyriadXUSBDevice(deviceName) + || isMyriadBootedUSBDevice(deviceName)); +} + +bool isMyriadBootedUSBDevice(const std::string &deviceName) { + return (!isMyriad2USBDevice(deviceName) && + !isMyriadXUSBDevice(deviceName) && + !isMyriadPCIeDevice(deviceName)); +} + +bool isSameProtocolDevice(const std::string &deviceName, const ncDeviceProtocol_t expectedProtocol) { + switch (expectedProtocol) { + case NC_USB: return isMyriadUSBDevice(deviceName); + case NC_PCIE: return isMyriadPCIeDevice(deviceName); + case NC_ANY_PROTOCOL: + return isMyriadPCIeDevice(deviceName) || isMyriadUSBDevice(deviceName); + default: + std::cout << "Unknown device protocol" << std::endl; + return false; + } +} + +bool +isSamePlatformUSBDevice(const std::string &deviceName, const ncDevicePlatform_t expectedPlatform) { + switch (expectedPlatform) { + case NC_MYRIAD_2: return isMyriad2USBDevice(deviceName); + case NC_MYRIAD_X: return isMyriadXUSBDevice(deviceName); + case NC_ANY_PLATFORM: + return isMyriad2USBDevice(deviceName) || isMyriadXUSBDevice(deviceName); + default: + std::cout << "Unknown device platform" << std::endl; + return false; + } +} + +//------------------------------------------------------------------------------ +// Implementation of helpers - file loader +//------------------------------------------------------------------------------ +bool readBINFile(const std::string &fileName, std::vector &buf) { + std::ifstream file(fileName, std::ios_base::binary | std::ios_base::ate); + if (file.fail()) { + std::cout << "Can't open file!" << std::endl; + return false; + } + buf.resize(static_cast(file.tellg())); + file.seekg(0); + file.read(buf.data(), buf.size()); + return true; +} diff --git a/inference-engine/thirdparty/movidius/mvnc/tests/helpers/mvnc_test_helper.h b/inference-engine/thirdparty/movidius/mvnc/tests/helpers/mvnc_test_helper.h new file mode 100644 index 00000000000..07c5283150c --- /dev/null +++ b/inference-engine/thirdparty/movidius/mvnc/tests/helpers/mvnc_test_helper.h @@ -0,0 +1,121 @@ +// Copyright (C) 2018-2020 Intel Corporation +// SPDX-License-Identifier: Apache-2.0 +// + +#pragma once + +#include +#include +#include + +#include "XLink.h" +#include "mvnc.h" + +//------------------------------------------------------------------------------ +// Macroses +//------------------------------------------------------------------------------ +#define ASSERT_NO_ERROR(call) ASSERT_EQ(call, 0) +#define ASSERT_ERROR(call) ASSERT_TRUE(call) + + +//------------------------------------------------------------------------------ +// Defines +//------------------------------------------------------------------------------ +#define MYRIAD_X_NAME_STR "ma2480" +#define MYRIAD_2_NAME_STR "ma2450" + +#if (defined(_WIN32) || defined(_WIN64)) +#define PCIE_NAME_STR "mxlink" +#else +#define PCIE_NAME_STR "mxlk" +#endif + +const int MAX_DEVICES = 32; +const int MAX_DEV_NAME = 20; + +#ifndef MAX_PATH +const int MAX_PATH = 255; +#endif + +//------------------------------------------------------------------------------ +// Usb initialization +//------------------------------------------------------------------------------ +// Without this initialization find device on windows could not work +#if (defined(_WIN32) || defined(_WIN64) ) +extern "C" void initialize_usb_boot(); +#else +#define initialize_usb_boot() +#endif + + +//------------------------------------------------------------------------------ +// Helpers - counters +//------------------------------------------------------------------------------ +/** + * @brief Get amount of all currently connected Myriad devices + * @param[in] deviceProtocol Count only platform specific devices + */ +int getAmountOfDevices(const ncDeviceProtocol_t deviceProtocol = NC_ANY_PROTOCOL, + const ncDevicePlatform_t devicePlatform = NC_ANY_PLATFORM, + const XLinkDeviceState_t state = X_LINK_ANY_STATE); + +long getAmountOfMyriadXDevices(ncDeviceProtocol_t deviceProtocol = NC_ANY_PROTOCOL); + +long getAmountOfMyriad2Devices(ncDeviceProtocol_t deviceProtocol = NC_ANY_PROTOCOL); + +long getAmountOfBootedDevices(ncDeviceProtocol_t deviceProtocol = NC_ANY_PROTOCOL); + +long getAmountOfNotBootedDevices(ncDeviceProtocol_t deviceProtocol = NC_ANY_PROTOCOL); + +long getAmountOfPCIeDevices(); + +long getAmountOfUSBDevices(); + +//------------------------------------------------------------------------------ +// Helpers - get devices +//------------------------------------------------------------------------------ +/** + * @brief Get list of all currently connected Myriad devices + */ +std::vector getDevicesList( + const ncDeviceProtocol_t deviceProtocol = NC_ANY_PROTOCOL, + const ncDevicePlatform_t devicePlatform = NC_ANY_PLATFORM, + const XLinkDeviceState_t state = X_LINK_ANY_STATE); + +//------------------------------------------------------------------------------ +// Helpers - comparators +//------------------------------------------------------------------------------ +bool isMyriadXUSBDevice(const std::string &deviceName); + +bool isMyriad2USBDevice(const std::string &deviceName); + +bool isMyriadPCIeDevice(const std::string& deviceName); + +/** + * @warning The booted USB device will also be counted here. + */ +bool isMyriadUSBDevice(const std::string& deviceName); + +bool isMyriadBootedUSBDevice(const std::string &deviceName); + +/** + * @brief Check that device matches the specified protocol + */ +bool isSameProtocolDevice(const std::string &deviceName, + const ncDeviceProtocol_t expectedProtocol); + +/** +* @brief Check that device matches the specified platform for USB +*/ +bool isSamePlatformUSBDevice(const std::string &deviceName, + const ncDevicePlatform_t expectedPlatform); + +//------------------------------------------------------------------------------ +// Helpers - file loader +//------------------------------------------------------------------------------ +/** + * @brief Read blob + * @param fileName Path to blob from bin directory + * @return True if blob is readed without problem + */ +bool readBINFile(const std::string& fileName, std::vector& buf); diff --git a/inference-engine/thirdparty/movidius/mvnc/tests/mvnc_no_boot_tests.cpp b/inference-engine/thirdparty/movidius/mvnc/tests/mvnc_no_boot_tests.cpp new file mode 100644 index 00000000000..41184430650 --- /dev/null +++ b/inference-engine/thirdparty/movidius/mvnc/tests/mvnc_no_boot_tests.cpp @@ -0,0 +1,102 @@ +// Copyright (C) 2018-2020 Intel Corporation +// SPDX-License-Identifier: Apache-2.0 +// + +#include "mvnc.h" +#include "mvnc_no_boot_test_cases.h" + +//------------------------------------------------------------------------------ +// MvncNoBootOpenDevice Tests +//------------------------------------------------------------------------------ +/** +* @brief Open any device and close it +*/ +TEST_F(MvncNoBootOpenDevice, OpenAndClose) { + ncDeviceHandle_t *deviceHandle = nullptr; + ncDeviceDescr_t deviceDesc = {}; + deviceDesc.protocol = NC_USB; + deviceDesc.platform = NC_ANY_PLATFORM; + + ASSERT_NO_ERROR(ncDeviceOpen(&deviceHandle, deviceDesc, watchdogInterval, firmwarePath)); + ASSERT_NO_ERROR(ncDeviceClose(&deviceHandle)); +} + +/** +* @brief Try to open device twice. DeviceHandle shouldn't be overwritten +*/ +TEST_F(MvncNoBootOpenDevice, OpenTwiceSameHandler) { + ncDeviceHandle_t *deviceHandle = nullptr; + ncDeviceDescr_t deviceDesc = {}; + deviceDesc.protocol = NC_USB; + deviceDesc.platform = NC_ANY_PLATFORM; + + char dev_addr_first_open[MAX_DEV_NAME]; + unsigned int data_lenght_first = MAX_DEV_NAME; + + char dev_addr_second_open[MAX_DEV_NAME]; + unsigned int data_lenght_second = MAX_DEV_NAME; + + // First open, get device name + ASSERT_NO_ERROR(ncDeviceOpen(&deviceHandle, deviceDesc, watchdogInterval, firmwarePath)); + ASSERT_NO_ERROR(ncDeviceGetOption(deviceHandle, NC_RO_DEVICE_NAME, + dev_addr_first_open, &data_lenght_first)); + + // Second open, get device name + ASSERT_NO_ERROR(ncDeviceOpen(&deviceHandle, deviceDesc, watchdogInterval, firmwarePath)); + ASSERT_NO_ERROR(ncDeviceGetOption(deviceHandle, NC_RO_DEVICE_NAME, + dev_addr_second_open, &data_lenght_second)); + + ASSERT_NO_ERROR(ncDeviceClose(&deviceHandle)); + // Should be the same device + ASSERT_STREQ(dev_addr_first_open, dev_addr_second_open); +} + + +/** + * @brief Open device twice one run after another. It should check, that link to device closed correctly + * @note Mostly this test important for PCIE and connect to booted option, as in that cases XLinkReset have another behavior + */ +TEST_F(MvncNoBootOpenDevice, OpenDeviceWithOneXLinkInitializion) { + ncDeviceHandle_t *deviceHandle = nullptr; + ncDeviceDescr_t deviceDesc = {}; + deviceDesc.protocol = NC_USB; + deviceDesc.platform = NC_ANY_PLATFORM; + + ASSERT_NO_ERROR(ncDeviceOpen(&deviceHandle, deviceDesc, watchdogInterval, firmwarePath)); + ASSERT_NO_ERROR(ncDeviceClose(&deviceHandle)); + + // Second open + ASSERT_NO_ERROR(ncDeviceOpen(&deviceHandle, deviceDesc, watchdogInterval, firmwarePath)); + ASSERT_NO_ERROR(ncDeviceClose(&deviceHandle)); + +} + +//------------------------------------------------------------------------------ +// MvncNoBootCloseDevice Tests +//------------------------------------------------------------------------------ +/** +* @brief Correct closing if handle is empty +*/ +TEST_F(MvncNoBootCloseDevice, EmptyDeviceHandler) { + ncDeviceHandle_t *deviceHandle = nullptr; + ASSERT_NO_ERROR(ncDeviceClose(&deviceHandle)); +} + +/** +* @brief Device, which was booted before open, shouldn't reboot after ncDeviceClose call +*/ +TEST_F(MvncNoBootCloseDevice, AlreadyBootedDeviceWillNotReboot) { + bootOneDevice(); + + ASSERT_EQ(getAmountOfBootedDevices(), 1); + + ncDeviceHandle_t *deviceHandle = nullptr; + ncDeviceDescr_t deviceDesc = {}; + deviceDesc.protocol = NC_USB; + deviceDesc.platform = NC_ANY_PLATFORM; + + ASSERT_NO_ERROR(ncDeviceOpen(&deviceHandle, deviceDesc, watchdogInterval, firmwarePath)); + ASSERT_NO_ERROR(ncDeviceClose(&deviceHandle)); + + ASSERT_EQ(getAmountOfBootedDevices(), 1); +} diff --git a/inference-engine/thirdparty/movidius/mvnc/tests/mvnc_stress_tests.cpp b/inference-engine/thirdparty/movidius/mvnc/tests/mvnc_stress_tests.cpp new file mode 100644 index 00000000000..1cdaf8b66e2 --- /dev/null +++ b/inference-engine/thirdparty/movidius/mvnc/tests/mvnc_stress_tests.cpp @@ -0,0 +1,157 @@ +// Copyright (C) 2018-2020 Intel Corporation +// SPDX-License-Identifier: Apache-2.0 +// + +#include + +#include "mvnc.h" +#include "ncPrivateTypes.h" +#include "mvnc_stress_test_cases.h" + +//------------------------------------------------------------------------------ +// MvncStressTests Tests +//------------------------------------------------------------------------------ +/** +* @brief Open and close device for 1001 times +*/ +TEST_P(MvncStressTests, OpenClose1001) { + const int iterations = 1001; + ncDeviceHandle_t *deviceHandle = nullptr; + ncDeviceDescr_t deviceDesc = {}; + deviceDesc.protocol = _deviceProtocol; + deviceDesc.platform = NC_ANY_PLATFORM; + + for (int i = 0; i < iterations; ++i) { + printf("Iteration %d of %d\n", i, iterations); + ASSERT_NO_ERROR(ncDeviceOpen(&deviceHandle, deviceDesc, watchdogInterval, firmwarePath)); + ASSERT_NO_ERROR(ncDeviceClose(&deviceHandle)); + deviceHandle = nullptr; + } +} + +/** +* @brief Allocate and deallocate graph on device for 1001 times +*/ +TEST_P(MvncStressTests, AllocateDeallocateGraph1001) { + const int iterations = 1001; + ncDeviceDescr_t deviceDesc = {}; + deviceDesc.protocol = _deviceProtocol; + deviceDesc.platform = NC_ANY_PLATFORM; + + // Load graph + const std::string blobPath = "bvlc_googlenet_fp16.blob"; + std::vector _blob; + + if (!readBINFile(blobPath, _blob)) GTEST_SKIP_("Blob not found\n"); + + // Open device + ncDeviceHandle_t *deviceHandle = nullptr; + ASSERT_NO_ERROR(ncDeviceOpen(&deviceHandle, deviceDesc, watchdogInterval, firmwarePath)); + + for (int i = 0; i < iterations; ++i) { + printf("Iteration %d of %d\n", i, iterations); + + // Create graph handlers + ncGraphHandle_t* graphHandle = nullptr; + std::string graphName = "graph"; + + ASSERT_NO_ERROR(ncGraphCreate(graphName.c_str(), &graphHandle)); + ASSERT_TRUE(graphHandle != nullptr); + + // Allocate graph + ASSERT_NO_ERROR(ncGraphAllocate(deviceHandle, graphHandle, + _blob.data(), _blob.size(), // Blob + _blob.data(), sizeof(ElfN_Ehdr) + sizeof(blob_header_v2)) ); // Header + + // Destroy graph + ASSERT_NO_ERROR(ncGraphDestroy(&graphHandle)); + } + ASSERT_NO_ERROR(ncDeviceClose(&deviceHandle)); +} + + +/** +* @brief Run the full cycle of inference 101 times. +* It includes opening device, allocating graph and fifos, inference, + * destroying graph and fifos, closing device +*/ +TEST_P(MvncStressTests, FullCycleOfWork101Times) { + const int iterations = 101; + ncDeviceDescr_t deviceDesc = {}; + deviceDesc.protocol = _deviceProtocol; + deviceDesc.platform = NC_ANY_PLATFORM; + + const std::string blobPath = "bvlc_googlenet_fp16.blob"; + std::vector blob; + if (!readBINFile(blobPath, blob)) GTEST_SKIP_("Blob not found\n"); + + for (int i = 0; i < iterations; i++) { + ncDeviceHandle_t *deviceHandle = nullptr; + ASSERT_NO_ERROR(ncDeviceOpen(&deviceHandle, deviceDesc, watchdogInterval, firmwarePath)); + + ncGraphHandle_t* graphHandle = nullptr; + std::string graphName = "graph"; + ASSERT_NO_ERROR(ncGraphCreate(graphName.c_str(), &graphHandle)); + ASSERT_TRUE(graphHandle != nullptr); + + ASSERT_NO_ERROR(ncGraphAllocate(deviceHandle, graphHandle, + blob.data(), blob.size(), // Blob + blob.data(), sizeof(ElfN_Ehdr) + sizeof(blob_header_v2) )); + + + unsigned int dataLength = sizeof(int); + + int numInputs = 0; + ASSERT_NO_ERROR(ncGraphGetOption(graphHandle, NC_RO_GRAPH_INPUT_COUNT, &numInputs, &dataLength)); + + int numOutputs = 0; + ASSERT_NO_ERROR(ncGraphGetOption(graphHandle, NC_RO_GRAPH_OUTPUT_COUNT, &numOutputs, &dataLength)); + + dataLength = sizeof(ncTensorDescriptor_t); + + ncTensorDescriptor_t inputDesc = {}; + ASSERT_NO_ERROR(ncGraphGetOption(graphHandle, NC_RO_GRAPH_INPUT_TENSOR_DESCRIPTORS, &inputDesc, + &dataLength)); + + + ncTensorDescriptor_t outputDesc = {}; + ASSERT_NO_ERROR(ncGraphGetOption(graphHandle, NC_RO_GRAPH_OUTPUT_TENSOR_DESCRIPTORS, &outputDesc, + &dataLength)); + + unsigned int fifo_elements = 4; + + ncFifoHandle_t *inputFifoHandle = nullptr; + ASSERT_NO_ERROR(ncFifoCreate("input", NC_FIFO_HOST_WO, &inputFifoHandle)); + + ASSERT_NO_ERROR(ncFifoAllocate(inputFifoHandle, deviceHandle, &inputDesc, fifo_elements)); + + ncFifoHandle_t *outputFifoHandle = nullptr; + ASSERT_NO_ERROR(ncFifoCreate("output", NC_FIFO_HOST_RO, &outputFifoHandle)); + + ASSERT_NO_ERROR(ncFifoAllocate(outputFifoHandle, deviceHandle, &outputDesc, fifo_elements)); + + uint8_t *input_data = new uint8_t[inputDesc.totalSize]; + uint8_t *result_data = new uint8_t[outputDesc.totalSize]; + ASSERT_NO_ERROR(ncGraphQueueInferenceWithFifoElem(graphHandle, + inputFifoHandle, outputFifoHandle, + input_data, &inputDesc.totalSize, nullptr)); + + void *userParam = nullptr; + ASSERT_NO_ERROR(ncFifoReadElem(outputFifoHandle, result_data, &outputDesc.totalSize, &userParam)); + + delete[] input_data; + delete[] result_data; + ASSERT_NO_ERROR(ncFifoDestroy(&inputFifoHandle)); + ASSERT_NO_ERROR(ncFifoDestroy(&outputFifoHandle)); + + ASSERT_NO_ERROR(ncGraphDestroy(&graphHandle)); + + ASSERT_NO_ERROR(ncDeviceClose(&deviceHandle)); + } + +} + +INSTANTIATE_TEST_CASE_P(MvncTestsCommon, + MvncStressTests, + ::testing::ValuesIn(myriadProtocols), + PrintToStringParamName()); diff --git a/inference-engine/thirdparty/movidius/mvnc/tests/mvnc_tests_common.cpp b/inference-engine/thirdparty/movidius/mvnc/tests/mvnc_tests_common.cpp new file mode 100644 index 00000000000..03e95c9845a --- /dev/null +++ b/inference-engine/thirdparty/movidius/mvnc/tests/mvnc_tests_common.cpp @@ -0,0 +1,534 @@ +// Copyright (C) 2018-2020 Intel Corporation +// SPDX-License-Identifier: Apache-2.0 +// + +#include +#include "mvnc.h" +#include "ncPrivateTypes.h" +#include "mvnc_common_test_cases.h" + +//------------------------------------------------------------------------------ +// MvncTestsCommon Tests +// Platform independent tests +//------------------------------------------------------------------------------ +TEST_F(MvncTestsCommon, DoubleCheckOfAvailableDevicesCount) { + if (availableDevices_ == 0) + GTEST_SKIP(); + + const int min_name_size = 2; + + struct ncDeviceDescr_t act_devices[NC_MAX_DEVICES] = {}; + int act_devicesCount = 0; + int exp_devicesCount = getAmountOfNotBootedDevices(); + + ASSERT_NO_ERROR(ncAvailableDevices(act_devices, NC_MAX_DEVICES, &act_devicesCount)); + + ASSERT_TRUE(act_devicesCount); + ASSERT_EQ(act_devicesCount, exp_devicesCount); + + for (int i = 0; i < act_devicesCount; ++i) { + ASSERT_GE(strlen(act_devices[i].name), min_name_size); + } + + for (int j = act_devicesCount; j < NC_MAX_DEVICES; ++j) { + ASSERT_EQ(strlen(act_devices[j].name), 0); + } +} + +TEST_F(MvncTestsCommon, AvailableDevicesSholdReturnErrorIfArrayIsNULL) { + int act_devicesCount = 0; + ASSERT_ERROR(ncAvailableDevices(NULL, NC_MAX_DEVICES, &act_devicesCount)); +} + +TEST_F(MvncTestsCommon, AvailableDevicesSholdReturnErrorIfCountPtrIsNULL) { + struct ncDeviceDescr_t act_devices[NC_MAX_DEVICES] = {}; + ASSERT_ERROR(ncAvailableDevices(act_devices, NC_MAX_DEVICES, NULL)); +} + +TEST_F(MvncTestsCommon, CanGetPCIeAndUSB) { + if (!(getAmountOfUSBDevices() && getAmountOfPCIeDevices())) + GTEST_SKIP_("USB and PCIe not available"); + + struct ncDeviceDescr_t act_devices[NC_MAX_DEVICES] = {}; + int act_devicesCount = 0; + ASSERT_NO_ERROR(ncAvailableDevices(act_devices, NC_MAX_DEVICES, &act_devicesCount)); + + bool usb_device_found = false; + bool pcie_device_found = false; + + for (int i = 0; i < act_devicesCount; ++i) { + if (isMyriadUSBDevice(act_devices[i].name)) { + usb_device_found = true; + } else if (isMyriadPCIeDevice(act_devices[i].name)) { + pcie_device_found = true; + } + } + + EXPECT_TRUE(usb_device_found); + EXPECT_TRUE(pcie_device_found); +} + +TEST_F(MvncTestsCommon, ShouldFailToSetNegativeTimeout) { + ASSERT_ERROR(ncSetDeviceConnectTimeout(-1)); +} + +//------------------------------------------------------------------------------ +// MvncTestsCommon Tests +// PCIe + USB Tests +//------------------------------------------------------------------------------ + +/** + * @brief Test that USB and PCIe works at the same time. USB first + */ +TEST_F(MvncTestsCommon, OpenUSBThenPCIEAndClose) { + if (getAmountOfPCIeDevices() == 0) + GTEST_SKIP() << "PCIe devices not found"; + if (getAmountOfUSBDevices() == 0) + GTEST_SKIP() << "USB devices not found"; + + ncDeviceHandle_t *deviceHandle_USB = nullptr; + ncDeviceHandle_t *deviceHandle_PCIe = nullptr; + std::string actDeviceName; + ncDeviceDescr_t deviceDesc = {}; + deviceDesc.protocol = NC_USB; + deviceDesc.platform = NC_ANY_PLATFORM; + + ASSERT_NO_ERROR(ncDeviceOpen(&deviceHandle_USB, deviceDesc, watchdogInterval, firmwarePath)); + + actDeviceName = deviceHandle_USB->private_data->dev_addr; + ASSERT_TRUE(actDeviceName.size()); + ASSERT_TRUE(isMyriadUSBDevice(actDeviceName)); + + // Open PCIe device + deviceDesc.protocol = NC_PCIE; + ASSERT_NO_ERROR(ncDeviceOpen(&deviceHandle_PCIe, deviceDesc, watchdogInterval, firmwarePath)); + + actDeviceName = deviceHandle_PCIe->private_data->dev_addr; + ASSERT_TRUE(actDeviceName.size()); + ASSERT_TRUE(isMyriadPCIeDevice(actDeviceName)); + + // Close all + ASSERT_NO_ERROR(ncDeviceClose(&deviceHandle_PCIe)); + ASSERT_NO_ERROR(ncDeviceClose(&deviceHandle_USB)); +} + +/** + * @brief Test that USB and PCIe works at the same time. PCIe first + */ +TEST_F(MvncTestsCommon, OpenPCIEThenUSBAndClose) { + if (getAmountOfPCIeDevices() == 0) + GTEST_SKIP() << "PCIe devices not found"; + if (getAmountOfUSBDevices() == 0) + GTEST_SKIP() << "USB devices not found"; + + ncDeviceHandle_t *deviceHandle_USB = nullptr; + ncDeviceHandle_t *deviceHandle_PCIe = nullptr; + std::string actDeviceName; + ncDeviceDescr_t deviceDesc = {}; + deviceDesc.protocol = NC_PCIE; + deviceDesc.platform = NC_ANY_PLATFORM; + + // Open PCIe device + ASSERT_NO_ERROR(ncDeviceOpen(&deviceHandle_PCIe, deviceDesc, + watchdogInterval, firmwarePath)); + + actDeviceName = deviceHandle_PCIe->private_data->dev_addr; + ASSERT_TRUE(actDeviceName.size()); + ASSERT_TRUE(isMyriadPCIeDevice(actDeviceName)); + + // Open USB device + deviceDesc.protocol = NC_USB; + ASSERT_NO_ERROR(ncDeviceOpen(&deviceHandle_USB, deviceDesc, + watchdogInterval, firmwarePath)); + + actDeviceName = deviceHandle_USB->private_data->dev_addr; + ASSERT_TRUE(actDeviceName.size()); + ASSERT_TRUE(isMyriadUSBDevice(actDeviceName)); + + + // Close all + ASSERT_NO_ERROR(ncDeviceClose(&deviceHandle_PCIe)); + ASSERT_NO_ERROR(ncDeviceClose(&deviceHandle_USB)); +} + +//------------------------------------------------------------------------------ +// MvncOpenDevice Tests +//------------------------------------------------------------------------------ +/** +* @brief Open any device and close it +*/ +TEST_P(MvncOpenDevice, OpenAndClose) { + if (availableDevices_ == 0) + GTEST_SKIP() << ncProtocolToStr(_deviceProtocol) << " devices not found"; + + ncDeviceHandle_t* deviceHandle = nullptr; + std::string deviceName; + ncDeviceDescr_t deviceDesc = {}; + deviceDesc.protocol = _deviceProtocol; + deviceDesc.platform = NC_ANY_PLATFORM; + + ASSERT_NO_ERROR(ncDeviceOpen(&deviceHandle, deviceDesc, watchdogInterval, firmwarePath)); + + ASSERT_TRUE(deviceHandle != nullptr); + ASSERT_TRUE(deviceHandle->private_data != nullptr); + ASSERT_TRUE(deviceHandle->private_data->dev_addr_booted != nullptr); + + deviceName = deviceHandle->private_data->dev_addr_booted; + ASSERT_TRUE(deviceName.size() > 0); + + ASSERT_TRUE(isSameProtocolDevice(deviceName, _deviceProtocol)); + + ASSERT_NO_ERROR(ncDeviceClose(&deviceHandle)); +} + +/** + * @brief Check that all field of deviceHandle would be initialized + */ +TEST_P(MvncOpenDevice, AllHandleFieldsInitialized) { + if (availableDevices_ == 0) + GTEST_SKIP() << ncProtocolToStr(_deviceProtocol) << " devices not found"; + + ncDeviceHandle_t* deviceHandle = nullptr; + ncDeviceDescr_t deviceDesc = {}; + deviceDesc.protocol = _deviceProtocol; + deviceDesc.platform = NC_ANY_PLATFORM; + + ASSERT_NO_ERROR(ncDeviceOpen(&deviceHandle, deviceDesc, + watchdogInterval, firmwarePath)); + + ASSERT_TRUE(deviceHandle != nullptr); + + devicePrivate_t * device = deviceHandle->private_data; + ASSERT_TRUE(device != nullptr); + ASSERT_TRUE(device->dev_addr != nullptr); + ASSERT_TRUE(device->dev_addr_booted != nullptr); + ASSERT_TRUE(device->xlink != nullptr); + + ASSERT_NO_ERROR(ncDeviceClose(&deviceHandle)); +} + +/** +* @brief Try to open device twice. DeviceHandle shouldn't be overwritten +* @details Expected behavior - ncDeviceOpen should warn that deviceHandle + * already has allocated device +*/ +TEST_P(MvncOpenDevice, OpenTwiceSameHandler) { + if (availableDevices_ == 0) + GTEST_SKIP() << ncProtocolToStr(_deviceProtocol) << " devices not found"; + + ncDeviceHandle_t *deviceHandle = nullptr; + ncDeviceDescr_t deviceDesc = {}; + deviceDesc.protocol = _deviceProtocol; + deviceDesc.platform = NC_ANY_PLATFORM; + + char dev_addr_first_open[MAX_DEV_NAME]; + unsigned int data_lenght_first = MAX_DEV_NAME; + + char dev_addr_second_open[MAX_DEV_NAME]; + unsigned int data_lenght_second = MAX_DEV_NAME; + + // First open, get device name + ASSERT_NO_ERROR(ncDeviceOpen(&deviceHandle, deviceDesc, watchdogInterval, firmwarePath)); + ASSERT_NO_ERROR(ncDeviceGetOption(deviceHandle, NC_RO_DEVICE_NAME, + dev_addr_first_open, &data_lenght_first)); + + // Second open, get device name + ASSERT_NO_ERROR(ncDeviceOpen(&deviceHandle, deviceDesc, watchdogInterval, firmwarePath)); + ASSERT_NO_ERROR(ncDeviceGetOption(deviceHandle, NC_RO_DEVICE_NAME, + dev_addr_second_open, &data_lenght_second)); + + ASSERT_NO_ERROR(ncDeviceClose(&deviceHandle)); + // Should be the same device + ASSERT_STREQ(dev_addr_first_open, dev_addr_second_open); +} + +/** + * @brief Try to open device twice with different handlers. Second open should return error + * @reason #-18548 + */ + // Fixme Test only for one device +TEST_P(MvncOpenDevice, DISABLED_OpenSameDeviceTwiceDifferentHandlers) { + if (availableDevices_ == 0) + GTEST_SKIP() << ncProtocolToStr(_deviceProtocol) << " devices not found"; + + ncDeviceHandle_t *deviceHandle1 = nullptr; + ncDeviceHandle_t *deviceHandle2 = nullptr; + + ncDeviceDescr_t deviceDesc = {}; + deviceDesc.protocol = _deviceProtocol; + deviceDesc.platform = NC_ANY_PLATFORM; + + ASSERT_NO_ERROR(ncDeviceOpen(&deviceHandle1, deviceDesc, + watchdogInterval, firmwarePath)); + + // Till we don't have multiple device support, this function would try to open same device + ASSERT_ERROR(ncDeviceOpen(&deviceHandle2, deviceDesc, + watchdogInterval, firmwarePath)); + + ASSERT_NO_ERROR(ncDeviceClose(&deviceHandle1)); +} + + +/** + * @brief Open device twice one run after another. It should check, that link to device closed correctly + * @note Mostly this test important for PCIe and connect to booted option, as in that cases XLinkReset have another behavior + */ +TEST_P(MvncOpenDevice, OpenTwiceWithOneXLinkInitializion) { + if (availableDevices_ == 0) + GTEST_SKIP() << ncProtocolToStr(_deviceProtocol) << " devices not found"; + + ncDeviceHandle_t *deviceHandle = nullptr; + std::string actDeviceName; + + ncDeviceDescr_t deviceDesc = {}; + deviceDesc.protocol = _deviceProtocol; + deviceDesc.platform = NC_ANY_PLATFORM; + + ASSERT_NO_ERROR(ncDeviceOpen(&deviceHandle, deviceDesc, + watchdogInterval, firmwarePath)); + + actDeviceName = deviceHandle->private_data->dev_addr; + ASSERT_TRUE(isSameProtocolDevice(actDeviceName, _deviceProtocol)); + + ASSERT_NO_ERROR(ncDeviceClose(&deviceHandle)); + + // Second open + ASSERT_NO_ERROR(ncDeviceOpen(&deviceHandle, deviceDesc, + watchdogInterval, firmwarePath)); + + actDeviceName = deviceHandle->private_data->dev_addr; + ASSERT_TRUE(isSameProtocolDevice(actDeviceName, _deviceProtocol)); + + ASSERT_NO_ERROR(ncDeviceClose(&deviceHandle)); +} + +//------------------------------------------------------------------------------ +// MvncLoggingTests Tests +//------------------------------------------------------------------------------ +TEST_P(MvncLoggingTests, ShouldNotPrintErrorMessagesIfCanNotOpenDevice) { + if (availableDevices_ == 0) + GTEST_SKIP() << ncProtocolToStr(_deviceProtocol) << " devices not found"; + + setLogLevel(MVLOG_INFO); + ncDeviceHandle_t * deviceHandle = nullptr; + + ASSERT_ERROR(ncDeviceOpen(&deviceHandle, _deviceDesc, watchdogInterval, firmwarePath)); + + std::string content(buff); + for (int i = MVLOG_WARN; i < MVLOG_LAST; i++) { + auto found = content.find(mvLogHeader[i]); + ASSERT_TRUE(found == std::string::npos); + } +} + +//------------------------------------------------------------------------------ +// MvncGraphAllocations Tests +//------------------------------------------------------------------------------ +/** + * @brief Allocate graph for one device + */ +TEST_P(MvncGraphAllocations, DISABLED_OneGraph) { + if (!blobLoaded) GTEST_SKIP_("Blob for test is not loaded\n"); + openDevices(1, _deviceHandle, _bootedDevices); + + // Create graph handlers + std::string graphName = "graph"; + ASSERT_NO_ERROR(ncGraphCreate(graphName.c_str(), &_graphHandle[0])); + ASSERT_TRUE(_graphHandle[0] != nullptr); + + // Allocate graph + ASSERT_NO_ERROR(ncGraphAllocate(_deviceHandle[0], _graphHandle[0], + _blob.data(), _blob.size(), // Blob + _blob.data(), sizeof(ElfN_Ehdr) + sizeof(blob_header_v2) )); // Header +} + +/** + * @brief Allocate graphs for 2 device (serial) + */ +TEST_P(MvncGraphAllocations, DISABLED_AllocateGraphsOn2DevicesSerial) { + if (!blobLoaded) + GTEST_SKIP_("Blob for test is not loaded\n"); + openDevices(2, _deviceHandle, _bootedDevices); + + // Create graphs handlers + for (int index = 0; index < _bootedDevices; ++index) { + std::string graphName = "graph"; + graphName += std::to_string(index); + ASSERT_NO_ERROR(ncGraphCreate(graphName.c_str(), &_graphHandle[index])); + ASSERT_TRUE(_graphHandle[index] != nullptr); + } + + // Allocate graphs in serial mode + ncStatus_t rc[MAX_DEVICES]; + + for (int i = 0; i < _bootedDevices; ++i) { + rc[i] = ncGraphAllocate(_deviceHandle[0], _graphHandle[0], + _blob.data(), _blob.size(), // Blob + _blob.data(), sizeof(ElfN_Ehdr) + sizeof(blob_header_v2) ); // Header + } + + for (int i = 0; i < _bootedDevices; ++i) { + ASSERT_NO_ERROR(rc[i]); + } +} + +/** +* @brief Allocate graphs for 2 device (parallel) +* @detail Open devices and then in parallel threads try to load graphs to it +* The error easy appear, if USBLINK_TRANSFER_SIZE is (1024 * 1024 * 20) +* @warning It's depend on USBLINK_TRANSFER_SIZE constant from UsbLinkPlatform.c file +* @warning Need blob to use this tests +*/ +TEST_P(MvncGraphAllocations, DISABLED_AllocateGraphsOn2DevicesParallel) { + if (!blobLoaded) GTEST_SKIP_("Blob for test is not loaded\n"); + openDevices(2, _deviceHandle, _bootedDevices); + + // Create graphs handlers + for (int index = 0; index < _bootedDevices; ++index) { + std::string graphName = "graph"; + graphName += std::to_string(index); + ASSERT_NO_ERROR(ncGraphCreate(graphName.c_str(), &_graphHandle[index])); + ASSERT_TRUE(_graphHandle[index] != nullptr); + } + + // Allocate graphs in parallel threads + std::thread requests[MAX_DEVICES]; + ncStatus_t rc[MAX_DEVICES]; + for (int i = 0; i < _bootedDevices; ++i) { + requests[i] = std::thread([i, &rc, this]() { + rc[i] = ncGraphAllocate(_deviceHandle[0], _graphHandle[0], + _blob.data(), _blob.size(), // Blob + _blob.data(), sizeof(ElfN_Ehdr) + sizeof(blob_header_v2) ); + }); + } + + for (int i = 0; i < _bootedDevices; ++i) { + requests[i].join(); + ASSERT_NO_ERROR(rc[i]); + } +} + +//------------------------------------------------------------------------------ +// MvncCloseDevice Tests +//------------------------------------------------------------------------------ +/** +* @brief Correct closing if handle is empty +*/ +TEST_F(MvncCloseDevice, EmptyDeviceHandler) { + ncDeviceHandle_t *deviceHandle = nullptr; + ASSERT_NO_ERROR(ncDeviceClose(&deviceHandle)); +} + +/** +* @brief Correct closing if some handler fields is null +*/ +TEST_F(MvncCloseDevice, EmptyFieldsOfDeviceHandle) { + + ncDeviceHandle_t *deviceHandlePtr; + auto dH = std::unique_ptr( + (ncDeviceHandle_t*)calloc(1, sizeof(ncDeviceHandle_t)), std::free); + + auto d = std::unique_ptr<_devicePrivate_t, decltype(std::free)*>( + (_devicePrivate_t*)calloc(1, sizeof(_devicePrivate_t)), std::free); + + if (dH.get() && d.get()) { + dH->private_data = d.get(); + d->dev_addr = nullptr; + d->dev_addr_booted = nullptr; + d->device_mon_stream_id = INVALID_LINK_ID; + d->graph_monitor_stream_id = INVALID_LINK_ID; + d->wd_interval = watchdogInterval; + deviceHandlePtr = dH.get(); + } + + ASSERT_EQ(ncDeviceClose(&deviceHandlePtr), NC_INVALID_PARAMETERS); +} + +//------------------------------------------------------------------------------ +// MvncInference Tests +//------------------------------------------------------------------------------ +using MvncInference = MvncGraphAllocations; + +TEST_P(MvncInference, DISABLED_DoOneIterationOfInference) { + if (!blobLoaded) GTEST_SKIP_("Blob for test is not loaded\n"); + openDevices(1, _deviceHandle, _bootedDevices); + + std::string graphName = "graph"; + ASSERT_NO_ERROR(ncGraphCreate(graphName.c_str(), &_graphHandle[0])); + ASSERT_TRUE(&_graphHandle[0] != nullptr); + + ASSERT_NO_ERROR(ncGraphAllocate(_deviceHandle[0], _graphHandle[0], + _blob.data(), _blob.size(), // Blob + _blob.data(), sizeof(ElfN_Ehdr) + sizeof(blob_header_v2) )); + + + unsigned int dataLength = sizeof(int); + + int numInputs = 0; + ASSERT_NO_ERROR(ncGraphGetOption(_graphHandle[0], NC_RO_GRAPH_INPUT_COUNT, &numInputs, &dataLength)); + + int numOutputs = 0; + ASSERT_NO_ERROR(ncGraphGetOption(_graphHandle[0], NC_RO_GRAPH_OUTPUT_COUNT, &numOutputs, &dataLength)); + + dataLength = sizeof(ncTensorDescriptor_t); + + ncTensorDescriptor_t inputDesc = {}; + ASSERT_NO_ERROR(ncGraphGetOption(_graphHandle[0], NC_RO_GRAPH_INPUT_TENSOR_DESCRIPTORS, &inputDesc, + &dataLength)); + + + ncTensorDescriptor_t outputDesc = {}; + ASSERT_NO_ERROR(ncGraphGetOption(_graphHandle[0], NC_RO_GRAPH_OUTPUT_TENSOR_DESCRIPTORS, &outputDesc, + &dataLength)); + + unsigned int fifo_elements = 4; + + ncFifoHandle_t *inputFifoHandle = nullptr; + ASSERT_NO_ERROR(ncFifoCreate("input", NC_FIFO_HOST_WO, &inputFifoHandle)); + + ASSERT_NO_ERROR(ncFifoAllocate(inputFifoHandle, _deviceHandle[0], &inputDesc, fifo_elements)); + + ncFifoHandle_t *outputFifoHandle = nullptr; + ASSERT_NO_ERROR(ncFifoCreate("output", NC_FIFO_HOST_RO, &outputFifoHandle)); + + ASSERT_NO_ERROR(ncFifoAllocate(outputFifoHandle, _deviceHandle[0], &outputDesc, fifo_elements)); + + uint8_t *input_data = new uint8_t[inputDesc.totalSize]; + uint8_t *result_data = new uint8_t[outputDesc.totalSize]; + ASSERT_NO_ERROR(ncGraphQueueInferenceWithFifoElem(_graphHandle[0], + inputFifoHandle, outputFifoHandle, + input_data, &inputDesc.totalSize, nullptr)); + + void *userParam = nullptr; + ASSERT_NO_ERROR(ncFifoReadElem(outputFifoHandle, result_data, &outputDesc.totalSize, &userParam)); + + delete[] input_data; + delete[] result_data; + ASSERT_NO_ERROR(ncFifoDestroy(&inputFifoHandle)); + ASSERT_NO_ERROR(ncFifoDestroy(&outputFifoHandle)); + + ASSERT_NO_ERROR(ncGraphDestroy(&_graphHandle[0])); + + ASSERT_NO_ERROR(ncDeviceClose(&_deviceHandle[0])); +} + + +INSTANTIATE_TEST_CASE_P(MvncTestsCommon, + MvncOpenDevice, + ::testing::ValuesIn(myriadProtocols), + PrintToStringParamName()); + +INSTANTIATE_TEST_CASE_P(MvncTestsCommon, + MvncLoggingTests, + ::testing::ValuesIn(myriadProtocols), + PrintToStringParamName()); + +INSTANTIATE_TEST_CASE_P(MvncTestsCommon, + MvncGraphAllocations, + ::testing::ValuesIn(myriadProtocols), + PrintToStringParamName()); + +INSTANTIATE_TEST_CASE_P(MvncTestsCommon, + MvncInference, + ::testing::ValuesIn(myriadProtocols), + PrintToStringParamName()); diff --git a/inference-engine/thirdparty/movidius/mvnc/tests/mvnc_tests_usb.cpp b/inference-engine/thirdparty/movidius/mvnc/tests/mvnc_tests_usb.cpp new file mode 100644 index 00000000000..a5cdea04cec --- /dev/null +++ b/inference-engine/thirdparty/movidius/mvnc/tests/mvnc_tests_usb.cpp @@ -0,0 +1,247 @@ +// Copyright (C) 2018-2020 Intel Corporation +// SPDX-License-Identifier: Apache-2.0 +// + +#include + +#include "mvnc.h" +#include "mvnc_test_helper.h" +#include "mvnc_usb_test_cases.h" +#include "ncPrivateTypes.h" + +//------------------------------------------------------------------------------ +// MvncOpenUSBDevice Tests +//------------------------------------------------------------------------------ +/** +* @brief Open any device with custom firmware path as ncDeviceOpen argument +*/ + +TEST_F(MvncOpenUSBDevice, ShouldOpenDeviceAfterChangeConnectTimeoutFromZero) { + if (availableDevices_ == 0) + GTEST_SKIP(); + + ncDeviceHandle_t *deviceHandle = nullptr; + std::string actDeviceName; + ncDeviceDescr_t deviceDesc = {}; + deviceDesc.protocol = NC_ANY_PROTOCOL; + deviceDesc.platform = NC_ANY_PLATFORM; + + ASSERT_NO_ERROR(ncSetDeviceConnectTimeout(0)); + ASSERT_ERROR(ncDeviceOpen(&deviceHandle, deviceDesc, watchdogInterval, firmwarePath)); + std::this_thread::sleep_for(3_sec); + ASSERT_NO_ERROR(ncDeviceResetAll()); + + ASSERT_NO_ERROR(ncSetDeviceConnectTimeout(30)); + ASSERT_NO_ERROR(ncDeviceOpen(&deviceHandle, deviceDesc, watchdogInterval, firmwarePath)); + ASSERT_NO_ERROR(ncDeviceClose(&deviceHandle)); + + ASSERT_NO_ERROR(ncDeviceResetAll()); +} + + +TEST_F(MvncOpenUSBDevice, WithCustomFirmware) { + if (availableDevices_ == 0) + GTEST_SKIP(); + + // Use custom firmware dir path as parameter for ncDeviceOpen + ASSERT_NO_ERROR(ncDeviceOpen(&deviceHandle_, deviceDesc_, watchdogInterval, firmwarePath)); + ASSERT_NO_ERROR(ncDeviceClose(&deviceHandle_)); +} + +/** +* @brief Open all available devices and close them +*/ +TEST_F(MvncOpenUSBDevice, AllAvailableDevices) { + if (availableDevices_ == 0) + GTEST_SKIP(); + + ncDeviceHandle_t * deviceHandles[MAX_DEVICES] = {nullptr}; + + for (int index = 0; index < availableDevices_; ++index) { + ASSERT_NO_ERROR(ncDeviceOpen(&deviceHandles[index], deviceDesc_, watchdogInterval, firmwarePath)); + } + for (int index = 0; index < availableDevices_; ++index) { + ASSERT_NO_ERROR(ncDeviceClose(&deviceHandles[index])); + } +} + +/** +* @brief Open all available devices in parallel threads and close them +*/ +TEST_F(MvncOpenUSBDevice, AllAvailableMultiThreads) { + if (availableDevices_ == 0) + GTEST_SKIP(); + + std::thread requests[MAX_DEVICES]; + ncDeviceHandle_t * deviceHandle[MAX_DEVICES] = {nullptr}; + ncStatus_t rc[MAX_DEVICES]; + + for (int i = 0; i < availableDevices_; ++i) { + requests[i] = std::thread([i, &rc, &deviceHandle, this]() { + rc[i] = ncDeviceOpen(&deviceHandle[i], deviceDesc_, watchdogInterval, firmwarePath); + }); + } + + for (int i = 0; i < availableDevices_; ++i) { + requests[i].join(); + ASSERT_NO_ERROR(rc[i]); + } + + for (int i = 0; i < availableDevices_; ++i) { + ASSERT_NO_ERROR(ncDeviceClose(&deviceHandle[i])); + } +} + +/** +* @brief Open any device with invalid firmware path +*/ +TEST_F(MvncOpenUSBDevice, WithInvalidFirmwarePath) { + if (availableDevices_ == 0) + GTEST_SKIP(); + + const char invalidPath[MAX_PATH] = "./InvalidPath/"; + + // Use custom firmware dir path as parameter for ncDeviceOpen + ASSERT_ERROR(ncDeviceOpen(&deviceHandle_, deviceDesc_, watchdogInterval, invalidPath)); + + ASSERT_EQ(deviceHandle_, nullptr); +} + +TEST_F(MvncOpenUSBDevice, OpenAvailableDeviceByName) { + if (availableDevices_ == 0) + GTEST_SKIP(); + + char dev_addr_open[NC_MAX_NAME_SIZE]; + unsigned int data_lenght = NC_MAX_NAME_SIZE; + + auto availableDevices = getDevicesList(); + + ASSERT_TRUE(availableDevices.size()); + strncpy(deviceDesc_.name, availableDevices[0].c_str(), NC_MAX_NAME_SIZE); + + ASSERT_NO_ERROR(ncDeviceOpen(&deviceHandle_, deviceDesc_, watchdogInterval, firmwarePath)); + ASSERT_NO_ERROR(ncDeviceGetOption(deviceHandle_, NC_RO_DEVICE_NAME, + dev_addr_open, &data_lenght)); + + ASSERT_TRUE(strncmp(dev_addr_open, deviceDesc_.name, NC_MAX_NAME_SIZE) == 0); + ASSERT_NO_ERROR(ncDeviceClose(&deviceHandle_)); +} + +TEST_F(MvncOpenUSBDevice, ErrorWhenWrongDeviceName) { + if (availableDevices_ == 0) + GTEST_SKIP(); + + char badName[] = "BadName"; + + strncpy(deviceDesc_.name, badName, NC_MAX_NAME_SIZE); + + auto availableDevices = getDevicesList(); + ASSERT_TRUE(availableDevices.size()); + + ASSERT_ERROR(ncDeviceOpen(&deviceHandle_, deviceDesc_, watchdogInterval, firmwarePath)); +} + +TEST_F(MvncOpenUSBDevice, OpenTwiceSameHandlerByName) { + if (availableDevices_ == 0) + GTEST_SKIP(); + + char dev_addr_first_open[MAX_DEV_NAME]; + unsigned int data_lenght_first = MAX_DEV_NAME; + + char dev_addr_second_open[MAX_DEV_NAME]; + unsigned int data_lenght_second = MAX_DEV_NAME; + + auto availableDevices = getDevicesList(); + + ASSERT_TRUE(availableDevices.size()); + strncpy(deviceDesc_.name, availableDevices[0].c_str(), NC_MAX_NAME_SIZE); + + ASSERT_NO_ERROR(ncDeviceOpen(&deviceHandle_, deviceDesc_, watchdogInterval, firmwarePath)); + ASSERT_NO_ERROR(ncDeviceGetOption(deviceHandle_, NC_RO_DEVICE_NAME, + dev_addr_first_open, &data_lenght_first)); + + // Second open, get device name + ASSERT_NO_ERROR(ncDeviceOpen(&deviceHandle_, deviceDesc_, watchdogInterval, firmwarePath)); + ASSERT_NO_ERROR(ncDeviceGetOption(deviceHandle_, NC_RO_DEVICE_NAME, + dev_addr_second_open, &data_lenght_second)); + + ASSERT_NO_ERROR(ncDeviceClose(&deviceHandle_)); + // Should be the same device + ASSERT_STREQ(dev_addr_first_open, dev_addr_second_open); +} + +TEST_F(MvncOpenUSBDevice, CheckErrorWhenPlatformConflictWithName) { + if (availableDevices_ == 0) + GTEST_SKIP(); + + ncDevicePlatform_t wrongPlatform = NC_ANY_PLATFORM; + auto availableDevices = getDevicesList(); + + ASSERT_TRUE(availableDevices.size()); + + if(isMyriadXUSBDevice(availableDevices[0])) { + wrongPlatform = NC_MYRIAD_2; + } else { + wrongPlatform = NC_MYRIAD_X; + } + + strncpy(deviceDesc_.name, availableDevices[0].c_str(), NC_MAX_NAME_SIZE); + deviceDesc_.platform = wrongPlatform; + + ASSERT_ERROR(ncDeviceOpen(&deviceHandle_, deviceDesc_, watchdogInterval, firmwarePath)); +} + +//------------------------------------------------------------------------------ +// MvncCloseUSBDevice Tests +//------------------------------------------------------------------------------ +#if (!(defined(_WIN32) || defined(_WIN64))) +TEST_F(MvncCloseUSBDevice, USBDeviceWillBeAvailableRightAfterClosing) { + if (availableDevices_ == 0) + GTEST_SKIP(); + + ASSERT_NO_ERROR(ncDeviceOpen( + &deviceHandle_, deviceDesc_, watchdogInterval, firmwarePath)); + + ASSERT_TRUE(deviceHandle_); + + deviceDesc_t toFindDeviceDescr = { + .protocol = X_LINK_USB_VSC, + .platform = X_LINK_ANY_PLATFORM + }; + strcpy(deviceDesc_.name, deviceHandle_->private_data->dev_addr); + + ASSERT_NO_ERROR(ncDeviceClose(&deviceHandle_)); + + deviceDesc_t foundDevice = {}; + XLinkError_t rc = XLinkFindFirstSuitableDevice( + X_LINK_UNBOOTED, toFindDeviceDescr, &foundDevice); + ASSERT_EQ(X_LINK_SUCCESS, rc); +} +#endif + +//------------------------------------------------------------------------------ +// MvncDevicePlatform Tests +//------------------------------------------------------------------------------ +/** +* @brief Open specified device and close it +*/ +TEST_P(MvncDevicePlatform, OpenAndClose) { + if (available_myriad2_ == 0 || available_myriadX_ == 0) + GTEST_SKIP(); + + ASSERT_NO_ERROR(ncDeviceOpen(&deviceHandle_, deviceDesc_, watchdogInterval, firmwarePath)); + + char deviceName[MAX_DEV_NAME]; + unsigned int size = MAX_DEV_NAME; + ASSERT_NO_ERROR(ncDeviceGetOption(deviceHandle_, NC_RO_DEVICE_NAME, deviceName, &size)); + + EXPECT_TRUE(isSamePlatformUSBDevice(deviceName, devicePlatform_)); + + ASSERT_NO_ERROR(ncDeviceClose(&deviceHandle_)); + +} + +INSTANTIATE_TEST_CASE_P(MvncTestsPlatform, + MvncDevicePlatform, + ::testing::ValuesIn(myriadPlatforms), + PrintToStringParamName()); diff --git a/inference-engine/thirdparty/movidius/mvnc/tests/mvnc_utils_tests.cpp b/inference-engine/thirdparty/movidius/mvnc/tests/mvnc_utils_tests.cpp new file mode 100644 index 00000000000..4910c1e4beb --- /dev/null +++ b/inference-engine/thirdparty/movidius/mvnc/tests/mvnc_utils_tests.cpp @@ -0,0 +1,61 @@ +// Copyright (C) 2018-2020 Intel Corporation +// SPDX-License-Identifier: Apache-2.0 +// + +#include "ncCommPrivate.h" +#include "mvnc_test_helper.h" + +#include +#include + +extern "C" { +#include "XLinkStringUtils.h" +} + +class MvncUtilsTest : public ::testing::Test { +public: + void TearDown() override { + std::remove(mvcmdExpectedPath.c_str()); + } + +protected: + std::string mvcmdExpectedPath = ""; + // FIXME: seems it is not going to work on Windows + const std::string tmpDir = "/tmp"; +}; + +TEST_F(MvncUtilsTest, CanGetSpecialFWIfUniversalIsNotPresent) { + mvcmdExpectedPath = tmpDir + "/usb-ma248x.mvcmd"; + + std::ofstream mvcmd; + mvcmd.open(mvcmdExpectedPath, std::ios::out); + + char mvcmdFilePath[MAX_PATH] = ""; + mv_strcpy(mvcmdFilePath, MAX_PATH, tmpDir.c_str()); + + deviceDesc_t dummyDevDesc2480; + strcpy(dummyDevDesc2480.name, "0-ma2480"); + dummyDevDesc2480.protocol = X_LINK_USB_VSC; + dummyDevDesc2480.platform = X_LINK_MYRIAD_X; + + ASSERT_EQ(NC_OK, getFirmwarePath(mvcmdFilePath, MAX_PATH, dummyDevDesc2480)); + ASSERT_STRCASEEQ(mvcmdExpectedPath.c_str(), mvcmdFilePath); +} + +TEST_F(MvncUtilsTest, CanGetUniversalFWIfItExists) { + mvcmdExpectedPath = tmpDir + "/usb-ma2x8x.mvcmd"; + + std::ofstream mvcmd; + mvcmd.open(mvcmdExpectedPath, std::ios::out); + + char mvcmdFilePath[MAX_PATH] = ""; + mv_strcpy(mvcmdFilePath, MAX_PATH, tmpDir.c_str()); + + deviceDesc_t dummyDevDesc2480; + strcpy(dummyDevDesc2480.name, "0-ma2480"); + dummyDevDesc2480.protocol = X_LINK_USB_VSC; + dummyDevDesc2480.platform = X_LINK_MYRIAD_X; + + ASSERT_EQ(NC_OK, getFirmwarePath(mvcmdFilePath, MAX_PATH, dummyDevDesc2480)); + ASSERT_STRCASEEQ(mvcmdExpectedPath.c_str(), mvcmdFilePath); +} diff --git a/inference-engine/thirdparty/movidius/tests/CMakeLists.txt b/inference-engine/thirdparty/movidius/tests/CMakeLists.txt new file mode 100644 index 00000000000..ba621695e8f --- /dev/null +++ b/inference-engine/thirdparty/movidius/tests/CMakeLists.txt @@ -0,0 +1 @@ +add_subdirectory(XLink) diff --git a/inference-engine/thirdparty/movidius/tests/XLink/CMakeLists.txt b/inference-engine/thirdparty/movidius/tests/XLink/CMakeLists.txt new file mode 100644 index 00000000000..69cfcedd1fd --- /dev/null +++ b/inference-engine/thirdparty/movidius/tests/XLink/CMakeLists.txt @@ -0,0 +1,34 @@ +# Copyright (C) 2018-2020 Intel Corporation +# SPDX-License-Identifier: Apache-2.0 +# + +set(TARGET_NAME "XLinkTests") +set(CMAKE_CXX_STANDARD 11) + +include(${XLINK_DIR}/XLink.cmake) +file(GLOB_RECURSE XLINK_TESTS_SOURCES "*.cpp") + +add_executable(${TARGET_NAME} ${XLINK_TESTS_SOURCES}) + +target_include_directories(${TARGET_NAME} + PRIVATE + helpers + cases + ${IE_MAIN_SOURCE_DIR}/tests_new/gtest/googletest/include + ${IE_MAIN_SOURCE_DIR}/tests_new/gtest/googletest/ + ${XLINK_INCLUDE} + ${XLINK_PLATFORM_INCLUDE}) + +target_compile_definitions(${TARGET_NAME} + PRIVATE + __PC__) + +target_link_libraries(${TARGET_NAME} + PRIVATE + XLink gtest gtest_main) + +set_target_properties(${TARGET_NAME} PROPERTIES + POSITION_INDEPENDENT_CODE TRUE + COMPILE_PDB_NAME ${TARGET_NAME}) + +add_dependencies(${TARGET_NAME} vpu_copy_firmware) diff --git a/inference-engine/thirdparty/movidius/tests/XLink/XLink_common_tests.cpp b/inference-engine/thirdparty/movidius/tests/XLink/XLink_common_tests.cpp new file mode 100644 index 00000000000..b76c3402ca7 --- /dev/null +++ b/inference-engine/thirdparty/movidius/tests/XLink/XLink_common_tests.cpp @@ -0,0 +1,432 @@ +// Copyright (C) 2018-2019 Intel Corporation +// SPDX-License-Identifier: Apache-2.0 +// + +#include "XLink_common_cases.hpp" + +#include + +//------------------------------------------------------------------------------ +// XLinkNullPtrTests +//------------------------------------------------------------------------------ + +TEST_F(XLinkNullPtrTests, XLinkInitialize) { + ASSERT_EQ(XLinkInitialize(nullptr), X_LINK_ERROR); +} + +TEST_F(XLinkNullPtrTests, XLinkConnect) { + ASSERT_EQ(XLinkConnect(nullptr), X_LINK_ERROR); +} + +TEST_F(XLinkNullPtrTests, XLinkOpenAndCloseStream) { + ASSERT_EQ(XLinkOpenStream(0, nullptr, 0), X_LINK_ERROR); + ASSERT_EQ(XLinkCloseStream(0), X_LINK_ERROR); +} + +TEST_F(XLinkNullPtrTests, XLinkFindDevice) { + ASSERT_EQ(XLinkFindFirstSuitableDevice(X_LINK_ANY_STATE, {}, nullptr), X_LINK_ERROR); + ASSERT_EQ(XLinkFindAllSuitableDevices(X_LINK_ANY_STATE, {}, nullptr, -1, nullptr), + X_LINK_ERROR); +} + +TEST_F(XLinkNullPtrTests, XLinkWriteData) { + ASSERT_EQ(XLinkWriteData(0, nullptr, 0), X_LINK_ERROR); +} + +//------------------------------------------------------------------------------ +// XLinkBootTests +//------------------------------------------------------------------------------ + +TEST_P(XLinkBootTests, StressTestBootToOpenAndCloseDevice) { + if (getCountSpecificDevices(X_LINK_ANY_STATE, _protocol) == 0) { + GTEST_SKIP(); + } + + deviceDesc_t deviceDesc = {}; + deviceDesc_t in_deviceDesc = {}; + + in_deviceDesc.protocol = _protocol; + in_deviceDesc.platform = X_LINK_ANY_PLATFORM; + + ASSERT_EQ(X_LINK_SUCCESS, + XLinkFindFirstSuitableDevice(X_LINK_UNBOOTED, in_deviceDesc, &deviceDesc)); + + std::string firmwarePath; + ASSERT_NO_THROW(firmwarePath = getMyriadFirmwarePath(deviceDesc)); + + for (int i = 0; i < 10; ++i) { + printf("Boot device. Iteration: %d\n", i); + ASSERT_EQ(X_LINK_SUCCESS, XLinkBoot(&deviceDesc, firmwarePath.c_str())); + // FIXME: need to find a way to avoid this sleep + std::this_thread::sleep_for(kBootTimeoutSec); + + // Find booted + deviceDesc_t bootedDeviceDesc = {}; + ASSERT_EQ(X_LINK_SUCCESS, + XLinkFindFirstSuitableDevice(X_LINK_BOOTED, in_deviceDesc, &bootedDeviceDesc)); + + XLinkHandler_t handler = {0}; + + connectToDevice(bootedDeviceDesc, &handler); + closeDevice(&handler); + } +} + +//------------------------------------------------------------------------------ +// XLinkConnectUSBTests +//------------------------------------------------------------------------------ + +TEST_P(XLinkConnectTests, ConnectToDevice) { + if (getCountSpecificDevices(X_LINK_UNBOOTED, _protocol) == 0) { + GTEST_SKIP(); + } + + deviceDesc_t deviceDesc = {}; + deviceDesc_t bootedDeviceDesc = {}; + + deviceDesc.protocol = _protocol; + bootDevice(deviceDesc, bootedDeviceDesc); + + XLinkHandler_t handler = {0}; + handler.protocol = bootedDeviceDesc.protocol; + handler.devicePath = bootedDeviceDesc.name; + + ASSERT_EQ(X_LINK_SUCCESS, XLinkConnect(&handler)); + std::this_thread::sleep_for(std::chrono::seconds(2)); + + closeDevice(&handler); +} + +//------------------------------------------------------------------------------ +// XLinkFindFirstSuitableDeviceTests +//------------------------------------------------------------------------------ + +TEST_P(XLinkFindFirstSuitableDevicePlatformTests, ReturnCorrectAvailableDeviceName) { + if (getCountSpecificDevices(X_LINK_ANY_STATE, _protocol, _platform) == 0) { + GTEST_SKIP(); + } + + deviceDesc_t deviceDesc = {}; + deviceDesc_t in_deviceDesc = {}; + in_deviceDesc.protocol = _protocol; + in_deviceDesc.platform = _platform; + + ASSERT_EQ(X_LINK_SUCCESS, + XLinkFindFirstSuitableDevice(X_LINK_UNBOOTED, in_deviceDesc, &deviceDesc)); + ASSERT_TRUE(strlen(deviceDesc.name) > 2); + ASSERT_EQ(deviceDesc.protocol, in_deviceDesc.protocol); + + if(_platform == X_LINK_ANY_PLATFORM) { + EXPECT_NE(deviceDesc.platform, X_LINK_ANY_PLATFORM); + } else { + EXPECT_EQ(deviceDesc.platform, _platform); + } + + if(_protocol != X_LINK_USB_VSC) { + std::string deviceName(deviceDesc.name); + switch (_platform) { + case X_LINK_MYRIAD_2: { + EXPECT_TRUE(deviceName.find(kUSBMyriad2) != std::string::npos); + break; + } + case X_LINK_MYRIAD_X: { + EXPECT_TRUE(deviceName.find(kUSBMyriadX) != std::string::npos); + break; + } + default: + break; + } + } +} + +TEST_P(XLinkFindFirstSuitableDeviceTests, CanFindDeviceByName) { + if (getCountSpecificDevices(X_LINK_ANY_STATE, _protocol) == 0) { + GTEST_SKIP(); + } + + deviceDesc_t deviceDesc = {}; + deviceDesc_t in_deviceDesc = {}; + + in_deviceDesc.protocol = _protocol; + ASSERT_EQ(X_LINK_SUCCESS, XLinkFindFirstSuitableDevice( + X_LINK_ANY_STATE, in_deviceDesc, &deviceDesc)); + + deviceDesc_t deviceRequirementsWithName = {}; + deviceRequirementsWithName.protocol = _protocol; + strcpy(deviceRequirementsWithName.name, deviceDesc.name); + + deviceDesc_t deviceDescSearchByName = {}; + ASSERT_EQ(X_LINK_SUCCESS, XLinkFindFirstSuitableDevice( + X_LINK_ANY_STATE, deviceRequirementsWithName, &deviceDescSearchByName)); + + ASSERT_TRUE(strcmp(deviceDesc.name, deviceDescSearchByName.name) == 0); +} + +/** + * This is temporary test. + * For now it's not clear how to tests multiple device as for now we don't have bench like this + */ +TEST_P(XLinkFindFirstSuitableDeviceTests, OnSecondIndexDeviceWillBeNotFound) { + auto availableDevices = getCountSpecificDevices(X_LINK_ANY_STATE, _protocol); + if (availableDevices != 1) { + GTEST_SKIP(); + } + + deviceDesc_t in_deviceDesc = {}; + in_deviceDesc.protocol = _protocol; + + const int index = 1; + // Find device + deviceDesc_t deviceDesc = {}; + ASSERT_EQ(X_LINK_DEVICE_NOT_FOUND, findDeviceOnIndex( + index, X_LINK_ANY_STATE, in_deviceDesc, &deviceDesc)); +} + +TEST_P(XLinkFindFirstSuitableDeviceTests, ReturnCorrectBootedDeviceName) { + if (getCountSpecificDevices(X_LINK_ANY_STATE, _protocol) == 0) { + GTEST_SKIP(); + } + + deviceDesc_t bootedDevice = {}; + deviceDesc_t deviceDesc = {}; + deviceDesc.protocol = _protocol; + + bootDevice(deviceDesc, bootedDevice); + + deviceDesc_t foundDeviceDesc = {}; + deviceDesc_t in_deviceDesc = {}; + in_deviceDesc.protocol = _protocol; + in_deviceDesc.platform = X_LINK_ANY_PLATFORM; + + EXPECT_EQ(X_LINK_SUCCESS, + XLinkFindFirstSuitableDevice(X_LINK_BOOTED, in_deviceDesc, &foundDeviceDesc)); + + EXPECT_TRUE(strcmp(bootedDevice.name, foundDeviceDesc.name) == 0); + EXPECT_EQ(foundDeviceDesc.protocol, _protocol); + + if(_protocol == X_LINK_USB_VSC) { + std::string foundDeviceName(foundDeviceDesc.name); + EXPECT_TRUE(foundDeviceName.find(kUSBMyriad2) == std::string::npos); + EXPECT_TRUE(foundDeviceName.find(kUSBMyriadX) == std::string::npos); + } + + connectAndCloseDevice(bootedDevice); +} + +//------------------------------------------------------------------------------ +// XLinkFindAllSuitableDevicesTests +//------------------------------------------------------------------------------ + +TEST_F(XLinkFindAllSuitableDevicesTests, CanFindMoreThenTwoDeviceAnyState_USB_PCIE) { + if (getCountSpecificDevices(X_LINK_UNBOOTED) < 2) { + GTEST_SKIP(); + } + + deviceDesc_t in_deviceDesc = {}; + deviceDesc_t deviceDescArray[XLINK_MAX_DEVICES] = {{}}; + + in_deviceDesc.protocol = X_LINK_ANY_PROTOCOL; + unsigned int numOfFoundDevices = 0; + ASSERT_EQ(X_LINK_SUCCESS, + XLinkFindAllSuitableDevices( + X_LINK_ANY_STATE, in_deviceDesc, deviceDescArray, + XLINK_MAX_DEVICES, &numOfFoundDevices)); + + ASSERT_EQ(numOfFoundDevices, getCountSpecificDevices(X_LINK_UNBOOTED)); + ASSERT_EQ(numOfFoundDevices, + getCountSpecificDevices(X_LINK_UNBOOTED, X_LINK_ANY_PROTOCOL, X_LINK_MYRIAD_2) + + getCountSpecificDevices(X_LINK_UNBOOTED, X_LINK_ANY_PROTOCOL, X_LINK_MYRIAD_X)); +} + +TEST_F(XLinkFindAllSuitableDevicesTests, CanFindTwoDeviceDifferentState_USB_PCIE) { + if (getCountSpecificDevices(X_LINK_UNBOOTED) < 2) { + GTEST_SKIP(); + } + + deviceDesc_t in_deviceDesc = {}; + in_deviceDesc.protocol = X_LINK_ANY_PROTOCOL; + + // Find & boot one device + deviceDesc_t firstDeviceDesc = {}; + deviceDesc_t bootedDeviceDesc = {}; + ASSERT_EQ(X_LINK_SUCCESS, + XLinkFindFirstSuitableDevice(X_LINK_UNBOOTED, in_deviceDesc, &firstDeviceDesc)); + bootDevice(firstDeviceDesc, bootedDeviceDesc); + + deviceDesc_t deviceDescArray[XLINK_MAX_DEVICES] = {{}}; + unsigned int numOfFoundDevices = 0; + ASSERT_EQ(X_LINK_SUCCESS, + XLinkFindAllSuitableDevices( + X_LINK_ANY_STATE, in_deviceDesc, deviceDescArray, + XLINK_MAX_DEVICES, &numOfFoundDevices)); + + bool foundBootedDevice = false; + for (int i = 0; i < numOfFoundDevices; ++i) { + if (deviceDescArray[i].platform == X_LINK_ANY_PLATFORM) + foundBootedDevice = true; + } + + EXPECT_GE(numOfFoundDevices, 2); + EXPECT_TRUE(foundBootedDevice); + EXPECT_EQ(numOfFoundDevices, getCountSpecificDevices(X_LINK_UNBOOTED) + + getCountSpecificDevices(X_LINK_BOOTED)); + + connectAndCloseDevice(bootedDeviceDesc); +} + +//------------------------------------------------------------------------------ +// XLinkResetRemoteTests +//------------------------------------------------------------------------------ + +TEST_P(XLinkResetRemoteTests, CanResetRemoteDevice) { + if (getCountSpecificDevices(X_LINK_UNBOOTED, _protocol) == 0) { + GTEST_SKIP(); + } + + XLinkHandler_t handler = {0}; + deviceDesc_t deviceDesc = {}; + deviceDesc_t bootedDeviceDesc = {}; + + deviceDesc.protocol = _protocol; + bootDevice(deviceDesc, bootedDeviceDesc); + connectToDevice(bootedDeviceDesc, &handler); + + // Reset device + ASSERT_EQ(X_LINK_SUCCESS, XLinkResetRemote(handler.linkId)); + std::this_thread::sleep_for(kResetTimeoutSec); + + // Make sure that device is really rebooted + deviceDesc_t foundDeviceDesc = {}; + ASSERT_EQ(X_LINK_DEVICE_NOT_FOUND, + XLinkFindFirstSuitableDevice(X_LINK_BOOTED, deviceDesc, &foundDeviceDesc)); +} + +//------------------------------------------------------------------------------ +// XLinkResetAllTests +//------------------------------------------------------------------------------ +TEST_P(XLinkResetAllTests, DISABLED_ResetBootedDevice) { + if (getCountSpecificDevices(X_LINK_UNBOOTED, _protocol) == 0) { + GTEST_SKIP(); + } + + deviceDesc_t deviceDesc = {}; + deviceDesc_t bootedDeviceDesc = {}; + + deviceDesc.protocol = _protocol; + bootDevice(deviceDesc, bootedDeviceDesc); + + // Try to reset device + ASSERT_EQ(X_LINK_SUCCESS, XLinkResetAll()); + std::this_thread::sleep_for(kResetTimeoutSec); + + deviceDesc.protocol = X_LINK_ANY_PROTOCOL; + deviceDesc_t afterResetBootedDescr = {}; + ASSERT_EQ(X_LINK_DEVICE_NOT_FOUND, + XLinkFindFirstSuitableDevice(X_LINK_BOOTED, deviceDesc, &afterResetBootedDescr)); +} + +//------------------------------------------------------------------------------ +// XLinkOpenStreamTests +//------------------------------------------------------------------------------ + +TEST_P(XLinkOpenStreamTests, CanOpenAndCloseStream) { + streamId_t stream = XLinkOpenStream(_handlerPtr.get()->linkId, "mySuperStream", 1024); + ASSERT_NE(INVALID_STREAM_ID, stream); + ASSERT_NE(INVALID_STREAM_ID_OUT_OF_MEMORY, stream); + ASSERT_EQ(X_LINK_SUCCESS, XLinkCloseStream(stream)); +} + +// CannotOpenStreamMoreThanMemoryOnDevice +TEST_P(XLinkOpenStreamTests, CannotOpenStreamMoreThanMemoryOnDevice) { + const int _512MB = 512 * 1024 * 1024; + streamId_t stream = XLinkOpenStream(_handlerPtr.get()->linkId, "mySuperStream", _512MB); + ASSERT_EQ(INVALID_STREAM_ID_OUT_OF_MEMORY, stream); +} + +// FIXME: the test doesn't work +// TODO: is it correct behavior, should we accept the same names +TEST_P(XLinkOpenStreamTests, DISABLED_CannotOpenTwoStreamsWithTheSameName) { + const int _1KB = 1 * 1024; + const char streamName[] = "mySuperStream"; + streamId_t stream0 = XLinkOpenStream(_handlerPtr.get()->linkId, streamName, _1KB); + ASSERT_NE(INVALID_STREAM_ID, stream0); + + streamId_t stream1 = XLinkOpenStream(_handlerPtr.get()->linkId, streamName, _1KB); + ASSERT_EQ(INVALID_STREAM_ID, stream1); + + ASSERT_EQ(X_LINK_SUCCESS, XLinkCloseStream(stream0)); +} + +// FIXME: XLinkOpenStream doesn't allocate any memory on device +TEST_P(XLinkOpenStreamTests, DISABLED_CannotOpenStreamsMoreThanMemoryOnDevice) { + const int _256MB = 256 * 1024 * 1024; + streamId_t stream0 = XLinkOpenStream(_handlerPtr.get()->linkId, "mySuperStream0", _256MB); + ASSERT_NE(INVALID_STREAM_ID, stream0); + + streamId_t stream1 = XLinkOpenStream(_handlerPtr.get()->linkId, "mySuperStream1", _256MB); + ASSERT_EQ(INVALID_STREAM_ID, stream1); + + ASSERT_EQ(X_LINK_SUCCESS, XLinkCloseStream(stream0)); + ASSERT_EQ(X_LINK_SUCCESS, XLinkCloseStream(stream1)); +} + +//------------------------------------------------------------------------------ +// Initialization of XLinkCommonTests +//------------------------------------------------------------------------------ + +INSTANTIATE_TEST_CASE_P( + XLinkCommon, + XLinkBootTests, + Combine(Values(X_LINK_USB_VSC, X_LINK_PCIE), + Values(X_LINK_ANY_PLATFORM)), + XLinkBootTests::getTestCaseName); + +INSTANTIATE_TEST_CASE_P( + XLinkCommon, + XLinkConnectTests, + Combine(Values(X_LINK_USB_VSC, X_LINK_PCIE), + Values(X_LINK_ANY_PLATFORM)), + XLinkBootTests::getTestCaseName); + +INSTANTIATE_TEST_CASE_P( + XLinkCommon, + XLinkFindFirstSuitableDevicePlatformTests, + Combine(Values(X_LINK_USB_VSC), + Values(X_LINK_MYRIAD_2, X_LINK_MYRIAD_X, X_LINK_ANY_PLATFORM)), + XLinkBootTests::getTestCaseName); + +INSTANTIATE_TEST_CASE_P( + XLinkCommonPCIE, + XLinkFindFirstSuitableDevicePlatformTests, + Combine(Values(X_LINK_PCIE), + Values(X_LINK_ANY_PLATFORM)), + XLinkBootTests::getTestCaseName); + +INSTANTIATE_TEST_CASE_P( + XLinkCommon, + XLinkFindFirstSuitableDeviceTests, + Combine(Values(X_LINK_USB_VSC, X_LINK_PCIE), + Values(X_LINK_ANY_PLATFORM)), + XLinkBootTests::getTestCaseName); + +INSTANTIATE_TEST_CASE_P( + XLinkCommon, + XLinkResetAllTests, + Combine(Values(X_LINK_USB_VSC, X_LINK_PCIE), + Values(X_LINK_ANY_PLATFORM)), + XLinkBootTests::getTestCaseName); + +INSTANTIATE_TEST_CASE_P( + XLinkCommon, + XLinkResetRemoteTests, + Combine(Values(X_LINK_USB_VSC, X_LINK_PCIE), + Values(X_LINK_ANY_PLATFORM)), + XLinkBootTests::getTestCaseName); + +INSTANTIATE_TEST_CASE_P( + XLinkCommon, + XLinkOpenStreamTests, + Combine(Values(X_LINK_USB_VSC, X_LINK_PCIE), + Values(X_LINK_ANY_PLATFORM)), + XLinkOpenStreamTests::getTestCaseName); + diff --git a/inference-engine/thirdparty/movidius/tests/XLink/XLink_deprecated_tests.cpp b/inference-engine/thirdparty/movidius/tests/XLink/XLink_deprecated_tests.cpp new file mode 100644 index 00000000000..63f5616172c --- /dev/null +++ b/inference-engine/thirdparty/movidius/tests/XLink/XLink_deprecated_tests.cpp @@ -0,0 +1,47 @@ +// Copyright (C) 2018-2020 Intel Corporation +// SPDX-License-Identifier: Apache-2.0 +// + +#include "XLink_specific_cases.hpp" +#include "usb_boot.h" +#include + +//------------------------------------------------------------------------------ +// XLinkBootTests +//------------------------------------------------------------------------------ + +TEST_F(XLinkBootUSBTests, CanBootConnectAndResetDevice_deprecated) { + if (getCountSpecificDevices(X_LINK_ANY_STATE, X_LINK_USB_VSC) == 0) { + GTEST_SKIP(); + } + + std::string firmwarePath; + char deviceName[XLINK_MAX_NAME_SIZE] = {0}; + // Find device + ASSERT_EQ(X_LINK_SUCCESS, + XLinkGetDeviceName(0, deviceName, XLINK_MAX_NAME_SIZE)); + ASSERT_NO_THROW(firmwarePath = getMyriadUSBFirmwarePath(deviceName)); + + // Boot it + ASSERT_EQ(X_LINK_SUCCESS, XLinkBootRemote(deviceName, firmwarePath.c_str())); + // FIXME: need to find a way to avoid this sleep + std::this_thread::sleep_for(kBootTimeoutSec); + + // Find booted + char bootedDeviceName[XLINK_MAX_NAME_SIZE] = {0}; + ASSERT_EQ(X_LINK_SUCCESS, + XLinkGetDeviceNameExtended(0, bootedDeviceName, XLINK_MAX_NAME_SIZE, DEFAULT_OPENPID)); + + // Connect to device + XLinkHandler_t handler = {}; + handler.protocol = X_LINK_USB_VSC; + handler.devicePath = bootedDeviceName; + + ASSERT_EQ(X_LINK_SUCCESS, XLinkConnect(&handler)); + std::this_thread::sleep_for(std::chrono::seconds(2)); + + // Reset device + ASSERT_EQ(X_LINK_SUCCESS, XLinkResetRemote(handler.linkId)); + // FIXME: need to find a way to avoid this sleep + std::this_thread::sleep_for(kResetTimeoutSec); +} diff --git a/inference-engine/thirdparty/movidius/tests/XLink/XLink_specific_tests.cpp b/inference-engine/thirdparty/movidius/tests/XLink/XLink_specific_tests.cpp new file mode 100644 index 00000000000..89ac8de02e6 --- /dev/null +++ b/inference-engine/thirdparty/movidius/tests/XLink/XLink_specific_tests.cpp @@ -0,0 +1,154 @@ +// Copyright (C) 2018-2019 Intel Corporation +// SPDX-License-Identifier: Apache-2.0 +// + +#include "cases/XLink_specific_cases.hpp" +#include + +//------------------------------------------------------------------------------ +// XLinkFindFirstSuitableDeviceUSBTests +//------------------------------------------------------------------------------ + +TEST_F(XLinkFindFirstSuitableDeviceUSBTests, CanFindBootedDeviceByName) { + if (getCountSpecificDevices(X_LINK_UNBOOTED, X_LINK_USB_VSC) == 0) { + GTEST_SKIP(); + } + + deviceDesc_t deviceDesc = {}; + deviceDesc_t bootedDeviceDesc = {}; + + bootDevice(deviceDesc, bootedDeviceDesc); + + deviceDesc_t foundDeviceDescr = {}; + EXPECT_EQ(X_LINK_SUCCESS, + XLinkFindFirstSuitableDevice(X_LINK_ANY_STATE, bootedDeviceDesc, &foundDeviceDescr)); + + EXPECT_TRUE(strcmp(bootedDeviceDesc.name, foundDeviceDescr.name) == 0); + + connectAndCloseDevice(bootedDeviceDesc); +} + +//------------------------------------------------------------------------------ +// XLinkBootUSBTests +//------------------------------------------------------------------------------ + +TEST_F(XLinkBootUSBTests, DeviceNameChangedAfterBoot) { + if (getCountSpecificDevices(X_LINK_UNBOOTED, X_LINK_USB_VSC) == 0) { + GTEST_SKIP(); + } + + deviceDesc_t unbootedDeviceDescr = {}; + deviceDesc_t in_deviceDesc = {}; + in_deviceDesc.protocol = X_LINK_USB_VSC; + in_deviceDesc.platform = X_LINK_ANY_PLATFORM; + + // Get device name + ASSERT_EQ(X_LINK_SUCCESS, + XLinkFindFirstSuitableDevice(X_LINK_UNBOOTED, in_deviceDesc, &unbootedDeviceDescr)); + std::string firmwarePath; + ASSERT_NO_THROW(firmwarePath = getMyriadFirmwarePath(unbootedDeviceDescr)); + + // Boot device + ASSERT_EQ(X_LINK_SUCCESS, XLinkBoot(&unbootedDeviceDescr, firmwarePath.c_str())); + std::this_thread::sleep_for(kBootTimeoutSec); + + // Booted device appear + deviceDesc_t bootedDeviceDesc = {}; + EXPECT_EQ(X_LINK_SUCCESS, + XLinkFindFirstSuitableDevice(X_LINK_BOOTED, in_deviceDesc, &bootedDeviceDesc)); + + // The device is not in unbooted and booted list at the same time + deviceDesc_t foundDeviceDesc = {}; + EXPECT_EQ(X_LINK_DEVICE_NOT_FOUND, + XLinkFindFirstSuitableDevice(X_LINK_UNBOOTED, unbootedDeviceDescr, &foundDeviceDesc)); + + connectAndCloseDevice(bootedDeviceDesc); +} + + +//------------------------------------------------------------------------------ +// XLinkFindPCIEDeviceTests +//------------------------------------------------------------------------------ + +TEST_F(XLinkPCIEDeviceTests, CannotFindSameDeviceTwice) { + if (getCountSpecificDevices(X_LINK_ANY_STATE, X_LINK_PCIE) == 0) + GTEST_SKIP(); + + deviceDesc_t deviceRequirements = {}; + deviceRequirements.protocol = X_LINK_PCIE; + deviceRequirements.platform = X_LINK_ANY_PLATFORM; + + deviceDesc_t deviceDescFirst = {}; + ASSERT_EQ(X_LINK_SUCCESS, + XLinkFindFirstSuitableDevice(X_LINK_ANY_STATE, deviceRequirements, &deviceDescFirst)); + + // On index 1 + deviceDesc_t deviceDescSecond = {}; + XLinkError_t rc = findDeviceOnIndex( + 1, X_LINK_ANY_STATE, deviceRequirements, &deviceDescSecond); + + if (rc != X_LINK_DEVICE_NOT_FOUND) { + ASSERT_EQ(rc, X_LINK_SUCCESS); + ASSERT_TRUE(strstr(deviceDescFirst.name, PCIE_NAME_SUBSTR) != nullptr); + ASSERT_TRUE(strstr(deviceDescSecond.name, PCIE_NAME_SUBSTR) != nullptr); + ASSERT_TRUE(strcmp(deviceDescFirst.name, deviceDescSecond.name) != 0); + } +} + +/** + * This is real test for two multi-device case, require two PCIe cards + * Boot second and expect that first will be unbooted, second booted + */ +TEST_F(XLinkPCIEDeviceTests, DISABLED_CanFindFirstDeviceAfterBootSecond) { + if (getCountSpecificDevices(X_LINK_ANY_STATE, X_LINK_PCIE) == 0) + GTEST_SKIP(); + + // TODO Add check that there two devices + deviceDesc_t deviceRequirements = {}; + deviceRequirements.protocol = X_LINK_PCIE; + deviceRequirements.platform = X_LINK_ANY_PLATFORM; + + // Find first device + deviceDesc_t firstDeviceDesc = {}; + ASSERT_EQ(X_LINK_SUCCESS, findDeviceOnIndex( + 0, X_LINK_ANY_STATE, deviceRequirements, &firstDeviceDesc)); + + // Find second device + deviceDesc_t secondDeviceDesc = {}; + ASSERT_EQ(X_LINK_SUCCESS, findDeviceOnIndex( + 1, X_LINK_ANY_STATE, deviceRequirements, &secondDeviceDesc)); + + // Boot second device + std::string firmwarePath; + ASSERT_NO_THROW(firmwarePath = getMyriadFirmwarePath(deviceRequirements)); + + EXPECT_EQ(X_LINK_SUCCESS, XLinkBoot(&secondDeviceDesc, firmwarePath.c_str())); + std::this_thread::sleep_for(kBootTimeoutSec); + + // Check that first still in unbooted state + deviceDesc_t firstDeviceDescAfter = {}; + firstDeviceDescAfter.protocol = X_LINK_PCIE; + firstDeviceDescAfter.platform = X_LINK_ANY_PLATFORM; + + + EXPECT_EQ(X_LINK_SUCCESS, findDeviceOnIndex( + 0, X_LINK_UNBOOTED, firstDeviceDesc, &firstDeviceDescAfter)); + + // Check that second device now in booted state + deviceDesc_t secondDeviceDescAfter = {}; + secondDeviceDescAfter.protocol = X_LINK_PCIE; + secondDeviceDescAfter.platform = X_LINK_ANY_PLATFORM; + + EXPECT_EQ(X_LINK_SUCCESS, findDeviceOnIndex( + 0, X_LINK_BOOTED, secondDeviceDesc, &secondDeviceDescAfter)); + + // TODO Move it to separate function + // Close second device + XLinkHandler_t handler = {0}; + handler.protocol = secondDeviceDesc.protocol; + handler.devicePath = secondDeviceDesc.name; + ASSERT_EQ(X_LINK_SUCCESS, XLinkConnect(&handler)); + + ASSERT_EQ(X_LINK_SUCCESS, XLinkResetRemote(handler.linkId)); + std::this_thread::sleep_for(kResetTimeoutSec); +} diff --git a/inference-engine/thirdparty/movidius/tests/XLink/cases/XLink_common_cases.cpp b/inference-engine/thirdparty/movidius/tests/XLink/cases/XLink_common_cases.cpp new file mode 100644 index 00000000000..9aaefa56185 --- /dev/null +++ b/inference-engine/thirdparty/movidius/tests/XLink/cases/XLink_common_cases.cpp @@ -0,0 +1,98 @@ +// Copyright (C) 2018-2019 Intel Corporation +// SPDX-License-Identifier: Apache-2.0 +// + + +#include "XLink_common_cases.hpp" + +#include + +static XLinkGlobalHandler_t globalHandler; + +//------------------------------------------------------------------------------ +// Implementation of methods of class XLinkTests +//------------------------------------------------------------------------------ + +void XLinkTests::SetUpTestCase() { + ASSERT_EQ(X_LINK_SUCCESS, XLinkInitialize(&globalHandler)); + + // Deprecated field usage. Begin. + globalHandler.protocol = USB_VSC; + // Deprecated field usage. End. + + // Waiting for initialization + std::this_thread::sleep_for(std::chrono::seconds(1)); +} + +//------------------------------------------------------------------------------ +// Implementation of methods of class XLinkDeviceTestsCommon +//------------------------------------------------------------------------------ + +static std::string protocolToString(XLinkProtocol_t protocol) { + switch (protocol) { + case X_LINK_USB_VSC: + return std::string("USB"); + case X_LINK_PCIE: + return std::string("PCIE"); + default: + return std::string("ANY"); + } +} + +static std::string platformToString(XLinkPlatform_t platform) { + switch (platform) { + case X_LINK_MYRIAD_2: + return std::string("Myriad2"); + case X_LINK_MYRIAD_X: + return std::string("MyriadX"); + default: + return std::string("ANY"); + } +} + +std::string XLinkDeviceTestsCommon::getTestCaseName( + const TestParamInfo& param) { + XLinkProtocol_t protocol = get<0>(param.param); + XLinkPlatform_t platform = get<1>(param.param); + + return "protocol=" + protocolToString(protocol) + + "_platform=" + platformToString(platform); +} + +void XLinkDeviceTestsCommon::SetUp() { + _protocol = get<0>(XLinkDeviceTestsCommonParam::GetParam()); + _platform = get<1>(XLinkDeviceTestsCommonParam::GetParam()); +} + +//------------------------------------------------------------------------------ +// Implementation of methods of class XLinkOpenStreamUSBTests +//------------------------------------------------------------------------------ + +std::string XLinkOpenStreamTests::getTestCaseName( + const TestParamInfo& param) { + const auto name = XLinkDeviceTestsCommon::getTestCaseName(param); + + XLinkProtocol_t protocol = get<0>(param.param); + if (getCountSpecificDevices(X_LINK_UNBOOTED, protocol) == 0) { + return "DISABLED_" + name; + } + + return name; +} + +XLinkOpenStreamTests::XLinkOpenStreamTests() : _handlerPtr(new XLinkHandler_t()) { +} + +void XLinkOpenStreamTests::SetUp() { + XLinkDeviceTestsCommon::SetUp(); + + _deviceDesc.protocol = _protocol; + _deviceDesc.platform = _platform; + + XLinkTestsHelper::bootDevice(_deviceDesc, _bootedDesc); + XLinkTestsHelper::connectToDevice(_bootedDesc, _handlerPtr.get()); +} + +void XLinkOpenStreamTests::TearDown() { + XLinkTestsHelper::closeDevice(_handlerPtr.get()); +} diff --git a/inference-engine/thirdparty/movidius/tests/XLink/cases/XLink_common_cases.hpp b/inference-engine/thirdparty/movidius/tests/XLink/cases/XLink_common_cases.hpp new file mode 100644 index 00000000000..ee45709615e --- /dev/null +++ b/inference-engine/thirdparty/movidius/tests/XLink/cases/XLink_common_cases.hpp @@ -0,0 +1,110 @@ +// Copyright (C) 2018-2020 Intel Corporation +// SPDX-License-Identifier: Apache-2.0 +// + + +#pragma once + +#include "XLink.h" +#include "XLink_tests_helpers.hpp" + +#include "gtest/gtest.h" +#include + +using namespace ::testing; +using XLinkDeviceTestsCommonParam = WithParamInterface>; + +//------------------------------------------------------------------------------ +// class XLinkTests +//------------------------------------------------------------------------------ +class XLinkTests : public ::testing::Test, + protected XLinkTestsHelper { +public: + static void SetUpTestCase(); +}; + +//------------------------------------------------------------------------------ +// class XLinkNullPtrTests +//------------------------------------------------------------------------------ +class XLinkNullPtrTests: public XLinkTests {}; + +//------------------------------------------------------------------------------ +// class XLinkFindAllSuitableDevicesTests +//------------------------------------------------------------------------------ + +class XLinkFindAllSuitableDevicesTests : public XLinkTests {}; + + +//------------------------------------------------------------------------------ +// class XLinkCommonTests +//------------------------------------------------------------------------------ +class XLinkDeviceTestsCommon : public XLinkTests, + public XLinkDeviceTestsCommonParam { +public: + //Operations + static std::string getTestCaseName( + const TestParamInfo& param); + + void SetUp() override; + +protected: + XLinkProtocol_t _protocol; + XLinkPlatform_t _platform; +}; + +//------------------------------------------------------------------------------ +// class XLinkBootUSBTests +//------------------------------------------------------------------------------ + +class XLinkBootTests : public XLinkDeviceTestsCommon {}; + +//------------------------------------------------------------------------------ +// class XLinkConnectTests +//------------------------------------------------------------------------------ +class XLinkConnectTests : public XLinkDeviceTestsCommon {}; + +//------------------------------------------------------------------------------ +// class XLinkFindFirstSuitableDeviceTests +//------------------------------------------------------------------------------ + +class XLinkFindFirstSuitableDeviceTests : public XLinkDeviceTestsCommon {}; + +//------------------------------------------------------------------------------ +// class XLinkFindFirstSuitableBootedDeviceTests +//------------------------------------------------------------------------------ + +class XLinkFindFirstSuitableDevicePlatformTests : public XLinkDeviceTestsCommon {}; + +//------------------------------------------------------------------------------ +// class XLinkResetRemoteTests +//------------------------------------------------------------------------------ +class XLinkResetRemoteTests : public XLinkDeviceTestsCommon {}; + +//------------------------------------------------------------------------------ +// class XLinkResetAllTests +//------------------------------------------------------------------------------ +class XLinkResetAllTests : public XLinkDeviceTestsCommon {}; + + + +//------------------------------------------------------------------------------ +// class XLinkOpenStreamTests +//------------------------------------------------------------------------------ + +class XLinkOpenStreamTests : public XLinkDeviceTestsCommon { +public: + //Operations + static std::string getTestCaseName( + const TestParamInfo& param); + +protected: + XLinkOpenStreamTests(); + + void SetUp() override; + void TearDown() override; + +protected: + std::unique_ptr _handlerPtr; + deviceDesc_t _deviceDesc = {}; + deviceDesc_t _bootedDesc = {}; +}; diff --git a/inference-engine/thirdparty/movidius/tests/XLink/cases/XLink_specific_cases.hpp b/inference-engine/thirdparty/movidius/tests/XLink/cases/XLink_specific_cases.hpp new file mode 100644 index 00000000000..4638dd39297 --- /dev/null +++ b/inference-engine/thirdparty/movidius/tests/XLink/cases/XLink_specific_cases.hpp @@ -0,0 +1,25 @@ +// Copyright (C) 2018-2019 Intel Corporation +// SPDX-License-Identifier: Apache-2.0 +// + +#pragma once + +#include "XLink_common_cases.hpp" + +//------------------------------------------------------------------------------ +// class XLinkBootUSBTests +//------------------------------------------------------------------------------ + +class XLinkBootUSBTests : public XLinkTests {}; + +//------------------------------------------------------------------------------ +// class XLinkFindFirstSuitableDeviceUSBTests +//------------------------------------------------------------------------------ + +class XLinkFindFirstSuitableDeviceUSBTests : public XLinkTests {}; + +//------------------------------------------------------------------------------ +// class XLinkFindPCIEDeviceTests +//------------------------------------------------------------------------------ + +class XLinkPCIEDeviceTests: public XLinkTests {}; diff --git a/inference-engine/thirdparty/movidius/tests/XLink/helpers/XLink_tests_helpers.cpp b/inference-engine/thirdparty/movidius/tests/XLink/helpers/XLink_tests_helpers.cpp new file mode 100644 index 00000000000..2ab2d0168a2 --- /dev/null +++ b/inference-engine/thirdparty/movidius/tests/XLink/helpers/XLink_tests_helpers.cpp @@ -0,0 +1,133 @@ +// Copyright (C) 2018-2020 Intel Corporation +// SPDX-License-Identifier: Apache-2.0 +// + +#include "XLink_tests_helpers.hpp" +#include + +//------------------------------------------------------------------------------ +// Implementation of methods of class XLinkTestsHelpersBoot +//------------------------------------------------------------------------------ + +void XLinkTestsHelper::bootDevice(const deviceDesc_t& in_deviceDesc, deviceDesc_t& out_bootedDeviceDesc) { + deviceDesc_t tmp_deviceDesc = {}; + ASSERT_EQ(X_LINK_SUCCESS, + XLinkFindFirstSuitableDevice(X_LINK_UNBOOTED, in_deviceDesc, &tmp_deviceDesc)); + + std::string firmwarePath; + ASSERT_NO_THROW(firmwarePath = getMyriadFirmwarePath(tmp_deviceDesc)); + printf("Would boot (%s) device with firmware (%s) \n", tmp_deviceDesc.name, firmwarePath.c_str()); + + ASSERT_EQ(X_LINK_SUCCESS, XLinkBoot(&tmp_deviceDesc, firmwarePath.c_str())); + // FIXME: need to find a way to avoid this sleep + std::this_thread::sleep_for(kBootTimeoutSec); + + // Check, that device booted + tmp_deviceDesc.platform = X_LINK_ANY_PLATFORM; + memset(tmp_deviceDesc.name, 0, XLINK_MAX_NAME_SIZE); + ASSERT_EQ(X_LINK_SUCCESS, + XLinkFindFirstSuitableDevice(X_LINK_BOOTED, tmp_deviceDesc, &out_bootedDeviceDesc)); +} + +void XLinkTestsHelper::connectToDevice(deviceDesc_t& in_bootedDeviceDesc, XLinkHandler_t* out_handler) { + if (!out_handler){ + GTEST_FAIL(); + } + + memset(out_handler, 0, sizeof(XLinkHandler_t)); + out_handler->protocol = in_bootedDeviceDesc.protocol; + out_handler->devicePath = in_bootedDeviceDesc.name; + + ASSERT_EQ(X_LINK_SUCCESS, XLinkConnect(out_handler)); +} + +void XLinkTestsHelper::closeDevice(XLinkHandler_t* handler) { + ASSERT_EQ(X_LINK_SUCCESS, XLinkResetRemote(handler->linkId)); + std::this_thread::sleep_for(kResetTimeoutSec); + + // Make sure that device is closed + deviceDesc_t deviceDesc = {}; + deviceDesc.protocol = handler->protocol; + deviceDesc.platform = X_LINK_ANY_PLATFORM; + strcpy(deviceDesc.name, handler->devicePath); + + deviceDesc_t foundDeviceDesc = {}; + ASSERT_EQ(X_LINK_DEVICE_NOT_FOUND, + XLinkFindFirstSuitableDevice(X_LINK_BOOTED, deviceDesc, &foundDeviceDesc)); +} + +void XLinkTestsHelper::connectAndCloseDevice(deviceDesc_t& in_bootedDeviceDesc) { + XLinkHandler_t handler = {0}; + + connectToDevice(in_bootedDeviceDesc, &handler); + closeDevice(&handler); +} + +std::string XLinkTestsHelper::getMyriadUSBFirmwarePath(const std::string& deviceName) { + if (deviceName.find('-') == std::string::npos) { + throw std::invalid_argument("Invalid device address"); + } + + if (deviceName.find("ma2480") != std::string::npos) { + return FIRMWARE_SUBFOLDER + std::string("usb-ma2x8x.mvcmd"); + } + + return FIRMWARE_SUBFOLDER + std::string("usb-ma2450.mvcmd"); +} + +std::string XLinkTestsHelper::getMyriadFirmwarePath(const deviceDesc_t& in_deviceDesc) { + if(in_deviceDesc.protocol != X_LINK_USB_VSC && + in_deviceDesc.protocol != X_LINK_PCIE) { + throw std::invalid_argument("Device protocol must be specified"); + } + + if(in_deviceDesc.protocol == X_LINK_PCIE) { +#if defined(_WIN32) + return FIRMWARE_SUBFOLDER + std::string("pcie-ma248x.elf"); +#else + return FIRMWARE_SUBFOLDER + std::string("pcie-ma248x.mvcmd"); +#endif + } + + return getMyriadUSBFirmwarePath(in_deviceDesc.name); +} + +XLinkError_t XLinkTestsHelper::findDeviceOnIndex( + const int index, + const XLinkDeviceState_t deviceState, + const deviceDesc_t in_deviceRequirements, + deviceDesc_t *out_foundDevicesPtr) { + + deviceDesc_t deviceDescArray[XLINK_MAX_DEVICES] = {}; + unsigned int foundDevices = 0; + XLinkError_t rc = XLinkFindAllSuitableDevices( + deviceState, in_deviceRequirements, deviceDescArray, XLINK_MAX_DEVICES, &foundDevices); + + if (rc != X_LINK_SUCCESS) { + return rc; + } + + if (foundDevices <= index) { + return X_LINK_DEVICE_NOT_FOUND; + } + + out_foundDevicesPtr->platform = deviceDescArray[index].platform; + out_foundDevicesPtr->protocol = deviceDescArray[index].protocol; + strncpy(out_foundDevicesPtr->name, deviceDescArray[index].name, XLINK_MAX_NAME_SIZE); + return X_LINK_SUCCESS; +} + +int XLinkTestsHelper::getCountSpecificDevices(const XLinkDeviceState_t state, + const XLinkProtocol_t deviceProtocol, + const XLinkPlatform_t devicePlatform) { + deviceDesc_t req_deviceDesc = {}; + req_deviceDesc.protocol = deviceProtocol; + req_deviceDesc.platform = devicePlatform; + + deviceDesc_t deviceDescArray[XLINK_MAX_DEVICES] = {}; + unsigned int foundDevices = 0; + XLinkFindAllSuitableDevices( + state, req_deviceDesc, deviceDescArray, XLINK_MAX_DEVICES, &foundDevices); + + return foundDevices; +} diff --git a/inference-engine/thirdparty/movidius/tests/XLink/helpers/XLink_tests_helpers.hpp b/inference-engine/thirdparty/movidius/tests/XLink/helpers/XLink_tests_helpers.hpp new file mode 100644 index 00000000000..238b9d89719 --- /dev/null +++ b/inference-engine/thirdparty/movidius/tests/XLink/helpers/XLink_tests_helpers.hpp @@ -0,0 +1,71 @@ +// Copyright (C) 2018-2020 Intel Corporation +// SPDX-License-Identifier: Apache-2.0 +// + +#pragma once + +#include "XLink.h" +#include "XLinkPrivateDefines.h" + +#include +#include +#include + +//------------------------------------------------------------------------------ +// Defines +//------------------------------------------------------------------------------ + +using std_seconds = std::chrono::seconds; + +#if (defined(_WIN32) || defined(_WIN64)) + static constexpr char PCIE_NAME_SUBSTR[] = "mxlink"; + static constexpr char FIRMWARE_SUBFOLDER[] = "./"; +#else + static constexpr char PCIE_NAME_SUBSTR[] = "mxlk"; + static constexpr char FIRMWARE_SUBFOLDER[] = "./lib/"; +#endif + +//------------------------------------------------------------------------------ +// Helpers +//------------------------------------------------------------------------------ + +constexpr std::chrono::seconds operator "" _sec(unsigned long long s) +{ + return std::chrono::seconds(s); +} + +//------------------------------------------------------------------------------ +// class XLinkTestsHelper +//------------------------------------------------------------------------------ + +class XLinkTestsHelper { +public: + const std_seconds kBootTimeoutSec = 2_sec; + const std_seconds kResetTimeoutSec = 5_sec; + + const std::string kUSBMyriadX = "ma2480"; + const std::string kUSBMyriad2 = "ma2450"; + + // Device management + void bootDevice(const deviceDesc_t& in_deviceDesc, deviceDesc_t& out_bootedDeviceDesc); + + void connectToDevice(deviceDesc_t& in_bootedDeviceDesc, XLinkHandler_t* out_handler); + void closeDevice(XLinkHandler_t* handler); + + void connectAndCloseDevice(deviceDesc_t& in_bootedDeviceDesc); + + // Firmware + std::string getMyriadUSBFirmwarePath(const std::string& deviceName); + std::string getMyriadFirmwarePath(const deviceDesc_t& in_deviceDesc); + + // Device searching + XLinkError_t findDeviceOnIndex(const int index, + const XLinkDeviceState_t deviceState, + const deviceDesc_t in_deviceRequirements, + deviceDesc_t *out_foundDevicesPtr); + + + static int getCountSpecificDevices(const XLinkDeviceState_t state = X_LINK_ANY_STATE, + const XLinkProtocol_t deviceProtocol = X_LINK_ANY_PROTOCOL, + const XLinkPlatform_t devicePlatform = X_LINK_ANY_PLATFORM); +}; diff --git a/inference-engine/tools/CMakeLists.txt b/inference-engine/tools/CMakeLists.txt index 844e5419d3a..2af002e5bea 100644 --- a/inference-engine/tools/CMakeLists.txt +++ b/inference-engine/tools/CMakeLists.txt @@ -24,4 +24,6 @@ if(ENABLE_PYTHON) install(DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/benchmark_tool DESTINATION deployment_tools/tools COMPONENT python_tools) + install(FILES + COMPONENT python_tools) endif() diff --git a/inference-engine/tools/cross_check_tool/README.md b/inference-engine/tools/cross_check_tool/README.md new file mode 100644 index 00000000000..6ec1a873e0d --- /dev/null +++ b/inference-engine/tools/cross_check_tool/README.md @@ -0,0 +1,281 @@ +# Cross Check Tool + +Cross Check Tool is a console application that enables comparing accuracy and performance metrics for two successive +model inferences that are performed on two different supported Intel® devices or with different precisions. +The Cross Check Tool can compare the metrics per layer or all over the model. + +## Running the Cross Check Tool + +Cross Check Tool is distributed as a Python module and there is no need to build it. To run the Cross Check Tool, +execute the `cross_check_tool.py` file with necessary parameters. Please note that the Inference Engine assumes that weights +are in the same folder as the `.xml` file. + +You can get the list of all available options using the `-h` option: + +```sh +$python3 cross_check_tool.py -h + +Cross Check Tool is a console application that enables comparing accuracy and +provides performance metrics + +optional arguments: + -h, --help show this help message and exit + +Model specific arguments: + --input INPUT, -i INPUT + Path to an input image file or multi-input file to + infer. Generates input(s) from normal distribution if + empty + --batch BATCH, -b BATCH + Overrides batch size. Default is inherited from model + --model MODEL, -m MODEL + Path to an .xml file that represents the first IR of + the trained model to infer. + --reference_model REFERENCE_MODEL, -ref_m REFERENCE_MODEL + Path to an .xml file that represents the second IR in + different precision to compare the metrics. + --layers LAYERS, -layers LAYERS + Defines layers to check. Options: all, None - for + output layers check, list of comma-separated layer + names to check. Default value is None. + --mapping MAPPING, -map MAPPING + Model Optimizer provided mapping for --model/-m + --reference_mapping REFERENCE_MAPPING, -ref_map REFERENCE_MAPPING + Model Optimizer provided mapping for + --reference_model/-ref_model + --num_of_iterations NUM_OF_ITERATIONS, -ni NUM_OF_ITERATIONS + Number of iterations to collect all over the net + performance + +Plugin specific arguments: + --plugin_path PLUGIN_PATH, -pp PLUGIN_PATH + Path to a plugin folder. + --device DEVICE, -d DEVICE + The first target device to infer the model specified + with the -m or --model option. CPU, GPU, HDDL or + MYRIAD are acceptable. + --config CONFIG, -conf CONFIG + Path to config file for -d or -device device plugin + --reference_device REFERENCE_DEVICE, -ref_d REFERENCE_DEVICE + The second target device to infer the model and + compare the metrics. CPU, GPU, HDDL or MYRIAD are + acceptable. + --reference_config REFERENCE_CONFIG, -ref_conf REFERENCE_CONFIG + Path to config file for -ref_d or -reference_device + device plugin + -l L Required for MKLDNN (CPU)-targeted custom layers. + Comma separated paths to a shared libraries with the + kernels implementation. + +CCT mode arguments: + --dump Enables blobs statistics dumping + --load LOAD Path to a file to load blobs from + +``` +### Examples + +1. To check per-layer accuracy and performance of inference in FP32 precision on the CPU against the GPU, run: + ```sh + $python3 cross_check_tool.py -i \ + -m \ + -d GPU \ + -ref_d CPU \ + --layers all + ``` + + The output looks as follows: + ```sh + [ INFO ] Cross check with one IR was enabled + [ INFO ] GPU:FP32 vs CPU:FP32 + [ INFO ] The same IR on both devices: + [ INFO ] Statistics will be dumped for X layers: , , ... , + [ INFO ] Layer statistics + Max absolute difference : 1.15204E-03 + Min absolute difference : 0.0 + Max relative difference : 1.15204E+17 + Min relative difference : 0.0 + Min reference value : -1.69513E+03 + Min absolute reference value : 2.71080E-06 + Max reference value : 1.17132E+03 + Max absolute reference value : 1.69513E+03 + Min actual value : -1.69513E+03 + Min absolute actual value : 8.66465E-05 + Max actual value : 1.17132E+03 + Max absolute actual value : 1.69513E+03 + Device: -d GPU -ref_d CPU + Status: OPTIMIZED_OUT OPTIMIZED_OUT + Layer type: Convolution Convolution + Real time, microsec: 0 120 + Number of NAN: 0 0 + Number of INF: 0 0 + Number of ZERO: 0 0 + ... + + ... + + [ INFO ] Overall max absolute difference = 0.00115203857421875 + [ INFO ] Overall min absolute difference = 0.0 + [ INFO ] Overall max relative difference = 1.1520386483093504e+17 + [ INFO ] Overall min relative difference = 0.0 + [ INFO ] Execution successful + ``` + +2. To check the overall accuracy and performance of inference on the CPU in FP32 precision against the + Intel® Movidius™ Myriad™ device in FP16 precision, run: + ```sh + $python3 cross_check_tool.py -i \ + -m \ + -d MYRIAD \ + -ref_m \ + -ref_d CPU + ``` + + The output looks as follows: + ```sh + [ INFO ] Cross check with two IRs was enabled + [ INFO ] GPU:FP16 vs CPU:FP32 + [ INFO ] IR for MYRIAD : + [ INFO ] IR for CPU : + [ INFO ] Statistics will be dumped for 1 layer: + [ INFO ] Layer statistics + Max absolute difference : 2.32944E-02 + Min absolute difference : 3.63002E-13 + Max relative difference : 6.41717E+10 + Min relative difference : 1.0 + Min reference value : 3.63002E-13 + Min absolute reference value : 3.63002E-13 + Max reference value : 7.38138E-01 + Max absolute reference value : 7.38138E-01 + Min actual value : 0.0 + Min absolute actual value : 0.0 + Max actual value : 7.14844E-01 + Max absolute actual value : 7.14844E-01 + Device: -d MYRIAD -ref_d CPU + Status: OPTIMIZED_OUT OPTIMIZED_OUT + Layer type: Reshape Reshape + Real time, microsec: 0 0 + Number of NAN: 0 0 + Number of INF: 0 0 + Number of ZERO: 0 0 + ---------------------------------------------------------------------- + Overall performance, microseconds: 2.79943E+05 6.24670E+04 + ---------------------------------------------------------------------- + [ INFO ] Overall max absolute difference = 0.023294448852539062 + [ INFO ] Overall min absolute difference = 3.630019191052519e-13 + [ INFO ] Overall max relative difference = 64171696128.0 + [ INFO ] Overall min relative difference = 1.0 + [ INFO ] Execution successful + ``` + +3. To dump layer statistics from a specific list of layers, run: + ```sh + $python3 cross_check_tool.py -i \ + -m \ + -d MYRIAD \ + --dump \ + --layers + ``` + + The output looks as follows: + ```sh + [ INFO ] Dump mode was enabled + [ INFO ] layer processing + ... + [ INFO ] layer processing + [ INFO ] Dump file path: + [ INFO ] Execution successful + ``` + + If you do not provide the `-i` key, the Cross Check Tool generates an input from normal distributed noise and saves + it in a multi-input file format with the filename `_input_layers_dump.txt` in the same folder as the Intermediate Representation (IR). + +4. To check the overall accuracy and performance of inference on the CPU in FP32 precision against dumped results, run: + ```sh + $python3 cross_check_tool.py -i \ + -m \ + -d CPU \ + --load \ + --layers all + ``` + + The output looks as follows: + ```sh + [ INFO ] Load mode was enabled + [ INFO ] IR for CPU : + [ INFO ] Loading blob from /localdisk/models/FP16/icv_squeezenet_v1.0.xml_GPU_dump.npz + [ INFO ] Statistics will be dumped for X layers: , , ... , + [ INFO ] Layer statistics + Max absolute difference : 0.0 + Min absolute difference : 0.0 + Max relative difference : 0.0 + Min relative difference : 0.0 + Min reference value : 0.0 + Min absolute reference value : 0.0 + Max reference value : 7.14844E-01 + Max absolute reference value : 7.14844E-01 + Min actual value : 0.0 + Min absolute actual value : 0.0 + Max actual value : 7.14844E-01 + Max absolute actual value : 7.14844E-01 + Device: -d CPU -load GPU + Status: OPTIMIZED_OUT OPTIMIZED_OUT + Layer type: Reshape Reshape + Real time, microsec: 0 0 + Number of NAN: 0 0 + Number of INF: 0 0 + Number of ZERO: 609 699 + + ... + + ... + + [ INFO ] Overall max absolute difference = 0.0 + [ INFO ] Overall min absolute difference = 0.0 + [ INFO ] Overall max relative difference = 0.0 + [ INFO ] Overall min relative difference = 0.0 + [ INFO ] Execution successful + ``` + +### Multi-input and dump file format + +Multi-input and dump file is a numpy compressed `.npz` file with hierarchy: + +```sh +{ + ‘layer_name’: { + ‘blob’: np.array([…]) + ‘pc’: { + ‘device’: ‘device_name’, + ‘real_time’: int_real_time_in_microseconds_from_plugin, + ‘exec_type’: ‘exec_type_from_plugin’, + ‘layer_type’: ‘layer_type_from_plugin’, + ‘status’: ‘status_from_plugin’ + } + }, + ‘another_layer_name’: { + ‘blob’: np.array([…]) + ‘pc’: { + ‘device’: ‘device_name’, + ‘real_time’: int_real_time_in_microseconds_from_plugin, + ‘exec_type’: ‘exec_type_from_plugin’, + ‘layer_type’: ‘layer_type_from_plugin’, + ‘status’: ‘status_from_plugin’ + } + }, + ... +} +``` + +### Configuration file + +There is an option to pass configuration file to plugin by providing +`--config` and/or `--reference_config` keys. + +Configuration file is a text file with content of pairs of keys and values. + +Structure of configuration file: + +```sh +KEY VALUE +ANOTHER_KEY ANOTHER_VALUE,VALUE_1 +``` diff --git a/inference-engine/tools/cross_check_tool/__init__.py b/inference-engine/tools/cross_check_tool/__init__.py new file mode 100644 index 00000000000..79b3c5795b4 --- /dev/null +++ b/inference-engine/tools/cross_check_tool/__init__.py @@ -0,0 +1,15 @@ +""" +Copyright (C) 2018-2020 Intel Corporation + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +""" diff --git a/inference-engine/tools/cross_check_tool/cross_check_tool.py b/inference-engine/tools/cross_check_tool/cross_check_tool.py new file mode 100644 index 00000000000..1176187275f --- /dev/null +++ b/inference-engine/tools/cross_check_tool/cross_check_tool.py @@ -0,0 +1,297 @@ +# Copyright (C) 2018-2019 Intel Corporation +# SPDX-License-Identifier: Apache-2.0 +# + +import datetime +import logging as log +import os +import sys + +import numpy as np + +try: + from openvino import inference_engine as ie + from openvino.inference_engine import IENetwork, IECore +except Exception as e: + exception_type = type(e).__name__ + print("The following error happened while importing Python API module:\n[ {} ] {}".format(exception_type, e)) + sys.exit(1) + +from utils import get_config_dictionary, get_layers_list, print_output_layers, input_processing, \ + accuracy_metrics, validate_args, build_parser, set_logger, find_out_cct_mode, print_all_over_the_net_metrics, \ + update_global_accuracy_matrics, blob_counters, performance_metrics, manage_user_outputs_with_mapping, \ + dump_output_file, load_dump, error_handling, print_input_layers, set_verbosity + + +### +# PLUGIN +### + + +@error_handling('plugin of \'{plugin.device}\' device config \'{config}\' loading') +def set_plugin_config(core: IECore, device : str, config: str = None): + core.set_config(get_config_dictionary(config_file=config), device_name=device) + + +@error_handling('\'{cpu_ext}\' cpu extensions loading') +def set_cpu_extensions(core: IECore, cpu_ext: str): + core.add_extension(cpu_ext, "CPU") + + +def get_plugin(device: str, cpu_ext: str = None, config: str = None): + ie = IECore() + # log.info('{} plugin:\n API version ............ {}'.format(device, plugin.version), extra={'no_lvl': True}) + set_plugin_config(core=ie, device=device, config=config) + if cpu_ext and 'CPU' in device: + set_cpu_extensions(core=ie, cpu_ext=cpu_ext) + return ie + + +### +# MODEL +### + + +@error_handling('reading {model} IR model') +def get_net(model: str, core: IECore): + model_xml = model + model_bin = os.path.splitext(model_xml)[0] + ".bin" + net = core.read_network(model=model_xml, weights=model_bin) + return net + + +@error_handling('loading network to plugin of {plugin.device} device') +def get_exec_net(core, net, device): + return core.load_network(network=net, device_name=device) + + +@error_handling('output \'{output}\' addition for network from model \'{model}\'') +def get_net_copy_with_output(model: str, output: str, core: IECore): + net_copy = get_net(model=model, core=core) + if output not in ['None', None]: + net_copy.add_outputs(output) + return net_copy + + +@error_handling('getting model layers info') +def get_model_info(net: IENetwork): + layers = net.layers + precision = layers[list(layers.keys())[0]].out_data[0].precision + return layers, net.inputs, net.outputs, precision + + +### +# INFER +### + + +@error_handling('processing inference on \'{device}\' device') +def get_infer_results(executable_network, inputs: dict): + return executable_network.infer(inputs=inputs) + + +@error_handling('getting performance counts from executable network on \'{device}\' device') +def get_perf_counts(executable_network): + return executable_network.requests[0].get_perf_counts() + + +@error_handling('getting inference results for outputs: \'{output}\'') +def infer(net: IENetwork, core: IECore, device : str, inputs: dict, output: list): + executable_network = get_exec_net(core=core, net=net, device=device) + infer_dict = get_infer_results(executable_network=executable_network, inputs=inputs) + pc = get_perf_counts(executable_network=executable_network) + no_i = 'no_info' + no_info_pc = {'cpu_time': no_i, 'exec_time': no_i, 'layer_type': no_i, 'real_time': no_i, 'status': no_i} + result = {} + for out in output: + if out not in infer_dict: + log.warning("There is no '{}' layer in Inference Engine outputs results".format(out)) + continue + pc = pc[out] if out in pc else no_info_pc + pc['device'] = device + result = {out: [infer_dict[out], pc]} + return result + + +@error_handling('getting inference results for outputs: \'{output}\'') +def overall_accuracy_check(model: str, ref_model: str, out_layers: list, ref_out_layers: list, inputs: dict, + ref_inputs: dict, core: IECore, device: str, ref_core: IECore, ref_device : str, layers: str, + num_of_iterations: int): + global_times, ref_global_times = [], [] + if layers in ['None', None]: + net_copy = get_net_copy_with_output(model=model, output=layers, core=core) + ref_net_copy = get_net_copy_with_output(model=ref_model, output=layers, core=ref_core) + for i in range(num_of_iterations): + t1 = datetime.datetime.now() + infer(net=net_copy, core=core, device=device, inputs=inputs, output=out_layers) + t2 = datetime.datetime.now() + infer(net=ref_net_copy, core=ref_core, device=ref_device, inputs=ref_inputs, output=ref_out_layers) + t3 = datetime.datetime.now() + global_times.append(t2 - t1) + ref_global_times.append(t3 - t2) + return global_times, ref_global_times + + +def one_ir_mode(args): + core = get_plugin(args.device, args.l, args.config) + net = get_net(model=args.model, core=core) + net_layers, net_inputs, net_outputs, precision = get_model_info(net) + log.info('{}:{} vs {}:{}'.format(args.device, precision, args.reference_device, precision)) + log.info('The same IR on both devices: {}'.format(args.model)) + out_layers = get_layers_list(net_layers, net_inputs, net_outputs, args.layers) + print_input_layers(net_inputs) + print_output_layers(out_layers) + ref_core = get_plugin(args.reference_device, args.l, args.reference_config) + global_accuracy = [] + inputs = input_processing(model_path=args.model, net_inputs=net_inputs, input_file=args.input) + global_times, ref_global_times = overall_accuracy_check(model=args.model, ref_model=args.model, + out_layers=out_layers, ref_out_layers=out_layers, + inputs=inputs, ref_inputs=inputs, core=core, + device=args.device, ref_core=ref_core, + ref_device=args.reference_device, layers=args.layers, + num_of_iterations=args.num_of_iterations) + for out_layer in out_layers: + log.info('Layer {} statistics'.format(out_layer)) + net_copy = get_net_copy_with_output(model=args.model, output=out_layer, core=core) + results = infer(net=net_copy, core=core, device=args.device, inputs=inputs, output=[out_layer]) + if out_layer not in results: + continue + out_blob, pc = results[out_layer] + ref_results = infer(net=net_copy, core=ref_core, device=args.reference_device, inputs=inputs, output=[out_layer]) + if out_layer not in ref_results: + continue + ref_out_blob, ref_pc = ref_results[out_layer] + a_m = accuracy_metrics(out_blob=out_blob, ref_out_blob=ref_out_blob) + performance_metrics(pc=pc, ref_pc=ref_pc) + blob_counters(out_blob=out_blob, ref_out_blob=ref_out_blob) + global_accuracy = update_global_accuracy_matrics(global_accuracy=global_accuracy, current_accuracy=a_m) + print_all_over_the_net_metrics(global_times=global_times, ref_global_times=ref_global_times, + global_accuracy=global_accuracy) + + +def two_ir_mode(args): + core = get_plugin(args.device, args.l, args.config) + ref_core = get_plugin(args.reference_device, args.l, args.reference_config) + net = get_net(model=args.model, core=core) + net_layers, net_inputs, net_outputs, precision = get_model_info(net) + ref_net = get_net(model=args.reference_model, core=ref_core) + ref_net_layers, ref_net_inputs, ref_net_outputs, ref_precision = get_model_info(ref_net) + log.info('{}:{} vs {}:{}'.format(args.device, precision, args.reference_device, ref_precision)) + log.info('IR for {} : {}'.format(args.device, args.model)) + log.info('IR for {} : {}'.format(args.reference_device, args.reference_model)) + out_layers = get_layers_list(net_layers, net_inputs, net_outputs, args.layers) + ref_out_layers = get_layers_list(ref_net_layers, ref_net_inputs, ref_net_outputs, args.layers) + print_input_layers(net_inputs) + print_output_layers(out_layers) + layers_map = manage_user_outputs_with_mapping(mapping=args.mapping, reference_mapping=args.reference_mapping, + user_layers=out_layers) + inputs = input_processing(model_path=args.model, net_inputs=net_inputs, input_file=args.input, + layers_map=layers_map) + ref_inputs = input_processing(model_path=args.reference_model, net_inputs=ref_net_inputs, input_file=args.input, + layers_map=layers_map) + global_accuracy = [] + global_times, ref_global_times = overall_accuracy_check(model=args.model, ref_model=args.reference_model, + out_layers=out_layers, ref_out_layers=ref_out_layers, + inputs=inputs, ref_inputs=ref_inputs, plugin=core, + ref_plugin=ref_core, layers=args.layers, + num_of_iterations=args.num_of_iterations) + for out_layer in layers_map: + ref_out_layer = layers_map[out_layer] + if out_layer == ref_out_layer: + log.info('Layer {} statistics'.format(out_layer)) + else: + log.info('Statistics \'{}\' vs \'{}\''.format(out_layer, ref_out_layer)) + net_copy = get_net_copy_with_output(model=args.model, output=out_layer, core=core) + ref_net_copy = get_net_copy_with_output(model=args.reference_model, output=ref_out_layer, core=ref_core) + results = infer(net=net_copy, core=core, device=args.device, inputs=inputs, output=[out_layer]) + if out_layer not in results: + continue + out_blob, pc = results[out_layer] + ref_results = infer(net=ref_net_copy, core=ref_core, device=args.reference_device, inputs=ref_inputs, output=[ref_out_layer]) + ref_out_blob, ref_pc = ref_results[ref_out_layer] + if ref_out_layer not in ref_results: + continue + a_m = accuracy_metrics(out_blob=out_blob, ref_out_blob=ref_out_blob) + performance_metrics(pc=pc, ref_pc=ref_pc) + blob_counters(out_blob=out_blob, ref_out_blob=ref_out_blob) + global_accuracy = update_global_accuracy_matrics(global_accuracy=global_accuracy, current_accuracy=a_m) + print_all_over_the_net_metrics(global_times=global_times, ref_global_times=ref_global_times, + global_accuracy=global_accuracy) + + +def dump_mode(args): + core = get_plugin(args.device, args.l, args.config) + net = get_net(model=args.model, core=core) + out_layers = get_layers_list(net.layers, net.inputs, net.outputs, args.layers) + inputs = input_processing(args.model, net.inputs, args.input) + dump_dict = {} + for out_layer in out_layers: + log.info('Layer {} processing'.format(out_layer)) + net_copy = get_net_copy_with_output(model=args.model, output=out_layer, core=core) + results = infer(net=net_copy, core=core, device=args.device, inputs=inputs, output=[out_layer]) + if out_layer not in results: + continue + out_blob, pc = results[out_layer] + dump_dict[out_layer] = np.array({'blob': out_blob, 'pc': pc}) + dump_output_file(args.model + '_' + args.device + '_dump.npz', dump_dict) + + +def load_mode(args): + core = get_plugin(args.device, args.l, args.config) + log.info('IR for {} : {}'.format(args.device, args.model)) + log.info('Loading blob from {}'.format(args.load)) + net = get_net(model=args.model, core=core) + net_layers, net_inputs, net_outputs, precision = get_model_info(net) + out_layers = get_layers_list(net_layers, net_inputs, net_outputs, args.layers) + print_input_layers(net_inputs) + print_output_layers(out_layers) + layers_map = manage_user_outputs_with_mapping(mapping=args.mapping, reference_mapping=args.reference_mapping, + user_layers=out_layers) + inputs = input_processing(args.model, net_inputs, args.input, layers_map) + global_accuracy = [] + loaded = load_dump(args.load) + for out_layer in layers_map: + ref_out_layer = layers_map[out_layer] + if out_layer == ref_out_layer: + log.info('Layer {} statistics'.format(out_layer)) + else: + log.info('Statistics \'{}\' vs \'{}\''.format(out_layer, ref_out_layer)) + net_copy = get_net_copy_with_output(model=args.model, output=out_layer, core=core) + results = infer(net=net_copy, core=core, device=args.device, inputs=inputs, output=[out_layer]) + if out_layer not in results: + continue + out_blob, pc = results[out_layer] + if ref_out_layer not in loaded: + continue + ref_out_blob = loaded[ref_out_layer]['blob'] + a_m = accuracy_metrics(out_blob=out_blob, ref_out_blob=ref_out_blob) + if 'pc' in loaded[ref_out_layer]: + ref_pc = loaded[ref_out_layer]['pc'] + performance_metrics(pc=pc, ref_pc=ref_pc) + blob_counters(out_blob=out_blob, ref_out_blob=ref_out_blob) + global_accuracy = update_global_accuracy_matrics(global_accuracy=global_accuracy, current_accuracy=a_m) + print_all_over_the_net_metrics(global_accuracy=global_accuracy) + + +def main(args): + log.info('Inference Engine:\n API version ............ {}'.format(ie.__version__), extra={'no_lvl': True}) + set_verbosity(args.verbosity) + mode = find_out_cct_mode(args) + if mode == 1: + log.info('Cross check with one IR was enabled') + one_ir_mode(args) + elif mode == 2: + log.info('Cross check with two IRs was enabled') + two_ir_mode(args) + elif mode == 3: + log.info('Dump mode was enabled') + dump_mode(args) + elif mode == 4: + log.info('Load mode was enabled') + load_mode(args) + log.info("Execution successful") + + +if __name__ == '__main__': + set_logger(log.DEBUG) + main(validate_args(build_parser().parse_args())) diff --git a/inference-engine/tools/cross_check_tool/requirements.txt b/inference-engine/tools/cross_check_tool/requirements.txt new file mode 100644 index 00000000000..fc4586c8b30 --- /dev/null +++ b/inference-engine/tools/cross_check_tool/requirements.txt @@ -0,0 +1,2 @@ +numpy +opencv-python \ No newline at end of file diff --git a/inference-engine/tools/cross_check_tool/utils.py b/inference-engine/tools/cross_check_tool/utils.py new file mode 100644 index 00000000000..06de440e927 --- /dev/null +++ b/inference-engine/tools/cross_check_tool/utils.py @@ -0,0 +1,536 @@ +# Copyright (C) 2018-2019 Intel Corporation +# SPDX-License-Identifier: Apache-2.0 +# + +import argparse +import logging as log +import os +import sys +import traceback +import xml + +try: + import cv2 +except Exception as e: + log.error("Can not import OpenCV Python package.\nPlease install required python packages by running:\n" + "pip3 install -r requirements.txt\n\n Original error message: {}".format(e)) + sys.exit(1) + +try: + import numpy as np +except Exception as e: + log.error("Can not import numpy python package.\nPlease install required python packages by running:\n" + "pip3 install -r requirements.txt\n\n Original error message: {}".format(e)) + sys.exit(1) + +verbosity = False + + +def set_verbosity(flag: bool): + global verbosity + verbosity = flag + + +### +# USER INTERACTION +### + + +class LvlFormatter(log.Formatter): + usual = '[ %(levelname)s ] %(msg)s' + format_dict = { + 'no_lvl': '%(msg)s', + log.DEBUG: '[ %(asctime)s ] [ %(levelname)s ] [ %(module)s:%(lineno)d ] %(msg)s', + log.INFO: usual, log.WARNING: usual, log.ERROR: usual, log.CRITICAL: usual + } + + def __init__(self, lvl, fmt=None): + log.Formatter.__init__(self, fmt) + self.lvl = lvl + + def format(self, record: log.LogRecord): + if self.lvl == 'DEBUG': + self._style._fmt = self.format_dict[log.DEBUG] + else: + self._style._fmt = self.format_dict[record.levelno] + if 'no_lvl' in record.__dict__.keys() and record.__dict__['no_lvl']: + self._style._fmt = self.format_dict['no_lvl'] + return log.Formatter.format(self, record) + + +def set_logger(lvl: str): + logger = log.getLogger() + logger.setLevel(lvl) + handler = log.StreamHandler(sys.stdout) + handler.setFormatter(LvlFormatter(lvl)) + logger.addHandler(handler) + + +def error_handling(desc: str): + """ + Error handler that prints description formatted with keyword arguments in case of exception + :param desc: description for an error + :return: decorator + """ + + def decorator(func): + def try_except_func(*args, **kwargs): + try: + return func(*args, **kwargs) + except Exception as e: + exception_type = type(e).__name__ + log.error("The following error happened while {}:\n[ {} ] {}".format(desc.format(**kwargs), + exception_type, e)) + global verbosity + if verbosity: + traceback.print_tb(tb=e.__traceback__, file=sys.stdout) + sys.exit(1) + + return try_except_func + + return decorator + + +class ExistingFileAction(argparse.Action): + """ + Expand user home directory paths and convert relative-paths to absolute. + """ + + def __call__(self, parser, namespace, values, option_string=None): + if values is not None: + if not os.path.isfile(values): + log.error("File was not found: {}".format(values)) + sys.exit(1) + setattr(namespace, self.dest, values) + + +class ExistingDirAction(argparse.Action): + """ + Expand user home directory paths and convert relative-paths to absolute. + """ + + def __call__(self, parser, namespace, values, option_string=None): + if values is not None: + if not os.path.isdir(values): + log.error("Directory was not found: {}".format(values)) + sys.exit(1) + setattr(namespace, self.dest, values) + + +def build_parser(): + parser = argparse.ArgumentParser( + prog='Cross Check Tool', + description='Cross Check Tool is a console application that enables comparing accuracy and provides performance' + ' metrics', + usage='\n' + '-' * 62 + + '\nFor cross precision check provide two IRs \n' + '(mapping files may be needed) run:' + '\npython3 cross_check_tool.py \\' + '\n--input path/to/file/describing/input \\' + '\n--model path/to/model/*.xml \\' + '\n--device device_for_model \\' + '\n--reference_model path/to/reference_model/*.xml \\' + '\n--reference_device reference_device_for_model \n' + + '-' * 62 + + '\nFor cross device check with one precision provide one IR run:' + '\npython3 cross_check_tool.py \\' + '\n--input path/to/file/describing/input \\' + '\n--model path/to/model/*.xml \\' + '\n--device device_for_model \\' + '\n--reference_device reference_device_for_model \n' + + '-' * 62 + + '\nFor dumping blob and performance counters run:' + '\npython3 cross_check_tool.py \\' + '\n--input path/to/file/describing/input \\' + '\n--model path/to/model/*.xml \\' + '\n--device device_for_model \\' + '\n--dump\n' + + '-' * 62 + + '\nFor check inference against dumped results run:' + '\npython3 cross_check_tool.py \\' + '\n--input path/to/file/describing/input \\' + '\n--model path/to/model/*.xml \\' + '\n--device device_for_model \\' + '\n--load path/to/dump/file/* \n' + + '-' * 62 + + '\nFor all layers check provide:\n' + '--layers=\'all\' \n' + 'For specific number of layers check provide:\n' + '--layers=\'layer_name,another_layer_name,...,last_layer_name\'\n' + + '-' * 62 + + '\nIf --input is empty CCT generates input(s) from normal\n' + 'distribution and dumps this input to a file\n' + + '-' * 62 + ) + + model = parser.add_argument_group('Model specific arguments') + model.add_argument('--input', '-i', type=str, action=ExistingFileAction, + help='Path to an input image file or multi-input file to infer. Generates input(s) from normal ' + 'distribution if empty') + # model.add_argument('--batch', '-b', type=int, help='Overrides batch size. Default is inherited from model') + model.add_argument('--model', '-m', type=str, action=ExistingFileAction, + help='Path to an .xml file that represents the first IR of the trained model to infer.') + model.add_argument('--reference_model', '-ref_m', type=str, action=ExistingFileAction, + help='Path to an .xml file that represents the second IR to compare the metrics. ' + 'Uses --model if empty') + model.add_argument('--layers', '-layers', type=str, default=None, + help='Defines layers to check. Options: all, None - for output layers check, list of ' + 'comma-separated layer names to check. Default value is None.') + model.add_argument('--mapping', '-map', type=str, action=ExistingFileAction, + help='Model Optimizer provided mapping for --model/-m') + model.add_argument('--reference_mapping', '-ref_map', type=str, action=ExistingFileAction, + help='Model Optimizer provided mapping for --reference_model/-ref_model') + + plugin = parser.add_argument_group('Plugin specific arguments') + plugin.add_argument('--plugin_path', '-pp', type=str, action=ExistingDirAction, help='Path to a plugin folder.') + plugin.add_argument('--device', '-d', type=str, required=True, + help='The first target device to infer the model specified with the -m or --model option. ' + 'CPU, GPU, HDDL or MYRIAD are acceptable.') + plugin.add_argument('--config', '-conf', type=str, action=ExistingFileAction, + help='Path to config file for -d or -device device plugin') + plugin.add_argument('--reference_device', '-ref_d', type=str, + help='The second target device to infer the model and compare the metrics. ' + 'CPU, GPU, HDDL or MYRIAD are acceptable.') + plugin.add_argument('--reference_config', '-ref_conf', type=str, action=ExistingFileAction, + help='Path to config file for -ref_d or -reference_device device plugin') + plugin.add_argument('-l', type=str, action=ExistingFileAction, + help='Required for MKLDNN (CPU)-targeted custom layers. Comma separated paths to a shared' + ' libraries with the kernels implementation.') + + modes = parser.add_argument_group('CCT mode arguments') + # TODO eps? nobody uses it + modes.add_argument('--dump', help='Enables blobs statistics dumping', action='store_true', default=False) + modes.add_argument('--load', type=str, action=ExistingFileAction, help='Path to a file to load blobs from') + model.add_argument('--num_of_iterations', '-ni', type=int, default=50, + help='Number of iterations to collect all over the net performance') + parser.add_argument('-v', '--verbosity', action='store_true', default=False, + help='Increase output verbosity') + return parser + + +@error_handling('validating arguments passed to cross_check_tool.py') +def validate_args(args): + # input check + if args.input is None: + log.info('No input was provided by --input/-i. Generate input from noise') + # model check + if args.model is None and args.reference_model is None: + raise Exception( + "Parameters --model/-m and --reference_model/-ref_m are empty. At least one of them is required") + elif args.model is None and args.reference_model: + args.model = args.reference_model + if args.model == args.reference_model: + args.reference_model = None + if args.model != args.reference_model and args.reference_model is not None and args.mapping is None and \ + args.reference_mapping is None: + log.warning('Check over two different IRs was enabled. In case if layer names in this two IRs differ, ' + 'please provide mapping files with --mapping/-map and --reference_mapping/-ref_map') + # device check + if args.device is None and args.reference_device is None: + raise Exception("Parameters -device/-d and -reference_device/-ref_d are not set. Can not proceed." + "\nFor more details use -h option") + if args.reference_device is None and args.reference_model is None and not args.dump and args.load is None: + raise Exception("Please provide --reference_model/-ref_m to compare executions on different devices." + "\nAnother option is to provide --dump key to dump all execution info on one device." + "\nOr provide --load key to compare execution on device with dumped info" + "\nFor more details use -h option") + if args.device is None: + args.device = args.reference_device + args.reference_device = None + # dump and load check + if args.dump and args.load is not None: + raise Exception("Cross Check Tool does not support both loading and dumping modes to be enabled. " + "Choose one of them and proceed") + if args.model is not None and args.reference_model is not None and args.dump or \ + args.device is not None and args.reference_device is not None and args.dump: + raise Exception("Cross Check Tool does support dumping mode to be enabled only for one model on one device" + "\nFor more details use -h option") + if args.model is not None and args.reference_model is not None and args.load is not None or \ + args.device is not None and args.reference_device is not None and args.load is not None: + raise Exception("Cross Check Tool does support loading mode to be enabled for one model on one device against a" + " dumped file\nFor more details use -h option") + return args + + +def find_out_cct_mode(args): + """ + 1 -- one IR mode + 2 -- two IRs mode + 3 -- dump mode + 4 -- load mode + """ + # dump mode + if args.dump and args.model is not None and args.device is not None and \ + args.reference_model is None and args.reference_device is None: + return 3 + # load mode + if args.load is not None and args.model is not None and args.device is not None and args.reference_device is None: + return 4 + # two IR mode + if args.model is not None and args.reference_model is not None: + return 2 + # one IR mode + if args.model is not None and args.reference_model is None: + return 1 + raise Exception('Unknown Cross Check Tool CLI configuration.\nFor more details use -h option') + + +def print_input_layers(inputs: list): + word = 'inputs' if len(inputs) > 1 else 'input' + log.info('{} {} detected: {}'.format(len(inputs), word, ', '.join(inputs))) + + +def print_output_layers(outputs: list): + layers = 'layers' if len(outputs) > 1 else 'layer' + log.info('Statistics will be dumped for {} {}: {}'.format(len(outputs), layers, ', '.join(outputs))) + + +### +# PLUGIN +### + + +@error_handling('parsing config file for plugin: \'{config_file}\'') +def get_config_dictionary(config_file): + config = {'PERF_COUNT': 'YES'} + if not config_file: + return config + with open(config_file) as f: + config_line = f.readline() + key = config_line.split(config_file)[0] + value = config_line[len(key):].strip() + config[key] = value + return config + + +### +# INPUTS +### + + +def read_multi_input_file(input_file: str, net_inputs: dict): + npz = np.load(input_file, allow_pickle=True) + files = npz.files + dump = {} + for net_input in net_inputs: + if net_input not in files: + raise Exception('Can not find input data for input {} in multi-input file {}.\n' + 'Input data was provided for layers: {}\n' + 'Network inputs: {}'.format(net_input, input_file, ', '.join(files), + ', '.join(net_inputs.keys()))) + if 'blob' in npz[net_input].item(0): + just_blob = npz[net_input].item(0)['blob'] + network_shape = net_inputs[net_input].shape + log.info('Layer {} shape = {}, input blob from multi-input file shape = {}' + ''.format(net_input, network_shape, just_blob.shape)) + try: + reshaped_blob = np.reshape(just_blob, network_shape) + except: + raise Exception('Can not reshape input blob from multi-input file for layer {} to shape {}' + ''.format(net_input, network_shape)) + dump[net_input] = reshaped_blob + else: + raise Exception( + 'Can not find \'blob\' parameter for input {} in input file {}'.format(net_input, input_file)) + return dump + + +@error_handling('reading --input/-i by OpenCV python module. OpenCV version: {}. ' + 'It may happen due to wrong input image format'.format(cv2.__version__)) +def read_image_file(input_file: str, net_inputs: dict): + inputs = dict() + if len(net_inputs) == 1: + image = cv2.imread(input_file) + if image is None: + raise Exception('Can not read input image ' + input_file) + only_layer_name = list(net_inputs.keys())[0] + shape = net_inputs[only_layer_name].shape + if len(shape) != 4: + raise Exception('Can not interpret input shape as image') + n, c, h, w = shape + image = cv2.resize(image, (w, h)) + image = image.transpose((2, 0, 1)) # Change data layout from HWC to CHW + image = image.reshape((n, c, h, w)) + inputs[only_layer_name] = image + else: + raise Exception('Multi-input topology detected. Please provide multi-input file to --input key') + return inputs + + +def input_processing(model_path: str, net_inputs: dict, input_file: str, layers_map: dict = None): + inputs = dict() + if input_file is None: + for net_input in net_inputs: + inputs[net_input] = np.clip(np.random.normal(0.5, 0.1, size=net_inputs[net_input].shape), 0, 1) + dump_output_file(model_path + '_random_input_dump.npz', {inp: {'blob': inputs[inp]} for inp in inputs}) + return inputs + try: + inputs = read_multi_input_file(input_file=input_file, net_inputs=net_inputs) + except: + inputs = read_image_file(input_file=input_file, net_inputs=net_inputs) + return inputs + + +def accuracy_metrics(out_blob, ref_out_blob): + if out_blob.size != ref_out_blob.size: + raise Exception('Different number of elements in blobs {} and {}. Can not compare' + ''.format(out_blob.size, ref_out_blob.size)) + abs_diff = np.absolute(out_blob - ref_out_blob) + rel_diff = np.divide(abs_diff, np.min(abs_diff) if np.min(abs_diff) != 0 else 1e-20) + + metrics = [ + ('Max absolute difference', np.max(abs_diff)), + ('Min absolute difference', np.min(abs_diff)), + ('Max relative difference', np.max(rel_diff)), + ('Min relative difference', np.min(rel_diff)), + ('Min reference value', np.min(ref_out_blob)), + ('Min absolute reference value', np.min(np.abs(ref_out_blob))), + ('Max reference value', np.max(ref_out_blob)), + ('Max absolute reference value', np.max(np.abs(ref_out_blob))), + ('Min actual value', np.min(out_blob)), + ('Min absolute actual value', np.min(np.abs(out_blob))), + ('Max actual value', np.max(out_blob)), + ('Max absolute actual value', np.max(np.abs(out_blob))) + ] + + for key, value in metrics: + if len(str(value)) > 5: + log.info('{:>35} : {:.5E}'.format(key, value), extra={'no_lvl': True}) + else: + log.info('{:>35} : {}'.format(key, value), extra={'no_lvl': True}) + return {metric: value for metric, value in metrics} + + +def performance_metrics(pc, ref_pc): + compare = [ + ('Device', '-d ' + pc['device'], '-ref_d ' + ref_pc['device']), + ('Status', pc['status'], ref_pc['status']), + ('Layer type', pc['layer_type'], ref_pc['layer_type']), + ('Real time, microsec', pc['real_time'], ref_pc['real_time']) + ] + + for metric, actual, reference in compare: + log.info('{:>35}: {:>16} {:>16}'.format(metric, actual, reference), extra={'no_lvl': True}) + + +def blob_counters(out_blob, ref_out_blob): + counters = [ + ('Number of NAN', np.sum(np.isnan(out_blob)), np.sum(np.isnan(ref_out_blob))), + ('Number of INF', np.sum(np.isinf(out_blob)), np.sum(np.isinf(ref_out_blob))), + ('Number of ZERO', out_blob.size - np.count_nonzero(out_blob), + ref_out_blob.size - np.count_nonzero(ref_out_blob)) + ] + for metric, actual, reference in counters: + log.info('{:>35}: {:>16} {:>16}'.format(metric, actual, reference), extra={'no_lvl': True}) + + +def update_global_accuracy_matrics(global_accuracy: list, current_accuracy: dict): + metrics = [ + ('Max absolute difference', lambda x, y: max(x, y)), + ('Min absolute difference', lambda x, y: min(x, y)), + ('Max relative difference', lambda x, y: max(x, y)), + ('Min relative difference', lambda x, y: min(x, y))] + for metric, formula in metrics: + global_metric = [item for item in global_accuracy if item[0] == metric] + if len(global_metric) == 1: + g_metric, g_value = global_metric[0] + global_accuracy.remove(global_metric[0]) + global_accuracy.append((metric, formula(g_value, current_accuracy[metric]))) + else: + global_accuracy.append((metric, current_accuracy[metric])) + return global_accuracy + + +def print_all_over_the_net_metrics(global_accuracy: (str, float), global_times: list = None, + ref_global_times: list = None): + if global_times is not None and ref_global_times is not None and len(global_times) and len(ref_global_times): + log.info('-' * 70, extra={'no_lvl': True}) + log.info('{:>35}: {:>16,.5E} {:>16,.5E}'.format( + 'Overall performance, microseconds', global_times[len(global_times) // 2].microseconds, + ref_global_times[len(ref_global_times) // 2].microseconds), extra={'no_lvl': True}) + log.info('-' * 70, extra={'no_lvl': True}) + for metric, value in global_accuracy: + log.info('{} {} = {}'.format('Overall', metric.lower(), value)) + + +### +# MAPPING +### + + +def read_mapping(file_name: str): + # TODO check twice + mapping_dict = {} + xml_tree = xml.etree.ElementTree.parse(file_name) + xml_root = xml_tree.getroot() + for child in xml_root: + fw_info = child.find('.//framework') + ir_info = child.find('.//IR') + if fw_info is None: + continue + if ir_info is None: + continue + framework_name = fw_info.attrib['name'] + ':' + fw_info.attrib['out_port_id'] + ir_name = ir_info.attrib['name'] if ir_info is not None else None + ir_layer_id = int(ir_info.attrib['id']) if ir_info is not None else None + mapping_dict[framework_name] = (ir_name, ir_layer_id) + return mapping_dict + + +def map_layers(mapping_file: str = None, ref_mapping_file: str = None): + if mapping_file is not None and ref_mapping_file is not None: + mapping = read_mapping(mapping_file) + ref_mapping = read_mapping(ref_mapping_file) + mapping = {layer: ref_layer for layer in mapping for ref_layer in ref_mapping if layer == ref_layer} + return mapping + + +def manage_user_outputs_with_mapping(mapping, reference_mapping, user_layers): + if mapping is not None and reference_mapping is not None: + layers_map = map_layers(mapping, reference_mapping) + else: + layers_map = {layer: layer for layer in user_layers} + for layer in user_layers: + if layer not in layers_map: + if mapping is not None and reference_mapping is not None: + log.warning( + 'Can not map layer {} from --model/-m to any layer from --reference_model/-ref_m'.format(layer)) + else: + log.warning('Can not find layer {} in --reference_model/-ref_m model'.format(layer)) + for layer in layers_map: + if layer not in user_layers: + del layers_map[layer] + return layers_map + + +def get_layers_list(all_layers: dict, inputs: dict, outputs: list, layers: str): + if layers is not None and layers != 'None': + if layers == 'all': + return {name: layer for name, layer in all_layers.items() if layer.type not in ['Const']} + else: + user_layers = [layer.strip() for layer in layers.split(',')] + layers_to_check = [] + for user_layer in user_layers: + if user_layer not in all_layers: + raise Exception("Layer {} doesn't exist in the model".format(user_layer)) + if user_layer in inputs: + raise Exception("Layer {} is input layer. Can not proceed".format(user_layer)) + layers_to_check.append(user_layer) + return layers_to_check + else: + return outputs + + +### +# FILES +### + +def dump_output_file(output_file, dump_dict): + np.savez_compressed(output_file, **dump_dict) + log.info('Dump file path: {}'.format(output_file)) + + +def load_dump(file_to_load: str): + npz = np.load(file_to_load, allow_pickle=True) + dump = {file: npz[file].item(0) for file in npz} + return dump diff --git a/inference-engine/tools/package_BOM.txt b/inference-engine/tools/package_BOM.txt new file mode 100644 index 00000000000..a16cdeb53f8 --- /dev/null +++ b/inference-engine/tools/package_BOM.txt @@ -0,0 +1,8 @@ +benchmark_tool/benchmark_app.py +benchmark_tool/requirements.txt +benchmark_tool/README.md +cross_check_tool/__init__.py +cross_check_tool/utils.py +cross_check_tool/requirements.txt +cross_check_tool/README.md +cross_check_tool/cross_check_tool.py \ No newline at end of file diff --git a/model-optimizer/automation/package_BOM.txt b/model-optimizer/automation/package_BOM.txt index d0797b34ba0..9b00a3f29e0 100644 --- a/model-optimizer/automation/package_BOM.txt +++ b/model-optimizer/automation/package_BOM.txt @@ -13,6 +13,7 @@ extensions/back/AvgPool.py extensions/back/blob_normalizer.py extensions/back/compress_quantized_weights.py extensions/back/ConvolutionNormalizer.py +extensions/back/CorrectName.py extensions/back/CropToStridedSlice.py extensions/back/CutMemory.py extensions/back/disable_unsupported_ND_operations.py @@ -133,6 +134,7 @@ extensions/front/FillToBroadcast.py extensions/front/flatten_to_reshape.py extensions/front/freeze_placeholder_value.py extensions/front/GeLUMerger_Erf.py +extensions/front/GeLUMerger_Tanh.py extensions/front/global_pooling_to_reduce.py extensions/front/image_scaler.py extensions/front/input_cut.py @@ -299,6 +301,7 @@ extensions/front/onnx/scatter_ext.py extensions/front/onnx/shape_ext.py extensions/front/onnx/slice_ext.py extensions/front/onnx/softmax_ext.py +extensions/front/onnx/softmaxONNX_to_softmax.py extensions/front/onnx/split_ext.py extensions/front/onnx/squeeze_ext.py extensions/front/onnx/top_k_ext.py @@ -549,6 +552,7 @@ extensions/middle/RNNSequenceNormalizeToIE.py extensions/middle/ScaleInput.py extensions/middle/SharedWeightsDuplication.py extensions/middle/SliceConverter.py +extensions/middle/SliceLikeToStridedSlice.py extensions/middle/space_to_depth.py extensions/middle/sparse_reshape.py extensions/middle/ssd_anchors_to_const.py @@ -566,7 +570,6 @@ extensions/middle/UnsqueezeTileReshapeBlockToInterpolate.py extensions/middle/UpsampleToResample.py extensions/middle/UselessMerge.py extensions/middle/UselessSplitEraser.py -extensions/middle/UselessStridedSlice.py extensions/middle/wights_permute_normalizer.py extensions/ops/__init__.py extensions/ops/accum.py @@ -594,7 +597,6 @@ extensions/ops/elementwise.py extensions/ops/embedding_bag.py extensions/ops/Enter.py extensions/ops/Exit.py -extensions/ops/exp.py extensions/ops/fakequantize.py extensions/ops/gather.py extensions/ops/GatherNd.py @@ -608,7 +610,6 @@ extensions/ops/identity.py extensions/ops/instance_normalization.py extensions/ops/interp.py extensions/ops/interpolate.py -extensions/ops/Log.py extensions/ops/LSTM.py extensions/ops/lstm_cell.py extensions/ops/lstm_sequence.py @@ -656,6 +657,7 @@ extensions/ops/select.py extensions/ops/shufflechannel.py extensions/ops/simplernms.py extensions/ops/size.py +extensions/ops/slice_like.py extensions/ops/space_to_depth.py extensions/ops/sparse_fill_empty_rows.py extensions/ops/sparse_reshape.py @@ -695,6 +697,9 @@ install_prerequisites/install_prerequisites_onnx.bat install_prerequisites/install_prerequisites_onnx.sh install_prerequisites/install_prerequisites_tf.bat install_prerequisites/install_prerequisites_tf.sh +install_prerequisites/protobuf-3.6.1-py3.5-win-amd64.egg +install_prerequisites/protobuf-3.6.1-py3.6-win-amd64.egg +install_prerequisites/protobuf-3.6.1-py3.7-win-amd64.egg mo.py mo/__init__.py mo/back/__init__.py @@ -898,12 +903,14 @@ mo/pipeline/__init__.py mo/pipeline/common.py mo/pipeline/unified.py mo/utils/__init__.py +mo/utils/broadcasting.py mo/utils/class_registration.py mo/utils/cli_parser.py mo/utils/custom_replacement_config.py mo/utils/dsu.py mo/utils/error.py mo/utils/find_inputs.py +mo/utils/get_ov_update_message.py mo/utils/graph.py mo/utils/guess_framework.py mo/utils/import_extensions.py @@ -922,6 +929,7 @@ mo/utils/ir_reader/extenders/fakequantize_extender.py mo/utils/ir_reader/extenders/GRUCell_extender.py mo/utils/ir_reader/extenders/interpolate_extender.py mo/utils/ir_reader/extenders/LSTMCell_extender.py +mo/utils/ir_reader/extenders/non_max_suppression_extender.py mo/utils/ir_reader/extenders/non_zero_extender.py mo/utils/ir_reader/extenders/pad_extender.py mo/utils/ir_reader/extenders/parameter_extender.py @@ -930,6 +938,7 @@ mo/utils/ir_reader/extenders/priorbox_clustered_extender.py mo/utils/ir_reader/extenders/priorbox_extender.py mo/utils/ir_reader/extenders/reorg_yolo_extender.py mo/utils/ir_reader/extenders/RNNCell_extender.py +mo/utils/ir_reader/extenders/shape_of_extender.py mo/utils/ir_reader/extenders/strided_slice_extender.py mo/utils/ir_reader/extenders/tensoriterator_extender.py mo/utils/ir_reader/extenders/topk_extender.py diff --git a/model-optimizer/extensions/back/CorrectName.py b/model-optimizer/extensions/back/CorrectName.py new file mode 100644 index 00000000000..1d1e9c0dd52 --- /dev/null +++ b/model-optimizer/extensions/back/CorrectName.py @@ -0,0 +1,47 @@ +""" + Copyright (C) 2020 Intel Corporation + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +""" + +from mo.graph.graph import Graph +from mo.back.replacement import BackReplacementPattern + + +class RestoreOriginalFrameworkName(BackReplacementPattern): + """ + This transformation corrects names of layers to their framework names. + To perform this correction, framework layer name should be in the attribute 'framework_node_name'. + In some cases, renaming is necessary only if some condition is fulfilled. Such condition should be a some + function in the attribute 'rename_condition'. + + For example, in the transformation SoftmaxONNXFrontReplacer such condition is + lambda n: len(n.graph.get_op_nodes(name=node_name)) == 0 + """ + + enabled = True + + def find_and_replace_pattern(self, graph: Graph): + for node in graph.get_op_nodes(): + if not node.has_valid('framework_node_name'): + continue + + if node.has_valid('rename_condition'): + need_renaming = node['rename_condition'](node) + del node['rename_condition'] + if need_renaming: + node.name = node['framework_node_name'] + else: + node.name = node['framework_node_name'] + + del node['framework_node_name'] diff --git a/model-optimizer/extensions/back/NormalizeToNormalizeL2.py b/model-optimizer/extensions/back/NormalizeToNormalizeL2.py index 3c04307f0e0..97acff24931 100644 --- a/model-optimizer/extensions/back/NormalizeToNormalizeL2.py +++ b/model-optimizer/extensions/back/NormalizeToNormalizeL2.py @@ -18,9 +18,11 @@ import numpy as np from extensions.back.ElementwiseOpsToEltwiseOps import SimpleEltwiseToEltwiseOp from extensions.back.insert_compatibility_l2normalization import CompatibilityL2NormalizationPattern from extensions.ops.elementwise import Mul +from extensions.ops.normalize_l2 import NormalizeL2Op from mo.back.replacement import BackReplacementPattern +from mo.front.common.partial_infer.utils import int64_array +from mo.front.tf.graph_utils import create_op_with_const_inputs from mo.graph.graph import Graph, rename_node -from mo.ops.const import Const class NormalizeToNormalizeL2(BackReplacementPattern): @@ -72,19 +74,14 @@ class NormalizeToNormalizeL2(BackReplacementPattern): mul = Mul(graph, {'name': output_name}).create_node() rename_node(mul, output_name) + if not node.across_spatial: + axes = int64_array([1]) + else: + axes = int64_array(np.arange(start=1, stop=node.in_port(0).data.get_shape().size)) + + normalizel2 = create_op_with_const_inputs(graph, NormalizeL2Op, {1: axes}, {'eps_mode': 'add', 'eps': node.eps}) + node.out_port(0).get_connection().set_source(mul.out_port(0)) - node.out_port(0).connect(mul.in_port(0)) node.in_port(1).get_connection().get_source().connect(mul.in_port(1)) - node.in_port(1).disconnect() - - node['type'] = 'NormalizeL2' - node['eps_mode'] = 'add' - node['force_precision_in_ports'] = {1: 'int64'} - - axes_val = np.array([1]) if not node.across_spatial else \ - np.arange(start=1, stop=node.in_port(0).data.get_shape().size) - axes = Const(graph, {'value': axes_val}).create_node() - node.in_port(1).connect(axes.out_port(0)) - - del node['across_spatial'] - del node['channel_shared'] + normalizel2.out_port(0).connect(mul.in_port(0)) + node.in_port(0).get_connection().set_destination(normalizel2.in_port(0)) diff --git a/model-optimizer/extensions/front/ChangeCastOutputType.py b/model-optimizer/extensions/front/ChangeCastOutputType.py index d633a595970..7dcbeaa0916 100644 --- a/model-optimizer/extensions/front/ChangeCastOutputType.py +++ b/model-optimizer/extensions/front/ChangeCastOutputType.py @@ -26,7 +26,6 @@ from mo.middle.passes.convert_data_type import data_type_str_to_np class ChangeCastOutputType(FrontReplacementSubgraph): """ - Change the Cast to int64 to int32 since not all plugins support int64 data type. Change the Cast to fp64 to fp32 since not all plugins support fp64 data type. Change the Cast to fp32 to fp16 when generating IR for fp16. """ @@ -42,10 +41,6 @@ class ChangeCastOutputType(FrontReplacementSubgraph): def replace_sub_graph(self, graph: Graph, match: [dict, SubgraphMatch]): node = match['cast'] - if node.dst_type == np.int64: - log.warning('Change data type from {} to {} for node {}'.format(node.dst_type, np.int32, node.name)) - node.dst_type = np.int32 - if node.dst_type == np.float64: log.warning('Change data type from {} to {} for node {}'.format(node.dst_type, np.float32, node.name)) node.dst_type = np.float32 diff --git a/model-optimizer/extensions/front/GeLUMerger_Erf.py b/model-optimizer/extensions/front/GeLUMerger_Erf.py index 765c431e4d4..a212402439a 100644 --- a/model-optimizer/extensions/front/GeLUMerger_Erf.py +++ b/model-optimizer/extensions/front/GeLUMerger_Erf.py @@ -15,6 +15,7 @@ """ import logging as log + from math import sqrt, fabs from extensions.ops.gelu import GeLUOP @@ -35,50 +36,43 @@ class GeLUMergerErf(FrontReplacementSubgraph): ('div', dict(op='Div')), ('erf', dict(op='Erf')), ('add', dict(op='Add')), + ('mul_param', dict(op='Const')), + ('div_param', dict(op='Const')), + ('add_param', dict(op='Const')), + ], edges=[ ('mul', 'mul0'), ('div', 'erf'), ('erf', 'add'), - ('add', 'mul0') + ('add', 'mul0'), + ('mul_param', 'mul'), + ('div_param', 'div'), + ('add_param', 'add'), ]) def replace_sub_graph(self, graph: Graph, match: dict): # Gaussian Error Linear Unit # f(x) = 0.5 * x * (1 + erf(x / sqrt(2)) - add = match['add'] - mul = match['mul'] div = match['div'] inp_port = div.in_port(0).get_source() inp = inp_port.node log.debug('Found potential Erf-based GeLU pattern after {} with name {}'.format(inp.op, inp.name)) # take the values of the mul, add and div - div_param = None - mul_param = None - add_param = None - if div.in_port(0).get_source().node.soft_get('type') == 'Const': - div_param = div.in_port(0).get_source().node.value - elif div.in_port(1).get_source().node.soft_get('type') == 'Const': - div_param = div.in_port(1).get_source().node.value + div_param = match['div_param'] + add_param = match['add_param'] + mul_param = match['mul_param'] - if mul.in_port(0).get_source().node.soft_get('type') == 'Const': - mul_param = mul.in_port(0).get_source().node.value - elif mul.in_port(1).get_source().node.soft_get('type') == 'Const': - mul_param = mul.in_port(1).get_source().node.value + if add_param.value.size == 1 and mul_param.value.size == 1 and div_param.value.size == 1: + mul_param = match['mul_param'].value.item() + add_param = match['add_param'].value.item() + div_param = match['div_param'].value.item() - if add.in_port(0).get_source().node.soft_get('type') == 'Const': - add_param = add.in_port(0).get_source().node.value - elif add.in_port(1).get_source().node.soft_get('type') == 'Const': - add_param = add.in_port(1).get_source().node.value - - if mul_param is None or div_param is None or add_param is None: - return - - sqrt2 = sqrt(2.0) - # check that the values match the approximation - if fabs(div_param - sqrt2) < 1e-06 and mul_param == 0.5 and add_param == 1.0: - log.debug('Confirmed Erf-based GELU pattern after {} with name {}'.format(inp.op, inp.name)) - gelu = GeLUOP(graph, dict(name=inp.name + '/GELU_')).create_node() - inp_port.connect(gelu.in_port(0)) - match['mul0'].out_port(0).get_connection().set_source(gelu.out_port(0)) + sqrt2 = sqrt(2.0) + # check that the values match the approximation + if fabs(div_param - sqrt2) < 1e-06 and mul_param == 0.5 and add_param == 1.0: + log.debug('Confirmed Erf-based GELU pattern after {} with name {}'.format(inp.op, inp.name)) + gelu = GeLUOP(graph, dict(name=inp.name + '/GELU_')).create_node() + inp_port.connect(gelu.in_port(0)) + match['mul0'].out_port(0).get_connection().set_source(gelu.out_port(0)) diff --git a/model-optimizer/extensions/front/GeLUMerger_Tanh.py b/model-optimizer/extensions/front/GeLUMerger_Tanh.py new file mode 100644 index 00000000000..22ced0a619b --- /dev/null +++ b/model-optimizer/extensions/front/GeLUMerger_Tanh.py @@ -0,0 +1,80 @@ +""" + Copyright (C) 2017-2020 Intel Corporation + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +""" + +import logging as log + +from math import sqrt, fabs, pi + +from extensions.ops.gelu import GeLUOP +from mo.front.common.replacement import FrontReplacementSubgraph +from mo.graph.graph import Graph + + +class GeLUMergerTanh(FrontReplacementSubgraph): + enabled = True + graph_condition = [lambda graph: graph.graph['cmd_params'].generate_experimental_IR_V10] + + def pattern(self): + log.info('Enabled GeLU Merger for approximation with TanH') + return dict( + nodes=[ + ('pow', dict(op='Pow')), + ('mul', dict(op='Mul')), + ('mul0', dict(op='Mul')), + ('mul1', dict(op='Mul')), + ('mul2', dict(op='Mul')), + ('tanh', dict(op='Tanh')), + ('add', dict(op='Add')), + ('add0', dict(op='Add')), + ('mul_param', dict(op='Const')), + ('mul0_param', dict(op='Const')), + ('mul1_param', dict(op='Const')), + ], + edges=[ + ('pow', 'mul'), + ('mul', 'add'), + ('add', 'mul0'), + ('mul0', 'tanh'), + ('tanh', 'add0'), + ('add0', 'mul1'), + ('mul1', 'mul2'), + ('mul_param', 'mul'), + ('mul0_param', 'mul0'), + ('mul1_param', 'mul1'), + ]) + + def replace_sub_graph(self, graph: Graph, match: dict): + # Gaussian Error Linear Unit, TanH based approximation: + # 0.5*x*(1 + tanh([sqrt(2/pi)]*[x + 0.044715x3]) + inp_port = match['pow'].in_port(0).get_source() + inp = inp_port.node + log.debug('Found potential TanH-based GeLU pattern after {} with name {}'.format(inp.op, inp.name)) + + # take the values of the mul ops + mul_param = match['mul_param'] + mul0_param = match['mul0_param'] + mul1_param = match['mul1_param'] + if mul0_param.value.size == 1 and mul_param.value.size == 1 and mul1_param.value.size == 1: + mul_param = match['mul_param'].value.item() + mul0_param = match['mul0_param'].value.item() + mul1_param = match['mul1_param'].value.item() + sqrt2pi = sqrt(2.0/pi) + # check that the values match the approximation + if fabs(mul0_param - sqrt2pi) < 1e-06 and fabs(mul_param - 0.044715) < 1e-06 and mul1_param == 0.5: + log.debug('Confirmed TanH-based GELU pattern after {} with name {}'.format(inp.op, inp.name)) + gelu = GeLUOP(graph, dict(name=inp.name + '/GELU_')).create_node() + inp_port.connect(gelu.in_port(0)) + match['mul2'].out_port(0).get_connection().set_source(gelu.out_port(0)) diff --git a/model-optimizer/extensions/front/GeLUMerger_test.py b/model-optimizer/extensions/front/GeLUMerger_test.py new file mode 100644 index 00000000000..6c6b698918b --- /dev/null +++ b/model-optimizer/extensions/front/GeLUMerger_test.py @@ -0,0 +1,125 @@ +""" + Copyright (C) 2018-2020 Intel Corporation + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +""" + +import unittest + +import numpy as np +from math import sqrt + +from extensions.front.GeLUMerger_Erf import GeLUMergerErf +from extensions.front.GeLUMerger_Tanh import GeLUMergerTanh +from mo.utils.ir_engine.compare_graphs import compare_graphs +from mo.utils.unittest.graph import build_graph + +nodes_attributes_erf = { + 'inp': {'kind': 'op', 'op': 'AnyOp'}, + 'mul': {'kind': 'op', 'op': 'Mul'}, + 'mul0': {'kind': 'op', 'op': 'Mul'}, + 'div': {'kind': 'op', 'op': 'Div'}, + 'erf': {'kind': 'op', 'op': 'Erf'}, + 'add': {'kind': 'op', 'op': 'Add'}, + 'mul_param': {'kind': 'op', 'type': 'Const', 'op': 'Const'}, + 'div_param': {'kind': 'op', 'type': 'Const', 'op': 'Const'}, + 'add_param': {'kind': 'op', 'type': 'Const', 'op': 'Const'}, + 'out': {'kind': 'op', 'op': 'AnyOp'}, +} + +nodes_attributes_tanh = { + 'inp': {'kind': 'op', 'op': 'AnyOp'}, + 'pow': {'kind': 'op', 'op': 'Pow'}, + 'mul': {'kind': 'op', 'op': 'Mul'}, + 'mul0': {'kind': 'op', 'op': 'Mul'}, + 'mul1': {'kind': 'op', 'op': 'Mul'}, + 'mul2': {'kind': 'op', 'op': 'Mul'}, + 'tanh': {'kind': 'op', 'op': 'Tanh'}, + 'add': {'kind': 'op', 'op': 'Add'}, + 'add0': {'kind': 'op', 'op': 'Add'}, + 'mul_param': {'kind': 'op', 'type': 'Const', 'op': 'Const'}, + 'mul0_param': {'kind': 'op', 'type': 'Const', 'op': 'Const'}, + 'mul1_param': {'kind': 'op', 'type': 'Const', 'op': 'Const'}, + 'out': {'kind': 'op', 'op': 'AnyOp'}, +} + +nodes_attributes_ref = { + 'inp': {'kind': 'op', 'op': 'AnyOp'}, + 'gelu': {'kind': 'op', 'op': 'Gelu'}, + 'out': {'kind': 'op', 'op': 'AnyOp'}, +} + +class TestGeLUMergerReplacement(unittest.TestCase): + def test_GeLUMergerErf_test_1(self): + graph = build_graph(nodes_attributes_erf, + [('inp', 'mul0', {'out': 0}), + ('inp', 'div', {'out': 0}), + ('mul', 'mul0'), + ('div', 'erf'), + ('erf', 'add'), + ('add', 'mul0'), + ('mul_param', 'mul'), + ('div_param', 'div'), + ('add_param', 'add'), + ('mul0', 'out'), + ], + {'mul_param': {'shape': np.array([1]), 'value': np.array(0.5)}, + 'add_param': {'shape': np.array([1]), 'value': np.array(1.0)}, + 'div_param': {'shape': np.array([1]), 'value': np.array(sqrt(2.0))} + }, + nodes_with_edges_only=True) + graph_ref = build_graph(nodes_attributes_ref, + [('inp', 'gelu'), + ('gelu', 'out')], + {}, nodes_with_edges_only=True) + graph.stage = 'front' + + replacer = GeLUMergerErf() + replacer.find_and_replace_pattern(graph) + + (flag, resp) = compare_graphs(graph, graph_ref, 'out', check_op_attrs=True) + self.assertTrue(flag, resp) + + def test_GeLUMergerTanh_test_2(self): + graph = build_graph(nodes_attributes_tanh, + [('inp', 'mul2', {'out': 0}), + ('inp', 'add', {'out': 0}), + ('inp', 'pow', {'out': 0}), + ('pow', 'mul'), + ('mul', 'add'), + ('add', 'mul0'), + ('mul0', 'tanh'), + ('tanh', 'add0'), + ('add0', 'mul1'), + ('mul1', 'mul2'), + ('mul_param', 'mul'), + ('mul0_param', 'mul0'), + ('mul1_param', 'mul1'), + ('mul2', 'out'), + ], + {'mul0_param': {'shape': np.array([1]), 'value': np.array(sqrt(2.0/3.1415926))}, + 'mul1_param': {'shape': np.array([1]), 'value': np.array(0.5)}, + 'mul_param': {'shape': np.array([1]), 'value': np.array(0.044715)} + }, + nodes_with_edges_only=True) + graph_ref = build_graph(nodes_attributes_ref, + [('inp', 'gelu'), + ('gelu', 'out')], + {}, nodes_with_edges_only=True) + graph.stage = 'front' + + replacer = GeLUMergerTanh() + replacer.find_and_replace_pattern(graph) + + (flag, resp) = compare_graphs(graph, graph_ref, 'out', check_op_attrs=True) + self.assertTrue(flag, resp) \ No newline at end of file diff --git a/model-optimizer/extensions/front/Log1p.py b/model-optimizer/extensions/front/Log1p.py index 5bfce9d9e38..c37b7f329fa 100644 --- a/model-optimizer/extensions/front/Log1p.py +++ b/model-optimizer/extensions/front/Log1p.py @@ -15,10 +15,10 @@ """ import numpy as np -from extensions.ops.Log import LogOp +from extensions.ops.activation_ops import Log from extensions.ops.elementwise import Add from mo.front.common.replacement import FrontReplacementOp -from mo.graph.graph import Graph, Node +from mo.graph.graph import Graph, Node, rename_nodes from mo.ops.const import Const @@ -31,18 +31,19 @@ class Log1p(FrontReplacementOp): enabled = True def replace_op(self, graph: Graph, node: Node): + node_name = node.soft_get('name', node.id) const_dtype = np.float32 if node.has_valid('data_type'): const_dtype = node.data_type const = Const(graph, {'value': np.array([1], dtype=const_dtype)}).create_node() add = Add(graph, {'name': node.name + '/Add_'}).create_node() - log = LogOp(graph, {'name': node.name + '/Log_'}).create_node() + log = Log(graph, {'name': node.name + '/Log_'}).create_node() # Connect nodes: input -> Add -> Log const.out_port(0).connect(add.in_port(0)) node.in_port(0).get_connection().set_destination(add.in_port(1)) add.out_port(0).connect(log.in_port(0)) + rename_nodes([(node, node_name + '/delete'), (log, node_name)]) # The "explicit" version of the return value is: [(out_node.id, 0)]) return [log.id] - diff --git a/model-optimizer/extensions/front/LogSoftmax.py b/model-optimizer/extensions/front/LogSoftmax.py index e199ef43d44..4a7e2de28fa 100644 --- a/model-optimizer/extensions/front/LogSoftmax.py +++ b/model-optimizer/extensions/front/LogSoftmax.py @@ -13,15 +13,13 @@ See the License for the specific language governing permissions and limitations under the License. """ -from extensions.ops.Log import LogOp from extensions.ops.ReduceOps import ReduceMax, ReduceSum +from extensions.ops.activation_ops import Exp, Log from extensions.ops.elementwise import Sub -from extensions.ops.exp import ExpOp from mo.front.common.partial_infer.utils import int64_array from mo.front.common.replacement import FrontReplacementOp from mo.front.tf.graph_utils import create_op_with_const_inputs from mo.graph.graph import Graph, Node, rename_nodes -from mo.ops.const import Const class LogSoftmaxFrontReplacer(FrontReplacementOp): @@ -69,12 +67,12 @@ class LogSoftmaxFrontReplacer(FrontReplacementOp): reduce_max_node.out_port(0).connect(first_sub_node.in_port(1)) # Creating of Exp -> ReduceSum -> Log block - exp_node = ExpOp(graph, {'name': node_name + '/Exp_'}).create_node() + exp_node = Exp(graph, {'name': node_name + '/Exp_'}).create_node() reduce_sum_node = create_op_with_const_inputs(graph, ReduceSum, {1: int64_array([node.axis])}, op_attrs={'name': node_name + '/ReduceSum_', 'keep_dims': True}) - log_node = LogOp(graph, {'name': node_name + '/Log_'}).create_node() + log_node = Log(graph, {'name': node_name + '/Log_'}).create_node() first_sub_node.out_port(0).connect(exp_node.in_port(0)) exp_node.out_port(0).connect(reduce_sum_node.in_port(0)) diff --git a/model-optimizer/extensions/front/mxnet/slice_like_ext.py b/model-optimizer/extensions/front/mxnet/slice_like_ext.py index 5d803fe40bd..6074471d88a 100644 --- a/model-optimizer/extensions/front/mxnet/slice_like_ext.py +++ b/model-optimizer/extensions/front/mxnet/slice_like_ext.py @@ -14,9 +14,9 @@ limitations under the License. """ +from extensions.ops.slice_like import SliceLike from mo.front.extractor import FrontExtractorOp from mo.front.mxnet.extractors.utils import get_mxnet_layer_attrs -from mo.ops.crop import Crop class SliceLikeFrontExtractor(FrontExtractorOp): @@ -26,15 +26,11 @@ class SliceLikeFrontExtractor(FrontExtractorOp): @classmethod def extract(cls, node): attrs = get_mxnet_layer_attrs(node.symbol_dict) - axes = attrs.tuple("axes", int, []) - offset = [0 for i in range(0, axes[-1])] + axes = list(attrs.tuple("axes", int, [])) node_attrs = { - 'axis': 1, - 'offset': offset, - 'dim': offset, 'axes': axes } # update the attributes of the node - Crop.update_node_stat(node, node_attrs) + SliceLike.update_node_stat(node, node_attrs) return cls.enabled diff --git a/model-optimizer/extensions/front/mxnet/ssd_anchor_reshape.py b/model-optimizer/extensions/front/mxnet/ssd_anchor_reshape.py index bd986fca7f2..a1f7350f3eb 100644 --- a/model-optimizer/extensions/front/mxnet/ssd_anchor_reshape.py +++ b/model-optimizer/extensions/front/mxnet/ssd_anchor_reshape.py @@ -19,6 +19,7 @@ import numpy as np from extensions.front.mxnet.eltwise_scalar_replacers import MulScalarFrontReplacer from extensions.front.mxnet.ssd_detection_output_replacer import SsdPatternDetectionOutputReplacer from extensions.front.split_normalizer import AttributedSplitToSplit +from extensions.ops.slice_like import SliceLike from mo.front.common.replacement import FrontReplacementSubgraph from mo.graph.graph import Graph, Node from mo.middle.pattern_match import find_pattern_matches @@ -64,7 +65,7 @@ class SsdPatternAnchorReshape(FrontReplacementSubgraph): nodes=[ ('power', dict(op='Mul')), ('anchor', dict(op='Const')), - ('slice_like', dict(op='Crop')), + ('slice_like', dict(op='slice_like')), ('reshape1', dict(op='Reshape')), ('reshape2', dict(op='Reshape')), ('reshape3', dict(op='Reshape')) @@ -91,10 +92,9 @@ class SsdPatternAnchorReshape(FrontReplacementSubgraph): variants = np.array([variants_dict['mul_scalar1x'], variants_dict['mul_scalar1y'], variants_dict['mul_scalar2x'], variants_dict['mul_scalar2y']] * int(const.value.size / 4)).reshape(const.value.shape) - priorbox_variants = Const(graph, dict(value=variants, symbol_dict={'name': const.id + '/priorbox_variants'})).create_node() - variants_slice_like = Crop(graph, dict(axis=slice_like.axis, offset=slice_like.offset, dim=slice_like.dim, axes=slice_like.axes, - symbol_dict={'name': slice_like.id + '/variants_slice_like'})) \ - .create_node() + priorbox_variants = Const(graph, dict(value=variants, name=const.id + '/priorbox_variants')).create_node() + variants_slice_like = SliceLike(graph, dict(axes=slice_like.axes, + name=slice_like.id + '/variants_slice_like')).create_node() variants_slice_like.in_port(0).connect(priorbox_variants.out_port(0)) variants_slice_like.in_port(1).connect(crop_shape.out_port(0)) diff --git a/model-optimizer/extensions/front/mxnet/ssd_detection_output_replacer.py b/model-optimizer/extensions/front/mxnet/ssd_detection_output_replacer.py index 8d0f061e709..0033a4912cb 100644 --- a/model-optimizer/extensions/front/mxnet/ssd_detection_output_replacer.py +++ b/model-optimizer/extensions/front/mxnet/ssd_detection_output_replacer.py @@ -68,7 +68,7 @@ class SsdPatternDetectionOutputReplacer(FrontReplacementSubgraph): nodes=[ ('power', dict(op='Mul')), ('anchor', dict(op='Const')), - ('slice_like', dict(op='Crop')), + ('slice_like', dict(op='slice_like')), ('reshape1', dict(op='Reshape')), ('reshape2', dict(op='Reshape')), ('reshape3', dict(op='Reshape')), diff --git a/model-optimizer/extensions/front/onnx/expand_ext.py b/model-optimizer/extensions/front/onnx/expand_ext.py index 8e14af25cb5..2e337413f7f 100644 --- a/model-optimizer/extensions/front/onnx/expand_ext.py +++ b/model-optimizer/extensions/front/onnx/expand_ext.py @@ -24,5 +24,5 @@ class ExpandExtractor(FrontExtractorOp): @classmethod def extract(cls, node): - Broadcast.update_node_stat(node) + Broadcast.update_node_stat(node, {'mode': 'bidirectional'}) return cls.enabled diff --git a/model-optimizer/extensions/front/onnx/non_max_suppression_ext.py b/model-optimizer/extensions/front/onnx/non_max_suppression_ext.py index 84e2564757c..3471da2eff8 100644 --- a/model-optimizer/extensions/front/onnx/non_max_suppression_ext.py +++ b/model-optimizer/extensions/front/onnx/non_max_suppression_ext.py @@ -13,6 +13,7 @@ See the License for the specific language governing permissions and limitations under the License. """ +import numpy as np from extensions.ops.non_max_suppression import NonMaxSuppression from mo.front.extractor import FrontExtractorOp @@ -28,5 +29,6 @@ class NonMaxSuppressionExtractor(FrontExtractorOp): encoding_map = {0: 'corner', 1: 'center'} center_point_box = onnx_attr(node, 'center_point_box', 'i', default=0) NonMaxSuppression.update_node_stat(node, {'sort_result_descending': 0, + 'output_type': np.int64, 'box_encoding': encoding_map[center_point_box]}) return cls.enabled diff --git a/model-optimizer/extensions/front/onnx/pooling_ext.py b/model-optimizer/extensions/front/onnx/pooling_ext.py index b86fef24862..3e41e664983 100644 --- a/model-optimizer/extensions/front/onnx/pooling_ext.py +++ b/model-optimizer/extensions/front/onnx/pooling_ext.py @@ -89,7 +89,7 @@ def common_onnx_pool_extractor(node): node.soft_get('name', node.id), pads)) # Try to convert slightly incorrect models with insufficient pad parameters - assert pads.size * 2 == kernel_shape.size + assert pads.size == kernel_shape.size pads = np.concatenate([pads, pads]) log.warning('Extended pads to {}'.format(pads)) diff --git a/model-optimizer/extensions/front/onnx/shape_ext.py b/model-optimizer/extensions/front/onnx/shape_ext.py index 1f18cbbc1fb..e32a09a42ae 100644 --- a/model-optimizer/extensions/front/onnx/shape_ext.py +++ b/model-optimizer/extensions/front/onnx/shape_ext.py @@ -13,6 +13,7 @@ See the License for the specific language governing permissions and limitations under the License. """ +import numpy as np from mo.front.extractor import FrontExtractorOp from mo.ops.shape import Shape @@ -24,5 +25,5 @@ class ShapeFrontExtractor(FrontExtractorOp): @classmethod def extract(cls, node): - Shape.update_node_stat(node) + Shape.update_node_stat(node, {'output_type': np.int64}) return cls.enabled diff --git a/model-optimizer/extensions/front/onnx/softmaxONNX_to_softmax.py b/model-optimizer/extensions/front/onnx/softmaxONNX_to_softmax.py new file mode 100644 index 00000000000..45d33bd591d --- /dev/null +++ b/model-optimizer/extensions/front/onnx/softmaxONNX_to_softmax.py @@ -0,0 +1,60 @@ +""" + Copyright (C) 2020 Intel Corporation + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +""" + +from mo.front.common.replacement import FrontReplacementOp +from mo.graph.graph import Graph, Node, rename_nodes +from mo.ops.flatten import FlattenONNX +from mo.ops.reshape import Reshape +from mo.ops.shape import Shape +from mo.ops.softmax import Softmax + + +class SoftmaxONNXFrontReplacer(FrontReplacementOp): + """ + Replace SoftmaxONNX operation with FlattenONNX -> Softmax -> Reshape subgraph + """ + op = "SoftMaxONNX" + enabled = True + + def run_before(self): + from extensions.front.onnx.flattenONNX_to_reshape import FlattenONNXToReshape + return [FlattenONNXToReshape] + + def replace_op(self, graph: Graph, node: Node): + node_name = node.soft_get('name', node.id) + assert node.has_valid('axis'), 'The node "{}" does not have mandatory attribute "axis"'.format(node_name) + + flatten_node = FlattenONNX(graph, {'name': node_name + '/FlattenONNX_', 'axis': node.axis}).create_node() + shape_node = Shape(graph, {'name': node_name + '/ShapeOf_'}).create_node() + softmax_node = Softmax(graph, {'name': node_name + '/Softmax_', + 'axis': 1, + 'framework_node_name': node_name, + 'rename_condition': lambda n: len(n.graph.get_op_nodes(name=node_name)) == 0 + }).create_node() + reshape_node = Reshape(graph, {}).create_node() + + rename_nodes([(node, node_name + '/delete'), (reshape_node, node_name)]) + + flatten_node.out_port(0).connect(softmax_node.in_port(0)) + softmax_node.out_port(0).connect(reshape_node.in_port(0)) + shape_node.out_port(0).connect(reshape_node.in_port(1)) + + source = node.in_port(0).get_source() + + flatten_node.in_port(0).connect(source) + shape_node.in_port(0).connect(source) + + return [reshape_node.id] diff --git a/model-optimizer/extensions/front/onnx/softmax_ext.py b/model-optimizer/extensions/front/onnx/softmax_ext.py index beb27c47d55..0a3c5245827 100644 --- a/model-optimizer/extensions/front/onnx/softmax_ext.py +++ b/model-optimizer/extensions/front/onnx/softmax_ext.py @@ -16,7 +16,7 @@ from mo.front.extractor import FrontExtractorOp from mo.front.onnx.extractors.utils import onnx_attr -from mo.ops.softmax import LogSoftmaxONNX, Softmax +from mo.ops.softmax import LogSoftmaxONNX, SoftmaxONNX class SoftmaxExtractor(FrontExtractorOp): @@ -26,7 +26,7 @@ class SoftmaxExtractor(FrontExtractorOp): @classmethod def extract(cls, node): axis = onnx_attr(node, 'axis', 'i', default=1) - Softmax.update_node_stat(node, {'axis': axis}) + SoftmaxONNX.update_node_stat(node, {'axis': axis}) return cls.enabled diff --git a/model-optimizer/extensions/front/rank_decomposer.py b/model-optimizer/extensions/front/rank_decomposer.py index 0f582025beb..b7dcb4ee535 100644 --- a/model-optimizer/extensions/front/rank_decomposer.py +++ b/model-optimizer/extensions/front/rank_decomposer.py @@ -17,7 +17,7 @@ from mo.front.common.partial_infer.utils import int64_array from mo.front.common.replacement import FrontReplacementOp from mo.front.tf.graph_utils import create_op_node_with_second_input -from mo.graph.graph import Graph +from mo.graph.graph import Graph, rename_nodes from mo.ops.shape import Shape from mo.ops.squeeze import Squeeze @@ -30,11 +30,16 @@ class RankDecomposer(FrontReplacementOp): node = match['op'] name = node.soft_get('name', node.id) - shape_of = Shape(graph, {'name': name + '/shape_of'}).create_node() - rank_1d = Shape(graph, {'name': name + '/rank_of'}).create_node() - rank_0d = create_op_node_with_second_input(graph, Squeeze, int64_array([0]), {'name': name + '/0d_rank_of'}, - rank_1d) + assert node.has_valid('output_type'), \ + 'Rank node should have `output_type` attribute, but it`s not for node {}'.format(name) + + shape_of = Shape(graph, {'name': name + '/shape_of', 'output_type': node.output_type}).create_node() + rank_1d = Shape(graph, {'name': name + '/rank_of', 'output_type': node.output_type}).create_node() + rank_0d = create_op_node_with_second_input( + graph, Squeeze, int64_array(0), {'name': name + '/0d_rank_of'}, rank_1d) shape_of.out_port(0).connect(rank_1d.in_port(0)) node.out_port(0).get_connection().set_source(rank_0d.out_port(0)) node.in_port(0).get_connection().set_destination(shape_of.in_port(0)) + + rename_nodes([(node, name + '/ToBeDeleted'), (rank_0d, name)]) diff --git a/model-optimizer/extensions/front/rank_decomposer_test.py b/model-optimizer/extensions/front/rank_decomposer_test.py new file mode 100644 index 00000000000..f3f504731d1 --- /dev/null +++ b/model-optimizer/extensions/front/rank_decomposer_test.py @@ -0,0 +1,70 @@ +""" + Copyright (C) 2018-2020 Intel Corporation + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +""" + +import unittest + +import numpy as np +from generator import generator, generate + +from extensions.front.rank_decomposer import RankDecomposer +from mo.front.common.partial_infer.utils import int64_array +from mo.utils.ir_engine.compare_graphs import compare_graphs +from mo.utils.unittest.graph import build_graph, regular_op_with_empty_data, result, connect, \ + valued_const_with_data + +nodes = lambda output_type: { + **regular_op_with_empty_data('input', {'type': 'Parameter'}), + **regular_op_with_empty_data('rank', {'op': 'Rank', 'type': None, 'output_type': output_type, 'name': 'my_rank'}), + **result(), + + **regular_op_with_empty_data('shape', {'type': 'ShapeOf', 'output_type': output_type}), + **regular_op_with_empty_data('rank_1D', {'type': 'ShapeOf', 'output_type': output_type}), + **valued_const_with_data('zero', int64_array(0)), + **regular_op_with_empty_data('rank_0D', {'type': 'Squeeze'}), +} + + +@generator +class RankDecomposerTest(unittest.TestCase): + + @generate(np.int32, np.int64) + def test_rank_decomposer(self, output_type): + graph = build_graph(nodes_attrs=nodes(output_type), edges=[ + *connect('input', 'rank'), + *connect('rank', 'output'), + ], nodes_with_edges_only=True) + RankDecomposer().find_and_replace_pattern(graph) + + graph_ref = build_graph(nodes_attrs=nodes(output_type), edges=[ + *connect('input', 'shape'), + *connect('shape', 'rank_1D'), + *connect('rank_1D', '0:rank_0D'), + *connect('zero', '1:rank_0D'), + *connect('rank_0D', 'output'), + ], nodes_with_edges_only=True) + + (flag, resp) = compare_graphs(graph, graph_ref, 'output', check_op_attrs=True) + self.assertTrue(flag, resp) + self.assertEqual(graph.get_op_nodes(type='Squeeze')[0]['name'], 'my_rank', + 'Name is not inherited from original node for RankDecomposer') + print(output_type) + + def test_rank_decomposer_assertion(self): + graph = build_graph(nodes_attrs=nodes(None), edges=[ + *connect('input', 'rank'), + *connect('rank', 'output'), + ], nodes_with_edges_only=True) + self.assertRaises(AssertionError, RankDecomposer().find_and_replace_pattern, graph) diff --git a/model-optimizer/extensions/front/tf/SizeReplacer.py b/model-optimizer/extensions/front/tf/SizeReplacer.py index 07be4121b4f..42fefddef85 100644 --- a/model-optimizer/extensions/front/tf/SizeReplacer.py +++ b/model-optimizer/extensions/front/tf/SizeReplacer.py @@ -16,8 +16,8 @@ from extensions.ops.ReduceOps import ReduceProd from mo.front.common.partial_infer.utils import int64_array from mo.front.common.replacement import FrontReplacementOp -from mo.graph.graph import Graph, Node -from mo.ops.const import Const +from mo.front.tf.graph_utils import create_op_node_with_second_input +from mo.graph.graph import Graph, rename_nodes from mo.ops.shape import Shape @@ -28,15 +28,16 @@ class SizeFrontReplacer(FrontReplacementOp): op = "Size" enabled = True - def replace_op(self, graph: Graph, node: Node): - shape = Shape(graph, {'name': node.name + '/Shape/'}).create_node() - reduce_prod = ReduceProd(graph, {'name': shape.name + 'ReduceProd/', 'keep_dims': False}).create_node() - reduce_axis = Const(graph, {'value': int64_array([0])}).create_node() + def replace_sub_graph(self, graph: Graph, match: dict): + node = match['op'] + name = node.soft_get('name', node.id) + assert node.has_valid('output_type'), \ + 'Size node should have `output_type` attribute, but it`s not for node {}'.format(name) - # Connect nodes + shape = Shape(graph, {'name': name + '/Shape/', 'output_type': node.output_type}).create_node() node.in_port(0).get_connection().set_destination(shape.in_port(0)) - reduce_prod.in_port(0).get_connection().set_source(shape.out_port(0)) - reduce_prod.in_port(1).get_connection().set_source(reduce_axis.out_port(0)) + reduce_prod = create_op_node_with_second_input( + graph, ReduceProd, int64_array([0]), {'name': shape.name + 'ReduceProd/', 'keep_dims': False}, shape) + node.out_port(0).get_connection().set_source(reduce_prod.out_port(0)) - # The "explicit" version of the return value is: [(out_node.id, 0)]) - return [reduce_prod.id] + rename_nodes([(node, name + '/ToBeDeleted'), (reduce_prod, name)]) diff --git a/model-optimizer/extensions/front/tf/argmax_ext.py b/model-optimizer/extensions/front/tf/argmax_ext.py index dbe36ab3584..47f531bea51 100644 --- a/model-optimizer/extensions/front/tf/argmax_ext.py +++ b/model-optimizer/extensions/front/tf/argmax_ext.py @@ -13,8 +13,11 @@ See the License for the specific language governing permissions and limitations under the License. """ +import numpy as np + from extensions.ops.argmax import ArgMaxOp from mo.front.extractor import FrontExtractorOp +from mo.front.tf.extractors.utils import tf_dtype_extractor class ArgMaxFrontExtractor(FrontExtractorOp): @@ -24,5 +27,7 @@ class ArgMaxFrontExtractor(FrontExtractorOp): @classmethod def extract(cls, node): ArgMaxOp.update_node_stat(node, {'out_max_val': 0, 'top_k': 1, 'axis': None, - 'dim_attrs': ['axis'], 'keepdims': 0, 'remove_values_output': True}) + 'dim_attrs': ['axis'], 'keepdims': 0, 'remove_values_output': True, + 'output_type': tf_dtype_extractor(node.pb.attr['out_type'].type, np.int64), + }) return cls.enabled diff --git a/model-optimizer/extensions/front/tf/non_max_suppression_ext.py b/model-optimizer/extensions/front/tf/non_max_suppression_ext.py index cfc9170c701..2e3930f0d1c 100644 --- a/model-optimizer/extensions/front/tf/non_max_suppression_ext.py +++ b/model-optimizer/extensions/front/tf/non_max_suppression_ext.py @@ -15,6 +15,8 @@ """ import logging as log +import numpy as np + from extensions.ops.non_max_suppression import NonMaxSuppression from mo.front.extractor import FrontExtractorOp @@ -25,7 +27,7 @@ class NonMaxSuppressionV3Extractor(FrontExtractorOp): @classmethod def extract(cls, node): - attrs = {'sort_result_descending': 1, 'center_point_box': 0} + attrs = {'sort_result_descending': 1, 'center_point_box': 0, 'output_type': np.int32} NonMaxSuppression.update_node_stat(node, attrs) return cls.enabled @@ -40,7 +42,7 @@ class NonMaxSuppressionV4Extractor(FrontExtractorOp): if not pad_to_max_output_size: log.warning('The attribute "pad_to_max_output_size" of node {} is equal to False which is not supported.' 'Forcing it to be equal to True'.format(node.soft_get('name'))) - attrs = {'sort_result_descending': 1, 'box_encoding': 'corner'} + attrs = {'sort_result_descending': 1, 'box_encoding': 'corner', 'output_type': np.int32} NonMaxSuppression.update_node_stat(node, attrs) return cls.enabled @@ -55,6 +57,6 @@ class NonMaxSuppressionV5Extractor(FrontExtractorOp): if not pad_to_max_output_size: log.warning('The attribute "pad_to_max_output_size" of node {} is equal to False which is not supported.' 'Forcing it to be equal to True'.format(node.soft_get('name'))) - attrs = {'sort_result_descending': 1, 'box_encoding': 'corner'} + attrs = {'sort_result_descending': 1, 'box_encoding': 'corner', 'output_type': np.int32} NonMaxSuppression.update_node_stat(node, attrs) return cls.enabled diff --git a/model-optimizer/extensions/front/tf/reshape_related_ext.py b/model-optimizer/extensions/front/tf/reshape_related_ext.py index 22f960a841a..51632d2f962 100644 --- a/model-optimizer/extensions/front/tf/reshape_related_ext.py +++ b/model-optimizer/extensions/front/tf/reshape_related_ext.py @@ -31,7 +31,7 @@ class RankFrontExtractor(FrontExtractorOp): @classmethod def extract(cls, node: Node): - Rank.update_node_stat(node) + Rank.update_node_stat(node, {'output_type': np.int32}) return cls.enabled @@ -51,7 +51,7 @@ class ShapeExtractor(FrontExtractorOp): @classmethod def extract(cls, node: Node): - Shape.update_node_stat(node, {'data_type': tf_dtype_extractor(node.pb.attr['out_type'].type, np.int32)}) + Shape.update_node_stat(node, {'output_type': tf_dtype_extractor(node.pb.attr['out_type'].type, np.int32)}) return cls.enabled @@ -61,7 +61,7 @@ class SizeFrontExtractor(FrontExtractorOp): @classmethod def extract(cls, node): - Size.update_node_stat(node) + Size.update_node_stat(node, {'output_type': tf_dtype_extractor(node.pb.attr['out_type'].type, np.int32)}) return cls.enabled diff --git a/model-optimizer/extensions/front/tf/size_replacer_test.py b/model-optimizer/extensions/front/tf/size_replacer_test.py new file mode 100644 index 00000000000..03daf1a2666 --- /dev/null +++ b/model-optimizer/extensions/front/tf/size_replacer_test.py @@ -0,0 +1,68 @@ +""" + Copyright (C) 2018-2020 Intel Corporation + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +""" + +import unittest + +import numpy as np +from generator import generator, generate + +from extensions.front.tf.SizeReplacer import SizeFrontReplacer +from mo.front.common.partial_infer.utils import int64_array +from mo.utils.ir_engine.compare_graphs import compare_graphs +from mo.utils.unittest.graph import build_graph, regular_op_with_empty_data, result, connect, \ + valued_const_with_data + +nodes = lambda output_type: { + **regular_op_with_empty_data('input', {'type': 'Parameter'}), + **regular_op_with_empty_data('size', {'op': 'Size', 'type': None, 'output_type': output_type, 'name': 'my_size'}), + **result(), + + **regular_op_with_empty_data('shape', {'type': 'ShapeOf', 'output_type': output_type}), + **valued_const_with_data('zero', int64_array([0])), + **regular_op_with_empty_data('reduce', {'type': 'ReduceProd', 'keep_dims': False}), +} + + +@generator +class SizeReplacerTest(unittest.TestCase): + + @generate(np.int32, np.int64) + def test_size_replacer(self, output_type): + graph = build_graph(nodes_attrs=nodes(output_type), edges=[ + *connect('input', 'size'), + *connect('size', 'output'), + ], nodes_with_edges_only=True) + SizeFrontReplacer().find_and_replace_pattern(graph) + + graph_ref = build_graph(nodes_attrs=nodes(output_type), edges=[ + *connect('input', 'shape'), + *connect('shape', '0:reduce'), + *connect('zero', '1:reduce'), + *connect('reduce', 'output'), + ], nodes_with_edges_only=True) + + (flag, resp) = compare_graphs(graph, graph_ref, 'output', check_op_attrs=True) + self.assertTrue(flag, resp) + self.assertEqual(graph.get_op_nodes(type='ReduceProd')[0]['name'], 'my_size', + 'Name is not inherited from original node for SizeReplacer') + print(output_type) + + def test_size_replacer_assertion(self): + graph = build_graph(nodes_attrs=nodes(None), edges=[ + *connect('input', 'size'), + *connect('size', 'output'), + ], nodes_with_edges_only=True) + self.assertRaises(AssertionError, SizeFrontReplacer().find_and_replace_pattern, graph) diff --git a/model-optimizer/extensions/front/tf/topk_ext.py b/model-optimizer/extensions/front/tf/topk_ext.py index 72069945727..7c338b8594d 100644 --- a/model-optimizer/extensions/front/tf/topk_ext.py +++ b/model-optimizer/extensions/front/tf/topk_ext.py @@ -13,6 +13,7 @@ See the License for the specific language governing permissions and limitations under the License. """ +import numpy as np from extensions.ops.topk import TopK from mo.front.extractor import FrontExtractorOp @@ -25,7 +26,8 @@ class TopKExtractor(FrontExtractorOp): @classmethod def extract(cls, node): sort = 'value' if node.pb.attr['sorted'] else 'none' - TopK.update_node_stat(node, {'mode': 'max', 'axis': -1, 'sort': sort, 'k' : node.pb.attr['k'].i}) + TopK.update_node_stat(node, {'mode': 'max', 'axis': -1, 'sort': sort, 'k': node.pb.attr['k'].i, + 'index_element_type': np.int32}) return cls.enabled @@ -37,5 +39,5 @@ class TopKV2Extractor(FrontExtractorOp): @classmethod def extract(cls, node): sort = 'value' if node.pb.attr['sorted'] else 'none' - TopK.update_node_stat(node, {'mode': 'max', 'axis': -1, 'sort': sort}) + TopK.update_node_stat(node, {'mode': 'max', 'axis': -1, 'sort': sort, 'index_element_type': np.int32}) return cls.enabled diff --git a/model-optimizer/extensions/middle/AnchorToPriorBox.py b/model-optimizer/extensions/middle/AnchorToPriorBox.py index 05bf1682cf2..30dbf2a181f 100644 --- a/model-optimizer/extensions/middle/AnchorToPriorBox.py +++ b/model-optimizer/extensions/middle/AnchorToPriorBox.py @@ -16,6 +16,7 @@ import numpy as np +from extensions.middle.SliceLikeToStridedSlice import SliceLikeToStridedSlice from mo.graph.graph import Graph from mo.middle.replacement import MiddleReplacementPattern from mo.ops.const import Const @@ -33,12 +34,15 @@ class AnchorToPriorBoxes(MiddleReplacementPattern): from extensions.middle.pass_separator import MiddleStart return [MiddleStart] + def run_before(self): + return [SliceLikeToStridedSlice] + def pattern(self): return dict( nodes=[ ('const', dict(op='Const')), ('const_data', dict(kind='data')), - ('slice_like', dict(op='Crop')), + ('slice_like', dict(op='slice_like')), ('slice_like_out', dict(kind='data')), ('reshape', dict(op='Reshape')), ], diff --git a/model-optimizer/extensions/middle/ArgMaxToTopK.py b/model-optimizer/extensions/middle/ArgMaxToTopK.py index e7dc55e2aa3..2b603b05182 100644 --- a/model-optimizer/extensions/middle/ArgMaxToTopK.py +++ b/model-optimizer/extensions/middle/ArgMaxToTopK.py @@ -40,6 +40,7 @@ class ArgMaxToTopK(MiddleReplacementPattern): def replace_pattern(self, graph: Graph, match: dict): node = match['argmax'] + node_name = node.soft_get('name', node.id) connected_ports = [port for port in node.in_ports().values() if not port.disconnected()] if len(connected_ports) == 2: @@ -47,9 +48,11 @@ class ArgMaxToTopK(MiddleReplacementPattern): else: axis = node.axis - assert axis is not None, 'The "axis" should be defined for node "{}"'.format(node.soft_get('name')) + assert axis is not None, 'The "axis" should be defined for node "{}"'.format(node_name) + assert node.has_and_set('output_type'), 'The data type is not set for node "{}"'.format(node_name) topk_node = TopK(graph, {'axis': axis, 'mode': 'max', 'sort': 'index', - 'remove_values_output': node.has_and_set('remove_values_output')}).create_node() + 'remove_values_output': node.has_and_set('remove_values_output'), + 'index_element_type': node.output_type}).create_node() node.in_port(0).get_connection().set_destination(topk_node.in_port(0)) if node.has_and_set('out_max_val'): # in this mode the ArgMax produces tuples (max_ind, max_value) concat_node = Concat(graph, {'axis': 1, 'name': node.name + '/Concat'}).create_node() diff --git a/model-optimizer/extensions/middle/SliceLikeToStridedSlice.py b/model-optimizer/extensions/middle/SliceLikeToStridedSlice.py new file mode 100644 index 00000000000..c9145a921ad --- /dev/null +++ b/model-optimizer/extensions/middle/SliceLikeToStridedSlice.py @@ -0,0 +1,112 @@ +""" + Copyright (C) 2018-2020 Intel Corporation + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +""" +import numpy as np +from typing import Dict + +from mo.front.tf.graph_utils import create_op_with_const_inputs +from mo.graph.graph import Graph, Node, rename_nodes +from mo.middle.replacement import MiddleReplacementPattern +from mo.ops.shape import Shape +from mo.ops.strided_slice import StridedSlice +from mo.utils.shape import get_shape_values_by_range_idxs, new_shape_node_from_shape_nodes, \ + get_shape_and_rank_nodes_by_port + + +class SliceLikeToStridedSlice(MiddleReplacementPattern): + """ + Replace mxnet slice_like operation with StridedSlice in reshapable way. + The begin parameter for StridedSlice is always a zero vector. + The end parameter depends on the slice_like inputs and axes. + + 1. If slice_like inputs has the same ranks, we can use second input shape (shape_like) as the end parameter for + StridedSlice. Axes parameter will form end_mask, that allows to use slice only on the desired axes. + Example: + input_shape = [1, 64, 128, 256], shape_like = [1, 2, 3, 4], axes = [2, 3]. + In that case end = shape_like = [1, 2, 3, 4], but end_mask = [0, 0, 1, 1], so output_shape = [1, 64, 3, 4] + + 2. Axes parameter has the last dimension of the first input shape (in that case shape_like >= input_shape). + Here we can use only a part of shape_like as the end parameter. + Example: + input_shape = [1, 64, 128, 256], shape_like = [1, 2, 3, 4, 5], axes = [2, 3]. + end = shape_like[:4] = [1, 2, 3, 4], end_mask = [0, 0, 1, 1], output_shape = [1, 64, 3, 4] + + 3. Usual case, where we form end parameter by concatenate parts of shape_like and input_shape. + Examples: + input_shape = [1, 64, 128, 256, 512], shape_like = [1, 2, 3, 4], axes = [2, 3]. + end = shape_like[:4] + input_shape[4:] = [1, 2, 3, 4, 512], + end_mask = [0, 0, 1, 1, 0], output_shape = [1, 64, 3, 4, 512] + + input_shape = [1, 64, 128, 256], shape_like = [1, 2, 3, 4, 5], axes = [0, 2]. + end = shape_like[:3] + input_shape[3:] = [1, 2, 3, 256], + end_mask = [1, 0, 1, 0], output_shape = [1, 64, 3, 256] + """ + + enabled = True + graph_condition = [lambda graph: graph.graph['fw'] == 'mxnet'] + + @staticmethod + def pattern(): + return dict( + nodes=[ + ('op', dict(kind='op', op='slice_like')) + ], + edges=[] + ) + + @staticmethod + def replace_pattern(graph: Graph, match: Dict[str, Node]): + node = match['op'] + name = node.soft_get('name', node.id) + input_shape = node.in_port(0).data.get_shape() + second_input_shape = node.in_port(1).data.get_shape() + + begin_mask = np.zeros(len(input_shape), dtype=np.int64) + end_mask = np.zeros(len(input_shape), dtype=np.int64) + + for i in node.axes: + end_mask[i] = np.int64(1) + + new_axis_mask = np.zeros(len(input_shape), dtype=np.int64) + shrink_axis_mask = np.zeros(len(input_shape), dtype=np.int64) + ellipsis_mask = np.zeros(len(input_shape), dtype=np.int64) + + ss = create_op_with_const_inputs(graph, StridedSlice, + port_value_dict={1: np.zeros(len(input_shape), dtype=np.int64)}, + op_attrs={'name': 'StridedSlice', 'begin_mask': begin_mask, + 'end_mask': end_mask, 'new_axis_mask': new_axis_mask, + 'shrink_axis_mask': shrink_axis_mask, + 'ellipsis_mask': ellipsis_mask}) + if input_shape.size == second_input_shape.size: + end = Shape(graph, dict(name=name + '/End')).create_node() + end.in_port(0).connect(node.in_port(1).get_source()) + ss.in_port(2).connect(end.out_port(0)) + else: + shape_like, rank_like = get_shape_and_rank_nodes_by_port(node.in_port(1).get_source()) + end_first_part = get_shape_values_by_range_idxs(shape_like, rank_like, 0, node.axes[-1], include_end=True) + if input_shape.size - 1 == node.axes[-1]: + ss.in_port(2).connect(end_first_part.out_port(0)) + else: + shape, rank = get_shape_and_rank_nodes_by_port(node.in_port(0).get_source()) + end_second_part = get_shape_values_by_range_idxs(shape, rank, node.axes[-1], -1, include_begin=False, + include_end=True) + end = new_shape_node_from_shape_nodes([end_first_part, end_second_part]) + ss.in_port(2).connect(end.out_port(0)) + + node.in_port(0).get_connection().set_destination(ss.in_port(0)) + node.in_port(1).disconnect() + node.out_port(0).get_connection().set_source(ss.out_port(0)) + + rename_nodes([(node, name + '/ShouldBeDeleted'), (ss, name)]) diff --git a/model-optimizer/extensions/middle/SliceLikeToStridedSlice_test.py b/model-optimizer/extensions/middle/SliceLikeToStridedSlice_test.py new file mode 100644 index 00000000000..b8bd16b14a6 --- /dev/null +++ b/model-optimizer/extensions/middle/SliceLikeToStridedSlice_test.py @@ -0,0 +1,260 @@ +""" + Copyright (C) 2018-2020 Intel Corporation + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +""" +import unittest + +from extensions.middle.SliceLikeToStridedSlice import SliceLikeToStridedSlice +from mo.front.common.partial_infer.utils import int64_array +from mo.utils.ir_engine.compare_graphs import compare_graphs +from mo.utils.unittest.graph import build_graph + +nodes_attributes = { + 'input': {'kind': 'op', 'op': 'Const'}, + 'input_data': {'kind': 'data'}, + + 'shape_like_input': {'kind': 'op', 'op': 'Const'}, + 'shape_like_input_data': {'kind': 'data'}, + + 'slice_like': {'kind': 'op', 'op': 'slice_like'}, + 'slice_like_data': {'kind': 'data', 'shape': None, 'value': None}, + + 'result': {'kind': 'op', 'op': 'Result'}, + + 'shape': {'kind': 'op', 'op': 'ShapeOf'}, + 'shape_data': {'kind': 'data'}, + 'rank_1_d': {'kind': 'op', 'op': 'ShapeOf'}, + 'rank_1_d_data': {'kind': 'data'}, + 'rank': {'kind': 'op', 'op': 'Squeeze'}, + 'rank_data': {'kind': 'data'}, + 'rank_const': {'kind': 'op', 'op': 'Const'}, + 'rank_const_data': {'kind': 'data'}, + + 'shape_like': {'kind': 'op', 'op': 'ShapeOf'}, + 'shape_like_data': {'kind': 'data'}, + 'rank_like_1_d': {'kind': 'op', 'op': 'ShapeOf'}, + 'rank_like_1_d_data': {'kind': 'data'}, + 'rank_like': {'kind': 'op', 'op': 'Squeeze'}, + 'rank_like_const': {'kind': 'op', 'op': 'Const'}, + 'rank_like_const_data': {'kind': 'data'}, + + 'begin': {'kind': 'op', 'op': 'Const'}, + 'begin_data': {'kind': 'data'}, + 'ss': {'kind': 'op', 'op': 'StridedSlice'}, + + 'start_idx_like': {'kind': 'op', 'op': 'Const'}, + 'start_idx_like_data': {'kind': 'data'}, + 'end_idx_like': {'kind': 'op', 'op': 'Const'}, + 'end_idx_like_data': {'kind': 'data'}, + 'end_idx_like_const': {'kind': 'op', 'op': 'Const'}, + 'end_idx_like_const_data': {'kind': 'data'}, + 'end_idx_like_add': {'kind': 'op', 'op': 'Add'}, + 'end_idx_like_add_data': {'kind': 'data'}, + 'delta_like': {'kind': 'op', 'op': 'Const'}, + 'delta_like_data': {'kind': 'data'}, + 'range_like': {'kind': 'op', 'op': 'Range'}, + 'range_like_data': {'kind': 'data'}, + 'gather_like': {'kind': 'op', 'op': 't_gather'}, + 'gather_like_data': {'kind': 'data'}, + 'gather_like_axis': {'kind': 'op', 'op': 'Const'}, + 'gather_like_axis_data': {'kind': 'data'}, + 'concat': {'kind': 'op', 'op': 'Concat'}, + 'concat_data': {'kind': 'data'}, + + 'start_idx': {'kind': 'op', 'op': 'Const'}, + 'start_idx_data': {'kind': 'data'}, + 'start_idx_const': {'kind': 'op', 'op': 'Const'}, + 'start_idx_const_data': {'kind': 'data'}, + 'start_idx_add': {'kind': 'op', 'op': 'Add'}, + 'start_idx_add_data': {'kind': 'data'}, + 'end_idx': {'kind': 'op', 'op': 'Add'}, + 'end_idx_data': {'kind': 'data'}, + 'end_idx_axis': {'kind': 'op', 'op': 'Const'}, + 'end_idx_axis_data': {'kind': 'data'}, + 'end_idx_const': {'kind': 'op', 'op': 'Const'}, + 'end_idx_const_data': {'kind': 'data'}, + 'end_idx_add': {'kind': 'op', 'op': 'Add'}, + 'end_idx_add_data': {'kind': 'data'}, + 'delta': {'kind': 'op', 'op': 'Const'}, + 'delta_data': {'kind': 'data'}, + 'range': {'kind': 'op', 'op': 'Range'}, + 'range_data': {'kind': 'data'}, + 't_gather': {'kind': 'op', 'op': 't_gather'}, + 'gather_data': {'kind': 'data'}, + 'gather_axis': {'kind': 'op', 'op': 'Const'}, + 'gather_axis_data': {'kind': 'data'} + +} + +edges = [ + ('input', 'input_data'), + ('input_data', 'slice_like', {'in': 0}), + ('shape_like_input', 'shape_like_input_data'), + ('shape_like_input_data', 'slice_like', {'in': 1}), + ('slice_like', 'slice_like_data'), + ('slice_like_data', 'result') +] + +same_input_shapes_dims_edges = [ + ('input', 'input_data'), + ('input_data', 'ss', {'in': 0}), + ('ss', 'slice_like_data'), + ('slice_like_data', 'result'), + ('shape_like_input', 'shape_like_input_data'), + ('shape_like_input_data', 'shape_like'), + ('shape_like', 'shape_like_data'), + ('shape_like_data', 'ss', {'in': 2}), + ('begin', 'begin_data'), + ('begin_data', 'ss', {'in': 1}) +] + +shape_like_sub_graph_edges = [ + ('input', 'input_data'), + ('input_data', 'ss', {'in': 0}), + ('ss', 'slice_like_data'), + ('slice_like_data', 'result'), + ('begin', 'begin_data'), + ('begin_data', 'ss', {'in': 1}), + ('shape_like_input', 'shape_like_input_data'), + ('shape_like_input_data', 'shape_like'), + ('shape_like', 'shape_like_data'), + ('shape_like_data', 'rank_like_1_d'), + ('rank_like_1_d', 'rank_like_1_d_data'), + ('rank_like_1_d_data', 'rank_like', {'in': 0}), + ('rank_like_const', 'rank_like_const_data'), + ('rank_like_const_data', 'rank_like', {'in': 1}), + ('end_idx_like', 'end_idx_like_data'), + ('end_idx_like_const', 'end_idx_like_const_data'), + ('end_idx_like_data', 'end_idx_like_add', {'in': 0}), + ('end_idx_like_const_data', 'end_idx_like_add', {'in': 1}), + ('end_idx_like_add', 'end_idx_like_add_data'), + ('end_idx_like_add_data', 'range_like', {'in': 1}), + ('start_idx_like', 'start_idx_like_data'), + ('start_idx_like_data', 'range_like', {'in': 0}), + ('delta_like', 'delta_like_data'), + ('delta_like_data', 'range_like', {'in': 2}), + ('range_like', 'range_like_data'), + ('range_like_data', 'gather_like', {'in': 1}), + ('shape_like_data', 'gather_like', {'in': 0}), + ('gather_like_axis', 'gather_like_axis_data'), + ('gather_like_axis_data', 'gather_like', {'in': 2}), + ('gather_like', 'gather_like_data') +] + +last_axis_index = shape_like_sub_graph_edges + [('gather_like_data', 'ss', {'in': 2})] + +input_sub_graph_edges = [ + ('input_data', 'shape'), + ('shape', 'shape_data'), + ('shape_data', 'rank_1_d'), + ('rank_1_d', 'rank_1_d_data'), + ('rank_1_d_data', 'rank', {'in': 0}), + ('rank_const', 'rank_const_data'), + ('rank_const_data', 'rank', {'in': 1}), + ('rank', 'rank_data'), + ('rank_data', 'end_idx', {'in': 0}), + ('end_idx_axis', 'end_idx_axis_data'), + ('end_idx_axis_data', 'end_idx', {'in': 1}), + ('end_idx', 'end_idx_data'), + ('end_idx_data', 'end_idx_add', {'in': 0}), + ('end_idx_const', 'end_idx_const_data'), + ('end_idx_const_data', 'end_idx_add', {'in': 1}), + ('start_idx', 'start_idx_data'), + ('start_idx_data', 'start_idx_add', {'in': 0}), + ('start_idx_const', 'start_idx_const_data'), + ('start_idx_const_data', 'start_idx_add', {'in': 1}), + ('end_idx_add', 'end_idx_add_data'), + ('start_idx_add', 'start_idx_add_data'), + ('delta', 'delta_data'), + ('start_idx_add_data', 'range', {'in': 0}), + ('end_idx_add_data', 'range', {'in': 1}), + ('delta_data', 'range', {'in': 2}), + ('range', 'range_data'), + ('range_data', 't_gather', {'in': 1}), + ('shape_data', 't_gather', {'in': 0}), + ('gather_axis', 'gather_axis_data'), + ('gather_axis_data', 't_gather', {'in': 2}), + ('t_gather', 'gather_data'), + ('gather_data', 'concat', {'in': 1}), + ('concat', 'concat_data'), + ('concat_data', 'ss', {'in': 2}), + ('gather_like_data', 'concat', {'in': 0}) +] + +input_part_shape_edges = shape_like_sub_graph_edges + input_sub_graph_edges + + +class SliceLikeToStridedSliceTest(unittest.TestCase): + + def test_1(self): + graph = build_graph( + nodes_attributes, + edges, + update_attributes={ + 'input_data': {'shape': int64_array([1, 224, 224, 3])}, + 'shape_like_input_data': {'shape': int64_array([2, 2, 2, 2])}, + 'slice_like': {'axes': int64_array([2, 3])} + }, + nodes_with_edges_only=True + ) + SliceLikeToStridedSlice().find_and_replace_pattern(graph) + ref_graph = build_graph( + nodes_attributes, + same_input_shapes_dims_edges, + nodes_with_edges_only=True + ) + + flag, resp = compare_graphs(graph, ref_graph, 'result') + self.assertTrue(flag, resp) + + def test_2(self): + graph = build_graph( + nodes_attributes, + edges, + update_attributes={ + 'input_data': {'shape': int64_array([1, 224, 224, 3])}, + 'shape_like_input_data': {'shape': int64_array([2, 2, 2, 2, 2])}, + 'slice_like': {'axes': int64_array([2, 3])} + }, + nodes_with_edges_only=True + ) + SliceLikeToStridedSlice().find_and_replace_pattern(graph) + ref_graph = build_graph( + nodes_attributes, + last_axis_index, + nodes_with_edges_only=True + ) + + flag, resp = compare_graphs(graph, ref_graph, 'result') + self.assertTrue(flag, resp) + + def test_3(self): + graph = build_graph( + nodes_attributes, + edges, + update_attributes={ + 'input_data': {'shape': int64_array([1, 224, 224, 3])}, + 'shape_like_input_data': {'shape': int64_array([2, 2, 2, 2, 2])}, + 'slice_like': {'axes': int64_array([1, 2])} + }, + nodes_with_edges_only=True + ) + SliceLikeToStridedSlice().find_and_replace_pattern(graph) + ref_graph = build_graph( + nodes_attributes, + input_part_shape_edges, + nodes_with_edges_only=True + ) + flag, resp = compare_graphs(graph, ref_graph, 'result') + self.assertTrue(flag, resp) diff --git a/model-optimizer/extensions/middle/UselessStridedSlice.py b/model-optimizer/extensions/middle/UselessStridedSlice.py deleted file mode 100644 index 55fcf8c0406..00000000000 --- a/model-optimizer/extensions/middle/UselessStridedSlice.py +++ /dev/null @@ -1,92 +0,0 @@ -""" - Copyright (C) 2018-2020 Intel Corporation - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -""" - -import logging as log - -import numpy as np - -from extensions.middle.ConvertGroupedStridedSlice import ConvertGroupedStridedSlice -from extensions.middle.SliceConverter import ConvertSlice -from mo.front.common.partial_infer.utils import int64_array -from mo.graph.graph import Graph -from mo.middle.passes.eliminate import remove_op_node_with_data_node -from mo.middle.replacement import MiddleReplacementPattern - - -class UselessStridedSliceEraser(MiddleReplacementPattern): - enabled = True - force_shape_inference = True - - def run_before(self): - return [ConvertGroupedStridedSlice] - - def run_after(self): - return [ConvertSlice] - - @staticmethod - def pattern(): - return dict( - nodes=[('strided_slice', dict(kind='op', op='StridedSlice'))], - edges=[] - ) - - @staticmethod - def replace_pattern(graph: Graph, match: dict): - node_ss = match['strided_slice'] - # slices = [elem for elem in node_ss.slices if elem is not None] - # node_ss.slices = np.array(slices) - - if node_ss.out_port(0).data.get_value() is not None: - # StridedSlices(SS) in shape-calculating sub-graphs that should not be deleted that easily - # Example: - # In RetinaNetFilteredDetectionsReplacement we have SS that slices first batch - # We delete such SS for batch 1, but it should be performed while reshaping the model - return - - output_data_node = node_ss.out_node(0) - input_data_node = node_ss.in_node(0) - - out_shape = output_data_node.shape - - if not np.all(node_ss.shrink_axis_mask == 0): - out_shape = list(out_shape) - for i in range(len(node_ss.shrink_axis_mask)): - if node_ss.shrink_axis_mask[i] == 1: - out_shape.insert(i, 1) - out_shape = int64_array(out_shape) - - if not np.all(node_ss.new_axis_mask == 0): - out_shape = list(out_shape) - for i in reversed(range(len(node_ss.new_axis_mask))): - if node_ss.new_axis_mask[i] == 1: - out_shape.pop(i) - out_shape = int64_array(out_shape) - - if np.array_equal(input_data_node.shape, out_shape) and \ - all(elem.step == 1 for elem in match['strided_slice'].slices): - if not np.all(node_ss.shrink_axis_mask == 0): - ConvertGroupedStridedSlice.add_squeeze_for_shrink(graph, node_ss) - if not np.all(node_ss.new_axis_mask == 0): - ConvertGroupedStridedSlice.add_unsqueeze_for_new(graph, node_ss) - - log.info("Useless StridedSlice op '{}' has been detected".format(match['strided_slice'].id)) - # remove inputs to Strided Slice so it has just one input with data so we can use 'remove_op_node' function - graph.remove_edge(match['strided_slice'].in_node(1).id, match['strided_slice'].id) - graph.remove_edge(match['strided_slice'].in_node(2).id, match['strided_slice'].id) - if len(match['strided_slice'].in_nodes()) > 3: - graph.remove_edge(match['strided_slice'].in_node(3).id, match['strided_slice'].id) - - remove_op_node_with_data_node(graph, match['strided_slice']) diff --git a/model-optimizer/extensions/middle/UselessStridedSlice_test.py b/model-optimizer/extensions/middle/UselessStridedSlice_test.py deleted file mode 100644 index 4b90ff98fbf..00000000000 --- a/model-optimizer/extensions/middle/UselessStridedSlice_test.py +++ /dev/null @@ -1,282 +0,0 @@ -""" - Copyright (C) 2018-2020 Intel Corporation - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -""" -import unittest - -from extensions.middle.UselessStridedSlice import UselessStridedSliceEraser -from mo.front.common.partial_infer.utils import int64_array -from mo.middle.passes.eliminate import shape_inference -from mo.utils.ir_engine.compare_graphs import compare_graphs -from mo.utils.unittest.graph import build_graph - -nodes_attributes = { - # input data - 'placeholder': {'type': 'Parameter', 'kind': 'op', 'op': 'Parameter'}, - 'placeholder_data': {'value': None, 'shape': int64_array([4, 1, 6]), 'kind': 'data', 'data_type': None}, - # - 'strided_slice': {'type': 'StridedSlice', 'kind': 'op', 'op': 'StridedSlice', - 'shrink_axis_mask': int64_array([0, 0, 0]), 'new_axis_mask': int64_array([0, 0, 0]), - 'slices': [slice(0, 4, 1), slice(0, 1, 1), slice(0, 6, 1)]}, - 'strided_slice_data': {'value': None, 'shape': int64_array([4, 1, 6]), 'kind': 'data'}, - 'strided_slice_input_1_data': {'value': None, 'shape': int64_array([3]), 'kind': 'data'}, - 'strided_slice_input_2_data': {'value': None, 'shape': int64_array([3]), 'kind': 'data'}, - 'strided_slice_input_3_data': {'value': None, 'shape': int64_array([3]), 'kind': 'data'}, - # - 'strided_slice_2': {'type': 'StridedSlice', 'kind': 'op', 'op': 'StridedSlice', - 'shrink_axis_mask': int64_array([0, 0, 0]), 'new_axis_mask': int64_array([0, 0, 0]), - 'slices': [slice(0, 4, 1), slice(0, 1, 1), slice(0, 6, 1)]}, - 'strided_slice_2_data': {'value': None, 'shape': int64_array([4, 1, 6]), 'kind': 'data'}, - # Output operation - 'output_op': {'kind': 'op', 'op': 'Result'}, - # squeeze op - 'squeeze': {'type': 'Squeeze', 'kind': 'op', 'op': 'Squeeze'}, - 'squeeze_const': {'type': 'Const', 'kind': 'op', 'op': 'Const', 'value': int64_array([1])}, - 'squeeze_const_data': {'kind': 'data'}, - # unsqueeze op - 'unsqueeze': {'type': None, 'kind': 'op', 'op': 'Unsqueeze'}, - 'unsqueeze_const': {'type': 'Const', 'kind': 'op', 'op': 'Const', 'value': int64_array([1])}, - 'unsqueeze_const_data': {'kind': 'data'}, - 'unsqueeze_data': {'value': None, 'shape': int64_array([4, 6]), 'kind': 'data'}, -} - - -class UselessStridedSliceTests(unittest.TestCase): - def test_single_stride_slice_removal(self): - graph = build_graph(nodes_attributes, - [('placeholder', 'placeholder_data'), - ('placeholder_data', 'strided_slice'), - ('strided_slice_input_1_data', 'strided_slice'), - ('strided_slice_input_2_data', 'strided_slice'), - ('strided_slice_input_3_data', 'strided_slice'), - ('strided_slice', 'strided_slice_data'), - ('strided_slice_data', 'output_op'), - ], - {}, - nodes_with_edges_only=True - ) - - UselessStridedSliceEraser().find_and_replace_pattern(graph) - shape_inference(graph) - - graph_ref = build_graph(nodes_attributes, - [('placeholder', 'placeholder_data'), - ('placeholder_data', 'output_op'), - ], - {'placeholder_data': {'shape': int64_array([4, 1, 6])}}, - nodes_with_edges_only=True - ) - (flag, resp) = compare_graphs(graph, graph_ref, 'output_op', check_op_attrs=True) - self.assertTrue(flag, resp) - - def test_single_stride_slice_with_shrink_removal(self): - graph = build_graph(nodes_attributes, - [('placeholder', 'placeholder_data'), - ('placeholder_data', 'strided_slice'), - ('strided_slice_input_1_data', 'strided_slice'), - ('strided_slice_input_2_data', 'strided_slice'), - ('strided_slice_input_3_data', 'strided_slice'), - ('strided_slice', 'strided_slice_data'), - ('strided_slice_data', 'output_op'), - ], - {'strided_slice': {'shrink_axis_mask': int64_array([0, 1, 0])}, - 'strided_slice_data': {'shape': int64_array([4, 6])}}, - nodes_with_edges_only=True - ) - graph.graph['layout'] = 'NCHW' - - UselessStridedSliceEraser().find_and_replace_pattern(graph) - shape_inference(graph) - - graph_ref = build_graph(nodes_attributes, - [('placeholder', 'placeholder_data'), - ('placeholder_data', 'squeeze'), - ('squeeze_const', 'squeeze_const_data'), - ('squeeze_const_data', 'squeeze'), - ('squeeze', 'strided_slice_data'), - ('strided_slice_data', 'output_op') - ], - {'placeholder_data': {'shape': int64_array([4, 1, 6])}, - 'strided_slice_data': {'shape': int64_array([4, 6])}}, - nodes_with_edges_only=True - ) - (flag, resp) = compare_graphs(graph, graph_ref, 'output_op', check_op_attrs=True) - self.assertTrue(flag, resp) - - def test_single_stride_slice_with_new_removal(self): - graph = build_graph(nodes_attributes, - [('placeholder', 'placeholder_data'), - ('placeholder_data', 'strided_slice'), - ('strided_slice_input_1_data', 'strided_slice'), - ('strided_slice_input_2_data', 'strided_slice'), - ('strided_slice_input_3_data', 'strided_slice'), - ('strided_slice', 'strided_slice_data'), - ('strided_slice_data', 'output_op'), - ], - {'strided_slice': {'new_axis_mask': int64_array([0, 1, 0, 0])}, - 'strided_slice_data': {'shape': int64_array([4, 1, 1, 6])}}, - nodes_with_edges_only=True - ) - graph.graph['layout'] = 'NCHW' - - UselessStridedSliceEraser().find_and_replace_pattern(graph) - shape_inference(graph) - - graph_ref = build_graph(nodes_attributes, - [('placeholder', 'placeholder_data'), - ('placeholder_data', 'unsqueeze'), - ('unsqueeze_const', 'unsqueeze_const_data'), - ('unsqueeze_const_data', 'unsqueeze'), - ('unsqueeze', 'strided_slice_data'), - ('strided_slice_data', 'output_op') - ], - {'placeholder_data': {'shape': int64_array([4, 1, 6])}, - 'strided_slice_data': {'shape': int64_array([4, 1, 1, 6])}}, - nodes_with_edges_only=True - ) - (flag, resp) = compare_graphs(graph, graph_ref, 'output_op', check_op_attrs=True) - self.assertTrue(flag, resp) - - def test_single_stride_slice_with_shrink_and_new_removal(self): - graph = build_graph(nodes_attributes, - [('placeholder', 'placeholder_data'), - ('placeholder_data', 'strided_slice'), - ('strided_slice_input_1_data', 'strided_slice'), - ('strided_slice_input_2_data', 'strided_slice'), - ('strided_slice_input_3_data', 'strided_slice'), - ('strided_slice', 'strided_slice_data'), - ('strided_slice_data', 'output_op'), - ], - {'strided_slice': {'shrink_axis_mask': int64_array([0, 1, 0, 0]), - 'new_axis_mask': int64_array([0, 0, 1, 0])}, - 'strided_slice_data': {'shape': int64_array([4, 1, 6])}}, - nodes_with_edges_only=True - ) - graph.graph['layout'] = 'NCHW' - - UselessStridedSliceEraser().find_and_replace_pattern(graph) - shape_inference(graph) - - graph_ref = build_graph(nodes_attributes, - [('placeholder', 'placeholder_data'), - ('placeholder_data', 'unsqueeze'), - ('unsqueeze_const', 'unsqueeze_const_data'), - ('unsqueeze_const_data', 'unsqueeze'), - ('unsqueeze', 'unsqueeze_data'), - ('unsqueeze_data', 'squeeze'), - ('squeeze_const', 'squeeze_const_data'), - ('squeeze_const_data', 'squeeze'), - ('squeeze', 'strided_slice_data'), - ('strided_slice_data', 'output_op') - ], - {'placeholder_data': {'shape': int64_array([4, 1, 6])}, - 'unsqueeze_data': {'shape': int64_array([4, 1, 1, 6])}, - 'strided_slice_data': {'shape': int64_array([4, 1, 6])}, - 'unsqueeze_const': {'value': int64_array([2])}, - }, - nodes_with_edges_only=True - ) - (flag, resp) = compare_graphs(graph, graph_ref, 'output_op', check_op_attrs=True) - self.assertTrue(flag, resp) - - def test_single_stride_slice_with_new_and_shrink_removal(self): - graph = build_graph(nodes_attributes, - [('placeholder', 'placeholder_data'), - ('placeholder_data', 'strided_slice'), - ('strided_slice_input_1_data', 'strided_slice'), - ('strided_slice_input_2_data', 'strided_slice'), - ('strided_slice_input_3_data', 'strided_slice'), - ('strided_slice', 'strided_slice_data'), - ('strided_slice_data', 'output_op'), - ], - {'strided_slice': {'shrink_axis_mask': int64_array([0, 0, 1, 0]), - 'new_axis_mask': int64_array([0, 1, 0, 0])}, - 'strided_slice_data': {'shape': int64_array([4, 1, 6])}}, - nodes_with_edges_only=True - ) - graph.graph['layout'] = 'NCHW' - - UselessStridedSliceEraser().find_and_replace_pattern(graph) - shape_inference(graph) - - graph_ref = build_graph(nodes_attributes, - [('placeholder', 'placeholder_data'), - ('placeholder_data', 'unsqueeze'), - ('unsqueeze_const', 'unsqueeze_const_data'), - ('unsqueeze_const_data', 'unsqueeze'), - ('unsqueeze', 'unsqueeze_data'), - ('unsqueeze_data', 'squeeze'), - ('squeeze_const', 'squeeze_const_data'), - ('squeeze_const_data', 'squeeze'), - ('squeeze', 'strided_slice_data'), - ('strided_slice_data', 'output_op') - ], - {'unsqueeze_data': {'shape': int64_array([4, 1, 1, 6])}, - 'strided_slice_data': {'shape': int64_array([4, 1, 6])}, - 'squeeze_const': {'value': int64_array([2])}, - }, - nodes_with_edges_only=True - ) - - (flag, resp) = compare_graphs(graph, graph_ref, 'output_op', check_op_attrs=True) - self.assertTrue(flag, resp) - - def test_consecutive_stride_slices_removal(self): - graph = build_graph(nodes_attributes, - [('placeholder', 'placeholder_data'), - ('placeholder_data', 'strided_slice'), - ('strided_slice_input_1_data', 'strided_slice'), - ('strided_slice_input_2_data', 'strided_slice'), - ('strided_slice_input_3_data', 'strided_slice'), - ('strided_slice', 'strided_slice_data'), - ('strided_slice_data', 'strided_slice_2'), - ('strided_slice_input_1_data', 'strided_slice_2'), - ('strided_slice_input_2_data', 'strided_slice_2'), - ('strided_slice_input_3_data', 'strided_slice_2'), - ('strided_slice_2', 'strided_slice_2_data'), - ('strided_slice_2_data', 'output_op'), - ], - {}, - nodes_with_edges_only=True - ) - - UselessStridedSliceEraser().find_and_replace_pattern(graph) - shape_inference(graph) - - graph_ref = build_graph(nodes_attributes, - [('placeholder', 'placeholder_data'), - ('placeholder_data', 'output_op'), - ], - {'placeholder_data': {'shape': int64_array([4, 1, 6])}} - ) - (flag, resp) = compare_graphs(graph, graph_ref, 'output_op', check_op_attrs=True) - self.assertTrue(flag, resp) - - def test_negative(self): - graph = build_graph(nodes_attributes, - [('placeholder', 'placeholder_data'), - ('placeholder_data', 'strided_slice'), - ('strided_slice_input_1_data', 'strided_slice'), - ('strided_slice_input_2_data', 'strided_slice'), - ('strided_slice_input_3_data', 'strided_slice'), - ('strided_slice', 'strided_slice_data'), - ('strided_slice_data', 'output_op'), - ], - {'strided_slice_data': {'value': []}}, - nodes_with_edges_only=True - ) - graph_ref = graph.copy() - UselessStridedSliceEraser().find_and_replace_pattern(graph) - (flag, resp) = compare_graphs(graph, graph_ref, 'output_op', check_op_attrs=True) - self.assertTrue(flag, resp) diff --git a/model-optimizer/extensions/middle/ssd_anchors_to_const.py b/model-optimizer/extensions/middle/ssd_anchors_to_const.py index bf9b6575e8c..a6896ca93cf 100644 --- a/model-optimizer/extensions/middle/ssd_anchors_to_const.py +++ b/model-optimizer/extensions/middle/ssd_anchors_to_const.py @@ -17,6 +17,7 @@ import numpy as np from extensions.middle.AnchorToPriorBox import AnchorToPriorBoxes +from extensions.middle.SliceLikeToStridedSlice import SliceLikeToStridedSlice from mo.graph.graph import Graph from mo.middle.replacement import MiddleReplacementPattern from mo.ops.const import Const @@ -33,6 +34,9 @@ class SsdAnchorsMiddleReplacer(MiddleReplacementPattern): def run_after(self): return [AnchorToPriorBoxes] + def run_before(self): + return [SliceLikeToStridedSlice] + def pattern(self): return dict( diff --git a/model-optimizer/extensions/ops/BlockLSTM.py b/model-optimizer/extensions/ops/BlockLSTM.py index 4256ad55e90..de670dec48b 100644 --- a/model-optimizer/extensions/ops/BlockLSTM.py +++ b/model-optimizer/extensions/ops/BlockLSTM.py @@ -26,7 +26,7 @@ class BlockLSTM(Op): mandatory_props = { 'op': __class__.op, 'infer': __class__.infer, - 'type': __class__.op, + 'type': None, } super().__init__(graph, mandatory_props, attrs) diff --git a/model-optimizer/extensions/ops/Cast.py b/model-optimizer/extensions/ops/Cast.py index 572d2170e33..abc25065fd4 100644 --- a/model-optimizer/extensions/ops/Cast.py +++ b/model-optimizer/extensions/ops/Cast.py @@ -30,6 +30,7 @@ class Cast(Op): mandatory_props = { 'op': __class__.op, 'type': 'Convert', + 'version': 'opset1', 'infer': __class__.infer, 'type_infer': __class__.type_infer, 'dst_type': None, diff --git a/model-optimizer/extensions/ops/DetectionOutput.py b/model-optimizer/extensions/ops/DetectionOutput.py index 8b70f1ee2b9..9a7f52c7207 100644 --- a/model-optimizer/extensions/ops/DetectionOutput.py +++ b/model-optimizer/extensions/ops/DetectionOutput.py @@ -28,6 +28,7 @@ class DetectionOutput(Op): super().__init__(graph, { 'type': self.op, 'op': self.op, + 'version': 'opset1', 'in_ports_count': 3, 'out_ports_count': 1, 'infer': multi_box_detection_infer, diff --git a/model-optimizer/extensions/ops/Enter.py b/model-optimizer/extensions/ops/Enter.py index 167c6b21884..8c9330580ea 100644 --- a/model-optimizer/extensions/ops/Enter.py +++ b/model-optimizer/extensions/ops/Enter.py @@ -25,7 +25,7 @@ class Enter(Op): def __init__(self, graph: Graph, attrs: dict): mandatory_props = { - 'type': __class__.op, + 'type': None, 'op': __class__.op, 'in_ports_count': 1, 'infer': Enter.enter_infer, diff --git a/model-optimizer/extensions/ops/Exit.py b/model-optimizer/extensions/ops/Exit.py index cd2a48ffd20..ba64e892648 100644 --- a/model-optimizer/extensions/ops/Exit.py +++ b/model-optimizer/extensions/ops/Exit.py @@ -25,7 +25,7 @@ class Exit(Op): def __init__(self, graph: Graph, attrs: dict): mandatory_props = { - 'type': __class__.op, + 'type': None, 'op': __class__.op, 'infer': Exit.exit_infer, 'in_ports_count': 1, diff --git a/model-optimizer/extensions/ops/GRUCell.py b/model-optimizer/extensions/ops/GRUCell.py index d05980aacd4..fbcb2fb1542 100644 --- a/model-optimizer/extensions/ops/GRUCell.py +++ b/model-optimizer/extensions/ops/GRUCell.py @@ -39,6 +39,7 @@ class GRUCell(Op): mandatory_props = { 'type': __class__.op, 'op': __class__.op, + 'version': 'experimental', 'infer': __class__.infer, 'in_ports_count': 4, 'out_ports_count': 1, diff --git a/model-optimizer/extensions/ops/GatherTree.py b/model-optimizer/extensions/ops/GatherTree.py index 004845eaa29..4dc40de7a01 100644 --- a/model-optimizer/extensions/ops/GatherTree.py +++ b/model-optimizer/extensions/ops/GatherTree.py @@ -25,6 +25,7 @@ class GatherTree(Op): mandatory_props = { 'op': __class__.op, 'type': __class__.op, + 'version': 'opset1', 'infer': __class__.infer, 'in_ports_count': 4, 'out_ports_count': 1, diff --git a/model-optimizer/extensions/ops/Log.py b/model-optimizer/extensions/ops/Log.py deleted file mode 100644 index a5e07e1610c..00000000000 --- a/model-optimizer/extensions/ops/Log.py +++ /dev/null @@ -1,43 +0,0 @@ -""" - Copyright (C) 2018-2020 Intel Corporation - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -""" -import numpy as np - -from mo.graph.graph import Node, Graph -from mo.ops.op import Op - - -class LogOp(Op): - op = 'Log' - - def __init__(self, graph: Graph, attrs: dict): - mandatory_props = { - 'type': __class__.op, - 'op': __class__.op, - 'infer': __class__.infer, - 'in_ports_count': 1, - 'out_ports_count': 1, - } - super().__init__(graph, mandatory_props, attrs) - - @staticmethod - def infer(node: Node): - assert len(node.in_nodes()) == 1 - assert len(node.out_nodes()) == 1 - input_node = node.in_node() - - node.out_node(0).shape = input_node.shape.copy() - if input_node.has_valid('value'): - node.out_node(0).value = np.array(np.log(input_node.value)) diff --git a/model-optimizer/extensions/ops/MatMul.py b/model-optimizer/extensions/ops/MatMul.py index cc2b3211250..d96e47c144f 100644 --- a/model-optimizer/extensions/ops/MatMul.py +++ b/model-optimizer/extensions/ops/MatMul.py @@ -69,6 +69,7 @@ class MatMul(Op): mandatory_props = { 'type': self.op, 'op': self.op, + 'version': 'opset1', 'transpose_a': False, 'transpose_b': False, 'infer': __class__.infer, diff --git a/model-optimizer/extensions/ops/NextIteration.py b/model-optimizer/extensions/ops/NextIteration.py index 80b76025876..35b28e3ad45 100644 --- a/model-optimizer/extensions/ops/NextIteration.py +++ b/model-optimizer/extensions/ops/NextIteration.py @@ -25,7 +25,7 @@ class NextIteration(Op): def __init__(self, graph: Graph, attrs: dict): mandatory_props = { - 'type': __class__.op, + 'type': None, 'op': __class__.op, 'in_ports_count': 1, 'infer': NextIteration.enter_infer, diff --git a/model-optimizer/extensions/ops/RNNCell.py b/model-optimizer/extensions/ops/RNNCell.py index db62e3de8af..cb0a94a88cb 100644 --- a/model-optimizer/extensions/ops/RNNCell.py +++ b/model-optimizer/extensions/ops/RNNCell.py @@ -39,6 +39,7 @@ class RNNCell(Op): mandatory_props = { 'type': __class__.op, 'op': __class__.op, + 'version': 'experimental', 'infer': __class__.infer, 'in_ports_count': 4, 'out_ports_count': 1, diff --git a/model-optimizer/extensions/ops/ReduceOps.py b/model-optimizer/extensions/ops/ReduceOps.py index 65d05fa79c4..7867acefd15 100644 --- a/model-optimizer/extensions/ops/ReduceOps.py +++ b/model-optimizer/extensions/ops/ReduceOps.py @@ -90,6 +90,7 @@ class ReduceOp(Op): super().__init__(graph, { 'op': self.op, 'type': self.op_type, + 'version': 'opset1', 'infer': reduce_infer, 'keep_dims': 0, 'in_ports_count': 2, diff --git a/model-optimizer/extensions/ops/TensorArray.py b/model-optimizer/extensions/ops/TensorArray.py index 9426142c0f2..fcb6e2975cf 100644 --- a/model-optimizer/extensions/ops/TensorArray.py +++ b/model-optimizer/extensions/ops/TensorArray.py @@ -25,7 +25,7 @@ class TensorArray(Op): def __init__(self, graph: Graph, attrs: dict): mandatory_props = { - 'type': __class__.op, + 'type': None, 'op': __class__.op, 'infer': TensorArray.array_infer, } diff --git a/model-optimizer/extensions/ops/TensorArrayGather.py b/model-optimizer/extensions/ops/TensorArrayGather.py index eddc0a8228f..82a0362008a 100644 --- a/model-optimizer/extensions/ops/TensorArrayGather.py +++ b/model-optimizer/extensions/ops/TensorArrayGather.py @@ -26,7 +26,7 @@ class TensorArrayGather(Op): def __init__(self, graph: Graph, attrs: dict): mandatory_props = { - 'type': __class__.op, + 'type': None, 'op': __class__.op, 'infer': TensorArrayGather.array_infer, } diff --git a/model-optimizer/extensions/ops/TensorArrayRead.py b/model-optimizer/extensions/ops/TensorArrayRead.py index d16b2f4dcaa..0fd4782f486 100644 --- a/model-optimizer/extensions/ops/TensorArrayRead.py +++ b/model-optimizer/extensions/ops/TensorArrayRead.py @@ -25,7 +25,7 @@ class TensorArrayReader(Op): def __init__(self, graph: Graph, attrs: dict): mandatory_props = { - 'type': __class__.op, + 'type': None, 'op': __class__.op, 'infer': TensorArrayReader.array_infer, } diff --git a/model-optimizer/extensions/ops/TensorArrayScatter.py b/model-optimizer/extensions/ops/TensorArrayScatter.py index 176c34d3aa7..6575f2736d7 100644 --- a/model-optimizer/extensions/ops/TensorArrayScatter.py +++ b/model-optimizer/extensions/ops/TensorArrayScatter.py @@ -26,7 +26,7 @@ class TensorArrayScatter(Op): def __init__(self, graph: Graph, attrs: dict): mandatory_props = { - 'type': __class__.op, + 'type': None, 'op': __class__.op, 'infer': TensorArrayScatter.array_infer, } diff --git a/model-optimizer/extensions/ops/TensorArraySize.py b/model-optimizer/extensions/ops/TensorArraySize.py index c4951d5dd02..114def202a4 100644 --- a/model-optimizer/extensions/ops/TensorArraySize.py +++ b/model-optimizer/extensions/ops/TensorArraySize.py @@ -25,7 +25,7 @@ class TensorArraySize(Op): def __init__(self, graph: Graph, attrs: dict): mandatory_props = { - 'type': __class__.op, + 'type': None, 'op': __class__.op, 'infer': TensorArraySize.array_infer, } diff --git a/model-optimizer/extensions/ops/TensorArrayWrite.py b/model-optimizer/extensions/ops/TensorArrayWrite.py index fa4d50a91a2..6c8171cf154 100644 --- a/model-optimizer/extensions/ops/TensorArrayWrite.py +++ b/model-optimizer/extensions/ops/TensorArrayWrite.py @@ -26,7 +26,7 @@ class TensorArrayWriter(Op): def __init__(self, graph: Graph, attrs: dict): mandatory_props = { - 'type': __class__.op, + 'type': None, 'op': __class__.op, 'infer': TensorArrayWriter.array_infer, } diff --git a/model-optimizer/extensions/ops/accum.py b/model-optimizer/extensions/ops/accum.py index 12a614dd521..d52833928cc 100644 --- a/model-optimizer/extensions/ops/accum.py +++ b/model-optimizer/extensions/ops/accum.py @@ -27,6 +27,7 @@ class AccumOp(Op): mandatory_props = { 'type': __class__.op, 'op': __class__.op, + 'version': 'extension', 'top_height': 0, 'top_width': 0, 'size_divisible_by': 0, diff --git a/model-optimizer/extensions/ops/activation_ops.py b/model-optimizer/extensions/ops/activation_ops.py index fb105eaeb92..cd4282bf4ae 100644 --- a/model-optimizer/extensions/ops/activation_ops.py +++ b/model-optimizer/extensions/ops/activation_ops.py @@ -34,6 +34,7 @@ class Activation(Op): 'type': self.op, 'op': self.op, 'operation': self.operation, + 'version': 'opset1', 'infer': self.infer, 'in_ports_count': 1, 'out_ports_count': 1, diff --git a/model-optimizer/extensions/ops/argmax.py b/model-optimizer/extensions/ops/argmax.py index 52c1a93a16d..366f130327c 100644 --- a/model-optimizer/extensions/ops/argmax.py +++ b/model-optimizer/extensions/ops/argmax.py @@ -31,6 +31,7 @@ class ArgMaxOp(Op): 'type': __class__.op, 'op': __class__.op, 'infer': ArgMaxOp.argmax_infer, + 'output_type': np.int64, 'in_ports_count': 2, 'out_ports_count': 1, } diff --git a/model-optimizer/extensions/ops/axpy.py b/model-optimizer/extensions/ops/axpy.py index ce3fff5235e..c2438765448 100644 --- a/model-optimizer/extensions/ops/axpy.py +++ b/model-optimizer/extensions/ops/axpy.py @@ -27,7 +27,7 @@ class AxpyOp(Op): def __init__(self, graph: Graph, attrs: dict): super().__init__(graph, { - 'type': __class__.op, + 'type': None, 'op': __class__.op, 'infer': None }, attrs) diff --git a/model-optimizer/extensions/ops/bn.py b/model-optimizer/extensions/ops/bn.py index 94b5e2e9ad4..ae3edc02bc5 100644 --- a/model-optimizer/extensions/ops/bn.py +++ b/model-optimizer/extensions/ops/bn.py @@ -27,7 +27,7 @@ class BNOp(Op): def __init__(self, graph: Graph, attrs: dict): super().__init__(graph, { - 'type': __class__.op, + 'type': None, 'op': __class__.op, 'in_ports_count': 5, 'out_ports_count': 1, diff --git a/model-optimizer/extensions/ops/box_nms.py b/model-optimizer/extensions/ops/box_nms.py index 9f96affb158..affcccc8ba9 100644 --- a/model-optimizer/extensions/ops/box_nms.py +++ b/model-optimizer/extensions/ops/box_nms.py @@ -27,7 +27,7 @@ class BoxNms(Op): def __init__(self, graph: Graph, attrs: dict): mandatory_props = { - 'type': __class__.op, + 'type': None, 'op': __class__.op, 'coord_start': 2, 'force_suppress': False, diff --git a/model-optimizer/extensions/ops/bucketize.py b/model-optimizer/extensions/ops/bucketize.py index 9255a732dac..9e98a6268aa 100644 --- a/model-optimizer/extensions/ops/bucketize.py +++ b/model-optimizer/extensions/ops/bucketize.py @@ -28,6 +28,7 @@ class Bucketize(Op): 'kind': 'op', 'type': __class__.op, 'op': __class__.op, + 'version': 'extension', 'type_infer': self.type_infer, 'infer': self.infer, 'in_ports_count': 2, diff --git a/model-optimizer/extensions/ops/constant_fill.py b/model-optimizer/extensions/ops/constant_fill.py index 2e9714165b3..46cabbf914d 100644 --- a/model-optimizer/extensions/ops/constant_fill.py +++ b/model-optimizer/extensions/ops/constant_fill.py @@ -30,7 +30,7 @@ class ConstantFill(Op): def __init__(self, graph: Graph, attrs: dict): mandatory_props = { - 'type': __class__.op, + 'type': None, 'op': __class__.op, 'input_as_shape': 1, 'in_ports_count': 1, diff --git a/model-optimizer/extensions/ops/copyop.py b/model-optimizer/extensions/ops/copyop.py index 20d5d8a03d3..dbd0977a4d0 100644 --- a/model-optimizer/extensions/ops/copyop.py +++ b/model-optimizer/extensions/ops/copyop.py @@ -27,7 +27,7 @@ class CopyOp(Op): def __init__(self, graph: Graph, attrs: dict): super().__init__(graph, { - 'type': __class__.op, + 'type': None, 'op': __class__.op, 'infer': None }, attrs) diff --git a/model-optimizer/extensions/ops/correlation.py b/model-optimizer/extensions/ops/correlation.py index c214ad2784b..b0396435f0f 100644 --- a/model-optimizer/extensions/ops/correlation.py +++ b/model-optimizer/extensions/ops/correlation.py @@ -31,6 +31,7 @@ class CorrelationOp(Op): mandatory_props = { 'type': __class__.op, 'op': __class__.op, + 'version': 'extension', 'in_ports_count': 1, 'out_ports_count': 1, 'infer': CorrelationOp.corr_infer diff --git a/model-optimizer/extensions/ops/ctc_greedy_decoder.py b/model-optimizer/extensions/ops/ctc_greedy_decoder.py index 716f173adb9..9262eac5bfa 100644 --- a/model-optimizer/extensions/ops/ctc_greedy_decoder.py +++ b/model-optimizer/extensions/ops/ctc_greedy_decoder.py @@ -27,6 +27,7 @@ class CTCGreedyDecoderOp(Op): mandatory_props = { 'type': __class__.op, 'op': __class__.op, + 'version': 'opset1', 'in_ports_count': 2, 'out_ports_count': 1, 'infer': CTCGreedyDecoderOp.ctc_greedy_decoder_infer diff --git a/model-optimizer/extensions/ops/data_augmentation.py b/model-optimizer/extensions/ops/data_augmentation.py index 8676c1dad67..55d9074438e 100644 --- a/model-optimizer/extensions/ops/data_augmentation.py +++ b/model-optimizer/extensions/ops/data_augmentation.py @@ -29,6 +29,7 @@ class DataAugmentationOp(Op): mandatory_props = { 'type': __class__.op, 'op': __class__.op, + 'version': 'extension', 'in_ports_count': 1, 'out_ports_count': 1, 'infer': DataAugmentationOp.data_augmentation_infer diff --git a/model-optimizer/extensions/ops/depth_to_space.py b/model-optimizer/extensions/ops/depth_to_space.py index a559f08de50..8b5fe68aee7 100644 --- a/model-optimizer/extensions/ops/depth_to_space.py +++ b/model-optimizer/extensions/ops/depth_to_space.py @@ -30,6 +30,7 @@ class DepthToSpaceOp(Op): mandatory_props = { 'op': self.op, 'type': self.op, + 'version': 'opset1', 'mode': 'blocks_first', diff --git a/model-optimizer/extensions/ops/detectionoutput_onnx.py b/model-optimizer/extensions/ops/detectionoutput_onnx.py index ab89c12956b..0b41185a35c 100644 --- a/model-optimizer/extensions/ops/detectionoutput_onnx.py +++ b/model-optimizer/extensions/ops/detectionoutput_onnx.py @@ -28,6 +28,7 @@ class ExperimentalDetectronDetectionOutput(Op): mandatory_props = dict( type=__class__.op, op=__class__.op, + version='experimental', infer=__class__.infer, type_infer=self.type_infer, in_ports_count=4, diff --git a/model-optimizer/extensions/ops/elementwise.py b/model-optimizer/extensions/ops/elementwise.py index ab9915b4c7c..754287fb9a6 100644 --- a/model-optimizer/extensions/ops/elementwise.py +++ b/model-optimizer/extensions/ops/elementwise.py @@ -35,6 +35,7 @@ class Elementwise(Op): super().__init__(graph, { 'op': self.op, 'type': self.op_type, + 'version': 'opset1', 'infer': lambda node: eltwise_infer(node, self.operation), 'type_infer': self.type_infer, 'can_be_bias': True, @@ -202,6 +203,7 @@ class Round(Elementwise): enabled = False op = 'Round' op_type = None + version = 'extension' operation = staticmethod(lambda a: np.round(a)) diff --git a/model-optimizer/extensions/ops/exp.py b/model-optimizer/extensions/ops/exp.py deleted file mode 100644 index c04beb933f7..00000000000 --- a/model-optimizer/extensions/ops/exp.py +++ /dev/null @@ -1,44 +0,0 @@ -""" - Copyright (C) 2018-2020 Intel Corporation - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -""" - -import numpy as np - -from mo.graph.graph import Node, Graph -from mo.ops.op import Op - - -class ExpOp(Op): - op = 'Exp' - - def __init__(self, graph: Graph, attrs: dict): - mandatory_props = { - 'type': __class__.op, - 'op': __class__.op, - 'infer': __class__.infer, - 'in_ports_count': 1, - 'out_ports_count': 1, - } - super().__init__(graph, mandatory_props, attrs) - - @staticmethod - def infer(node: Node): - assert len(node.in_nodes()) == 1 - assert len(node.out_nodes()) == 1 - input_node = node.in_node() - assert input_node.has_valid('shape') - node.out_node().shape = input_node.shape.copy() - if input_node.has_valid('value'): - node.out_node().value = np.exp(input_node.value) diff --git a/model-optimizer/extensions/ops/exp_test.py b/model-optimizer/extensions/ops/exp_test.py deleted file mode 100644 index 30eee108cfd..00000000000 --- a/model-optimizer/extensions/ops/exp_test.py +++ /dev/null @@ -1,76 +0,0 @@ -""" - Copyright (C) 2018-2020 Intel Corporation - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -""" - -import unittest - -import numpy as np - -from extensions.ops.exp import ExpOp -from mo.graph.graph import Node -from mo.utils.unittest.graph import build_graph - -nodes_attributes = {'node_1': {'op': 'Identity', 'kind': 'op'}, - 'exp': {'op': 'Exp', 'kind': 'op'}, - 'node_3': {'op': 'Identity', 'kind': 'op'}, - 'op_output': {'kind': 'op', 'op': 'Result'} - } - - -class TestExpOp(unittest.TestCase): - def test_shape_only(self): - graph = build_graph(nodes_attributes, - [('node_1', 'exp'), - ('exp', 'node_3'), - ('node_3', 'op_output') - ], - {'node_3': {'shape': None}, - 'node_1': {'shape': np.array([1, 3, 10, 20])}, - }) - - exp_node = Node(graph, 'exp') - ExpOp.infer(exp_node) - exp_shape = np.array([1, 3, 10, 20]) - res_shape = graph.node['node_3']['shape'] - for i in range(0, len(exp_shape)): - self.assertEqual(exp_shape[i], res_shape[i]) - - def test_shape_and_value(self): - graph = build_graph(nodes_attributes, - [('node_1', 'exp'), - ('exp', 'node_3'), - ('node_3', 'op_output') - ], - { - 'node_3': { - 'shape': None, - 'value': None, - }, - 'node_1': { - 'shape': np.array([2]), - 'value': np.array([0, 1], dtype=np.float32), - }, - }) - - exp_node = Node(graph, 'exp') - ExpOp.infer(exp_node) - exp_shape = np.array([2]) - exp_value = np.array([1, 2.7182818], dtype=np.float32) - res_shape = graph.node['node_3']['shape'] - res_value = graph.node['node_3']['value'] - for i in range(0, len(exp_shape)): - self.assertEqual(exp_shape[i], res_shape[i]) - for i in range(0, len(exp_value)): - self.assertAlmostEqual(exp_value[i], res_value[i], places=6) diff --git a/model-optimizer/extensions/ops/fakequantize.py b/model-optimizer/extensions/ops/fakequantize.py index 40569f43646..f9981b1b8dd 100644 --- a/model-optimizer/extensions/ops/fakequantize.py +++ b/model-optimizer/extensions/ops/fakequantize.py @@ -43,6 +43,7 @@ class FakeQuantize(Op): mandatory_props = { 'type': __class__.op, 'op': __class__.op, + 'version': 'opset1', 'levels': None, 'is_eltwise': True, # flag to switch between dumping FakeQuantize as statistics and keeping it as layer in IR diff --git a/model-optimizer/extensions/ops/gather.py b/model-optimizer/extensions/ops/gather.py index 1a25a69de27..6c444cb52c9 100644 --- a/model-optimizer/extensions/ops/gather.py +++ b/model-optimizer/extensions/ops/gather.py @@ -30,6 +30,7 @@ class Gather(Op): super().__init__(graph, { 'op': self.op, 'type': self.op, + 'version': 'opset1', 'infer': self.infer, diff --git a/model-optimizer/extensions/ops/grn.py b/model-optimizer/extensions/ops/grn.py index 8f20683dd25..afcb881238f 100644 --- a/model-optimizer/extensions/ops/grn.py +++ b/model-optimizer/extensions/ops/grn.py @@ -26,6 +26,7 @@ class GRNOp(Op): mandatory_props = { 'type': __class__.op, 'op': __class__.op, + 'version': 'opset1', 'in_ports_count': 1, 'out_ports_count': 1, 'infer': copy_shape_infer diff --git a/model-optimizer/extensions/ops/hard_sigmoid.py b/model-optimizer/extensions/ops/hard_sigmoid.py index f410932db15..52126dec3b5 100644 --- a/model-optimizer/extensions/ops/hard_sigmoid.py +++ b/model-optimizer/extensions/ops/hard_sigmoid.py @@ -28,6 +28,7 @@ class HardSigmoid(Op): super().__init__(graph, { 'op': self.op, 'type': self.op, + 'version': 'opset1', 'infer': self.infer, 'in_ports_count': 3, 'out_ports_count': 1, diff --git a/model-optimizer/extensions/ops/interpolate.py b/model-optimizer/extensions/ops/interpolate.py index 27f465a9f77..0a0e9d27aa9 100644 --- a/model-optimizer/extensions/ops/interpolate.py +++ b/model-optimizer/extensions/ops/interpolate.py @@ -26,6 +26,7 @@ class Interpolate(Op): mandatory_props = { 'op': self.op, 'type': self.op, + 'version': 'opset1', 'axes': None, 'mode': None, diff --git a/model-optimizer/extensions/ops/lstm_cell.py b/model-optimizer/extensions/ops/lstm_cell.py index aaae4c23797..218266d7ee9 100644 --- a/model-optimizer/extensions/ops/lstm_cell.py +++ b/model-optimizer/extensions/ops/lstm_cell.py @@ -42,6 +42,7 @@ class LSTMCell(Op): mandatory_props = { 'type': __class__.op, 'op': __class__.op, + 'version': 'opset1', 'infer': __class__.infer, 'in_ports_count': 5, 'out_ports_count': 2, diff --git a/model-optimizer/extensions/ops/mvn.py b/model-optimizer/extensions/ops/mvn.py index 80ae4ea05b6..79cc28687ce 100644 --- a/model-optimizer/extensions/ops/mvn.py +++ b/model-optimizer/extensions/ops/mvn.py @@ -29,6 +29,7 @@ class MVN(Op): 'kind': 'op', 'type': __class__.op, 'op': __class__.op, + 'version': 'opset2', 'eps': None, 'across_channels': 0, 'normalize_variance': 1, diff --git a/model-optimizer/extensions/ops/non_max_suppression.py b/model-optimizer/extensions/ops/non_max_suppression.py index 82b512dc4c3..66bca864660 100644 --- a/model-optimizer/extensions/ops/non_max_suppression.py +++ b/model-optimizer/extensions/ops/non_max_suppression.py @@ -19,7 +19,9 @@ import numpy as np from mo.front.common.partial_infer.utils import int64_array from mo.graph.graph import Node, Graph +from mo.middle.passes.convert_data_type import np_data_type_to_destination_type from mo.ops.op import Op +from mo.utils.error import Error class NonMaxSuppression(Op): @@ -29,7 +31,9 @@ class NonMaxSuppression(Op): mandatory_props = { 'type': __class__.op, 'op': __class__.op, + 'version': 'opset3', 'infer': __class__.infer, + 'output_type': np.int64, 'center_point_box': 0, 'box_encoding': 'corner', 'in_ports_count': 5, @@ -43,15 +47,16 @@ class NonMaxSuppression(Op): def supported_attrs(self): if self.ir_version < 10: - return [ - 'center_point_box', - ] + return ['center_point_box'] else: - return [ - 'sort_result_descending', - 'box_encoding' - ] - + version = self.get_opset() + if version == 'opset3': + return ['sort_result_descending', 'box_encoding', + ('output_type', lambda node: np_data_type_to_destination_type(node.output_type))] + elif version == 'opset1': + return ['sort_result_descending', 'box_encoding'] + else: + raise Error('Unsupported operation opset version "{}"'.format(version)) @staticmethod def infer(node: Node): @@ -76,5 +81,10 @@ class NonMaxSuppression(Op): @staticmethod def type_infer(node): - node.out_port(0).set_data_type(np.int64 if node.graph.graph['cmd_params'].generate_experimental_IR_V10 else - np.int32) + if not node.graph.graph['cmd_params'].generate_experimental_IR_V10: + node.out_port(0).set_data_type(np.int32) + else: + if node.get_opset() == 'opset3': + node.out_port(0).set_data_type(node.output_type) + else: + node.out_port(0).set_data_type(np.int64) diff --git a/model-optimizer/extensions/ops/non_max_suppression_test.py b/model-optimizer/extensions/ops/non_max_suppression_test.py new file mode 100644 index 00000000000..bf3c1ff3af5 --- /dev/null +++ b/model-optimizer/extensions/ops/non_max_suppression_test.py @@ -0,0 +1,90 @@ +""" + Copyright (C) 2018-2020 Intel Corporation + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +""" + +import unittest + +import numpy as np + +from extensions.ops.non_max_suppression import NonMaxSuppression +from mo.front.common.partial_infer.utils import int64_array +from mo.graph.graph import Node +from mo.utils.unittest.graph import build_graph, regular_op_with_shaped_data, valued_const_with_data, result, \ + connect, FakeAttr + + +class TestNonMaxSuppressionInfer(unittest.TestCase): + def setUp(self): + nodes = { + **regular_op_with_shaped_data('boxes', [10, 100, 4], {'type': 'Parameter'}), + **regular_op_with_shaped_data('scores', [10, 5, 100], {'type': 'Parameter'}), + **valued_const_with_data('max_output_per_class', int64_array(10)), + **regular_op_with_shaped_data('nms', None, {'op': 'NonMaxSuppression', 'type': 'NonMaxSuppression', + 'name': 'nms'}), + **result('output'), + } + + self.graph = build_graph(nodes, [ + *connect('boxes', '0:nms'), + *connect('scores', '1:nms'), + *connect('max_output_per_class', '2:nms'), + *connect('nms', 'output'), + ], nodes_with_edges_only=True) + + def test_nms_infer_v7(self): + self.graph.graph['cmd_params'] = FakeAttr(generate_experimental_IR_V10=False, ir_version=7) + + nms_node = Node(self.graph, 'nms') + nms_node['version'] = 'opset1' + NonMaxSuppression.infer(nms_node) + NonMaxSuppression.type_infer(nms_node) + + self.assertTrue(np.array_equal(nms_node.out_port(0).data.get_shape(), [100, 3])) + self.assertTrue(nms_node.out_port(0).get_data_type() == np.int32) + + def test_nms_infer_v10_opset1(self): + self.graph.graph['cmd_params'] = FakeAttr(generate_experimental_IR_V10=True, ir_version=10) + + nms_node = Node(self.graph, 'nms') + nms_node['version'] = 'opset1' + NonMaxSuppression.infer(nms_node) + NonMaxSuppression.type_infer(nms_node) + + self.assertTrue(np.array_equal(nms_node.out_port(0).data.get_shape(), [100, 3])) + self.assertTrue(nms_node.out_port(0).get_data_type() == np.int64) + + def test_nms_infer_v10_i64_opset3(self): + self.graph.graph['cmd_params'] = FakeAttr(generate_experimental_IR_V10=True, ir_version=10) + + nms_node = Node(self.graph, 'nms') + nms_node['version'] = 'opset3' + nms_node['output_type'] = np.int64 + NonMaxSuppression.infer(nms_node) + NonMaxSuppression.type_infer(nms_node) + + self.assertTrue(np.array_equal(nms_node.out_port(0).data.get_shape(), [100, 3])) + self.assertTrue(nms_node.out_port(0).get_data_type() == np.int64) + + def test_nms_infer_v10_i32_opset3(self): + self.graph.graph['cmd_params'] = FakeAttr(generate_experimental_IR_V10=True, ir_version=10) + + nms_node = Node(self.graph, 'nms') + nms_node['version'] = 'opset3' + nms_node['output_type'] = np.int32 + NonMaxSuppression.infer(nms_node) + NonMaxSuppression.type_infer(nms_node) + + self.assertTrue(np.array_equal(nms_node.out_port(0).data.get_shape(), [100, 3])) + self.assertTrue(nms_node.out_port(0).get_data_type() == np.int32) diff --git a/model-optimizer/extensions/ops/normalize.py b/model-optimizer/extensions/ops/normalize.py index 429a54cbf68..bbb47df0e6b 100644 --- a/model-optimizer/extensions/ops/normalize.py +++ b/model-optimizer/extensions/ops/normalize.py @@ -27,7 +27,6 @@ class NormalizeOp(Op): def __init__(self, graph: Graph, attrs: dict): super().__init__(graph, { - 'kind': 'op', 'type': __class__.op, 'op': __class__.op, 'eps': None, diff --git a/model-optimizer/extensions/ops/normalize_l2.py b/model-optimizer/extensions/ops/normalize_l2.py index ffd9045fd04..a0d19f1b7a8 100644 --- a/model-optimizer/extensions/ops/normalize_l2.py +++ b/model-optimizer/extensions/ops/normalize_l2.py @@ -25,9 +25,9 @@ class NormalizeL2Op(Op): def __init__(self, graph: Graph, attrs: dict): super().__init__(graph, { - 'kind': 'op', 'type': __class__.op, 'op': __class__.op, + 'version': 'opset1', 'eps': None, 'p': None, 'eps_mode': None, diff --git a/model-optimizer/extensions/ops/one_hot.py b/model-optimizer/extensions/ops/one_hot.py index fa635bb5d24..948390bf6a8 100644 --- a/model-optimizer/extensions/ops/one_hot.py +++ b/model-optimizer/extensions/ops/one_hot.py @@ -27,6 +27,7 @@ class OneHot(Op): mandatory_props = { 'type': __class__.op, 'op': __class__.op, + 'version': 'opset1', 'axis': -1, 'infer': __class__.infer, 'on_value': None, diff --git a/model-optimizer/extensions/ops/parameter.py b/model-optimizer/extensions/ops/parameter.py index dc5a4e0290b..a260b731402 100644 --- a/model-optimizer/extensions/ops/parameter.py +++ b/model-optimizer/extensions/ops/parameter.py @@ -28,6 +28,7 @@ class Parameter(Op): mandatory_props = { 'op': self.op, 'type': self.op, + 'version': 'opset1', 'infer': self.infer, 'is_input': True, diff --git a/model-optimizer/extensions/ops/power_file.py b/model-optimizer/extensions/ops/power_file.py index 5a8e46b377c..32b20120504 100644 --- a/model-optimizer/extensions/ops/power_file.py +++ b/model-optimizer/extensions/ops/power_file.py @@ -27,6 +27,7 @@ class PowerFileOp(Op): super().__init__(graph, { 'type': __class__.op, 'op': __class__.op, + 'version': 'extension', 'in_ports_count': 1, 'out_ports_count': 1, 'infer': copy_shape_infer diff --git a/model-optimizer/extensions/ops/prediction_heatmap.py b/model-optimizer/extensions/ops/prediction_heatmap.py index 80b8968388e..94eabb42d1e 100644 --- a/model-optimizer/extensions/ops/prediction_heatmap.py +++ b/model-optimizer/extensions/ops/prediction_heatmap.py @@ -27,6 +27,7 @@ class PredictionHeatmapOp(Op): mandatory_props = { 'type': __class__.op, 'op': __class__.op, + 'version': 'extension', 'in_ports_count': 1, 'out_ports_count': 1, 'infer': PredictionHeatmapOp.infer diff --git a/model-optimizer/extensions/ops/prelu.py b/model-optimizer/extensions/ops/prelu.py index 4ebe5998ab9..716af9a86da 100644 --- a/model-optimizer/extensions/ops/prelu.py +++ b/model-optimizer/extensions/ops/prelu.py @@ -30,6 +30,7 @@ class PreluOp(Op): super().__init__(graph, { 'op': self.op, 'type': self.op, + 'version': 'opset1', 'infer': self.infer, diff --git a/model-optimizer/extensions/ops/priorbox.py b/model-optimizer/extensions/ops/priorbox.py index e925f58f50a..e21d0f66435 100644 --- a/model-optimizer/extensions/ops/priorbox.py +++ b/model-optimizer/extensions/ops/priorbox.py @@ -29,6 +29,7 @@ class PriorBoxOp(Op): mandatory_props = { 'type': self.op, 'op': self.op, + 'version': 'opset1', 'flip': 1, 'max_size': np.array([]), 'min_size': np.array([]), diff --git a/model-optimizer/extensions/ops/priorbox_clustered.py b/model-optimizer/extensions/ops/priorbox_clustered.py index db7e91434f0..3f9847eb5b0 100644 --- a/model-optimizer/extensions/ops/priorbox_clustered.py +++ b/model-optimizer/extensions/ops/priorbox_clustered.py @@ -29,6 +29,7 @@ class PriorBoxClusteredOp(Op): mandatory_props = { 'type': self.op, 'op': self.op, + 'version': 'opset1', 'in_ports_count': 2, 'out_ports_count': 1, 'infer': self.priorbox_clustered_infer, diff --git a/model-optimizer/extensions/ops/priorgridgenerator_onnx.py b/model-optimizer/extensions/ops/priorgridgenerator_onnx.py index 676556ee894..176a1a3466f 100644 --- a/model-optimizer/extensions/ops/priorgridgenerator_onnx.py +++ b/model-optimizer/extensions/ops/priorgridgenerator_onnx.py @@ -26,6 +26,7 @@ class ExperimentalDetectronPriorGridGenerator(Op): mandatory_props = dict( type=__class__.op, op=__class__.op, + version='experimental', infer=__class__.infer, ) super().__init__(graph, mandatory_props, attrs) diff --git a/model-optimizer/extensions/ops/proposal.py b/model-optimizer/extensions/ops/proposal.py index ba92ac1d438..afd25a78021 100644 --- a/model-optimizer/extensions/ops/proposal.py +++ b/model-optimizer/extensions/ops/proposal.py @@ -27,6 +27,7 @@ class ProposalOp(Op): mandatory_props = { 'type': __class__.op, 'op': __class__.op, + 'version': 'opset1', 'post_nms_topn': 300, # default in caffe-shared 'infer': ProposalOp.proposal_infer, 'in_ports_count': 3, diff --git a/model-optimizer/extensions/ops/proposal_onnx.py b/model-optimizer/extensions/ops/proposal_onnx.py index 637c85718c1..3265d218782 100644 --- a/model-optimizer/extensions/ops/proposal_onnx.py +++ b/model-optimizer/extensions/ops/proposal_onnx.py @@ -26,6 +26,7 @@ class ExperimentalDetectronGenerateProposalsSingleImage(Op): mandatory_props = dict( type=__class__.op, op=__class__.op, + version='experimental', infer=__class__.infer ) diff --git a/model-optimizer/extensions/ops/psroipooling.py b/model-optimizer/extensions/ops/psroipooling.py index f2ab82db338..a04152af9c3 100644 --- a/model-optimizer/extensions/ops/psroipooling.py +++ b/model-optimizer/extensions/ops/psroipooling.py @@ -27,6 +27,7 @@ class PSROIPoolingOp(Op): mandatory_props = { 'type': __class__.op, 'op': __class__.op, + 'version': 'opset2', 'mode': 'average', 'in_ports_count': 2, 'out_ports_count': 1, @@ -83,6 +84,7 @@ class DeformablePSROIPoolingOp(PSROIPoolingOp): updated_attrs = { 'type': __class__.op, 'op': __class__.op, + 'version': 'opset1', 'mode': 'bilinear_deformable', 'in_ports_count': 3, 'trans_std': 0, diff --git a/model-optimizer/extensions/ops/range.py b/model-optimizer/extensions/ops/range.py index c3cc7880749..4bb80c092ea 100644 --- a/model-optimizer/extensions/ops/range.py +++ b/model-optimizer/extensions/ops/range.py @@ -29,6 +29,7 @@ class Range(Op): mandatory_props = { 'type': __class__.op, 'op': __class__.op, + 'version': 'opset1', 'in_ports_count': 3, 'out_ports_count': 1, 'infer': __class__.infer, diff --git a/model-optimizer/extensions/ops/rank.py b/model-optimizer/extensions/ops/rank.py index 867c2c0ad00..c295758601b 100644 --- a/model-optimizer/extensions/ops/rank.py +++ b/model-optimizer/extensions/ops/rank.py @@ -13,6 +13,7 @@ See the License for the specific language governing permissions and limitations under the License. """ +import numpy as np from mo.graph.graph import Graph from mo.ops.op import Op @@ -23,9 +24,12 @@ class Rank(Op): def __init__(self, graph: Graph, attrs: dict): mandatory_props = { - 'op': __class__.op, 'type': None, + 'op': self.op, + + 'output_type': np.int64, 'infer': None, + 'in_ports_count': 1, 'out_ports_count': 1, } diff --git a/model-optimizer/extensions/ops/regionyolo.py b/model-optimizer/extensions/ops/regionyolo.py index 98c0827634d..bab2835d7e3 100644 --- a/model-optimizer/extensions/ops/regionyolo.py +++ b/model-optimizer/extensions/ops/regionyolo.py @@ -30,6 +30,7 @@ class RegionYoloOp(Op): mandatory_props = { 'type': __class__.op, 'op': __class__.op, + 'version': 'opset1', 'in_ports_count': 1, 'out_ports_count': 1, 'infer': RegionYoloOp.regionyolo_infer diff --git a/model-optimizer/extensions/ops/reorgyolo.py b/model-optimizer/extensions/ops/reorgyolo.py index 58f26350345..366554508c4 100644 --- a/model-optimizer/extensions/ops/reorgyolo.py +++ b/model-optimizer/extensions/ops/reorgyolo.py @@ -27,6 +27,7 @@ class ReorgYoloOp(Op): mandatory_props = { 'type': __class__.op, 'op': __class__.op, + 'version': 'opset2', 'infer': ReorgYoloOp.reorgyolo_infer } super().__init__(graph, mandatory_props, attrs) diff --git a/model-optimizer/extensions/ops/reverse_sequence.py b/model-optimizer/extensions/ops/reverse_sequence.py index 1c8310ed85a..f87ab3cb559 100644 --- a/model-optimizer/extensions/ops/reverse_sequence.py +++ b/model-optimizer/extensions/ops/reverse_sequence.py @@ -24,6 +24,7 @@ class ReverseSequence(Op): def __init__(self, graph: Graph, attrs: dict): mandatory_props = { 'type': __class__.op, + 'version': 'opset1', 'seq_axis': None, 'batch_axis': 0, 'op': __class__.op, diff --git a/model-optimizer/extensions/ops/roifeatureextractor_onnx.py b/model-optimizer/extensions/ops/roifeatureextractor_onnx.py index 255fff062b6..87d6a06d7df 100644 --- a/model-optimizer/extensions/ops/roifeatureextractor_onnx.py +++ b/model-optimizer/extensions/ops/roifeatureextractor_onnx.py @@ -26,6 +26,7 @@ class ExperimentalDetectronROIFeatureExtractor(Op): mandatory_props = dict( type=__class__.op, op=__class__.op, + version='experimental', infer=__class__.infer, in_ports_count=5, out_ports_count=2, diff --git a/model-optimizer/extensions/ops/select.py b/model-optimizer/extensions/ops/select.py index 4d64b39f7af..8e7f4dcd3c4 100644 --- a/model-optimizer/extensions/ops/select.py +++ b/model-optimizer/extensions/ops/select.py @@ -28,6 +28,7 @@ class Select(Op): mandatory_props = { 'op': __class__.op, 'type': __class__.op, + 'version': 'opset1', 'in_ports_count': 3, 'out_ports_count': 1, 'infer': __class__.infer, diff --git a/model-optimizer/extensions/ops/simplernms.py b/model-optimizer/extensions/ops/simplernms.py index af7490a93b0..4400ce5e07c 100644 --- a/model-optimizer/extensions/ops/simplernms.py +++ b/model-optimizer/extensions/ops/simplernms.py @@ -30,6 +30,7 @@ class SimplerNMSOp(Op): mandatory_props = { 'type': __class__.op, 'op': __class__.op, + 'version': 'experimental', 'in_ports_count': 3, 'out_ports_count': 1, 'infer': SimplerNMSOp.simplernms_infer diff --git a/model-optimizer/extensions/ops/size.py b/model-optimizer/extensions/ops/size.py index cb853af0a66..282af22d5df 100644 --- a/model-optimizer/extensions/ops/size.py +++ b/model-optimizer/extensions/ops/size.py @@ -14,25 +14,41 @@ limitations under the License. """ -import networkx as nx import numpy as np -from mo.graph.graph import Node +from mo.graph.graph import Node, Graph from mo.ops.op import Op class Size(Op): op = 'Size' - def __init__(self, graph: nx.MultiDiGraph, attrs: dict): + def __init__(self, graph: Graph, attrs: dict): + assert 'output_type' in attrs, 'Size has mandatory `output_type` attribute' + mandatory_props = { - 'op': __class__.op, - 'infer': __class__.infer, + 'type': None, + 'op': self.op, + + 'output_type': np.int64, + 'infer': self.infer, } super().__init__(graph, mandatory_props, attrs) @staticmethod def infer(node: Node): - size = np.prod(node.in_node().shape) - value = np.array(size, dtype=np.int) - node.out_node().shape = np.array(value.shape, dtype=np.int64) + name = node.soft_get('name', node.id) + connected_in_ports = [port for port in node.in_ports().values() if not port.disconnected()] + assert len(connected_in_ports) == 1, \ + 'Size operation should have exact one input node, but it has {}'.format(len(connected_in_ports)) + + input_shape = node.in_port(0).data.get_shape() + assert input_shape is not None, \ + 'Input shape is undefined for Size node `{}`'.format(node.soft_get('name', node.id)) + + assert node.has_valid('output_type'), \ + '`output_type` attribute is not set for Size node `{}`'.format(name) + assert node.output_type in [np.int64, np.int32], \ + 'Size `output_type` attribute must be int32 or int64, `{}` found'.format(np.dtype(node.output_type).name) + + node.out_port(0).data.set_value(np.array(np.prod(input_shape), dtype=node.output_type)) diff --git a/model-optimizer/extensions/ops/slice_like.py b/model-optimizer/extensions/ops/slice_like.py new file mode 100644 index 00000000000..ed02881c828 --- /dev/null +++ b/model-optimizer/extensions/ops/slice_like.py @@ -0,0 +1,54 @@ +""" + Copyright (C) 2018-2020 Intel Corporation + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +""" +import numpy as np + +from mo.front.caffe.extractors.utils import get_canonical_axis_index +from mo.front.common.partial_infer.utils import int64_array +from mo.graph.graph import Graph +from mo.ops.op import Op + + +class SliceLike(Op): + op = 'slice_like' + enabled = True + + def __init__(self, graph: Graph, attrs: dict): + assert 'axes' in attrs, 'Please set mandatory `axes` attribute for `slice_like` operation' + super().__init__(graph, { + 'type': None, + 'op': self.op, + 'in_ports_count': 2, + 'out_ports_count': 1, + 'infer': self.infer, + }, attrs) + + @staticmethod + def infer(node): + input_shape = node.in_port(0).data.get_shape() + shape_like = node.in_port(1).data.get_shape() + + new_shape = np.copy(input_shape) + if node.axes is not None: + node.axes = sorted([get_canonical_axis_index(input_shape, i) for i in node.axes]) + for i in node.axes: + new_shape[i] = shape_like[i] + else: + assert input_shape.size == shape_like.size,\ + 'Input shape ranks are inconsistent: {} and {}'.format(input_shape.size, shape_like.size) + node.axes = int64_array(range(shape_like.size)) + new_shape = np.copy(shape_like) + + node.out_port(0).data.set_shape(new_shape) diff --git a/model-optimizer/extensions/ops/slice_like_test.py b/model-optimizer/extensions/ops/slice_like_test.py new file mode 100644 index 00000000000..dc1abd88187 --- /dev/null +++ b/model-optimizer/extensions/ops/slice_like_test.py @@ -0,0 +1,71 @@ +""" + Copyright (C) 2018-2020 Intel Corporation + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +""" +import unittest + +import numpy as np + +from extensions.ops.slice_like import SliceLike +from mo.front.common.partial_infer.utils import int64_array +from mo.graph.graph import Node +from mo.utils.unittest.graph import build_graph + +nodes_attributes = { + 'input_data': {'kind': 'data', 'shape': int64_array([3, 4]), 'value': None}, + 'shape_like_data': {'kind': 'data', 'shape': int64_array([2, 3]), 'value': None}, + 'slice_like': {'kind': 'op', 'op': 'slice_data'}, + 'out_data': {'kind': 'data', 'shape': None, 'value': None} +} + +edges = [ + ('input_data', 'slice_like', {'in': 0}), + ('shape_like_data', 'slice_like', {'in': 1}), + ('slice_like', 'out_data') +] + + +class SliceLikeTest(unittest.TestCase): + + def test_1(self): + graph = build_graph(nodes_attributes, edges, {'slice_like': {'axes': None}}) + slice_like = Node(graph, 'slice_like') + SliceLike.infer(slice_like) + ref_shape = int64_array([2, 3]) + res_shape = graph.node['out_data']['shape'] + self.assertTrue(np.array_equal(res_shape, ref_shape)) + + def test_2(self): + graph = build_graph(nodes_attributes, edges, {'slice_like': {'axes': (0, 1)}}) + slice_like = Node(graph, 'slice_like') + SliceLike.infer(slice_like) + ref_shape = int64_array([2, 3]) + res_shape = graph.node['out_data']['shape'] + self.assertTrue(np.array_equal(res_shape, ref_shape)) + + def test_3(self): + graph = build_graph(nodes_attributes, edges, {'slice_like': {'axes': (0,)}}) + slice_like = Node(graph, 'slice_like') + SliceLike.infer(slice_like) + ref_shape = int64_array([2, 4]) + res_shape = graph.node['out_data']['shape'] + self.assertTrue(np.array_equal(res_shape, ref_shape)) + + def test_4(self): + graph = build_graph(nodes_attributes, edges, {'slice_like': {'axes': (-1,)}}) + slice_like = Node(graph, 'slice_like') + SliceLike.infer(slice_like) + ref_shape = int64_array([3, 3]) + res_shape = graph.node['out_data']['shape'] + self.assertTrue(np.array_equal(res_shape, ref_shape)) diff --git a/model-optimizer/extensions/ops/space_to_depth.py b/model-optimizer/extensions/ops/space_to_depth.py index f91d365292e..4f0a7244771 100644 --- a/model-optimizer/extensions/ops/space_to_depth.py +++ b/model-optimizer/extensions/ops/space_to_depth.py @@ -30,6 +30,7 @@ class SpaceToDepth(Op): mandatory_props = { 'op': self.op, 'type': self.op, + 'version': 'opset1', 'mode': 'blocks_first', diff --git a/model-optimizer/extensions/ops/sparse_fill_empty_rows.py b/model-optimizer/extensions/ops/sparse_fill_empty_rows.py index 4f76e5e5dfd..012fa40bb59 100644 --- a/model-optimizer/extensions/ops/sparse_fill_empty_rows.py +++ b/model-optimizer/extensions/ops/sparse_fill_empty_rows.py @@ -43,6 +43,7 @@ class SparseFillEmptyRows(Op): mandatory_props = { 'type': __class__.op, 'op': __class__.op, + 'version': 'experimental', 'infer': __class__.infer, 'in_ports_count': 4, 'out_ports_count': 3 diff --git a/model-optimizer/extensions/ops/sparse_reshape.py b/model-optimizer/extensions/ops/sparse_reshape.py index 7866863288a..2a2c75ce6c2 100644 --- a/model-optimizer/extensions/ops/sparse_reshape.py +++ b/model-optimizer/extensions/ops/sparse_reshape.py @@ -28,8 +28,7 @@ class SparseReshape(Op): def __init__(self, graph: Graph, attrs: dict): mandatory_props = { - 'kind': 'op', - 'type': __class__.op, + 'type': None, 'op': __class__.op, 'infer': self.infer, 'in_ports_count': 3, @@ -44,7 +43,6 @@ class SparseReshape(Op): def infer(node: Node): input_indices_shape = node.in_port(0).data.get_shape() input_shape_value = node.in_port(1).data.get_value() - input_shape_shape = node.in_port(1).data.get_shape() new_shape_value = node.in_port(2).data.get_value() new_shape_shape = node.in_port(2).data.get_shape() @@ -62,4 +60,4 @@ class SparseReshape(Op): output_indices_shape = np.concatenate((input_indices_shape[0:1], new_shape_shape)) node.out_port(0).data.set_shape(output_indices_shape) - #TODO: implement for constant input indices value + # TODO: implement for constant input indices value diff --git a/model-optimizer/extensions/ops/sparse_segment_mean.py b/model-optimizer/extensions/ops/sparse_segment_mean.py index 8eecc7febab..80e2c8d969c 100644 --- a/model-optimizer/extensions/ops/sparse_segment_mean.py +++ b/model-optimizer/extensions/ops/sparse_segment_mean.py @@ -40,6 +40,7 @@ class SparseSegmentMean(Op): mandatory_props = { 'type': __class__.op, 'op': __class__.op, + 'version': 'experimental', 'infer': __class__.infer, 'in_ports_count': 3, 'out_ports_count': 1, diff --git a/model-optimizer/extensions/ops/sparse_segment_sqrtn.py b/model-optimizer/extensions/ops/sparse_segment_sqrtn.py index 84473c93456..f2b83619f30 100644 --- a/model-optimizer/extensions/ops/sparse_segment_sqrtn.py +++ b/model-optimizer/extensions/ops/sparse_segment_sqrtn.py @@ -40,6 +40,7 @@ class SparseSegmentSqrtN(Op): mandatory_props = { 'type': __class__.op, 'op': __class__.op, + 'version': 'experimental', 'infer': __class__.infer, 'in_ports_count': 3, 'out_ports_count': 1, diff --git a/model-optimizer/extensions/ops/sparse_segment_sum.py b/model-optimizer/extensions/ops/sparse_segment_sum.py index 47989ab9023..18db477248d 100644 --- a/model-optimizer/extensions/ops/sparse_segment_sum.py +++ b/model-optimizer/extensions/ops/sparse_segment_sum.py @@ -40,6 +40,7 @@ class SparseSegmentSum(Op): mandatory_props = { 'type': __class__.op, 'op': __class__.op, + 'version': 'experimental', 'infer': __class__.infer, 'in_ports_count': 3, 'out_ports_count': 1, diff --git a/model-optimizer/extensions/ops/sparse_to_dense.py b/model-optimizer/extensions/ops/sparse_to_dense.py index bfb3f360469..50867cc3f7b 100644 --- a/model-optimizer/extensions/ops/sparse_to_dense.py +++ b/model-optimizer/extensions/ops/sparse_to_dense.py @@ -39,9 +39,9 @@ class SparseToDense(Op): def __init__(self, graph: Graph, attrs: dict): super().__init__(graph, { - 'kind': 'op', 'type': __class__.op, 'op': __class__.op, + 'version': 'experimental', 'type_infer': self.type_infer, 'infer': self.infer, 'in_ports_count': 4, diff --git a/model-optimizer/extensions/ops/sparse_weighted_sum.py b/model-optimizer/extensions/ops/sparse_weighted_sum.py index ad7b275dc2d..ff76b211f1c 100644 --- a/model-optimizer/extensions/ops/sparse_weighted_sum.py +++ b/model-optimizer/extensions/ops/sparse_weighted_sum.py @@ -25,15 +25,14 @@ class ExperimentalSparseWeightedSum(Op): def __init__(self, graph: Graph, attrs: dict): super().__init__(graph, { - 'kind': 'op', 'type': __class__.op, 'op': __class__.op, + 'version': 'experimental', 'reduce_op': None, 'type_infer': self.type_infer, 'infer': self.infer, 'in_ports_count': 6, 'out_ports_count': 1, - 'version': 'experimental', }, attrs) def supported_attrs(self): diff --git a/model-optimizer/extensions/ops/spatial_transformer.py b/model-optimizer/extensions/ops/spatial_transformer.py index 49888ef4848..62f3ffeb280 100644 --- a/model-optimizer/extensions/ops/spatial_transformer.py +++ b/model-optimizer/extensions/ops/spatial_transformer.py @@ -27,6 +27,7 @@ class SpatialTransformOp(Op): mandatory_props = { 'type': __class__.op, 'op': __class__.op, + 'version': 'experimental', 'in_ports_count': 1, 'out_ports_count': 1, 'infer': SpatialTransformOp.sp_infer diff --git a/model-optimizer/extensions/ops/split.py b/model-optimizer/extensions/ops/split.py index 23935ed0420..5cefb616115 100644 --- a/model-optimizer/extensions/ops/split.py +++ b/model-optimizer/extensions/ops/split.py @@ -164,6 +164,7 @@ class AttributedVariadicSplit(VariadicSplitBase): super().__init__(graph, { 'op': self.op, 'type': 'VariadicSplit', + 'version': 'opset1', 'infer': self.infer, @@ -236,6 +237,7 @@ class Split(SplitBase): super().__init__(graph, { 'op': self.op, 'type': self.op, + 'version': 'opset1', 'infer': self.infer, @@ -261,6 +263,7 @@ class AttributedSplit(SplitBase): super().__init__(graph, { 'op': self.op, 'type': 'Split', + 'version': 'opset1', 'axis': 1, diff --git a/model-optimizer/extensions/ops/stop_gradient.py b/model-optimizer/extensions/ops/stop_gradient.py index 45df1af3eba..51378870135 100644 --- a/model-optimizer/extensions/ops/stop_gradient.py +++ b/model-optimizer/extensions/ops/stop_gradient.py @@ -25,7 +25,7 @@ class StopGradientOp(Op): def __init__(self, graph: Graph, attrs: dict): super().__init__(graph, { - 'type': __class__.op, + 'type': None, 'op': __class__.op, 'identity': True, 'in_ports_count': 1, diff --git a/model-optimizer/extensions/ops/tensor_iterator.py b/model-optimizer/extensions/ops/tensor_iterator.py index 49fbd6a4972..5d43ffb25a9 100644 --- a/model-optimizer/extensions/ops/tensor_iterator.py +++ b/model-optimizer/extensions/ops/tensor_iterator.py @@ -34,6 +34,7 @@ class TensorIterator(Op): mandatory_props = { 'type': __class__.op, 'op': __class__.op, + 'version': 'opset1', 'input_port_map': [], # a list of dicts with such attrs as external_port_id, etc. 'output_port_map': [], # a list of dicts with such attrs as external_port_id, etc. 'back_edges': [], # a list of dicts with such attrs as from_layer, from_port, etc. diff --git a/model-optimizer/extensions/ops/topk.py b/model-optimizer/extensions/ops/topk.py index cde7c67d6da..dd39d2b6b73 100644 --- a/model-optimizer/extensions/ops/topk.py +++ b/model-optimizer/extensions/ops/topk.py @@ -17,6 +17,7 @@ import numpy as np from mo.graph.graph import Graph +from mo.middle.passes.convert_data_type import np_data_type_to_destination_type from mo.ops.op import Op, PermuteAttrs from mo.utils.error import Error @@ -29,8 +30,11 @@ class TopK(Op): super().__init__(graph, { 'type': __class__.op, 'op': __class__.op, + 'version': 'opset3', 'infer': self.infer, 'type_infer': self.type_infer, + + 'index_element_type': np.int32, 'axis': None, 'mode': 'max', 'sort': 'none', @@ -41,7 +45,14 @@ class TopK(Op): }, attrs) def backend_attrs(self): - return ['axis', 'mode', 'sort'] + version = self.get_opset() + if version == 'opset3': + return ['axis', 'mode', 'sort', + ('index_element_type', lambda node: np_data_type_to_destination_type(node.index_element_type))] + elif version == 'opset1': + return ['axis', 'mode', 'sort'] + else: + raise Error('Unknown opset version "{}"'.format(version)) @staticmethod def infer(node): @@ -75,4 +86,7 @@ class TopK(Op): @staticmethod def type_infer(node): node.out_port(0).set_data_type(node.in_port(0).get_data_type()) - node.out_port(1).set_data_type(np.int32) + if node.get_opset() == 'opset3': + node.out_port(1).set_data_type(node.index_element_type) + else: + node.out_port(1).set_data_type(np.int32) diff --git a/model-optimizer/extensions/ops/topk_test.py b/model-optimizer/extensions/ops/topk_test.py new file mode 100644 index 00000000000..f06962268e5 --- /dev/null +++ b/model-optimizer/extensions/ops/topk_test.py @@ -0,0 +1,101 @@ +""" + Copyright (C) 2018-2020 Intel Corporation + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +""" + +import unittest + +import numpy as np + +from extensions.ops.topk import TopK +from mo.front.common.partial_infer.utils import int64_array +from mo.graph.graph import Node +from mo.utils.unittest.graph import build_graph, regular_op_with_shaped_data, valued_const_with_data, result, \ + connect, FakeAttr + + +class TestTopKInfer(unittest.TestCase): + def setUp(self): + nodes = { + **regular_op_with_shaped_data('data', [20, 100, 4], {'type': 'Parameter', 'value': None, + '_out_port_data_type': {0: np.float32}}), + **valued_const_with_data('k', int64_array(10)), + **regular_op_with_shaped_data('topk', None, {'op': 'TopK', 'type': 'TopK', 'name': 'topk', 'axis': 1}), + 'topk_d2': {'kind': 'data', 'shape': None, 'value': None}, + **result('output_1'), + **result('output_2'), + } + + self.graph = build_graph(nodes, [ + *connect('data', '0:topk'), + *connect('k', '1:topk'), + ('topk', 'topk_d', {'out': 0}), + ('topk', 'topk_d2', {'out': 1}), + ('topk_d', 'output_1'), + ('topk_d2', 'output_2'), + ], nodes_with_edges_only=True) + + def test_topk_infer_v7(self): + self.graph.graph['cmd_params'] = FakeAttr(generate_experimental_IR_V10=False, ir_version=7) + + topk_node = Node(self.graph, 'topk') + topk_node['version'] = 'opset1' + TopK.infer(topk_node) + TopK.type_infer(topk_node) + + self.assertTrue(np.array_equal(topk_node.out_port(0).data.get_shape(), int64_array([20, 10, 4]))) + self.assertTrue(np.array_equal(topk_node.out_port(1).data.get_shape(), int64_array([20, 10, 4]))) + self.assertTrue(topk_node.out_port(0).get_data_type() == np.float32) + self.assertTrue(topk_node.out_port(1).get_data_type() == np.int32) + + def test_topk_infer_v10_opset1(self): + self.graph.graph['cmd_params'] = FakeAttr(generate_experimental_IR_V10=True, ir_version=10) + + topk_node = Node(self.graph, 'topk') + topk_node['version'] = 'opset1' + TopK.infer(topk_node) + TopK.type_infer(topk_node) + + self.assertTrue(np.array_equal(topk_node.out_port(0).data.get_shape(), int64_array([20, 10, 4]))) + self.assertTrue(np.array_equal(topk_node.out_port(1).data.get_shape(), int64_array([20, 10, 4]))) + self.assertTrue(topk_node.out_port(0).get_data_type() == np.float32) + self.assertTrue(topk_node.out_port(1).get_data_type() == np.int32) + + def test_topk_infer_v10_i64_opset3(self): + self.graph.graph['cmd_params'] = FakeAttr(generate_experimental_IR_V10=True, ir_version=10) + + topk_node = Node(self.graph, 'topk') + topk_node['version'] = 'opset3' + topk_node['index_element_type'] = np.int64 + TopK.infer(topk_node) + TopK.type_infer(topk_node) + + self.assertTrue(np.array_equal(topk_node.out_port(0).data.get_shape(), int64_array([20, 10, 4]))) + self.assertTrue(np.array_equal(topk_node.out_port(1).data.get_shape(), int64_array([20, 10, 4]))) + self.assertTrue(topk_node.out_port(0).get_data_type() == np.float32) + self.assertTrue(topk_node.out_port(1).get_data_type() == np.int64) + + def test_topk_infer_v10_i32_opset3(self): + self.graph.graph['cmd_params'] = FakeAttr(generate_experimental_IR_V10=True, ir_version=10) + + topk_node = Node(self.graph, 'topk') + topk_node['version'] = 'opset3' + topk_node['index_element_type'] = np.int32 + TopK.infer(topk_node) + TopK.type_infer(topk_node) + + self.assertTrue(np.array_equal(topk_node.out_port(0).data.get_shape(), int64_array([20, 10, 4]))) + self.assertTrue(np.array_equal(topk_node.out_port(1).data.get_shape(), int64_array([20, 10, 4]))) + self.assertTrue(topk_node.out_port(0).get_data_type() == np.float32) + self.assertTrue(topk_node.out_port(1).get_data_type() == np.int32) diff --git a/model-optimizer/extensions/ops/topkrois_onnx.py b/model-optimizer/extensions/ops/topkrois_onnx.py index 43b3ed70fa3..126585efb94 100644 --- a/model-optimizer/extensions/ops/topkrois_onnx.py +++ b/model-optimizer/extensions/ops/topkrois_onnx.py @@ -26,6 +26,7 @@ class ExperimentalDetectronTopKROIs(Op): mandatory_props = dict( type=__class__.op, op=__class__.op, + version='experimental', infer=__class__.infer ) super().__init__(graph, mandatory_props, attrs) diff --git a/model-optimizer/extensions/ops/transpose.py b/model-optimizer/extensions/ops/transpose.py index 63807c5125d..930a57b219f 100644 --- a/model-optimizer/extensions/ops/transpose.py +++ b/model-optimizer/extensions/ops/transpose.py @@ -29,6 +29,7 @@ class Transpose(Op): super().__init__(graph, { 'type': __class__.op, 'op': __class__.op, + 'version': 'opset1', 'infer': self.infer, 'force_precision_in_ports': {1: 'int64'}, 'in_ports_count': 2, diff --git a/model-optimizer/extensions/ops/unique.py b/model-optimizer/extensions/ops/unique.py index 38916f1c439..35b367ffef4 100644 --- a/model-optimizer/extensions/ops/unique.py +++ b/model-optimizer/extensions/ops/unique.py @@ -47,6 +47,7 @@ class Unique(Op): mandatory_props = { 'type': __class__.op, 'op': __class__.op, + 'version': 'experimental', 'infer': __class__.infer, 'in_ports_count': 1, 'out_ports_count': 3 diff --git a/model-optimizer/install_prerequisites/protobuf-3.6.1-py3.5-win-amd64.egg b/model-optimizer/install_prerequisites/protobuf-3.6.1-py3.5-win-amd64.egg new file mode 100644 index 0000000000000000000000000000000000000000..ace2a1de1265351f8cf842cca812e83fc012b36d GIT binary patch literal 1321224 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⁢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

R{wN^GVgZ_E@u75pMeqPh`8bx-ti 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

UU#P%`bTi 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 z%0Dsqs4NPXCYZp`LIWPtfMmZ)t7gr|@t<&WNd&TsoDw`15TdRdkMGT9k0_s7&5w(d z$c%Pi8>}AuV&EkdX z9PHGe;>KPY4kNmTRz_gN!A*2zb7LouDdZOyWyH1TluQ_&PmDmB1ei{1c!pSmD^@JIV&BKmW@AQ;B?U51c4 z9&y*2sq4D~d0J}7)7EtZRJwRE<~xvrrJs=QJ>$(|WAJ$efH@n5AQKv}V?otxa1^ z$?}$9Kz1-XJqnjw0+*8fy#;QR`lpdF9h)BY)gW~jDzlYaRzfdeB9W}I)DtiH0YkJS z2?ImIsspx%jSgFmI(F#g<^=SnHK3Coq75dIfqD8ClNSEjLpvPC#-bsgx+sOV={6IdCf39UYP7qqP0ooJaQ?C%?^IsdZr$;t!z%;;iOuDYmTq|8Ki+X zv5yTNITX%LTmKAAWSmijiPXRuuuZ6Y}Q6cIyk z+YMFemTyBr9eniiPFjWgEAZI}NZ5$ze#P>xd$1bK-x+-04pl>kf89Z4wZw`hg8=$i zG>m>q_Lo3QX_v4G;}O<~v_dj*6#4m_!mQ}bOrvqtqf6*&Ojd_8REBYBbdhZgAE5qK zFNx*tqdR6(m&^2@CQR|?mPrc9A;5TARM?PTh)c|b=3Zl)n^&H2^|YD^cI%z&VGKfW zp{xm|H>@7$*~@<^_iWTLGkNWs{Wppi#U}hWgrbWxrwy?e(uEMJk3#clG%R_CQdi zdkmCIHDip(G?&~`u6YAxp$FxqPs8Y-DyL>{tW>f*Ol`?R9aNf;6~GAx>Zyuw!PG{h z>d*W2Noxgem=WcW)T*|2Ob`Vq({n|(>b)-{dw-ENzzNQq6p!Kfeoh56A$sD3gU?GP zffIZ5l=J8HFUW8%`#OF%30%OU52;-bPjXj=d0OZ_8-9*7puxlSAQA{Ud1v>q828}k zlyLa_$pPT!qG≻-{~^s9lw~UVE@GQHqd`WQ<=UHr-KaE?vyY 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⪼BvuA?szWGGeU$gcJjwX6{I*sn>kKOUAKEJv-NnPU~R0?JJ@a3_770J~Zmst`4Wq zcqL57=U|{QTu(P@Bwd!(W(CYJVc>6fPbSJSNc@ezJjSto@9(@l?c_+%5;BC~XQ@_w zLsqv$6SQkpdBodcQ@2BwvQt}aUwrN&N^lT>v9}E!iE=Z(<3A1AcalDIEer>*n;X$* z-P~h7^mF@dEKKW3Tua6Sqee`cSe1Y@yF3PyG^H$hzzTv{PBIsBh*{Q$#L)^2($kn7wZ^eS z1#H*W3`6qjUzq+DSyQOTCQ{R$?aZ5e<~k)bEvbtj5gU)Kr~6fy6Mhxamqa<#c?fh1 z7d6}FI#pKEz}uN0Esu3G0a{^I(^#*VoE=gSMxh z;A$o^_nh)1`)K&cCFne39VY^fFZ1JW17;Z<4uUx8!t_gQ^H7_76dm!}Sp41#BZt9x z3<$Rs`*PO%J8tJQ26zK-Lbt#1yg>ck5b@3 z=bsX$draYr@UTc@KB}?5R7~?DyZBLe^xlZ(V~fn@5hm=WE5d27`;f<-p<^#oTnr*K z7WUWqcIDH!8OMTdv?xyI>x0x~tn%w@QGMw?we6{&GSKbqzE2I>nk*-5FKicu~0Ba+souvMRMA=e&h_8yx5VVwaM

m3 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

df;pyU(zQAoTi2|PJr-S`Q&6cxzd+32Y-0_ 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 z z4CC#_YUy$KiuSOb!j3fBIP3L z?etD^Ao&o$xqB87*AX767FUpk&~D%TXq)c)ic2s9ke|;wIMQ6dJE>%ve8^I~BSqs6iz*UoM0i@sz)ha5aXy zXdb9ns&LlH+Q9>OrPU8^R*pd3&;09~5;frr1a$2KiI8a*gWaWnJ4=ki^)3BHPcT-C z_`9xP8>-Dd2gs)fS8RpFE!T$6W0eaz6_u|i#ufu6*tEN*qy#K5E1ty+{g!|>3cIM@ z6nSj;hJW+>Z0V1b3I;+!+H(G4KgEn9F+BHHw!Y)-k$%L?;YXF^_}zxWj5s26m>l^0 zoc}EM4*MBzLu6JzV)%9S_kEkUYQgqM)VJs(c6smd1w1xGNX2`$5x+IQ>0=sLbq`xH zM_WA!v-j}j&FpwvTe%uK^&u;Kxh%sy%Ek)CN@WX!(X8lv{tlibMyZLKdMYY;5>9xOj;!B!!=S+hcL`^wh@(3c-q#LAtxZnsora`5* zmAI4J1!63t{MX68A0PgXvI+Tr39a>gYt3x5Y1zEy#+)Vl-FK5uHmepTs}ZZPt=&we zY=i8$B8|#qP+e`1%HWUMwT#2s`igUFn^{+znZJvA^%aM{@tc*C({S;5X zojKs7iCyG5N26e+m{}*2PR~-zvH$7`??)-q1kJl)O$trv01X&qUSJqR|rQSxvrjb!oZ>Mb6@?wh2d{@gFZwmA=Dr}iVu=Eqn zB$`X9Ps&FbagF-qXw1&-FP@3DSxw$P;HqVoJ~R}v`LFwd@@(dxKgORb&LryO-xZC{ zYsiukLfPZR3-Kp0!A_%l19FrVgqOtpM&$jZIiFeo39#*PcxPxzE5}L6?bFhR8!QX` z)r>r*(I;6Q<-AZo8<0L~cf66KPIt;+wS%lLha~XPT=a zt)og=gZ5%PB*6%9eP_vOyq5Yr-Zce$59arYO#b4>a~gRHW_>Ti=KC^37PRgD^KX*e z=nPWZbp#Fa*niSwD$|0a>aI^(qmB=5_N}Dw*tt<=x{G8T@^x=c3{5HbDyPM?UkoDQC#l%s;d@n;YC!g2AK8k ze=GdQ+Yy>OUhU^{e}i?|jishj!EJD2f5O$`AuN-2!|e0zjrPeTHubEyUTn29!3;~S zoJQzsRa!@g%NC@~A#zf&&AyrG;}`=&c2HeIrD)vvjQqrourpI-lkf?t1TTl+Fqh=r zTosnt!sA*bhpo&IL#9?qtO>K2fpOgYan8<;yRVyE^&-jSa^_?Ef@Nh_`DhdGq)w-3 z`qtIt@d-*$dqX%2kk@&4nX1?3t?$NA`8*zxri|6^Ts+qIpP4tin`_XBG5E)MCtrF+xX zHIb;s9bk^4yThsB+J5)zXKkM$`)iy+3vRjUH7E`i!C6U%LMp`9mOElx}W_R^}S(^PaDkp(^W0sjA$rI7=#e#|VZjU-`kYoJK zq#{cqVN_Sj$jys+8NpMO2-5%DqA40Rlw^T$WfOSt|6gs<{|EP2Ub$1DpY08p&dySf zv*%A>DvkIr{De2?RCOMr##Bk$1NJFNb7{xuLCa;n#0H-jRSg3pUGmkL*HjUfCj`-)!)o&px@l80Kb=V>X`7R3KH#sjcFLc1$RVI&D-V$SNWLm6hL?Xhf?$RtW>uC@{!zejhG^Z^~?%WcAn({8m zsQ@=Tg;qt!gj*FtCJ=N^;(N|@-b9+>UUi65&icE=((fdRffbSsU-|o5gV(+yS~6|$ zdx|!dadB~~40pUbGuYN=PkO#R9yfw?EB`4{&RO9V`WJ7J=x5ukoiEtR+?@|9=jCre zRV@{^M31ljr+|t?hP$5u!3g}{3+Vrez5b^MC7&=YJHYm4$YOcb&2GPU7Tk|i${Otc%Eo~1+Z>F*vf zF&H?iF2rJdkMJ5E2#@+a`gbD-970@NJKkf5h%1dsXO7C1SBp%s3(v?pH`?S>-KD`GB*tZ42PU)&{j4&NF0B`xCcwymAqU2G`fjNBx7cMUG!j11$Hfd|B1an?u+gE zw)Mu%ULXdsWIPQ4$((no+mB``jYc~u{tG&bx|BBYOsloCwy? zHq?awQCG=;X&36lm6sNN`0LjVf438>T*AZd#xL@nZ(qZyBR=#;&rMX zzBQe9qe##^cWd|&ugC{0N1Wu9{-A8qsTc&;P~vZ40$tEY8A#?4*-U5yFS&a2EHEZ%JczohGT3&jZJd zM5_iJgAy>G9wc)|)z}uz^EQ}$w_ZL`Sij+2R}8l<#U16$2~}2ID7x7t=dT>>-H44X+RQpVW{v=@`W@#& z7S&ApWjNmq2|?9hAq6gZRfBn_mizZq{K|zg^>~ks>w=k#DP_mHKiCY%=V^(JyoMlU znAxCWS!;iEkyge;ms9-L$VuWTeHDu0^Wwpu5WREAWB z_Uc9RM|(_ONj9f=xk${FO=K657-;H^_rY9R?}r}W+(04_PH*eb5YlVu;Ub3bB(5ZC zCDjYi!$17R0x}^nkqS8nrs9KEL$Y$QQA!HYX|PW|zwoHhnsy|H)$zHe2I4t?$i|6% zBKWYNRMK}0O3g@*Im;c@;G)Ym_dyflGPenPf2bv?NP z-?;jnv`kr@*S7GV&;I`!9PfzMzY=Jgs~MJk;x(~m%4{ECz|bwN``K*$UKd-jRx;Pd zW`>>Bgy~J}72VtEQtqiHfr-qO7Cs$Sn^+$kUWxF!9nGZh^j-6VpR%tybsi{$7$^>t zrjRc9{PC3atB4!YUr0o3KN6HMmOiHhNo={I%=3Jr#}SxwG@GwxvA?_Q`+73zt>g5) zcIF)+31QgCPwipcmYnWc*C}@=i^TBO!{Nk z|9EXJq~Iaw*kH#u?d(k9)(UIP=!w9{O%(Z)^IL`=G*KpbN*!)r*~pMhWF;s)KosUa z(sC!i6Yy5nOCQV!su#uLr-Dmllb8O(Z z|E_|QT5!zF%9nI)f=yvT`|yEZ=%3wx{=f(bi1(V&9{n0+3(3U0EmR*>lXL%p@!B6Z z=qTi?`&_vlDq6#j!xcH&N+;#v_ECK|xeeRj3zSM8oXB~z^(x+I>(n25b90CB;H?SN z5k*zDzU;IK2_{=5Lo2;m$Wxd?P`~Y(E)m43xgpVjyw<-b*xDF9QZIPMmum0S>H-&~ zJgOR99lf)ruCgb;NN*Di@Uoh)FM!#dzuND7%lLXdbA3Viri6spMy=a;D{V|^c@r#8 zw9A8qJ2k}F*g8i+q1$3#B%``n4bKQ>*(e>}C=^*C%1)z=>os&tafchuFtJ|m_InXb zot}-E40kKOFFjV(WkXu0q%R3t6ou&HM{y)yMXqasdKa z3dF&!3qs8caG~1YuN+Uy6iSkEzB(;`_XL^~BK@d~)cILd&2_f;&s6^HCy1N<{CkR; z_cjJa{|1*^T<^2)aD30R4{vSI3?p`yoDvpN7^lDJ>3LGD{n_5^hpDv1EEWux9#0PS z+H$?taCkwcF;x4beut-JjUo{|o*h8XR)+iL?Bf&S2gV(q&#tX=C>l`4sbnjU|Harl zM`;o@Z-Vbzwr$&Hmu+{kyKLK4UAAr8HoI)wR+o*fZ}#l|W@cy3Y@S49{F{U>fl zJ`qp6YIHH?tPA6SMx$urh@kM3J?z-D2yBo=|lNo#E35xBeU7@<t5lu0J4Rvln_ zvWi9*1XFD9XFyUWiiVOl!J;*A!v;|iY5`WJDg#Auzf7Iy8&L5$Ik`IAOxABS`?oTh z8ibA%7|M*^UdTLZ5aWcUmZU&}q1Ln1B2AJsXlg(LokRt5MtL}Efb1SrE%%|%B)5NJ z`w8PN7Qaa1;_JDqpwTCl)*~53DHC@pSNwqKt1jgKC8rMhdMzuRj|ovRs}rjMUh)&% zJhf!n1caxJgA~#l! za6(P2ACY|%`r?JDtAX~hXBH)3R`8Pb{*e|$tdS0b_7xRbl(pYRHD?w3*qgzuVI60L&kUVxuK6xVB^_$o?Db)TfvXiW9_ODWjWXl&el|9 zIn_E7jlTpg`#XX3BM`IGT4{njB$^RpWS)>Y*Esa1>h2F23@jfaNTz{6j@ zXGLiSDf~A%a4z^mYBwD8Kx>NZug}r|ViuZm#n@bx78i5`MUWHkA|?lB%AmL+45VT4L4#M%4j&S4jUn#rg_Gt*tby~i^XaZ?2%s+-$jJoJhbOi!b@ zS5P`ea#UyD7J+xiGd1etg)WtT?nDO$-mY}Z zUhWM&4(>wIIC{KuyB~kdj*rcuroYocXObNs;~YDa6CLw4-npjC-ApnQY(5gFx$~`% zxhWrz2e}^)qvW_lfNKs@KOE#`IHoVzI(eqKz2~D5dOCCw&PM`aC3rg%h_>o%nXSe7 zKo*kSA7kBdvM-t}OJ?JlVw7A%w$D&{`GWpkU(5eV9qyiPVZK>mn9fF3kdfvqF-SQs zcJ*F;F%#r_FK*!;Bt>PwyZLSyI$X^qK!^){tdp4q!@?lz?qyzhupr0C~@YJ3A&y6wzp7 zhz&I-EQ?$G@qRB^64GuKcQkn4G5W453Hs(WmzbMS@3orUlRd@Gy!=KJ)GZxA$e*3) znsr@t;=?l;T>XaqAi#T4;@#Z^NBg3r43397j^DJZzK#n)i_{{r%Z~>m;!v$jv!;HO zv`5x1+z>a}@1aCf-}duuTFg&}E;^z)KCXyssQyI9sG&hGG2-ISVYVYOkp%5w{-v=+ z8A2aD8~$o#6($8)Mn}_EB-rTY9=16zwobW9BkZ&!N5;7^^r%bRV`eOXTbG*Hnz4a4 zs=fc%wM?f;Q;%1lI^(?Qiw=DBL0S{$14|Jt9FNpzYy>kg6H9=e^)fJR1;=kTe)IM) zWS^o%uS%+Qv}(UggJlD3LcE9>OusPSq_`Nq@2JFvUw|Ea-K5M$Kqg6K{ixiASA#uh z-K4TxbciOVWm0?7Wy>PGWm3=k)m-xv1j>ab&GB=0I!e$8*&umXX}r*_cm{MJl*%Y|F~CW*xGg|VtmH@E;9#- z4>?v=9}~lslztg_4K~QjF-*Oo0n=J7p~sOdzhg7-TWy$^W7u|50}ypvQY)B3GNY3P zZ5(df#dLzWPS_g392y*#>5pES+2I@uRKBG#J?@=A#5HdQv~z08(32%LOtcb@O`ymhFQL2;)OKnSVCd?Xnp(+ySvO1 zMHx%tFD{p1hGV{c?*BZ?7NL)J!0#Bm%cN8?r4jN$Y2vzd_8B|Osmc<|Dg%G9kKFsY zGK!tLs>Q?|#ltHdngCfppm_ zvuA>oU3~qA;#0B?jOjk8r&3sq2#~6skoFP$ zrjT|kTU%=IJtl&B&#e#1H)($a=R8%gi^rK~{}~1Q?N9j(|Gu~FWCxDT5gEUA8~TSp zde(!iko>D3{vJQ-sSTzbR}f}HKILjWAJ*ks=D9omD9?sG&}43ZHK$MWoTLZG82tgq zjksX|fi!x1;riqSA%-}?2e*~ut<(iRD!(^T46@?G^ z+CG`Fw#*AyR}$jMjIuaW2ah_#qBmKY`tAQu*BQ| z$vcO}uA@nqeGXnn2*>+Q`1PphT6pHV#xy)^U<=U7hw7PRE$~?N2RmbVvZtD1eabrW`G!6?;eqSSPiSU<<*HWrFA( z?!gI@`*)Qr$Rn4F^oWdNvA!A8J#qnkZUhJ;0Nd7XQo>K{%i~%cI1G^%mfQ%L*Z60I zXA`lwwV)(1PJ9nxO?X7brB`m7O2n>)2geO9LJ!-EA)yQmmzy%rCD6pbmoW|I`p27} zZwl6e=Ka0q4RiU;uvAfmGgd1T-MJ_LIiB7X&43Q;5@S$!RfUrxJX#7IiiG)Qb`nOi}pbBvLYZ0S*7r zW&(w-8v9OP5fr+*)l6ZIE^2FYCs_ZIEmS4KT)n+B&$(Na`HP5k1$q;)t$Dct{IrGi zZ8SDxZd3egGdbh+9R8u;IOe8BIo*_0%BVZdJk#`!jpqiybfWMt5BH_@T=hE`_vCeC z>4cKuvfwM>l29Ku{PuAf^ai(jOI>pt*yp3=2B}a2#?i|J!LNI2dQr*DnaUdO*C5hR z=%-T(3u)BTc&ZS1!$X?(4G|5*o^V+8moqnV9uDL()(SVl2ZroN`J~Yeu0|s~xeGQX zS$h7a6q*uLMJCkIZ#DqIjRIhK3GTfT=qW3{$)BrEG5Q%wstLjN0)(d6A2|9Hd)CsW zKJS8msP`wKN-2EEdKdCLNz1X65M|lD(_+g@79d&UD2{w5QHUl2V`XG6udzD?4P_}v z*awlYXQ1ScrLD;t2ht@Q$dtV+GvX!2biaS>^|}3QL+B=+2{`;~gu}GTAX_e8HmHcy zTnBem+!uO5`du3mT;|>FE%MZpEr%sv0?#=sF(!VoMcV7*;JJ`5J5soFDJ7Xw5pSwa zuxsGOEs6jQ^!`x)ex{TRF>;J2QKQw`E zRw9g9a29j~i{LhQ4aha93t+3$q4rTsABK1TD+&tZ;O`AORSNj5lIFjkTS1%VjY7G| zRz}4IFYnpe0^y@@iN47}jhrUW##o0Ul6O=Ie0J1!g+z8`MTx}OD#j{GSLhAp?sO@^ zD&izHSje%$lk7Yzrh14#k$%4%v0GzGbz3aiQ4O`*vy~V;4W2l&2}G@Fr%m8$4Epy?T>Jtn`3p+s5DH46g3sK)6}V?LaTpe1jZI=}@T+nih4Y#73aMxwBIpu> z8X;g??k?XAy(yw_Y;8YMa0PeZ6fzFf63OGJIgCXr^m5-AnEQKm>bcb(fL z{R;gxsM;0`tKf;PF?FyvOXTl{stsr2Rv!XS!GfV+N@5&%7`Br_QjAP3N+WHViCk;4 zyQaaozq!4Ts)2fWq-Vz{Ov=qS!5>OM5DQ~0aOl~2jnWxqO^2cz@a%Vgi$Ly0bL;#m0Ey5nd^(3h*z=7 z4pQM%QuCe9@PDIm!vUy}>Hg9l4$Z_?eahK$pL?wWsYcWQB%cK-!tbhTl1}hk($=ns7z`EdU_@Iel+L-^c$PZ1~?Wj9>o`7G&oR3iz-7|A~#mIC5q0 z!ug(41OOoZzwiHFp>h8kJmh~wnJ#sp-EfDUv%#feb^c&dg}0EY)FX`Nlf~vUNMk6( zp@~WJ(V0(z0mI0_VZg8eiDJ*u7scio1ZDf})$43mNrl$wY*p)xr{pbB8HMK61VZry zQjCw%{|ar=osK4_t|q1!prnWfyne|#HrZ}@-u1kgx_nnrkaRvgJcF#M{=w!UF7!)y z!GPM6QXpHPQy>PK@*L7*t|b)tW5GAkIc9zdveud4F3G;$onHo~ z80?Gz@f=K?@PPpuy>NtHA-YN%*a1pml5!iG5xTjts=Cl4aTOl52e($KAgBFilAXi|lsji?rCQiYI>xEAaXgE;KE z;z~?EJ5?umkfo9vt%fQ!bgu?v{&)yvZCNr_!tloZx)+PVdt^*HLbWM|vJ}bo3 z%esuoeX}QFX!`At{-->qtC_dDW>rfu4|1)QuzU465-~Y1(7LqbgJkR~C$7fj2+{7CA6p!MBu&}s?AR@9)FKa$WSwIhS}rgka7E0|tgkXB;9bx=Eh zuK{zw6H+fcaD%8<4s@dtEX4EL8O&za=Q}?@cLxIa1nXncy2A2(=dHFU@NNqw^18F9JK?pJOvir$Nsky&s|92|yn~&m@44(r@WBi0hY=XF(j;5`_N; z7T6;KNB&CefQgY%QE%>tJyzqtKq1dq+(t(Ke+rfCX1*vBJ{BL#$WG{w^XE;`MB_4) z@uNiV*jRy@1n;iEkbe*ei1v8hkOrTt8(i;g55CvbAp$+r++K`!&#=9_`q2YVLKFX{ zqXvE@a!tIQ#W+0s%Z=_b0z-P>@F2Jleg&ucl5-;Xs_ilTgVi3}h2$g;>4CuekOYF`DE;;AZN?msM>)cTSuRl3G5Del_aKr zn%m5e=g5R@Y9^%stCDJ;+%AX z6y^DziKu~|wbF(Ah;N4HAME_ZMa93yzExY_Dq9Zn5HAZ4WofxD4o-xxtBmg#eH0fa zD#&$kNox=v`Hn=*`My&qy((z3E_SRob>K>WVN-oz=H8=8oThv~pQK;^YKaqaI`$lnZqr49o{{&m2#Iw`63r zP)7sfYk>b(N!#%`yIKF&k&D}rrDje|rx&m!#Prj)>xc?Alpy=XW9gWdQSknHg0ud| zFLz*mh-qxSJfSfik%ybOQa%5FRKq5G(#`*^Rj;hSfdEs2E0KqAv0`0L>?ki1zm#&} zPgBF{>S;Vlg?Kmgb1PXhZ@&|%c!R$@xUAhj1nIr=DJuoP9Hv1^KiSoyU?l)$uHAHDE8S!5^pWE*6CvAKL1cYn3k8ZCD=D{klwk z*JOOxJI~)t#`RoZj_Bg$)9wbvaYke-53y9GWwS7~iCSw?64~35;~;YZ_4M@X(u?lu zLb~kUSn04WSXu8GUFjfP;RReg*k3dWH9|TX{+ki6b9GCo!vs98`FHt5cOis6O4?jF z+n{+$aAJE7`*rR2Zu#B!-3)47%w|m_pm+wH-}TkW7}&C2K=ees?YJfHU!&bWpEhw7 zYSSWC3WPYt+)s!{3VzU$Fz(?&>T|;N6JP}f;Q4n6{{CeXW7i|PqZ=IsB==I+ud3)C z=rlk|=Kzz#-Am_yljChspKs4KC(WSKJ*Zoi)55hud_DexFqQ0BB(m`&yS1yAhl|F}ov-7i50Y zb9`vaeF(+=VtP>Zi94%f5=Z#WNv9(SiqQHNS=S2V_wYqC{rwUmSsTaF5!wuS`;x9>!{pQ!C<;Kk2j% zr&rc`Vpn+S_P4 zhRWeCtv|o#(wLjjW4RqfsVH(X&@V*M2@jhk>xK?nl6GxO$JZOUTx%B$ttO3GypD8M zJ2Mc7L3huRhYss4yAl!PL(!v7_dZjxIR|UaI!LsoIgQo@!2>(AbBJQj7Q~<*+>=n%xrhd~{mfF`C^9^>Crd zjI84+0w;~g_BJsu{X6_N1Tk&);p~yf4M4q|A`Aw0$r{8p88T}Kx3rh4i+%s+L?Hs=T%^P}XW zO)at(g4s*tqerNJOEhf{;WjZWEfVf6UGdsECy!W;o{_GW2^+6sEyHQ+`<>b$2OLE0 z{CykQJDc*M~R=jws+;j%#z**6bdT9pLr^?^ z#YPVQal9Ecph5?e^RzRkm}zc|r#=l2#xU*An->F16pg!HGrX-$9W$4O4Q&K%;HjHt zO}`NrDU-ZlLYS=>Hrdzr&WWcoikp)`u2=%=TUzw6a%WD}(wqxGq!gBs@c_Xr*XQTX z2&F696Q$8xNEn^zlt+X1W+0 z^DGgLkP-Kv7L>xNPnRW6HdP5$#S5>(YC(5I=Ep%`2##M)J$Imsm)>0q&7_VD!g#m` zO5Y2K-wO%f3#FZKJd>()qNR5QXXLw^*B!}K4=U&3rVEr&lH{3@RfPoHkk9!Uz4|oy zaCEPTBd=iz;|iUW;S3>x`q}v}sZK4{vNgQB2ne5DiXC(QvDh$iH7r!_7`k-nlB(Ay zQtOrEyq|R8zXTIm|Gm5?&#cOOK~s^ik*isv4Yq6*58X?%~?COUDAe$o=+R@U&U2HX1GIM>#)VD z4NZ|A5-W@sAg#22xtr!`!A)zMjcykw_xfqU(eDl+F{Epf2TN%qF6|4v8I}!(f5mD^ zuPfm3?aUasVv#^_Ao4kcO88eun1-ApD=r$t79#01uj&?)fQ0WF_M)}Dg>s3zA`{j$ zOoRPo${FHVq`X!t#?YD9h?E-3T>0(6v&&t~MxZ(_#={jt;tI(iJ(brxx*MydzyIfs zYI<)sQt4!m__o(Gk;koZ%VVe_85Kd|riOq*q)G(GqKa>|IFDUshL5&meNVW$4LCEq#v`3k13*VWgxD=QEU z6MK`9Vcq&cnv~qOErHWyVfBuk+ku@z?LVik_D915_9^!bL*!Gm))!%u=BI)B{ncKI)duQ97gR7xW zsM<6teJc)xCf9V3bS_q*aKe}}*`=Cg9SMbs70#<#sL*E93p1B?yg-iQP`TzcC3kE% zH_bL{UZt$N#z$4X;x1YvgE5?at7=V|uJ}ckSq3b?nXh`{<_x9k{Y4z8HxuEyUDBcu z(s@ytMDvx#8y=SCAz+Q#{=T+MXeHqXuVp5u{Luug)fa2>cBbG@Tv@8i$fg)H{r+uL z2@{u*eRV@qbll8QYO<1?!WcO$N>@2-Lh8X{xRgVkr5!CEP+OsH9zm+Yf*E!unnX?J zip@BfH4z)iB8IH99u>U?rquxN*8vN|#C3+4c~58Iq?xvXhW)aN>4Ax}nIbwK&g6G||CZ%_-DiU<|aAxQN4olh2Lksq@a;ZvbtXa(p zl;GwZ)kQjv7{YDMjA6uk9A%{lF0eNJ9A_wpeP7rz6Wp>P;}Fg+Ms2x0)H?iS)KenI ztM4@(x|zdwUQLHwF@H3p?^L}*DZ{9M+X}VBwf*@n1*T-0&R zK>nY@4QeHuPYL(t#U9Aohy?R+oa>I104Z7MX))c~G~obSz1iJ3vrS=yzc#O?{7&W)aAU6B-w^}toelVl zY^OPk^TwOh+Ch3E+@g0oZ8H!8i4xd30Ox0!s{+VeqXyst<$;oLoe5yqQc!{$n28{@ zWtYHEi(!Bj1)HBj0szJiCt07+a1K2`$AqC}&bb*UO}K$$c#P@!|%S!G97T^xx|rBBA>zt)lWO}7eesq z=ywYQ4QIEmlJz%$xA#@zNQxnSBMHYZzla+tBoPNXaVp z%4yovH6dJJ+S-jwBNI_ngNL=(GM z>seHren&xehT#T${nBqa0-U#d@=j)Y84=tYjE0AX8))&L0uA*TZIRlnu#?6XEq_@{ zTy+Lmy3Ws1Iqh_;SV4XCcUAq*X;QGE+)GhGa%`_$W_aldpNtwDwaIv}c^G=gM3xV; z3ySv7lMI`dk$)qS|waq(dA^}LJ6g3$+<;-=MWo6`vq0-LppqU4K)be_4D z)#&viOj{KYPA#SesLB(<*A6~VMf71?5Htwg8{^6CHtW!d{Yh^zlxz}OoFvPtwuYs; z(xjUKL0M+{KxvugHJP=8;mqXqvoF4~FDLYZ)ps}|QOl(7I2WEyGx{v}e{jL!oh@U@ zC)~dDNGSZKsMNEL%mubaHx0ovq7_aZhSm(Y0F;LG~nfV3mJbH3^yKnslsnZV-m|I4nzeP>9uha?_)r?%qNKQ#8wO zwnYcm(x6*J+*3IbE6oXZCfAqQY-2iQ4FrUK;FfxSpmyzxU{VYZv05;-Vj(i_r*Wrl z{kyL!oP5!F>^5ZqA5AhEa@AGn4fZ1Az+C3*!>-!WgY`){3HwQvPSnw*RV0_CsNce8 zhF>lp`>`Yoz0N50Tq0~B@sEUvoz@m* zQZP(_ARqB5Y+j#S;wgh4Qq!d6P_Pf6UsYXjXT!}v01tUbuW8606NRc>Wk7_o_*Pl%26|IP1Ug2uU@-w4LQjTxlPH-|&}*BivBqCM zzQHS@wDL*1h)BC3QHZ@f0b3=NyYSoe+QQIN)$wO^>-IIsf3p(sA3+n^in|GRc1S0r z{icnefCsHYX`bQwg}z`|@L>q5MbCcOjdX#Hi`(b>7$YD3YqmN4uSh|HoBz?z=w*e< z&MCSa6nxR3g5kk~=a~~t6{UVOE!2&uz3tB*)cqzI%7M-^4lDE=RrDs5&KS1Z?@=7= zpX|=)`BNvQGW(mD4EHg(Yoo*)_6eKEjAn;KPjXSN3J6hAIA{KOpU4-y_6XBJ(V-KS zt^^3n%>s?cE$>=Sqw;M#Y-|G-saNHR_&ssS3|MLP5`_p9Mi`ue0u&$KOS@YWjFfs^ls)>S)r{Yegi!{IoO*2n*+v& zU(evYu5o32ajj${>tLFM-FWs8(z~FLcmLjH-BzT}`8Dx%{e=JM-+lqzbF-~Vw*5a7 zw8ib+gtk@gPxXuSNfw3!sB{ji&(Ed!tE0_k`|fQVB^!oq-YimS$Dyk2+8-1C_{@;1 zG>JURmefxJZ=r|z)zW2c6*62dNDTG(@X$ft3uh7l7K0rN zAVuN@*fYb%O6vcHS~9xV9#sTG5l8B&jF)D0R5plLW{HrwA7j09LUmM`kTp=ApEsQQ zcB>tg4PnA>Wo{Fs=MAJ~SR4)Z_F3;(WcKzSU}$XZR}PL!5|0Yk{AFn%R-ykppzr1z z=zH_)Dy{|t0Pvsz0G9v7JbwLm^cVUz?*EJA`!2O#j_aaG+X>dI>IW4U_1U%5rZ zgL&3eK;dFJ5f(U+k-{{6E|!8gFH^B%m}An=RS4#)%mKOw5Cmqv4g zMzR4J1&$6V0QwMO`z43N;Z*u2g*Xvg0g@|X<`sSsWxDY$(01HS<8w=ZX<)wN%&dNI z9gQIDOd4c9Fby;xv<$Fof-VV9Wvb-|R48Y75X(c%^{Zehrzo%iXoA$k8HwQqvH9Ju zsFn4QZ(DU$VeF;dlG|!Y`&z^WQ;IK^pjp@~$9c8TbM{z=j zF{S?8s52NQ$HcJzx!`r_rfrhKx7wE5?5+RSeK{9FbWge+zK&VE%nEX@#Ck$r#J_x@ zHMqeD1=5FA-taCx^h@f6_cjA7G&3nd)Om8`hTzso^{mNDm{T!zx?Wn0H~>Gv&NfPM z2_}o^R>TIqBawN&*nqUqI;ELp_^DORxU2fG1A>`!o&{U(HhZ<`WAR>geKoE5B`tkU zGTeXFV>It|aiJvb<#*CU=g4>6Umf?z^T^=nQyy<=I02+Ux=(-868h$M8%K)Q-1~|1 zESPpTn1$ zF2~(ST9q^~_4f|Ry_}ezIsB`eZ(7l&8a3wRLNw+z_0S;aH=z3{3vbZpu51?PZ z0_p5DE+i`wOY>FQLS;0Mr`V*RkSX^{6TBoNyl)$=`R|E6J9sD5D%{0K(5wl zKs~|SEA48Ecu<;_2Iv%LlBzj}VBgc^6YSFmRTwV*rvIfVm01~7L&?w*ycdCcMxtSj zH&J_~gmD8Am*UsNOlX@E8Jmhxqh;NXb^ErDQ2tM;XVT8PeEO$R@T}td+U`r4F#-!; z%0kGmPB)*&!_yZ|(=Zb(-JC%N_Q=mMtE~e2`nv3cpE2aGv^df>!bhFaVrqfIgBoIoI^b%F!M&qu4!*$uvf}@-ekDsjiJRZn?;AG;aQ^?W zeon@Y-|3$JAO4XnRT)RzZ}uNeDO&TUdZX1a!aDo}B$NcvXhJX$ikPv0JwJQyZl+cX z3k_D3ib@x?4qC&q)--|sxSamDb3JMV9*4uh`%3lr%T}t|PThI_%@1$>O;*^$dV7@j zmk&mYUP7ja7V4hkTiCBTKSH0*Tz*)3630^~45sE{gBoBDf*0^PKU@ohcpzo*HP|6T z#fEmw8vQwa&mQ%e=Ni#(8^lMuNjSuRm|V8Q6(G zh)1d461t);(3&P!BE@gy3w%vka2=+!+OJVYa1E^Vfsoc>G;BplsYBW)-)Qgdrx^L< ztLmzN$}RNuw7)OV3z2oE&~jODLgbAndjdt9%XUp#_AYc)Z_wl_jHMA3K{Q$td2QSb z!`*D#j{-=H`$8^$UDBH)g>^{>>V(c@1wU90lYqBv!$-JBzCvhHXcaq~MO5&Qd@G_7 zO~BuY{H>=SB5c&$Z%X?8WAKWbL7=$}Rs4Yv|6ktXZj5V;ScUV(?ME_gbca9Ti%X5W zmAf}a7?XjnXUEp%a1j6U*~*4Tx(Hez{CxyjW1=WG@vQpO9bA~@Tiumb+`hGxeET)d z4@_LLk>UlEIGOoqp~99vu@$IHn*&JYaaU0+EqZ@kf3x;{WbSUtCh3)bE8XL*=$g&w z`62`nvG4nprp|-E>C5a{tG@TTYC8LFOZKhN1t*Sgy36UXnSe9>?TAX1@`@^aEm*Og zpVh2LnJ>D9NOQM|RhEc8oS)#eF4(5-r~JfWPgUJ<0`Uxtoj%r6RNQ)v4U_V8EtD9e zJZ&izo9yAK0?g)fs%zObl&5Fr?L6WFEEfJJFtqV}l*nlh6KcpVT1}(InZw3!c*sN4 zS*B;CXZ!4vWioAR`Jv%l2MBiT;Y2KEb<|2v)B>05MX@EjgW zRg#obcpcRxBTzQf3Cvt-gt1wz$6b`d_CIVY47l>_w+(LOVPDcW0-wDGxKGKZ8OQJ1 zx*ZHvEZhDf@bR|0ztp#4TDozcMvsJ7XOLgKzpJ-roeKP5;!qIHh2qkiFTrUrKNS9{ zD0+aB(Fq02*3|i3pa)(wsDH}>Mxj-H(SI&@R}*hC&u7DI1Nm$=`v4Ya|4Ug05g(l_ z(&%&om%Fou0?bA~m6>^F3>R;oTEri}%g6KH;EOlin94Ms+tlUPX4(#fNh=4x^*+DH zhhpP_A^o4bQl~@O-7o;IuOA(5_nRDwZ=gsvA+>!nZxmH2i6HqT+ggT)%dl;Y*I`03 z|KAX9zPNs}Cn@$9;|W=I6|&b8Q;Vbx(fKBlvN$mVY4fq|MJ>5`_WK;sv%=IgQpZBs zu{9EtsrUbm65>A=Q$Bbma`KzCiSau@{{Q&BXlMSvFqV_*@w}O*=UnSR+N=jhf#^@QTi`Io6#Jh&xp38 zaiQgnc$M}F(|Zo2?wvrP%j)Xkn)2d`Vw2(FrsJ#ao{wX8zaF9K9^Ut-(67#IOF-h6 zMlT2v04}#YG=Uq({~vJUT(CgU@S4}}m1f4RmJ(T2r7v8V9)b)ZJQr26LJ%cho+Jw_ zKHdq&9DW3g$_lRB+-=l4s(>Ee9aWG;*#+*DE>?;GH^c(L42LQu3y=;>2j_uigN*cK z0cUKRC*1MDd1CElQOpA2pk9&=+%FAG*qDMeGsQ3?IKi87N9N;)w1PQt-}oh1XO1RQ zumUoJI6E96$OzO0^T0llXw~aWs1Qu?V<-Tn?e{-}o3T6@b#8oNuAcjZM`PIeu`K2b zy~=PUH~0Z&&q#blKiC!3>WaiU_qVFI1Eh*%CI;yQ14L{KaYh&Hl^H|~>0~R-=vHO$ z1A1>uWaCW)__#CY3gO`=C?J;m26cb^VZ;(4C?Jv>0(B4NPe3}erYQPFtVj-Y!rxr) zbw<^oz5{DAI_3X+H*L2G^2$BK=;uRC7rUA*ye@9*x>Y^nGTk}zi1c(U67<+@|AhSX zyYy-a>1lRGM#n=VR|M?!Y~uV1GxY62ar0vtG!g$|RdaEZ^UKs(qV}r$Z~OSu!X~oE z+jvVw$FD5+&C}4gbJlX+AAn978~6!pWJg}e$P!nK^1HorzLK1Q)jcn_Mw*!C8GB;B zS5<<^p!!Qa5z4ud5*Y5-;11w{YihqWJQkZn7H&T*Wb)ROYu09C*K~T; z97>xbE#ArPTp!SHI1tpwteJDK8VkJWsrx$1!FrsT8-|{5ad+~^rgHSfZjuZ&p!RQT z77gYbPn6=)^$M>08*Q=JJzO6`)o3Kphs%CmlwR?`m#okcVmqtUVA^7yQTp8a8!v<} zxM5)eKxWk-Z%BzhTL)|QR^FAL@m6ot#?4Y6>93;4F5*R2!}o@SYYtElCtU-WQq<8r*xH^GORZL zX%eBdSq7WZc?5ga!=dJ25d^$!I@oV-qYUK_(m_l`A7;6b?z5-mq@56-{gHBYw_PD1 zmap)%r1wEyf30e9362s}lV*Oju3wAu|yeW zY8p{GY(aW!uVP!gkt&8YWr=Cp{V=~ibBx~d9iF4xu{0${Cz2s%GaG+GULW^Gm}SK1 zhe!AU!>uDW{Y_>Y!S<0Ml!Hdb$rC5x@v&hGW-uLI?n-;&nC{|2y1SKwC_1ufus7<( zMm$F6m)D>5EUevCU_Iv7tAv~cNBTi$4AaP(8%sTLpcAJ!7NV7!`LmI9MC z^lYFpH?^i-R!N|9lhMeXR`tMH`Cp|f%7n9X)|VxJ-K9Mi^baNbG3U(SNTaG3f%cET zwKVgIi)nK19n5LR5$h)is8G&I^+`=a_01sBX_=zbjZBVkX0uMo(teOVsn@FI!^S z6nq50wRuiNr84v&_{^Yau@-1=+ff{H>oKw{aB9hvgd)Pk?+(pr`2^TV#KW~@FH<2( z#v@ObHQiENR-g1!=kJ1d*}?qkc5fI>u<@C)ZDH(CxAZXjMcB>nMpuD@yKav1$JA#O zC@Ya`hMNI-{-*62((%?^e9j)iL0^1cwJLP^yH~62NTLgMS^;t~Kf`5}7`aOlLSTZS zIhMJL7q#tYxfH({+*K;t$&|Q_R;JN||4S$thfxGEbl;r$EV?1?%TJQCg;uB&hdk`#HBzGcRPkwMfgSZ6mk!lFwQq}`uSc&}Q@ckEB2!$?Cdbz| ztgb?#a!(wy(aT+2DI;S?LkDv^CtHXAiOg})TiXh6HEE^l%!IRJ zb&?`uPo}19mTxdS@1$;+V0}$%+(vr$A@J#%=P|@Ebau0-tY(%mRS#}* zQeQsw3|?ft&o-{2TgNtdATHLtrX0Q?Zq71ABzBD6TuOV3n_!(d8@TQ2Jp=ccZcvZA zjI4cyn!iA4kVpj&3tkz3OLkuUqbl}DJW!%rJfj2^q)HAGgjay3rSB5m_64ywHi1*r zs$>$Qw83S0e2uTipp9-4rF4(gP=UtZXO(45*hjHUN&J_qp*%5v>;i5*+u)JQvs7u$ zJT&|F5_0&D{tI)MEdLoP6FDU+vYfmbO{grBCAgrekwyt(r({hD>ibezPdMQi=5wwf zf)w)@krQZ>tiqWDmV2~$g>6(uBKH-||CSAh+V$an~Cg%AZ@tPpV?y(!9Bb~iO*~6 z(fofgc22>aMBNsTZJQI@PA0Z(+qP}nww-^>i6*v_iESr0-`mB@t?GyU)?MA_oa$YB zt@SfJ;BnbG{9HfP0L(5PYGG8_woKy#=AfctArQl#m5LqBS8O6Pe2NWSvtmaH8QsCE zO2*{*dwS1XYMz(r#_ln%xGq_a;vPpScA7ajb`D5y31V;Fu13ApICWvS_&9!WO=Cwx zS>|N1z4=A{3)YOr)^%%7gIxQ3e$ii8y)jPf*`r;TJI$AEbETFn6{f6*VbDNx7aet% zt~|D|3wj=ps!@Y`j`yoOhCXOFiYZ&_1Y|xbd$*RQ%7-T9%=`83)N_^gjBSO6D+T(5 zOcz8U29OjalznFJX3eHvddiq1Cq)t;kJ|y^h~I2&GpoY=wA>pjNP!(=jk~G>!8=Ip zxg!?OsAv;oj-HoFwvdR$M%KUU_FZqM~h=vV@RTdAn z8XGmRgv_Xg6SGU^?gbGPs7$a2W%NG?3(#IfVo%_+z-z7&?CMq_#>I|x%k8UNz+sjy zmSAv}y$icRZf9HMO-lguk=6ZZ4_$euY5y6h%2KDf_UK!l<6GW=eXgE`mDJG9b5ICc z#VB$Gz)*?EkQ%F`<_ zIj7}jZCpvByudM-<(y)ws($%;8GIe2kudnBVForAJOU`)MKy~YGp23&ExxeS!|9`3 z-LY1~q`2pLd@#)Zu(l10nsG^Et$Gp~49Dr33hs9iRe;+h1RT^&uqx!x)2A7zy1PPu zJHX6(1;GieBhLo2K_D}E(}e)LF@VGZ%p zZo{RAh#D1eKNnCl@}7I%=o3Z^4ZqPE0AU!|Z)**>X5*A3>8XG-18pH3y`gc#&M0He z>4UGzV(wYj+;^qDr}@SdOS^0Z>GiJ=%cgEYFYY2xsgi_A3(qA>T94sXn~&yPkm2To zTO^Z%4>kNZSH?2OI(w4y0yuf0@vhWf%Iy@kvG>Y-Ecw%U(`Efl(UFzW>o({h0Y)ph z^>*OA?#7PmMv-baG>Wev?sm|K--=t{ zFt~v`1#>1QW;{Ia^+j~>-1Tu8SfJEKJmi2b_B~vq$1I=<6*Vd347bjOqeoISVA>jC zE+9mpJlK?27D*CP1%X>~N<1~hz`V;ldTqlAWN;Ug z!r<_J%sro0CbO6eyK-iC^jduxm{QA!sA%Vjko^*>vBl8? z(!~51>^A6YT|w66vHmzLa9+F7L8(ua1PzwLz8FJdlGLeYpitL0pD*C-ijJR-cdX(* zoBB)*fPzF!EZ*E&!SrBT)`Y>nrwciy7aQ_s;f+#SO1wM#s&@MIttb%?K)T0Jos(&8 zX(KLPRC_7g2nPG~+q`|9p|M6_*bX!EoqvIKdWQJvNU|(o)4!mRp_T2aF5kS*C(ja# zDaPXSiP4#Gzl6`k2xNn0ia~@p;i8cKIIaBz{5ti-sodO4n# zsTi=Ttt)NdPWLLzolSppod&fY-1GP^oz2~7d1T;|jgbK`HAmJc3zrpvIUdhuU%*x; zCJJn0nPqC^%@II--AIUn9KJYgs`KbE8Vf|}Nq**zY%|;y_v|JH zT8`)9kJmCkB8N8l;7I}snys~t|z?~_3L3B(5 z5Fht;$s0+at`j>Lj9(&B=CS8cw$pMnC4?wah2|3CLU-q=YY6HhB(FlfEo^BVDbqta=X_*=n}!np%G?Md|b_wHT@D1qJl5P(JeDA`opn1&U6G zZ~fqN`d_D)>xSnt4pdfbw!>)4Jt8Hg?Ax9PjRI~hU3vd0N#LTgqf0=v+@X9#?pB*^ zHgMQrHm!25XM`=XF()g43mOhz<%_l{GL|fN&t3&kk^{*HN+T`)CND-a973aomJwPB zvHJ8Z2K{un=3<=Td~PxdZ32Zoc{8_UK1Ii|SbL7;!XZV>D8xzna=)VZxQiYfNh#}eDdD8&Koc>}PsXH| zKt@oF1Y(mgf&q~_3sIl*1%xJWuzG31h zu~6^ox_`h4j4G;4S5fMtP}nL<|7TBfB_;Fzg37d8kUMSOyWWFU?MEg3r1rKKvyjrW59}fAJ!^u zO_<*2i>Tf`ycc$AcU7eG%i)jHb*jZGe6_JNwnA03Y346cxFQmtg_`{I7E$#DJtCy7|{$?T31Azsv>sOZ>g*!pO{0rzl z42E&{ZyD?`*wbf?60<)hEt$$_IL44tN%$|pDsDhaaQ2CXWa2pBmTAyyAtwUryl5q- zKi%qpT7ua=Y18zoDDyB{LNm~8O?(0PC=Rh$@vnvS3{`SA%gkniVnHSxrUj}BEjT02 zDM1sYRQRwY&Je{UP~bNX?uv5Z8xHhRky}g2E0$j!Ga;K#$Qwq~YdN?QPN;)DB(1nQ ztpusyQ?uQ}_d5PVsCA_A1RC=irhl{kozjft$2g=%4# z1C}_;NU;KMqnlgfe#7({ze*MGw7hP6mZ)Aj2P*r;=tU*b>kI#OB3nd+SOro3)I_zN28YLrBBo_rYHMa9Kl^qQeLK$7eK#7%r8{>_GEcz%P zQ+rq33;(S?`#M%g1LNKek!qQFPAP?h$wOQooqHG@+`@F0zL#|=yYY_40Ho$KK_9#isb9kIIiofrB|a>kZ5pZcAM5t4ST#s3|CE zp@g#~SFW1h4VH_-H3z%;cj^#W#WSOgKCNHi9n8x3#2e}GxZZ;zO;^T|qcUIPIt`joDtd9I2ckQ%1O)v|D- zo#xf>UHo`H0Q0Bt+8K44lDa>jbGtr)+7mAG_LIarW70y1IL+`mK8ZKO5Ob%#0aEp2 zwf?8I`@3<00TZSKfaId*|HT1P_j{TUT09XTH+71dQ*^Q_5UJNkgNJl-h%( z>V|B+jC^a0`gZUG?JafU`{P&^%Rz$5MlyR<)_QO@Q@jvtb{{PeJ^?~k=~Gl?C#DL{ zWhYQ8>nMBfN!}`vo~aUOmUv$gPiA`bW}(9kZ-yHzBKS;4S?>2s_RO)~0DZ}CxsN|_ z&Zw^X-Kvoq~= ztwDhi2Qn)dV@e$@=Ob*sNAPz>P%$v14|KG*`rj9z@|H|N(`B|(uR?W$n|SLUOoX{4 z7mk>5hh0M#GcJtmEwMhC>4$2-QRqd1MmRY`zZ)MDm3jHwA>9Che09N}1Q+ z0elZQPV7%aq9+-lHSA}-@91wD<7*~|s{|?PrHA1-ju@(z_d-?Zkv3Ap=pWq-O`9nw z?{BE>&^`m(2YEdR5!+gmZcghSmzLfd>1eoI{Sla zB(^_cfW-|odw$({j@3qdj%xrnK=OskKKA?JO-ydaGE@d4jmhZmM1xPZPi+>1DwXS$ z#9h(L`6r}pzzkTIxXB+(7HPc<;lXc|SYprhK<244QM7;#-(o!>$5K79#A5!aJE5MS zcZoA1fU3iL1l#DDs#)wo8FDoYTB;^$hb36PvdRJL5~ncRU!_>_%28vL1IMacuqBTq zE1x(k){|FW9JdQ&i`B;XgF4jrUsqO*<{5mFGtgc~nZ7A&;9dv^c?bY0`Sp0CcqVU* zT8@_*#&@nTfK}d5EZYJTd!#LoOs`i(i#Gn|Z8Lm+)hR`61W7z4NoO8Qr*T47mrt2)*{P+4WUhMkL z8SdXp`U!=O$(U>*$E3MSnl33fiiA5)7oG>LEK12Ey4dWw0F!Q^eAbnw&>|JbjosvZ z;p`5?20Z-2B@vFrS@;y`$;Qs&z4SB^t3O$tR6;Fj7ZMs zxpLKI9iHK!(bgkypOu`q7~Hm%7crZT>;Z?U!s#`;_zU1sk;OG>Xpn+K8kXTWP6fLi zXtSWW$2eP4rW^*I8H}nzu}uNAaS;)fUOjXVdW=)ce9rOjvQl23htHka?llU#<6ZbO z(6uN+k}Mr)SG>+p=e1V08xeTp=qzbgJ%`(#-M<<5d8-xPxp#ESQz~EdCCHw`9B241 zh4?zCfYc#b)g4o{E-zM}Mc8lwA=1xB2N5DJ0(YxXHdDTB=EkR6t)++2(wL_1N0Il@ z8MRIJ2 z%PXDsQl8)tCzd;N#v`QX`)4hGrmAY5EYE!z4koyH+|HfgIC+(Sd=xmMv63&jqe)K( zP)b4$C4?Mwx_bqf`_8D;6kXv#6dcNtTJ9SP4?e6m5~}Ddi7>b@GQ6cDr^shG1chj~ zP~auvl<2%due-=z27E%Nd&p9V@d{oZA@f6|DL@3o=igAVl<^J}yQC?)1cmY2q?>$C zP-Ic!7A;Qv_w2lR+GaMMwVomkZ{jMRp9{2x>+1}A5cMU2(msge_LbLv9JwH(of!6w zp+z>g>Prk@nhXO$0VDfP)zA@Fj8D!y@3F)Ftr9KIa?$p#~9?91C)ZeFh~(rEWqb zPxK~rnQbz#s9vJSJSUzS&_W9d8g2xmOG&lOJe(^@=+K-h*(M2>zcBT1*yQ$=|L@Q+AYx=)HE2HhQLdE zBx9CxyhgCvr6%DFQI+|&?)NJ!r=|>^wAHB*++#56Ay9~OxVCt3Swk8O56y9(-LH5MbR*Vt{ zuHBH}$2MS!d&?Gj|mMx?|`7Pe|d~Q{$z!L0IlJ&8E8w+j7xKVnq{3c3^Rz zdKSBbC%214Re7m$-Z+9QoKSL*BC(MrLtmo@Kv}h->Hr$aQsJN}_6m|_FTqJ;TmNn} zfH)L(?ex2J)JCM0y|ejz$ohQH`S{=y68Cc@{-kO z;I=pN=nDNY{Kd~^Z;8L7%D6@PJNjtKD*f~fLTr2VxoQiG&ay-H41y%ix`CWW(LF1* z^jAX0M0M?;7ieZ@x5rITQL}Vg3rU*_IgPwiE#99l&T5~i(jHycuOGQDpNr^{k;?6! z_OtJ%zYFK`QUGnRuxY$uGLHX3yxf2*KNOZp2?jKh{c0gRiz6PA{5ksojfUa4F7Wl% z9E#B0+lA8zZH`&x0=61u_F>|r5^nFTD#aqXiHY8SUL@!@gj0FcF@{_J>Uiu0F%nD$ zNawptGt!x5m$VDQNDTnq6zfwI6;{hb|EV|vcczsE_{r2MH02!!wecd6h*I(GB1JV* z60}3It`e)V**YJHK9&8e<7jPX@bmxzH!9o}Ie1H7-qzBztEpuzaEv|YP}_}N_prV7 zVx(0)aJdkXt;Q^NN?Jd)41%Q@zaFXQv5SNCdJ{oT&O-=pBg>^RLZ)t0(TFFdnW%+v4>XnH}Mx!V& z6jpbqGY2^gr?2gkPF|{)hBT~PnV(>%;ulqAykpgk)x^j{*qZcF;uo&J_`q0=6%qB3 z_DMLv9`*bAdiNs6iEn1&v6Y5qGFtucIkuExyW7e5)ab$2*U}Nb7ghr#bZPA7aXz)Q z8WUIH^|ciD(Kx+sQ$sg+xLTTHTeAx*p4ZFOQ6Z=3kfI59zG}ocm{~=kXzeOh# zH=oX`yR#+d1@(RLW@m`QYrr5nl_s%4hF03PiY{mgc2)+8F?-0;hHUh=8k%|-J^)(% zBqW^v&#}6wjfJC3mxox}2*ooYIib8uFnI!Kjb&WpHTE;yT*=5#4C zB%Z(aY?F)hUvRq~DyBiMnNx4}(yPGNXr?f{mcF>p)#?7B)vp_-eA8W7WeXY-^jO_* zRGnd?u>YuU{B>g&UgL8LS1*0}UcuuLN2Byj)5~Qt2V_$L z1@#K|6^Zu>*FOY~&5V~jA0olO3obSst~0Li`EZ!{TCgRcebYNyLmzXRkXx0iXtoeT7fB_etWau$Zlnf06k7eA-y(e}9{U`ls)l|PtB(uH7zJ(v|T3FL50)}JME zOwJ8kR1naSLVC0)q(bXGGi}pkbO)*yo3*e`_oyfA)FA9Ro8>5#1{=luYxv~7CC(xQ3vsWAY6lt$-g~T%>i(SR{iVE8L`uI(Dl?6FYAl?db55_PsS8!-G6g8FRgfO7g+JJab4>#V! zy%0UJNuo6l@W5U-h#4om2#)tj3~^*B$+2gnE7Zi5`EU8Zl#sc+NIO5$VRxuNA&nP_ zy-u~F0XzUa?9EW$j8FjyEYm<;oq7@r09eoVmYUTbHYYL z*MvB@Mic(%Mng%%VX4IZVLS3h!d%JQD-cFQ9FQ~wTv~WibKIjh2S}d0$wcpkD(ptI z_>J*rW5{uQ;z75n8$IW&st|Ya%GeTl7eJfXW!!k%Xyf@%<^*XQDWTFAzhNlCgRQ2B zU0HIc|7F>sv*;Ehp|eS%mq_5|Igj2NMPwKilguM1h&`nLE z>t(~*_g$l#A~>7oml}8%j@qV;#~L94$2psZDdCuO?9to_jE!GNgg(?tqgnZrY1S7p zye}8NMdC@+r$ZP!G%zFGhi1WJDV5VGQ=-eA%pM1dE|bLmDHX95x&Hw~SaAnU9r=i+ zg8o;k-`4h5s?8^nSmWDYie2z>)FvM>>HuaTV3ClE4*s&oID{*Me1r&$elTS@%j0r5 zfknwzXFGHS1LsKu`DpYwXb&O`dxB@&B=K4D57^tBXZ?|06LwquGu!Qx@F#;9LhL~B zJ5yFFikQ%b(nH0e_+bHZ*{UDYv! z^tHAu?C<-n_B#Dz#X;@*cp3d$_q{j*)gm|ow@>)e5_SRljW^6!a*M#zh?j$y;PwgP zP3{9km!UKPsK%-^vlsmy#)`?uXMT&$)~s z{dzqnf7qNgkSr9uCfCY3#m&z(xHCQiFOrw

^l)#%8ND>eTw)@ryJik_Z;^6r2u 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%0DXp1vdd7AK>?;mMZ+iSihhSOjOU@v{Dcvwq=% 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%0DKu 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%0ANC#?oq}ZBNaZQZ$=uW^I#V4IhMG@Ov+iVoB_U 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 literal 0 HcmV?d00001 diff --git a/model-optimizer/install_prerequisites/protobuf-3.6.1-py3.6-win-amd64.egg b/model-optimizer/install_prerequisites/protobuf-3.6.1-py3.6-win-amd64.egg new file mode 100644 index 0000000000000000000000000000000000000000..84c0d90f9190d08b4f94aa8f87ccb949d4f37d1e GIT binary patch literal 1304449 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%0Dar@cCT*A)8!klU2P|p>bt;c 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

aLdmuqQ3#>M0!~hkZ9lm3X6W4VVongw`L^gm z3+xaJQ70B3`kx1GcKd}lUEa1!I@4Q8AU)Y|hi;Zl-sh+iY>**gppQDoIkJkh%Un|+xdZDyaqcDvl>>ys zrwmV@3X7^U5dC@4q+a5{0#G^X61D=j$rcE3Wz#-z zA3@nEKJh5KDpHoKa(hyW(<5jtfmfyYa$83!s&CsRe6ZcU0R4jin{U(htqOf7HWFamLnl*-GBDiBcQI1td!#e5(OdwUC8Ge!p|dl!3SS98YyZ3^IAyRMe}{Z5=DXL2i1<~birf0V5%k`wzhuoG3sb`1JZ3w zBb)1V5i!y)ZJCTgJ?I`P7cu+mh0c#?3D)8k-EzMzzgZwv9|N4&3}yxlHlDwYaKD_a@fbfw zZ-@_k=%|> zshl5=I<{fSfBq4CT5aOE!5=vK^o}AuTX#h=DlJlv;Q5#Cq|J#7uV>AMk9!<>SB=;| zwadUU8bPCq5ygJSk$Ns&Y__5xi&M$Ru((#8`_ zVYX+?dw=jn<)0na*H-|Cknqz3)7Oa3j_Fp>{j$Z=qIvU>^K~=%t7X6U65+ek*Mb}4 z?T`P~*Pij3pmh+9riset_8o)0_jRru?B~lV{jg%M>^})+^sWzkRqB5-yIcJ7o9TGc zZ%esbg~yoD!}OV$t8zqfe9)GJZ?J6swzeO>n7%eRFTExYd07gV+%X#{OB_X4NM{-O zI}=mCB?!!rV0U8oE{o%9&2|_lIj7;A`nORJG2Ty&of_%KEbhw;Y1Z6B*mCH+`g>_l z_$B;hPNuc++JpWO<(Vb2e#sL1@`9JFlRR+BrPdqTmAFi^i7m?ZjZp?=KNm-jkqYx6 z41yE?0W;#Po}4%B@GbOFJaw`v9t25c44;} zmzl$163~o^dvsq|#wQ*_Q6>$wc*Z{?KmK>}$s+g}n6<@B-m9H+D$+O1hBJU@S{*j`#*Jn34$uy#WV#;giYks|M z!9M|q?mFhcye*a|{pgu5pl@RsC(W*vFI+WR48vm$zI$~>Kl6c0#Je0lZ%rV_h2k@? z_96Ayw4L(ssHWT}jU}&Lp{h?^*kT}+Qtws|9^!`faz^Emwo`>WK+cS2*RNOJK&V;5 zQ=D)&G*lW-r3Jp$`_nluU5cb@GHzsDQZR~y%Wk#lN(Gn{l-@zYf;LlL*B|aae|VVpkEuHzhUm)?-xplT3w=OWj#SE1vvFm_HHvU26gKWu-34W5gHHrP=|H zq8od^2Fz2mzkxt-L>+pv^psamNQSx3FRIVHL?U-d?0i^oy3EQPy;k>u=^kr};3j~e z7WG^|N_M|DVv#)~`c#Yu0Li2 zm0gQY1R7}`a$x04@d7mwr8jgQM3LFH!sgr>bn(-G)=_HaL}b2yv7UPf1@5%C3O}+B z1P=C%%EAT0rK`Wr-FNw?7%(5w#wNFbPTsT!Tsyh7c73_9V(r|W^~l;&v0=8dbZH5( zg?g1w@~yZ+zcb4dI&G!<0Q228$r*w1sY4o}F#M#HPd5|i+4zg}j>muF-hVa&y$oprEZC;~Q9rl==6IHt$v!{C+J11%@NfB)h~7f4k(yVU-Ok+)APT+LC# z;h}844hgR<0eoHq7(N(0wS;)eCU407-4A*dORg=D)1{GtC3VZQtS-xbG~MzkclX0XgPu8+ASAOw1sLq;I@5W-g4o!=}`+ z?tzjj5Wva*h<29dc~}c;fs}NbMB&_Gtv>8B59(kR+>?$kmr>r zXrT8PAW>q2s>_|MN);-NkRx-h(Xh2}x^iI$+Yb!!?cfRI!zMD{GvA5IyOBl)sDP6)u$WM z)#C+}clp%i6#ntXfRWg04jUde5Y&?!P@ED8|%gdc69*MNCPVRK|f!2$mF!Iovg?J zZ4_9=McX!?nvf-%rL-6rDg^XHkNlNi77Cdid?W!1o{}yK(nwH0u)agm``#T&t122o zy{2cx&mT3_uoBE_YT?RPkd+^QO*RVJ^V8FqjAXHu}rRrl*wlPQK)7s~*ApH}_Qu!rJ?=1zM!5on9Zr^MZ@RWTBfLpYZ^+a?4LtdoG+?R$ zoy4)NEWNeh!9oP!2>Q2d)6wOi4ypu#(w1iEihzw$B|C~votUXoiNyd-0EgZdXlMZ; zzu|2xQeYpnOR%Khqh2r3eE|0G1WGX1H(?JCrxL#N4AAl*Cb!?ctgM&1tuNaA?-yu1LKz=3DCF$K3AGa8=z*V<@8Wy2=)YbMd5Pl=fq z*(ncOLVFOHB~Jr5yozA1sFjtJ+J?)}ZoQ#VT|_Y7!p;IxbtR(jp*w|$q!P+yD(Avs z0tcB~+-V(JHnOa#fcMIDM0G`}oVr}r7?_0m_enf&MnW<>mQ(6=q7oHzGKb4Z&J@-J z4ivkMi*|4UgwnG2z06oiZ*dWFu4ug;U>_8Z~=r2&m63~8<@~RRtlnQ6hrNL=L`DB0C>7rhKygWht06Ph{(XJDBte(5d|?l{ZO=pn^L}?bJ0? zLKR?s%TZ-|s}#(Kd(Pdx5tPhE&n2y2jjf_$Oh|EOIySy4VP3CL_2+}`gXDN|@`^Q# zh`WO;lQWPPWCVAEe z@P+VD?F{RJLPm&dR|i-@6*OLZoyXK<~#9nhdCx*(s6j6 zLqU$xF7?>LGwqKLU~n(9#1X+qV*8h4)3T-cP-9mTkQ|vSdt(?cbls`S25$sGrqSu^ zkOAc>8VxxQi~xst66_vzM7#tL?%|cgn;4oS_h6#SN8O>$gck`1pJ5SVaPXh5fcUGP zvY+4@4-N|Tc9b)q4Yi2$MjwN*7(6L9wyDi?COjKa0NVX%2dGlwaY1l3Y4sTrg`o_S zAu;m>BrEZ#A-Hl@x-Ss)HY6$S6O-Tph>E1275eqiAE z0&4Gndji=PsNWB~{cbmJs$|8Kk@}g^rzXuq^rH=gOFlM zx#DcxMuxIGiiwP8JWvKxPo47o>tA1;6j?WBE7Auw%BFgRd`9v!3}~1f$!>RBT)u)w z9t?P7NTnUYr17Ys4B0^3H96PNxUEIL{>)_h@?_upiRkrU+0OASre-&)s4rJrdpE%k zyONkS01*9$bBikKKH6w>LUaCeqCmOpnS-A@6C&7yTz7_PmujEN9>8+=ST`Gc6DFzo z-D7{o6ZT8l#8 zpk4HpCD4gap>a_daj5Sof+XXPD@P@y#%L= zbA``a+crzA=Gj3EZt|PO&!%4KikPVIAk>mQU$W!dtQfr4CAB`O+l6*m<^6rMTAAz< z$5!#Q>-l)OePaymd&h_9&fGA8G%+h38-Hxp(YjBT()ca)KfEu1XeXvy9 zqwUfvU{Q&6OKYb#Le@|jseP}A4zJOwfU;c43kse}m<*h=^e+>qKCPN5i5`=kk={_DauTXRT@q;Mgtdp^`-PWRRxq}`t>Ko;m*Y>E&q@M9UnjWh^ z<}669xr?@x?(|+KCziY^@V|Je`i~s**=o)Pvqo#fowFM*~AlCl}LuX-TXXf}k()VXSnC?HwAp%}u>L9G!;NJPyM!$eK8 zZhQ%1)k91|9~ll(FvhtjZJ^$7 zF>wkS*sf9Fd)r`bng85$;!w%Dl=p)6f706~eKZ-Ey}*|%GhtF;zXisK;XLhn@KqB2-o zq&ri|tbi9a^HdWQ2#BU=I^}>A&YdmIBha3qjR`eHwF7QmNMQ^)~OT_+xk}t z0~SW}5czB+!6PS=9qVgi#FdB)oQQ)92-WQy;{MFsGrZP*OArGq_2Y`BxpDNMe*Vx< z64VMUyHE-h9Nhz6o<|{y9A+VB=;DJ&1A`2coZ4KRJ(l_ERwE#O;2gX#B0$fPqPlmWMi&Wz@3 zTQBZ!rY}pyup(Q|o2k|^_gS!qgMZYY*&8x~Hk2Hdzfc0Zi%J(oizEru6_<6Y5NcWG zhtAwJq17@sgi@?(l<28d*Gel$->VPIL{Y78D~bL#Hmdt=`b_s)-I<+<8*(%QXAE<1 zPy8kw^GAA9X*RxJ)18cy;T!QLz$1xbmUGK&yas|ko*4(?d&r*ujDSkG{XAp$6$E=8 zys}}-W5=aEy)0{MBC3^?>%p2%E3D? zpY%%SO*nDQw|f1yxMS_D+jGx~IV)hb^O3LduY&lH9ecW--3(6KCqARA#S?bIDW1QP zUmFzN_agDH?mdrirjD9`nW#)uVybnb$)BFtwXS!UIJiImr!cr@L)~oT@Dmhd1P(;_ ze=Cmvty*;3m>jevaJ+5z4xEy0ZYSA^cSR(2ZC*>Xn8i`_RGTWgQRHfdC!X4oHyldc z$#p(oyk3SA0in2q+SL~q}IT=}v5!D!yz9=zXfyr0~@GP=HV=k49qpCQCJu(W@^_xbX~`Q#>! ziTwIt%Bs?scT$)2TVK!E+MdO%-2QjqWWn`@_Feg8)1;+v)Ce$ja_CU?0|Ofz4G<#0r>Q7LP`WIaL)f2;BM9KcMSf!VtTJkJY&#d7@SoW3Hs92_CwxQ zD7vMw^A}0{RF`h{>B5~Z8_aS*j~yVd`tvF;Pe|{V6N8NZVV`qX?9sdXIcZ>c9T6Da z8%!Afe6MwUO*DV^IfH;??ZLY7ITWeM8)G*ZetM>_C!@`NB`Esx4EP)aHy&IV%<}wz zEtL97#2Ebt+&^P|+t%7>Bl5tMsW1ZVNY|xo#$Ku8R#}6+llW_M`fJms^!xLPUv==4%E*tu^Xp9P>}ZI5>xD4fM(V@lMG~7{h0XZ( z=*`9jHO)Q{=KNr?O~`_$J7%uQ1dam(;kM9hf)Qr?u6 z`lNJfuJXn~|0%@staKY%=rFOV==q+wFPrENis_Cgew*wakKsNq7}=BUrSsv2a?WhF zD_3ImccSb=*Xk80#h&tCjvQV?kh;!?hBn@9Udh5LIn}npF#u+qMJA&YWqE7L1ow~9 zt)mW}O#?EfL2;<${VN-FhZJm!DNUSY@w&wjr^v7-N`houWpQ*+Lo4+;Gu`ETF$Az9#w?umPn+Y253C;tl*q)a3aG|57u$NvCvkMs93Pj@<;mKAbVg2@ zcR&l?(&E){xvwOdKDo^7o-Xpes7o$j(9l=AtiOed7^c_DxD9&$X&)#Tr+q|M_F1HW z>5&ZaH+Or1wfUEo6)>3Y`N_O+a&04_gSmhk5~Z9&-2Yj=VksouM#|1&I~F`V1!w)n zCuO@h9ekH&8{ruh?XxD-`PD71WthcMaqHt4T)si_cL=F=4=xdi%lTN>$5kUis{Y^|iDJN>BZJhdILL;WCj^*^#+Qh^PY^D;A zI=9*MQr*C1`o(~rmEq4Kee-cIV0IzXlprs#TVhs`K}jEJktu`$8;7QhdG`UCo_Du6CHe@rHWx<4qi1{%X__-vbk&q?*R+%p%bzdp z$d+}tPG$n)_pEF?X1e`<-q?!^cumKtg~Dxx%d z7jC5YfAm&qB6!aY-}l#@KL}UzbG^WL6S59H%det(J4D^xSvdpYj(4lREw?})eww2{?=fs7oOA#t(^@f=V@;Cg-!G!CN=qQ>+~8<=@6 z2z+`7L?5*d_3?~?oqnJo(BU3$hi z0+0|J=&xm_xW3pu%ClAb0U0Ku$L%=7`36LrMM-N$Uj+ypCRNjST`s^NWDY= z`?}V4k5$)odHxc4w|d&)d9xj(H-neIzXbEo(l>*^0B$J52a{RnwMEJ* zhN*2!(!4MF3bTq*!jexta;2QvS4lMwlERvaP9c|;JK=G+bOG2bouaq3t=!wJkHV4a zW9dlqML9I`$h%v@xFCWA63@|=a9D)EDF9ysbDd$c!}s2`@|>x10Ee6I6zP|9y3p`x zm`PX+<#Z`egBe?CTP$D zsY8A!`a5X$+hQQw>EmHs>y2bt?q{3GzY$+Hmf(VZZ6*Kr)FwhNMuedDcUSc3KC9z9 z-XXjq6z89;;-Q7ES5Uoj<-rN20X;Sdtf@d8{Uy9|$DiW7CK1*F@@Gt<%p-nmcP51! z6dKo$@j0>uxjNh;z%bc0JA`gn33b4u+=k+l#E}&Um(3OxDoAXdAOqiAeNZM~aD)AX z(4)&hieTll;)WZeY9(8F=4vI&2F7gv$Hb&;Cml2O+ipCd{--UkbZ#3xMQo4D*5FXK zrFLDELt47kZ<-);TxNeh`8vf`I*rv(Tl%nw%cs{=mLvwR$E1NAS>hCs*hMx%HANrE zJaL)BFhbSp-how=)s;x_GxYbuD%$#j_TAGz%})io=XDah-y#G+)x}t}m`aXXN)$=v zb^QY+Xa;Z_b~|D+PE(euw>YNcN~aj2ScR{8bUcpPTh;{9gerg`qY3}UY>Z~i$)s*M zb&52fB;c@Y&@YA^0`qg4n9yr;B(mdh-MTBxl&=fzWwCAK*6sEF$gWmX@(=JsshYDd z?u@f^4SVt!dSm9h@p6WD*V)GiRN3x)Up9HW>^u}5@_X4deH`}SPq}d7BJDdzTif|$ zlkt2QTtB8VN~XK(0oD5g`@#|GA;$6rI%xUs6r;E?nb=CxJR1z=E5CB!@#TZY%qyC_ zxnCdLrqU_b<1$9ljd&^;yG*6v=ILplXhC_Ke=(}h{=k{X-%(ei=D)3!#xBH=8_UgE zH#{U8C}YVHs3I7kHfGCnjhFj1W1gkM5O(^-?pUa4PfsW@M8b~laJ2Hc=4u@rj{J)| z%pVxn;TDl4r$+e6qseZ2ub^^=#M(U$kgKyrmhdm>Ao&=lDb@}yMxZNay1!t{;nA!C zk74w{W@U4Aht-=kalhA~O)-i$nMEP-wD7>zO-`bJrvXzlfJCUa(E+4j2b=kuE+KJW z+J-Otp8pKeXx4QhcaxTZGq5mHbban)G<;7+}!1;g306a-gbg(6K< z2M)tN1YC>!QtPWKQJWxVSP&6+SRq%d7e-vt!(;UMIw855C9m`;l6A;^z<9IcA5N^S z{C-G)J{vz&8uG>F?QVMAZS?RV0|B95D7dM{S>L(`o0Qw@K;vtI;^|Zna1q1p^p>|SmMJ`FHGjEJgjF$+ zYj={`U>GypujnzGoL-6Y_kLI&%(M?9!DYKsl4r_S?Ag9c8VfU8K8F?aEv5-QjfCVm z*w%pBYA$7DjRPajKG)QzXpDash zN|~ojs>qw0>sGFc9+=1{N}ljOT2A@az#b|Dp18};9aU2wV4{l$xW!Y_WWAT!H;z7G z5aC4ghbu#Lcmq2)Akm2(^kz9sZ-}_v={!I8x-cZi9N!nryd^|sc;;>#ux_*>jFM(DXH z^^rr(4I;-7c_4v(mH5{d^?IM|x?+VN1M)c_=ecgKwf5)l7_t{^XpMLIBRk(tc>EUa zJp=Q=aC$6GR0&r&q%zHR7nEc8=t zw*jrT5KFqss=gAkHWX)Sa}_~F46+SK}&uZp_h#(F@XHH6`gj5-2NTH;uyGtag z0gI7Ldds0p6$wvx*UPK>dGR4~8lj&2!Gkmr8fa}N$JMdV@s4l-Hih!J>|6Pra+RVTX#^rNNU%C{W#>zKF- zL_=t?ah{^H7PpAGR>t4k><}H~=8Q~&`05}o4ir?PYj(w%>*ja~N2*yWHFDIaArCqo z5Tq+nEnBPYN`dxbXrekpz)A%4aiaGXfiqd`Srm9n54m)SrDxt*k~6Tt35nO698*;x z@z&pLaiq_NR{n*+9)mUSUjMC^n5n<`8>*1%>OI1F=E~y=0%N@W527!Sg_9^oTnKB$ zW+ofHtro?5Rk~GMGW~^hcE9hj7lvJEs)TJf_ zL0?89dB}JBn-aabLNTg!DabYhU8;Qk(S(l0Rh4UO>SHB15f15 zsMOxYmD?(Jec38Pb%AeDb^c#QUW~>ln0k|^d4$z`zpG58S%i!+yz0=y$rd}R-YV8I z9NU!gitGcNN~wo@(a>Qef7y_ZgtQ%+X|WCS1do(K@`by_VxHpz?Uu4D$U^>fhR^R- zR8`=rz2TWrZ4XXt)xa~YV8df~JOvX2p2AvTa$V8&8P6n~***lD;BGVU2)w8RNX*|EUj%PkRJIh%1%uF119;OKX@KMYL)^=^sKr0}7PrjWBg~$eE#TaaNgQ+& z3T~f|93;rHNy+SMX8R-PGW{)buTr#~ls;3_66~uMk*= z%VRbjp{zIet+II*@NBx8_)*bXHMu7mr~zU5bU3dT#oL+ZLwDR9iyw0KAGDroc&M)p(4j`U>_({T(mp{gz# za_V)c+@vfAqg}u{nfT#gSem7H*2YHKe$2}~!Nu~UrNM#3gn7W4LZwaHLsxIt`-f}P zrAvHrvziuM=ukDR=NGO6j+GTVW0xxaw146=d@j0;&OjqwJ>zU=T;@oS>_KU@?XqWJA zaCm+F1dW0XUo}tvB%0T++{9|uU7$a3J+Xka>>I@^EmmN#B6GFu4O&#s)oJHs$G9dN zeaPit?BbU!iM%w`QLNZm=ePMf{KIhSGLU_ z#eI7ym&53>WS9E!$D0nd7$v*1L4Pw&@7<~(#7!oM5c8-UD}K3?p1YE9KiI8J`B=77 zp1PkhFA|c?z~aDWjrj`UZBE>h4iSsSGD4OiOi#UAgs8&Jm4+-JeZUwGXY~7rI%iU- z?Fzq3>m~B&b;hsXB~E#5DOF4q9`9+>{m~ECrRjc|%{pP3GWKc^{AOT3C;v zr^=aG3*vzeP7LDl4EXOywG9uIs1B1LBGQuaXQmzjtGh9dB?nZ`J1pRyNtDZ&n}j8) zbW@H?wL4#~V|XY+BJGtsWv_Pq0sahP9TkD_%3q9sMV?H;hRi|eY7Q0qmicz|{e^cU zdR&@N`rggiqZ8~pK3mOXyTyT{1B;nL<&hRSV+}{oHimj{PTX}kvn_HiAZIYp>I(UCg2^C`wL1vV zlT*Q>4GOnMYhWpGt15I0eo{O0$6-f7-`fLH=c3g#R$y{x+D<0ghDguL6JDBFYj6j- zF(lNJ{&&(!0%>uC>)vJ~h27RA{@|z2(K5OB&Z(%p$c%U~#V^-=4@OuSc|KtBLwzy3 z{qA!97a`%X9yGJrY!5w|sji5_Az3wVCh?~T@8F44-do$0kk;OieIxE=L0!rXaDGQXNF94eU2GYb&?{|Own^ZR-a-bExMk*#A!w2|1JhN zD`aX(Ys_?iUwb|Aj$c}NE5mdnwzS49-$^_%q<1TgC`MlTlDmouo*6TSU3QuXW!l`; z)9!Brd0SoVQf~&YH@n`oXF{1~&$!z6pM-jt_x<{D6_|Vaik^pZ)t}KpyDhS^bQ+gX zLAv;D5c%?_*`t121oL#af>67$wtcSC*4q*uz?4Z@^nNL>yXb7^0aL)Kb~#M4z=e629r=6~5>qWsLC`w*qwiW6k7sy5D^9KJ znD4LiUCcWn9<7r|b=6Y>e$#W@5)oREi)WkdKMK^?qunJ(mVMP_$?@M?jHh~F$6rs1 zcO5=p3oCSs>zVFP3tteb1~R1DHd4ZfGsGTphYxY5cF9@t`(S!cA@PhhNWxu)viLnS zImVJR5^O{py-Sg}#fmeMZOEE@m;Vey8EH0PO+TPWe`aSHe-_*u{|rNC**Bs|`~b+j zqf6(pPbm?EA*McxfTH*(*P2s&>8ePZd2d^AKC*SxWbQ}p*`tP4+GoFjA6dRfM4tW^&E`%vLsfxCs&6O)mHtYMm^63l`sWDd)4 z)k~!0h|B*fRid@i)!hpl3BO!z| znF68QYGM%wK`fPx`mkTzK;ssSf8HiSfkms7O&~M9CREe!A~jRftgj;RKAsafaUpKv zYOv6GF$F&x&u91>b6I1aLXDDip)Yh`sFH|QA)h!Qrlnf%MxB`F&>VRL-nfBwsuI$S zZj(jQ53{iizrI8x{#Uiw6j@WV%Jqzl!Q0n^XS~FoTC0TQGP-zTpjwSA3UHyvq>8m# zCPhE!sxohCq*p+K4WH?erACq&v`me%b}^lP_Ch^a)nP1c|72%a?BAe7dCfXb$X%6&|zBq#eWMzaMxZ`ECc|i^Js_mKpZ{@o={xk zLBBgwKHalkJ~=)=FW+;vw-IjzIp=-ZIwQ>wq?HUaiw*V80Tt{_NqW z|LAGppF6|En-{fK9Iy1*qS_==d@uq}Llg$p84ih(V!$C+qb^;bMFrGf*l!t%hR2ejrAs z>UVp-8@Z#LpPZMyg>P#wL<+nTDgn&8Wu!=DK+#MiDLRFSjQ zLPpHRU%1ix<;9_@#9qKZm~&?}0HzQvstdJy?%|BvSOTtngI6EH(vrl6Ch#VoG z$U!|)U|98XVmoBehp7opIx_l0$aAo$9CX%JApKE`c!M|>R5(ZE;IpOSqv%z}L`eOU z`ec{^Z)}-91%dYooMc@F5k0u?ZH=o7>v+bt;B-$gjsHE!(p2cN;a7<@@9dP(E?nsijzo_QTM zyZ)$hX1U1G_qwWk-@R31itxuK=-1=ZEPLPfBPqP#U}0q?lhvGGA}WgW&T)!Tngbx? zEd}bst)ZL1;sitX_W6(Y$`2~Dg?^2uIbcU;b;WSWl_n@k0$i|t*Gl~5()WY6s=m#) z!9Vp^CMk!oPs=8UL5ZekxJRAggAFNrp3$@d86hW2`bb)9ZTm=0<@=0JZcNhx|B=-3 zfzY-380!B^PfaTrzUsss9A=ptkrj&I4~Anx1U`z7@cbtxXJ#PqM~fKL1RIN(f{i&& zXi75T70l4@6$tk*U5gYnh986lBE~EqK0N^GJsaB)-qv{9Y1S|p4;9vO2qpt-vJZ;6 zAd($w2qZ?Ua%*u-`MS3=oQBlKJl>JgbtK&puSpnHdEZPvOb4}Kh3;7{HK4Si5d&0* zSoDA^J&=N}nF3e`HV`A(hhvhxnS+@Jqm?~3^b3l*wFLuM4>vA>+#n6!>2kWFaSlCe z<3e6R3Z}p&iS~?Vgn{by!_8^uf06Z$QL;5n7hv1AZQHhO+xBhS-M4Mqwr$()+qOOZ zyx;towdQA4WaNp=s{);5XqMATBWrLalzjz6AiWYv}pE zK#*bKc(dT)7=p=BN_fzVh{R2=B{1fvW9D7p%`O!J@w4b!CHX&Q>_GuPy+cSuyQ7it zAa}715IbA!t(P!t^pUB%sPtF45ppVga=b7dW*(!VLO4V9jRDOKheH| zeT*Ro3I*4;`m`QF18#&x9T{=MSgZia>!mi2{hPQ_A6jgh>}oJ1_+Czlj?Xo11Sv-B zLq&C<66x!Mw(E_)$5t#EmaTsVXO70Uf)pXY?wXi!DsfS*Yy_Fwup}F}ZKtmADve~l z;(bN<_1lyNYiZZ$w?_~%POYP~4>f==dhPiPpjs z@q`rPumr7lTzM`_3VJ$MxsPy<*?L5D#N^cNjBA{qP4lxSK^?&D$wy$dW5|4GpPz|f zDHV^ZUYc}H@In>2`deL1_5G3~qEr*3@+z&RtD;I`x#0PM zaE9V`WPc_Y>}CPldw&{YLM4DopwMo&aMziE+5FRkAt_D~435C!OJR=b5DnVvw{~J5 z0l|&OWP;jNgCSU)9!8bJoKs;~i?iRj7hV{v6dD^?ECpJnukSr3;;xYbQqUK#SefQ* zf;x&}ngkQUT)mF$VoTvJ=rFCMl%Xw_pwcre4O$}+^2O}7J1v*l{d7b0BhpoHN`kemUGv-{<|ZQ^pCfFMCME1KyT2VM ze?N`cBI#qE=@Rwb8+G{@PGH<11(d{IKS#tMb)MQmwzKIZ zoZ9`}BDzbS-zEj3rf=FLcayLY?kt9REM?NPXcfPXdz}#8_#Hm-$Q3d+Ns8eXlcx`H zVzA@K(RFw&+#wyj5hvl6ZwtE-<^V0>YKS!2z*S-=k*^$t`=7l9xV`5HQMY-3YaOwT zmQ?J%t3+)wUpWBx2!my~-RB5WkNw*#Z@Kr%psicmTq&SL#`dFUvCFR_Wj(y-T;jWAL3o zjg4WulSE>cai8>1F1Jn*3oB52b{@Mb+VEo4TQ@pZp@gj}%d(*VxjecB?Sj=s@5~q) zcaRc9?L3cfXNhUDfjJR3D{CyrZ@?Ob_0cJ53)R5pk|=GGzc^z}NL-~tYReIn>iOFR zaU{{BDHIDa;)r+%1FOxpaY5v6ulJyX|q5L{fljJcVN_Z zNo?iCADCi?Qx~odOJjv@<|#dCnX01!J|o)g+AteQK|@mvMQWs3!qf!95sKLrgQ%@1 zhmfJ!FdMYb`wKFQPH~|rObDPe|G_Z`+G2&YNuY*i+?>F^K{1n}ww_NzWn?~l1%Gq=SXg5y?}8DF=Ms< zEorm~cJwU1NLAY~hi++OYIN+9rXs${)@TbqX`l_+{tQ3~*$g{o`?o|^$rMq8fzf`j zoVA5%odk@Q{-7n@)_)CbYvR<^F){SFA3TXgvf>6Hj#j;@idDAQ1;uFKa#Z^ zMXIOVDN)3VObUDeN@0F0xK$^osDeo#hHiE@7oZ9*9b{om0{r?4gNvi_p~Pv^R=aj^ z?pt)3%E{R&AcAS(DlbiR;daImF*eiXCHNPRwLdL1NPbZOFF1Bzfhr|@-c@<|CVAOh z`=i&I&3~?Zs~Qoy+O_awq6#H=GEn+lR#eF&kt4q#qLo@Z(bUL;21txDk72Fcy6Mr6sDQ>rdLYaTG>N&laa<|KG8Pks4ZH{*5v&e(jj{C>-F+d zFY*+}StF}$MP;O?t%4n&npIW9SyB*M`u~iZfylDs)Eb z<{PDe@Qp?%fK2Z^M<^~3JXRM)!RA0uI;T!@pc1GX9tljI$fv=+CYc+&l>6%fa4uM- zz~ykZv*1NAP4kI4h)w0NNlZD27JI4AQUaFsad+uCC}j|czDsmckh4%udy5>j63G@` zdIZ0F*WAacJlU&)q`N5r;NC1{V5z8(soBRP0nzZ=LN~<;54X6W+?g}M3b6|x8BTCp zh-2<_TPlL$U~>pAgnwB?b5=Aa!6RPjQc@sfS<0YdiNj_hUe+pEwEo#=3HWqJG39Tg(Cc+(?tKJ>tN3!HVK4?>9Y>`w zoTq15%tcmByq0lHb6^Ud8vxIh(!N`9K?dIe!WE*O#NfY6sat|Ec%7r}y>l4O(Y-vL z67EJeuf$k$d}0xK7M;&8g=dOr%z%5%4q2WUgn4~LIpNJ z>$+c1ey?yKW$aM)!L3nruWu<+M@WAS;~BQSZz|5&%}Su6d6oF8&+b?#R2d-`m5x@2 zCBv{&dqOuigW!*|iO<6CfsGkm0K>PfA%VzaJ}zo-`$Su&5iwx;DgK*03NoT<3~Aht z#I*$?rgW=ZFmhblJNnZ;3Hd_&Dj^N=4Q|TG#VHM!7mb@85x+(<+Vs1*ML;d?v`&=_ApGafo zt9hK;)7Ol{n+JOr=JNaeiR2b1x=e1WCKOx25m^1lBbf_a4RB{NU^fl0=erz?p6>j` zkdFMY?(6OUU>1VxO>p5)X&s11uW34;SBxJoCa~Ooi`vy%M#P-O6js7a@~e}wc40?9 zcilGDr=>4AX~MI2J0IfER7t`HAavKk6K0Unr~MRqW60P|0Lp+z8N$}l(GtSPc!dG9 z5rU(`4@#HMsxFd9wZfmtCNJo$Ux_S;uA3_SXt6)n%{oU~LeWB)$1AT;mPM)oaT65k^oKeNMantgyeVVV)7$ zuSf>xU8N^@^!-a`tz8@s)Ps(>u0syl`L08MaJ#mUq2I%)jcj(};rH8eNN9W(`4wd8 z=w7;~Ffrns-Ijz9F?K#lO^6e+r5f9PgAE9u=-@hpMA+~;gfEiPs@VG}r5HB$Z_D-= z1te;lp<0`xkadVDjp1tjbJra)ma4!@7BjIs88Zg)ApU4`_6Eq&E zFGxzgjQR6fzl=tu9~98!&9k3?>mNE`{}Js>R3K#(G`qh5hCp~h0^f(}r~t|+YqsEh z32cD5fC7iCQ&0hvP}42q{tN+NLH;8bDZdUlnzrDAV$n_=%os=fYMO!!!}0T=1O!ug z;{tI%&nBS#EU?xsI1w7$7K{WIJS3X=46;E9QF#JsLYcZLmORj!{R|=b!zqP`M8g3* zG(d0iyjTDLxv*8e^we++LThm0Noa)qHSyV>t=QBgO16O>`rJ4Oq(T9@6x?q&j97Vb z*Jvq-K;1OA3F!fH;5T)ZrsO|Qguoa_miv?8()Toh#kK@W!BCySZY+ATETP3k4Bnxm zQfL$gQXoK`k!}m7F1mPTw*ElnNePC1JQK#|$T;x9(47r#T3GuxsC09bqJM?ZfI`g! z;|$Ta+;giY4W=*ECM!rtCaMuOk*+2#{Qi3M>FuXt>%0K}MS&J*OO(>CzPa1!vW zHFtbephf(lU)d-C-HB@!hEybSStISr{JFN_oJTA{Z5BQGHe|_;UOh+|*C6~{8}7kY z*-599TD;vfW^}-SgFtq>x?!7)hOEnXw`R%%jZAKapgfX5#JCLHRR%-#3{~jUn7;xr zq8$;en7;*xCl-aMgZ7fgRM#N%U$#Kh7+WNQSrhFlg`=$!AV9UW2A8qPpRD;MG`bju z0In2@dJxJ-9dNHVca*|0{9g+Qnc)0Ux_MsLXhTpSwIW%UWPgnQzK~4nK^STj3ek-X zAZ(rEdTIxGOiPXYI5?`1=m2Qe$F=09QaH9M|2$PoUUmnte!5&A*ET~?5w0eTQEaCo z2q3rlOX@>dYLGfCS|Zp#TET#wHqXiNp{QUQe@7TYX-F6NJ58RG8AFr57Xi0<`r=AO zG3uzz^#8c27{)!D92yA4qUequHlUORK~h7+;Y|ZWYD$3sbgDf&13^-QILOl>h*6vb zC>W;B_{w1zhDe=TqCpU;FbK9eytFz8LQv~02xEUVT5-Y$L%El8lLyxcg<$$c3m1{V zAmCj>b>_nnRP7mz;(GA}BL?$z?%0(PLr@E(A&%m~D?;SY(sg5F&0?rH6kV`KVF+P@ zgFtkm*(bT-w*B+ySE(Jj3#1_x3e=5fPr3^v6*Q{Omt9dbXM&@!h3-_cKN89AcClGO zbq>|G#53trA|hBr^)kpDf$NFs*8!v0yn+#m2o;y0Aywko>!p z1oGDn0$;Jb42JL^73*67N)u=V>)e6+uMr@{rVq&$PZR@lEDB)Xu|lJqF}cv5af?4a zAxH{apINQaC!9(O(>2&rfvSy||RGkS5_$M!cHA+TY4sBp=`64d7R{nh0JZ~1c> zjL;+n6`*R9?vD}BN0$M7!Q&=`vQaG7@5W~!OK5;TCVRo+HXzxq*uvv>mS%*bHljoX zuomLD$QG3?@x$P%_1_-<)b~uwu?~XnPy!L@606-Zb674QSi3frE*{se%rP2MINZQM zeL{AV#f=CfVRxe3Hwxi5dci)rlr}mo#|=MUjbI+AjZD7QCH9QnkNF9aW+-3phAf&NSLQm`;&2 ziAmTrWGx0m0MQNq$*}rXC6Ul3CP9Ooq2vOANZsa<<@(uJ$h7XssqlFG8mu{}w|*vm znz#wmoiD8F>@1k*gMKXU!uD)PzRo_`3+iwulh4z7loJWN6Przo@vYU?UmwqHXD6Ku{a^7lMnXXdu@^S0P z1#ioet5|`bQtgt9-)g)5#tFtrKb1l+)^Py2;?J3)Lh2ahTUZ76zE##75-k2v-eR(Nwr zIIHfZhhpZ&APNWU*33LJ{wM*lI$PawVJXSh>k{6-X-*_Z>wNE6d$q>dD6G|tnz>2a zK!l?qsj@{}V(PQPY%ybMMI^i2WQieFjR<|sap*=Q47VvQ$;xYlM*b!QD>cS!>BoOR zMHaFGZ9Xl8h^-ld6UNxFYs_u}aSL7xEG)Q2%EBHcHTItjJeRKr>ie9;Wq2We4WnL` zI75t&TR9Wd-fgQSkrE6~5x@a023=OmKJy;ScAl3yb_bUwyp@$VCleMG!#v>} zpPtz~qJoO17|kadd%zNgbE1)F(%O&MEcs4{6Ne+mHXz|JGR_*mbDE6E`_yM)ARr)u zjVN#@)O4qsqlVoFBe70zJVMYBsr%g1v4KBG6zIgT1asJd9 zwsErYaXcjhF7>iZ%jRFjmQnMW$)s$Uu07XsAhY^08nqm` zwiDN7#sex?GDhW=(ekfZE=<>*YkA;*W_faLPp-?2#d5UVc5z;`D0y~mZ?4Pp#cH+O zcB)nlpN{qOMN{=$yXN=bXH7?#wY<9&D_$l~6#xH>!{>|BYPodiJSx?E&Z>6x?=FqY zrIR&$+g4BMl}=I1rJ2=yx^7QrYL&D94Uuo#=IN}VQodEo=fAL@&de(1Q+0hhme2o- ztMWGvpN{{F;}6vfjashW?~~V;OV$71&L10=OGj(?y8qwK$>Y&hjn#AYn%`*>%;J^Y zQcUI#jjZ(b6>R&VeI_-Gx=);yze-6KHoeb~7dErUzu#)Gw})eX?^JP>C2kInySD0Z zIWKa*cji)dK<@XsPp4$_LWN0%M%V)s>~sgA1u4WU*1HKJPuCa5(s+i9vnv*CvxaX zJQb0_<%slTakLp74LB+yjBO1BhS7k74h^4_QqCejiq}RabCh}HljN%qf8?epEf9f} z87yWf#y|to86N*31CEcFBWL9qhXykwb&SlbKS)^G6ce^2_mQGsZ!bno=1yhRUT=S$ z&yPJEQ0i$^43YPfBbeD)gY>}U_CC?|vip_>E`9BiRnl9g;7^NF-=FGZBw$N;ViHq; zwJekQ^LBH!U+QMLC<}aKHyT&B`T;937P=%Kfx?t#k5qa&6x{H>-E-yS#fK(ea7@ zroAF(Z z-GQo)nDSYMc)E`vD}!ct3iRyEF7`lQkG{U(b)04N=n`ML%XtvYJsuo8>Jp&xjWHu> z$;}cDYS{QIY4!4E#gPuHu5T2OVqASI!AZiyT#voiE2p9NT=x&cC!p_%_pPp^n^)|G zqBH)gy~MBc%}-_e{kc$$=h>PcV$?E+V21N$_nI9h=YfQT zL0Ct`X{k_o9Ck7J?0h$8F(zq+ceP^rZ(;i zV#STaZ&KN3t{96e8*wM#RM>%HE*`FqOBXpf1FuE<^Kb2;q`1>3o-NL=4!MukC}s%@ zwkHRPsVz{VR56oiO(83DE?YKYhS7$-g~)ZS_*NtT7`Lg5y%0wbq_r`HEu-@xofn)( z_LfaY^3L?A?Zkm8$7i(x*K=iWz==HiaA@b(q_qa(!)B*|puNtrJV3ls{`w4EcB-h;IPQAy zB11|pID!TPF5>mp(Nzu2aDpkC_Uxv`kjRX^F~{a8a8y~mKyc;!5PWP;v?COW%E-#v zrFKzSX%w2tJ#Te0+_H+eUM)d`kiE@w-r(gth3Rl;$N!OC1%f~L$-oPqgt#6Z@>^sP zpxht1x-nvG&#WTr6_RwBk|XenIaIo8!|EgoS|&=VMSx*}ZpNP{W3bpXLZ}Vi>H4GJ z88PyZdAhwBwtO|ZviU*^T!KBR1A&$xIKx*hpSRE;I!uoVU=c|l3^)i}{BCaGQJlIQ z4PG84$wCJf<_{kn>;qAKmk~-`SMQ?he!lwDLA|NX1aM){(?%JLG!8H@$d`fErQ}hh z?FV-II1kt7sl!0Y4uSLWm~nsH>|{r#@p~l6m6?JH9N?Q-QPNZfg<3E%^phEa02<)i zUQv5DMJ1Amzi^l%=^~)J{IHXoF&02&S}IfC(pSC}o|LhxzDaUr&~8i(Rn=b8MrIV+ zbCBnzbO)3IlH>eqo*By!X3Lz1cO%ilH2V>@?R#_SK@8p~`IlRNOT@r`EtXib8$m32 zkCiA#(G7QrSZ1u6jaindm_oHy!u|dIIbQ!cZrKJptSSZF1U&ySy!e9+WI4bFtil{C z;~LL+8vu}ID!3>)tC7N|w!wC?%Cs*snJc~ea?U^aJij7?bV%yAl!&l&v$4`$d}Jb@ z-Z@eQyp3wE%5#lgi=95fXCNR6{cRwxwWIz-P|qx;=kIQ67171;SxneQA{H3W6ku|6 zt*2?%C>))uFy*!a5BS9T>POUFxsIL7bswjOHc3^W$beHSAQ8O z&W?k;BO2GlNDb*$Pr`R|^&P{#k+dslxnebQf^a7J^I8+$C+BMJM9TL??_V5+tsJWg z-=@M@HMW!^Dw2Y}gvYEku8{Uqs6}Skv8MAVXz0n?vfGt!GI}V@4ZX9ah2*Y?gx8(JJS4!HO-KIUb zZ0j}!EnYw`7!MNJ`30PbO13>@*y8oNRZLh8 ze)TrfjO{gJx7Ry$1qK|~BO2B2yA+H-92xR@AiT)rCIq6WDNJsrD2O8gci;tA-8{IL z1PjK2hyon=kFb4iPLCh0S!{hSO*B{7;mtu~iz~RwN@XgaYkMqS1ES+5bv(_n!!i@a|Y;_GhFJIq|MMQBPecu zVL&`>FrXJY9jP99R1jeOfViwqCr=kTt*L*~q>>uby!C=#^s4|3(+FhR9$w!w-2H!? z*}wT8fA(_uM}NF&zSJ1D%<#Y2G<`4wd38Tjp=KcnN9oRW?Wf0lB1#AV%(&=zwIns> zvHA|)2&&q!-M%}7lYd#;NOg8n=uyEmdw3)*nz@2^mk27C1G~+#&J@B_IDmO0n>H%e za)rz}^mZ%$IHO>MBe@B{)KSIfL81iWphkKo(a>&xZ7--Z1?Z5m<( z{CRG0B#`6(@ZF@2Fo5#zry`Ks#gI=x1Zqjun-kkImc)K z?1U`VM&4+!@(9^x$l$h_QcO{5qC8SkV5ae%uBojhxCSZB5|)6+8vO?hfp8%g(lxP z|IM(f`4(yex9hd24R~A7UjL9}e1gf7V)+p2@Y8nD?%8&5cHm4ePY zTFL^Jxsg+6yX9esFC`mr)H0SG+MwggPd@+33JsL5vvFlP!#nF9d=w|}|G&CNZ zeo8RT2Bx%TnI8E~aDefUw02Uq=;~;$lXS=psW`sb?5a>#o#cXP#@VOYy6>jRv}A&^ zG&`5}{M&!}AQLom@Jy7^(=VPivjysad$>+q_V&#+86LZE{C^YCH_qiryfCw64}{wQ*S?87kNu zw-FeU1e0ZD+kDrY3=(P8-W+?JVkLU}NzIV%PSBNivUEY4t9#cb-__%&KVvnrtl8OA zDd~%AjjnE9e6aS9hH_oyyC9WHuKO&iMrfp$J#)%vxHwmP1tWe23DzP^3gJs$p#84? zOdno9MvXLjsX4j_s;F^X50Skf{9O|6ygA&VrHszm=FngnWqZ^4oVIobPL1q?BI8Cc z!L-%)7sPcFVe2A3Q2W4_4*`)7G6@GJQoM2QfccGF zPHvbMRc|x<4RnlIJ5E6~E^Ri`k;pNaq`7(NQUi-HSd1x1a}JSqWvnp%i$N{;eieQ z%Q{-aDdLsnY`%lT#Zp}WpuwZmsp~R|wB~CX2{__FaLZ=QoWv<|%N3AOuK*`nu6x-E zpj17&YkGdxk*JB5m2rvG8 z;5T(#eSeC_FZ}!6N3#aL`k{fv0Y&>DqUH<!V^hK=$WsGY_&~ReyRP<3IvemVUPQ1O&qH%^{Q@cy z4HCR)^g%!il-q>0F}p|>Ks%5yNNBSz&s=D~-AijdFp-R?mSMk9J&h5D^ajJ)_K%yV zb))7qdWV4q_DBL7%(F>eHW*Dy1*I@}^yc{L>Bt5Pla(WnE;hb2TP3G3HmvpLSlO_n zo2|DTrb=Vzih$}AM@p4z9isac%Wb`uB?f>Izk40nKniyf0twxM=GNG~C5Jg{7aZ zaFM#k6#5NsUOcfz>lg7odFyfF)%qm*RC}D-H%bGPw`}ABB?z%8*|ybUB7V`jLlP~w zd?*VjjY(8Yzqkq;)eTbg7i|RkA<00kOEx3+KId1q<*RJo$%9JQa~5wT>Hk2Kbkfpe z_f}NDu@V>ba?%GBZRF{5lXYl6B8gPkzOx?YcPi5N7j9Ik1Ktm?UtqiHw`uOeo$Gvh zz4X#|ng{K?rE4O1v#Z8RlJH13=jeXKK)}t@pB}(-h%5p;-7T&kDGiI#W zCCf42o04_zJ9kyD$5dYVDat5H#cIKk=D2my$nk(2NfSmI4?m72_K=N9`I>1LWi=c_jC z9r0A}YQn=c4${?quHLOx^VAo^V*Dj~*jeDN0FHrjmc&=mUK;Zjk+`>Jb9rzlA3;0o zcb2VwTewE{pZ_5XI5_UJ9ba-)F@_05oAVAMiRKfy+llYPOkhteTHdi%ZM9@ z?F!~zNgk6ku(8jsZB4A{71V>qGC204v-mI@FV-zP_8snqZJ2&oM+F%Nww;=~pna zf^J&%*2-uj$nGy=*Fru6CTk;fh=u+Nl@cS*@#{ZIDH0cADJ$1iKfg(tm`n@sBsP1i z+n8*qOE=b-+G);yL6ml*LTYN*uBG?%yeYwqj0Dt;3Xcs~P1aNar%mf95AlJ}RLFJ` zt=wUH;-`cLlwY-+Qx!_Y48VbYJY4&EZ}CR`-iXc{xxblyGjy-(`lQoX(?6u&q;|*et@?;tn8@K`ug|}6 zdSG+2vBG9@Wz69=5?vcUr8@-~0!H`#?O z5NLg4(8wSlDX4-0kPg1Ab}fy9pSgX$EY0|JEaaJO)}i3@UQ$5*wn!i3^G=gUtz?_E z4WN=loQF^f`?T(mq;T`Y%*@Vkm3CZY;-@^UYksnKgTm^*{{gB+25dfPscT}*kn4{A z!;1+jiwdt&j#?mkfty$kZ%)+=z2qDGREnyQU6DB@2jbBd{SMv>I^+$WcR$vve z7Q9PLfFpNTAJ-jOndg7^!Qhz?f4{!>ok7gIidtz~iA2yuSI^QCw7#`QBrjVBf)YKu zb*+f0b46JN$dm&_S#Qsh*YdzpzjoFcKOdT$=YN0mpCUu`-^(j7h+mn*9e4A};lkoS z_>+M|Lo8=*Dpi+PI}x5vzg-?X=6h+N&0g|R~O zHd1t~(G=kzBsUb?dSM3hw`#Ux9h#~=fZ>b#T1G<*33j9g%aYhiE9Ky9E63K;cP4}H zA%i`$;x;XX+lu}IsMu$g&1sPJ*fH`b;T_O&M29nd{aoB7*(zZ1);wMhj|mRY4E=#* z5Iai*xPBL)qNZ@?h%14h!9>2hc*aQkH`#_<2ij(_n;su1w3}(D-!dBBRG}^N$9|IZ z0Vo46)IA@UiiqxD^a_zlF8P{lRH;u)B7twijZ&UDuFK}{z6AY3+}UO&`VR$zf6cUA zpOnBphGb6L=$;CC(h~sH0r?^fiT#$bK-YwH3s9MVl+3(zPS@z|YweOCo8(?GUxfH7 zK(ib=yB{&a9?nvPb->*Z$STm;^&dFCvQG1cE4@4~B2O6B4KDPTFqgkSsW4oE8X>C| z(D2+isos)&J`GjqKY!M`FE4XXM_%0OJ-zO7+2=|9g>ROG<=TfKQ$>X?$TVtN)}T$* zQ!0BRzkLo=CY+Yl5&NDiRwKWXf4>4~QSVlRsnB@}cr+>4$}hW6@M%mt&s-o5H!FU} zS#FIi?;+*Yv{0>>RrKjhJKtPr3|d7`vA$egh30y8J!1@bcn3;jLqoA`EBdL!J~e-i zNbMa^kHpf;9vj@|+^e=(%l%WT|ll9=v+3=sA1qHC89+K(Z55Atqc>f2wb!O_ywH+4`0NXM(AHvNrYmQVznED#W)oxgPE#r(6~GA${-RL;8PDBuZIf$=}8dtC=KT!QL3?) zNoA6n^ww^h4p-m6dYX4n>YWt5IKRXJFsP?939)J`n;u1`Drd*u0->ReUNb; z9)8Ri^tzAZfjJOsGNBu;T$;tM!=;HmN!5mxBt6iy73b2Ed6MV<9~__{V)4n|^Uv-Q z8ZRF;ZG(PkKeU0sIFyTP)i4U5N2j(ftukZ|a`oZckR7sS`GSZgCS1PXE*~i}f=gDq z{a1rYlNyA^Efo0nT>{-gp9^6tEXtH*n{f(5KyY@p<3!v5Kt(P>k}^<$WeE$GUx}`Q zGBG9DWQdM%e~exaeG(gi-f*$lUXJqYT#az{9n`EP;~v^BZ0!;*PcC%>tY2|=DiOnt#yvN41Vxp+b>80-0JLUXO2E${%Bl1?W98LcapS&Px$l9-~jR zpbSBqL9|5LD)#uR-C0P?LDR}=R2a4Ml4yZ*c7dC^n_)J0!utl=D(1jZcQhFTmS>Bo zeTs4{i=j=_)yJqbBdtxu#@u>Los$l|x&zbJYqA8xkZdI*W67wTj~t&PWYHZFLDSA! za3Le3*L?%yCtJ-CTgi-C8kP=O zJDB^s#CHd|Jh(H6^b#xrx=Q>V)6jyHmKzc&di)pB9__6&XZ(3H?onn|WkX*E$D-CM z#RC%Ge1^kt$}Uz4rVHWRHxk1xqIHt~VAybVc-sQ{eQj~|lCDB*=?@3JI03@JdP<{jcSuYOzktNh!w4&p;o<_WTknm81w8jKCekUs}dzoPQtS88a4P={4Ejte5-r*^kA>r0SDJ8U~i6el%`2($hC_ivkdabTyM@?ci0BPqW@1nU&H^0B?vj>%dj>Guy+J!~Q``(j!TtCxkI#B6mYMLM zT{0Or$uedKZt}=+f_nvvrt8hM`rj;#|HJl8h%mow8{UZ;$P=!1JyUnFG11G89t}G( zw&V+w{_u|@B`rI6x;m|Qa-5Z9{RiM*^*7=V;|(54w!Px$hUOZA=_6Ho@VuTCA=ir2 zagUx7h0-0~4H|L2u_Czu{Od`tAyR|iN2$-A0UPpabhst zI)&!SP@Ws~VVY?4XK*)S`LO)_2)wx+5=E62Bj0D=aR}$85+lYpdh}`A%B@Pdymgn- zf0;A(M)+BMB+w~vS-RVW=n1rj?l6YmbL(k~@DGx7FtNk62n@L5Fg-;`b6^L+v2Lk} ztgf7OL);b(W4IXoOVGHPaIpEe`nAq$DFQtIKYp_o7cL1pT3-lq1+ybNuFKY6O%?%P zzXJ#V8DOk3K~Jn%3X&^Jo@5K;(Wh(SS!~tLpT%OeO~Gmq(lV9QCUCXZq!CZ^)I0i( ziH-~hoEjL-Atn$$YT?hQco>*4YGJgGhqol7x?e)65gSnUU^M8XDLU}N*RQ_w?!fT$ zy@9VgehnGHI`_0JN}|0&z+~NGv-+hgBWzI+@1uq;iTTEIK&y*4BBVjB2AWTZB%mB`JiO zXfW{XHB0VGTwK?W?Z(M9ckH2=u$~;_FpK9m7Ol7k9@n%yPW;)MYa>ptMn4hbI+-Ky zur&@j<2O%pei!(@U%tK~FSrkH4G4YNtRVT{Kj%pFH^w$Zfu0VC#08o!{VquC(V7dn z_*st!D;TUs0BVoWDT)m_><%-}gP_GRUvm2T*pQ6nF~M5e*Z`-$2MJ7vRwffajI3Nh zeCb5M7YmPxaBeGx$FQ*%4v(;K529d`tYgpP7RQe9c~CEdc;QS5lpi>?h4bc zroC2;x>Uucy;$|h(v!Z+W|>{Jbm*xcHX|Bz3@@7ch@3(bONRnO79g4W=?@_U{=XCs|D0O!`lxpp%s4Wsl;zCApvnz{!}e^gD*B0v*+FAE`+?UWLHmdvOg zD~kR%EY_zAC82zE(l4taHM;6@_2gnnqz;PvS+nS4AnXrvO=V{hwwDSFrI3`XVzfW1 z4Zl+oqL=(w$)+8kPWo0-s~P|6TR~smSNYqmDb;-i$!^oJil=IO@gsNoLgfT~3I9|j z+2EE^i50R3$vM#ol=8B{iE4x%;MjbkDJWDeRcW*vDp0M|y=-RjK>s*pqPl3tr#=I$ zbPs0T5gGV6yKaimuGsT@aJhzjc+<x#4j^?Or(Cw1Zr=wKSO0tV+kVpOodC5b*#A=no{@t-lG z*yTp{9MyMvO-+={zcMoS--uNu=)ltCzK-&cog(!>7~YZlgl>(|e;17_tU;3Q!e~qc zvpgvwq|ZsldovqQCN3-q3z{5Y>i;(|8HK}kJaz@jigtS;M5$&g>gq8@M85?S3KwaT zT^3EKETnyOS+_t=rB~9wx*2dHCIStA$z(X|O!1r3p~Okf)QMZ13}r`)lN5fdas2Q9 zY0bq~9BkB>>c?hGgTA(Q-&pc5+=fq$u?UKGQ<@g5-sFFtv}fwJErIdU|4qHYV}kdj z@%RpP4Cg$*B_n|@J3>6GPDmG7v()wfM+9Q1=JCLSDJEQek=b(R<}&UDMlfrMs3Uv8 zU}(dUB?`@e{St^rnNuz(QgGePq>(`>!;3(8MAih>hkhhi5)AtBA;UU z$$xdav1LDx{w`7B)beeA`|}^+$~FVt7aHG`=HOqal?8Cl8}aMSqR$)mpZnCK2aGa4 zEr7RQ&3%s|FZP_!Nm6e+ANkLJJZfq&Rtq1&cV4%(@B+$9K7z!uib)|XqPo)FadA^l2VLlB zvBajiKXq-R`epq{OzV$ogY6L%^*7CSWr^gg4lB~oNY=?HvT2!k^8ppv@sV&7~t%_B+EjLh%l~*;od2T$FZjD}< zY2uOYP^l%$kFfE+mByVyd1H&7+ZFSOQc33~tDJqn!wdcuLav%;#0)De$KnN$g} zRmR7E*}1796OJ9}DNVa#w>XQ{S8ys=e#k(xZ%L-BS^PhYy0(Q=ET|8PwbYQ59lsTG@80dn>Kel>0FT4|-Z z*7|bA}nihR6r6{R`#Vkv~GLU0i{A>mGb9V+i!<_ld;QaJ%AIGa##JWly z(J`o!=0bkQimVN7 z))j0vs~VIAtTZWa&~wD!Y6DqO9${KlA{4B~II)1S0ztS*y`q+-jPFESJ-V27B$$z;RHDLn%G*?++#>vNnH#7~O zu>#(}&;)H7OhtJ(>(6AVgdB2gDJwk++4t{&jaw4n$uX>BJPZs6q=*NXXE9YXIb_6o z3&QbepvtILNmQ4JNh77PMWOg$|L%Zl#`k~`eGHKIXOG=2&lKSCqa%5tUXJLq!rm3jPg1j#w+fR$|BMR4J~O~9)i2&6NTK3+ntlM>ibN0@rV2L0q=)ki|3^QUMYUf5kC2g zGg{4@9u0kxUic9@roXTW|9sCiN*edD=}Oy2O_G=7=h8P-Da&xBMC)E=#n5$&wDhl= zqM>}ZgwwxuQV~*%DR^kQ{j(nLSDZ*p$OhJC*%Ubyw@{>$b;_7RHua6AwFk;rBwb-w z8PCFA)OMB$rur+-88^XH+W*nf@MWzAUjfF$@0+9#clo^S2=HR%;?__&7ALxf536vsb;hGaeg4~TWhuD!pOD_k>lZz zH&)RpCqK;X2eA!y>Q`rF7M&pMMZYK-fo_2oOq9Z z+pmAq7ImjJfBb`UEY2YV^BGYH4t`j9ZEH-tZQ0F z_d7|ChSigWx$f)26{pe4$0?#g3E&ywj@{iGW)`x(fU#nyVoQSJhDb9W78X`3{_lwq z;JJs*$|M%?lg8+1r;}faOKyKh%mrp#5wpy`ADqj)VX7^QXFnPnyW{U_g2l;uK0VwF zK8N^u%~LZ6#5xZ4k7hxt+E_OS$^6{lGm>i+w&5`(Z0hsfV)TszXC4qi=-fJ{QjXaT z03JI7*Q88Rwq@;ms6pnMc6bAFvw7!}M6!%3C0-nT$1WHx%EKNJwG#*7Mx zE@+)=ufHp~tBP`5@_`<9;3wW-bP!pe2^b1GCT<6IKVddYx9Z~pK$jh$8Ve(1d;DK< z5F_y?+nzPRHan__0`EprEpo5zUclm{M3H}&r6E=(WpcEg^(R?-*VW!XC9w(-BK%aM3CTeAYA+0wo zSBv*YKc2BNr-Hc3ha*ZL03DAT)o3*D58Fa;wUAJ$_Um&%n8KrQd>F5y8Z_b9;k93n z#t}5oNo2eCFf%aTMW6os8;~;)vbgOkcQ?n4zLq3yQbc&NUr~4Jrz#*>JF8tNiEbQ# zSPB7zz{B{^q~|G0igutGU4;TdSHp=PQp}Zj?=K}rtg__GQ!Y0wKet9`T;3a1^_8?O z7+9M}Og5Kq`FiCTES%ZS#p{B0x;ijTN?b8Tew4gEO8sV)D8Nu?{UbQ+U4he;i)(jR7dv!qMW2JJ2zoW_*Ms-;u?R-?g_lymfq z?F_(ZxWU5+*z)=q8gf2_lr~muPyWU)KD%mr!J&Bm%JWojFWXBFwK;14)~^Ir*k-3T zuc`4#YcXFm?!wFS3{X^!6?^=76P@C&`sgr6FTqjs9kjCR<5{f`wHAfG_JImhe*GA3 zg-U73XdZN$U@JJHfsJS4^zmHp8i@u`wHL-DzSZ-1Q51l*U%<@PZ+GA2uP zY~6F8B5c93->>4)H)PKxsM8|#rlf$0Non35AT+#c*2q!#?_A=w#j+CK#3~`ybbr_B zjlE!wy}u^2^5Jy@9(K8SR`_A_#}&O$GDhsU^D_w?m91)mo0Ms@MVW~tN}KxH&&m!) z1wpwYhiYs*WIGT`3<-gu)Yo*WYFez0`)tXf?gf=OdcIyTomi79-ea9!zJ0LSw#Qj=AcZmjIJP| zK3M7{RMsuho#Jwrl3y{uMug>cgjQgY*XROiH7+rD+DMc$pjY^aKA+)3$FbZfYY-*kL>S>Dy85@qp(vF^E zKE+29R-#{EHmsfTHiR_v=^HU5QCglI*|j3FA}t$-c)bSa#Nk~YY)ywiVuIdQP9bc^ zMA`h89U3hn94i>kh*JW~GAdUbmwJy~;F`~vfJq;sEYtf4E5j7OE;iX^ht4A6B1ku3 z97g0Ln1jm{7{?jZ`KN~LdJn}H zPrq&>rmwVGlh6$^n@u`u3|B1TKHPcKR}zAy#sg4JIgTPid{F3YLcmP81(BN#IPmlC zlw$a=pr`nMpl%gZf=m@5Q$G0pcwIK37y!O?0G)P^$3`nu zrg4D17!|X_almBptOi&Nlr)f90`&e_IJD>P8dpo-!XabmPUO05`G;O#2 zH7V0hrxb2eZHW%C7`?vs;L{FG!gRPxtv6XmQMms$OtCTYH)?FSx}L^Yn;fB;h*J{2 z;m2Tc;nzuLV<8TNb%nu}GIut@8ZTxZw?3u!$pq^eN!-fX9uyBkDiwNO(7zo6Dhz$Y zon3jwE<`h%7AR?q#f0pCwKeDdgh_yPW3ty{NNEDB$d000)2003zIKivtP>|N}c^$nd&?F{w*AFD#$ zANP$`#2;OM(5&jFrB13|$;QsNZjzYn;~Gbvku^PJZyZv^+HDg>;)>~OeSRNu03Z~} zQMn?98_w3jt^q)N95@cVIQbg&IV!1snoP|kZ|V=$#%0Oup#=|1S+)nyWQ~Paw{8tF z$(csIo|frtJ*|VZI{Myoo|bu!B$*=o>MV{PO|czfv44+WW-X(Q6jMNtG3X(Z%~0N_ z!eveEx+9WiB`=ob>DdAL-8+ROx`R~)4VfeOR~NlrYVDbt;S;xROwcu5_}86k*|&M# zb5>Y0g#*E+>9lIof^8ca(Odi8w6eY;(b4f4&AXxq}V07 zqGv3c)y%VQ=~{x{4apa5zw!uVLNtdrO7A3@^hK6n?{OOUaV0uuUsoi0U`-6r7p2HMv&1eYy>d;*j2g!Z z9TNw~jHz?vulwtb*Ay1yPL5u;;?V16=y&u4OdcvWxIt4t6McC=*6aE=P7m|LAn|bk zYh5|M;M3R1!9QI~If*21)HOZCDR0#k8zIu7c8W9+>h^qOufdx`N4G~ z9eDd#s_d;#JzP)PcgyM);dCH+m!Sp*BnNpqIesF_+-o4HP<;!)&t`N@&3v-#zVd*!C4<#WPldhQ8dct^) zOkXHDPup{|CGi=Y(mrv7okq+KABJ>UjQ7K3vJ5eKll&)7!9)B)PIGi{djg{qW~9d= zKT#L9m-AWlhYiJCG8p!1%`D6q>jxv^X5Bo_W)o9_2GEs!(+=$1l(3O; zr%#k8O-BF3V&(jaLHkH!%l0rb?rxpcqsI>wEmn+5ucMNjlDTN}o>bLAWIv(*`X z*SLTGQUB)OQGKgPx6{WL{Zk*0E&iMw18vi;k3VP0AmL*SLRQdNAiX+9BH$Zkwt4O+ zMC75SMUm*rGk-Mw_C9EQrRjkx1P7k~ZK|F#)XJ<(4?&vl(-Hh3ldBP1j}Mz)DE;Kg zhQGmrfL4Fpk`E%S`RypWm;{#=DZawzYt1|xeu}ciy;q@!&8NR+fFjCgih7X}TBhPh=O z!ve)apqUjWdlRQ_o3*35QO z+r3N{@E)m5wVk-C`u3X%fxPgBHi2_^)ZEfwc!WBh5xb#dBcgEk=$gNTd}KlY#X2#1 zki}R-keySzF#3F7(#&6tn{oyWIZeKr@S&ZGI&pDcrY|VqX0ck!cXn=U6VD0VfgSY? zv>RzO81)AW^J9%tTM$jo^{IBZC+XdCbb+@i4&UcId_a(CD6pwWUPzJd)Xh7u_Um27EIs=MMx!|Xr%Ey4pLnc&^ z7`1lKf7c-`GzyhRv#Bc6+w70DB^udU_!=VhdK(Zun)EDNkN;bB}AUsMhP| zvi>VJgYKi1I=VMKnT% z%nyqG6d_LrU>D5lH}R#DOJQzN;V$|VUvuFJ%Nn{zJ1of}L;J4I5UN@9j0aGwR8DTd z6bn~#KTU=s(!?oeX2t(rlU?L?hX}T?i$<%jnrGkwvPt)9|K8*HzUK627TBi zm-W4P6?rB&9$##Y0rIxSM28Yr!3+wt2LUuH`v6A-N)y<1L};f4K?1=RW?qeO+m#~l z009XX@3U4^$Tu*8#GXUpfdtLV-*qN(pmXRO_WRgSR7Ge3t&u`aN6i77F zO>qo|(#pWH{7(?5HCl;;0vb;*C)VV)NUCmJF7-1z{Tt(iiIGk942*1%TvMO>+##oL}j*2 z!XQaP^@;EeblF8oKG8DyrBAyQO%}&<2i`|+e-*Y)lv_ny{TnBuo3%EN=mW>dA{K3j z6bj`&{-Q@AG*5$|goa}Ymm!Zepcnz)6zmc&|AX?QWA7Y5LJ5M-sj&<9f{AV+9p1%8 zBB~25oa`c|5`ljR7=l*g)I2CoWPPA)KprtF2wcZfFkJ-+KArYy9MF(ND(lm{2myLM zolXr7{&zmR6AknZaqF02RMORn;2*Vom31IOo(CIn5Ie-%5#3(5nOlnz>>gb6>9nV}Xs4$&|5fqp`#y#f-y?l#xAHsMqMzw-aZ4Nnp?bp0c z7aC|ow45_WF%7popWa7_rW-Ask7(gB1;m?cu21u`^uvV~%pg-X*tDQb?ZaVGi@sM| z{g5C19(lkXhU^35}BNN|JSAI5K>EL z;{Qw*qsZQ2y5C4kwQm#Bz~bYhdO%Wyif^qMck8bY6roycrzWfLHmZcu19oOY)l@Hu zQ$zSlK(sxRYEvwy^#31V$LLV*IABuB;8zFCC&6Ijl;ww{>dda z*I$Uk2aECA@B+or{^K3H*)1#V#~~1XX)K*Hlh9UoHVPjs-rZ~hil;5*7yH>QEB&8Z z7!&EI8AX5lg(Q5i_)N?UD3MlFAY9mIR@pZ|M8?JhTUJ5w0bf~lzkJb&O^MbtaNg~W z=A&?sp~*CxDikiPE8F*b;2K@m`E*t4mDJ3F*6zB<$^X14#0-=``yy<8x~G(dABM

mzgXlfhz9vPChUaJif+8NQ{vTeh(RXyoLJiq?L&GU#p~VFL7ECvORU z1iB8t4liE4p4UsFN0Syo&{x*qf1MJr5;23 z_w28h28#8n-Q>{immVz>m&xQ;)ZRyrmIaEnW)4S>9VxTtk2%h~fd>5pCRMn|$e+z1((ixAMZ=Ovl8)>(#5h z|KH7j5Kuy`gEucXjAp!Oc`YLVwT9*Q7~c*8Ji})jQFj;W=7$*_P}}<`E0-R^_!l+% zlqx)NH>8yq;pLY0>zBDVdVHeap4dVBJZhLiJJ-&XNC)gEX}v1!pzUF?_A6_?w8jd~ zSHn1b_R;UHP7UW>7)6QZzTWez0=FJk32ouxH0hhf`FvLT{N7s!uu5oDl?pA89ZuQ} zu#S?oRO(dRY6#xQBkU6t=|h?U^_e!ur@%RBfGG&oQtpg>LWjNU8sc%RapMb&kj!hM&} zBw1KkbwhjQIeogASzQ%dhf7Q85}GG4Yp9qObokg6SaTqsts9Nncl%ityU=S_{-yQR z2&d>J@Kj#dl`!Tn{@p(PQ|-}F3BN;&S#7mNE$}IRLsrqO+~A%3{#&L~S!z@VaVN($ zR6>icb&#~tR--Be^k}EPY_!=zfFG{*2U;beC6NP*lUo0dDl)N{b}~h-A(OQ+98<>4i#56f)cN#6g@T zCQZax!ka=amG~mQ_L*16b&1NID? z!45jWIq+Zb%egQ8xT~*_e1O#-T!Q1W?Xwdd{L^T@OC@AsRT13B1Pz?CZFCZy^G#%$t9h#$(zFhh7Jyq5Z##+QLx$dww%6H)j z{WaTl@x^-wF1RbL4*v}3%eqm_%WjaepW&K3A)|{EC;f#v`3@wJ~vXv=G>&>?5 zmw*sT0Yl9qO#Q{kRduRFYO%_M3k}2iygHc$;ELWRnbIM1hu8bn-LoN^uZ*cCL$dXJ zUDACcE#U3|Dpt$0yG4~S2(ZPE?7s47YE3bFQ4Ico$zoxsms*Gry4N-TD5GOM8#z{n zS{LifNo6VWV6qnPf#)k@+j~43@1$zW$I6T}`*&k2O5v?pB=0GGMv~xPNClO5t`+)4 zm2kh7Trt0eI==^oTMC%@KwLQ0a(T@QUl4j3B zIxE<$ULy9(W}u}^@@_mmZM=7YZq`C5!tRBiOmvtrQS@T}^)viR8$`sP^#KMnm4)>6 z8hm)KASf^N>Yz zkz@E0`~_*J60lXp7vzuURwi5XlcWf*-{GXhtjfx*yBifa&fNf9BR|&#<2zPv0N}Mo zi9HTEW+3y*&Vt(* zG|RGUAAs+VZ#K=VhuLGLb)W86)4W1m+<-4!ZIf zt62##$x3*Y;PozBQHL0!#lP%o(lM}gb=)Yvj-R$3zhqE+Q&Zs+^wW4mZ!_Y8Hmz}9 zf|*~)r@tJ~Uvyp5gZ;hviRFC+Z`U4o5nf%#ltJ>|C?I-%UAb_fd%VcLGa_%?mUKri z&^hnLh>u|%PuoP~6TFHTpLyXvwlP1FhV*(jL%()|OuZTxk!Bv>I%NnJ)JfzMJdcYA z?tS6jt})+|ME&ZK-zEUl&W1AB2MczPcty`+hF9I+Fk}6WzfC%Najtju7ND+wg(Y(+ zo{lD(g(p`) z*x~p9tP;yO5YpocmGQ2Aup!KE^RPen=x$w^Y-Rh*X;okGB4n(EE#Fkun%=WxVeKZQ z1#-Nz>{X|(iDKk#dJ3;il=MTpf=tbC1%}3|8rFuqtcO`2~~a{r&l@2 zdniiNW;D5AqHr>ygI2?lN|)n!>*-}D@BnV6*wS+|PD1}trjc*YwpWdkp!n99F> zz4nzXN!$1rwQ%#wO;pK9xKPpN)whAHz>xTQh-g5E7Xd?0!RVkxQRnqnCw9NTu`g;U zw8M*l?r**c4kpII>L><30ZW*J4OJqNbhB&$<&G$82$}o=J*4dQxuJ!W;1~xJ!*D|a zqo05U%-*UBNy+`&It9z-L^fFK^K zD|NPJ!5LsbT`cVFXqnmQershF zy5$B0V4h3P;*dZidjOH7!HEil$U_uBk!WaO1R`BJ4`nzKH$~Gzl$Paqpz2(x_es+o zxC|%qY<<5Ic;gBUDE)HzMgVqh<%Jrd8;>&u`k~?_)nG1<%>Lv)wqCjh*i2w-2J<}v zei7A6gLNbE6Zl0CSKg`>iO+5WOZ>o@4aDv7=nan8^?Q;gA8(4fCOAjMoY{oMU@Nb; zRQ}D0(H(umUKh*giREf8k1q^xR$UryMY)lllrnT2VQm?m4Q1!PAJ;P0jkuw;8nd43 zc_j9lc|%|Q?!o=cEzO}aO_W+{zSBDUg|H#XAkW;x;X_ig7Sj*+?VJ;(sE>!TVk)o;*vMP)D1Oe2^BUtQQHvu%0SjMmfn*p`)s}s;HgVS6a0j+av zf}WQ_V6{xJZT_@S5}w{{vN=cTHiBn<9CnLF`Jca6){Uk(U*T{Q+$4Fo$!?a~u47au z9V>?}gJU-{3dZ}})=OqKbFH2ecgk)Y0z3Vv<*3}konFr4RuKDgdxLbVaN*0D>d%y- z2Jo_2GiP3*H!fiXY&cddR{|e1Cq=7~2c#SAC3`Pq!nEqZ4f_;LzuUEDKvDKJQ(%Ci=8HQjJ*~2i`OaB zLw|((is&fdheskWN{7O{xT3c@di*@SvOn*$+`IHCUHpn=dUnO=hNLfXdJm6&-#Ked zUFiO4Pz`j^lATDN%T8{xb%FO)vRE2)6>oi0m&-~(~#?tVur;sc1jP28)?Gj*eiLj#af*sb5Ae*;yas#CvE zh4Qi*nZ&VUxo-R3V#*JaKmbiEB&1cNVcQk~Tw>*ISkBVOoU~hQtj#QENhFtS{R0vE zNr}_({)gjGe|ON^t>?6rXqji`?~AwncA7rigz1IU_t$_usqBZe_M2_rJ5=g>s0G#v z#~n*0q^&^v@_hTZT$1TW)K$VY8Fe{0ym$dZX!wi zd-C>A*umF8X7ZOrVM)$4Up9YKIWw>Xx=hqan6&Nd6)*|-tpP~Mdx0azT0|U#zTf6C zJMem4+N%nuXFF7b{}B9YVrn4&BbefFgZ-1da)hm$e5U4s7cp4riNexTH6(L z&%zW5_L8xoN-lc@0#SJ7U5MFl_f%953XnabHxjN^p#V9f0kZQhOA5Nv!=H`tw8-~n z-*x_p^&2ALz-{lbq68~MtG>S@C-%gY98E^%M%9FE!g*@NLu#hJe?GAVI3ZO0C&tm zT}9!x{KM<8Svv;x_dv-0(38fI`=bAArQs|tEH>Ve3@be7xXWEcueFK6Iz4ENBM zc;>RB|A49$ZI43hzK>~jpd7UYjZ#rEx|wGNxD8i+6zkq<8t$AekpQc+4$o0>Mg6uUXH$pJBoHV3=rQlsNwlwRlyiFtu{o4&h1N2 z!1Z|c95=WzfDUcVDQJ{r#*?k8o2E42h$Nwegv!l4b9Pg4orfiyXc$*hY}e0=_yCZD zmmUR=0R<*lEtc>_TpB#LD6_?6_M8#TC^W$w-F}8%FV9Dw8OD;d2E}=J44mK&KclwJ z?M6t9eOd&ctSkPfJLTGk)`ze`Q*Lg;Zr3;KT;E{i#O&8Iam$Vb+e6UR&XPR&^&Kj8lgZHR6@9g5%p04=|HNdLzUn1khigK9(STh1H9h~NT9#RPwfM>U8{ zHCqqiBV%R#DdpDN?QA67k_QuqmB_ADnK9zMP5uP{I0M*5E~Lf2pZ7fBpK3ptxBq~a z+UM}yw%Cs;zrYbt`e{1hYZ*Fhc7I)6ZEs)iKN^^cc~5;medO6o&GVNi`%Az21=fAU zm6HU5G?F4lO1WYd2Z4;kBWVXgi2RVS)(J-cAb~1YqFRbb${b@k7ONtmy8xYmWFS4F z%wuJwl5*+F=SrA>ov>s}Cp5>)6Xy^%QN%4Z#fM-@D1y$DGsR-!EIi@l)SOsBP4=it z!YSelqB#*Le-EFd?-I8MTuk=y@HxkeclSr?V{fV^nL^4Z3d_g)2N3131U-$WX+_DKDi>j>bB?XrAef}%=gUX96&(%LrzqLl(={n_n;o=8;;pBP$ z_xcTn7xkLka?kYnoPGDT-y3m*>_N4kg?_gcFctV}=WF1T*Z0d?wUtJDJdoNz+e5L) zpIkuKYs5cBX=q0UX`|_M`bj#lgQz38Fb>i}UZXjsg{t+G4Vk{>+T$bpRf!D;2^^kMga9)zR#5)>-``@oLl^A_P) zkKw0D-zEbMH(}7JcNSy0!-jS1@D;yo70xSfNg+0Cw*bdY5kuwn%@QDr_}^LD!Bf z*B`&$_8gM+AUMUjWc@_!_?Q4Ys1Mhg(fnmIqD=UxqInjTg1?WAIrx43Elomw0XHBN z*03|z8RBG`%b}v2i+UU#-Bgvgj5nBL?;Um6S%;f^3H9DS^i5=8Uzjn%|E3x~j-a{n z>YAuVX<{JIQCc+VMqV&lvB-3VA;zyD1&-PpNm%GpuigixUPZoJF&4N{C7yo}dtS%r zE*S|@fVqd_IOEW-jx8+zP;N~aj-jgRbDWH1i5-E{`0{V!F0-4K8fMr+d0}8NIa}3g zl1b*vS^=}+Bz5x59J<+YU~r7hYb;-VVn{}2UEeM*XY}u7(6<=V)_Hw28HrK6DKDj( zp7r;oN2bR5EZMP+C%-BBwUa1XvJEkQFiub?M@{@MRgyL@Z za4-1mer?>4ZF-a_oVriA@lc_-c~p@LgKp_zmN7=0-P!{}Qg?PUEPE4P+`@xr9f5PA zp_0gwPrIk>3kSjT?;9}j?A-FK@$7g6jYQ{Bc1@nV@}u==u~vZA);$$oCKktl#%2t| z50Glz6zd>*F)i@oF^r?3_9V#s#ABdAS60Nz=2S{El_{+}!5ka5zcaT-;IkDxZ@!vw zdja(Q9W`W{uUM}_-W?ENS|4AxHa~riH)&q$7WagZ9Bv+PyQ8_{bFlG z8%iWHd@9I7jkE{5`ZL%e5zdsg_fI=e6c^{ORj3*$GMdW`-f-KX2V~-rBoz@LM{IGf zA>}Vg^P522{0$<>f8e^7cdMHJ=_OhCp44socsI1%m)4afvZQa*yS`0WksteX-*CEa zlR%HL;{F2H>aJLMbL02nWNdBheqwO31PJx)-{yRKh}t!1h%V=Typ3dXO~c{UZ%Od~PJ7{0d?$wHzcaS)daY{VDeSzcD1by~10XzuCbtfdBxk z|A(=MiK(-(lcj@;z0?23MlJbjJK(IOXt>XKGho2v`bg9ML1ILKm`kMH&e*Tl20+P?64{gEzvg{$z4qMMsEdn5qsRQYsQNh= z`E$>Yde#f`*$wJ{&8{NKn38E!$-1;SsUlrv`IuE%vdg|DWp8SQsmjRQQk`OX{EWiv zE$_@%%=4y|>j&Ke^m(i`RFkkCQK>;{Jvf<_(XB%J(Q1S?xljH_vsrAf2j+#?4Dwo9 z4fA@Wy86M_gUu>+PjjvEU(=o2dgbEq-dVb4U>T}4P_CSoma~<7h3vqCqcc#hyhg=w zG;2>;{|51`%Y1fFnesAXJ3rLR!ZFO|jE4B$H^wGDV_g52qL)9;bzH{C-Zw}0ZwMxz zOmgr~+|CR6P(F5c_`%uA3;H;b#l3bN|H0YpHOLM7Sa|&QZ1g-;!)zqFf3-Vr)XYJJWNUO64^f4Z|CqH*rOFd7! zP)}8(+v#z$emcHN35$-e6c~jfNd+1$2Oz492w~u%K$9UFe_86`$^c37BEfzynL|UaGUsa zm}=Iw|1Q|#v$x5x_jwk!Ha-w$1H+$Rt+lQ5w*W(C-Pv+%RCsr_X$O2?-{DM z_m6|~(h@HTh)i_Ok&@Do32N-5*qO+%8qU*T&iZ*Ar4D(_k<<0^Wm$7w+sl^Ezx*gC*-VA<$~A$DzC!L!IB-`~J9;Dlm<0hhJsWGKdQ8 z;>BW*mo64;cB80`eu7zJVd)am=aZh)>FTEda%IMAJu#1e^2%bp7Of&Snd(vooE05( z_1=R*>`X8j(;v*@?@X=^5noQ>ZiQBvPR`O?6PcHaowUu-O*`|i|HDTe_^|rhrnp7Z5@0Qi*>nlNdmB%vs8YQ|_EqEhy z#_^kj?~N?fqOU91C3aKJ^@0y7-{MmPj36dKVAp-Z%7!uXID;nq<}BCt8?m5G4pt7j z1YQ8HP1#<)s*`^TpNBWx@w3M?AL73%yct5@CR>&UZ%RX9lWJ>FNazso&q-SG_LB|R>;S!!ef-h+CCCSe%n8^G^ z7!aYplBppEV~U=1ik@_go^+0;36FxT=(_7Q+%++44#@+^u+*}9hUpphpaRtPI>D>dgtFv#zex0;f+lEtZKJ|?4 zZoSgH2HHG(FWp=A>;Sb0Yl4+=&cPy3h01tzEA!oMUXHm+C8x?^W@rPsC_j&jdO=qbmZp2 z7XlG1nF3K;E=~$?DhV*Er4#+7u9(LGU`=}gW z=?kl509Wc&H@ozK_1&L@!W34y{1Ihsi)~8QWjz^E;Q6mlA`$@?H!1>R%otWcIw%DI=z-3Cz1nXOGyRP<0JsT$ltX?foo4_V z2>L)hTh{RDcD4m)*_3&dlZdb~pNjL&iKyV;Ai*JslyO@^Hb)R1MMgE$k5V`B+z~gu z6I)1eeB#NY2S*v!RK>Wt;z84^H+AaC@bQfegS{vgCJ~@f-@XEn-h8~hhV4Ybk&MS% zW^5q??6uoU$O)1R(61;v0it&MvIA#755nK+R&k4Ifk;kCPWprL?4e>PNFD+|N4TU8 zkZDFGeaPki!Pq$ji5hEbv~AmV_i5XQ}zRjU<$X&~MieKYA^@=L!>>ahE<}_$OVM`9&hZH&nW# z<;z%EpxpZ@_6pw-ZtKn4x@pIFWpgY-Et+~F2aOXIfDK+V-%SbvR5ZaB#a1=XjF_cki|B$C*}+q!+)*x|62V90EN0Y6xF{u*d1Z<- z`A`>c{KhG2_rY7>E)*HD1<0GEFUe`#CP*UA(sW{N6GlLY1N}xLk}q6@g6QJsHseG3 z@Wb{P5&}L%NKQOJ^c5tbXi^_`{=}I{62@U0=ZEu$q)7J{1UV zH$vGR74Irb40c1O)t|oQ6_f?ti48@?kC#njGa$zxd{Mj59zG(=1mUo1&FmILj~~w5 zSqlYgtOSu6b&RX&f$A$rO?lZ?^D+fkga*fYN=Ou5Aq-m?0AqX|nqt`geJ<;e6=}|$ z-9usx91D?xFNxSJP58|((iOIBC3BH$4*oPB_A$zljw(fsPTVM_l|NA;b&h}0qiA*k zqn)5yIX=5OpGr6+>!07bj_(nv>;_8{rHa&2SlHUtPf@g@b%U&Oi)ay11(s^$H@YIU z7Gp}-{lHSJZYO{#Wau1LVCah(QXm*W|C_mG4nK0bj!!2RzMJoFEF3s}5C*mwb=V`Q zbWhkg&|fu7Kc$!edmRNq5#FNGwGBSyHdt{EK_hOF2jsZN9mnt>dXyrgNC^#bAk}sf zzk|d^096aS;(O}mbfRXaZSw4{^6v~67`NVvrbj#qV+v4&e5vQ3%VXJ9w8c;~QvT>a zgO*kY5r(2<{J|8l|3cuB90hc(E?54pZbC{jehcZka%ztA+hEuI1)?8PLw~Zozxd)d1DQN%9zX;zX_w5Ph z#=M?XiFj23e|%!J*bA@xzjYBNJ2YNE7=N)DB2OUdK9RcV(hGBsEDMJ|CjD$tdof&= z>Yy7s8eo!4k@+P0|slFWwYB^ zChp_aHFw>en>9mL<6E(5wh3cFHXAcX>ZL7Fi0ySEEU?#*(#ffYxl?RFg1{KTwOF zdmO1-r$Y7&LKv&)4pBll6vT)(>TSdX*XZ_36iLJ@sOM_;v{UVXT|oDg&x~RrV#jdc zz>~bo$yI+4-T}u^pM52cq4KnDbM`YwvnW42QD^h>56?983+!OLNV!J6gdF>X1Ny0K zsi%&9lJUlMhG50HVV=q=XCO}_tR4yErdnVI=mN7W=#A9n2%JF+=;zi$x7`4;?3OXM zbZw;VA?*Yar5l@~oU~h7oD~FAqL{(v5!&@;2U>*YcJ^n#mtLgK54vNDhZq+aeYMne z8hCyovDqyByP~UP^+xp=lq#tFT!53*U50eH3)V=<9X(07PFJp`!S?7SS(NI7k^-FQcX?3uze@0U!@^ml(=m`}=%3~+{|&t2HgL75CYi87(x zGUx&~|I2PUH{i=x{QWVB5B-R)zftgNodR=m0;Euyz65Z@$@}U@7cq+HcozJf`WsPv z^pjMa{G-t1MQ6XWf@u@q+7jE$IVXsbSXtCu7Oc1gZ@TU?RvYs^_u3 zs@EB0f|;!IMeG}&lOp*agg?-r9xYH*`N5Mi7*x_W>kxmz_rNu$8?*?I6d7yoom;o= zX+(EGI}+;4U?VrKn`qo9n`SvuqCelp3IT>JDi7@j>?5~&j9^GQBlak1$U+sc0{NvZ z@u62HyjX%$P5`3KVTH3EgCd|@XI_(IsXF~aWQuEREN}Z2dut(mn=VY#uQZpvtbYP( zN4{_PsJp^{lEt)74@8nbGZ!WQ@k}0i#Js;Im5cNmH^c9FV@j+M5Fll%y8VB*V#->r z{A>6hit9KgXY=rMpA#(9p)B3evej`H(p`}&Bq*mIgqE}Pm$QtPwfdo&dsaX;2B>L* zRV;i`Ao;5M%bin5suq4_VPGj%3xsbB%SnE?^o7i53lA5?xXB zx1@+qYg7(6O{;O1Z@vtl^(&GbVfU6w5}LqHwW|yaAl0bozT$R^d?IjCaUG02s82COpkMINo^%~!nt`LW_IVAIWE+@g$;toVci_hZGg zU!Vop7{Y?t+EemNNU_Cq2g(KWBq3!C%$w6DD@fZi0({j^-W5xk@1>Q<11y;fWy_iD zR24lFA%`fCV1gh-k!B~MT63vh9|-Ci?^wJFK(j(Wxhu;{NvV7|BJe+}BVtJ#K0=lf z_1{wXP4vT85w^e$972bfaB;yJOQ67e{|4FTD0-`GnI}qC2rclAiXR@hs9OeVxdIpY(j>stFz<=- zuV7laZp16&D5|Jqt0L8EqrY2W1?GeG9REJ)%6`L%JFH}XM-AUVh(_M>k6JUQ*)ye( z!?6|xjz$l56WXg(JjYG0BT1m-*mIN&2luLgiUn{-a1_O`&lONZ{&!os7q$iuAmK9i z8^@-l2vphASVr>hL?4O`!(YQj4C`mrMn^+eOS|a%aJ*(m?#*ci(ta5WiFJOOujx0v z6B9`0X)4roAYtMg^tfAB%t`XjwxFRgU4nv!P=NM$P~nxIG$|*46UMa%^Xp7kc2BXW zu_3+8k6La#4Kwnz{9sb^m;SN2K%F0)zuG8fNpxDV+A3ycWXhr1AZB@FTGDy|r&cBd zxtY?jffd%53E&cbvOGd_y~eDWN&sgoOi8EBCO-GY`U z08}Q?YKaNAPNv2b@+O!-z_1F&D(FBGcgKhyXIC!@JKBi7`DZY{ZaC%NIoOlti9XIj zZ5sH+qT;8)4a<2zUPz6jp@1e&XeG&3xs5Ro>05A=E!ZT0$i!H_>h23}5V^RPA8)uAJB(3!|z_m%kd5Ze&)aXuZm zt8iCGTS*K!P|!{6etZfqzg3|OeF=slFXRnwf57IV;bx(hdPZKDB#~3rQuw^3vx8iOF1Xc)#5LF|toKJ<#k-cF-V!cC@+Z001sW77ji&663gzXw>C;E75-30_w7ZgGyixZyz~hOtkDOU_ z*_3NDjRfc7e=K^YziJx)(s+46fWZ-ji3_hlmPlOZIVt|Y)s&Ox>U}(S)5nmO^ z9I)ge`cya*V+r#Ni)?fxf9Fq4=0*9j#Z%bjdFN5Oq#?mRQtv_J|AtvzhSUBbC2p6FpN6&;EsWu zxQJEIuIs&{C7Gq8o_Me@jF_BNYS8eKjnDq`o#3eD(l+NDq75x2m_iAvO0PZuQrPndsCqqAo4@ z$oRmkY^;UY*UOLTGnswmEw}_aGJ!@#7pF-v?nY@LNPs9ZBtKz=3&|A&iY{yXVb;7JSUei_8*&36oizp+uJDx+!kH^9l(_#?`jTP^J*17(0LZ_` z_zGfRSQ!2X;23gCM#LmaPZb$3Gq~AILo_mYj@2rZ#Fr9@aBTxCdlv`U{Jd@m!-tl@YDY7C8)THgpQQLStnq&(5@O;l%R z_;)jZ`BsElJ8T6f!_k+=Y^+tdHF3IL%zj$mDvvQDWR>POHFP;uCG?kio;5gPg^ROI z5ZS68P+*7$#s81XNTJ$t80cS-!zo*YaeoQI>08DrWF}2gEcR>`@ftIO&gj3wmv@f$ zCc{x_4u_(`hjyxmvhmiIJYdlh)HyD-XIY1t7K&utsjW+OeJT29-()<%{{%hpq%1Bh>sf2bPR)n70P5R(i`HWVt3c6 zE>MUUOnP}mq&aBFFgEh$E9WiGFp#QR1#-D`c;^FiU(RVjxE3ugEg=bv*L_* zdyfxSzlz&`DLwxqOM4t0+j~43;i4;dJG_x=%A(oOY~S7W0ZL$BRhs|8>&=yFP+Ac!+gG*OX?OB2 z|67zNXmv-o1IV_B%S|<}Q;N-2=k!?hudS}8 zPiCs`=gTx#t6Mm>6g73EZR7==cU?ylkqV}thDMKLA?pNxxa84hUOsh|vKz4N0~^|I zsYFFIRFpyck>;2xT5H$ESoc>Byt;f=w1&i%Vs9Xqg@=3+{7_mO`Zs<*>qF>_tDVcl z)QQ96%0+YLWaR4b_jPgYR=bPmxulz~rMW%o4K##*&N7vo`}4-aGqrQs*TTZ}MtJ3_ zO>LFnNpkV#?H}#%9&R6R`!%ld6d4*ei%Az&(C8N_S{qCodd|bIk_RJC)`1T+jqUir zV_iAZ#S6e6(o@N6UB=u)RddPs&*Jv$uD(B~rc&w_Dnm9o$Gx;0r=daf=oD?>gJ+RO zDkHcK!5aQGjwU~eUe)3$M~Hjm#6BDq_Sk$<(Wz6z+(0=Gb_3F#GYnmHNKd?%e>r0HWvkTIENQTinRhS0toK+VLmz{G>IX+7 z6uI$3_!u6j$IGN&L^4#?P!fZON@H8phQ~rULs~g!H0~^6`xEzrKaVvlvNsyGs zF*OWQN<%!3)6Zg{7PJnif&kEkn!yQQhf(Vr%jR!~P>E0z7Z3RPS!F@wNvEyoPFKro zk>3_^m5e|USXU;h@JtbtKM{DR_0z~cL`*tY10ki@{f<`yG3F!;VEiK{KY(!T;oH(y z%Zm%fFq!fEYe^VD%-F+I_|_+`x9SPm7)?mSH#dNg;t1^cJyi&7i<>9Wi^^)=o?-ge z?-n!wg7CRk?*VXJww|8`nVN!hL=IPvql$Wv`O4Oen>XYdSbA~92W@VNi_vHc4p-uS z@>4`nnA&5)EJB!|2|-x+-_rLJQT?=_i7Mm7MhD`k#2?$E9JDscaf7lDk_FzNbNL%z zVBsHp#nZbKq!EtWW;u}LhWL#n5<2M8#(h30w8I;96J>`nr}u?Mb6C3_0X*_WRO4H7 zFq@Z+=71A3NStA^PpD%Dd2&0YNyRuE7=S+}(6QFF*(CwTwyvU5Md$-hmlJHF}Et%`*p^_|3ML+6cG->5flB2 z#t}t}fH2Y1j*I|X&LROEx{4uemfCyagKYDzNITCKN1_0oOwB}ByQC8?R|iY~@oVN4 zDRm*(oMp7sygev2+-jEe`fFFqGGB8Geng~CL$Fxx9ZH!F_=PQF1tRxPt-LdS1Zen_ zdkt9n&l>LV`VHdn3L+W0?yGyaCUDw~P%MO-y7LWWwxu?uZHAI?me~Y-8U8dCal)Mj zM}>-65ogB^|xG3fZ?8_}_5yXfj}Z z)D*Hg_B)2-Y}i0@SvjEdp~D?~!O|anb^_A`Y%2Y>g!3(5bR&@xNB;8|I5^x=2dp`^ zYXIgO@X$j0v~NBT<{Fea_PFCS?Vu53kZ4a=_GoNKGcAb{d!tSzi>Z=OQ{7WbV&PZG zHj!z3-TEwW7on7^A9jTX!}XVZ4}qFM1@4@0`K6mYgFFD*6&7_HtB`>BwDD-8_gG9n z;|zzuoH1dMwFkGIy)`n?d7uO&Ow=6LFcsT6xQ2pZd}s~S?RIQn?=wfNgXSw@4u>ho zBT*k;_Wb#1G|r-KsjNa&9>;5?`BVF%*)HlVLG(n5rrg6pZ;H#rjD+*&djDZ`d8_$c zL=i@QZ;awKOdG$6bV82MI88Mw#MqW|b@IZv!6J-|bH6rx}{niF)&I zP&G?0XX^{FPETl z7^_7SzeIN#TGA*gN*iVU&cUXH4KCiUKwy{Tweo2<(eoTpwB$%?{xPh~zjjoluLFnb z{8h#@1fn?3n9xRpO1Zw^o$(uW-1;!@Uj!E)s4eDrfDJ4Re@-OlJxaklk!F3&l;+7l z(<8txyd*8>>Ddtj5%-t-VMIq2^ZU=1_WH(H3t^a0?{nw9hoCKlq`Tfc3s%S>vDEHr znPp)gQIVLL8L{Ip>$E0HDQD^U%PWRBA{eqsH1E>j9CF4SM(8O6PvPP4!pCssQaIHV zre1~Xi8SJ!dYY8y2|(5R#xB;Pn5Kp7+66?!6Cl+pJ2vrD+x{lPjYfdIdo0+um<8W9 z2%T_l?kENB7X|de9DZ480FTVtgx-IX)byfK_OrLKUsUILal*+~7HEhsRs6sqH5#yw z{e&?q%dIr=qTAWPvcJv)s!Pz@v||s#`A$DSf-5vrWHHU6*5q=lco`S$xupR}`L~Bg z)*spA&O;P{kemG2@b@8=jK1?o|L|rGl7!$)H|6%U#vzSrofvt;Gxr!mD!GX#-?}23 zJs?vsnD{ab^X(E&X$-^g#LDaHM@U1hvJ(%m6dgtx5@P31podrr8=D`dEm9C5(!+mbSFA=rb>BBx2QpM(>}nLGa>Xt@rN;mly)8WJ#6u?$6s#10W|d+qQC z%g6ok$E}|fHv-0}e_R2Kl}S&8AnW557uMCN!$+`o;KWrt+L~zzG}@>S8*(&uA}nZn z2))a|okzY}16$E&10b--LMW?3!7Ueyw6mxFh)W$+Ix`b*S=DeU!~^Xp3w3FQ=;PSl)+uCK z9!{ksa;#zcAm+V(Kxpc;Lne}MU94(ZRIA5%q%)s&;>2Qb8F9KRf0GZu<*3B=C&5J} zCy4tDKt0VbgFHr#p@E(N|I~j0B!WQ>BpAy4CfF1B3(b&u{>P2%mam}w(1(Qo-d(#l z60oRErwuYWyO%PmdthgRNSRF|o23x-&az70YfVpn7Y@XO6N>Cm8DsRu)a+M$LJE0v za?jKa>?Lk)CjMRoS;Z!1GfXH-;R{$m!x(jI_8yhu{<8JXU1EgRml05D9g)!dYMP+6 z&!bBDP9VssqUhPA;4P~x8(jKlRDld0i{11Abfe!MFx;8CIeF*LK%)UuW9b!|nVjg# z->~h)8#p8|sBbUV^{F5(E()>m1qI2;Z>v_RQRV1o$89`qm9F~}kYA#m*gJwhWvzQ( zW0_X6ET#83C^XT6Qj!k>56y^IrgeP&zC(J_C3N&gGoS3zP44=l8TbbtXXK7|+`Aev zwt~(-0HYq9_Unu(KSI(r5$A=41X-~N!lXTdS@`>%zG0A(Av3!W?DUXcy|FS0&9C^P zAi!X}AOb2s{$_R!Yku2BOzKH6IWgI)QWm@jxDieuFr8Eu7^ME5ej1+_5B|!L4-o4T zci7UQVX+t^e(=TjaQet)Hx@IgLvG_4Hd;8M&rlUzw*yuLt9 zY9ou0p~QG$l$MBdLpaV-b@Lu|3nT=oNw`25CWnIFw7k(0b|IBhtrUvM{SoC5=&(S) z(qhVQDzGPNUd{~gXCFKa*_P!1G3T?GyrrkK6yG2jLi(O?!gfyc zuf89&K^<&gSeT+sudXQjS$zCqYj%{Ur1Qp%J!?U@l!V1GuY)+`Mk$4_RUcKon|mZl zCRFdBZOo=@Gkr|3`S4Fqtx~m(?vU+ca&26$Tv(?deaKd^^IZ?IFuN?igvO8&V z*-$t}L*2=HN9vC)hOKi%=O}}ewex)fgfYBw+9wSkI!9yAT;VO zz6^t9AwJ003VkES@ehGn=V$l^k8%wk5aWL^;YrmiMIe+>%a; zFoM9b8YQpxPvMwPNByq&Omr)^C9g{uK$_CQZgS2|GxDmgDW|n^L;5G#pmh-69I&kK zrxPHN7HrT$CjCnbWiZ-KFz|GHL;H*0i3!A>n4Y1=K+`|mI>&PMk!=egxp9xF{lZrl z<&{A7j=M0;WNO?&?y3Vi2k%^kwx@+~eK%&=Vl&K4mX(LW)(_{o?p`pY_lCC%(yb44 z=7~;t19GKs?qd$MeL=iK+}wIxfo|k(%8$gvZ&N-<BAb?5f=2cUJ;Ps^EQ-^1I{Zy>%YqOt?V|(_E$O z*}~+U?**UebJvy#o4qp-_?8M1t6Y7YJmN1Yqy-9B$pS>f{MmDUu+!3?n-6wAJ zhCo5a9m`$m_L!#i+-QoW=(et2M%%aw^bYnwkhg$KO5!N>=y7+lenLsU z_2>Kl(r1Br*rCow%-@4pK#!~zFT!lW(Zg+T-L%X}>N6-w9YOmJg!rSKv=~=P=-f96p0^Tu|f&OEaCy%{D#-R7*Wz}lTYy?ZE z{HT<7vO00aABN^y!_<$jV#)_y1RMm=V*cg1q=2J^ltk&YU7mP`ge!1rIB$KbtM^a~ z35%15M7DX39>Tw1!n=_l^8lNO8<+cOj^hcHSBqDUDrC{mc~^^)&%E#^v*eYC zVgf1>yTR^W5cGqM)1hH#8p8Buwp>$xC;>@;yG9j*VQM!lQSyXGoMl1Wl*Arn8_v5r zp{yH*g^z4?Aw59OoXr<_L?;h*u|JVkW+XpYZDh)iSCQ9JnQx-Gau)<0=b5Ys#rMUQ zZ$UyS0Ota4o|B^>>n7Lv?TqS9WZfY>Fd9QHlJVxUr^~eN$1hdCd


^-YM@gq{ug~|#YtK_*Gs~xKcdgI&q-MqoeDz)Z-YbUB0h3wT%6!?*e7V4M-x)@( z*-}9=9gBwkN&9+zo^CPA*=ic-H`LQ*6W}*krC_h9b;m>TO1aWw@`_eAuUCJeQZA!_ z)`5ur)d%5W5xV_D6lCn@Ao~G7l2`%DHfEc>*VxR#m@EEkVHtj13Oejq;3>VV&Y;;N zbyDj!YVj)5xoW;XmUxXbOvT`hsN(u5_rY~Z`Vua=6Zn)p(xyEaA};7#&jmXOO3 zcRvLOml5HahNPI6JXbOM#b_vqlN1O}@}B!RZN5+KC_A)a1G`}5c2irp1;6qg6tl#% zz1b1Rj37@%xxP~9iT-}t^8-WlRT^Kfle7hpB293utjK`> z-rZNNbL8^ynq;H0zyjqI4ej*nQ7Ez5uyvZ3L7oIWQ~!HI(X$80_`)CJHJAmD{W*~8lEj%T@1Su86kfvD22O@*cd`)vz=1!8do(hM zD^t*#VHqAgaF;xlOwycxiQDPDqK->XxHsHSEndU^d6?Fz^Ch_v1HcCNTFNOA7+mOI z&=^C+CrwpqLvMgX3?v<6hz7;3u816!`+;Y<;RRb-lSEr>I2js+@>P*Uh8j@#OpbQ5 zSbuC|5h|19dD);TEgg45ZWh$JKvUUKU3+oakzb3Iq8|JT`_0*;IoAt3YyBo;OH*&B zmx$e};3Q^t4&X$;khy@^?h7jJdlgDqa&H7`U8=g8T?Wam7qP#Zn194 zzz)5&#%FAFHo(#lM+Ak?S5%Baz-V<5}KTU;Bo>E$l)Z1n0K*mj8ST2N2Qs1 z#De5Nrw2?$0E~t&n$#ztMt}j7n~zG-qb=G7<0CbNb;tOOITU*B>eR1R#jD6E(L9dg_Me9Wz1iFxLv^aZngjh zXWI~0sh#cP3TZ>Dc#1G!=D-p-2gr=<2}mRr`D~c!TVweK>I;Rquf<1yI)Zb+FKLcK zp-VA=@l7opP1iK{mRzEdJlN*Tx&u4GY+#y!Ds=MBgKw8VU=*U1l>jV^BUUbVDF(g_Xr`pd}LtZ!jc z94Qe@xiQVg()9osS?AVzUtBq?*%v(dhFV3HQ38eW93^G&m_KQViAqSFLRd((5Qi)# zM6Op#BkojcRjHZ&%ri}@8h=3{MbeB7CLHv95ki|g^7Q?yH)u?oldjR2eo`jaD9kV| zQA}ZnLwTPO<(tHSxx$I<&h7*ds@=ApaMwy}+nM|4UHis4%KQ>rB8#pYVVD+Tn+_`5 zqpwqndymY)7YT%8vL#9PtA}7|uoa@&NWDgcdbtSYObMnkE#6{Or6&~gKE4NX#|l|= z-`wUzKs81)b7Lzin%L1~1nne^aWUkb#~D5O#feMmfFR=~KSO#_H+(v~y!|mu+IG?` zlT3~g8Q4!Squ8ux#We#JQYJZgX;v$y0yR9?cKl;f0pk+^X~`}^8CBRua4{Y_%l|CZ zvh_9Z9XO|hHWFrYW0?8qr9qHbu4Q97S|)RBMf4RD1`9&yVb z%Y>RW4~yPt+hDdjJs5=?Uog5Jx*7PdAlcMbnkvN-r(Gzj3Y&NZy7{u6?C(2JRt5p$ zQF9yvYF0b}4<0N5PO^9ElOi;_dJTMtx=5e0gQvfCB}S>@2eVl+w}HN@bii?muHKb+ ztM*B(ao&|kVcZGiHxXN_W3HM)nkJ<2Spo-ZZwR_8Zl-Pi_}_ez*;&%X6OkKQrt{bM zq@zel2!0#i0csHt^OuyGhC^qwW35I)z>wd~Hev|rE&DfM9J8xfV}JbMhh9__Ugg3Y z#7Bd09MUtSCDLb}XY{$*p2A{Z9Ca}M*{!-g>L1wuu3fxMJyKErIpjV)0021t_uA$E z(ir|*NVBX3>4rV(JR)P~?vFqzfG#3{LMlmArrB_`Rw6E5AdSQfzpgVb%0Gjofkk2l zko0HB9FAkATunA>Fx>GYB5{o)YtVX8N;39IGD8P)fz^6pNno*4Vx#0Vvo&&fY6eJ+ z!X*J~m*(_sHR$rCQqm@G%mo@>3IP0)QZ2zAxkK>?hhbcZpx;rcz2 zm}a-6QBAbKu-TEz|uBX~7pd`9uou@G!@?tZ;HaVNVHv9vhcErPIgw!LlQXz8< zv!1g!O_WUeQvb28as5e-^SiA&PjEwFdM1yP_lsl)3c+_JzS$X=DyuCztKb6Hwb zmLhGf87%S8wyfqjozdf}&?hijQ{tk|wk(;rn-d3CAfFf5%4o`ya)X8=5^Y7xUqLNPFBLWVmas@c5KhTv)dm`jd zAj?ns4%zwV!~rF-P#HZr%T5c?^{MgLajxJGH}r11;x>$K@K9Z`kX@lPZt#f|4>!U) z*HX;V7Cm6Hg_?QUF0A;t!j5UBuZnR zun#(hcR6HCV7H4vx0;|kt?G9@*<)i|L0v+ex6MZ|98&H=ceGW+u5nxnr`>vyv`BIm zEF2P9K7h{;QvO9u=Xrcn)+1^GQwi--fbKjFB*OaaGl?V)FoSgB2lN)R+D^1q1Q#Nu zW7w2vW7=zzFO-T#h}C|I%5hlsQY5g)JoEv9D)y5{HW;tnEcTcQpweX-EeNT^)O*A$ z%R|}ZuYRX%^2n}q?EpVTm1MMXI)GT`qFVCQ%|qK_I*?&@GF!9ps`+9K%S_`Y{jxeT zI)N??h}TEWM?{9?uZgSq*;PW8F^Q7a9)4YT)rDxZayx#k3dJ%Ktpxkn_C=npuN&Q*ig8x z*FA~paWCN^-V)w|e*YU|6JGtDwpnSuzv=NhEHv)G$H48$YKCuxjt1HJRPQMyD9`0P zl4P3b(tW(7Z%1veMn}hyrTKUzasqt5!enkgn9X~xNOJQyjt-A7k2)~hd8K&!)kn!M zn_}eRXZ@Um^myi@+w?%UOvg{-H2-X!jz9KU3*jdGaKD4@Y0hfhMIJ%7 z;Wf(LOC6;m>Plhv3i_aKtSW(@a=$lg{G@6it|`c$i+5m9cK}rqZ|v${-Bun&YWe

phtS3Eo_Ouwt~~|!dcyYHy^h@)PV=ZerjDz&t^5jP zSN~GI3u*Sy%l(wCMCE_R@r`&3TH`;Ew|SPG2zAZ9@~{s~R{tt>KWo-M>k{jpYUq}E zR{0K|c)gph((C?kyhA57qZ@ydy-Ufi^j0XX*v8v#UX}OufT{Ni{eT&7hcxu?_e_p! zR4J|WlI~VICV#jd-A1caY}d zlJ1IiTZ?sn`+ddDZ}!If)+*Wl3iyDG-EdO;Bz~cvRhODv{$zf^n_c=kYjq*PohXkQ zXW$3aR{o2HY9n;B!?AqaTueS;>vJc3v*R)D^yZ%j=!bW>Y9W*%27$EmwARZcU=GCj zwARxkXiC6)Ygy+9CumC4c>}Y~Qx!NP*xcVV2kyoiz-j>Q$?s@tLj$T3*z4?}?SMsK zO@Q#aRAT|~Kn}8L!0ySsEPxhT6MPwHjcEqSYZW{r{oL=Yrsb@7<%Li#_oY zk1D;mT$a`9bs{tGX)*XF$)4S_=rr46iw*FdK@=i4|f8)Uxz+s5ng|uyp2O z%R8?AyRtX&PorPztR2hG9^A20e)(YnQFx^Tvta0aJCd{b9xD_^_^ZwN3klI`=gk4B z4`ore$fq2;*hb!1n2EWku5HsQaWi}7kQ-u0J+WOo>Ah*}!8$e}V;p}SC6ROtLr^h! zz&QS(uAS0|aKo=o)IsB_BPy9lLpS=)sV|kW-ckIXMLUfH60iVswm^Y!0&1S{QUo}~ z0YL>h;F`ZuCbWLruv#e@cHf-4S}Z4^CVcLCxj-i%?zliF)V8Ts?Yxo2!-&ujl6v0M zVqgysuFL^JO|gilUGj)5rP2jBfF0fK^~~#r9K?p*IexL$%HO8E>jO@)1GO)(^|&PDj5#1Q zGOl>--d>g8D&WRtVb)udA4=F2xH!i}*flv*9oC?G=I@IA1%LL1?|+Av558mB2#yzg z*Yoj`&42F$f#26t=B@)g24C<~nZ4#l!~9MNfj^Rhx1{-j5j5JK!V9=Bp_#!=VfH{7 z_)BP9*x<8I-)>kzhg!#TL zsrm)s#n#VOyHRYxc-KtE8#`BN5u8zFD8)b2Foz#$#v+!i zjqlZ72fMe`_X0T7_^~nWM7&l0K!Xc>*`}D}%~&|TR^rT`@t%MqHf?S|uBQ{a!s1~m zQ@UZc<4RuUZ&y+eeCmw)@|NU7j-|f`B*s&8AzpRlT-_EOw;>Jsdg*hGZGe9`efHUb z=lDzp7JrqU;wr)k>I$47obm*ET%opxUQJ|L*4NXYw*h7>*Y;W%OVZO?rOr*upco+8&p9O5@bN*zl$XB$hGX+lOlDvSinOV zFQu6-4qrH(a+6Fj$F~hHRRGQ_ZXk)XP*ZML7go#%#WdzEo;qH7LMqy5Ku0rOEN7QE zLTU`JO1NFoV3xO-=TDadd3>1I6Tco^PGYnIC{5C` zt365&or-JR?Cv(Vl^YU9*{38kb9uY)++LuH4A5&lQkSGrG?}@M?q@C6=U{L}FC#u0 zh{^-m(D<7IVfH3C2Ft<{4Ogn=jA%6s06TfkzfaF>aDx+p6Z?W=>Gpnuk zR}e3$TQhE(=AXPmL0v3kNhP{jP2)PKEJwnS=C5sKFX&J?Ss4A}iJFNm4OQ znm`$#d8@{mngk+~aqm)`PRU9l?7M)cj3=Agi;VOjNNpm}`je!IY`D^4bfwhexjgZL zHIlK&9>Sg|0Gd^@*E+OR`%rhj$%f26wVY>h%Y}BQ?!$~ye!k(Q8B!^XE>9A8Q3)w& zrc&67>y72Pog6N%kD>(=Nwg`F)ObQS%u)pt(w})5MaDC9%I>0~)BcE4#ks_l=op1C z^{{PYXtT1pM8gew3e0}{a+X4QDNqq}MYewitPDlD3!{v=Y{kfaaL;VGu@UEpB?}Af z$fM~Kq;#B&V74`qcKxCQv)6zJ*!yh?pV~5yn9Q9BXRcy2oh+*6phU$|($u}UrTT^< z+T)}t2hseLLP+F}4`m@xp)~z{tW4bKpGtgl2rc*K7sudQuYPK0wG0YAem!Y_^=T?h zt4=mI;fE5WMoFlux%O`7TUkvLe9U4JdMoaZ(Sjnbt9V&pkveUQq9hIc5BWO3BeBU4 z(&(Gy{Kjy`Ts4W~gHz;kRM6;ZhBiry1sGM(tL`(YuB3fIw2&Yh6cluZ&+_OMpo?#$ zo(GQ9BZ2dcqLTAX@`C&QwW<1fvpz`4MEb)wGb=mJJ;nv%!$t5{@GY?ZsFZzuz|R-3 zuDLdo=>9S5d42x3H=I6ZKL!?qnR+!V<~=qySsA&Qs9XqUEN(gJ5fd_?gnoS*P8Jq7 zA}ljTgi)K^7+KH^j{3X^w8Dt9w<)ze)TEUH6$PY%=_Jquu!#UOt&MgVevm<-1XZT6 zyd_RfHyTc?SQ+Wqp%HK~0awu-qoFgRJE94_uZ&T5?4J6`Fs&MIfh zM+Qz8hqUI&$;8L&cqv^O;pU5?xy5w6GKeZBLaxE(rD}Q&b%`j;Z2KbJ_?=G3#TM@bQ<038t9qAPLe!)Z4 zasaFx*ipb_k0n*osBw*-FXdmMtkwaMqpB@SY2N`iTcFB9a-PUaL{?5inJz3FPVHLD zFThq@LA%(3k-8B*3hr!l3*C4cnU{#Akq6HzsfjmK9n7R9e~msn@rXj2 zo}MixMq2DJk?C-e*l^x&vrC8b`2H2FCAijSgR(herJ{QwV}Xpe^622T43l|mIOv2u zS|?0AGi5<MHm9^S^42tK*BvS9WAx$lWcGj47k81RHp$aK~`G=p_ z3maJRZQ^rVk*O1?z_Op?NmmxfQ?sHbl}N~`+G(h?TJEfgzf)_T48`|Obi6fA#Dv$# zq}kszEjvTdCc3ob;IMwYzF)zvJV%+x*WcAo#R=27hHy%RPphyWR8r;b@`IqSD68 z6u(^LAp|$B6%b7Y9Nsdz%f?2-ZcJOeJwckE3UfB6K(`c!vre!`Qj7N-n$Km?o&#s) z$&OR3Ta+P3r@0kVW~7-N-y z!wc(e-f`Qo|4?>L!I_2awvBDucG9tJ+qP}nU(m6gbgYhT+qP}*-skS$=Tz-FRqJlm zx}7!O^*rwwP!BM6gtEh}=N?uMjhS(23LUx$7l;Oakdq;$3oWEc0x1xUg;ZBa?mls# z9i!#(1|CPiWrvI4SgOB?pr)-rrsOmgz zvchssVgz*Sbk+38$eIbg^GUynAMt9LeUGTi7X5_{N>GZNLXv)KYD=H29!GsK&Wb_6 z7rHS^(Uj4xLm{XNybik9+7$u$)M=4dFr1Y!z7xd$9rn2#50Td_E5)2L#)C~~CtFLF ze+w_p6|3cz7u~I$b)+nWiOlZ&Q%P>$q21X-CzL zLoEqcNUeqH1ji!{n@{u-5=f>8Gcu~|KTP0&@K?7tx=*z*wk{T60Mw>B2gD zFxTEy=!=Qq1NXbgfS%>$^-ao1&LHU$Ps}L7&frU>_HLc`^ND$E7d=KWkLFjw$j7l% zf3qw-Ewg&IEnU?#kB#^xRxv3ikVDO$!tBYbV$0AtH*FD3e-wQRELWdW`i7cmoW+G` ziogV7mA(Fk*9%50;fJ7IHvjy{X02_PZ6H2F9JJ7<6XQ`s4nR9Qk*_9|&&%n1+p)EI0lH7@S!`Yfyzwqaru0ih*ucPZAOoTOEBn+oAqS$E>EG?|6d5~8XjJ*=en2~Sv?5RV} zUhvduD*$J&t8!&r#g6<9Gb4tn6|SWT^VtkONNv4&)R?WX z9l~$w6blkp*;%w^$LHicY0D!Z(gwVO0xwDtL(wZbG%Kxdx7IW|32^*cZ5eI+w*^yI)$eDI^Yw}|QXfej6ah=Yw8_)ULunrJF@6lrx(1*y88kXQiPj~MZt9^@Q5 z0h}UTYW`*T+Yuv4h-MdX%2GIIc_{Qs%wM{5U41NzEc2PEk!Z9tGVsw&DTFSoY zIcKJt&}gzA!G&>ZJ;d~uWk-dZOJgMKzLG0$Z(VLl%9$Z<^QSNxE_IzsJqURq0aDcN z9!s?9bDx#{&CACxixOa0sy#wSPkks=hTZcs4uAUScT_65UFFtg0za3v4dE%OlxgFk zGP>?DCBlecL2LA)m?x)RKHq>hK&-)7TzVMeiHtT=>o=^8pP232$N%v4dUj44=q<6U zBGhaPjkG@DcdVYIGOgXek^~H5I1NUt`}JKp%3}6hEbC{xRr)hIvdL9%-aG3znacd` z!be+zVF<6{ZARDMkP)Nt)P#l6RozpbD3!DvJF4`rwCV;y-#0su3S25S6VeK{fGCd* z{%9`VTMl9Q_}gnO++x_PIC`W3#lE3EeAA$jaee*EQbnEPxKK{3FchIlSgeY?F*KEI z1D=QF$zNa#9?D~OpJZy8&Exx&E%7XQ!EHrcma^i*(5BYEDv_a_K5`Je8C_CSMn|ny zPSY~jct#W1Qqd@1M@Z&^!-!KeNRB}-eYJ8v-@u>m>OHy^x@yTN3N751yx6>?|5Fn? zK3)ND3msaz^b3wHq8X*Bw*La$2~!7{(lwh+z7h5dI;MDhubg-2b*l-vS*yzqz~?)Sg(1reS@F9QcFb>j!Z^(vZ!T}tFx#h2QM_&t++4w$ zZy>S9caR?GVliHsKev`c)=EbEw6ka{2VP7coh9wdTE&yR7WMpOv`Q&X4NER*=Qw|f z5~>LYBSELM8|f%3C4Ma()e|Mq=PjwW2+&6FBk;yB8f2+!*kEhuhKx8Ik8r8ea>&=? zwYNsGAQRqd5>8-Y7=>f{uxiNy{H#Zfg)v(SjT&x(|KL)@(AkSXPtHXAkuem7$cIb1V;>bsg`12G~d@iz-S=tKA*3WPBrv@2At2nFHIAEx#_Ycnq-K*nMqPn;J zkbva4N0bVv4ughwjVW7MU1%bVt8=x7+#9YnQ;is-Yu&$#JBNq&161{dlT*wI{n)9{ zR%^h3`H9??zjG=9&j=Jf1?%u~LO#rD2gXp$;9o(iakPZ+WEZt%)`4sZv5X~E_S#rf z!l6a@2>s>wJIYJDkw`IPfkB!y@5Hn9+_UoNQ~b6l=u;^$==CMb=vP79i;z}gmlG6D zc7tf+mqnCHdT=cLAYss<;4G+dN2x{DxZC0zb!?J1x>E}I(m$2CLlC8*b(@3@Q0kl$ zU0jfVe>>trmGR4yvvvVc@Y5=E9YKA$cpmIa<<+p3DLP9$6_oGTYYR{IH-{|zO_qF= zXdMRhvsg^Te9g!i>^zNw^0EH%*6vr(Wvz(Z=sOg6)DAZiIziMt$4fB?Afr&mT8AQs zFf^t~Gt#wIqBLSwp2y|PM#@t1nb#Ac_~oNZo-$URJADxIZlKh9R#{G|HVlz6`rx3Q znZ`&MJ$pvEvb;pfx^k)OYQkjr*qZ}#OA@9K7Y3bdhWbT|<%{IfwiBXiTKg9oLHGwy zA_T!bLknSFv8MRp#U}b)nm>&?9?hk-e0M40OQk2ll-usJT0afDNMPs|8RzT0t=Zar z;#d2(T#mpGxQwQz>42Be&r#DY+>HsTayp_x8U<*pW~onem$KaVRso~mJ6 zvi1j7N{c8|9ZY94S!DmRpiBQX?;B1l^1~H2d8yhm-%w$ZC3 znqv4iN6mTL;P@6$)`s=Zl|RQj!0bH4#f{F@uR5ygm&~P%hu0+`@INe~9ot6(#L5(g zV{MPM)-4}dRY{ren=%+C4vEGUQyply^=^^F`04uIS6P1JpZ{v1@Wx$a2TxHzh|h~0 z*8?$R;YQEl#m8SB2R(N7YK{uqMr&J8_DR6U1q{b$HTv9fl@s9|-aUC}?&bfoyguuj z!!8)I+5hcpDoLeTUAdjTGwEKnsqVe0J#M-8j-0fbt=xbOPF=D-VVv@Iw*Q+&+Y2^< zW7uL?Vz{h`NY0h}kHyFcA^^!s)g9MR zqOooGs>}PBCsX$L0PAb8o=*uwP&j?W^4Kb6PwO;4!4hG)#WAO_Hb796NA-nQmY4h( zlKYJIwJ9rL@`zfL$8&lj|1LEMwbLq@(Bha#Q;neO&~6Ekx1ufM#`+|b|PQTo&>6gR9@1X>2DMg762z|`qDe(eE_*Pxr${PvlJEO ze-b=QuBFM6&(gVlBXRb_AdIux;vw(#(NfuF$M1uo$`S-%|0+XQ(;AE#SE2fS2uP7WI{K8P7RYv)?rJeuAgY_^PKkz| zzRJD+=swAP$Z?tJdgx!(+-peu$j}y7+vNv+S<_CvZgkA6JW?GRYnsd)bDs27s5sKfMc>sn6jKkjxy$Sy z)_mg&OUap!*T*$Er~;Xph(GhkR*r9>X^xU##@+g^%Wu#gXdA?8_(y@Q> zPv**HyYPf>S$pWXuC{Nnd(*QSaG~31w5^=GdUbC+XkB(*Y4)~Xx#4%HC+g-dEdIPR@7hx}#91>duFrHPpNO=F5ZoYU;*GZtQ$Kj=mUE<d#%;?V-t#J3d2A+^Bi$x-lJ)edpre>*cHqkemcN^xk>ay9eu5t9g;(d`(; z#6p?W=!W}fp7M(N9@UdpX@{>!dzY2#O<Vi$Q4HqqGSzU z-4J1GfJxur@85RZWzdcT6MtF+#Tqx834^fcTi&|bdUpL8E7r8E1ke;WdAL6+nr`cS z+2e)Z1gf*32!_?J9kh0*n6dE9nNsZknr3=}U>(wqhi&)+3t3V||MQsJMg$1K>sIL( zb|NlPkJ~Z4r#*fD!Z{#;d0J!1i1%Rh%3q|`|SJr=zd$G3*a zg+$Eo-)^GFC}fJ=XTzO)0;Xa>&z|(^|E-3vU(%TE8@*lP?M>@26Qc~Q>d=X zGY;%m0;y4(s+|x7Q&3t~mTINUb#ywSW-s^!iu|67s%-<;_VPQ5qS|c!MtsknyXd)O zyZnk?1nWk^VWO7ivSLn9!RTLNt42rNd{Nvw;9ImQQ=| z>p-aVVF5M2k7!GQ=C|&xZAZ=};Sn}`!(M~SXG;X%J3QyPH+#s^i-x7gL?sf^C%gdj zbkxM-%Jo^_splGFf;{+KpQ(Yu;XEg5f(Kh z`m513>}nab)oFEIe3howjkxX#?w%l-&Mqc6rN3u;T^W`gIOYA2U_y+n?p#`q&mAV| z>2%xKIVPK~$jkI-cUoP&uEoEOtA{Q)P8hd<_Qw=kC_60M{kKqUJ^SuXOmljOPFf1h z)l}#!%$EG%I%uOCSWwLL!lqr&1T|suX`4%V!hK?=e&t}_R5ZhNjIq$cdT0d|IfF=K zfJhv1MT6)L-Ki)UmZ0zqmhN&76PPSSR<0VkgVh{dQt?2n!1!e22O!ojpoTv|Q<8={$%tu{L5n3t_#w-T7ExntBwtd6X5wGx;STKsb48|Lqu9(Zzk z#`7Vl8Ciq96l>-0(>G=ucmnGf;vdrwO648fHpN^m+nqLUSrdD1bbLYcN%6xm&N0n1 zO51&B?U=0TeZpp+INtS+)-zk#eW&w@(~G#UdglJ1)19fqy@YR7x7wzIn{eXl@w-yS zAqug&8bZdL1>D%Pa^ggfD=;it9OGtUanMVjlSBEE-1A!;2=;Q9v8qISc;HZGvoGS> zIdEbejmb!Pk1t)|p9pnzW7Hwp`EYL+Vk47x@jJx4U-p7kiR2J1W_da&rWY{D7{v=G z_w$B<_pH*qnee3l!D}P5&=vf`BwD=4DcvC(jtGq1ZMakw1|wj0m=I<~v7v!VO^I`h zkO??65lR!G-@0BGpAk+M0zndPX#?rHCXx<& zy$BRBuadzZS0EXNL_r5Nwc1Cm!iFqCRL_c2L-M&|k7Ua-j1}#lHLeoX{DtyQ@H`|*hEr-;*>c1s(?ZF)m{Qz-vmROsDz;88 zvYx3^O>+zM71ACY4{Ax=3`YeDXJ0k}lm^Omykx;sA~OT0GZ*fJA-CT&iB#;uS2G#= zS<#Y@*99YbwUG&S88MrJ--dBbu)DI`unP(+dQvF^nMVg2y=va?4ZkNH^!u{&mUUec zz?(aA#!dbEU$RiU(!ojT^iFF+^lLx>pI=;Ri=UUJ#j8D>n1aJREhYIQ0?GE9Kw6y; zYq|l#gL@O(H7%%vZtG}wy10XP6Fs##WwPr2n&a9U)Fk1|#?OTQqI;g>eO<{c;VI^e zZg_oebIJd&nsr?Bc!=&us84&yi?u*wQ3~2kmw!!d?b)@%ujX1phLoRC`&yMV#FdaPp9982r$lZ2s2h@g8}ee zXm%7*@tWPQeY{VEg<1WUYrBHN*dT$(c|-&=8K$Q`Q@}jOoa?T3%s4SLwJVv5|BLj1LCNe|E_4D z0gscmUf;DL)YgWnGPnxndLW#D5c4622a^n@5=FN5myJ8{j*K~z{m^k5MV?%#;L39Q zcWn{DCwfXa%4ugx5Mp^44>ueeKil1!ST>}WuSkeoW`kZ(e9>L}x;gpipb{VCYvqH} zij{4vJ}OavD%SBuHmx`cv>Ym{<%o!!;3%v@H294!&`zLUt%GMbP>SWeZDAPo?h%rM zo~G0?en2xUXTz0S$cxqDSWy0n8}J=OYFeb1y#lib^*jWz9zS~v^y?y}SD%)xFqD|` zqz3G@*Vz4*3+KHTE6sEpgX2ByBfc3yz1j;`Y$$K$;Gkmzf*+wn#4h-?3^f@WMEyYe zk8q;5Gw^FMJ2aVMgX^HV7)(g>gC& znq3vGKN6*R=*^?OFU|r!N^LK3Jd&#i>4?bg5KufFUwZOO__PczMaB43I)uTK%2IF@ zJYn4+vk0Q8RT2433YQXAQK}3G8-Rp0EHA zuVP)5>hhA<%39-`KLC~ld8{LoR@MHW*A z(zBsafu5aF07W+BE=K&bEYtcPR>VR4ta4qFHgzctg}6oZM7F2W504=|7akFq#fC!J z_#e-9Lo&rH`iaEXu2o6bMBLMD<{hY4*>EeHQlDIL;t8&avj^`KTLMY7~HBkR&Ogv^ma2&`b|zEps> zM&7BC?EQU+>%e`M$5ghZKyq9g7l*{#bXLnc>D66R(j*E~T|{~;pQ+hV4}KTxq#S|a z#6v!n`^4GL?7?77mH)zuH7TZ>v9a`DUMsA@PCX#q%N=gDtRP4&rpKpMTjFY;fh<`Z z{IWSOjxm9#LrXS!Jj`tV2aUK)CjRDL3<6u3u}KLecMPX$hB@_R9RMOKlvig!&t zH7=8aDMLA%Q;yXGm@G(kCrsqYcpzO-KEEYB=-|yGeuc_crJ;V)%Wm37;FxGXkm5Cf zjFc+r0+gBT4Js#2q5T;u0AeaAbl1^&vHWNsC&fp3UXrQ1;Oc6MZ_u!_7*n;4LX`>& zonCHs2z3xFhhgMAgAW)F(+#=c`DX#@3Xp?Raa_5U01h{C*P@%Gt?Vz2*3HSCAd2C# zHyaeF+L9-&P4!H`lWih#wED#hrUTBu5KjYpJFg+snFBSL^&H<2c9Es5Cqe8fG-zEh z4%9pG42@^;Vh3kdg;4%zpmZaMkpCQ#^mFp$K~>v*{N$I?2Ztf71dLTYw;t2|wNuOG z593B>7dG751wqra@nm~At5?6e?k?;R7U}2Ag=RMwW^H3y4%z}i7szN_JT5wx%qVF> zg^u4oL%cMq#d$?~Q! z(cuL_An}#d!E=@SCIo|@gN^SZKwBYY={q_nV;D=1^I-+<@{YLUR{qP6R>=56b3pls zgs}UDI?R&T``&L3L^74#K{q`*)UmlPltG>RXk;&hyz-l;Z*L2CDIBcEPI{?1SJT=i zzT$rBLg7%%U<4^bprOl0g2%K;@_bR#bVg}uQIItnspSWSz%!>9#Ay5XZlEO8Qu zm?0|EtO2Yw$?PpnylmLEK9fMKnax8{90CNInllv@HsicqIFy z2W3sME^BEdR=pzYU=kHDCPf($3iiqiW-!v`5wzPaF3&^-oV3!=IzPEc`$tzc$l?5V zyB|Na%(Dr_nGMy9cql}Hv>W{ifrKgwIs&KLpYvzJozr#WuRz%O^34<22cPr)paRt@ zVDS|gRGI9G1CGv$|qF#i9*tV$VDdM9v1n-hDW|Q%`Iv?#*xcz0k>0N0gn7WRen7)UNB*N ztS-t2pfn1)SI~h66ZdZ_4mu;Nr*5mM;3qb#XQrLt-q_tics#%nNP=b415BbaLGbGK zJ^zx>g&XS!6KSk^Lh5K8`ESes_PS9dEhF?RyqM!N57)VHZgHT~G&M0a;rI^{Tmbac zGSerevXWxLu7cZT2R>!#{r94YK+;~fiGX(4>gvKpNF3kH871C_c198;38yqfO$czj zf3;veCs$RmtS8QO7FGmcJAiN2Q37Q!oM*P(d%S!ZT_|&gBB7K(B-55CC3^a)=Q<%kyVkIy4q|EGHavq!6EiWc>M&*x>AU2ZfVW8{p1J_4YAS4m{ z;Qk<{9fBrRgzDizIhIZL?EG>OG6Yjuc`~Z@HWOUMl+-;(_}(lCNBPR~4ax;FY2KJ{ zhEup&F)52$VZldXZuIwZaEcNQ5O1M}>hNvTJI@=aUo~Ghg_#nAZ8luM7v$V9m^i^2 zo2m@qbjFhg%{MXvDpo%S{FOnd(ArtE){!4Ak@CuM%hY7tZ z2mWFPAX|g24V<;b+UM_0N4AJNTATgya2iCav<$_PY-j_Mb+u)Y?p{X8{JLm^=?!^t z;}}qYMbLCYfVK5F$hhQwpv`fS?n3~K_5;i)FnHIV@;LLSJZl+jrpTX#gyr;h^LEVJ zuVs#?8o1wmS&T&^(zG(LW)=`@{;5^cYpKw>>>J|-s;5%Ko`rg<*IV61w)$cniIOkl zL@jT=0xL9rk-Xi05^XO}JTSYULF8CKBg>iwI?JVV5v`jzH(CDRC&6_r6`Ly#iM1sp zgpsj4kYJP0P^M=JaRNIKn4%6>LFbJ^v>>BdKd8cJFrF$&VbkxW=~*H z)*u+dO{laIVS%zyF-mRW&al3j*lE~IEeA{E0`)O7wUAiB@YIqNBNg9T%j9)d@0H#s zuuh?Yx#vcyBE@#R*E2hKcdmc;I}LsVQ2a_w+iKU7)Z^0kNl5VE+{ZT&Z2dfyK_(@% z2qWL13321!ed!D16YhxPj)szaP2W!nB;ZPKb3dR)Tv+3Y8{an&H zh-Ttna$r_2e$==EHT8pAzrdnwyI4KPqj1(QaD$~WHlqavcb;wlH_^mZvE|9Y#7WR| zK>Q9i0Pu}aDBWDb-C zickb63IbQK0x$_z!0_jxJ6zj=F!3OI$qT+)Kq?yBG~^Yb#PM?jjy+iZNoRJnkGj{C zfx^Eaia8-25QL(WLwJkR&riHyQZFph+mgdpQ~Yy{e<&ljo(V%<7ID%)OZ)ZgPuRhM73fO+G*I&u0)-Uq1MUSqo|>@I%lc%&eEdnyq84 zm9GIpHzMPGo&nk3hHw+1y8gK1UWwXIXwB#UIF#VZIhPvwV%Xb+JlK*?u015mUjQCS z%o!-8pnpWCuJTcyBw;Zh49;P6ZaLB+m9WrwPE%06L|rGCK>8Lx_IAFrS=Rk0cy747 zRZpt$#?DJtNe$r)5rQ0Hp~J>4*ir^Fj6MDSr=e>hdT$2qXq{Fb6vLD&_5l}Cg61@; zhPZM{k9OA9m@(kBrS>Zhb@GwRwOr2bQ0D_)a!wz?ciE!qBwJJteu84CYK;QAYUm1VA$|5p2Jk-TXl0LaLQxniK2 z+^+m(6n>_bo215Il!ELnPBUp!-KImuvShA?kMZV2L8RrQANuvh1?7*V-fE2ik4GH8 zIX8i?M;SP0H~)s%Tt6C~zdc_E)>e?TVATt?g7Czix;`b&_s*p5u^;{_L;%m0hf^Lo zq&?V|+T0@K*HOkCb`!A@e)LYyje01*V32e5zIme9G}bFt3&!~4^i4t_*s$he@a4Bg zCbHFiuM!(H>EMqXj`w9AA^n7Qg9i)R|SEQSB|7Wo9UjfiF9EShbPA2a1KZWvzLfTV`ejLX<1G=iYSitm@u< z{S8;-WX5ufANF|r{4elDZ#VM>#E-zhLeGurNpqi@qa%_2X1G_$-C{>McdHY5Ad@_4 zGvh(jVqE`1+ieK5n#D}yu2GM!cs3aEHW%FF$x>3Vy6(eZ4mL6M??nvI$b!1L_|(K* zUt+~ezGdG$gnH!d-LLG66+OL2O!U=&PWTNRFI%CKSx`9g>)T8!4_uBzC$J7K64OHv z+mWp~T74eo9N8{9AfgV$NJxaQwOBsHUw0lZT2Gm>nL0XVd$9-s^+PU6TwT`IR6N<) z`3I=f$H1iwTNrI~uXvxKw3Zrwa|>uiFU6fV+iaa^W2`U|*VKc}+r7TRSI)=4%fQdT z#~@%wb9z>Z0?L^cM1bqfehp}~f9LdZxR~R;VY=aUlXArXt?!nBuyX?ZreR+%h$t1C zcP8pYEH%Oc4Eofk!oc~5FEEHX5NxO~JEjS4h%|23`@whPL4uyYYX)Pf6SJKm8g&O zSM8ilc4|ikzBd$ww(KLeUp~^Z*%U4GGl4G9($LmRa2^4U*-_~^97JO69L-Z zdlP2JqFYqxEs#JxTIfx%-@SeUrqnd7aT()c%p9_NI%yX)K4QMUh5UU8gaS$6!3$${ z)pf<=M(mJoEQ$1+uk2|i3R8AMpb-vG$Uhtp=J5f;?3p}8yjwR0a+6kf1^Oc$Z(dZ^ zsW$M)yRvSEFssoSik#&J=F2V(sk4>AYI0h2ohfa+s7@c+F3GukYD>|dDT6Tc&#*e| zYYjAIsD*W;+V5XRPa!ZwHWP8`K&2F?_8mA4+@gjZ=kdrllABisOJ4BZVSQ);Na~~| z5M?1a<@GpVdbhDveRp#>Okov>zZ!7KtfeZ)vmndI*Z8_em!4t%f4NPLKKSrb=*|oY`fEN~8P#O_Kk5sHTJ0C)ml|pmV zIiDa3vn&;L>YR1P8W&T5d2BjJ(vZI=*pp6LHQ5|QafjmeKo7PD$Ryf;{de9t9r;6s z^a$kyLdLpkR-+bWkR`!00RhftX-BuLpMEs$E z2>ACIy;QiSVD)HMK4&>9gVLaA4=LoUQg-|>L0eIcOdz{GP(r_)r4|glpE4~F+(1cN zLwEo0t!AmG5$)6)uR{TqcQVE1tZ13#a5rM44Kc&sa2ZJJc`RoYfgh{%q1;QgF2V%sVZZ@Xa4IE;Ha}8rY!8f^D zPVG5Q`nl(<{`m$AvF80_k!yo50fTUO+;p<2xkjQCG#_)7Usk(R@VI+bqmo?ix-j9? z#LDRWGVaFxLihy4C9Fr9h2^0*=A*R!gOZ}k2l`Z7Edk~Lt{kj4G+WiFu>Ik$3*e1T zj5RN7$d!Om80PK+4&Cq(ZXBqzfrn-|~ukx)Var0;z@3SOpQ z|4p(`iayLZeCmhkjp7KAvJdXRd0cc#6qSsaxV5+@nMFJ}{*#WAvhX^WlodX9dDSXr zdBc4B%$4hKI(jVg#R7t;p?fdd9QRDi)q{X4#hf@IoWg@k@i+FQrzY_5@A{r1G5Wt} z+vB7@XAVv>W#qh+9|gD^+m>N67W<5V92Jg>noy>-;ag zBU)>RkW0IL$2o@Gc>@Q=6?JB;@QlE?$uP!xcyL&Fw-+95Qz>~MTaOm6?(3zL)2IU? z2~1_0&wbE55oVnxY$3lm)*=s7JfLUF0ChuHfk&KK z*}qOh*&63AoMI*Yu?-MQ`R=FpzzC{n<;4y^f^J*qM>YI+d*R1YBZpL{pmbmW6j0;E zRZ$#K3!33WqlzvTiw@wt<#;Ca$ni1SGYl*ku7*kk2eD#>byPUNNIY#12LY_0mX6CL z?9`k#cLp@bFCf~I;`rsYH~BummO?g}KGT$4P+M@^=;9NBuYO_wOzuzcui-MHYxug| zBILhdPh)utfE>(-7)8`(8ydY5_xD+JbN6$@T91hoj?CXF4C$y^@@g@uo1r=7N{7L_ z4-zn{m6Jn2a^4cpRD3-@0N0~kRj2QDNKYtmQZG$JQa4SM$b#?pNtArnMJ_?piWejl z8_`}{ag#UccV+c^?Ve~=q4NDd-2__O*v;G}c=iCw?_@VVVCQ4*IQJFO54b-3#~|4d zE@2OPm!+dDV0=!0@FB;7A|K2m2+-d}0qAUX10t_&3#iqub@uRGoxuY&E}cJJFUcH zAL3$(JjkAUwVqNn*W3X}b7#dWxPq4%@qM!ZaXTx|*OZsc+LvGD?3b3;m5x*UsSE9E z)U$pBH)l1y8U`QQImGF!a410vL*9|hppYM$4rPbrDuittlEEv zi-jzUTe*wT`2GePoFUD)Wi;bX2$kAR?&!OCnrag?3--td&LOQQKud1q?;qJFf!(h( z>;V0H1ySQKZU?6(HNx`km!hlSCILgP=&mfw1wy9e+!qx3_nF@prYAX?JghCUSDr~n zA?lrYHetv76EKgTqE*j=poPy`sUx)2u{LhW*}r0%{7i%z;P+XA$ACDIl1{VHpZMW+ zmG~NL>=n`jC6INVl|2RkP-bn?ws!+N7RJyb6$B?F7kbN^>nrl~I!NDDvI{X-6#`@r z8I*6HOJ9&k3<&Uo($mrDSLEd1H7e&j@hqhT4wtr&rV}J)Z`BI3KAPL zQ$0`OS4;-)L39`$8s1&ISs%2;h>C+YEe_pov>)oC`b)FyZpKMAg6aQ!_Smx_nknuXSl`Pv#PwMz9i130~7u`dRMBM9kL$vtcIbNi!g>OpeuXSe8N) ze=L{#=tuX9Fh&hkN(CN;D+BF?<3&wBsrR_E^_LqC^-ab3lkfFstVzqThSe2KcnqAA zzzH>8=dMQACH>}{o-89aqX^7TJ(GVhtcmxcdYA!b!Xe6}QG;h!@NM5a&tXmxc$Fkot^M>ejn1)O3#99#F*<26NG>+M> z2yc3{+xHfkCSx*4%R)gCgBbDVP=q)9!8OtMCw zpm5dXwFvG^B#pLUHbTTT_sSmKOR}P1=GK@$gnzA!b_|0VOWCom`d@18@E_(|-#F~~4(L5G;W$>>?Tg7RD4>Rx{!ZICPnD)XXOt~(%fwK4_VI|C`wvyzBoQ$?Ev?Sop*rq)@1mi z%xv~06R|x``g>R#3UY_cWA|I!E%A(Z**fAJB02CjXVsu4(vSck{&zjb?6xsx?y6=>&BJqxp;T{z?y6E z_N>{>l?vE6Mq@CUmjsb0O611ItuW}oCwP(6fpe^;e$;~x&^kaqKodu717Nyc-c^x9 zwuMASQ;I~!?vt`vaH!K?7f%G(lE#o#x_U+fWRim=_7ph`V67 z^HYrMRU$pc?P5IzuPSoCPq6eivemf{v#Z>dBzJeGx)_|OD|8oF8}{a7UE9F9p%m3t zmq(y?SHtX^Z^e8~3U-uiinRFW%rP?M3*cQdlUsNUe7n~1iC+sLM5*1%TEUW;cjoQg z4tT|Z(>#>(7FgfrWYp8s6=D#Qk8Z+lm)Jh^6GrU|@byj+22nZQL8AIUQr;pWLCGH& z4PP{8b=RprxARq?qvn0*nl2B3>{r-Ba<5jV_~;=9pbl3gd-x^&R^;{_NWis>F6CSR z_EUhTKSFyz?lE$G4*wbE{j4-+>eN=NRiD|vAvW4sxfl@cnhwxKyOw$4{&p|&Os-tf zY60d*ermxuKG!&Jbb-~dH|S~he0UCy8If$a0A-5s@4qf%7Cd(|7};&aBEs)*Fbb5& zz8@3AjlSh%@uz?o0K(_rq=0ypvAO1kcwy?*t7!U~5<`zC%opOZoYM$Z=ddCVhHKa) ziKQVE5m{`fJXc?>|frGvU0v$FCtmixq}?yzoz3nw5Mk1vS&(Y|C#%@M~sZ ztC$NofO2x+82N#9i;z7C7Q=qv?? zW0%`Mb*n>on^yPsW0&M~Ph|q^oB*kF&B_%#5R`q_b>R!%PI7ESxZ@%KFOE*)`o>U@ zcBdF@wqRL{0jVOQm5Dbt_AeP`o8`cuz{p8Y$H*@HR7|$Nfmqa0!593EHet=7<5f(UoS0vCfPkd`5mGt+x3ySxQ z2Rjw&dS8b;t@aDfU1-^Dwgm1HR>&b2(?Z61)MRky{92B*(Wah$(V@<+_@?ebRUwfyd6~sN;;P}r9;XRfuI~M! z>P|7p`v*Z2H8`^J3w}9JI-pTvmw|PSz~@Ii=eH%S-QRq2yJ82Qti%&(p8y(KFK&9` zt0XO>FU?UhFK{X8nl{$y(Ve_D5dp(Ah6k~EucHV;F3{)Q1)1AU8OG>N zAO;fx@v4-1?)b+cq`PLgo@NOlOH@g0)-arpo z_|Is5TXtX9N2wB#t+u(CAO}o_Wuo7`QH2&q^DH#!oU&5|e%E)NimSzuy^R%@D@202 zaoGoo0{hYsm2CD!6LsK+{4OA9O^FT^O4}e|$evrlV^dqYSjBR_5bog1Bg54kL&YoP zpHVKa3AZ!;r)eD*A}D8X;WMGn?N7u&5G*hK#Ad}@oQaNe1qLSrnCn#-sVxMb1s2(J z3MyRC@{azpIS1#4cxB+XGa^Q?B%Z*d2;<6R*^;j4djN?F66+J^`T2 zJX@!uAMycNfs`3*Z>q7Ed%Gj9d-$`F1b@?9Uy1R*C9*efNKA>D52L}$!bs2<0z6*U z({nL!2-TPg83z!(^wc(+ASa%Fj#&g@NKasPblIhnc)7Dn;LzOIHw+d{tH0N+tqB6& zKJVTZ8e=R@Dy%j_BH=;nuAb$!QAiV)YXU8TzUnZQmfX+ov-Z@Worb#YSakm~Sg$sk z?9;aO*){Gp)6x1=?9Gll`A`4zT(P^HokL?hy)HlSwas;+D_)4IdkQHw1A4fA_V>>k zRod%46+*A#8*C&wX8H!U;XmzmTwkC=1DkL z{?af@Q;cgknWaw73;btJ$xKaVrh)8HXzwGThX* z=m`5~fxTWTgjI;LnjEF6OLVZU+F0V!O)|n28YCiLkQPFySRylegBWr2+78mA0Cu`b zf_sM5QqH4SizG-fkDmy?uCxOc%x9L|$Mi?t0LRndlsD9`f|RcV60B?f9r4EW7}Fy> z-=v8KOnVAdD>j-)z)~1p?~_h4-acJb{qUyjo37aOFgd{@q{Zkn3Nx`RFOCRGTqp?) zO`KY$VK7fl9I0e&Q|?Ov@{G5ZuSow8^~Ot0SW?#9ULrpYd6g!(0?LP4WSP-9*;@-s z0Ans434jXXH%Mcq2wsuOe}f$QS1u5sm2M7=nuHE~q7UR8(ihs#37f1biI6AZFRZt3 zmV4u**=a!LqDtXXoPA-V~NZ;`Xgs1y^r~g@F=tAQ``cf=Gr-H+u6oH!Kjd!{;t8*kMi~t@}aFZ;Ba@fhn zg#PJ)BxdMZ{S&nLbN@QAd~)mLUffkv=JWpDRJ@{c*E%^Nc%LR|V44%T+z4+th}LC% zN($=t?PhouoN>)=7W1v_KVCvT{2d*Q=Q8rO6YXKmJVmZT5SMeci^DaG5|@!V1v43H zJP&T$?W75|y+aigWlYFb=e15{?aA}mT4nM?ZMepc?(yFXap(*s$E|Olw!RZy2YpbL zawA@;y6bn(4~)9@*xJ1sov<;8K{k)2|6=T%f;0=dbp4fW+qP}nt}ffQZQHi(sxEZd zMwe|Hr{}*r6BB37)sEPiJ2P)q)v4{42mb)aQp3S&s`s5fX0Pc%OLIh4=tC81G?E%a zqH@iL%LxR^%_&OL4T-hwp(Z$OcmIvnE*>J6!2T~E0sfbd{BOilGfPt&6Mb7lXY2nV z*r!$X?f(V)3wL93$J^@T#zlTHZUn@=AT_6;uzOCyse zbyh_Ct>lRNE*w8lPn!LnM&6*rZlo5E<-#dqy+`Z8dgglO&gJDyvGmCMm(l0nbTYXQ zmF$ldN54=N^~f@&Sfn~7xE6ZDjj%tDGIBP}xRXBxVg!sLUzKs{U&; z+18-FI!DzVPi>|}Y|b=QP;0OCSNZlWtx6W0CTg4E+B|=i!&wN{b`PE_uvWO-2-%7v zN>z4GoGYHzxk7G*gKruk)IBN1)fG>J*U;b`ZEl+!s#^E4s8hJG&Jfuqj|V1>`;@`c z#UFaZ$&Jr5NFqCtr8r7|`&~Z!&dmHep6qz~gTU|Pb@`w$`}<+0m+_G^M}jy;q_U~b-IPI*{VF))lXQW$@zVJTx*gl~z%g+%0d?ivEWxFk8~ zRf14*#3!njcueK&CZvTeQ-bZDgd?Sc+G$`)9E3Dc!B8RIhhac<7VhI#!sb*Y-fAMF zPljm=%d~}gni5SaoOPy{wUy9xiuckF6p0SaRl}-w!&>b%4Mq6rfo5bJ)R&Rbe&`ld zk2+-!9zu}I(5A3JUZek~_}KKU*Y&Q)%dv*<2jPP=@A~39I;THYh<#AA5NOj+`rum;WO5Un4tJS`w#ym`-{8V}9DJ?N7;XbIYz|WY$*PWPCeXla($tvUMrgoiB}Obt^{oRj(L6=}r3;F|Z%0 z%Egl{`8_PZfn92*;C~>(#6x4*AoNWo6B>G^jsxKGNsPD_ESDVq_^Va;8<5(qUuhJp z+<(Po0=}6MTHPWnKLQCnGV3m7aO#X8Nz3AXSxsy-;fWKTLmTuRIAi*k1@tS&Qx4Io zr`A=tKzFYxH_4H)ELx2ZcRi6?asjXoJgW+lwA&+0u!Gdg7&8u>5ZTD8X9pmANIRxs zK_GdOR!*QvjU|R#xG97vhOS1Kx2^=__!^({^7(l@9etk9NgHjtF`D=xHtp=lxVRFe z-q<2oTL@f)t2XI>`9KS!CDN}q`w^?A7m0a0y&6%mWIUlM$v-qJP_WqbN5*tVDfYs=g$=L|Hx==1)V-P~R*rn|WIeJ;2`oLv=JQ|ua+gFCKr`8oiA zAR#7``HS7g5SqWv;mAVAiN{&`@uE#bOW2=Sm(j}O&Fj9lpABrD*6;Y$;I#9IsFG}z zXT<9)4kPp6lT)Ut;zeeQOC(XJQDjErOPq_ArI^eMd!lG)%#XhRn&z*gnUX#{;D(S6vKxezR%0#@^_wb@B6vI>EmZM z`rLe~=l`A@O?uoZ8TJQz{S})3(n>2OTO}!5H`WbS#@JeDQ;DXQb}e03DHYddc{|w@ z@>9V^rY(@9dn8gbk9{VcRhKCpR_7%aZe5l5mzg?@_Wh8WtLvD?vnx(jd^gK3#x7Rv zPlW>bHB2h-)CcG*4UGM@4Jgrk|N ze1q;07=;E$ZsL11Z9j#`CM-dd0mSZGfHQQS!q5XJ z59BPw*_-JzdA3QoKst^2n$9I;c2GBQwwZ)LI(5C^j`1buBj2?T#Cx78#TtyFe_ZB2 zpHwuU&V0!nI)2lxyw1Jj)3$ofdzK(}S$@qMHW@l`C+j$Ky3W(?8flYj zwv*2?VU5b08+M##FxhhEqkqb^h8U;Qr!KY{eMehHSk0VkuT^~)-7?R(ddxViY)5O} z$XVCT{#tkKm6V+feQ-!KO1x@6$T?fD7HQR7wZfF@bhnERWj>ibOsB8fd^;g|9pI*6 z!jha)>6)$iw!YD;=0Ta$MX7DKb)LZf0;;3!eEdcuJ1OUyA>Hfxmm$|Fss)3gtlyoxP1{}`x@pUK_ec8{vf^D=*4s$Ey13G6$pTiwd)-<-*d zwxh9Hr*Fp)=vy^PpUoG5NN;_5`Y_-2L$aJwpP4 zSU;{Epa;K#Vn_a4kKQWKPOGl>=--{@nrWwSFP@WLYfU(YGJl#ho2|6`$?kZ2GNS4k z>RYYg-0WkQdHWwbj`Nz^*Gi*ba$;k>_YJP+-)dV|Zpd~zdnZ{KKk2W91BKJi-gIo8 zjmQT50~3u_%QXmYkBwJrYDXUpKiCAN1qFqi-D>yt$~xn^$BYaO5~JBuDa9KwL-!Ac zr6u~Wq~Qi_8u?kY^R3l^MyHOuI^k+1DP4GXtW1p+H6v5^9`-d}73IRMMH;MbyW{?r z72cM{Z7FeA^0j7Pms~hWoLAu4Dukv^JohU`X7f39++@y=j~rqLGaBiXagB2HXm$Ky z<%7X-@uEcttLNE@E(g$`ZQ7+CN4;r8l2>#ti$?hHQ~^WYC~|FZ`X9T z*wx*qIj@Ksv|_V6uGMDgdmm;L&1z*q{2a`%JISH5A@*-IwGWv;IM&WHUi~rlUS(O$ z*_PHE4|y40q}_l+&|7oC>4vhqVE^kpv(na&GXrj{UPLDLfl7BL`ubjWF<=-D)4(+Y z;)6S&G7?&MmGvE*WzOD?qyr|})(K+o8$yVrn*fedNET^|w(dkBV*tW!> z2Z#%7_aYxaCq)(c91<$6U};dyVcv37+Xc8{u_M7+vJ&uoa`Up)f#6F>jNz_gPzq)s zOVa?qU>AiRd~}~kG7nr28nNgxyv0?1>$>CikNizAI3@u^DM2;Fq_3?29Q4Tz z917_<{6@=a&VXVz9NismhN9tohh>FX*armJz)l)Caq z%sN)ffd{~MZfY%+?MmK)_Go%~{=$uJzf%1Py!isz!P)ipx5ou$LPJ0U0+tOz#lk$i zk!bbn8$cjDlGF4pX_uYq$k>NSWT$B03>iV9EqkuUfSM2kdzWB3l1DzG{=`(S%TWwU ziEuJ6IF)oAPrs1<^;b2EoY(S6)kE$^>Iqiav9kgqtH1lof%M(L2FZ}0faYjmiNCAY z;IFo(R%Ul&z&TIt=pa(+7RY8Z=!Qq2nzhupjFt(MqXW4 z_CfKzEK}nefJQK$!GXhcW3UZyou^xb+@Na+o|(ih_e2?hTjC6Lb0kENQ3M|cJLAjE z)RM`pSo@waAr=?~Ob!XN(qz2gMk;NP)DdtFAP-qE(GW_evhnNbi!CsGR(@ z9Db2Er7*Csruzv^IoH>gd93l7Qt!G%6*;cbK_@m=l?9q4Q&qkP*}}&Pner@5+mUoX z5gYqq)jFhGn<%#z*8GPf58jI$Y!rJ$~_bkM_$OOr-Pc>9gC0|Ytx zmcqbPSbp`%1xYsakGnvcA8kDi?CZ!0cb}nx{3DJp@xwSnN!>itx$zV5?HI`C&8}b0 zAA*p(S5mWV$b98r!KHg%70KEf5SQ6;EPsjlDO@C3}HH0zI*a!7qdl!wo6dlxfx_|43iZkiD}L zHmRN+zU&aFmQN=VD=ZA_&}ZX$E62F*Q`z1UsqZ_vgUG>A)5`4h(r2U}(8(qJfp+(M zZ^2}Nq#J1hDOqzbjvuXW5vNACg#D(gcH=1L#Kb?m51y8El8MUTgV2XukZ7tHM)Tz% zvr{7T+jc^M7tY3iEST4nnrx8nm9y|Wbe{;!21IBmp>McHY6 zfgLpHxth0&dRLjFA}mY}L)zL+l14;}VY8;g)!#ZvIa|YJN`=>2*4;rESZoXn0U)-u z>o&KmjXG6^^;~dCU!S0{-CXXrdu6WXd(VSg=Yu{8^`2?X2RwBU;fh!nTGA!Jw-|=9 zM-Iatyrb>-s~srZ|M=NC&tR9x^4&h(u9ls=?kcxrN%mqs*4!;2kLSsH*^DgX7oq6OeG8yk;NkN(+XZ+BG4~F;=78*55`o`K92&+v2PVXa_Qjc zvUq_MiWTGEAUl^pe?Qaiw4$dgT4kfbTU}hV%BoL@jBgjyzkl3__Q3Ie?;hOj>)+_TY->=U8 z+J;n+rS2OzLF_cTKU^hV$2%ke)}rk9k47CPj8=iVrR3;U~TCP zYH5dw{)<$?j4jvJQg#Gs}ogRF>RR$xp6Tc)=WYvRcH7(u# zo~DJ}y0XXXtSEGuCh+{tKteN`BmG2uh#KznUMN90uLVCw^C%RD(a5o~r{!HK;p(q2 z#Ht&}H1%wuN?L_2Iq~*D!PSB|L@UmrEjA>?4YJY!s*HO6Clu2nR$O;6ETen7gc9_}`(8TLy*Ffo}luYslHelCm z9sK|c3X&oi{24_j-C*<9>MrmM6J}yk#K0J7KZ#6aa4m2|wZAA^ueF%Uq<{Kb-70KX zbk*TuF>31-i3HVXdS*cotkj0ei}aYTiAD6p`G`5~3iZV5@qn@7wlV|+Bg_LrH~MD5 zzGuW^%4Q*Dkjg1o>ro{Yq_T`bBsfj^u4-3r0ThtEu&s#1?27$=77a``p_Np?QK6S7!F&l#kQUQvJ) zNk)17*}P5+g+jy6VR8fo{_1if(^)}JPmewtChn&oRfrI+%7CnBq;*<)NDIug2Wu~0 zjfu@D9=@M{us!bzqbxZxOiEH}?Io{2r@w%3X4zX%?vm>T|8jLK(y$yD#{t%`K_S}k zvrGy9aBkeFrtrEBWMoRk>H(P6$7^Cn9idIbVdfjXSxxGQNd}-#@|42g#($LGQ2jEw zE;tMDbNUmmg;>rcbtVz9=zySU3s9dls%3b&{42g_7Sh>FZf(nf=!k~`OV8?$(>R83&lPxS4>1Zm7AzMC1?3pI5n)xr--%E|vY>L3%Uw%c>+?CT(<0Gz2GklsqD- zB~<&?_Isl7asFt%C=_bY8=_Q_+~V^TYRpue%pyzhdFtQmH%dDQqRI3$1VB(BxLrbQ zu&+I(ibOMNh3qlDZrEYr0p7i5=&?rsUAr5a8?CVh96 zI!bUG^{vf2Cp1XSrv$x^2He92eCEMQgT58G0KCv$jNpFbe-yBmxwg)-?gigF10zt4 z6PwomW|m?Claaff{zAg{&UYt}1A zhqg|G8xthOv)M?29{qGpC+_jQ7#3?od23j+nB&J>7TrWD$Y8CV?Izo`7DCqa^z)J; zegLH&{qft26u)O{E@89-T3?ykaML2PXRSem1nJaCW5hb>Xh<2MjLdL?789BUXRzW7 zJX~mT1H(4fpo}u>ECOQXylk5ILz2*`Zi2$ZCxleU^+O#l5~Q4NQL%DZd{6mU5YU91 zCBZw{{vJrit87lSH+ozS+ex?t)zCUh;P?*%Qo=ngGkRbQL~)@qYLd26wTUn%r0*^Z zGRo$XXM%)l!7CpZbo!BEWm#9B1<6EzwMWbtM{Vr0sE~0!fAvKyqn{-PLayIK&TFNUQW8p|#=L`#v8~!Nxwjmvctagxaq?H4x+bqMU!xfZ~ zRDn0{J31qWWY?lnxFDZ++r&A2#1bRVSGT{2K48pc@B2&jkPTBh6HEfj#`ypmof%lS zo}kI<9jkt+Ehpe-PlPupS~%^2{^DM|XZ#_z3J<}z{-7iMQJLvTo?I@T+Lj99;eQq6 z?h+3YK;{#F8l%W@t2`Vovlyl%Ty&@&N-kVf6qa%&@I3Xrini@t78O$d_FtC(@B|5f zy9E}1?PT%zF;3MgSp}O z#1LT+y8|wO<8mtr49?A-Bc~X4eSLefuS^_CmvRCdJ3VaJnb>8FOSioPS?V7_G-nS*J98YhO_4QxyeOn;E_6b7GWZy$NE0-R>1DfS?$xmziaY|H@c zE%5Gx0(4#jIIvzIzGU~etQ9HmWp|=SgqhtW1*&@ICcBoryuNrhhNWOZ%Mk%+Jqj=S zVdZ%fmCUU?_v>TfMt@jX56bsqk{Q1Rojwzg#IWzWXL*4A-3!4rPeea%h*vUU%@X>^ z*35?=^JYXZwgC`gejN;WG+Yme=pQe`IwX16wG^LqgRCFA@`w9Tj|@mZV(BsxdK&xy zU5|=KlLH*(*&`QYfs0RWZ_^>i++5r575^yG67qKaXtG1al^h2SvEs=qBNOBTcp0T% zD=xeXY4~gLw>rs;9p{M^kcY}2!F@z5jAr2P`x&BEw83GkT`YjGPKg5PO#p$)aM&y- zkJ>*d$doSV^t-S-L5+IJoHofz4pG7KP1XlEXQJ_S|7aXnrSD!R(Z4h1ekPOd?O-z) z4s0Pyn5ivnzXFl$xTW#u%^g1rW~`8=wL(=|k39TlNVy;J?l9 z1HdtYM2cRH;L*H<--**B)~>Zan+#q+Og1=SQ`Zu z0Hcsz2D=c)UHQ<`gC6#NNd?ow#`w{I8gxN|WEzqjjObdQNB=Z$$g53`MOt-dM zLUto}>AHeiQw=j7h28|Vl7<@BgrpLogRbPt9YLt3(a`y0zxDFO7~q20xkNTA4Da3G zxbLEf27#7>TiV&Q9jD#f!nE=~ohkhyTb@*ucUYBo{-Gxn@@jy=>KKU~M8|2?>IMX0 zZR8X)oK@LVc)>VEdgY-&Prn9JK*dH9EhdktK*4RJUIU{lWGnuW(!a$f19GZb7*6u~JlF-N=K;49JyXXY23VMU9Y zEN^KFo#oJ=zy@o>JpBxD*~A(bT{y1HDcv>zh4t=Zrr~!=h@a^^mI5#n+c)oF`K4=? z(6xyT5+;c;2i-fOsYDdaU{uW6J0RAh*uP(E*`lmz%Qoxb*QkbUo<)0FRpCi0uQX1B zc#W!$6Ne6&%7!JjQFxfd3m~IH_A&R^f0)qYOUM2Oez*LVJjX}xm83ROJQCcesWm}- zR;k1=yTU@r7ms**ygm1DS?C=&)iU_mmP(?-tWg#fk1h&NTy}h=x@Q7=(1z{gXj>!#doVYdS=y0eNj%Z2nmztgOFYUmta`2rS4xiR729q*4Iz9p)OE(TVbqY67^36m`3=4hhl zvnf(1Qjg3RX>kjAT&_9kE-Eig#-MC6I4`NY69I`b-<4$Tr2*Ak#iXlAXjVPiN#>%q zF$z9U!X=c?!Q|FKOP(;qvri+7ZaHgWPURY#SlZ$Ye0B4YY*0#)R8X5&XZ}noni6g< z%p+v&|H2jLrVr>?;!mycj)Hc@$w|oR~MwEF6U{mzLnpY8{h1jNdKCaGg4t2*G5BIjDeZ!6sYx1KR+6 zC|5+U?W7*m-+Jw2hN^Qr?X1~vSo_K&oELlvFn%Cj{NU7lJ1{4}4Sr)Bh&+Ii07Z_O zzs9QFm*cifJ<+fdqx{*H{emayPYp;Wv;U=dn$0d7*ec$aUU4d~LxD4Ho`<%^bTM`!u5 z;M{~#^bD67{LV`*>sf9|GY!XD->V0aD&yiwNhgUlDmL2&YD0VAy>-HXLN*V|M+BuVEh3E`Ef2 z;$y{9EDv5bhKwWlR+{`>BLUBSuTLBfk9<(=U|4lxmfTAuq3CG-7|F^?xn`Aesr@itEusQ^pZ9!!zb7-A_IZEor6h+M zJ8rTA7g+Ax_}*fL(D?GMC;cdidRNe)CI6i^uNI^4(ZfPSh(_0&BIVlTduTH_RX~>; zG11`KRJw}FedbWUZ*vm?=5P0HrF@KcnZH>gbH+p#T3+)7?+8*TGZ_(1s$_@a&p+f@ z@M<|^Z{?0a@eCPP`)m%ncR3Fi8Wx(urDP$8lFFDETljnsSMEhlaUn$h`f;mmU_`!hJLH+V`rS?{c!0-s9-U2WTcVFQSt*vtzo#eJv*RN5w4 z=EF})+uY#$eF5j%_6i6%+&DM@(4G8I)Chmb@SUOkWXM~EKqfzpFZ~oo{2;EIt{O`2 zH`9H8=qK#FJWn(t`Uef-3YCA*objE}+jx7VrNaz<)DZ5|F^vL#yhyo#UH_|bBGv^w zz~N8qrDxi(haFcS45Fghj->uqwJ&wz-6}w~`V%-M`YIVF@xvIrUnS?aPcYWII#L7R z0NA7AYSEG5GQ_t6rn54OZpUZM>OD>an5A4or^KPCy0{`@=sTK-;=5e&Q##V=R=njF zhFK0vEg@OCTT+|sE0$S9DzbP=O?jWvH4mt5oYb{?(`GW+Q_Q8gPQqmQ@s2i0A+k(FcOLHKxdG;ys)-1iSZRr4!H z+a>xymX3M?$iI@m;&&=VpUpU(tu03^+#SXgWn2()sPf#a#F~`k$|ZU z0mB}; zz@WZ6(YlE~F?lGB{+dpwzxNMgcrUQW-#d-snPKSnzd8n{!V60E!M#f+3>M=06qL2Q z6BycHkZjg0$RHkw_?E@=Wg|~OiG_RTK_!+=MsFiAWq`?NH9bpg#zr}&{7a1qWg31v z19kiyu53X7IdrB#3{Rf$tSit)@eMnOcDK5)Ei4fDqNDiF?GZJ#=%{wv!Ry2e7L4Vo zmK>_VP2hFJm{L?oM0` zw+qRt)~aL^ZM^OJ3jgJkS^j$ZRcr6X>O0~jEfp#y9T}=LWxQg+Tne&ub4zK8vM?2*5~bqnQ1}oR?)Uy90{qUGI7=5vJZrNP zLimuB+0$FLz2DBu$F=(n-gIyAn`<371uTuVeioT84yc4fS<$mC{S_b-I;eJXdJgLiXg5d&PTy8cn16!y(qmj zp|_pLwm5#ZaBs+-OY%V}a#*gR3$h2ocn(oBondG?RXh+8!gO7&s(~`Y4 zx+L>2kv(Fvhf; z;*LP`&nAzvAY?|Y>eOZOt`o~NWd7Jm$$7iqQJB<0&3O{=`1zi3b z>yu2AP4!q~Y+Q{zuDzY%{%YqGNXa1FQZS2EnRPtqClgIXuMM;-Oc?txpM zY?TU#NY6ObestkKHjSZ5HkYM?=CM%%)lmi4C=#;{A@oLQQfZoLv`;X{Ypp1+5R>LN zWB3!3#8ZYog4;$JM`yG(y`dIPC!Ijr^g`qv^%)TPOU#W!lzuj^E`d*kJ+YTy{U+%| z_VOjc7v^=c*__7YN9f+ogh24wJ%NC^@rSWV071g@nV>S^E7t^Py`Jy`=1@ZJ@<#X> z!}jCrFIv+NrYAxZ0`Z6U_=oHz&)B!$rr(cX=p_NEK-{Is*f-HV3i)%s=rh9R^M``k z*!SY0d4ezIx`43X%J8?6$xnuD|Bvp!?i2#?mn37~$ZudM9~22+|223zwaE|Zo2dzb z*mL@Lea4zV=w-jv=1spk(MNsqj^HzsiGS#4S>)H^*ft#BY*Aaf$xkixx_|a3d{aEh zhxyn|)|x-Ux&RD>DA=qJI4}Zq;UxxQZtV^ckX{6so1VTZMPhe`sKdyN#y5?Tln57J3WTU6c(df ze&qqlK$xEaWO#ZZ)07&f7T}jClmvu$;7mBKKo6ldMzp#H7Nol2cIcPbcFIoGyv7Ig z%F+Sek$T{hwmsW2-UACF-oKj?+aHhanq88fe=qB8%xb;QGY@Ei&pCxQ>k3U0nq!Gh zBAR0fPcoWgiBCeBV+l=Cnq!GgVwz)#OmdoINlb#8X98phazQ6C<`&}LF_Z`dzxdBJ z6n~JOo`{zEquv?M^+kL^pX!VGqux0b2}Hi&mPVC+$j?zK{Au!+QuX_L@MmYR&94p##@yYuHt}0tu%6+E{E%Awx9;q`OTZ#JB{3Mut>($({TFt%X@4(k z1yxTrxZ~(fV!EzJ^iMg`IqN1xT90scn+*5BZU|g?5Sl^uiiqbZx{O4K$T^xE)Qm>5~ z_(d=NTWHjxz4QAf=a;2?I@cGLJc6@V$l_`YzwhFhpY*IAaRf2!(DfHH*m_(Oh$+Pc zeM-9GbHSy^db|_h2rVU;GF%b97*~iZ$_e&}a{`K7q^`|>-PF4nrW-%OTG+2zb<7{% zbhA_s(cT?MRr3`!BF90&)BtrSJI;oh$%#ie#ii_mi)5YpmM_LIjhPd#I zO-;%)>9U4fe(~%U+!RB#3%}SJi!3vsIqXrLHz{VEGzUsz&=Q=}fK?{4Jc+uEezPpK zP=`UJT@0)1R@Z8Q=?~a=IT44J^>sfrWOgNYx{M1xO9zM9#k$c=Q48Db;)}pJy0yjt zFNjzcLU~YpG@Lu~_z5zzv5tmCOv_wy9!x7=diQgJi(}j`1x5x%v&>mp;$k~6jN!6r zQO6e7m=$XjTeSz45$j%ha5_yZv01#XW#SxEdR4IQk*e;!HF8_WAVQOIWHAni;?!9v2uO?b_w3GR%@!Z%)HKYrJ>)7mD~vF^)X1lt9Ci0F?^ORH76$~ zpHm4~SIejC_`ylsgw~`mE~ED!zc9cWBiTIRDFXO+(}%-8MgM$=a^?ZEt2fe+QJXp4 zQ0K_~QPFP9Lkjk;Jx+to)LH0Dm(DK>m28$mgKVU7Y{X}gYVfZ?;wwU&E%)tH-Qe!9 z){}V%I?ZmEtj$xXmBtyVUy1fZ2kBXygIRXek}~n~w!y^evi6H3V#ELIT!0Y7bB}wv z$Qv%^ue-e@$#?2iSaVUOY{2FdxNt>%v2{=c>3MO;c525Y_%^lb={7@fDmMDf{S$B+J(+02yrLZ4 zcQWxV50p^vF0O`*L+2`g9;;|ePaDPT4rfVE64t#3-0G%B!AcVxnO##tnu z{WD=iA3@9k(&_Q-`{-_{caLOE9p&Mr3d?M4!II?vXY{7QdE zO+6(_sU4suzl)6?wq;m2G}0(=_*C%QPAwjedLkWij;mDmT6q*Jau|A3$3kw7f-I}3 z_cD@7Mdi!ZCMfBao!eAJt4LVIP(W8qq2*4d*e3HDJY^@fQd?@JZ3B)J>!br4UYz&` z#44)5Gp8rfoxOVtAiHhgEM3JmOlf3}a$5=e;EHO+Vf35(u%gG;?0&kCiz_@c(;oH= zWKOVGk`%$ofP#@V61CxDb%7Q#8?wg1IANBEHHz$;F>?4@k84H)Qn9k^Y}1@d-+#Tq zSA&J7n$7I5^Lw8OX?Sz7t2Fx}oUefCb=!3EZ>~iAD&ij=CL)JtnTHj=uP;^B{M1#W z#Vus2JX?3rCU@cM!I~UfQ&R3dW7SB{zsb^xZG!PO9xZGHI!nscdOi6>Lq>4 zJ7ModigGh*`;}OPr$N_GLW;x*={!`OaTsiuIAU zVcc`jKbST#!V|%NBL#&Ec40q zrSqF= ze57#j%&h9pfJrNRhMAApqnpg}uFli!V}ORb-Pa@41FWQcgUFr;ir8ymc;wj^vp~}F zSHK9->%wZ=bl0nD&>C{k(l>{jJKu16P?wYH7^C`{s0LC=?v3U#NH#|;SdwpDg> z!7xC6DH~3NX*kr6OYzE@9KsT1-VR?=gB0p^wF$rEyM&rEnru;pi&7-Zo0y{Xn9DKC zR+tSQ%UkuUFxaZ--e2h_v~)fhKFgddo^+O>iJs(AN;{Bh!YXdsI#y$7po`Tbw__q| z)c5mPN;DeESVvS`|DmdoXJ#51W<_b1<^3~!AggO^6c|ZHo|Xxjc~Eo0dsgdGcTKP6 z*e@nkLqXP#o2VVN2`-XY73m;r$^lwgc-j=@4c+Rr*G^?cckMU+wqNOrU2uzo){6h) zby&1hDY?A3VV0pfO+QXr)RaqEsbZWW#Y}?3HzFS+ebH}aNS6Li0O-Stq_RFugON2e z5EWx*aS>Nbwwfsq9e;bmRKCa~n76o&VP&iyK6NPst(j2{pqqmhKLhae&)CK1FeU7q z<>c!cedH|cnRXSH6z+@7z+L*7(umnx^g}2kFh-d*zbv#aBif}@AvDMFkBP#d)XL@< z?$e^2WN^*`NAQB#(Kv*m+)v0_go2rEHYm{2ZfgQe-RzDx9;XH;?&;1_pc=XifGQ7& z7Qnuz##X3Zy4e}F&y;JxWj@#%a>lP9-nx@Lv0 zCzkg2*;5b2ydYyZeU@#w3Vbd8Z$6C~UE~(@d*fWYj3@j^2jh=Mm+2)<+pHee2 zDXlRZ;qC%_%HP=TCUx=sbRV9g5`y`2FSb4lqTCh}e93b8CAjKG)pse#hX`;pz|i{W{&(?$LHi4I=6H z`|$NhBm^Vz{M(=UU$QRUTCnZ21H!DcKXLU4{{$QDPRDcGKjyObZ+%A}Ur%s8`JO)v zxs7fu+0FH~ z9dyoGc$2^j{MYR^zHf;C+s55c-R=^E2LRZm0{}e#AEloESB>Wvl#i~2=gzOcvt72M zO-XBwK2mP9I!&}YO=K4hHh697_jmgy%?mLpe{13{r6YSgA+r&MnL<&aTS`kql?w!^ zO1Csnq&ua#w52h$Hvpw&rMjhxUVabLo9!$&xV5+zGEMzo&)zIMclj6I4}Ba?&+2NH zFXa7>n;*@;2UdXx{dso1ar-J~Tfl)y1%o03@CyPx55tM`{P1N1;ls|#w> z>xbT@cQ2ln74^~eMXDs(Dhr8}v!Q@%L9{XSWi&=tXF?>umX&?!B>xJkC$o`C{$m-{ zkVW9}bLi6jPI4^);x`)iT7V=dHYtPb#2J@6Jg!Fb0;!FxFNez{B&3YvV3zMs1bxhw z4EAHOT;eDgg)=EWyF;HpkVWj2D}k!D6}85h*Vg((Z_2bW^tz>swkOsZXP>hn+(a^L zHY9`8MJ&~>TPfOtZ$df8={++QV}yTNy&-{u+Pf9%8Rbx-MHs7IcPd)|4oHvVCzog6fhwbTC(oM%s+`q zCcA-&YP`mOoO#DTJgp^7fTAXmOhP4I3xz}DhP47radnieRk~!J7v4=OqDyvvp?R zj&ome!9nOz_#TwlN<@@_xSx>7t8qUtpOg$ZAmI8sspT@Ts7F zD|{?m=v+y^Gd@88xN`M%f=?_@oJycGK1l#PGyQeKH|7&c67MnfgYykkviIM2$%iV0 zY)3RNmiOg^XfLTBux~60{{rWO_6=7u_Fw-zAE1)&Eg3sAwweU;u1vc^oip~XT=qru zuHfsEZVQ^fa+?-Be`R=1`8UQ%rTp-|LL1|r54hin-((E&d?PFXL?6+&R4X+OS%O^aAO zWFHcgp#M^_nQw>o+5V8YS2+D*^!j0cGavtONA2}*7rfaa*^#)BnEOB&>xbO-m;6?v zn)#0STw|DFzIkNi8}tj!`{5Y+P$L*7_1^wGHYHI_Aj$WRB2b(X8G;6PDC7 zlunPaz#3X6f(n)CssTxAG*dK>w>`j`Rc!_pN|ST}CRfnSFccncK(xzRj7!y~n1W7E z(9W>EyrY1$6-~w(wMmwMLpYi#*2g`nkkOQ2Okhks}_R}CAt$p z5=SlL1>-<7yuq0nOcoz+@4c1u>Wx1SpMNhtWnU zE?K8u1b-iORwSU+79Dpp)sa;{+-BG^FBV`;hmOm$#EeYX=^V-xNtBoTZxC(9OYLiC z%F`CT_NigUS=oT;zv#N&DWerv+=mq69)7?ztvU{uYJcV%2WdwrXO#m=ebHfaCorGu z88saLtO?--+z7!$iA+$!V}t>-#t*zu5_4G-o(0`7F_{BaN0*zx3D;}WH~{1Lty4gf zd5V*G0Veg@&j8YorF#g%_4+g+z&KDVF0f>t>LhW%VSzS25UE0?DYD>wi#9zFY4}nT z6yg72?3=Zev2CYg+qd_9JNxCFm$honS+(BQSCeCK zSEnifjU%_jfJnww9;5xbkC9dfKAIWym||>VQbD{p;<_s3e+0WK@ommSm`id^$So{8 zL&7g5bxqDKu*kqeUR7Sxl`$F7#tFX(F;mNw`{HzoLk;7!eiR=A>#*JX?8C zx3~^ItKzU;<*{Cl?t8bDlthAvd$jJ&n|b$o4ZH62Hv{c@7jsbVXDM4hcE|?e7OL`D(N4jDzs26u7wi4SxZv1)~acea3C3411z6|}{ z`AWWFl)Q~#hA+M@P+&`#x-G;T+9*$DQ}|JEWT)AP{nkd>2ma*;2`u3I(GBxTV(7;^qX|-M);fhNGI`!>b@)S2kYK$%pdQ~{YWtKQ~yXX z)(7%FPsoq(K2NL{^=%fHo*(ElEy2Rqaqco$oX zhS=~4buY+bD{7f$b%=EZvd#dYn=uxHnjATGqQWiOmh?`@{k0L@jA$je09;I&h(N+0 z`pC9GTs$Nx;rJ*qJx^FvG$NVDJRdX9s@RG%F#}^}QEm{(jKlYF)5XeV( zrhoJ%`9eG^(MkAE3;G{za!rg0Uo^@?4~@>8bUrmb7q zbmvuTCv#Kny1K`FwN1nFw$;j2{ql6W8?T+4i}^N#&UT^Js&$o2mRpydTYS2kU27+1 zhTFe0X&G+bc5Zbn7d*CZb?g_<>*qU$D{j(mAF)**wYAe|XNyc8=BI2k_(umG&_1$z zhamoK{ghyS>U$?(e)@ZuVBZ9R3NSv>dzj#UQhPV(uODFFjr|75ugx6-y_U~Yzzr6U zA4>OrD%aRn_`ZL-d8nRFh!4;2mr3gHfHpk)A3uJ53N7v+l6mj4)gf$-TyL6hBUfCP zJGmWOGrt0$`1wrV0aV}h{ep}qX=0e;4+>LN4CC+2hcvPDUSL;z#@aq)-#!DzX)-a~ z*T^QF{Km5J5;5HS$R>b)%RGsgvzG{FPy*(^#S$^tj}gpee8y8&@mQ=!$R=U@##0gh zv`-Pt7S(S3giJQG(k&(<%U>F+{XXM+bmQp{Bq!;1kSpzion#xSo%lwOE963s zqzAE`SSPL(?t*)?qD@DLLQI*kYk8fbHw@G;gxlCL6kIORR}nrnEn6CKEh z1O=%bMCt(Y8(v?Y#fVIho2LU!CP5~NELGdKhmoU=mPdw%mtj65Lx%O?ffX8HMa&#l0(-50(~4{2}OngngM)E zUyx{PMbe3tWdo{M;%aZ5JC|zM$Q2%&^gCN_5ma(@zN2J)>>vdkr-Kn&PcvVNY6(hC zj@$$``r)$DHnmiF9(#i3w=0iO8HUM&i=$dnCkrokUPQvFu`5faF-VGW(;lG4i=UG) zlHyD^S*W{55!$y>MR7%SH6Ps2Gy!?yZygOH1Ca6$tIeib}m@d3~V5 zl=hF)U0xUpx{gsY{H9Y07sJ1;mDW{Fq;z{Y^XjZRiw%>>Kum{i1#mSjUOE>igCp_V z1Ocr7I6YFX+}yDQw|3H7F*Y+n(@k(_<_`4po^cjB3?Q?rAzi50-LmGQ7fIx;@MS6g z7DdBXC9etzCY`v;Teo=en)+F>2;tJqD^>*+=&SCf0-9;et(*x+Fi7FmEX~W>G6)h( z4ZKR}DNI~gM-)U_7Gy=Voo}a3LF@OJ+t-!XzvvqOwkw-9w*szHuz%Bl^x!CpW-pFSO;s(Ud@J=Q&OGIzL%g52XD#B)U}Na4iC{8OM1|GHPWi1 zlop;jlA|rQld!uT3|qBrotX>JQ0xliCMbHL`|~>)YRFBxYR_9PlSn*i`?|{Au6G|y zZYPLUJ4ID-4(Pc178u|hs~$NtlAD9IvuHmnePs`7Z^^^Yl;iGgsLV#O-6^r1m&t=R zwSIF}bR92W32~hDRsQji6eaY*V7T-}EWMoH%@5_xFVzu>IA6RtLwxzfRbso;SiyDk zCF}O9pBo z(#qsVmLsDw@^)Fn!fa|zXz1cQSd!bp(8k^$pf6NQ$Gq?Nn51{=taxo7z^IvzLUt`t z7x252H7NFXZRVJJT(ZgDfXn&8|_H zH>JyrD53s0by2TjLER%wrIWry3$2&$5;7zA$C4&1I7R=aGrI|8C-t|f9TC!4>Tv(a zu`M-}?1HH?JMB#wu)T7Piv~hI}@)$@$DvW)-F@QQT!mw$g%mg}0m-(=< zWbLWKb~>3miRo#gX9ea;hF&}=dfmDJEVJ?uPr(DD6~)cPY*=6!D7_Dc?4tfea- zwoFkADnrJh3zPE!g;e2&>--m4wiWFGzM|TEQ1UFr#gIT8C+V)!d{BXyqlYFuPjufe zr`p1-KzF#Jqn5xz+AGddd3f`%6x7pfBcRy`MK{ zLiOQaww@`>Isq)(doJ3l{GkQ>N!6p<-N`+Fi4exCMD)GM`|n$FuMmT32m|$_+rH5~ z2S(Pt&DL{)+pGJXTf2Lxz8S(^y~H60;G>2JC8&1tuFpz-QWz%+B)qLCwoS+o{)j{h=izcSc3x5@v7lH5+fZS_9Gn(tmQv*!Tr`ct z2&N{hdWs0EF5%fHMMO~?CxHaMtt`CFR3J#QmrG?nc>{0958%17x&F8+!2$6Ep{t;nG-f#9wZ5)a7wQrypLAP%oQ zbfXlBQ*_%tbjdV2difikJrCM?t-Y%?2yx>yn&Gn?1^;qc2O(`Ez)6W(SzCT!M4ejW zXg)92B_+14_cwWu3wF5mLRT7bOgcJ-sD7YGt$BjM43U4V(DTG?@e8_Z0Htp|5xec& z{-CPYqPoyxZ9`FQgG2rE6L8j(kJJt3sNNF-dTF>EpK?Bf0V(KQ`5La)WcDmX`4q91 z5V5c{%o&hB%m&Q_1MsND9}q#pQocDcQO+C@u@ z-C*a}a!ph(b@k@%()*drKk-lXe?;D%@TX2S-iQnNI=vLzqd#sZZPog$TS`LBq}{4& zO{7#256HU(mD3Vv%XW3LJsc?NT6%sWnLF1t)-dPKn1#KpLTDH|F*kzC+A)Ql$8Hv# zT4E_u=hqILJwYi|zptILmu$)oYD;)?h@Y~yG45>Wn%wAzTIHUbG|#4MTknNCy>ur{ z9Fj2|rlm%sG#a`NX-xXKEctbgakhHmtvhy}dzSeeJ_IU1OYhZJvW?fG%;-<%7usGk zmak5hbzcI#=s0rLq*gNCNOkR_r|$OBb?}_go;RMjX>SDpD4mqg1Ja;oAI^%cjFA6c zO49KcgyvLze-yP9{+4jQX)oTL>I1U+bST0XuA&yM8dxBt1@`~8dOh;eocwz(K5X#4 zpWlDOYY6@H)<%(6WVdVuHR~zQ65_k+FeBv4=B%|9h-{Zej5hGMtsNBveYN_(S%0>K z;fS8)1mcKpMuW0PJhwsGzlhF)hSBWc?V`4ec{%(s15Po3paN;>K~@AmzZL%lUe142 z2eiceQU|g`{!#~{Dt}80(qi_e7RY1zrnVBILSisbB*U?5C$nGH$=9A5(nF)`y`qm@ ztFoeRC5pdz52LT=@^DrZO2dfS%>Gsjw?PbAhp@p6TIVy0f^t>qK_}Cy_Y`L)*U_~d z+cUG*X=m2$ic~yV1*gCtw_wJ52I$lvUs^{wr}4c>P}G2_YOU^=@Nt*Up$%0#iRrj^ zMMF8PT%7-nuaOhCg4Ur!vh(HHv`O001p%U(GnnerzG<&}obTFM<)}C8;{*QwxfMTn zH}2{oq)&$GOUn^>g|FFx{Y~^R=ypr=aOifanQ2MXGq4%BnZ<MbjxCy<=sKD;95IdEdM zadA{VKc-=-KhOQN6v?B*a;ap-U z$KLgPV{MzCw$ZS-Z$-pkuzRPW&rGl6J5{amld5M?d>oOAW+c}Lb%3k=8Uud|v8M}M z%mcnoFDV@3W`eP)c553dVteMctB1xJX&R!)zQdA|XnyTs!22EJ`-VP4DRGwu-t6rdRRrXhp(V~+ot z$I8&&;Z0mAQiJpx%a`kIFk)vP{7vXP!rXqe#aCFJNjVr}3T+DYe8`E=wy>~oVB?zvuL5rN#$I>a$$Uufj{lguK!{kUBjfK{yBIV4m?qy zP)l;1!QHD(-UffmX7B8*j&b#MUY>c@rBR#J=obE>B9Y6<*ff-hZ#@ASgP8aMCYN(Q z$y+EtWNA;ce;k9;NcwGm;sCDI4vvPy>1w*xRoh)jYY7lmo*uN%Ro&dgaunLb@ z6wZpTDVC!5N+yXc+L+e_*Cx4eJsb_ksXQj8HZ^YIw4?7c@^EoaPZPi1AwR+Z9S1y^ z%wHJQrvw+cXYN`uaVQHx){RnY8YxXN-OZOQ&rip6q>PR99N1+ke@V==>^CpJ@m905 zvd#88p4#d!Ik;saY#f5+M70Ctb4+!78GeP3x6f;l^daczZXDE4JeNnr#S{Xqmj7mZ z#FuW1(OvX0eadl%b{qts69=oP;?`O_t!U^)MK#$UaIw|H#z8J(hPMa#tlO%5BTOAw zWc-FUZUpzhNAB?WJ^c!4)~yqRWTyLfrKMN>(}ZU+S3mEkiLGg>J8&`!_^T9{M9|8s9sL_z>me_3I+bwW`-b7!L%RahE%29@qewl=3pEX+ zaWfazpn_FBn=0;vUT6UAALX|;zTt~W5pBs}mVeYRZeSTcIZ8Tl?oqM3TPYYY%sGk` z)UX?~X98t9_4aSGk{({^Rpi^}Kd9+-2HyUy59cQrQBSI@&+&6Af9&~FE;QKBQevQ! z7``h!J9|4zRj$GN}cc?k|j!P!V6^>!(edJ%bw}oB5u9;_3ukV>OWIFv`mVWTl z(~5L-6Bv@I&%b}Vf18|h$jB~7UHPi$8TM%xa{5%ye*j|hUwjX=Y?GE%kokB4J~aC} z^ggucg3Dp{6<%srXA;lF#(fLT8HenLNohea4BZk-=U`rmcoJsz zr_LtYA29a04N|MVs9WmXz34%8TQIV7R|OvGZ)bmi{%2{I8_?h{iU9rruq7_on#e8mKHxUSC_af--}H~%(kQ&&)n%NTk2 z>CX0<-`D$-ci+pr%h&0AhlBg~H|$EK>bE-er%nG){9a!tB7B{#hNoNCyHx0^=T{X> zUG&DoyE}d_=PQ~|9*W!RPQcBg4@B?m+za*V&Qa5?ue$8e3${R;mR9a=R|iID1`{oe;JK(0B@#X3c|!@~ zCy^oUdXiaPdt~MMFtVknSr-g$#T^Zk5^s7Ztr^*B+6AQCDD-x&V|Fn2=$RNF{Otqs z=o^b0=-1IjR5l38(&vRZ?-S^E`?POL^SfXB`Sa^EZoF98gXY6i`oGp9-gwp>ox5Ko zj2ek)IBe4}zIo~EZ@h!i?M!qs#l#nDY;ZcE<~Ui{mZ>lo(>`TS*I~PEJrrz{p--7Z z7t7Ot-PD!MS`V5{c>T@X1HxM#2OqWV+`lS5?^Q6TlW-2gh&;n5`FY0=pHPo3pHzYn zUwj68(Q}0Rqi@is@%KreXpf_>R(=rg;C`uj!G4K(Cw0I4vkmqz3j_xYj_ZW{e;XXY zy{mk(^nrX?ee?K(zO#PHePcXYys7nqeR20r{o9h;H?5KHA6j>h@re1#`>A)zcu#oy zlJB2laKf4IAN!NA8}g0fpZ5a=7_lK*)`4WrvvG4I42-c?sD5#AiQ&h4S5rVT6jEm5 zJQbq}ti3@%yNFPf2ks|>un3@zd|6Ihk-2u<3Jn?;U}K814el&ysg0cm#3|d9-N1J zR^~xKH@jqBlQ{7H71#hj54?r6z|u`NMQJgL32ZP!wpF-)arlZdYYcrdWT}KCgZE|> zbhz51J+N{6fTO*|ZTWk`@7U|f>sX`ZYa@xquU7q8iLvU!@D`r$J9vFI^fDseYzb7; zmJ0b2j}1_Wi7)FV1Qw;t;T0muAbKfw*Y9+FAiM}h=W^TTL9>{z?v!9wmkNy3uuAsq zr?%j-#ReRof^{c-8OVkq@%FrD) zPT8TWavkdc=o5d&IU9ab#La>EL`aa%$!Sfg=Z8q{fDKsAbi4T^tV+2(do2+}4J{4` zO%SF97}h1gQ_&e2oIQ64yMA7jXQn790mB*MZ2jkVpVz3A2qAy*;b(XM;dr*hhYw1M zM_(YMskd|y)UZT{gNH@h70lv zj%&xgb$QIk*4JFg(&w>N9u>NE2jubxNLGbF$ZWliuYwPfKd86UKn!VC^=q?*>Uq+F z|4k{rJi+Nc7#y|u@s+&=G zn?lkez($aHMI*yb9e3Fr_-!g7GQrGD4t69|F{CT9>Z;(TvXEaEf)Zu>p$Q}guLW-( zC#n8W{}+(cacvxAKs4Mo9ObD9v*;KyNsK9CI^nN~pb@a71+sIabm6||J3~k%nC9f& zKsLE7qRM0$QJCk}L81*~8jzH`eag%g4`w=$4=0b%l^7qsX->H3E~JD;Jt$;F2_GnX zfD=mq(9;eA^2VLe^j`3=BiSO^))9=-05ZRaVH&7RIMUpS@B-clxbu%P-!9sC&n@w| zPsbkZ}7VS8z%T$DM zp6wPur5+Hn@wHUVUyr7vP9MQ5%?&K4nE=p$-aOQ;Srn*d1=lywB74yQTM|kevc4#q z6G{zc?RFB@Sr@TIg8}fCRU>S?eF-EEYpsBke@y}Q`Tb-*GBSZ;9lxnGJtP++?r*zG zY}K(s!ysXTNWm9VBPSwwCnf9gX#cPpLd*S;XK(e_gjodVLUe?(=w_G?Q)P_+hss09Mv<^nOVA8GaD;_h)W=nC?#@SPz;{F-r)RZzVLrNY z)UQHwUZX2%w@l4y1BVsWOdggN2SG+#^v4|pVi+W#>IpvzW73jf18-c{%^5y~Dy*a8 zf|XD=CQ?wy4`32xr_2y-fbdqP!(0uq1$@OljE@9MAZi`BYbS?BO%=O0MlyZk#MfGZ z*zI>zpd8_cnb*xhTYKSH8i&J-)YC(moE^T{poOcn5~i zaY}p-qS<@EijLyW<8Y3nX%LaWz_2vNG+-0w|1eYa{gVAl`w86^qSiZs1}347B2rY1 z$)@?Uj#b?UhR8YnSFHlW>$1*=f>x171Rus8)z*~zMtmKF_AEZvbxtU#BH zEYX1z`Z8oh!W_Gy@2b*NfaLPyR|G{>QBqp5h|9}Kg-cwA_?QlWlCJJy$(9qIqX0QCJrQ`T}w}1ru7EmCI

jLtclR_3tPCc5G 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�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⁢efo9z_Soj#rXAbo!`(U5Y;(T0| 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]FipW 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≷%t%EK-rvlFQg3|ePkP7P_iy101b>A<7S{&7H&Ld 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§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

{v^y>;R8m9??*t!5bR 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 z%0A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%0AYdj|X_arWog{61 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 literal 0 HcmV?d00001 diff --git a/model-optimizer/install_prerequisites/protobuf-3.6.1-py3.7-win-amd64.egg b/model-optimizer/install_prerequisites/protobuf-3.6.1-py3.7-win-amd64.egg new file mode 100644 index 0000000000000000000000000000000000000000..f6addfea5fa043078125424307e952ee319d4f57 GIT binary patch literal 1304387 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
+#FYrq&o^J$=NcyW?;dT+MZ93bV48dcd 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]_wBA^`^5 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

D>C=pc(UNd&?& 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

RycV`HoIAF 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�asJODdtzu_OIv#6hI2p< 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/|CTafd^l7ikQh#`D(cgXA;m6EHUEC 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

vn}1bO0GqJPO}p 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�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