Skip to content

Commit

Permalink
Add tests
Browse files Browse the repository at this point in the history
  • Loading branch information
sshlyapn committed Dec 8, 2023
1 parent 7dabfcd commit 81a25cc
Show file tree
Hide file tree
Showing 5 changed files with 102 additions and 11 deletions.
18 changes: 15 additions & 3 deletions src/plugins/intel_gpu/src/graph/fully_connected.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -174,10 +174,22 @@ kernel_impl_params fully_connected_inst::get_fake_aligned_params(kernel_impl_par
auto orig_output_layout = orig_impl_param.get_output_layout();
OPENVINO_ASSERT(orig_input_layout.is_static() && orig_output_layout.is_static(),
"in/out layouts should be static for fake alignment!");
if (orig_input_layout.format == format::bfyx && orig_output_layout.format == format::bfyx) {

auto input_shape = orig_input_layout.get_partial_shape().to_shape();
auto output_shape = orig_output_layout.get_partial_shape().to_shape();

// Allow padding only for feature and outermost dimmension. It
auto can_apply_fake_alignment = true;
if (input_shape.size() == 3)
can_apply_fake_alignment &= orig_input_layout.data_padding.lower_size().sizes()[1] == 0 &&
orig_input_layout.data_padding.upper_size().sizes()[1] == 0;

if (output_shape.size() == 3)
can_apply_fake_alignment &= orig_output_layout.data_padding.lower_size().sizes()[1] == 0 &&
orig_output_layout.data_padding.upper_size().sizes()[1] == 0;

if (orig_input_layout.format == format::bfyx && orig_output_layout.format == format::bfyx && can_apply_fake_alignment) {
auto updated_param = orig_impl_param;
auto input_shape = orig_input_layout.get_partial_shape().to_shape();
auto output_shape = orig_output_layout.get_partial_shape().to_shape();

auto batch_size = std::accumulate(input_shape.begin(),
input_shape.end() - 1,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -38,9 +38,10 @@ TEST_P(fully_connected_fake_align_test, fake_alignment) {

auto& engine = get_test_engine();

auto input_size = p.input_layout.get_partial_shape().size();
auto input_layout_prim = std::make_shared<input_layout>("input", p.input_layout);
auto weight_layout_prim = std::make_shared<input_layout>("weight", p.weight_layout);
auto fully_connected_prim = std::make_shared<fully_connected>("output", input_info("input"), "weight", "", p.data_type);
auto fully_connected_prim = std::make_shared<fully_connected>("output", input_info("input"), "weight", "", p.data_type, padding(), input_size);

cldnn::program prog(engine);

Expand Down Expand Up @@ -106,7 +107,42 @@ INSTANTIATE_TEST_SUITE_P(smoke, fully_connected_fake_align_test,
layout{ov::PartialShape{-1, -1}, data_types::i8, format::bfyx}, // fake_aligned input layout_dgpu // dummy
layout{ov::PartialShape{-1, -1}, data_types::f16, format::bfyx} // fake_aligned output layout_dgpu // dummy
},

{
layout{ov::PartialShape{1, 56, 511}, data_types::f16, format::bfyx}, // input_layout
layout{ov::PartialShape{800, 511}, data_types::f16, format::bfyx}, // weight layout
data_types::f16,
layout{ov::PartialShape{64, 1, 511}, data_types::f16, format::bfyx}, // fake_aligned input layout_igpu
layout{ov::PartialShape{64, 1, 800}, data_types::f16, format::bfyx}, // fake_aligned output layout_igpu
layout{ov::PartialShape{64, 1, 511}, data_types::f16, format::bfyx}, // fake_aligned input layout_dgpu
layout{ov::PartialShape{64, 1, 800}, data_types::f16, format::bfyx} // fake_aligned output layout_dgpu
},
{
layout{ov::PartialShape{56, 1, 511}, data_types::f16, format::bfyx}, // input_layout
layout{ov::PartialShape{800, 511}, data_types::f16, format::bfyx}, // weight layout
data_types::f16,
layout{ov::PartialShape{64, 1, 511}, data_types::f16, format::bfyx}, // fake_aligned input layout_igpu
layout{ov::PartialShape{64, 1, 800}, data_types::f16, format::bfyx}, // fake_aligned output layout_igpu
layout{ov::PartialShape{64, 1, 511}, data_types::f16, format::bfyx}, // fake_aligned input layout_dgpu
layout{ov::PartialShape{64, 1, 800}, data_types::f16, format::bfyx} // fake_aligned output layout_dgpu
},
{
layout{ov::PartialShape{56, 1, 511}, data_types::f16, format::bfyx, padding{{2,0,1,0}, 0}}, // input_layout
layout{ov::PartialShape{800, 511}, data_types::f16, format::bfyx}, // weight layout
data_types::f16,
layout{ov::PartialShape{64, 1, 511}, data_types::f16, format::bfyx, padding{{2,0,1,0}, 0}}, // fake_aligned input layout_igpu
layout{ov::PartialShape{64, 1, 800}, data_types::f16, format::bfyx}, // fake_aligned output layout_igpu
layout{ov::PartialShape{64, 1, 511}, data_types::f16, format::bfyx, padding{{2,0,1,0}, 0}}, // fake_aligned input layout_dgpu
layout{ov::PartialShape{64, 1, 800}, data_types::f16, format::bfyx} // fake_aligned output layout_dgpu
},
{
layout{ov::PartialShape{56, 1, 511}, data_types::f16, format::bfyx, padding{{0,1,1,0}, 0}}, // input_layout
layout{ov::PartialShape{800, 511}, data_types::f16, format::bfyx}, // weight layout
data_types::f16,
layout{ov::PartialShape{56, 1, 511}, data_types::f16, format::bfyx, padding{{0,1,1,0}, 0}}, // fake_aligned input layout_igpu
layout{ov::PartialShape{56, 1, 800}, data_types::f16, format::bfyx}, // fake_aligned output layout_igpu
layout{ov::PartialShape{56, 1, 511}, data_types::f16, format::bfyx, padding{{0,1,1,0}, 0}}, // fake_aligned input layout_dgpu
layout{ov::PartialShape{56, 1, 800}, data_types::f16, format::bfyx} // fake_aligned output layout_dgpu
},
}));

} // fake_alignment_tests
Original file line number Diff line number Diff line change
Expand Up @@ -71,6 +71,17 @@ class FullyConnectedFusingTest : public ::BaseFusingTest<fully_connected_test_pa
auto bias_shape = p.out_shape.size() == 3 ? ov::PartialShape{1, 1, p.out_shape[2]} : ov::PartialShape{1, p.out_shape[1]};
return layout{ bias_shape, p.default_type, p.default_format };
}

layout get_scale_layout(fully_connected_test_params& p, size_t group_size = 1) {
if (p.weights_type == data_types::u8 || p.weights_type == data_types::i8) {
auto scale_shape = p.out_shape.size() == 3 ? ov::PartialShape{p.out_shape[2]} : ov::PartialShape{p.out_shape[1]};
return layout{ scale_shape, p.default_type, p.default_format };
} else {
auto groups_num = p.in_shape.size() == 3 ? p.in_shape[2] / group_size : p.in_shape[1] / group_size;
auto scale_shape = p.out_shape.size() == 3 ? ov::PartialShape{p.out_shape[2], groups_num} : ov::PartialShape{p.out_shape[1], groups_num};
return layout{ scale_shape, p.default_type, p.default_format };
}
}
};


Expand Down Expand Up @@ -165,6 +176,8 @@ class FullyConnectedFusingTestOneDNN : public BaseFusingTest<fully_connected_tes
#define CASE_FC_FP16_3D_1 { 2, 32, 3 }, { 2, 32, 16 }, { 16, 3, 1 }, data_types::f16, format::bfyx, data_types::f16, format::oiyx, data_types::f32, format::bfyx
#define CASE_FC_FP16_3D_2 { 1, 1, 3 }, { 1, 1, 32 }, { 32, 3, 1 }, data_types::f16, format::bfyx, data_types::f16, format::oiyx, data_types::f32, format::bfyx

#define CASE_FC_FP16_INT4_COMP_1 { 1, 128 }, { 1, 128 }, { 128, 128 }, data_types::f16, format::bfyx, data_types::u4, format::oiyx, data_types::f16, format::bfyx

/* ----------------------------------------------------------------------------------------------------- */
/* ---------------------------------------- FC cases --------------------------------------------------- */
/* ----------------------------------------------------------------------------------------------------- */
Expand Down Expand Up @@ -276,6 +289,33 @@ INSTANTIATE_TEST_SUITE_P(fusings_gpu, fc_fp32_bias_dynamic, ::testing::ValuesIn(
fully_connected_test_params{ DYN_CASE_FC_FP32_3D_3, 2, 3 },
}));

class fc_compressed_int8_bias_dynamic : public FullyConnectedFusingTest {};
TEST_P(fc_compressed_int8_bias_dynamic, basic) {
auto p = GetParam();
auto test_input_layout = get_input_layout(p);
auto dynamic_input_layout = layout{ov::PartialShape::dynamic(test_input_layout.get_partial_shape().rank()), test_input_layout.data_type, test_input_layout.format};

auto fc_prim = fully_connected("fc_prim", input_info("input"), "weights", "", "scale", "", data_types::f16, padding(), get_output_dim_size(p), get_input_weights_rank(p));
fc_prim.decompression_zero_point_scalar = 8.0f;

create_topologies(
input_layout("input", dynamic_input_layout),
data("weights", get_mem(get_weights_layout(p))),
data("scale", get_mem(get_scale_layout(p, 128))),
data("bias", get_mem(get_bias_layout(p))),
fc_prim,
eltwise("bias_add", { input_info("fc_prim"), input_info("bias") }, eltwise_mode::sum),
reorder("reorder_bfyx", input_info("bias_add"), p.default_format, data_types::f32)
);

tolerance = 1e-5f;
execute(p, true);
}

INSTANTIATE_TEST_SUITE_P(fusings_gpu, fc_compressed_int8_bias_dynamic, ::testing::ValuesIn(std::vector<fully_connected_test_params>{
fully_connected_test_params{ CASE_FC_FP16_INT4_COMP_1, 2, 3 },
}));

class fc_int8_eltwise : public FullyConnectedFusingTest {};
TEST_P(fc_int8_eltwise, basic) {
auto p = GetParam();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -117,6 +117,9 @@ class BaseFusingTest : public ::testing::TestWithParam<T> {
if (l.data_type == data_types::i8 || l.data_type == data_types::u8) {
VF<uint8_t> rnd_vec = rg.generate_random_1d<uint8_t>(s.count(), min_random, max_random);
set_values(prim, rnd_vec);
} else if (l.data_type == data_types::i4 || l.data_type == data_types::u4) {
VF<int8_t> rnd_vec = rg.generate_random_1d<int8_t>(l.bytes_count(), min_random, max_random);
set_values(prim, rnd_vec);
} else if (l.data_type == data_types::f16) {
VF<ov::float16> rnd_vec = rg.generate_random_1d<ov::float16>(s.count(), -1, 1);
set_values(prim, rnd_vec);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -50,11 +50,11 @@ class check_hash_value: public ::testing::Test {
void test_fc_basic(bool is_caching_test) {
auto& engine = get_test_engine();

const int32_t b = 1, in_f = 128, in_x = 1, in_y = 1, out_f = 65;
const int32_t b = 1, in_f = 128, out_f = 65;

auto input_prim = engine.allocate_memory({ { b, in_f, in_y, in_x }, data_types::f32, format::bfyx });
auto weights_prim = engine.allocate_memory({ { out_f, in_f, in_y, in_x }, data_types::f32, format::bfyx });
auto bias_prim = engine.allocate_memory({ { 1, 1, out_f, 1 }, data_types::f32, format::bfyx });
auto input_prim = engine.allocate_memory({ { b, in_f }, data_types::f32, format::bfyx });
auto weights_prim = engine.allocate_memory({ { out_f, in_f }, data_types::f32, format::bfyx });
auto bias_prim = engine.allocate_memory({ { out_f }, data_types::f32, format::bfyx });

const auto key_prim_id = "fc";
topology topology(
Expand All @@ -72,10 +72,10 @@ class check_hash_value: public ::testing::Test {
const auto params_hash = primitve->type->get_fake_aligned_params(*prim_inst->get_impl_params()).hash();
if (!engine.get_device_info().supports_immad) {
ASSERT_EQ(primitive_hash, 14259723886449306729UL);
ASSERT_EQ(params_hash, 1637150664489130388UL);
ASSERT_EQ(params_hash, 3365957578641948513UL);
} else {
ASSERT_EQ(primitive_hash, 14259723886449306729UL);
ASSERT_EQ(params_hash, 6343702278017463925UL);
ASSERT_EQ(params_hash, 9831190959346679696UL);
}
}

Expand Down

0 comments on commit 81a25cc

Please sign in to comment.