Files
openvino/src/bindings/c/tests/ov_infer_request_test.cpp
T
River Liandruiqi cbbac125f8 [C API] Refine OV 2.0 C APIs for better expansibility and compatibility (#12187)
* [C API 2.0]Redifine partial shape and property wrapper

1. Use dimension object to initialize partial_shape rather than string
2. Use void* to unify property value rather than union
3. rename some C api name to strict align with C++ method.

Change-Id: I64b5c521461264dba2d23543808584632fbd6d4b

* [C API 2.0]Memory check and implement all reshape interface

1. Memory safe create and free
2. Implement all reshape interface align with C++ interface
3. rename some api to align with C++ interface

Change-Id: Ib5e4192bdbd8a11cdd7e30b1dc84881ba3f2d505

* Rename prepostprocess to strict align with C++ name

Change-Id: I7a4d0a6e835b2d6ed01cd218ac81b1b621f600bf

* [C API 2.0]redefine ov_node and ov_model interface

1. redefine ov_node and ov_model interface
2. rename some api to aligne with C++ interface
3. remove some redundant code
4. align CMakeLists.txt with OpenVINO 2.0 convention

Change-Id: I4d5e92157e7891319c9754da8e70b9c6150ae2e3

* Redefine ov_layout to support more than one char

Change-Id: I39e5389246cf3edcc2f4734d13157457773d89b8

* Add interface to get partial_shape from node

Change-Id: I8cef77db581b43d2f0a9ac48cfdc09a86e39b694

* Use unique_ptr prevent memory leaks in case of exception

Change-Id: I150b375108a3eded400bdde087ab5c858958c25f

* Put legacy C API and 2.0 C API into a library

Change-Id: I067a55a00e78b80cdede5ae7adad316ee98cabd1

* Only keep OV 2.0 C sample and move legacy C sample to legacy directory

1. Move legacy C samples to tools/legacy/c directory
2. Keep OV 2.0 C samples in samples/c directory

Change-Id: I05880d17ee7cb7eafc6853ebb5394f3969258592

* Fix format and log issues

Change-Id: I05d909b3d7046d41b807e35808a993bb09672e68

* Restore documents update

Change-Id: I82dd92081c0aa1a2d7dca7f114cf6a35131d6f92

* Change config map data be const

Change-Id: I9043859e8308c01d80794dc8280ae236947f3bbb

* Update api document

Change-Id: I35bc149bad0de17424d95f48c3027030b708e147

* Add clang enable

Change-Id: I335639c05fb5fb38e682dbb72bfaf78380c0adaf

* Fix clang issue after enable clang for ie_c_api.c

Change-Id: Idcb4dda9d66e47a169eb79a9c4fe7a7d4df838db

* split header file and c file into multiple files

Change-Id: I7c3398966809ef70d7fcb799f2d612a33b471e31

* Fix clang format issue

Change-Id: Ibd18b45537c8f3bcbb5b995c90ae28999161d54d

* Add single ov_dimension_create method

Change-Id: Icd06b50e4f4df8f7897c7c4327edb67178162544

* Remove all legacy c samples completely

Change-Id: I098360a0d9002340e8769074181f7997b43bce8f

* Update ov_property_value to replace only ptr

Change-Id: I9f5a11b4cf07e759c1998e78e2624f0a1266d9b0

* Split more header files, add static dimension api

Change-Id: I14e4fb8585fc629480c06b86bd8219e75a9682f7

* Change ov_dimensions_create to be ov_dimensions_create_dynamic

Change-Id: I50c02749cea96f12bcea702b53a89c65b289550e

* rename status and get_out_tensor

Change-Id: I762c1d0c5a069454506fe3c04283c63ddbfacf31

* Split ov_c_api_test.cpp

* Split OV2.0 CAPI tests

* move var into Setup

* Merge legacy and 2.0 C API test

* Merge InferenceEngineCAPITests into openvino_capi_test

1. put InferenceEngineCAPITests into openvino_capi_test
2. resolve some format issues

Change-Id: I47bbba6bd70a871ee063becbd80eb57919fa9fb0

* legacy api test skips clang format

Change-Id: Id54ecdba827cf98c99b92295c0a0772123098b63

* Fix clang format issue

Change-Id: I7ed510d8178971fe04a895e812c261db99d8b9f2

* Restore InferenceEngineCAPITests

Change-Id: I4d641ffb1de9ce4d20ebecf35fc036fa7bd73e55

* rename openvino_capi_test to ov_capi_test

Change-Id: I6b6fe0cdb89aab7210abb17f32dbfdcdce72ba25

* unify list size name and refine ov_core_version_t

Change-Id: I137fc6d990c7b07f597ee94fa3b98d07ae843cb6

* align header file path to be openvino/c/openvino.h

Change-Id: I1a4552e1d558098af704942fe45488b0d6d53a90

* Fix path issue

Change-Id: I84d425d25e3b08c1516cbcc842fb9cb75574bf17

* move ov_color_format and remove opencv depenency

Change-Id: I486145f9e92e8bbf2e937d3572334aa9f0e68841

* Resolve some memory allocation error handling issues and read model with empty weight issue

Change-Id: Icd8e3b6de9741147993fa215a0c7cfd7debd5500

* Add GPU test cases

Change-Id: I13324ef019b5b1af79259ca932a36a0cec792c27

* Fix clang issue

Change-Id: I9bb4c47de301d142b5e2a77a39f667689ad9fe38

* Resolve CI test failure

Change-Id: Ia327d5edab19d8dd44ac369670f190d5c57aca79

* Redefine ov_shape and add default ov_core_create

Change-Id: I3e47d607f8aad65cb99cdddacaecf7bf34b1361b

* Remove some unnecessary api of node

Remove the unnecessary node api:
     ov_node_get_any_name(ov_output_const_node_t* node, char** tensor_name)
     ov_node_get_element_type(ov_output_const_node_t* node, ov_element_type_e* tensor_type)

Change-Id: I80a3243676800263a9e56afa3cfffce7b4bd2ae7

* Rename reshape api

ov_model_reshape should be common case which allow to reshape any models with different number of input.

Change-Id: I26bafeeb8a3dda7cd5164cda15fdb338db8668cb

* Rename ov_node api

Change-Id: I03114ecb6de5c46b6d02c909b6f6fb6c8bfd5cba

* Remove subfolder out of source code

Change-Id: Ib033ae7712cc0460d6fc21a0f89818381ae503c0

* apply absolute path for all header files

Change-Id: I8024c897d424b407025e21460ed4b62829b853d2

* Fix CI issue ov_capi_test failed to find libgna

Change-Id: I166e79a818498c6721fe956f43873f36d9ae1e07

* Resolve build issue to align with PR12214

Change-Id: I9e6094db213b431ee1b46e0d64199131db33bb36

Co-authored-by: ruiqi <ruiqi.yang@intel.com>
2022-08-14 19:51:34 +04:00

339 lines
12 KiB
C++

// Copyright (C) 2018-2022 Intel Corporation
// SPDX-License-Identifier: Apache-2.0
//
#include <mutex>
#include "ov_test.hpp"
void get_tensor_info(ov_model_t* model,
bool input,
size_t idx,
char** name,
ov_shape_t* shape,
ov_element_type_e* type) {
ov_output_node_list_t output_nodes;
output_nodes.size = 0;
output_nodes.output_nodes = nullptr;
if (input) {
OV_EXPECT_OK(ov_model_inputs(model, &output_nodes));
} else {
OV_EXPECT_OK(ov_model_outputs(model, &output_nodes));
}
EXPECT_NE(nullptr, output_nodes.output_nodes);
EXPECT_NE(0, output_nodes.size);
OV_EXPECT_OK(ov_node_list_get_any_name_by_index(&output_nodes, idx, name));
EXPECT_NE(nullptr, *name);
OV_EXPECT_OK(ov_node_list_get_shape_by_index(&output_nodes, idx, shape));
OV_EXPECT_OK(ov_node_list_get_element_type_by_index(&output_nodes, idx, type));
ov_partial_shape_t* p_shape = nullptr;
OV_EXPECT_OK(ov_node_list_get_partial_shape_by_index(&output_nodes, idx, &p_shape));
ov_partial_shape_free(p_shape);
ov_output_node_list_free(&output_nodes);
}
class ov_infer_request : public ::testing::TestWithParam<std::string> {
protected:
void SetUp() override {
auto device_name = GetParam();
core = nullptr;
OV_ASSERT_OK(ov_core_create(&core));
ASSERT_NE(nullptr, core);
model = nullptr;
OV_EXPECT_OK(ov_core_read_model(core, xml, bin, &model));
EXPECT_NE(nullptr, model);
in_tensor_name = nullptr;
ov_shape_t tensor_shape = {0, nullptr};
ov_element_type_e tensor_type;
get_tensor_info(model, true, 0, &in_tensor_name, &tensor_shape, &tensor_type);
input_tensor = nullptr;
output_tensor = nullptr;
OV_EXPECT_OK(ov_tensor_create(tensor_type, tensor_shape, &input_tensor));
EXPECT_NE(nullptr, input_tensor);
compiled_model = nullptr;
OV_EXPECT_OK(ov_core_compile_model(core, model, device_name.c_str(), &compiled_model, nullptr));
EXPECT_NE(nullptr, compiled_model);
infer_request = nullptr;
OV_EXPECT_OK(ov_compiled_model_create_infer_request(compiled_model, &infer_request));
EXPECT_NE(nullptr, infer_request);
ov_shape_deinit(&tensor_shape);
}
void TearDown() override {
ov_tensor_free(input_tensor);
ov_tensor_free(output_tensor);
ov_free(in_tensor_name);
ov_infer_request_free(infer_request);
ov_compiled_model_free(compiled_model);
ov_model_free(model);
ov_core_free(core);
}
public:
ov_core_t* core;
ov_model_t* model;
ov_compiled_model_t* compiled_model;
ov_infer_request_t* infer_request;
char* in_tensor_name;
ov_tensor_t* input_tensor;
ov_tensor_t* output_tensor;
static std::mutex m;
static bool ready;
static std::condition_variable condVar;
};
bool ov_infer_request::ready = false;
std::mutex ov_infer_request::m;
std::condition_variable ov_infer_request::condVar;
class ov_infer_request_ppp : public ::testing::TestWithParam<std::string> {
protected:
void SetUp() override {
auto device_name = GetParam();
output_tensor = nullptr;
core = nullptr;
OV_ASSERT_OK(ov_core_create(&core));
ASSERT_NE(nullptr, core);
model = nullptr;
OV_EXPECT_OK(ov_core_read_model(core, xml, bin, &model));
EXPECT_NE(nullptr, model);
preprocess = nullptr;
OV_EXPECT_OK(ov_preprocess_prepostprocessor_create(model, &preprocess));
EXPECT_NE(nullptr, preprocess);
input_info = nullptr;
OV_ASSERT_OK(ov_preprocess_prepostprocessor_input_by_index(preprocess, 0, &input_info));
EXPECT_NE(nullptr, input_info);
input_tensor_info = nullptr;
OV_EXPECT_OK(ov_preprocess_inputinfo_tensor(input_info, &input_tensor_info));
EXPECT_NE(nullptr, input_tensor_info);
ov_shape_t shape = {0, nullptr};
OV_ASSERT_OK(ov_shape_init(&shape, 4));
shape.dims[0] = 1;
shape.dims[1] = 224;
shape.dims[2] = 224;
shape.dims[3] = 3;
ov_element_type_e type = U8;
OV_ASSERT_OK(ov_tensor_create(type, shape, &input_tensor));
OV_ASSERT_OK(ov_preprocess_inputtensorinfo_set_from(input_tensor_info, input_tensor));
OV_ASSERT_OK(ov_shape_deinit(&shape));
const char* layout_desc = "NHWC";
ov_layout_t* layout = nullptr;
OV_ASSERT_OK(ov_layout_create(&layout, layout_desc));
OV_ASSERT_OK(ov_preprocess_inputtensorinfo_set_layout(input_tensor_info, layout));
ov_layout_free(layout);
input_process = nullptr;
OV_ASSERT_OK(ov_preprocess_inputinfo_preprocess(input_info, &input_process));
ASSERT_NE(nullptr, input_process);
OV_ASSERT_OK(
ov_preprocess_preprocesssteps_resize(input_process, ov_preprocess_resizealgorithm_e::RESIZE_LINEAR));
input_model = nullptr;
OV_ASSERT_OK(ov_preprocess_inputinfo_model(input_info, &input_model));
ASSERT_NE(nullptr, input_model);
ov_layout_t* model_layout = nullptr;
const char* model_layout_desc = "NCHW";
OV_ASSERT_OK(ov_layout_create(&model_layout, model_layout_desc));
OV_ASSERT_OK(ov_preprocess_inputmodelinfo_set_layout(input_model, model_layout));
ov_layout_free(model_layout);
OV_ASSERT_OK(ov_preprocess_prepostprocessor_build(preprocess, &model));
EXPECT_NE(nullptr, model);
compiled_model = nullptr;
OV_EXPECT_OK(ov_core_compile_model(core, model, device_name.c_str(), &compiled_model, nullptr));
EXPECT_NE(nullptr, compiled_model);
infer_request = nullptr;
OV_EXPECT_OK(ov_compiled_model_create_infer_request(compiled_model, &infer_request));
EXPECT_NE(nullptr, infer_request);
}
void TearDown() override {
ov_tensor_free(output_tensor);
ov_tensor_free(input_tensor);
ov_infer_request_free(infer_request);
ov_compiled_model_free(compiled_model);
ov_preprocess_inputmodelinfo_free(input_model);
ov_preprocess_preprocesssteps_free(input_process);
ov_preprocess_inputtensorinfo_free(input_tensor_info);
ov_preprocess_inputinfo_free(input_info);
ov_preprocess_prepostprocessor_free(preprocess);
ov_model_free(model);
ov_core_free(core);
}
public:
ov_core_t* core;
ov_model_t* model;
ov_compiled_model_t* compiled_model;
ov_infer_request_t* infer_request;
ov_tensor_t* input_tensor;
ov_tensor_t* output_tensor;
ov_preprocess_prepostprocessor_t* preprocess;
ov_preprocess_inputinfo_t* input_info;
ov_preprocess_inputtensorinfo_t* input_tensor_info;
ov_preprocess_preprocesssteps_t* input_process;
ov_preprocess_inputmodelinfo_t* input_model;
};
INSTANTIATE_TEST_SUITE_P(device_name, ov_infer_request, ::testing::Values("CPU"));
INSTANTIATE_TEST_SUITE_P(device_name, ov_infer_request_ppp, ::testing::Values("CPU"));
TEST_P(ov_infer_request, set_tensor) {
OV_EXPECT_OK(ov_infer_request_set_tensor(infer_request, in_tensor_name, input_tensor));
}
TEST_P(ov_infer_request, set_input_tensor) {
OV_EXPECT_OK(ov_infer_request_set_input_tensor(infer_request, 0, input_tensor));
}
TEST_P(ov_infer_request, set_tensor_error_handling) {
OV_EXPECT_NOT_OK(ov_infer_request_set_tensor(nullptr, in_tensor_name, input_tensor));
OV_EXPECT_NOT_OK(ov_infer_request_set_tensor(infer_request, nullptr, input_tensor));
OV_EXPECT_NOT_OK(ov_infer_request_set_tensor(infer_request, in_tensor_name, nullptr));
}
TEST_P(ov_infer_request, get_tensor) {
OV_EXPECT_OK(ov_infer_request_get_tensor(infer_request, in_tensor_name, &input_tensor));
EXPECT_NE(nullptr, input_tensor);
}
TEST_P(ov_infer_request, get_out_tensor) {
OV_EXPECT_OK(ov_infer_request_get_output_tensor(infer_request, 0, &output_tensor));
}
TEST_P(ov_infer_request, get_tensor_error_handling) {
OV_EXPECT_NOT_OK(ov_infer_request_get_tensor(nullptr, in_tensor_name, &input_tensor));
OV_EXPECT_NOT_OK(ov_infer_request_get_tensor(infer_request, nullptr, &input_tensor));
OV_EXPECT_NOT_OK(ov_infer_request_get_tensor(infer_request, in_tensor_name, nullptr));
}
TEST_P(ov_infer_request, infer) {
OV_EXPECT_OK(ov_infer_request_set_tensor(infer_request, in_tensor_name, input_tensor));
OV_EXPECT_OK(ov_infer_request_infer(infer_request));
char* out_tensor_name = nullptr;
ov_shape_t tensor_shape = {0, nullptr};
ov_element_type_e tensor_type;
get_tensor_info(model, false, 0, &out_tensor_name, &tensor_shape, &tensor_type);
OV_EXPECT_OK(ov_infer_request_get_tensor(infer_request, out_tensor_name, &output_tensor));
EXPECT_NE(nullptr, output_tensor);
ov_shape_deinit(&tensor_shape);
ov_free(out_tensor_name);
}
TEST_P(ov_infer_request, cancel) {
OV_EXPECT_OK(ov_infer_request_set_tensor(infer_request, in_tensor_name, input_tensor));
OV_EXPECT_OK(ov_infer_request_cancel(infer_request));
}
TEST_P(ov_infer_request_ppp, infer_ppp) {
OV_EXPECT_OK(ov_infer_request_set_input_tensor(infer_request, 0, input_tensor));
OV_EXPECT_OK(ov_infer_request_infer(infer_request));
OV_EXPECT_OK(ov_infer_request_get_output_tensor(infer_request, 0, &output_tensor));
EXPECT_NE(nullptr, output_tensor);
}
TEST(ov_infer_request, infer_error_handling) {
OV_EXPECT_NOT_OK(ov_infer_request_infer(nullptr));
}
TEST_P(ov_infer_request, infer_async) {
OV_EXPECT_OK(ov_infer_request_set_input_tensor(infer_request, 0, input_tensor));
OV_EXPECT_OK(ov_infer_request_start_async(infer_request));
if (!HasFatalFailure()) {
OV_EXPECT_OK(ov_infer_request_wait(infer_request));
OV_EXPECT_OK(ov_infer_request_get_output_tensor(infer_request, 0, &output_tensor));
EXPECT_NE(nullptr, output_tensor);
}
}
TEST_P(ov_infer_request_ppp, infer_async_ppp) {
OV_EXPECT_OK(ov_infer_request_set_input_tensor(infer_request, 0, input_tensor));
OV_EXPECT_OK(ov_infer_request_start_async(infer_request));
if (!HasFatalFailure()) {
OV_EXPECT_OK(ov_infer_request_wait(infer_request));
OV_EXPECT_OK(ov_infer_request_get_output_tensor(infer_request, 0, &output_tensor));
EXPECT_NE(nullptr, output_tensor);
}
}
void infer_request_callback(void* args) {
ov_infer_request_t* infer_request = (ov_infer_request_t*)args;
ov_tensor_t* out_tensor = nullptr;
OV_EXPECT_OK(ov_infer_request_get_output_tensor(infer_request, 0, &out_tensor));
EXPECT_NE(nullptr, out_tensor);
ov_tensor_free(out_tensor);
std::lock_guard<std::mutex> lock(ov_infer_request::m);
ov_infer_request::ready = true;
ov_infer_request::condVar.notify_one();
}
TEST_P(ov_infer_request, infer_request_set_callback) {
OV_EXPECT_OK(ov_infer_request_set_input_tensor(infer_request, 0, input_tensor));
ov_callback_t callback;
callback.callback_func = infer_request_callback;
callback.args = infer_request;
OV_EXPECT_OK(ov_infer_request_set_callback(infer_request, &callback));
OV_EXPECT_OK(ov_infer_request_start_async(infer_request));
if (!HasFatalFailure()) {
std::unique_lock<std::mutex> lock(ov_infer_request::m);
ov_infer_request::condVar.wait(lock, [] {
return ov_infer_request::ready;
});
}
}
TEST_P(ov_infer_request, get_profiling_info) {
auto device_name = GetParam();
OV_EXPECT_OK(ov_infer_request_set_tensor(infer_request, in_tensor_name, input_tensor));
OV_EXPECT_OK(ov_infer_request_infer(infer_request));
OV_EXPECT_OK(ov_infer_request_get_output_tensor(infer_request, 0, &output_tensor));
EXPECT_NE(nullptr, output_tensor);
ov_profiling_info_list_t profiling_infos;
profiling_infos.size = 0;
profiling_infos.profiling_infos = nullptr;
OV_EXPECT_OK(ov_infer_request_get_profiling_info(infer_request, &profiling_infos));
EXPECT_NE(0, profiling_infos.size);
EXPECT_NE(nullptr, profiling_infos.profiling_infos);
ov_profiling_info_list_free(&profiling_infos);
}