You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
mindspore/tests/ut/cpp/serving/acl_session_test_common.h

193 lines
7.1 KiB

/**
* Copyright 2020 Huawei Technologies Co., Ltd
*
* 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.
*/
#ifndef MINDSPORE_ACL_SESSION_TEST_COMMON_H
#define MINDSPORE_ACL_SESSION_TEST_COMMON_H
#include "common/common_test.h"
#include "serving/core/server.h"
#include "serving/core/session.h"
#include "include/inference.h"
#include "include/infer_tensor.h"
#include "serving/core/serving_tensor.h"
#include "serving/acl/acl_session.h"
#include "serving/acl/model_process.h"
#include "serving/acl/dvpp_process.h"
#include "acl_stub.h"
class MockDeviceRunMode : public AclRunMode {
public:
aclError aclrtGetRunMode(aclrtRunMode *runMode) override {
*runMode = aclrtRunMode::ACL_DEVICE;
return ACL_ERROR_NONE;
}
};
class AclSessionTest : public testing::Test {
public:
AclSessionTest() = default;
void SetUp() override {
g_acl_data_buffer = &g_acl_data_buffer_default;
g_acl_env = &g_acl_env_default;
g_acl_dataset = &g_acl_dataset_default;
g_acl_model = &g_acl_model_default;
g_acl_model_desc = &g_acl_model_desc_default;
g_acl_device_context_stream = &g_acl_device_context_stream_default;
g_acl_memory = &g_acl_memory_default;
g_acl_dvpp_pic_desc = &g_acl_dvpp_pic_desc_default;
g_acl_dvpp_roi_config = &g_acl_dvpp_roi_config_default;
g_acl_dvpp_resize_config = &g_acl_dvpp_resize_config_default;
g_acl_dvpp_channel_desc = &g_acl_dvpp_channel_desc_default;
g_acl_dvpp_process = &g_acl_dvpp_process_default;
g_acl_run_mode = &acl_run_mode_default;
g_acl_jpeg_lib = &acl_jpeg_lib_default;
}
void TearDown() override {
EXPECT_TRUE(g_acl_data_buffer->Check());
EXPECT_TRUE(g_acl_env->Check());
EXPECT_TRUE(g_acl_dataset->Check());
EXPECT_TRUE(g_acl_model->Check());
EXPECT_TRUE(g_acl_model_desc->Check());
EXPECT_TRUE(g_acl_device_context_stream->Check());
EXPECT_TRUE(g_acl_memory->Check());
EXPECT_TRUE(g_acl_dvpp_pic_desc->Check());
EXPECT_TRUE(g_acl_dvpp_roi_config->Check());
EXPECT_TRUE(g_acl_dvpp_resize_config->Check());
EXPECT_TRUE(g_acl_dvpp_channel_desc->Check());
EXPECT_TRUE(g_acl_dvpp_process->Check());
EXPECT_TRUE(g_acl_jpeg_lib->Check());
}
AclDataBuffer g_acl_data_buffer_default;
AclEnv g_acl_env_default;
AclDataSet g_acl_dataset_default;
AclModel g_acl_model_default;
AclModelDesc g_acl_model_desc_default;
AclDeviceContextStream g_acl_device_context_stream_default;
AclMemory g_acl_memory_default;
AclDvppPicDesc g_acl_dvpp_pic_desc_default;
AclDvppRoiConfig g_acl_dvpp_roi_config_default;
AclDvppResizeConfig g_acl_dvpp_resize_config_default;
AclDvppChannelDesc g_acl_dvpp_channel_desc_default;
AclDvppProcess g_acl_dvpp_process_default;
AclRunMode acl_run_mode_default;
MockDeviceRunMode acl_device_run_mode;
AclJpegLib acl_jpeg_lib_default = AclJpegLib(0, 0);
void SetDeviceRunMode() { g_acl_run_mode = &acl_device_run_mode; }
void CreateTensor(ms_serving::Tensor &tensor, const std::vector<int64_t> &shape, ms_serving::DataType data_type,
std::size_t data_size = INT64_MAX) {
if (data_size == INT64_MAX) {
data_size = GetDataTypeSize(data_type);
for (auto item : shape) {
data_size *= item;
}
}
tensor.set_data(std::string(data_size, 0));
tensor.set_tensor_type(data_type);
auto tensor_shape = tensor.mutable_tensor_shape();
for (auto item : shape) {
tensor_shape->add_dims(item);
}
}
size_t GetDataTypeSize(ms_serving::DataType data_type) {
const std::map<ms_serving::DataType, size_t> type_size_map{
{ms_serving::DataType::MS_BOOL, sizeof(bool)}, {ms_serving::DataType::MS_INT8, sizeof(int8_t)},
{ms_serving::DataType::MS_UINT8, sizeof(uint8_t)}, {ms_serving::DataType::MS_INT16, sizeof(int16_t)},
{ms_serving::DataType::MS_UINT16, sizeof(uint16_t)}, {ms_serving::DataType::MS_INT32, sizeof(int32_t)},
{ms_serving::DataType::MS_UINT32, sizeof(uint32_t)}, {ms_serving::DataType::MS_INT64, sizeof(int64_t)},
{ms_serving::DataType::MS_UINT64, sizeof(uint64_t)}, {ms_serving::DataType::MS_FLOAT16, 2},
{ms_serving::DataType::MS_FLOAT32, sizeof(float)}, {ms_serving::DataType::MS_FLOAT64, sizeof(double)},
};
auto it = type_size_map.find(data_type);
if (it == type_size_map.end()) {
EXPECT_TRUE(false);
return 0;
}
return it->second;
}
void CheckTensorItem(const ms_serving::Tensor &tensor, const std::vector<int64_t> &expect_shape,
ms_serving::DataType expect_data_type) {
std::vector<int64_t> tensor_shape;
for (auto item : tensor.tensor_shape().dims()) {
tensor_shape.push_back(item);
}
EXPECT_EQ(expect_shape, tensor_shape);
EXPECT_EQ(expect_data_type, tensor.tensor_type());
int64_t elem_cnt = 1;
for (auto item : expect_shape) {
elem_cnt *= item;
}
auto data_size = GetDataTypeSize(expect_data_type);
EXPECT_EQ(data_size * elem_cnt, tensor.data().size());
}
};
class MockModelDesc : public AclModelDesc {
public:
MockModelDesc() {}
MockModelDesc(const aclmdlDesc &mock_model_desc) : mock_model_desc_(mock_model_desc) {}
aclmdlDesc *aclmdlCreateDesc() override {
aclmdlDesc *model_desc = AclModelDesc::aclmdlCreateDesc();
*model_desc = mock_model_desc_;
return model_desc;
}
aclmdlDesc mock_model_desc_;
};
class AddMockAclModel : public AclModel {
public:
aclError aclmdlExecute(uint32_t modelId, const aclmdlDataset *input, aclmdlDataset *output) override {
if (AclModel::aclmdlExecute(modelId, input, output) != ACL_ERROR_NONE) {
return 1;
}
if (input->data_buffers.size() != 2) {
return 1;
}
auto &input0 = input->data_buffers[0];
auto &input1 = input->data_buffers[1];
std::size_t expect_count = input0->size / sizeof(float);
if (input0->size != expect_count * sizeof(float) || input1->size != expect_count * sizeof(float)) {
return 1;
}
if (output->data_buffers.size() != 1) {
return 1;
}
auto &output0 = output->data_buffers[0];
if (output0->size != expect_count * sizeof(float)) {
return 1;
}
auto input0_data = reinterpret_cast<const float *>(input0->data);
auto input1_data = reinterpret_cast<const float *>(input1->data);
auto output0_data = reinterpret_cast<float *>(output0->data);
for (size_t i = 0; i < expect_count; i++) {
output0_data[i] = input0_data[i] + input1_data[i];
}
return ACL_ERROR_NONE;
}
aclError aclmdlExecuteAsync(uint32_t modelId, const aclmdlDataset *input, aclmdlDataset *output,
aclrtStream stream) override {
return aclmdlExecute(modelId, input, output);
}
};
#endif // MINDSPORE_ACL_SESSION_TEST_COMMON_H