[CPU] f16 constant folding on cpu plug-in side for MatMul only (#18079)

This commit is contained in:
Anton Voronov authored and GitHub committed 2023-07-20 08:58:46 +04:00
1 parent 0e76496acc
commit 60e40843c0
10 files changed
+356 -12

No files matched your search

@@ -14,6 +14,7 @@ namespace pass {
class TRANSFORMATIONS_API EnableDecompressionConvertConstantFolding;
class TRANSFORMATIONS_API DisableDecompressionConvertConstantFolding;
class TRANSFORMATIONS_API KeepConstAndDecompression;
class TRANSFORMATIONS_API KeepConstAndDecompressionForMatMul;
} // namespace pass
} // namespace ov
@@ -47,3 +48,14 @@ public:
OPENVINO_RTTI("KeepConstAndDecompression", "0");
KeepConstAndDecompression();
};
/**
* @ingroup ie_transformation_common_api
* @brief Disables ConstantFolding for Convert operation (just before MatMul operation only) and prevents conversion
* of f16 Consts to f32.
*/
class ov::pass::KeepConstAndDecompressionForMatMul : public MatcherPass {
public:
OPENVINO_RTTI("KeepConstAndDecompressionForMatMul", "0");
KeepConstAndDecompressionForMatMul();
};
@@ -7,6 +7,7 @@
#include "itt.hpp"
#include "openvino/op/constant.hpp"
#include "openvino/op/convert.hpp"
#include "openvino/op/matmul.hpp"
#include "openvino/pass/pattern/op/wrap_type.hpp"
#include "transformations/rt_info/decompression.hpp"
#include "transformations/rt_info/disable_constant_folding.hpp"
@@ -61,11 +62,36 @@ pass::KeepConstAndDecompression::KeepConstAndDecompression() {
disable_constant_folding(node);
if (!is_type<ov::op::v0::Constant>(node->input_value(0).get_node_shared_ptr()))
return true;
return false;
enable_keep_fp16_const(node->input_value(0).get_node_shared_ptr());
return true;
return false;
};
auto m = std::make_shared<pattern::Matcher>(node_pattern, matcher_name);
register_matcher(m, callback);
}
pass::KeepConstAndDecompressionForMatMul::KeepConstAndDecompressionForMatMul() {
MATCHER_SCOPE(KeepConstAndDecompressionForMatMul);
auto matmul = pass::pattern::wrap_type<ov::op::v0::MatMul>();
matcher_pass_callback callback = [=](pass::pattern::Matcher& m) {
auto node = m.get_match_root();
// input to matmul is decompression Convert
const auto& inp_convert = node->input_value(1).get_node_shared_ptr();
if (!is_type<ov::op::v0::Convert>(inp_convert) || !is_decompression(inp_convert))
return false;
disable_constant_folding(inp_convert);
if (!is_type<ov::op::v0::Constant>(inp_convert->input_value(0).get_node_shared_ptr()))
return false;
enable_keep_fp16_const(inp_convert->input_value(0).get_node_shared_ptr());
return false;
};
auto m = std::make_shared<pass::pattern::Matcher>(matmul, matcher_name);
this->register_matcher(m, callback);
}