Skip to content

Commit 8f3fcd4

Browse files
authored
Merge branch 'master' into singleton_ocl_context
2 parents 64aec45 + d09e6ea commit 8f3fcd4

File tree

43 files changed

+577
-488
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

43 files changed

+577
-488
lines changed

.github/dockerfiles/docker_tag

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
pr-33859
1+
pr-29664

.github/dockerfiles/ov_test/ubuntu_22_04_arm64/Dockerfile

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,13 @@ RUN apt-get update && \
3333
python3.11-distutils \
3434
libhdf5-dev \
3535
libgomp1 \
36+
# libGL for PyTorch Models tests
37+
ffmpeg \
38+
libsm6 \
39+
libxext6 \
40+
libgl1 \
41+
libgl1-mesa-glx \
42+
libglib2.0-0 \
3643
&& \
3744
rm -rf /var/lib/apt/lists/*
3845

.github/workflows/job_gpu_tests.yml

Lines changed: 17 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,10 @@ on:
1515
description: 'Runner labels by which the runner will be chosen. Example: [ "self-hosted", "igpu" ]'
1616
type: string
1717
required: true
18+
runner-group:
19+
description: 'Runner group from which the runner will be chosen'
20+
type: string
21+
required: true
1822
image:
1923
description: 'Docker image in which the tests would run'
2024
type: string
@@ -31,11 +35,13 @@ permissions: read-all
3135
jobs:
3236
GPU:
3337
timeout-minutes: 80
34-
runs-on: ${{ fromJSON(inputs.runner) }}
38+
runs-on:
39+
group: ${{ inputs.runner-group }}
40+
labels: ${{ fromJSON(inputs.runner) }}
3541
container:
3642
image: ${{ inputs.image }}
3743
volumes:
38-
- /dev/dri:/dev/dri
44+
- /usr/local/share/ca-certificates:/usr/local/share/ca-certificates:ro # Needed to access CA certificates
3945
- ${{ github.workspace }}:${{ github.workspace }} # Needed as ${{ github.workspace }} is not working correctly when using Docker
4046
options: ${{ inputs.options }}
4147
defaults:
@@ -46,6 +52,7 @@ jobs:
4652
INSTALL_DIR: ${{ github.workspace }}/install
4753
INSTALL_TEST_DIR: ${{ github.workspace }}/install/tests
4854
GTEST_PARALLEL_SCRIPT: ${{ github.workspace }}/gtest_parallel.py
55+
NODE_EXTRA_CA_CERTS: /usr/local/share/ca-certificates/IntelProxyRootCA-Base64.crt
4956
steps:
5057
- name: Download OpenVINO artifacts (package)
5158
uses: akashchi/download-artifact@d59a9c15fec3fdb7c9adf09464124d00f9c11415
@@ -61,6 +68,7 @@ jobs:
6168

6269
- name: Extract OpenVINO packages
6370
run: |
71+
apt-get update && apt-get install -y pigz
6472
pigz -dc openvino_package.tar.gz | tar -xf - -v
6573
pigz -dc openvino_tests.tar.gz | tar -xf - -v
6674
working-directory: ${{ env.INSTALL_DIR }}
@@ -72,6 +80,7 @@ jobs:
7280
env:
7381
DEBIAN_FRONTEND: noninteractive # to prevent apt-get from waiting user input
7482
TZ: "Europe/London" # to prevent tzdata from waiting user input
83+
7584
- name: Setup Python ${{ env.PYTHON_VERSION }}
7685
uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6.2.0
7786
with:
@@ -96,8 +105,12 @@ jobs:
96105
run: |
97106
apt-get update && apt-get install -y \
98107
libegl-mesa0 libegl1-mesa libegl1-mesa-dev libgbm1 libgl1-mesa-dev libgl1-mesa-dri \
99-
libglapi-mesa libgles2-mesa-dev libglx-mesa0 libigdgmm11 libxatracker2 mesa-va-drivers \
108+
libglapi-mesa libgles2-mesa-dev libglx-mesa0 libxatracker2 mesa-va-drivers \
100109
mesa-vdpau-drivers mesa-vulkan-drivers va-driver-all
110+
wget -qO - https://repositories.intel.com/gpu/intel-graphics.key | gpg --yes --dearmor --output /usr/share/keyrings/intel-graphics.gpg
111+
echo "deb [arch=amd64,i386 signed-by=/usr/share/keyrings/intel-graphics.gpg] https://repositories.intel.com/gpu/ubuntu jammy unified" | tee /etc/apt/sources.list.d/intel-gpu-jammy.list
112+
apt update
113+
apt-get install -y libze-intel-gpu1 libze1 intel-opencl-icd libze-dev intel-ocloc intel-level-zero-gpu-raytracing
101114
102115
- name: Verify devices
103116
run: clinfo
@@ -130,7 +143,7 @@ jobs:
130143
131144
132145
- name: Upload Test Results
133-
uses: actions/upload-artifact@b7c566a772e6b6bfb58ed0dc250532a479d7789f # v6.0.0
146+
uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2 We are not using newest version v6.0.0 due to very frequent issues with 'Error: Unable to make request: ECONNRESET'
134147
if: always()
135148
with:
136149
name: test-results-${{ inputs.test_type }}-${{ inputs.device }}

.github/workflows/linux_arm64.yml

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -270,9 +270,8 @@ jobs:
270270

271271
PyTorch_Models_Tests:
272272
name: PyTorch Models tests
273-
if: ${{ 'false' }} # TODO: Enable once the dependencies are ready for arm (no tensorflow-text available for arm from PyPI)
274-
# if: fromJSON(needs.smart_ci.outputs.affected_components).PyTorch_FE.test
275-
needs: [ Build, Docker, Smart_CI ]
273+
if: fromJSON(needs.smart_ci.outputs.affected_components).PyTorch_FE.test
274+
needs: [ Build, Docker, Smart_CI, Openvino_tokenizers ]
276275
uses: ./.github/workflows/job_pytorch_models_tests.yml
277276
with:
278277
runner: 'aks-linux-16-cores-32gb-arm'

.github/workflows/ubuntu_22.yml

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -590,10 +590,10 @@ jobs:
590590
device: 'igpu'
591591
test_type: ${{ matrix.TEST_TYPE }}
592592
runner: "[ 'self-hosted', 'igpu' ]"
593+
runner-group: 'Intel-GPU'
593594
image: ubuntu:22.04
594-
options: "--group-add 109 --group-add 44 --device /dev/dri:/dev/dri"
595-
# if: fromJSON(needs.smart_ci.outputs.affected_components).GPU
596-
if: ${{ 'false' }} # Ticket: 143677
595+
options: "--group-add 44 --group-add 993 --device /dev/dri/card1:/dev/dri/card1 --device /dev/dri/renderD128:/dev/dri/renderD128"
596+
if: fromJSON(needs.smart_ci.outputs.affected_components).GPU
597597

598598
dGPU:
599599
name: dGPU Tests
@@ -608,8 +608,9 @@ jobs:
608608
device: 'dgpu'
609609
test_type: ${{ matrix.TEST_TYPE }}
610610
runner: "[ 'self-hosted', 'dgpu' ]"
611+
runner-group: 'Intel-GPU'
611612
image: ubuntu:22.04
612-
options: "--group-add 109 --group-add 44 --device /dev/dri/card0:/dev/dri/card0 --device /dev/dri/renderD128:/dev/dri/renderD128"
613+
options: "--group-add 44 --group-add 993 --device /dev/dri/card2:/dev/dri/card2 --device /dev/dri/renderD129:/dev/dri/renderD129"
613614
# if: ${{ github.event_name == 'schedule' }}
614615
if: ${{ 'false' }} # Ticket: 143677
615616

docs/articles_en/about-openvino/release-notes-openvino/system-requirements.rst

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ CPU
1919

2020
.. tab-item:: Supported Hardware
2121

22-
* Intel® Core™ Ultra Series 1 and Series 2
22+
* Intel® Core™ Ultra Series 1, Series 2 and Series 3
2323
* Intel® Xeon® 6 processor
2424
* Intel Atom® Processor X Series
2525
* Intel Atom® processor with Intel® SSE4.2 support
Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
1+
// Copyright (C) 2018-2026 Intel Corporation
2+
// SPDX-License-Identifier: Apache-2.0
3+
//
4+
5+
#pragma once
6+
7+
#include <functional>
8+
#include <map>
9+
#include <memory>
10+
#include <optional>
11+
#include <set>
12+
#include <string>
13+
14+
#include "openvino/core/model.hpp"
15+
#include "openvino/frontend/extension/telemetry.hpp"
16+
#include "openvino/op/util/framework_node.hpp"
17+
#include "openvino/op/util/multi_subgraph_base.hpp"
18+
19+
namespace ov {
20+
namespace frontend {
21+
22+
/// \brief Structure containing information about unconverted operations
23+
/// Map of operation types with no conversion rule (op_type -> empty string)
24+
/// or operations that failed during conversion (op_type -> error message)
25+
struct UnconvertedOpsReport {
26+
std::map<std::string, std::string> unconverted_ops;
27+
28+
bool has_issues() const;
29+
30+
/// \brief Add an unconverted operation if not already present
31+
/// \param op_type Operation type name
32+
/// \param error_message Error message (empty if no converter found, non-empty if conversion failed)
33+
void add(const std::string& op_type, const std::string& error_message = {});
34+
35+
/// \brief Merge another report into this one
36+
void merge(const UnconvertedOpsReport& other);
37+
};
38+
39+
/// \brief Callback type for extracting unconverted operation info from framework-specific nodes
40+
/// \param node The node to check
41+
/// \return Optional pair of (op_type, error_message) if this is an unconverted framework node
42+
using FrameworkNodeExtractor =
43+
std::function<std::optional<std::pair<std::string, std::string>>(const std::shared_ptr<ov::Node>&)>;
44+
45+
/// \brief Collect unconverted operations from a model
46+
/// \param model The model to scan
47+
/// \param extractor Callback to extract info from framework-specific nodes
48+
/// \return Report containing all unconverted operations found
49+
UnconvertedOpsReport collect_unconverted_ops(const std::shared_ptr<ov::Model>& model,
50+
const FrameworkNodeExtractor& extractor);
51+
52+
/// \brief Callback type for adding additional error information
53+
/// \param unsupported_ops Set of unsupported operation types (those without error messages)
54+
/// \return Additional message to append to the error report
55+
using AdditionalErrorCallback = std::function<std::string(const std::set<std::string>&)>;
56+
57+
/// \brief Check conversion result, send telemetry, and optionally throw if there are unconverted operations
58+
/// \param report The unconverted operations report
59+
/// \param telemetry Telemetry extension (can be nullptr)
60+
/// \param telemetry_prefix Frontend name prefix for telemetry events (e.g., "pytorch", "tf", "onnx", "jax")
61+
/// \param error_message_prefix Prefix for filtering error messages in telemetry (e.g., "[PyTorch Frontend] ")
62+
/// If non-empty, error_info telemetry events will be sent
63+
/// \param additional_error Additional error message (e.g., from normalize step)
64+
/// \param additional_callback Optional callback for frontend-specific additional error messages
65+
/// \param throw_on_issues If true (default), throws when there are unconverted ops or additional_error is non-empty
66+
/// \throws ov::frontend::OpConversionFailure if throw_on_issues is true and there are issues
67+
void check_unconverted_ops(const UnconvertedOpsReport& report,
68+
const std::shared_ptr<TelemetryExtension>& telemetry,
69+
const std::string& telemetry_prefix,
70+
const std::string& error_message_prefix = {},
71+
const std::string& additional_error = {},
72+
const AdditionalErrorCallback& additional_callback = nullptr,
73+
bool throw_on_issues = true);
74+
75+
} // namespace frontend
76+
} // namespace ov
Lines changed: 147 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,147 @@
1+
// Copyright (C) 2018-2026 Intel Corporation
2+
// SPDX-License-Identifier: Apache-2.0
3+
//
4+
5+
#include "unconverted_ops_report.hpp"
6+
7+
#include <sstream>
8+
9+
#include "openvino/frontend/exception.hpp"
10+
#include "openvino/util/common_util.hpp"
11+
12+
namespace ov {
13+
namespace frontend {
14+
15+
bool UnconvertedOpsReport::has_issues() const {
16+
return !unconverted_ops.empty();
17+
}
18+
19+
void UnconvertedOpsReport::add(const std::string& op_type, const std::string& error_message) {
20+
if (unconverted_ops.find(op_type) == unconverted_ops.end()) {
21+
unconverted_ops[op_type] = error_message;
22+
}
23+
}
24+
25+
void UnconvertedOpsReport::merge(const UnconvertedOpsReport& other) {
26+
for (const auto& [op_type, msg] : other.unconverted_ops) {
27+
add(op_type, msg);
28+
}
29+
}
30+
31+
UnconvertedOpsReport collect_unconverted_ops(const std::shared_ptr<ov::Model>& model,
32+
const FrameworkNodeExtractor& extractor) {
33+
UnconvertedOpsReport report;
34+
if (!model) {
35+
return report;
36+
}
37+
38+
for (const auto& node : model->get_ordered_ops()) {
39+
// Try framework-specific extractor first
40+
if (auto result = extractor(node)) {
41+
report.add(result->first, result->second);
42+
}
43+
44+
// Handle MultiSubGraphOp (parent of Loop, If, etc.) - common for all frontends
45+
if (const auto& subgraph_op = ov::as_type_ptr<ov::op::util::MultiSubGraphOp>(node)) {
46+
for (size_t i = 0; i < subgraph_op->get_internal_subgraphs_size(); ++i) {
47+
report.merge(collect_unconverted_ops(subgraph_op->get_function(i), extractor));
48+
}
49+
}
50+
}
51+
return report;
52+
}
53+
54+
namespace {
55+
56+
std::string format_unconverted_ops_report(const UnconvertedOpsReport& report,
57+
const std::string& additional_error,
58+
const AdditionalErrorCallback& additional_callback) {
59+
std::stringstream error_msg;
60+
std::stringstream unconverted_ops_msg;
61+
std::stringstream failed_ops_msg;
62+
std::stringstream failed_ops_short;
63+
64+
error_msg << "Model wasn't fully converted.";
65+
unconverted_ops_msg << "-- No conversion rule found for operations: ";
66+
failed_ops_msg << " Failed operations detailed log:";
67+
failed_ops_short << "-- Conversion is failed for: ";
68+
69+
bool has_unsupported = false;
70+
bool has_failed = false;
71+
std::set<std::string> unsupported_ops_set;
72+
73+
for (const auto& [op_type, error] : report.unconverted_ops) {
74+
if (error.empty()) {
75+
// No conversion rule found
76+
if (has_unsupported) {
77+
unconverted_ops_msg << ", ";
78+
}
79+
unconverted_ops_msg << op_type;
80+
unsupported_ops_set.insert(op_type);
81+
has_unsupported = true;
82+
} else {
83+
// Conversion failed with error
84+
if (has_failed) {
85+
failed_ops_short << ", ";
86+
}
87+
failed_ops_short << op_type;
88+
failed_ops_msg << "\n-- " << op_type << " with a message:\n" << error;
89+
has_failed = true;
90+
}
91+
}
92+
93+
if (has_failed) {
94+
error_msg << failed_ops_msg.str();
95+
}
96+
97+
error_msg << "\nSummary:" << additional_error;
98+
99+
if (has_unsupported) {
100+
error_msg << '\n' << unconverted_ops_msg.str();
101+
}
102+
103+
if (has_failed) {
104+
error_msg << '\n' << failed_ops_short.str();
105+
}
106+
107+
// Add additional callback-provided information
108+
if (additional_callback && has_unsupported) {
109+
if (auto additional_info = additional_callback(unsupported_ops_set); !additional_info.empty()) {
110+
error_msg << '\n' << additional_info;
111+
}
112+
}
113+
114+
return error_msg.str();
115+
}
116+
117+
} // namespace
118+
119+
void check_unconverted_ops(const UnconvertedOpsReport& report,
120+
const std::shared_ptr<TelemetryExtension>& telemetry,
121+
const std::string& telemetry_prefix,
122+
const std::string& error_message_prefix,
123+
const std::string& additional_error,
124+
const AdditionalErrorCallback& additional_callback,
125+
bool throw_on_issues) {
126+
// Send telemetry for all unconverted operations
127+
if (telemetry) {
128+
const bool send_error_info = !error_message_prefix.empty();
129+
for (const auto& [op_type, error] : report.unconverted_ops) {
130+
telemetry->send_event("error_cause", telemetry_prefix + "_" + op_type);
131+
if (send_error_info && !error.empty()) {
132+
auto cropped_message = ov::util::filter_lines_by_prefix(error, error_message_prefix);
133+
if (!cropped_message.empty()) {
134+
telemetry->send_event("error_info", cropped_message);
135+
}
136+
}
137+
}
138+
}
139+
140+
if (throw_on_issues && (report.has_issues() || !additional_error.empty())) {
141+
FRONT_END_OP_CONVERSION_CHECK(false,
142+
format_unconverted_ops_report(report, additional_error, additional_callback));
143+
}
144+
}
145+
146+
} // namespace frontend
147+
} // namespace ov

0 commit comments

Comments
 (0)