From 97030adcbd5e5d8cd27e7a9450fdba967943f18c Mon Sep 17 00:00:00 2001 From: tadamczx <156996781+tadamczx@users.noreply.github.com> Date: Thu, 12 Sep 2024 09:49:56 +0200 Subject: [PATCH 1/2] [DOCS] Add verification of json benchmarks files (#26527) ### Details: - *item1* - *...* ### Tickets: - *ticket-id* --- .github/workflows/build_doc.yml | 4 + docs/requirements.txt | 3 +- docs/scripts/tests/validate_benchmarks.py | 80 +++++++++++++++++++ .../{ => data}/graph-data-ov.json | 0 .../{ => data}/graph-data-ovms.json | 0 5 files changed, 86 insertions(+), 1 deletion(-) create mode 100644 docs/scripts/tests/validate_benchmarks.py rename docs/sphinx_setup/_static/benchmarks_files/{ => data}/graph-data-ov.json (100%) rename docs/sphinx_setup/_static/benchmarks_files/{ => data}/graph-data-ovms.json (100%) diff --git a/.github/workflows/build_doc.yml b/.github/workflows/build_doc.yml index 4ea3cf36aaa725..7b380530cfaecd 100644 --- a/.github/workflows/build_doc.yml +++ b/.github/workflows/build_doc.yml @@ -50,6 +50,10 @@ jobs: tar -xzf doxygen-$DOXY_VER.linux.bin.tar.gz echo "$(pwd)/doxygen-$DOXY_VER/bin/" >> $GITHUB_PATH + - name: Validate benchmarks files + run: | + python3 docs/scripts/tests/validate_benchmarks.py docs/sphinx_setup/_static/benchmarks_files/ + - name: Build docs run: | rm -rf build && mkdir build && cd build diff --git a/docs/requirements.txt b/docs/requirements.txt index 84813255ac7694..0e5e94bd98cf61 100644 --- a/docs/requirements.txt +++ b/docs/requirements.txt @@ -1,6 +1,6 @@ alabaster==0.7.14 atomicwrites==1.4.0 -attrs==22.1.0 +attrs==22.2.0 Babel==2.11.0 beautifulsoup4==4.9.3 breathe==4.35.0 @@ -14,6 +14,7 @@ importlib-metadata==4.8.0 iniconfig==1.1.1 ipython==8.10.0 Jinja2==3.1.4 +jsonschema==4.23.0 lxml>=4.9.2 MarkupSafe==2.1.1 mistune==2.0.3 diff --git a/docs/scripts/tests/validate_benchmarks.py b/docs/scripts/tests/validate_benchmarks.py new file mode 100644 index 00000000000000..8876a09dc58db2 --- /dev/null +++ b/docs/scripts/tests/validate_benchmarks.py @@ -0,0 +1,80 @@ +import os +import json +import requests +import argparse +from jsonschema import Draft7Validator +import sys + + +def load_json(file_path): + """Load JSON data from a file.""" + with open(file_path, 'r') as file: + return json.load(file) + +def validate_json_files(benchmarks_dir): + """Validate all JSON files in the 'data' subdirectory against the schema.""" + # Define the path to the schema file + schema_path = os.path.join(benchmarks_dir, 'schema', 'graph-data-schema.json') + + # Fetch the schema + schema = load_json(schema_path) + validator = Draft7Validator(schema) + + # Define the path to the 'data' subdirectory containing the JSON files + data_dir = os.path.join(benchmarks_dir, 'data') + + # Get all JSON files in the directory + json_files = [f for f in os.listdir(data_dir) if f.endswith('.json')] + + invalid_count = 0 # Track the number of invalid JSON objects + + # Iterate through each JSON file and validate + for json_file in json_files: + json_file_path = os.path.join(data_dir, json_file) + print(f"Validating {json_file_path}...") + + try: + json_data = load_json(json_file_path) + except Exception as e: + print(f"Error loading JSON file {json_file}: {e}") + invalid_count += 1 + continue + + # Check if the JSON data is a list of objects + if isinstance(json_data, list): + # Iterate through each object in the list + for idx, item in enumerate(json_data): + errors = list(validator.iter_errors(item)) + if errors: + print(f"Validation failed for object {idx} in {json_file}:") + for error in errors: + print(f"Error: {error.message}") + invalid_count += 1 + else: + # Validate the JSON object itself if it's not a list + errors = list(validator.iter_errors(json_data)) + if errors: + print(f"Validation failed for {json_file}:") + for error in errors: + print(f"Error: {error.message}") + invalid_count += 1 + + return invalid_count + +if __name__ == "__main__": + parser = argparse.ArgumentParser(description="Validate JSON files against a schema.") + parser.add_argument( + "benchmarks_dir", + type=str, + help="Path to the directory containing the benchmark JSON files" + ) + args = parser.parse_args() + invalid_jsons = validate_json_files(args.benchmarks_dir) + + if invalid_jsons > 0: + print(f"{invalid_jsons} JSON object(s) are invalid. Failing the build.") + sys.exit(1) # Exit with a non-zero status to fail Jenkins/GitHub Actions + else: + print("All JSON objects are valid.") + sys.exit(0) # Exit with zero status for success + diff --git a/docs/sphinx_setup/_static/benchmarks_files/graph-data-ov.json b/docs/sphinx_setup/_static/benchmarks_files/data/graph-data-ov.json similarity index 100% rename from docs/sphinx_setup/_static/benchmarks_files/graph-data-ov.json rename to docs/sphinx_setup/_static/benchmarks_files/data/graph-data-ov.json diff --git a/docs/sphinx_setup/_static/benchmarks_files/graph-data-ovms.json b/docs/sphinx_setup/_static/benchmarks_files/data/graph-data-ovms.json similarity index 100% rename from docs/sphinx_setup/_static/benchmarks_files/graph-data-ovms.json rename to docs/sphinx_setup/_static/benchmarks_files/data/graph-data-ovms.json From 47857670ae1f7cf93d76f421561cc2cdf56ddd93 Mon Sep 17 00:00:00 2001 From: Jade Cho Date: Thu, 12 Sep 2024 17:28:20 +0900 Subject: [PATCH 2/2] [GPU] Fix a bug of onednn asymmetric convolution (#26536) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ### Details: - *Fixed incorrect value ​​being set when weights zero-points are scalar.* ### Tickets: - *151898* --- .../bcast_and_pad_zp_buffers.cpp | 51 +++++++++-------- .../bcast_and_pad_zp_buffers_test.cpp | 55 +++++++++++++++++++ 2 files changed, 83 insertions(+), 23 deletions(-) diff --git a/src/plugins/intel_gpu/src/plugin/transformations/bcast_and_pad_zp_buffers.cpp b/src/plugins/intel_gpu/src/plugin/transformations/bcast_and_pad_zp_buffers.cpp index c35816b7d3febc..9e85fbbb535946 100644 --- a/src/plugins/intel_gpu/src/plugin/transformations/bcast_and_pad_zp_buffers.cpp +++ b/src/plugins/intel_gpu/src/plugin/transformations/bcast_and_pad_zp_buffers.cpp @@ -75,34 +75,39 @@ bool all_same_value(const T* qp_ptr, size_t size) { }); } -std::shared_ptr scalar_parameter(std::shared_ptr qp) { +template +std::shared_ptr +create_scalar_constant(const std::shared_ptr& qp) { auto type = qp->get_element_type(); - size_t size = ov::shape_size(qp->get_shape()); - bool has_same_value = false; - switch (type) { - case ov::element::u8: - has_same_value = all_same_value(static_cast(qp->get_data_ptr()), size); - break; - case ov::element::i8: - has_same_value = all_same_value(static_cast(qp->get_data_ptr()), size); - break; - case ov::element::f16: - has_same_value = all_same_value(static_cast(qp->get_data_ptr()), size); - break; - case ov::element::f32: - has_same_value = all_same_value(static_cast(qp->get_data_ptr()), size); - break; - default: OPENVINO_THROW("[GPU] Can't pad quantization parameter for ", type, " element type"); + auto shape = qp->get_shape(); + if (all_same_value(static_cast(qp->get_data_ptr()), ov::shape_size(shape))) { + ov::Shape new_shape(shape.size(), 1); + ov::Tensor new_tensor(type, new_shape); + auto new_qp = std::make_shared(new_tensor); + auto val = qp->get_vector()[0]; + new_qp->fill_data(type, val); + return new_qp; } + return nullptr; +} - if (has_same_value) { - auto new_shape = qp->get_shape(); - std::fill(new_shape.begin(), new_shape.end(), 1); - ov::Tensor new_qp(type, new_shape); - return std::make_shared(new_qp); +std::shared_ptr scalar_parameter(std::shared_ptr qp) { + auto type = qp->get_element_type(); + std::shared_ptr new_qp = nullptr; + + if (type == ov::element::u8) { + new_qp = create_scalar_constant(qp); + } else if (type == ov::element::i8) { + new_qp = create_scalar_constant(qp); + } else if (type == ov::element::f16) { + new_qp = create_scalar_constant(qp); + } else if (type == ov::element::f32) { + new_qp = create_scalar_constant(qp); + } else { + OPENVINO_THROW("[GPU] Can't pad quantization parameter for ", type, " element type"); } - return nullptr; + return new_qp; } } // namespace diff --git a/src/plugins/intel_gpu/tests/unit/transformations/bcast_and_pad_zp_buffers_test.cpp b/src/plugins/intel_gpu/tests/unit/transformations/bcast_and_pad_zp_buffers_test.cpp index 5bea993237855d..218519f5bedbb1 100644 --- a/src/plugins/intel_gpu/tests/unit/transformations/bcast_and_pad_zp_buffers_test.cpp +++ b/src/plugins/intel_gpu/tests/unit/transformations/bcast_and_pad_zp_buffers_test.cpp @@ -184,6 +184,61 @@ TEST_F(TransformationTestsF, BroadcastAndPadZeroPointBuffers_3) { } } +TEST_F(TransformationTestsF, BroadcastAndPadZeroPointBuffers_scalar_wzp) { + ov::Strides strides{1, 1}; + ov::Strides dilations{1, 1}; + ov::CoordinateDiff pads_begin{0, 0}; + ov::CoordinateDiff pads_end{0, 0}; + { + auto input = std::make_shared(ov::element::u8, ov::PartialShape{ 1, 8, 11, 12 }); + auto weights_const = ov::op::v0::Constant::create(ov::element::u8, ov::Shape{ 8, 8, 3, 3 }, { 1 }); + auto no_bias = std::make_shared(); + auto azp_const = ov::op::v0::Constant::create(ov::element::u8, ov::Shape{ 1, 1, 1, 1 }, { 1 }); + auto wzp_const = ov::op::v0::Constant::create(ov::element::u8, ov::Shape{ 1, 8, 1, 1 }, { 12 }); + auto compensation = ov::op::v0::Constant::create(ov::element::f32, ov::Shape{ 1, 8, 1, 1 }, { 1 }); + auto conv = std::make_shared(input, + weights_const, + no_bias, + azp_const, + wzp_const, + compensation, + strides, + pads_begin, + pads_end, + dilations, + -1, + ov::op::PadType::EXPLICIT, + ov::element::f32); + + model = std::make_shared(ov::NodeVector{ conv }, ov::ParameterVector{ input }); + manager.register_pass(8, true); + } + { + auto input = std::make_shared(ov::element::u8, ov::PartialShape{ 1, 8, 11, 12 }); + auto weights_const = ov::op::v0::Constant::create(ov::element::u8, ov::Shape{ 8, 8, 3, 3 }, { 1 }); + auto no_bias = std::make_shared(); + auto azp_const = ov::op::v0::Constant::create(ov::element::u8, ov::Shape{ 1, 8, 1, 1 }, { 1 }); + auto wzp_const = ov::op::v0::Constant::create(ov::element::u8, ov::Shape{ 1, 1, 1, 1 }, { 12 }); + auto compensation = ov::op::v0::Constant::create(ov::element::f32, ov::Shape{ 1, 8, 1, 1 }, { 1 }); + auto conv = std::make_shared(input, + weights_const, + no_bias, + azp_const, + wzp_const, + compensation, + strides, + pads_begin, + pads_end, + dilations, + -1, + ov::op::PadType::EXPLICIT, + ov::element::f32); + + model_ref = std::make_shared(ov::NodeVector{ conv }, ov::ParameterVector{ input }); + } + comparator.enable(FunctionsComparator::CmpValues::CONST_VALUES); +} + } // namespace intel_gpu } // namespace test } // namespace ov