Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
56 commits
Select commit Hold shift + click to select a range
395ff23
[GPU] Enable dynamic quantization for MXFP8 & regular FP8 dtypes
tkrupa-intel Apr 13, 2026
fb6ff10
Code formatting
tkrupa-intel Apr 13, 2026
2556a2b
Remove unnecessary matcher macro
tkrupa-intel Apr 13, 2026
15807e8
Apply review suggestions
tkrupa-intel Apr 14, 2026
a926796
Merge branch 'master' into tkrupa/mxfp8
tkrupa-intel Apr 14, 2026
6e5833b
Fix potential memory issue
tkrupa-intel Apr 15, 2026
2d59ee8
CI out of resources issue test
tkrupa-intel Apr 21, 2026
60db5d3
Revert "CI out of resources issue test"
tkrupa-intel Apr 22, 2026
3befb0e
CI out of resources issue test - nested node search
tkrupa-intel Apr 22, 2026
355b0fa
Revert "CI out of resources issue test - nested node search"
tkrupa-intel Apr 24, 2026
c953fce
Bring back block write macro
tkrupa-intel Apr 24, 2026
e22b817
Revert "Bring back block write macro"
tkrupa-intel Apr 27, 2026
a4a70e2
Inline expensive wrapper functions
tkrupa-intel Apr 27, 2026
71777fd
Get rid of expensive convert wrappers for non-fp dtypes
tkrupa-intel Apr 28, 2026
5312577
Remove unnecessary preprocessor defines
tkrupa-intel Apr 29, 2026
5295b31
Revert "Remove unnecessary preprocessor defines"
tkrupa-intel Apr 29, 2026
d776d23
Test block write macro impact
tkrupa-intel May 4, 2026
35ceecd
Correct logical mistake
tkrupa-intel May 4, 2026
db90ea6
Revert "Test block write macro impact"
tkrupa-intel May 4, 2026
3dea2a7
Check utils file include
tkrupa-intel May 4, 2026
2f049ca
Retry removing extra defines
tkrupa-intel May 4, 2026
90660f0
Revert "Check utils file include"
tkrupa-intel May 5, 2026
2f62b62
Revert "Retry removing extra defines"
tkrupa-intel May 5, 2026
c2213f5
Revert pre_post_process.cpp changes
tkrupa-intel May 18, 2026
893c827
Merge branch 'master' into tkrupa/mxfp8
tkrupa-intel May 18, 2026
c20a01c
Check if execution of new tests is connected to the issue
tkrupa-intel May 19, 2026
8a5bf36
For real now
tkrupa-intel May 20, 2026
e57ea38
Frfr
tkrupa-intel May 20, 2026
355c1d2
Merge branch 'master' into tkrupa/mxfp8
tkrupa-intel May 21, 2026
e50d868
Revert "Revert pre_post_process.cpp changes"
tkrupa-intel May 21, 2026
3a9f2fe
Bring back tests
tkrupa-intel May 22, 2026
2ab0ac1
Merge branch 'master' into tkrupa/mxfp8
tkrupa-intel Jun 2, 2026
3c8e92b
Apply review suggestions
tkrupa-intel Jun 9, 2026
6e847c1
Merge remote-tracking branch 'main/master' into HEAD
tkrupa-intel Jun 9, 2026
360cc3e
Add missing test modifications
tkrupa-intel Jun 9, 2026
89b7d28
Double check that it's not unit tests' fault
tkrupa-intel Jun 11, 2026
3d2c6a9
Comment out troubleshooting part 1
tkrupa-intel Jun 12, 2026
64fdb2c
Merge remote-tracking branch 'main/master' into HEAD
tkrupa-intel Jun 15, 2026
619c0d6
Bring back cpp part
tkrupa-intel Jun 16, 2026
721ba4f
Bring back reorder code and f8_utils
tkrupa-intel Jun 16, 2026
e7c3157
Remove just reorder and leave f8_utils
tkrupa-intel Jun 18, 2026
a7bed09
Merge branch 'master' into tkrupa/mxfp8
tkrupa-intel Jun 18, 2026
a771d04
Bring back everything and move f8_utils out of batch headers
tkrupa-intel Jun 18, 2026
451790c
Remove unnecessary changes from transformations_pipeline
tkrupa-intel Jun 19, 2026
de0dfc7
Add more tests
tkrupa-intel Jun 19, 2026
fe59426
Remove unnecessary common.cl code
tkrupa-intel Jun 19, 2026
dbb2fd4
Merge branch 'master' into tkrupa/mxfp8
tkrupa-intel Jun 19, 2026
f0006bb
Merge correction
tkrupa-intel Jun 19, 2026
59dba85
Code style & copyright
tkrupa-intel Jun 19, 2026
712e6e0
Implement review suggestions
tkrupa-intel Jun 23, 2026
6af3fa7
Move detection of guard patterns to a common function
tkrupa-intel Jun 24, 2026
22758b1
Apply review suggestions
tkrupa-intel Jun 24, 2026
abf2d23
Code style
tkrupa-intel Jun 24, 2026
8b7ac91
Apply review suggestions
tkrupa-intel Jun 25, 2026
c475d81
Remove unnecessary check
tkrupa-intel Jun 25, 2026
850ea41
Fix zp handling
tkrupa-intel Jun 25, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@
#include "openvino/pass/constant_folding.hpp"
#include "openvino/pass/manager.hpp"
#include "openvino/pass/pattern/op/wrap_type.hpp"
#include "openvino/pass/pattern/op/pattern.hpp"
#include "openvino/util/log.hpp"
#include "ov_ops/type_relaxed.hpp"
#include "transformations/common_optimizations/lin_op_sequence_fusion.hpp"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -56,19 +56,26 @@ namespace decomposition {
/// \param output_shape Optional shape constant. When provided a Reshape with
/// special_zero=false is appended after the Multiply
/// (skipped if the Multiply output already has that shape).
ov::Output<ov::Node> TRANSFORMATIONS_API low_precision_dequantize(ov::pass::NodeRegistry& reg,
const ov::Output<ov::Node>& x,
const ov::Output<ov::Node>& scale,
const ov::Output<ov::Node>& zero_point = {},
const ov::Output<ov::Node>& output_shape = {});
/// \param scale_decompression_precision Optional element type for the Convert node
/// that converts the quantized scale and zp to the output element type. If not provided, the
/// Convert node is omitted and the scale is used as-is.
ov::Output<ov::Node> TRANSFORMATIONS_API
low_precision_dequantize(ov::pass::NodeRegistry& reg,
const ov::Output<ov::Node>& x,
const ov::Output<ov::Node>& scale,
const ov::Output<ov::Node>& zero_point = {},
const ov::Output<ov::Node>& output_shape = {},
const ov::element::Type& decompression_precision = ov::element::dynamic);

/// \brief Convenience overload for callers that do not need access to the
/// intermediate nodes. Internally allocates a NodeRegistry and
/// forwards to the registry-based overload.
ov::Output<ov::Node> TRANSFORMATIONS_API low_precision_dequantize(const ov::Output<ov::Node>& x,
const ov::Output<ov::Node>& scale,
const ov::Output<ov::Node>& zero_point = {},
const ov::Output<ov::Node>& output_shape = {});
ov::Output<ov::Node> TRANSFORMATIONS_API
low_precision_dequantize(const ov::Output<ov::Node>& x,
const ov::Output<ov::Node>& scale,
const ov::Output<ov::Node>& zero_point = {},
const ov::Output<ov::Node>& output_shape = {},
const ov::element::Type& decompression_precision = ov::element::dynamic);

} // namespace decomposition
} // namespace ov
28 changes: 28 additions & 0 deletions src/common/transformations/include/ov_ops/dynamic_quantize.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@

#pragma once

#include "openvino/core/attribute_adapter.hpp"
#include "openvino/op/op.hpp"
#include "transformations_visibility.hpp"

Expand Down Expand Up @@ -56,6 +57,8 @@ class TRANSFORMATIONS_API DynamicQuantize : public ov::op::Op {

std::shared_ptr<Node> clone_with_new_inputs(const ov::OutputVector& new_args) const override;

bool visit_attributes(AttributeVisitor& visitor) override;

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why is required?

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please see #35283 (comment)

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

In addition, it is needed for correct model caching work: visit_attributes is used during ov::Model serialization/deserialization

@praasz praasz Jun 26, 2026

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

But serialization cannot just be added if attribute is not officially supported
If it was not serialized before it was not official Added in IR and must be reverted

If this change means the attribute is adde in IR it must be reverted.
Or it is used for internal serialization only?


const Attributes& get_attrs() const {
return m_attrs;
}
Expand Down Expand Up @@ -89,4 +92,29 @@ class TRANSFORMATIONS_API DynamicQuantize : public ov::op::Op {

} // namespace internal
} // namespace op

std::ostream& operator<<(std::ostream& s, const ov::op::internal::DynamicQuantize::QuantizationType& quantization_type);
std::ostream& operator<<(std::ostream& s,
const ov::op::internal::DynamicQuantize::OutputStorageType& output_storage_type);

template <>
class OPENVINO_API AttributeAdapter<ov::op::internal::DynamicQuantize::QuantizationType>
: public EnumAttributeAdapterBase<ov::op::internal::DynamicQuantize::QuantizationType> {
public:
AttributeAdapter(ov::op::internal::DynamicQuantize::QuantizationType& value)
: EnumAttributeAdapterBase<ov::op::internal::DynamicQuantize::QuantizationType>(value) {}

OPENVINO_RTTI("AttributeAdapter<ov::op::internal::DynamicQuantize::QuantizationType>");
};

template <>
class OPENVINO_API AttributeAdapter<ov::op::internal::DynamicQuantize::OutputStorageType>
: public EnumAttributeAdapterBase<ov::op::internal::DynamicQuantize::OutputStorageType> {
public:
AttributeAdapter(ov::op::internal::DynamicQuantize::OutputStorageType& value)
: EnumAttributeAdapterBase<ov::op::internal::DynamicQuantize::OutputStorageType>(value) {}

OPENVINO_RTTI("AttributeAdapter<ov::op::internal::DynamicQuantize::OutputStorageType>");
};

} // namespace ov
Original file line number Diff line number Diff line change
Expand Up @@ -43,12 +43,14 @@ ov::Output<ov::Node> low_precision_dequantize(ov::pass::NodeRegistry& reg,
const ov::Output<ov::Node>& x,
const ov::Output<ov::Node>& scale,
const ov::Output<ov::Node>& zero_point,
const ov::Output<ov::Node>& output_shape) {
const ov::Output<ov::Node>& output_shape,
const ov::element::Type& decompression_precision) {
// Decomposition shape (matches ov::pass::MarkDequantization):
// Multiply(Subtract(Convert(x), zp), scale) [-> Reshape]
// or, when zero_point is empty:
// Multiply(Convert(x), scale) [-> Reshape]
const auto& dst_type = scale.get_element_type();
const auto& dst_type =
decompression_precision == ov::element::dynamic ? scale.get_element_type() : decompression_precision;
ov::Output<ov::Node> result = reg.make<ov::op::v0::Convert>(x, dst_type);

if (zero_point.get_node_shared_ptr()) {
Expand All @@ -59,7 +61,11 @@ ov::Output<ov::Node> low_precision_dequantize(ov::pass::NodeRegistry& reg,
result = reg.make<ov::op::v1::Subtract>(result, zp);
}

result = reg.make<ov::op::v1::Multiply>(result, scale);
ov::Output<ov::Node> scale_convert = scale;
if (scale.get_element_type() != dst_type) {
scale_convert = reg.make<ov::op::v0::Convert>(scale, dst_type);
}
result = reg.make<ov::op::v1::Multiply>(result, scale_convert);

if (output_shape.get_node_shared_ptr() && !reshape_is_noop(result, output_shape)) {
result = reg.make<ov::op::v1::Reshape>(result, output_shape, /*special_zero=*/false);
Expand All @@ -71,9 +77,10 @@ ov::Output<ov::Node> low_precision_dequantize(ov::pass::NodeRegistry& reg,
ov::Output<ov::Node> low_precision_dequantize(const ov::Output<ov::Node>& x,
const ov::Output<ov::Node>& scale,
const ov::Output<ov::Node>& zero_point,
const ov::Output<ov::Node>& output_shape) {
const ov::Output<ov::Node>& output_shape,
const ov::element::Type& decompression_precision) {
ov::pass::NodeRegistry reg;
return low_precision_dequantize(reg, x, scale, zero_point, output_shape);
return low_precision_dequantize(reg, x, scale, zero_point, output_shape, decompression_precision);
}

} // namespace decomposition
Expand Down
50 changes: 50 additions & 0 deletions src/common/transformations/src/ov_ops/dynamic_quantize.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@

#include "ov_ops/dynamic_quantize.hpp"

#include "itt.hpp"
#include "openvino/core/partial_shape.hpp"
#include "openvino/core/validation_util.hpp"
#include "openvino/op/variadic_split.hpp"
Expand Down Expand Up @@ -134,6 +135,55 @@ std::vector<ov::PartialShape> DynamicQuantize::shape_infer(const DynamicQuantize
return out_shapes;
}

bool DynamicQuantize::visit_attributes(AttributeVisitor& visitor) {
INTERNAL_OP_SCOPE(internal_DynamicQuantize_visit_attributes);
visitor.on_attribute("quantization_type", m_attrs.quantization_type);
visitor.on_attribute("quantization_dt", m_attrs.quantization_dt);
visitor.on_attribute("scale_dt", m_attrs.scale_dt);
visitor.on_attribute("zp_dt", m_attrs.zp_dt);
visitor.on_attribute("precomputed_reduction_dt", m_attrs.precomputed_reduction_dt);
visitor.on_attribute("precomputed_reduction", m_attrs.precomputed_reduction);
visitor.on_attribute("group_sizes", m_attrs.group_sizes);
visitor.on_attribute("scales_zp_output_order", m_attrs.scales_zp_output_order);
visitor.on_attribute("output_storage_type", m_attrs.output_storage_type);
return true;
}

} // namespace internal
} // namespace op

std::ostream& operator<<(std::ostream& s,
const ov::op::internal::DynamicQuantize::QuantizationType& quantization_type) {
return s << ov::as_string(quantization_type);
}

std::ostream& operator<<(std::ostream& s,
const ov::op::internal::DynamicQuantize::OutputStorageType& output_storage_type) {
return s << ov::as_string(output_storage_type);
}

template <>
OPENVINO_API EnumNames<ov::op::internal::DynamicQuantize::QuantizationType>&
EnumNames<ov::op::internal::DynamicQuantize::QuantizationType>::get() {
static auto enum_names = EnumNames<ov::op::internal::DynamicQuantize::QuantizationType>(
"ov::op::internal::DynamicQuantize::QuantizationType",
{
{"symmetric", ov::op::internal::DynamicQuantize::QuantizationType::Symmetric},
{"asymmetric", ov::op::internal::DynamicQuantize::QuantizationType::Asymmetric},
});
return enum_names;
}

template <>
OPENVINO_API EnumNames<ov::op::internal::DynamicQuantize::OutputStorageType>&
EnumNames<ov::op::internal::DynamicQuantize::OutputStorageType>::get() {
static auto enum_names = EnumNames<ov::op::internal::DynamicQuantize::OutputStorageType>(
"ov::op::internal::DynamicQuantize::OutputStorageType",
{
{"planar", ov::op::internal::DynamicQuantize::OutputStorageType::Planar},
{"interleaved_scales_zp", ov::op::internal::DynamicQuantize::OutputStorageType::InterleavedScalesZP},
});
return enum_names;
}

} // namespace ov
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
#include <memory>

#include "itt.hpp"
#include "low_precision/low_precision.hpp"
#include "openvino/pass/constant_folding.hpp"
#include "openvino/pass/manager.hpp"
#include "transformations/common_optimizations/adaptive_pool_to_reduce.hpp"
Expand Down Expand Up @@ -146,7 +147,8 @@ bool ov::pass::MOCTransformations::run_on_model(const std::shared_ptr<ov::Model>
// Transformation call example, to check with the real model
manager.register_pass<MarkGatherSubgraph>(TypeVector{f8e4m3}, TypeVector{u4});
manager.register_pass<ov::pass::MarkDequantization>(
TypeVector{i32, u32, i16, u16, i8, u8, u6, i4, u4, nf4, u3, u2, u1, f4e2m1, f8e4m3, f8e5m2, f8e8m0});
TypeVector{i32, u32, i16, u16, i8, u8, u6, i4, u4, nf4, u3, u2, u1, f8e4m3, f8e5m2, f4e2m1, f8e8m0});
manager.register_pass<ov::pass::MarkDequantization>(TypeVector{f8e4m3, f8e5m2, f4e2m1, f8e8m0}, false, false);
}
if (!m_use_shapes) {
manager.register_pass<ov::pass::DisableShapeOfConstantFolding>();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -176,7 +176,7 @@ bool shared_node_optimization(const shared_ptr<Model>& model) {

if (nodes_are_equal(root_op, child_op, node_attributes_cache)) {
rewritten =
replace_output_update_name(child_op->output(0), root_op->output(0)) || rewritten;
replace_outputs_update_name(child_op->outputs(), root_op->outputs()) || rewritten;
visited_nodes[j] = true;
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,14 @@ using namespace ov;

namespace {

const element::TypeVector kLowPrecisionTypes{element::u8, element::i8, element::u4, element::i4};
const element::TypeVector kLowPrecisionTypes{element::u8,
element::i8,
element::u4,
element::i4,
element::f8e4m3,
element::f8e5m2,
element::f4e2m1,
element::f8e8m0};

} // namespace

Expand Down Expand Up @@ -231,3 +238,129 @@ TEST_F(TransformationTestsF, LowPrecisionDequantize_NoopReshapeSkipped) {
comparator.enable(FunctionsComparator::CmpValues::CONST_VALUES);
comparator.enable(FunctionsComparator::CmpValues::RUNTIME_KEYS);
}

TEST_F(TransformationTestsF, LowPrecisionDequantize_f8e4m3) {
const Shape weights_shape{4, 16};

{
auto weights = op::v0::Constant::create(element::f8e4m3, weights_shape, {-2});
auto scale = op::v0::Constant::create(element::f16, Shape{}, {0.2f});

auto out = decomposition::low_precision_dequantize(weights, scale);
model = std::make_shared<Model>(OutputVector{out}, ParameterVector{});
}

manager.register_pass<pass::MarkDequantization>(kLowPrecisionTypes);
manager.register_pass<pass::ConstantFolding>();

{
auto weights = op::v0::Constant::create(element::f8e4m3, weights_shape, {-2});
auto convert = std::make_shared<op::v0::Convert>(weights, element::f16);
disable_constant_folding(convert);

auto scale = op::v0::Constant::create(element::f16, Shape{}, {0.2f});
auto multiply = std::make_shared<op::v1::Multiply>(convert, scale);
mark_as_dequantization_node(multiply);

model_ref = std::make_shared<Model>(OutputVector{multiply}, ParameterVector{});
}

comparator.enable(FunctionsComparator::CmpValues::CONST_VALUES);
comparator.enable(FunctionsComparator::CmpValues::RUNTIME_KEYS);
}

TEST_F(TransformationTestsF, LowPrecisionDequantize_f8e5m2) {
const Shape weights_shape{4, 16};

{
auto weights = op::v0::Constant::create(element::f8e5m2, weights_shape, {-2});
auto scale = op::v0::Constant::create(element::f16, Shape{}, {0.2f});

auto out = decomposition::low_precision_dequantize(weights, scale);
model = std::make_shared<Model>(OutputVector{out}, ParameterVector{});
}

manager.register_pass<pass::MarkDequantization>(kLowPrecisionTypes);
manager.register_pass<pass::ConstantFolding>();

{
auto weights = op::v0::Constant::create(element::f8e5m2, weights_shape, {-2});
auto convert = std::make_shared<op::v0::Convert>(weights, element::f16);
disable_constant_folding(convert);

auto scale = op::v0::Constant::create(element::f16, Shape{}, {0.2f});
auto multiply = std::make_shared<op::v1::Multiply>(convert, scale);
mark_as_dequantization_node(multiply);

model_ref = std::make_shared<Model>(OutputVector{multiply}, ParameterVector{});
}

comparator.enable(FunctionsComparator::CmpValues::CONST_VALUES);
comparator.enable(FunctionsComparator::CmpValues::RUNTIME_KEYS);
}

TEST_F(TransformationTestsF, LowPrecisionDequantize_mxf8e4m3) {
const Shape weights_shape{4, 32};

{
auto weights = op::v0::Constant::create(element::f8e4m3, weights_shape, {-2});
auto scale = op::v0::Constant::create(element::f8e8m0, Shape{}, {0.2f});

auto out = decomposition::low_precision_dequantize(weights, scale, {}, {}, element::f16);
model = std::make_shared<Model>(OutputVector{out}, ParameterVector{});
}

manager.register_pass<pass::MarkDequantization>(kLowPrecisionTypes, false, false);
manager.register_pass<pass::ConstantFolding>();

{
auto weights = op::v0::Constant::create(element::f8e4m3, weights_shape, {-2});
auto convert_weights = std::make_shared<op::v0::Convert>(weights, element::f16);
disable_constant_folding(convert_weights);

auto scale = op::v0::Constant::create(element::f8e8m0, Shape{}, {0.2f});
auto convert_scale = std::make_shared<op::v0::Convert>(scale, element::f16);
disable_constant_folding(convert_scale);

auto multiply = std::make_shared<op::v1::Multiply>(convert_weights, convert_scale);
mark_as_dequantization_node(multiply);

model_ref = std::make_shared<Model>(OutputVector{multiply}, ParameterVector{});
}

comparator.enable(FunctionsComparator::CmpValues::CONST_VALUES);
comparator.enable(FunctionsComparator::CmpValues::RUNTIME_KEYS);
}

TEST_F(TransformationTestsF, LowPrecisionDequantize_mxf8e5m2) {
const Shape weights_shape{4, 32};

{
auto weights = op::v0::Constant::create(element::f8e5m2, weights_shape, {-2});
auto scale = op::v0::Constant::create(element::f8e8m0, Shape{}, {0.2f});

auto out = decomposition::low_precision_dequantize(weights, scale, {}, {}, element::f16);
model = std::make_shared<Model>(OutputVector{out}, ParameterVector{});
}

manager.register_pass<pass::MarkDequantization>(kLowPrecisionTypes, false, false);
manager.register_pass<pass::ConstantFolding>();

{
auto weights = op::v0::Constant::create(element::f8e5m2, weights_shape, {-2});
auto convert_weights = std::make_shared<op::v0::Convert>(weights, element::f16);
disable_constant_folding(convert_weights);

auto scale = op::v0::Constant::create(element::f8e8m0, Shape{}, {0.2f});
auto convert_scale = std::make_shared<op::v0::Convert>(scale, element::f16);
disable_constant_folding(convert_scale);

auto multiply = std::make_shared<op::v1::Multiply>(convert_weights, convert_scale);
mark_as_dequantization_node(multiply);

model_ref = std::make_shared<Model>(OutputVector{multiply}, ParameterVector{});
}

comparator.enable(FunctionsComparator::CmpValues::CONST_VALUES);
comparator.enable(FunctionsComparator::CmpValues::RUNTIME_KEYS);
}
3 changes: 3 additions & 0 deletions src/core/include/openvino/core/graph_util.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -292,6 +292,9 @@ bool compare_constants(const std::shared_ptr<Node>& n1, const std::shared_ptr<No
OPENVINO_API
bool replace_output_update_name(Output<Node> node, const Output<Node>& node_input);

OPENVINO_API
bool replace_outputs_update_name(OutputVector nodes, const OutputVector& node_inputs);

OPENVINO_API
bool replace_node_update_name(const std::shared_ptr<Node>& target, const std::shared_ptr<Node>& replacement);

Expand Down
Loading
Loading