218 lines
6.7 KiB
C++
218 lines
6.7 KiB
C++
/**
|
|
* 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_INCLUDE_INFER_TENSOR_H_
|
|
#define MINDSPORE_INCLUDE_INFER_TENSOR_H_
|
|
|
|
#include <utility>
|
|
#include <vector>
|
|
#include <memory>
|
|
#include <numeric>
|
|
#include <map>
|
|
#include <functional>
|
|
|
|
#include "securec/include/securec.h"
|
|
#include "include/infer_log.h"
|
|
|
|
namespace mindspore {
|
|
#define MS_API __attribute__((visibility("default")))
|
|
namespace inference {
|
|
enum DataType {
|
|
kMSI_Unknown = 0,
|
|
kMSI_Bool = 1,
|
|
kMSI_Int8 = 2,
|
|
kMSI_Int16 = 3,
|
|
kMSI_Int32 = 4,
|
|
kMSI_Int64 = 5,
|
|
kMSI_Uint8 = 6,
|
|
kMSI_Uint16 = 7,
|
|
kMSI_Uint32 = 8,
|
|
kMSI_Uint64 = 9,
|
|
kMSI_Float16 = 10,
|
|
kMSI_Float32 = 11,
|
|
kMSI_Float64 = 12,
|
|
};
|
|
|
|
class InferTensorBase {
|
|
public:
|
|
InferTensorBase() = default;
|
|
virtual ~InferTensorBase() = default;
|
|
|
|
virtual DataType data_type() const = 0;
|
|
virtual void set_data_type(DataType type) = 0;
|
|
virtual std::vector<int64_t> shape() const = 0;
|
|
virtual void set_shape(const std::vector<int64_t> &shape) = 0;
|
|
virtual const void *data() const = 0;
|
|
virtual size_t data_size() const = 0;
|
|
virtual bool resize_data(size_t data_len) = 0;
|
|
virtual void *mutable_data() = 0;
|
|
|
|
bool set_data(const void *data, size_t data_len) {
|
|
resize_data(data_len);
|
|
if (mutable_data() == nullptr) {
|
|
MSI_LOG_ERROR << "set data failed, data len " << data_len;
|
|
return false;
|
|
}
|
|
if (data_size() != data_len) {
|
|
MSI_LOG_ERROR << "set data failed, tensor current data size " << data_size() << " not match data len "
|
|
<< data_len;
|
|
return false;
|
|
}
|
|
if (data_len == 0) {
|
|
return true;
|
|
}
|
|
auto ret = memcpy_s(mutable_data(), data_size(), data, data_len);
|
|
if (ret != 0) {
|
|
MSI_LOG_ERROR << "Set data memcpy_s failed";
|
|
return false;
|
|
}
|
|
return true;
|
|
}
|
|
|
|
int64_t ElementNum() const {
|
|
std::vector<int64_t> shapex = shape();
|
|
return std::accumulate(shapex.begin(), shapex.end(), 1LL, std::multiplies<int64_t>());
|
|
}
|
|
|
|
int GetTypeSize(DataType type) const {
|
|
const std::map<DataType, size_t> type_size_map{
|
|
{kMSI_Bool, sizeof(bool)}, {kMSI_Float64, sizeof(double)}, {kMSI_Int8, sizeof(int8_t)},
|
|
{kMSI_Uint8, sizeof(uint8_t)}, {kMSI_Int16, sizeof(int16_t)}, {kMSI_Uint16, sizeof(uint16_t)},
|
|
{kMSI_Int32, sizeof(int32_t)}, {kMSI_Uint32, sizeof(uint32_t)}, {kMSI_Int64, sizeof(int64_t)},
|
|
{kMSI_Uint64, sizeof(uint64_t)}, {kMSI_Float16, sizeof(uint16_t)}, {kMSI_Float32, sizeof(float)},
|
|
};
|
|
auto it = type_size_map.find(type);
|
|
if (it != type_size_map.end()) {
|
|
return it->second;
|
|
}
|
|
return 0;
|
|
}
|
|
};
|
|
|
|
class InferTensor : public InferTensorBase {
|
|
public:
|
|
DataType type_;
|
|
std::vector<int64_t> shape_;
|
|
std::vector<uint8_t> data_;
|
|
|
|
public:
|
|
InferTensor() = default;
|
|
~InferTensor() = default;
|
|
InferTensor(DataType type, std::vector<int64_t> shape, const void *data, size_t data_len) {
|
|
set_data_type(type);
|
|
set_shape(shape);
|
|
set_data(data, data_len);
|
|
}
|
|
|
|
void set_data_type(DataType type) override { type_ = type; }
|
|
DataType data_type() const override { return type_; }
|
|
|
|
void set_shape(const std::vector<int64_t> &shape) override { shape_ = shape; }
|
|
std::vector<int64_t> shape() const override { return shape_; }
|
|
|
|
const void *data() const override { return data_.data(); }
|
|
size_t data_size() const override { return data_.size(); }
|
|
|
|
bool resize_data(size_t data_len) override {
|
|
data_.resize(data_len);
|
|
return true;
|
|
}
|
|
void *mutable_data() override { return data_.data(); }
|
|
};
|
|
|
|
class InferImagesBase {
|
|
public:
|
|
InferImagesBase() = default;
|
|
virtual ~InferImagesBase() = default;
|
|
virtual size_t batch_size() const = 0;
|
|
virtual bool get(size_t index, const void *&pic_buffer, uint32_t &pic_size) const = 0;
|
|
virtual size_t input_index() const = 0; // the index of images as input in model
|
|
};
|
|
|
|
class RequestBase {
|
|
public:
|
|
RequestBase() = default;
|
|
virtual ~RequestBase() = default;
|
|
virtual size_t size() const = 0;
|
|
virtual const InferTensorBase *operator[](size_t index) const = 0;
|
|
};
|
|
|
|
class ImagesRequestBase {
|
|
public:
|
|
ImagesRequestBase() = default;
|
|
virtual ~ImagesRequestBase() = default;
|
|
virtual size_t size() const = 0;
|
|
virtual const InferImagesBase *operator[](size_t index) const = 0;
|
|
};
|
|
|
|
class ReplyBase {
|
|
public:
|
|
ReplyBase() = default;
|
|
virtual ~ReplyBase() = default;
|
|
virtual size_t size() const = 0;
|
|
virtual InferTensorBase *operator[](size_t index) = 0;
|
|
virtual const InferTensorBase *operator[](size_t index) const = 0;
|
|
virtual InferTensorBase *add() = 0;
|
|
virtual void clear() = 0;
|
|
};
|
|
|
|
class VectorInferTensorWrapReply : public ReplyBase {
|
|
public:
|
|
explicit VectorInferTensorWrapReply(std::vector<InferTensor> &tensor_list) : tensor_list_(tensor_list) {}
|
|
~VectorInferTensorWrapReply() = default;
|
|
|
|
size_t size() const { return tensor_list_.size(); }
|
|
InferTensorBase *operator[](size_t index) {
|
|
if (index >= tensor_list_.size()) {
|
|
MSI_LOG_ERROR << "visit invalid index " << index << " total size " << tensor_list_.size();
|
|
return nullptr;
|
|
}
|
|
return &(tensor_list_[index]);
|
|
}
|
|
const InferTensorBase *operator[](size_t index) const {
|
|
if (index >= tensor_list_.size()) {
|
|
MSI_LOG_ERROR << "visit invalid index " << index << " total size " << tensor_list_.size();
|
|
return nullptr;
|
|
}
|
|
return &(tensor_list_[index]);
|
|
}
|
|
InferTensorBase *add() {
|
|
tensor_list_.push_back(InferTensor());
|
|
return &(tensor_list_.back());
|
|
}
|
|
void clear() { tensor_list_.clear(); }
|
|
std::vector<InferTensor> &tensor_list_;
|
|
};
|
|
|
|
class VectorInferTensorWrapRequest : public RequestBase {
|
|
public:
|
|
explicit VectorInferTensorWrapRequest(const std::vector<InferTensor> &tensor_list) : tensor_list_(tensor_list) {}
|
|
~VectorInferTensorWrapRequest() = default;
|
|
|
|
size_t size() const { return tensor_list_.size(); }
|
|
const InferTensorBase *operator[](size_t index) const {
|
|
if (index >= tensor_list_.size()) {
|
|
MSI_LOG_ERROR << "visit invalid index " << index << " total size " << tensor_list_.size();
|
|
return nullptr;
|
|
}
|
|
return &(tensor_list_[index]);
|
|
}
|
|
const std::vector<InferTensor> &tensor_list_;
|
|
};
|
|
} // namespace inference
|
|
} // namespace mindspore
|
|
#endif // MINDSPORE_INCLUDE_INFER_TENSOR_H_
|