Fixed evaluate for ov::Tensor (#11354)
* Fixed evaluate for ov::Tensor * Fixed old ops with EvaluationContext
This commit is contained in:
parent
78285f9db4
commit
3e58ccbce7
@ -38,7 +38,7 @@ bool Identity::evaluate(ov::TensorVector& outputs, const ov::TensorVector& input
|
|||||||
auto in = inputs[0];
|
auto in = inputs[0];
|
||||||
auto out = outputs[0];
|
auto out = outputs[0];
|
||||||
out.set_shape(in.get_shape());
|
out.set_shape(in.get_shape());
|
||||||
memcpy(out.data(), in.data(), in.get_size());
|
memcpy(out.data(), in.data(), in.get_byte_size());
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -743,13 +743,15 @@ bool ov::Node::evaluate(ov::TensorVector& output_values, const ov::TensorVector&
|
|||||||
bool ov::Node::evaluate(ov::TensorVector& output_values,
|
bool ov::Node::evaluate(ov::TensorVector& output_values,
|
||||||
const ov::TensorVector& input_values,
|
const ov::TensorVector& input_values,
|
||||||
const ov::EvaluationContext& evaluationContext) const {
|
const ov::EvaluationContext& evaluationContext) const {
|
||||||
|
// Call evaluate for old implementation with EvaluationContext
|
||||||
HostTensorVector output = create_tmp_tensors(output_values);
|
HostTensorVector output = create_tmp_tensors(output_values);
|
||||||
HostTensorVector input = create_tmp_tensors(input_values);
|
HostTensorVector input = create_tmp_tensors(input_values);
|
||||||
OPENVINO_SUPPRESS_DEPRECATED_START
|
OPENVINO_SUPPRESS_DEPRECATED_START
|
||||||
bool sts = evaluate(output, input, evaluationContext);
|
bool sts = evaluate(output, input, evaluationContext);
|
||||||
OPENVINO_SUPPRESS_DEPRECATED_END
|
OPENVINO_SUPPRESS_DEPRECATED_END
|
||||||
update_output_tensors(output_values, output);
|
update_output_tensors(output_values, output);
|
||||||
return sts;
|
// Call evaluate for ov::Tensor if op doesn't have evaluate with EvaluationContext
|
||||||
|
return sts ? sts : evaluate(output_values, input_values);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool ov::Node::evaluate_lower(ov::TensorVector& output_values) const {
|
bool ov::Node::evaluate_lower(ov::TensorVector& output_values) const {
|
||||||
|
@ -8,6 +8,7 @@
|
|||||||
|
|
||||||
#include "openvino/core/graph_util.hpp"
|
#include "openvino/core/graph_util.hpp"
|
||||||
#include "openvino/core/op_extension.hpp"
|
#include "openvino/core/op_extension.hpp"
|
||||||
|
#include "openvino/opsets/opset9.hpp"
|
||||||
#include "openvino/util/file_util.hpp"
|
#include "openvino/util/file_util.hpp"
|
||||||
#include "so_extension.hpp"
|
#include "so_extension.hpp"
|
||||||
|
|
||||||
@ -36,3 +37,61 @@ TEST(extension, load_extension_and_cast) {
|
|||||||
EXPECT_NE(nullptr, std::dynamic_pointer_cast<ov::BaseOpExtension>(extensions[0]));
|
EXPECT_NE(nullptr, std::dynamic_pointer_cast<ov::BaseOpExtension>(extensions[0]));
|
||||||
extensions.clear();
|
extensions.clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
namespace {
|
||||||
|
class DummyAdapter : public ov::AttributeVisitor {
|
||||||
|
public:
|
||||||
|
void on_adapter(const std::string& name, ov::ValueAccessor<void>& adapter) override {}
|
||||||
|
};
|
||||||
|
} // namespace
|
||||||
|
|
||||||
|
TEST(extension, create_model_from_extension) {
|
||||||
|
std::vector<ov::Extension::Ptr> so_extensions = ov::detail::load_extensions(get_extension_path());
|
||||||
|
ASSERT_LE(1, so_extensions.size());
|
||||||
|
std::vector<ov::Extension::Ptr> extensions;
|
||||||
|
std::vector<std::shared_ptr<void>> so;
|
||||||
|
for (const auto& ext : so_extensions) {
|
||||||
|
if (auto so_ext = std::dynamic_pointer_cast<ov::detail::SOExtension>(ext)) {
|
||||||
|
extensions.emplace_back(so_ext->extension());
|
||||||
|
so.emplace_back(so_ext->shared_object());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
so_extensions.clear();
|
||||||
|
EXPECT_LE(1, extensions.size());
|
||||||
|
auto op_extension = std::dynamic_pointer_cast<ov::BaseOpExtension>(extensions[0]);
|
||||||
|
EXPECT_NE(nullptr, op_extension);
|
||||||
|
{
|
||||||
|
// Create model to check evaluate for custom operation
|
||||||
|
std::shared_ptr<ov::Model> model;
|
||||||
|
{
|
||||||
|
auto parameter = std::make_shared<ov::opset9::Parameter>(ov::element::i32, ov::Shape{1, 2, 2, 2});
|
||||||
|
|
||||||
|
DummyAdapter visitor;
|
||||||
|
|
||||||
|
auto outputs = op_extension->create(ov::OutputVector{parameter}, visitor);
|
||||||
|
|
||||||
|
EXPECT_EQ(1, outputs.size());
|
||||||
|
EXPECT_NE(nullptr, outputs[0].get_node());
|
||||||
|
const std::string ref_name = "Identity";
|
||||||
|
EXPECT_EQ(ref_name, outputs[0].get_node()->get_type_info().name);
|
||||||
|
auto result = std::make_shared<ov::opset9::Result>(outputs[0]);
|
||||||
|
model = std::make_shared<ov::Model>(ov::ResultVector{result}, ov::ParameterVector{parameter});
|
||||||
|
}
|
||||||
|
|
||||||
|
auto fill_tensor = [](ov::Tensor& tensor) {
|
||||||
|
int32_t* data = tensor.data<int32_t>();
|
||||||
|
for (size_t i = 0; i < tensor.get_size(); i++)
|
||||||
|
data[i] = i;
|
||||||
|
};
|
||||||
|
|
||||||
|
ov::TensorVector inputs;
|
||||||
|
inputs.emplace_back(ov::Tensor(ov::element::i32, ov::Shape{1, 2, 2, 2}));
|
||||||
|
fill_tensor(*inputs.begin());
|
||||||
|
ov::TensorVector outputs;
|
||||||
|
outputs.emplace_back(ov::Tensor(ov::element::i32, ov::Shape{1, 2, 2, 2}));
|
||||||
|
EXPECT_NE(std::memcmp(inputs.begin()->data(), outputs.begin()->data(), inputs.begin()->get_byte_size()), 0);
|
||||||
|
model->evaluate(outputs, inputs);
|
||||||
|
EXPECT_EQ(std::memcmp(inputs.begin()->data(), outputs.begin()->data(), inputs.begin()->get_byte_size()), 0);
|
||||||
|
}
|
||||||
|
extensions.clear();
|
||||||
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user