diff --git a/src/plugins/intel_gpu/src/graph/graph_optimizer/prepare_quantization.cpp b/src/plugins/intel_gpu/src/graph/graph_optimizer/prepare_quantization.cpp index 13e21ab4c21..893d3539507 100644 --- a/src/plugins/intel_gpu/src/graph/graph_optimizer/prepare_quantization.cpp +++ b/src/plugins/intel_gpu/src/graph/graph_optimizer/prepare_quantization.cpp @@ -530,6 +530,10 @@ void prepare_quantization::prepare_asymmetric_quantization(program &p, convoluti in1.get_output_layout().data_type != data_types::i8) return; + const size_t feature_idx = 1; + if (asymmetric_data && in0.get_output_layout().get_partial_shape()[feature_idx].is_dynamic()) + return; + auto old_conv_prim = convolution_node.get_primitive(); primitive_id input = old_conv_prim->input[0].pid; @@ -546,7 +550,7 @@ void prepare_quantization::prepare_asymmetric_quantization(program &p, convoluti wl = wl.convert_to_weights_layout(convolution_node.typed_desc()->grouped_weights_shape); } int ofm = wl.group() * wl.ofm(); - int ifm = in0.get_output_layout().feature(); + int ifm = in0.get_output_layout().get_partial_shape()[feature_idx].get_length(); int ofm_aligned = align_to(ofm, 32); int ifm_aligned = align_to(ifm, 32); diff --git a/src/plugins/intel_gpu/tests/unit/passes/prepare_quantization.cpp b/src/plugins/intel_gpu/tests/unit/passes/prepare_quantization.cpp index bbd918fde11..408ea0c611b 100644 --- a/src/plugins/intel_gpu/tests/unit/passes/prepare_quantization.cpp +++ b/src/plugins/intel_gpu/tests/unit/passes/prepare_quantization.cpp @@ -44,4 +44,30 @@ TEST(prepare_quantization, program_replace_check_num_of_nodes) { program_wrapper::apply_opt_pass(*prog); ASSERT_TRUE(prog->get_node("quantize").get_dependencies().size() == 9); -} \ No newline at end of file +} + +TEST(prepare_quantization, dynamic_conv_asymmetric_data_weight_no_failure) { + auto& engine = get_test_engine(); + + ov::Shape in_shape = { 1, 15, 4, 5 }; + auto in_layout = layout{ ov::PartialShape::dynamic(in_shape.size()), data_types::u8, format::bfyx }; + auto input_ptr = engine.allocate_memory({ data_types::u8, format::bfyx, { 1, 15, 4, 5 } }); + auto w_mem_ptr = engine.allocate_memory({ ov::PartialShape{ 30, 15, 3, 3 }, data_types::i8, format::bfyx }); + auto zp_mem_ptr = engine.allocate_memory({ in_shape, data_types::u8, format::bfyx }); + + topology topology; + + topology.add(input_layout("input", in_layout)); + topology.add(data("weights", w_mem_ptr)); + topology.add(data("a_zp", zp_mem_ptr)); + topology.add(eltwise("a_sub", { input_info("input"), input_info("a_zp") }, eltwise_mode::sub, data_types::f32)); + topology.add(convolution("conv_prim", input_info("a_sub"), "weights", "", 1, {1, 1}, {1, 1}, {0, 0}, {0, 0}, false)); + + ExecutionConfig config = get_test_default_config(engine); + config.set_property(ov::intel_gpu::allow_new_shape_infer(true)); + config.set_property(ov::intel_gpu::optimize_data(true)); + network network(engine, topology, config); + network.set_input_data("input", input_ptr); + + EXPECT_NO_THROW(network.execute()); +}