[CPU] f16 constant folding on cpu plug-in side for MatMul only (#18079)
This commit is contained in:
1 parent
0e76496acc
commit
60e40843c0
10 files changed
+356
-12
No files matched your search
+12
@@ -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();
|
||||
};
|
||||
+28
-2
@@ -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);
|
||||
}
|
||||
Reference in new issue
Block a user