Files
openvino/src/plugins/intel_gpu/tests/fusions/activation_fusion_test.cpp
T

340 lines
20 KiB
C++

// Copyright (C) 2018-2023 Intel Corporation
// SPDX-License-Identifier: Apache-2.0
//
#include "test_utils.h"
#include "fusion_test_common.hpp"
#include <intel_gpu/primitives/input_layout.hpp>
#include <intel_gpu/primitives/quantize.hpp>
#include <intel_gpu/primitives/eltwise.hpp>
#include <intel_gpu/primitives/data.hpp>
#include <cmath>
using namespace cldnn;
using namespace ::tests;
namespace {
struct activation_test_params {
ov::PartialShape input_size;
data_types input_type;
format input_format;
data_types default_type;
format default_format;
size_t expected_fused_primitives;
size_t expected_not_fused_primitives;
std::string kernel_name;
};
class ActivationFusingTest : public ::BaseFusingTest<activation_test_params> {
public:
void execute(activation_test_params& p) {
auto input_prim = get_mem(get_input_layout(p));
ExecutionConfig cfg = get_test_default_config(engine);
ov::intel_gpu::ImplementationDesc activation_impl = { p.input_format, p.kernel_name };
cfg.set_property(ov::intel_gpu::optimize_data(true));
cfg.set_property(ov::intel_gpu::force_implementations(ov::intel_gpu::ImplForcingMap{ { "act", activation_impl } }));
network network_fused(this->engine, this->topology_fused, cfg);
network network_not_fused(this->engine, this->topology_non_fused, cfg_not_fused);
network_fused.set_input_data("input", input_prim);
network_not_fused.set_input_data("input", input_prim);
compare(network_not_fused, network_fused, p);
}
layout get_input_layout(activation_test_params& p) {
return layout{ p.input_size, p.input_type, p.input_format, };
}
layout get_per_channel_layout(activation_test_params& p) {
return layout{ { 1, p.input_size[1], 1, 1 }, p.default_type, p.default_format };
}
format get_input_format(activation_test_params &p) { return p.input_format; }
};
} // namespace
/* ----------------------------------------------------------------------------------------------------- */
/* -------------------------------- Activation cases --------------------------------------------------- */
/* ----------------------------------------------------------------------------------------------------- */
#define CASE_ACTIVATION_F32_0 { 7, 32, 3, 3 }, data_types::f32, format::bfyx, data_types::f32, format::bfyx
#define CASE_ACTIVATION_F32_1 { 1, 16, 8, 8 }, data_types::f32, format::bfyx, data_types::f32, format::bfyx
#define CASE_ACTIVATION_F32_2 { 7, 3, 7, 7 }, data_types::f32, format::b_fs_yx_fsv16, data_types::f32, format::bfyx
#define CASE_ACTIVATION_F32_3 { 1, 14, 8, 8 }, data_types::f32, format::b_fs_yx_fsv16, data_types::f32, format::bfyx
#define CASE_ACTIVATION_F32_4 { 1, 17, 31, 29 }, data_types::f32, format::yxfb, data_types::f32, format::bfyx
#define CASE_ACTIVATION_F32_5 { 1, 17, 31, 29 }, data_types::f32, format::b_fs_yx_fsv4, data_types::f32, format::bfyx
#define CASE_ACTIVATION_F32_6 { 1, 17, 31, 29 }, data_types::f32, format::b_fs_yx_fsv32, data_types::f32, format::bfyx
#define CASE_ACTIVATION_F32_7 { 1, 17, 31, 29 }, data_types::f32, format::fyxb, data_types::f32, format::bfyx
#define CASE_ACTIVATION_F32_8 { 1, 2, 3, 4, 5, 3, 2, 3 }, data_types::f32, format::bfvuwzyx, data_types::f32, format::bfvuwzyx
#define CASE_ACTIVATION_3D_F32_0 { 3, 16, 13, 13, 13 }, data_types::f32, format::bfzyx, data_types::f32, format::bfzyx
#define CASE_ACTIVATION_3D_F32_1 { 2, 16, 8, 8, 8 }, data_types::f32, format::bfzyx, data_types::f32, format::bfzyx
#define CASE_ACTIVATION_3D_F32_2 { 1, 16, 7, 7, 7 }, data_types::f32, format::b_fs_zyx_fsv16, data_types::f32, format::bfzyx
#define CASE_ACTIVATION_3D_F32_3 { 1, 17, 7, 7, 7 }, data_types::f32, format::b_fs_zyx_fsv32, data_types::f32, format::bfzyx
#define CASE_ACTIVATION_3D_F32_4 { 1, 17, 7, 7, 7 }, data_types::f32, format::bs_fs_yx_bsv16_fsv16, data_types::f32, format::bfzyx
#define CASE_ACTIVATION_3D_F32_5 { 1, 17, 7, 7, 7 }, data_types::f32, format::fs_b_yx_fsv32, data_types::f32, format::bfzyx
#define CASE_ACTIVATION_F16_0 { 7, 32, 5, 5 }, data_types::f16, format::bfyx, data_types::f32, format::bfyx
#define CASE_ACTIVATION_F16_1 { 1, 16, 8, 8 }, data_types::f16, format::bfyx, data_types::f32, format::bfyx
#define CASE_ACTIVATION_F16_2 { 7, 16, 7, 7 }, data_types::f16, format::b_fs_yx_fsv16, data_types::f32, format::bfyx
#define CASE_ACTIVATION_F16_3 { 1, 14, 8, 8 }, data_types::f16, format::b_fs_yx_fsv16, data_types::f32, format::bfyx
#define CASE_ACTIVATION_F16_4 { 1, 17, 31, 29 }, data_types::f16, format::yxfb, data_types::f32, format::bfyx
#define CASE_ACTIVATION_F16_5 { 1, 17, 31, 29 }, data_types::f16, format::b_fs_yx_fsv4, data_types::f32, format::bfyx
#define CASE_ACTIVATION_F16_6 { 1, 17, 31, 29 }, data_types::f16, format::b_fs_yx_fsv32, data_types::f32, format::bfyx
#define CASE_ACTIVATION_F16_7 { 1, 17, 31, 29 }, data_types::f16, format::fyxb, data_types::f32, format::bfyx
#define CASE_ACTIVATION_3D_F16_0 { 3, 16, 13, 13, 13 }, data_types::f16, format::bfzyx, data_types::f32, format::bfzyx
#define CASE_ACTIVATION_3D_F16_1 { 2, 16, 8, 8, 8 }, data_types::f16, format::bfzyx, data_types::f32, format::bfzyx
#define CASE_ACTIVATION_3D_F16_2 { 1, 16, 7, 7, 7 }, data_types::f16, format::b_fs_zyx_fsv16, data_types::f32, format::bfzyx
#define CASE_ACTIVATION_3D_F16_3 { 1, 17, 7, 7, 7 }, data_types::f16, format::b_fs_zyx_fsv32, data_types::f32, format::bfzyx
#define CASE_ACTIVATION_3D_F16_4 { 1, 17, 7, 7, 7 }, data_types::f16, format::bs_fs_yx_bsv16_fsv16, data_types::f32, format::bfzyx
#define CASE_ACTIVATION_3D_F16_5 { 1, 17, 7, 7, 7 }, data_types::f16, format::fs_b_yx_fsv32, data_types::f32, format::bfzyx
#define CASE_ACTIVATION_U8_1 { 1, 16, 8, 8 }, data_types::u8, format::bfyx, data_types::f32, format::bfyx
#define CASE_ACTIVATION_U8_2 { 1, 12, 8, 8 }, data_types::u8, format::b_fs_yx_fsv16, data_types::f32, format::bfyx
#define CASE_ACTIVATION_I8_1 { 1, 16, 8, 8 }, data_types::i8, format::bfyx, data_types::f32, format::bfyx
#define CASE_ACTIVATION_I8_2 { 1, 14, 8, 8 }, data_types::i8, format::b_fs_yx_fsv16, data_types::f32, format::bfyx
#define CASE_ACTIVATION_3D_I8_1 { 1, 17, 8, 8, 8 }, data_types::i8, format::bfzyx, data_types::f32, format::bfzyx
class activation_quantize_i8 : public ActivationFusingTest {};
TEST_P(activation_quantize_i8, basic) {
auto p = GetParam();
create_topologies(
input_layout("input", get_input_layout(p)),
activation("act", input_info("input"), activation_func::relu),
data("in_low", get_mem(get_single_element_layout(p), min_random, 0)),
data("in_high", get_mem(get_single_element_layout(p), 1, max_random)),
data("out_low", get_mem(get_single_element_layout(p), -127, 0)),
data("out_high", get_mem(get_single_element_layout(p), 0, 127)),
quantize("quant", input_info("act"), input_info("in_low"), input_info("in_high"),
input_info("out_low"), input_info("out_high"), 255, data_types::i8),
reorder("reorder_bfyx", input_info("quant"), p.default_format, data_types::f32)
);
tolerance = 1.0f;
execute(p);
}
TEST_P(activation_quantize_i8, per_channel) {
auto p = GetParam();
create_topologies(
input_layout("input", get_input_layout(p)),
activation("act", input_info("input"), activation_func::relu),
data("in_low", get_mem(get_per_channel_layout(p), min_random, 0)),
data("in_high", get_mem(get_per_channel_layout(p), 1, max_random)),
data("out_low", get_mem(get_single_element_layout(p), -127, 0)),
data("out_high", get_mem(get_single_element_layout(p), 0, 127)),
quantize("quant", input_info("act"), input_info("in_low"), input_info("in_high"),
input_info("out_low"), input_info("out_high"), 255, data_types::i8),
reorder("reorder_bfyx", input_info("quant"), p.default_format, data_types::f32)
);
tolerance = 1.0f;
execute(p);
}
INSTANTIATE_TEST_SUITE_P(fusings_gpu, activation_quantize_i8, ::testing::ValuesIn(std::vector<activation_test_params>{
// InputDataType = FP32
activation_test_params{ CASE_ACTIVATION_F32_0, 2, 3, "activation_opt" },
activation_test_params{ CASE_ACTIVATION_F32_1, 2, 3, "activation_opt" },
activation_test_params{ CASE_ACTIVATION_3D_F32_0, 2, 3, "activation_opt" },
activation_test_params{ CASE_ACTIVATION_3D_F32_1, 2, 3, "activation_opt" },
activation_test_params{ CASE_ACTIVATION_F32_0, 2, 3, "activation_ref" },
activation_test_params{ CASE_ACTIVATION_F32_1, 2, 3, "activation_ref" },
activation_test_params{ CASE_ACTIVATION_F32_2, 2, 3, "activation_ref" },
activation_test_params{ CASE_ACTIVATION_F32_3, 2, 3, "activation_ref" },
activation_test_params{ CASE_ACTIVATION_F32_4, 2, 3, "activation_ref" },
activation_test_params{ CASE_ACTIVATION_3D_F32_0, 2, 3, "activation_ref" },
activation_test_params{ CASE_ACTIVATION_3D_F32_1, 2, 3, "activation_ref" },
activation_test_params{ CASE_ACTIVATION_3D_F32_2, 2, 3, "activation_ref" },
}));
INSTANTIATE_TEST_SUITE_P(DISABLED_fusings_gpu, activation_quantize_i8, ::testing::ValuesIn(std::vector<activation_test_params>{
activation_test_params{ CASE_ACTIVATION_F32_5, 2, 3, "activation_ref" }, // FIXME - accuracy bug
activation_test_params{ CASE_ACTIVATION_F32_6, 2, 3, "activation_ref" }, // FIXME - accuracy bug
activation_test_params{ CASE_ACTIVATION_F32_7, 2, 3, "activation_ref" }, // FIXME - accuracy bug
activation_test_params{ CASE_ACTIVATION_3D_F32_3, 2, 3, "activation_ref" }, // FIXME - accuracy bug
activation_test_params{ CASE_ACTIVATION_3D_F32_5, 2, 3, "activation_ref" }, // FIXME - accuracy bug
}));
class activation_eltwise_activation_quantize_u8 : public ActivationFusingTest {};
TEST_P(activation_eltwise_activation_quantize_u8, basic) {
auto p = GetParam();
create_topologies(
input_layout("input", get_input_layout(p)),
activation("act", input_info("input"), activation_func::relu),
data("eltwise_data", get_mem(get_single_element_layout(p), 1.0f / 255)),
data("in_low", get_mem(get_single_element_layout(p), 0)),
data("in_high", get_mem(get_single_element_layout(p), 1, max_random)),
data("out_low", get_mem(get_single_element_layout(p), -127)),
data("out_high", get_mem(get_single_element_layout(p), 127)),
eltwise("eltwise", { input_info("act"), input_info("eltwise_data") }, eltwise_mode::prod, p.default_type),
activation("act2", input_info("eltwise"), activation_func::swish),
quantize("quant", input_info("act2"), input_info("in_low"), input_info("in_high"),
input_info("out_low"), input_info("out_high"), 256, data_types::u8),
reorder("reorder_bfyx", input_info("quant"), p.default_format, data_types::f32)
);
tolerance = 1.f;
execute(p);
}
TEST_P(activation_eltwise_activation_quantize_u8, per_channel) {
auto p = GetParam();
create_topologies(
input_layout("input", get_input_layout(p)),
activation("act", input_info("input"), activation_func::relu),
data("eltwise_data", get_mem(get_single_element_layout(p), 1.0f / 255)),
data("in_low", get_mem(get_per_channel_layout(p), 0)),
data("in_high", get_mem(get_per_channel_layout(p), 1, max_random)),
data("out_low", get_mem(get_single_element_layout(p), -127)),
data("out_high", get_mem(get_single_element_layout(p), 127)),
eltwise("eltwise", { input_info("act"), input_info("eltwise_data") }, eltwise_mode::prod, p.default_type),
activation("act2", input_info("eltwise"), activation_func::pow),
quantize("quant", input_info("act2"), input_info("in_low"), input_info("in_high"),
input_info("out_low"), input_info("out_high"), 256, data_types::u8),
reorder("reorder_bfyx", input_info("quant"), p.default_format, data_types::f32)
);
tolerance = 1.f;
execute(p);
}
INSTANTIATE_TEST_SUITE_P(fusings_gpu, activation_eltwise_activation_quantize_u8, ::testing::ValuesIn(std::vector<activation_test_params>{
// InputDataType = FP32
activation_test_params{ CASE_ACTIVATION_F32_0, 3, 5, "activation_opt" },
activation_test_params{ CASE_ACTIVATION_F32_1, 3, 5, "activation_opt" },
activation_test_params{ CASE_ACTIVATION_3D_F32_0, 3, 5, "activation_opt" },
activation_test_params{ CASE_ACTIVATION_3D_F32_1, 3, 5, "activation_opt" },
activation_test_params{ CASE_ACTIVATION_F32_0, 3, 5, "activation_ref" },
activation_test_params{ CASE_ACTIVATION_F32_1, 3, 5, "activation_ref" },
activation_test_params{ CASE_ACTIVATION_F32_2, 3, 5, "activation_ref" },
activation_test_params{ CASE_ACTIVATION_F32_3, 3, 5, "activation_ref" },
activation_test_params{ CASE_ACTIVATION_F32_4, 3, 5, "activation_ref" },
activation_test_params{ CASE_ACTIVATION_F32_5, 3, 5, "activation_ref" },
activation_test_params{ CASE_ACTIVATION_F32_6, 3, 5, "activation_ref" },
activation_test_params{ CASE_ACTIVATION_F32_7, 3, 5, "activation_ref" },
activation_test_params{ CASE_ACTIVATION_3D_F32_0, 3, 5, "activation_ref" },
activation_test_params{ CASE_ACTIVATION_3D_F32_1, 3, 5, "activation_ref" },
activation_test_params{ CASE_ACTIVATION_3D_F32_2, 3, 5, "activation_ref" },
activation_test_params{ CASE_ACTIVATION_F32_8, 3, 5, "activation_ref" },
}));
class activation_eltwise_activation_quantize_u8_onendnn : public ActivationFusingTest {};
TEST_P(activation_eltwise_activation_quantize_u8_onendnn, same_behavior) {
// Case : activation function is NOT supported on oneDNN and an input primitive selects clDNN execution
auto p = GetParam();
create_topologies(
input_layout("input", get_input_layout(p)),
activation("act", input_info("input"), activation_func::relu),
data("eltwise_data", get_mem(get_single_element_layout(p), 1.0f / 255)),
data("in_low", get_mem(get_single_element_layout(p), 0)),
data("in_high", get_mem(get_single_element_layout(p), 1, max_random)),
data("out_low", get_mem(get_single_element_layout(p), -127)),
data("out_high", get_mem(get_single_element_layout(p), 127)),
eltwise("eltwise", { input_info("act"), input_info("eltwise_data") }, eltwise_mode::prod, p.default_type),
activation("act2", input_info("eltwise"), activation_func::softsign),
quantize("quant", input_info("act2"), input_info("in_low"), input_info("in_high"),
input_info("out_low"), input_info("out_high"), 256, data_types::u8),
reorder("reorder_bfyx", input_info("quant"), p.default_format, data_types::f32)
);
tolerance = 1.f;
execute(p);
}
INSTANTIATE_TEST_SUITE_P(fusings_gpu, activation_eltwise_activation_quantize_u8_onendnn, ::testing::ValuesIn(std::vector<activation_test_params>{
// InputDataType = FP32
activation_test_params{ CASE_ACTIVATION_F32_0, 3, 5, "activation_opt" },
activation_test_params{ CASE_ACTIVATION_F32_1, 3, 5, "activation_opt" },
activation_test_params{ CASE_ACTIVATION_3D_F32_0, 3, 5, "activation_opt" },
activation_test_params{ CASE_ACTIVATION_3D_F32_1, 3, 5, "activation_opt" },
activation_test_params{ CASE_ACTIVATION_F32_0, 3, 5, "activation_ref" },
activation_test_params{ CASE_ACTIVATION_F32_1, 3, 5, "activation_ref" },
activation_test_params{ CASE_ACTIVATION_3D_F32_0, 3, 5, "activation_ref" },
activation_test_params{ CASE_ACTIVATION_3D_F32_1, 3, 5, "activation_ref" },
}));
INSTANTIATE_TEST_SUITE_P(DISABLED_fusings_gpu, activation_eltwise_activation_quantize_u8, ::testing::ValuesIn(std::vector<activation_test_params>{
activation_test_params{ CASE_ACTIVATION_3D_F32_5, 3, 5, "activation_ref" }, // FIXME - accuracy bug
}));
class activation_eltwise_activation : public ActivationFusingTest {};
TEST_P(activation_eltwise_activation, basic) {
auto p = GetParam();
create_topologies(
input_layout("input", get_input_layout(p)),
activation("act", input_info("input"), activation_func::relu),
data("eltwise_data", get_mem(get_single_element_layout(p), 1.0f / 255)),
eltwise("eltwise", { input_info("act"), input_info("eltwise_data") }, eltwise_mode::prod, p.default_type),
activation("act2", input_info("eltwise"), activation_func::exp),
reorder("reorder_bfyx", input_info("act2"), p.default_format, data_types::f32)
);
tolerance = 1e-05f;
execute(p);
}
INSTANTIATE_TEST_SUITE_P(fusings_gpu, activation_eltwise_activation, ::testing::ValuesIn(std::vector<activation_test_params>{
// InputDataType = FP32
activation_test_params{ CASE_ACTIVATION_F32_0, 3, 4, "activation_opt" },
activation_test_params{ CASE_ACTIVATION_F32_1, 3, 4, "activation_opt" },
activation_test_params{ CASE_ACTIVATION_3D_F32_0, 3, 4, "activation_opt" },
activation_test_params{ CASE_ACTIVATION_3D_F32_1, 3, 4, "activation_opt" },
activation_test_params{ CASE_ACTIVATION_F32_0, 3, 4, "activation_ref" },
activation_test_params{ CASE_ACTIVATION_F32_1, 3, 4, "activation_ref" },
activation_test_params{ CASE_ACTIVATION_F32_2, 3, 4, "activation_ref" },
activation_test_params{ CASE_ACTIVATION_F32_3, 3, 4, "activation_ref" },
activation_test_params{ CASE_ACTIVATION_F32_4, 3, 4, "activation_ref" },
activation_test_params{ CASE_ACTIVATION_F32_5, 3, 4, "activation_ref" },
activation_test_params{ CASE_ACTIVATION_F32_6, 3, 4, "activation_ref" },
activation_test_params{ CASE_ACTIVATION_F32_7, 3, 4, "activation_ref" },
activation_test_params{ CASE_ACTIVATION_3D_F32_0, 3, 4, "activation_ref" },
activation_test_params{ CASE_ACTIVATION_3D_F32_1, 3, 4, "activation_ref" },
activation_test_params{ CASE_ACTIVATION_3D_F32_2, 3, 4, "activation_ref" },
// InputDataType = FP16
activation_test_params{ CASE_ACTIVATION_F16_0, 3, 4, "activation_opt" },
activation_test_params{ CASE_ACTIVATION_F16_1, 3, 4, "activation_opt" },
activation_test_params{ CASE_ACTIVATION_3D_F16_0, 3, 4, "activation_opt" },
activation_test_params{ CASE_ACTIVATION_3D_F16_1, 3, 4, "activation_opt" },
activation_test_params{ CASE_ACTIVATION_F16_0, 3, 4, "activation_ref" },
activation_test_params{ CASE_ACTIVATION_F16_1, 3, 4, "activation_ref" },
activation_test_params{ CASE_ACTIVATION_F16_2, 3, 4, "activation_ref" },
activation_test_params{ CASE_ACTIVATION_F16_3, 3, 4, "activation_ref" },
activation_test_params{ CASE_ACTIVATION_F16_4, 3, 4, "activation_ref" },
activation_test_params{ CASE_ACTIVATION_F16_5, 3, 4, "activation_ref" },
activation_test_params{ CASE_ACTIVATION_F16_6, 3, 4, "activation_ref" },
activation_test_params{ CASE_ACTIVATION_F16_7, 3, 4, "activation_ref" },
activation_test_params{ CASE_ACTIVATION_3D_F16_0, 3, 4, "activation_ref" },
activation_test_params{ CASE_ACTIVATION_3D_F16_1, 3, 4, "activation_ref" },
activation_test_params{ CASE_ACTIVATION_3D_F16_2, 3, 4, "activation_ref" },
activation_test_params{ CASE_ACTIVATION_3D_F16_3, 3, 4, "activation_ref" },
activation_test_params{ CASE_ACTIVATION_3D_F16_4, 3, 4, "activation_ref" },
// InputDataType = UINT8
activation_test_params{ CASE_ACTIVATION_U8_1, 3, 4, "activation_ref" },
activation_test_params{ CASE_ACTIVATION_U8_2, 3, 4, "activation_ref" },
// InputDataType = INT8
activation_test_params{ CASE_ACTIVATION_I8_1, 3, 4, "activation_opt" },
activation_test_params{ CASE_ACTIVATION_3D_I8_1, 3, 4, "activation_opt" },
activation_test_params{ CASE_ACTIVATION_I8_1, 3, 4, "activation_ref" },
activation_test_params{ CASE_ACTIVATION_I8_2, 3, 4, "activation_ref" },
activation_test_params{ CASE_ACTIVATION_3D_I8_1, 3, 4, "activation_ref" }
}));
INSTANTIATE_TEST_SUITE_P(DISABLED_fusings_gpu, activation_eltwise_activation, ::testing::ValuesIn(std::vector<activation_test_params>{
activation_test_params{ CASE_ACTIVATION_3D_F32_4, 2, 4, "activation_ref" }, // FIXME - accuracy bug
activation_test_params{ CASE_ACTIVATION_3D_F32_5, 2, 4, "activation_ref" }, // FIXME - accuracy bug
}));