From 051181922f186b333b72bcfba3c71b746478b938 Mon Sep 17 00:00:00 2001 From: Karol Blaszczak Date: Thu, 13 Jun 2024 12:19:45 +0200 Subject: [PATCH 01/31] DOCS benchmarks update 2 (#24997) --- .../about-openvino/performance-benchmarks.rst | 2 +- .../model-accuracy-int8-fp32.rst | 42 +++++++++--------- .../OV-2024.2-Performance-Data.xlsx | Bin 299643 -> 299700 bytes .../benchmarks_files/OV-benchmark-data.csv | 42 +++++++++--------- 4 files changed, 43 insertions(+), 43 deletions(-) diff --git a/docs/articles_en/about-openvino/performance-benchmarks.rst b/docs/articles_en/about-openvino/performance-benchmarks.rst index 57fd9ecfcb7ee2..4eaf34579d09b2 100644 --- a/docs/articles_en/about-openvino/performance-benchmarks.rst +++ b/docs/articles_en/about-openvino/performance-benchmarks.rst @@ -217,7 +217,7 @@ or 2024.2, as of June 17, 2024. * OpenVINO Model Server performance results are based on release - 2024.0, as of March 15, 2024. + 2024.1, as of April 26, 2024. The results may not reflect all publicly available updates. Intel technologies' features and benefits depend on system configuration and may require enabled hardware, software, or service diff --git a/docs/articles_en/about-openvino/performance-benchmarks/model-accuracy-int8-fp32.rst b/docs/articles_en/about-openvino/performance-benchmarks/model-accuracy-int8-fp32.rst index 73a0abb60bd22a..4c15d7ddc75499 100644 --- a/docs/articles_en/about-openvino/performance-benchmarks/model-accuracy-int8-fp32.rst +++ b/docs/articles_en/about-openvino/performance-benchmarks/model-accuracy-int8-fp32.rst @@ -37,7 +37,7 @@ the table for more information. - SQUAD_v1_1_bert_msl384_mql64_ds128_lowercase - F1 - 0.19% - - -0.06% + - 0.06% - 0.03% - 0.11% * - efficientdet-d0 @@ -104,18 +104,18 @@ the table for more information. - 0.04% - -0.08% * - chatGLM2-6b - - lambada openai + - Ceval-valid-high_school_history - ppl - - 0.75 - 0.75 - * - Llama-2-7b-chat - - Wiki, StackExch, Crawl + - Ceval-valid-high_school_history - ppl - - - 3.38 - - 3.27 + - 0.55 + - 0.25 - * - Stable-Diffusion-V2-1 - LIAON-5B @@ -125,18 +125,18 @@ the table for more information. - - * - Mistral-7b - - proprietary Mistral.ai + - Wikitext - ppl - - - 3.49 - - 3.19 + - 8.10 + - 8.10 - * - Falcon-7b-instruct - - Bai Ze (65%), GPT4All (25%), GPTeacher (5%), RefinedWeb-english (5%) + - Wikitext - ppl - - - - - + - 14.54 + - 14.55 - .. list-table:: Model Accuracy for BF16, FP32 and FP16 (FP16: Flex-170 only. BF16: Xeon(R) 8490H only) @@ -239,7 +239,7 @@ the table for more information. - 0.04% - -0.02% * - chatGLM2-6b - - lambada openai + - Ceval-valid-high_school_history - ppl - - 0.75 @@ -247,11 +247,11 @@ the table for more information. - - * - Llama-2-7b-chat - - Wiki, StackExch, Crawl + - Wikitext - ppl - - - 3.26 - - 3.26 + - 0.30 + - 0.55 - - * - Stable-Diffusion-V2-1 @@ -263,19 +263,19 @@ the table for more information. - - * - Mistral-7b - - proprietary Mistral.ai + - Wikitext - ppl - - - 3.18 - - 3.19 + - 8.09 + - 8.09 - - * - Falcon-7b-instruct - - Bai Ze (65%), GPT4All (25%), GPTeacher (5%), RefinedWeb-english (5%) + - Wikitext - ppl - - - - - + - 14.51 + - 14.51 - - diff --git a/docs/sphinx_setup/_static/benchmarks_files/OV-2024.2-Performance-Data.xlsx b/docs/sphinx_setup/_static/benchmarks_files/OV-2024.2-Performance-Data.xlsx index 36a06cb40c92420b848d06cab2fa6de4333ca236..7dc43dbd697e8c9f394528f02e9b87e1a2e0d7d9 100644 GIT binary patch delta 20851 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 Bzuy1= delta 20714 zcmZU4Q*X$;V?&_-Q>aSW# z(LPGh8hl|P!KuNWeUpE~5&$

?i%ndgAYp&%b~6KEdI48w-v?X`gvb`**a9mW(J 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 W0>CJR)WIqtGKExLT(y@(EBGI3hi#Mq diff --git a/docs/sphinx_setup/_static/benchmarks_files/OV-benchmark-data.csv b/docs/sphinx_setup/_static/benchmarks_files/OV-benchmark-data.csv index 28e69aa2208ec8..384581d6849f97 100644 --- a/docs/sphinx_setup/_static/benchmarks_files/OV-benchmark-data.csv +++ b/docs/sphinx_setup/_static/benchmarks_files/OV-benchmark-data.csv @@ -36,8 +36,8 @@ bert-base-cased,OV-2024.2,atom-iGPU,Intel® Celeron® 6305E iGPU-only,45.49,33.2 bert-base-cased,OV-2024.2,core-iGPU,Intel® Core™ i7-1185G7 iGPU-only,67.94,53.17,,0.159,2.426,426,28,1,426,28,58.5,FPS,FPS/$,FPS/TDP,msec.,,,,,, bert-base-cased,OV-2024.2,core-iGPU,Intel® Core™ i7-1185GRE iGPU-only,48.55,37.95,,0.099,3.237,490,15,1,490,15,81.28,FPS,FPS/$,FPS/TDP,msec.,,,,,, bert-base-cased,OV-2024.2,core-iGPU,Intel® Core™ i7-12700H iGPU-only,88.32,68.21,,0.175,1.962,502,45,1,502,45,45.08,FPS,FPS/$,FPS/TDP,msec.,,,,,, -bert-base-cased,OV-2024.2,core-iGPU,Intel® Core™ Ultra 7-165H NPU-only,73.24,61.12,,0.159,2.616,460,28,1,460,28,,FPS,FPS/$,FPS/TDP,msec.,,,,,, -bert-base-cased,OV-2024.2,core-iGPU,Intel® Core™ Ultra 7-165H iGPU-only,214.75,169.74,,0.467,7.670,460,28,1,460,28,,FPS,FPS/$,FPS/TDP,msec.,,,,,, +bert-base-cased,OV-2024.2,core-iGPU,Intel® Core™ Ultra 7-165H NPU-only,78,62.56,,0.170,2.786,460,28,1,460,28,16.98,FPS,FPS/$,FPS/TDP,msec.,,,,,, +bert-base-cased,OV-2024.2,core-iGPU,Intel® Core™ Ultra 7-165H iGPU-only,157.31,107.44,,0.342,5.618,460,28,1,460,28,24.97,FPS,FPS/$,FPS/TDP,msec.,,,,,, bert-base-cased,OV-2024.2,core-iGPU,Intel® Core™ i7-1360P iGPU-only,92.42,72.67,,0.192,3.3,480,28,1,480,28,42.96,FPS,FPS/$,FPS/TDP,msec.,,,,,, bert-base-cased,OV-2024.2,atom-CPU+iGPU,Intel Atom® x7425E CPU+iGPU,30.5,,12.29,0.526,2.542,58,12,1,58,12,,FPS,FPS/$,FPS/TDP,msec.,,,,,, bert-base-cased,OV-2024.2,atom-CPU+iGPU,Intel® Atom® X6425E CPU+iGPU,15.02,,10.32,0.224,1.252,67,12,1,67,12,,FPS,FPS/$,FPS/TDP,msec.,,,,,, @@ -85,8 +85,8 @@ bert-large-uncased-whole-word-masking-squad-0001,OV-2024.2,atom-iGPU,Intel® Cel bert-large-uncased-whole-word-masking-squad-0001,OV-2024.2,core-iGPU,Intel® Core™ i7-1185G7 iGPU-only,8.51,6.36,,0.019,0.304,426,28,1,426,28,451.85,FPS,FPS/$,FPS/TDP,msec.,,,,,, bert-large-uncased-whole-word-masking-squad-0001,OV-2024.2,core-iGPU,Intel® Core™ i7-1185GRE iGPU-only,5.14,4.39,,0.01,0.343,490,15,1,490,15,771.45,FPS,FPS/$,FPS/TDP,msec.,,,,,, bert-large-uncased-whole-word-masking-squad-0001,OV-2024.2,core-iGPU,Intel® Core™ i7-12700H iGPU-only,11.22,8.12,,0.022,0.249,502,45,1,502,45,356.37,FPS,FPS/$,FPS/TDP,msec.,,,,,, -bert-large-uncased-whole-word-masking-squad-0001,OV-2024.2,core-iGPU,Intel® Core™ Ultra 7-165H NPU-only,8.20,6.27,,0.018,0.293,460,28,1,460,28,,FPS,FPS/$,FPS/TDP,msec.,,,,,, -bert-large-uncased-whole-word-masking-squad-0001,OV-2024.2,core-iGPU,Intel® Core™ Ultra 7-165H iGPU-only,20.41,13.15,,0.044,0.729,460,28,1,460,28,,FPS,FPS/$,FPS/TDP,msec.,,,,,, +bert-large-uncased-whole-word-masking-squad-0001,OV-2024.2,core-iGPU,Intel® Core™ Ultra 7-165H NPU-only,8.47,6.33,,0.018,0.303,460,28,1,460,28,159.02,FPS,FPS/$,FPS/TDP,msec.,,,,,, +bert-large-uncased-whole-word-masking-squad-0001,OV-2024.2,core-iGPU,Intel® Core™ Ultra 7-165H iGPU-only,20.35,13.05,,0.044,0.727,460,28,1,460,28,205.630,FPS,FPS/$,FPS/TDP,msec.,,,,,, bert-large-uncased-whole-word-masking-squad-0001,OV-2024.2,core-iGPU,Intel® Core™ i7-1360P iGPU-only,11.1,8.39,,0.023,0.396,480,28,1,480,28,359.67,FPS,FPS/$,FPS/TDP,msec.,,,,,, bert-large-uncased-whole-word-masking-squad-0001,OV-2024.2,atom-CPU+iGPU,Intel Atom® x7425E CPU+iGPU,2.86,,1.08,0.049,0.238,58,12,1,58,12,,FPS,FPS/$,FPS/TDP,msec.,,,,,, bert-large-uncased-whole-word-masking-squad-0001,OV-2024.2,atom-CPU+iGPU,Intel® Atom® X6425E CPU+iGPU,1.12,,0.78,0.016,0.093,67,12,1,67,12,,FPS,FPS/$,FPS/TDP,msec.,,,,,, @@ -134,8 +134,8 @@ efficientdet-d0,OV-2024.2,atom-iGPU,Intel® Celeron® 6305E iGPU-only,72.29,60.6 efficientdet-d0,OV-2024.2,core-iGPU,Intel® Core™ i7-1185G7 iGPU-only,92.17,77.25,,0.216,3.291,426,28,1,426,28,42.92,FPS,FPS/$,FPS/TDP,msec.,,,,,, efficientdet-d0,OV-2024.2,core-iGPU,Intel® Core™ i7-1185GRE iGPU-only,55.9,43.01,,0.114,3.726,490,15,1,490,15,70.97,FPS,FPS/$,FPS/TDP,msec.,,,,,, efficientdet-d0,OV-2024.2,core-iGPU,Intel® Core™ i7-12700H iGPU-only,126.43,102.95,,0.251,2.809,502,45,1,502,45,31.37,FPS,FPS/$,FPS/TDP,msec.,,,,,, -efficientdet-d0,OV-2024.2,core-iGPU,Intel® Core™ Ultra 7-165H NPU-only,10.99,10.68,,0.024,0.393,460,28,1,460,28,,FPS,FPS/$,FPS/TDP,msec.,,,,,, -efficientdet-d0,OV-2024.2,core-iGPU,Intel® Core™ Ultra 7-165H iGPU-only,189.55,152.23,,0.412,6.770,460,28,1,460,28,,FPS,FPS/$,FPS/TDP,msec.,,,,,, +efficientdet-d0,OV-2024.2,core-iGPU,Intel® Core™ Ultra 7-165H NPU-only,37.00,34.81,,0.080,1.321,460,28,1,460,28,29.850,FPS,FPS/$,FPS/TDP,msec.,,,,,, +efficientdet-d0,OV-2024.2,core-iGPU,Intel® Core™ Ultra 7-165H iGPU-only,173.55,141.82,,0.377,6.198,460,28,1,460,28,20.320,FPS,FPS/$,FPS/TDP,msec.,,,,,, efficientdet-d0,OV-2024.2,core-iGPU,Intel® Core™ i7-1360P iGPU-only,112.8,91.27,,0.235,4.028,480,28,1,480,28,35.1,FPS,FPS/$,FPS/TDP,msec.,,,,,, efficientdet-d0,OV-2024.2,atom-CPU+iGPU,Intel Atom® x7425E CPU+iGPU,38.78,,19.85,0.668,3.232,58,12,1,58,12,,FPS,FPS/$,FPS/TDP,msec.,,,,,, efficientdet-d0,OV-2024.2,atom-CPU+iGPU,Intel® Atom® X6425E CPU+iGPU,23.46,,14.88,0.35,1.955,67,12,1,67,12,,FPS,FPS/$,FPS/TDP,msec.,,,,,, @@ -183,7 +183,7 @@ mask_rcnn_resnet50_atrous_coco,OV-2024.2,atom-iGPU,Intel® Celeron® 6305E iGPU- mask_rcnn_resnet50_atrous_coco,OV-2024.2,core-iGPU,Intel® Core™ i7-1185G7 iGPU-only,0.91,0.92,,0.002,0.032,426,28,1,426,28,4352.16,FPS,FPS/$,FPS/TDP,msec.,,,,,, mask_rcnn_resnet50_atrous_coco,OV-2024.2,core-iGPU,Intel® Core™ i7-1185GRE iGPU-only,0.58,0.56,,0.001,0.039,490,15,1,490,15,,FPS,FPS/$,FPS/TDP,msec.,,,,,, mask_rcnn_resnet50_atrous_coco,OV-2024.2,core-iGPU,Intel® Core™ i7-12700H iGPU-only,1.11,1.15,,0.002,0.024,502,45,1,502,45,3541.84,FPS,FPS/$,FPS/TDP,msec.,,,,,, -mask_rcnn_resnet50_atrous_coco,OV-2024.2,core-iGPU,Intel® Core™ Ultra 7-165H iGPU-only,1.72,1.41,,0.004,0.061,460,28,1,460,28,,FPS,FPS/$,FPS/TDP,msec.,,,,,, +mask_rcnn_resnet50_atrous_coco,OV-2024.2,core-iGPU,Intel® Core™ Ultra 7-165H iGPU-only,1.72,1.40,,0.004,0.061,460,28,1,460,28,2453.850,FPS,FPS/$,FPS/TDP,msec.,,,,,, mask_rcnn_resnet50_atrous_coco,OV-2024.2,core-iGPU,Intel® Core™ i7-1360P iGPU-only,1.05,1.17,,0.002,0.037,480,28,1,480,28,3768.92,FPS,FPS/$,FPS/TDP,msec.,,,,,, mask_rcnn_resnet50_atrous_coco,OV-2024.2,atom-CPU+iGPU,Intel Atom® x7425E CPU+iGPU,0.34,,0.12,0.005,0.028,58,12,1,58,12,,FPS,FPS/$,FPS/TDP,msec.,,,,,, mask_rcnn_resnet50_atrous_coco,OV-2024.2,atom-CPU+iGPU,Intel® Atom® X6425E CPU+iGPU,0.16,,0.09,0.002,0.013,67,12,1,67,12,,FPS,FPS/$,FPS/TDP,msec.,,,,,, @@ -231,8 +231,8 @@ mobilenet-v2,OV-2024.2,atom-iGPU,Intel® Celeron® 6305E iGPU-only,,513.53,,5.99 mobilenet-v2,OV-2024.2,core-iGPU,Intel® Core™ i7-1185G7 iGPU-only,803.21,599.78,,1.885,28.686,426,28,1,426,28,4.8,FPS,FPS/$,FPS/TDP,msec.,,,,,, mobilenet-v2,OV-2024.2,core-iGPU,Intel® Core™ i7-1185GRE iGPU-only,625.05,437.33,,1.275,41.67,490,15,1,490,15,6.28,FPS,FPS/$,FPS/TDP,msec.,,,,,, mobilenet-v2,OV-2024.2,core-iGPU,Intel® Core™ i7-12700H iGPU-only,1317.07,909.96,,2.623,29.268,502,45,1,502,45,2.93,FPS,FPS/$,FPS/TDP,msec.,,,,,, -mobilenet-v2,OV-2024.2,core-iGPU,Intel® Core™ Ultra 7-165H NPU-only,,,,0.000,0.000,460,28,1,460,28,,FPS,FPS/$,FPS/TDP,msec.,,,,,, -mobilenet-v2,OV-2024.2,core-iGPU,Intel® Core™ Ultra 7-165H iGPU-only,3389.93,,,7.369,121.069,460,28,1,460,28,,FPS,FPS/$,FPS/TDP,msec.,,,,,, +mobilenet-v2,OV-2024.2,core-iGPU,Intel® Core™ Ultra 7-165H NPU-only,2006.11,1275.19,,4.361,71.647,460,28,1,460,28,1.000,FPS,FPS/$,FPS/TDP,msec.,,,,,, +mobilenet-v2,OV-2024.2,core-iGPU,Intel® Core™ Ultra 7-165H iGPU-only,1441.87,,,3.135,51.495,460,28,1,460,28,2.680,FPS,FPS/$,FPS/TDP,msec.,,,,,, mobilenet-v2,OV-2024.2,core-iGPU,Intel® Core™ i7-1360P iGPU-only,1374.35,888.69,,2.863,49.084,480,28,1,480,28,2.82,FPS,FPS/$,FPS/TDP,msec.,,,,,, mobilenet-v2,OV-2024.2,atom-CPU+iGPU,Intel Atom® x7425E CPU+iGPU,439.37,,254.19,7.575,36.614,58,12,1,58,12,,FPS,FPS/$,FPS/TDP,msec.,,,,,, mobilenet-v2,OV-2024.2,atom-CPU+iGPU,Intel® Atom® X6425E CPU+iGPU,242.99,,166.55,3.626,20.249,67,12,1,67,12,,FPS,FPS/$,FPS/TDP,msec.,,,,,, @@ -280,8 +280,8 @@ resnet-50,OV-2024.2,atom-iGPU,Intel® Celeron® 6305E iGPU-only,209.86,118.26,,1 resnet-50,OV-2024.2,core-iGPU,Intel® Core™ i7-1185G7 iGPU-only,282.46,177.85,,0.663,10.087,426,28,1,426,28,13.8,FPS,FPS/$,FPS/TDP,msec.,,,,,, resnet-50,OV-2024.2,core-iGPU,Intel® Core™ i7-1185GRE iGPU-only,208.42,121.68,,0.425,13.895,490,15,1,490,15,18.84,FPS,FPS/$,FPS/TDP,msec.,,,,,, resnet-50,OV-2024.2,core-iGPU,Intel® Core™ i7-12700H iGPU-only,390.18,222.41,,0.777,8.67,502,45,1,502,45,10.05,FPS,FPS/$,FPS/TDP,msec.,,,,,, -resnet-50,OV-2024.2,core-iGPU,Intel® Core™ Ultra 7-165H NPU-only,784.63,378.66,,1.706,28.023,460,28,1,460,28,,FPS,FPS/$,FPS/TDP,msec.,,,,,, -resnet-50,OV-2024.2,core-iGPU,Intel® Core™ Ultra 7-165H iGPU-only,893.11,465.05,,1.942,31.897,460,28,1,460,28,,FPS,FPS/$,FPS/TDP,msec.,,,,,, +resnet-50,OV-2024.2,core-iGPU,Intel® Core™ Ultra 7-165H NPU-only,774.08,378.67,,1.683,27.646,460,28,1,460,28,2.920,FPS,FPS/$,FPS/TDP,msec.,,,,,, +resnet-50,OV-2024.2,core-iGPU,Intel® Core™ Ultra 7-165H iGPU-only,568.95,375.01,,1.237,20.320,460,28,1,460,28,6.750,FPS,FPS/$,FPS/TDP,msec.,,,,,, resnet-50,OV-2024.2,core-iGPU,Intel® Core™ i7-1360P iGPU-only,400.3,238.33,,0.833,14.296,480,28,1,480,28,9.7,FPS,FPS/$,FPS/TDP,msec.,,,,,, resnet-50,OV-2024.2,atom-CPU+iGPU,Intel Atom® x7425E CPU+iGPU,129.07,,41.95,2.225,10.756,58,12,1,58,12,,FPS,FPS/$,FPS/TDP,msec.,,,,,, resnet-50,OV-2024.2,atom-CPU+iGPU,Intel® Atom® X6425E CPU+iGPU,60.6,,31.68,0.904,5.05,67,12,1,67,12,,FPS,FPS/$,FPS/TDP,msec.,,,,,, @@ -328,7 +328,7 @@ ssd-resnet34-1200,OV-2024.2,atom-iGPU,Intel® Celeron® 6305E iGPU-only,5.17,2.7 ssd-resnet34-1200,OV-2024.2,core-iGPU,Intel® Core™ i7-1185G7 iGPU-only,8.33,4.69,,0.019,0.297,426,28,1,426,28,471.7,FPS,FPS/$,FPS/TDP,msec.,,,,,, ssd-resnet34-1200,OV-2024.2,core-iGPU,Intel® Core™ i7-1185GRE iGPU-only,5.56,3.03,,0.011,0.371,490,15,1,490,15,687.65,FPS,FPS/$,FPS/TDP,msec.,,,,,, ssd-resnet34-1200,OV-2024.2,core-iGPU,Intel® Core™ i7-12700H iGPU-only,10.5,5.99,,0.02,0.233,502,45,1,502,45,380.13,FPS,FPS/$,FPS/TDP,msec.,,,,,, -ssd-resnet34-1200,OV-2024.2,core-iGPU,Intel® Core™ Ultra 7-165H iGPU-only,17.24,10.11,,0.037,0.616,460,28,1,460,28,,FPS,FPS/$,FPS/TDP,msec.,,,,,, +ssd-resnet34-1200,OV-2024.2,core-iGPU,Intel® Core™ Ultra 7-165H iGPU-only,17.13,10.00,,0.037,0.612,460,28,1,460,28,250.530,FPS,FPS/$,FPS/TDP,msec.,,,,,, ssd-resnet34-1200,OV-2024.2,core-iGPU,Intel® Core™ i7-1360P iGPU-only,10.92,6.29,,0.022,0.39,480,28,1,480,28,361.15,FPS,FPS/$,FPS/TDP,msec.,,,,,, ssd-resnet34-1200,OV-2024.2,atom-CPU+iGPU,Intel Atom® x7425E CPU+iGPU,2.6,,0.7,0.044,0.217,58,12,1,58,12,,FPS,FPS/$,FPS/TDP,msec.,,,,,, ssd-resnet34-1200,OV-2024.2,atom-CPU+iGPU,Intel® Atom® X6425E CPU+iGPU,1.18,,0.61,0.017,0.098,67,12,1,67,12,,FPS,FPS/$,FPS/TDP,msec.,,,,,, @@ -376,8 +376,8 @@ ssd_mobilenet_v1_coco,OV-2024.2,atom-iGPU,Intel® Celeron® 6305E iGPU-only,409. ssd_mobilenet_v1_coco,OV-2024.2,core-iGPU,Intel® Core™ i7-1185G7 iGPU-only,503.19,314.58,,1.181,17.971,426,28,1,426,28,7.66,FPS,FPS/$,FPS/TDP,msec.,,,,,, ssd_mobilenet_v1_coco,OV-2024.2,core-iGPU,Intel® Core™ i7-1185GRE iGPU-only,362.48,227.51,,0.739,24.165,490,15,1,490,15,,FPS,FPS/$,FPS/TDP,msec.,,,,,, ssd_mobilenet_v1_coco,OV-2024.2,core-iGPU,Intel® Core™ i7-12700H iGPU-only,778.91,413.35,,1.551,17.309,502,45,1,502,45,5.04,FPS,FPS/$,FPS/TDP,msec.,,,,,, -ssd_mobilenet_v1_coco,OV-2024.2,core-iGPU,Intel® Core™ Ultra 7-165H NPU-only,265.84,189.62,,0.578,9.494,460,28,1,460,28,,FPS,FPS/$,FPS/TDP,msec.,,,,,, -ssd_mobilenet_v1_coco,OV-2024.2,core-iGPU,Intel® Core™ Ultra 7-165H iGPU-only,980.88,697.26,,2.132,35.031,460,28,1,460,28,,FPS,FPS/$,FPS/TDP,msec.,,,,,, +ssd_mobilenet_v1_coco,OV-2024.2,core-iGPU,Intel® Core™ Ultra 7-165H NPU-only,760.93,343.84,,1.654,27.176,460,28,1,460,28,3.190,FPS,FPS/$,FPS/TDP,msec.,,,,,, +ssd_mobilenet_v1_coco,OV-2024.2,core-iGPU,Intel® Core™ Ultra 7-165H iGPU-only,957.09,698.33,,2.081,34.182,460,28,1,460,28,3.950,FPS,FPS/$,FPS/TDP,msec.,,,,,, ssd_mobilenet_v1_coco,OV-2024.2,core-iGPU,Intel® Core™ i7-1360P iGPU-only,751.42,421.33,,1.565,26.836,480,28,1,480,28,5.17,FPS,FPS/$,FPS/TDP,msec.,,,,,, ssd_mobilenet_v1_coco,OV-2024.2,atom-CPU+iGPU,Intel Atom® x7425E CPU+iGPU,242.01,,93.56,4.172,20.167,58,12,1,58,12,,FPS,FPS/$,FPS/TDP,msec.,,,,,, ssd_mobilenet_v1_coco,OV-2024.2,atom-CPU+iGPU,Intel® Atom® X6425E CPU+iGPU,115.2,,65.37,1.719,9.6,67,12,1,67,12,,FPS,FPS/$,FPS/TDP,msec.,,,,,, @@ -425,8 +425,8 @@ unet-camvid-onnx-0001,OV-2024.2,atom-iGPU,Intel® Celeron® 6305E iGPU-only,8.34 unet-camvid-onnx-0001,OV-2024.2,core-iGPU,Intel® Core™ i7-1185G7 iGPU-only,14.8,7.63,,0.034,0.528,426,28,1,426,28,269.24,FPS,FPS/$,FPS/TDP,msec.,,,,,, unet-camvid-onnx-0001,OV-2024.2,core-iGPU,Intel® Core™ i7-1185GRE iGPU-only,,5.01,,0.018,0.612,490,15,1,490,15,,FPS,FPS/$,FPS/TDP,msec.,,,,,, unet-camvid-onnx-0001,OV-2024.2,core-iGPU,Intel® Core™ i7-12700H iGPU-only,18.33,9.58,,0.036,0.407,502,45,1,502,45,217.5,FPS,FPS/$,FPS/TDP,msec.,,,,,, -unet-camvid-onnx-0001,OV-2024.2,core-iGPU,Intel® Core™ Ultra 7-165H NPU-only,,9.01,,0.000,0.000,460,28,1,460,28,,FPS,FPS/$,FPS/TDP,msec.,,,,,, -unet-camvid-onnx-0001,OV-2024.2,core-iGPU,Intel® Core™ Ultra 7-165H iGPU-only,31.47,18.44,,0.068,1.124,460,28,1,460,28,,FPS,FPS/$,FPS/TDP,msec.,,,,,, +unet-camvid-onnx-0001,OV-2024.2,core-iGPU,Intel® Core™ Ultra 7-165H NPU-only,,9.57,,0.000,0.000,460,28,1,460,28,105.770,FPS,FPS/$,FPS/TDP,msec.,,,,,, +unet-camvid-onnx-0001,OV-2024.2,core-iGPU,Intel® Core™ Ultra 7-165H iGPU-only,31.19,18.44,,0.068,1.114,460,28,1,460,28,137.860,FPS,FPS/$,FPS/TDP,msec.,,,,,, unet-camvid-onnx-0001,OV-2024.2,core-iGPU,Intel® Core™ i7-1360P iGPU-only,19.52,10.13,,0.04,0.697,480,28,1,480,28,204.03,FPS,FPS/$,FPS/TDP,msec.,,,,,, unet-camvid-onnx-0001,OV-2024.2,atom-CPU+iGPU,Intel Atom® x7425E CPU+iGPU,4.09,,1.09,0.07,0.341,58,12,1,58,12,,FPS,FPS/$,FPS/TDP,msec.,,,,,, unet-camvid-onnx-0001,OV-2024.2,atom-CPU+iGPU,Intel® Atom® X6425E CPU+iGPU,1.19,,0.8,0.017,0.099,67,12,1,67,12,,FPS,FPS/$,FPS/TDP,msec.,,,,,, @@ -474,8 +474,8 @@ yolo_v3_tiny,OV-2024.2,atom-iGPU,Intel® Celeron® 6305E iGPU-only,315.59,157.19 yolo_v3_tiny,OV-2024.2,core-iGPU,Intel® Core™ i7-1185G7 iGPU-only,439.11,250.45,,1.03,15.682,426,28,1,426,28,8.78,FPS,FPS/$,FPS/TDP,msec.,,,,,, yolo_v3_tiny,OV-2024.2,core-iGPU,Intel® Core™ i7-1185GRE iGPU-only,321.43,164.05,,0.655,21.428,490,15,1,490,15,11.79,FPS,FPS/$,FPS/TDP,msec.,,,,,, yolo_v3_tiny,OV-2024.2,core-iGPU,Intel® Core™ i7-12700H iGPU-only,604.25,317.73,,1.203,13.427,502,45,1,502,45,6.43,FPS,FPS/$,FPS/TDP,msec.,,,,,, -yolo_v3_tiny,OV-2024.2,core-iGPU,Intel® Core™ Ultra 7-165H NPU-only,389.63,295.42,,0.847,13.915,460,28,1,460,28,,FPS,FPS/$,FPS/TDP,msec.,,,,,, -yolo_v3_tiny,OV-2024.2,core-iGPU,Intel® Core™ Ultra 7-165H iGPU-only,922.27,464.83,,2.005,32.938,460,28,1,460,28,,FPS,FPS/$,FPS/TDP,msec.,,,,,, +yolo_v3_tiny,OV-2024.2,core-iGPU,Intel® Core™ Ultra 7-165H NPU-only,392.96,296.33,,0.854,14.034,460,28,1,460,28,3.700,FPS,FPS/$,FPS/TDP,msec.,,,,,, +yolo_v3_tiny,OV-2024.2,core-iGPU,Intel® Core™ Ultra 7-165H iGPU-only,860.64,497.54,,1.871,30.737,460,28,1,460,28,4.470,FPS,FPS/$,FPS/TDP,msec.,,,,,, yolo_v3_tiny,OV-2024.2,core-iGPU,Intel® Core™ i7-1360P iGPU-only,619.4,333.58,,1.29,22.121,480,28,1,480,28,6.19,FPS,FPS/$,FPS/TDP,msec.,,,,,, yolo_v3_tiny,OV-2024.2,atom-CPU+iGPU,Intel Atom® x7425E CPU+iGPU,161.17,,49.21,2.778,13.431,58,12,1,58,12,,FPS,FPS/$,FPS/TDP,msec.,,,,,, yolo_v3_tiny,OV-2024.2,atom-CPU+iGPU,Intel® Atom® X6425E CPU+iGPU,77.82,,40.09,1.161,6.485,67,12,1,67,12,,FPS,FPS/$,FPS/TDP,msec.,,,,,, @@ -523,8 +523,8 @@ yolo_v8n,OV-2024.2,atom-iGPU,Intel® Celeron® 6305E iGPU-only,123.67,82.45,,1.1 yolo_v8n,OV-2024.2,core-iGPU,Intel® Core™ i7-1185G7 iGPU-only,168.87,115.97,,0.396,6.031,426,28,1,426,28,23.25,FPS,FPS/$,FPS/TDP,msec.,,,,,, yolo_v8n,OV-2024.2,core-iGPU,Intel® Core™ i7-1185GRE iGPU-only,116.32,74.05,,0.237,7.754,490,15,1,490,15,33.12,FPS,FPS/$,FPS/TDP,msec.,,,,,, yolo_v8n,OV-2024.2,core-iGPU,Intel® Core™ i7-12700H iGPU-only,220.25,148.98,,0.438,4.894,502,45,1,502,45,17.87,FPS,FPS/$,FPS/TDP,msec.,,,,,, -yolo_v8n,OV-2024.2,core-iGPU,Intel® Core™ Ultra 7-165H NPU-only,,96.51,,0.000,0.000,460,28,1,460,28,,FPS,FPS/$,FPS/TDP,msec.,,,,,, -yolo_v8n,OV-2024.2,core-iGPU,Intel® Core™ Ultra 7-165H iGPU-only,368.22,262.67,,0.800,13.151,460,28,1,460,28,,FPS,FPS/$,FPS/TDP,msec.,,,,,, +yolo_v8n,OV-2024.2,core-iGPU,Intel® Core™ Ultra 7-165H NPU-only,127.68,115.02,,0.278,4.560,460,28,1,460,28,9.620,FPS,FPS/$,FPS/TDP,msec.,,,,,, +yolo_v8n,OV-2024.2,core-iGPU,Intel® Core™ Ultra 7-165H iGPU-only,382.39,273.74,,0.831,13.657,460,28,1,460,28,10.000,FPS,FPS/$,FPS/TDP,msec.,,,,,, yolo_v8n,OV-2024.2,core-iGPU,Intel® Core™ i7-1360P iGPU-only,223.55,153.29,,0.465,7.983,480,28,1,480,28,17.53,FPS,FPS/$,FPS/TDP,msec.,,,,,, yolo_v8n,OV-2024.2,atom-CPU+iGPU,Intel Atom® x7425E CPU+iGPU,69.38,,28.52,1.196,5.781,58,12,1,58,12,,FPS,FPS/$,FPS/TDP,msec.,,,,,, yolo_v8n,OV-2024.2,atom-CPU+iGPU,Intel® Atom® X6425E CPU+iGPU,37.54,,22.63,0.56,3.128,67,12,1,67,12,,FPS,FPS/$,FPS/TDP,msec.,,,,,, @@ -584,4 +584,4 @@ stable-diffusion-v2-1,OV-2024.2,xeon,Intel® Xeon® Platinum 8580 CPU-only,,,,,, stable-diffusion-v2-1,OV-2024.2,accel,Intel® Data Center GPU Flex 170 dGPU,,,,,,2000,150,1,2000,150,,"Generation time, sec.",Generation time/$,Generation time/TDP,"Generation time, sec.",2.51,,,,, stable-diffusion-v2-1,OV-2024.2,accel,Intel® Arc™ A770M,,,,,,321,150,1,321,150,,"Generation time, sec.",Generation time/$,Generation time/TDP,"Generation time, sec.",2.91,,,,, stable-diffusion-v2-1,OV-2024.2,accel,Intel® Data Center GPU Flex 140 dGPU,,,,,,1900,75,1,1900,75,,"Generation time, sec.",Generation time/$,Generation time/TDP,"Generation time, sec.",25.36,,,,, -end_rec +end_rec \ No newline at end of file From 294addbebc943482da87a93807118ffbcbf0bb6b Mon Sep 17 00:00:00 2001 From: Maciej Smyk Date: Thu, 13 Jun 2024 12:29:36 +0200 Subject: [PATCH 02/31] [DOCS] Adding tabs to the Transformation Patterns article for master (#24998) Adding tabs to the Transformation Patterns article. --- .../patterns-python-api.rst | 240 ++++++++++++------ 1 file changed, 168 insertions(+), 72 deletions(-) diff --git a/docs/articles_en/documentation/openvino-extensibility/transformation-api/patterns-python-api.rst b/docs/articles_en/documentation/openvino-extensibility/transformation-api/patterns-python-api.rst index d10140c9268f30..bf113ad8ffb460 100644 --- a/docs/articles_en/documentation/openvino-extensibility/transformation-api/patterns-python-api.rst +++ b/docs/articles_en/documentation/openvino-extensibility/transformation-api/patterns-python-api.rst @@ -13,13 +13,21 @@ creation using OpenVINO™ API and helpful utilities to facilitate working with Before proceeding further, it is necessary to add some imports. These imports include the operations to be used and additional utilities described in this guide. Add the following lines to your file: -.. doxygensnippet:: ../../../assets/snippets/ov_patterns.py - :language: python - :fragment: [ov:imports] +.. tab-set:: -.. doxygensnippet:: ../../../assets/snippets/ov_patterns.cpp - :language: cpp - :fragment: [ov:imports] + .. tab-item:: Python + :sync: py + + .. doxygensnippet:: docs/articles_en/assets/snippets/ov_patterns.py + :language: python + :fragment: [ov:imports] + + .. tab-item:: C++ + :sync: cpp + + .. doxygensnippet:: docs/articles_en/assets/snippets/ov_patterns.cpp + :language: cpp + :fragment: [ov:imports] Pattern Creation +++++++++++++++++++++ @@ -32,26 +40,42 @@ Consider a straightforward pattern consisting of three nodes to be found in a gi Let's create the model and the pattern: -.. doxygensnippet:: ../../../assets/snippets/ov_patterns.py - :language: python - :fragment: [ov:create_simple_model_and_pattern] +.. tab-set:: + + .. tab-item:: Python + :sync: py + + .. doxygensnippet:: docs/articles_en/assets/snippets/ov_patterns.py + :language: python + :fragment: [ov:create_simple_model_and_pattern] -.. doxygensnippet:: ../../../assets/snippets/ov_patterns.cpp - :language: cpp - :fragment: [ov:create_simple_model_and_pattern] + .. tab-item:: C++ + :sync: cpp + + .. doxygensnippet:: docs/articles_en/assets/snippets/ov_patterns.cpp + :language: cpp + :fragment: [ov:create_simple_model_and_pattern] .. note:: This example uses testing utilities that directly compare given sequences of nodes. In reality, the process of finding a pattern within a model is more complicated. However, to focus only on patterns and their functionality, these details are intentionally omitted. Although the code is functional, in OpenVINO, patterns are typically not created using the same nodes as those used for creating the model. Instead, wrappers are preferred, providing additional functionality. For the given case, ``WrapType`` is used and the code looks as following: -.. doxygensnippet:: ../../../assets/snippets/ov_patterns.py - :language: python - :fragment: [ov:create_simple_model_and_pattern_wrap_type] +.. tab-set:: + + .. tab-item:: Python + :sync: py + + .. doxygensnippet:: docs/articles_en/assets/snippets/ov_patterns.py + :language: python + :fragment: [ov:create_simple_model_and_pattern_wrap_type] + + .. tab-item:: C++ + :sync: cpp -.. doxygensnippet:: ../../../assets/snippets/ov_patterns.cpp - :language: cpp - :fragment: [ov:create_simple_model_and_pattern_wrap_type] + .. doxygensnippet:: docs/articles_en/assets/snippets/ov_patterns.cpp + :language: cpp + :fragment: [ov:create_simple_model_and_pattern_wrap_type] 1. WrapType ++++++++++++++++++++++++++++++++++++++++ @@ -59,48 +83,80 @@ For the given case, ``WrapType`` is used and the code looks as following: ``WrapType`` is a wrapper used to store one or many types to match them. As demonstrated earlier, it is possible to specify a single type in ``WrapType`` and use it for matching. However, you can also list all possible types for a given node, for example: -.. doxygensnippet:: ../../../assets/snippets/ov_patterns.py - :language: python - :fragment: [ov:wrap_type_list] +.. tab-set:: -.. doxygensnippet:: ../../../assets/snippets/ov_patterns.cpp - :language: cpp - :fragment: [ov:wrap_type_list] + .. tab-item:: Python + :sync: py + + .. doxygensnippet:: docs/articles_en/assets/snippets/ov_patterns.py + :language: python + :fragment: [ov:wrap_type_list] + + .. tab-item:: C++ + :sync: cpp + + .. doxygensnippet:: docs/articles_en/assets/snippets/ov_patterns.cpp + :language: cpp + :fragment: [ov:wrap_type_list] Note that ``pattern_sig`` is created with the list ``["opset13.Relu", "opset13.Sigmoid"]``, meaning it can be either a ``Relu`` or a ``Sigmoid``. This feature enables matching the same pattern against different nodes. Essentially, ``WrapType`` can represent "one of listed" types. ``WrapType`` supports specifying more than two types. To add additional checks for your node, create a predicate by providing a function or a lambda. This function will be executed during matching, performing the additional validation specified in the logic of the function. For example, you might want to check the consumers count of a given node: -.. doxygensnippet:: ../../../assets/snippets/ov_patterns.py - :language: python - :fragment: [ov:wrap_type_predicate] +.. tab-set:: + + .. tab-item:: Python + :sync: py + + .. doxygensnippet:: docs/articles_en/assets/snippets/ov_patterns.py + :language: python + :fragment: [ov:wrap_type_predicate] -.. doxygensnippet:: ../../../assets/snippets/ov_patterns.cpp - :language: cpp - :fragment: [ov:wrap_type_predicate] + .. tab-item:: C++ + :sync: cpp + + .. doxygensnippet:: docs/articles_en/assets/snippets/ov_patterns.cpp + :language: cpp + :fragment: [ov:wrap_type_predicate] 2. AnyInput ++++++++++++++++++++++++++++++++++++++++ ``AnyInput`` is used when there is no need to specify a particular input for a given node. -.. doxygensnippet:: ../../../assets/snippets/ov_patterns.py - :language: python - :fragment: [ov:any_input] +.. tab-set:: + + .. tab-item:: Python + :sync: py + + .. doxygensnippet:: docs/articles_en/assets/snippets/ov_patterns.py + :language: python + :fragment: [ov:any_input] + + .. tab-item:: C++ + :sync: cpp -.. doxygensnippet:: ../../../assets/snippets/ov_patterns.cpp - :language: cpp - :fragment: [ov:any_input] + .. doxygensnippet:: docs/articles_en/assets/snippets/ov_patterns.cpp + :language: cpp + :fragment: [ov:any_input] You can also create ``AnyInput()`` with a predicate, if you want additional checks for you input. It will look similar to ``WrapType`` with a lambda or a function. For example, to ensure that the input has a rank of 4: -.. doxygensnippet:: ../../../assets/snippets/ov_patterns.py - :language: python - :fragment: [ov:any_input_predicate] +.. tab-set:: -.. doxygensnippet:: ../../../assets/snippets/ov_patterns.cpp - :language: cpp - :fragment: [ov:any_input_predicate] + .. tab-item:: Python + :sync: py + + .. doxygensnippet:: docs/articles_en/assets/snippets/ov_patterns.py + :language: python + :fragment: [ov:any_input_predicate] + + .. tab-item:: C++ + :sync: cpp + + .. doxygensnippet:: docs/articles_en/assets/snippets/ov_patterns.cpp + :language: cpp + :fragment: [ov:any_input_predicate] 3. Or ++++++++++++++++++++++++++++++++++++++++ @@ -113,13 +169,21 @@ facilitates this by creating two different branches (``Or`` supports more than t The red branch will not match, but it will work perfectly for the blue one. Here is how it looks in code: -.. doxygensnippet:: ../../../assets/snippets/ov_patterns.py - :language: python - :fragment: [ov:pattern_or] +.. tab-set:: + + .. tab-item:: Python + :sync: py + + .. doxygensnippet:: docs/articles_en/assets/snippets/ov_patterns.py + :language: python + :fragment: [ov:pattern_or] -.. doxygensnippet:: ../../../assets/snippets/ov_patterns.cpp - :language: cpp - :fragment: [ov:pattern_or] + .. tab-item:: C++ + :sync: cpp + + .. doxygensnippet:: docs/articles_en/assets/snippets/ov_patterns.cpp + :language: cpp + :fragment: [ov:pattern_or] Note that matching will succeed for the first matching branch and the remaining ones will not be checked. @@ -133,43 +197,75 @@ unfolding into two branches: The code for our model looks as follows: -.. doxygensnippet:: ../../../assets/snippets/ov_patterns.py - :language: python - :fragment: [ov:pattern_optional_middle] +.. tab-set:: + + .. tab-item:: Python + :sync: py + + .. doxygensnippet:: docs/articles_en/assets/snippets/ov_patterns.py + :language: python + :fragment: [ov:pattern_optional_middle] + + .. tab-item:: C++ + :sync: cpp -.. doxygensnippet:: ../../../assets/snippets/ov_patterns.cpp - :language: cpp - :fragment: [ov:pattern_optional_middle] + .. doxygensnippet:: docs/articles_en/assets/snippets/ov_patterns.cpp + :language: cpp + :fragment: [ov:pattern_optional_middle] The ``Optional`` does not necessarily have to be in the middle of the pattern. It can be a top node and a root node. Top node: -.. doxygensnippet:: ../../../assets/snippets/ov_patterns.py - :language: python - :fragment: [ov:pattern_optional_top] +.. tab-set:: -.. doxygensnippet:: ../../../assets/snippets/ov_patterns.cpp - :language: cpp - :fragment: [ov:pattern_optional_top] + .. tab-item:: Python + :sync: py + + .. doxygensnippet:: docs/articles_en/assets/snippets/ov_patterns.py + :language: python + :fragment: [ov:pattern_optional_top] + + .. tab-item:: C++ + :sync: cpp + + .. doxygensnippet:: docs/articles_en/assets/snippets/ov_patterns.cpp + :language: cpp + :fragment: [ov:pattern_optional_top] Root node: -.. doxygensnippet:: ../../../assets/snippets/ov_patterns.py - :language: python - :fragment: [ov:pattern_optional_root] +.. tab-set:: + + .. tab-item:: Python + :sync: py + + .. doxygensnippet:: docs/articles_en/assets/snippets/ov_patterns.py + :language: python + :fragment: [ov:pattern_optional_root] -.. doxygensnippet:: ../../../assets/snippets/ov_patterns.cpp - :language: cpp - :fragment: [ov:pattern_optional_root] + .. tab-item:: C++ + :sync: cpp + + .. doxygensnippet:: docs/articles_en/assets/snippets/ov_patterns.cpp + :language: cpp + :fragment: [ov:pattern_optional_root] ``Optional`` also supports adding a predicate the same way ``WrapType`` and ``AnyInput`` do: -.. doxygensnippet:: ../../../assets/snippets/ov_patterns.py - :language: python - :fragment: [ov:optional_predicate] +.. tab-set:: + + .. tab-item:: Python + :sync: py + + .. doxygensnippet:: docs/articles_en/assets/snippets/ov_patterns.py + :language: python + :fragment: [ov:optional_predicate] + + .. tab-item:: C++ + :sync: cpp -.. doxygensnippet:: ../../../assets/snippets/ov_patterns.cpp - :language: cpp - :fragment: [ov:optional_predicate] \ No newline at end of file + .. doxygensnippet:: docs/articles_en/assets/snippets/ov_patterns.cpp + :language: cpp + :fragment: [ov:optional_predicate] \ No newline at end of file From d2019ebd4c318586b8e8bee5d764b1ec2bfd3f33 Mon Sep 17 00:00:00 2001 From: Evgeny Talanin Date: Thu, 13 Jun 2024 14:42:02 +0400 Subject: [PATCH 03/31] [DOCS] Update system-requirements.rst (#24988) ### Details: - *item1* - *...* ### Tickets: - *ticket-id* --- .../system-requirements.rst | 30 +++++++------------ 1 file changed, 10 insertions(+), 20 deletions(-) diff --git a/docs/articles_en/about-openvino/release-notes-openvino/system-requirements.rst b/docs/articles_en/about-openvino/release-notes-openvino/system-requirements.rst index ed2533e1cb405c..361bb24089cd86 100644 --- a/docs/articles_en/about-openvino/release-notes-openvino/system-requirements.rst +++ b/docs/articles_en/about-openvino/release-notes-openvino/system-requirements.rst @@ -19,6 +19,7 @@ CPU .. tab-item:: Supported Hardware + * Intel Atom® Processor X Series * Intel Atom® processor with Intel® SSE4.2 support * Intel® Pentium® processor N4200/5, N3350/5, N3450/5 with Intel® HD Graphics * 6th - 14th generation Intel® Core™ processors @@ -28,17 +29,16 @@ CPU .. tab-item:: Supported Operating Systems - * Ubuntu 24.04 long-term support (LTS), 64-bit (Kernel 6.8+) * Ubuntu 22.04 long-term support (LTS), 64-bit (Kernel 5.15+) * Ubuntu 20.04 long-term support (LTS), 64-bit (Kernel 5.15+) * Ubuntu 18.04 long-term support (LTS) with limitations, 64-bit (Kernel 5.4+) - * Windows 10 - * Windows 11 + * Windows 10, 64-bit + * Windows 11, 64-bit * macOS 12.6 and above, 64-bit and ARM64 * CentOS 7 * Red Hat Enterprise Linux 8, 64-bit * openSUSE Tumbleweed, 64-bit and ARM64 - * Ubuntu 18 ARM64 + * Ubuntu 20.04 ARM64 GPU ########## @@ -58,7 +58,6 @@ GPU .. tab-item:: Supported Operating Systems - * Ubuntu 24.04 long-term support (LTS), 64-bit * Ubuntu 22.04 long-term support (LTS), 64-bit * Ubuntu 20.04 long-term support (LTS), 64-bit * Windows 10, 64-bit @@ -88,7 +87,6 @@ Intel® Neural Processing Unit .. tab-item:: Operating Systems for NPU - * Ubuntu 24.04 long-term support (LTS), 64-bit * Ubuntu 22.04 long-term support (LTS), 64-bit * Windows 11, 64-bit (22H2, 23H2) @@ -107,7 +105,6 @@ Operating systems and developer environment .. tab-item:: Linux OS - * Ubuntu 24.04 with Linux kernel 6.8+ * Ubuntu 22.04 with Linux kernel 5.15+ * Ubuntu 20.04 with Linux kernel 5.15+ * Red Hat Enterprise Linux 8 with Linux kernel 5.4 @@ -122,11 +119,9 @@ Operating systems and developer environment * `GNU Compiler Collection (GCC) `__ 7.5 and above * `CMake `__ 3.13 or higher - Higher versions of kernel might be required for 10th Gen Intel® Core™ Processors, 11th Gen - Intel® Core™ Processors, 11th Gen Intel® Core™ Processors S-Series Processors, 12th Gen - Intel® Core™ Processors, 13th Gen Intel® Core™ Processors, 14th Gen - Intel® Core™ Processors, Intel® Core™ Ultra Processors, 4th Gen Intel® Xeon® Scalable Processors - or 5th Gen Intel® Xeon® Scalable Processors to support CPU, GPU, GNA or hybrid-cores CPU capabilities. + Higher versions of kernel might be required for 10th Gen Intel® Core™ Processors and above, + Intel® Core™ Ultra Processors, 4th Gen Intel® Xeon® Scalable Processors and above + to support CPU, GPU, NPU or hybrid-cores CPU capabilities. .. tab-item:: Windows 10 and 11 @@ -150,9 +145,9 @@ Operating systems and developer environment .. tab-item:: DL frameworks versions: - * TensorFlow 1.15, 2.13.1 + * TensorFlow 1.15.5, 2.16.1 * ONNX 1.15 - * PaddlePaddle 2.5 + * PaddlePaddle 2.6 This package can be installed on other versions of DL Frameworks but only the versions specified here are fully validated. @@ -160,12 +155,7 @@ Operating systems and developer environment .. note:: - OpenVINO Python binaries and binaries on Windows, CentOS 7, and macOS (x86) are built - with oneTBB libraries, and others on Ubuntu and RedHat systems are built with - legacy TBB which is released by OS distribution. OpenVINO can be built from source - with either oneTBB or legacy TBB on all the systems listed here. System - compatibility and performance are improved on Hybrid CPUs - such as 12th Gen Intel Core and above. + OpenVINO Python binaries are built with and redistribute oneTBB libraries. From 5769fabf5683a2bccda015d82d5c48f92ab0e381 Mon Sep 17 00:00:00 2001 From: Edward Shogulin Date: Thu, 13 Jun 2024 11:56:06 +0100 Subject: [PATCH 04/31] [LPT] ReduceSum: zero point support (#24977) ### Details: - *[LPT] ReduceSum: zero point support* ### Tickets: - *CVS-142256* --- .../src/reduce_sum.cpp | 15 ++++- .../tests/reduce_sum_transformation.cpp | 64 +++++++++++++++++++ src/core/src/op/multiply.cpp | 2 +- 3 files changed, 78 insertions(+), 3 deletions(-) diff --git a/src/common/low_precision_transformations/src/reduce_sum.cpp b/src/common/low_precision_transformations/src/reduce_sum.cpp index 63534ddef290e9..155d64b508043e 100644 --- a/src/common/low_precision_transformations/src/reduce_sum.cpp +++ b/src/common/low_precision_transformations/src/reduce_sum.cpp @@ -69,10 +69,21 @@ void ReduceSumTransformation::changeDequantizationValues( // (a1 - s) + (a2 - s) + ... + (an - s) = (a1 + a2 + ... + an) - n * s const auto reductionSizeConstant = ov::opset1::Constant::create(deqPrecision, Shape{}, { static_cast(reductionSize) }); - const auto result = fold(dequantization.subtractConstant, reductionSizeConstant); + OPENVINO_ASSERT(deqPrecision == dequantization.subtract->get_input_element_type(0), + "dequantization precision ", deqPrecision, + " differs from zero point 0 input ", dequantization.subtract->get_input_element_type(0)); + const auto result = fold( + foldConvert(dequantization.subtractConstant, deqPrecision), + reductionSizeConstant); + + replace_node( + dequantization.subtractConvert != nullptr ? + std::dynamic_pointer_cast(dequantization.subtractConvert) : + dequantization.subtractConstant, + result); - replace_node(dequantization.subtractConstant, result); dequantization.subtractConstant = ov::as_type_ptr(result); + dequantization.subtractConvert = nullptr; } } diff --git a/src/common/low_precision_transformations/tests/reduce_sum_transformation.cpp b/src/common/low_precision_transformations/tests/reduce_sum_transformation.cpp index 8faa9a0fdd6074..6f306d24db746e 100644 --- a/src/common/low_precision_transformations/tests/reduce_sum_transformation.cpp +++ b/src/common/low_precision_transformations/tests/reduce_sum_transformation.cpp @@ -336,4 +336,68 @@ INSTANTIATE_TEST_SUITE_P( ::testing::ValuesIn(reduceSumTransformationTestValues)), ReduceSumTransformation::getTestCaseName); } // namespace testValues2 + +namespace testValues3 { + const std::vector inputShapes = { + {4, 3, 16, 16} + }; + + const std::vector reduceSumTransformationTestValues = { + { + LayerTransformation::createParamsU8I8(), + {0}, + true, + { + ov::element::u8, + { + {ov::element::f32}, + {{40.f, 80.f, 120.f}, ov::element::f32, {1, 3, 1, 1}, false, 1ul, ov::element::u8, true}, + {{0.1f, 1.f, 10.f}, ov::element::f32, {1, 3, 1, 1}} + } + }, + { + ov::element::u8, + {}, + ov::element::f32, + { + {}, + {{160.f, 320.f, 480.f}, ov::element::f32, {1, 3, 1, 1}}, + {{0.1f, 1.f, 10.f}, ov::element::f32, {1, 3, 1, 1}} + } + } + }, + { + LayerTransformation::createParamsU8I8(), + {0}, + true, + { + ov::element::i8, + { + {ov::element::f32}, + {{40.f, 80.f, 120.f}, ov::element::f32, {1, 3, 1, 1}, false, 1ul, ov::element::i8, true}, + {{0.1f, 1.f, 10.f}, ov::element::f32, {1, 3, 1, 1}} + } + }, + { + ov::element::i8, + {}, + ov::element::f32, + { + {}, + {{160.f, 320.f, 480.f}, ov::element::f32, {1, 3, 1, 1}}, + {{0.1f, 1.f, 10.f}, ov::element::f32, {1, 3, 1, 1}} + } + } + } + }; + + INSTANTIATE_TEST_SUITE_P( + smoke_LPT, + ReduceSumTransformation, + ::testing::Combine( + ::testing::ValuesIn(inputShapes), + ::testing::ValuesIn(reduceSumTransformationTestValues)), + ReduceSumTransformation::getTestCaseName); +} // namespace testValues3 + } // namespace diff --git a/src/core/src/op/multiply.cpp b/src/core/src/op/multiply.cpp index fa3ef518c03202..88dbd347d46edf 100644 --- a/src/core/src/op/multiply.cpp +++ b/src/core/src/op/multiply.cpp @@ -51,7 +51,7 @@ bool Multiply::evaluate(TensorVector& outputs, const TensorVector& inputs) const this, outputs, inputs, - OV_PP_ET_LIST(f32, f64, i32, i64, u32, u64), + OV_PP_ET_LIST(f32, f64, i8, i32, i64, u8, u32, u64), multiply::Evaluate, inputs[0].get_element_type(), inputs[0], From 033a63d1f25a9750796eb6adb96891aabf8a2232 Mon Sep 17 00:00:00 2001 From: Karol Blaszczak Date: Thu, 13 Jun 2024 14:35:35 +0200 Subject: [PATCH 05/31] [DOCS] releasenotes 24.2 first pass (#24986) --- .../about-openvino/release-notes-openvino.rst | 714 ++++++++++++------ .../system-requirements.rst | 2 +- .../install-openvino-archive-linux.rst | 2 +- .../integrate-openvino-with-ubuntu-snap.rst | 6 +- docs/sphinx_setup/_static/css/custom.css | 6 +- 5 files changed, 498 insertions(+), 232 deletions(-) diff --git a/docs/articles_en/about-openvino/release-notes-openvino.rst b/docs/articles_en/about-openvino/release-notes-openvino.rst index 2ad5a1c674ac7b..68c64e83a61aa0 100644 --- a/docs/articles_en/about-openvino/release-notes-openvino.rst +++ b/docs/articles_en/about-openvino/release-notes-openvino.rst @@ -14,44 +14,57 @@ OpenVINO Release Notes -2024.1 - 24 April 2024 +2024.2 - 17 June 2024 ############################# :doc:`System Requirements <./release-notes-openvino/system-requirements>` | :doc:`Release policy <./release-notes-openvino/release-policy>` | :doc:`Installation Guides <./../get-started/install-openvino>` + What's new +++++++++++++++++++++++++++++ * More Gen AI coverage and framework integrations to minimize code changes. - * Mixtral and URLNet models optimized for performance improvements on Intel® Xeon® processors. - * Stable Diffusion 1.5, ChatGLM3-6B, and Qwen-7B models optimized for improved inference speed - on Intel® Core™ Ultra processors with integrated GPU. - * Support for Falcon-7B-Instruct, a GenAI Large Language Model (LLM) ready-to-use chat/instruct - model with superior performance metrics. - * New Jupyter Notebooks added: YOLO V9, YOLO V8 Oriented Bounding Boxes Detection (OOB), Stable - Diffusion in Keras, MobileCLIP, RMBG-v1.4 Background Removal, Magika, TripoSR, AnimateAnyone, - LLaVA-Next, and RAG system with OpenVINO and LangChain. - -* Broader LLM model support and more model compression techniques. - - * LLM compilation time reduced through additional optimizations with compressed embedding. - Improved 1st token performance of LLMs on 4th and 5th generations of Intel® Xeon® processors - with Intel® Advanced Matrix Extensions (Intel® AMX). - * Better LLM compression and improved performance with oneDNN, INT4, and INT8 support for - Intel® Arc™ GPUs. - * Significant memory reduction for select smaller GenAI models on Intel® Core™ Ultra processors - with integrated GPU. + * Llama 3 optimizations for CPUs, built-in GPUs, and discrete GPUs for improved performance + and efficient memory usage. + * Support for Phi-3-mini, a family of AI models that leverages the power of small language + models for faster, more accurate and cost-effective text processing. + * Python Custom Operation is now enabled in OpenVINO making it easier for Python developers + to code their custom operations instead of using C++ custom operations (also supported). + Python Custom Operation empowers users to implement their own specialized operations into + any model. + * Notebooks expansion to ensure better coverage for new models. Noteworthy notebooks added: + DynamiCrafter, YOLOv10, and Chatbot notebook with Phi-3. + + +* Broader Large Language Model (LLM) support and more model compression techniques. + + * GPTQ method for 4-bit weight compression added to NNCF for more efficient inference and + improved performance of compressed LLMs. + * Significant LLM performance improvements and reduced latency for both built-in GPUs and + discrete GPUs. + * Significant improvement in 2nd token latency and memory footprint of FP16 weight LLMs on + AVX2 (13th Gen Intel® Core™ processors) and AVX512 (3rd Gen Intel® Xeon® Scalable Processors) + based CPU platforms, particularly for small batch sizes. * More portability and performance to run AI at the edge, in the cloud, or locally. - * The preview NPU plugin for Intel® Core™ Ultra processors is now available in the OpenVINO - open-source GitHub repository, in addition to the main OpenVINO package on PyPI. - * The JavaScript API is now more easily accessible through the npm repository, enabling - JavaScript developers' seamless access to the OpenVINO API. - * FP16 inference on ARM processors now enabled for the Convolutional Neural Network (CNN) by - default. + * Model Serving Enhancements: + + * OpenVINO Model Server (OVMS) now supports OpenAI-compatible API along with Continuous + Batching and PagedAttention, enabling significantly higher throughput for parallel + inferencing, especially on Intel® Xeon® processors, when serving LLMs to many concurrent + users. + * OpenVINO backend for Triton Server now supports built-in GPUs and discrete GPUs, in + addition to dynamic shapes support. + * Integration of TorchServe through torch.compile OpenVINO backend for easy model deployment, + provisioning to multiple instances, model versioning, and maintenance. + + * Addition of the Generate API, a simplified API for text generation using large language + models with only a few lines of code. The API is available through the newly launched + OpenVINO GenAI package. + * Preview: Support for Intel® Xeon® 6 processor. OpenVINO™ Runtime @@ -60,218 +73,467 @@ OpenVINO™ Runtime Common ----------------------------- -* Unicode file paths for cached models are now supported on Windows. -* Pad pre-processing API to extend input tensor on edges with constants. -* A fix for inference failures of certain image generation models has been implemented - (fused I/O port names after transformation). -* Compiler's warnings-as-errors option is now on, improving the coding criteria and quality. - Build warnings will not be allowed for new OpenVINO code and the existing warnings have been - fixed. +* Operations and data types using UINT2, UINT3, and UINT6 are now supported, to allow for a more + efficient LLM weight compression. +* Common OV headers have been optimized, improving binary compilation time and reducing binary + size. +* Support for Intel Atom® Processor X Series has been added. For more details, see + :doc:`System Requirements <./release-notes-openvino/system-requirements>`. + AUTO Inference Mode ----------------------------- -* Returning the ov::enable_profiling value from ov::CompiledModel is now supported. +* AUTO takes model caching into account when choosing the device for fast first-inference latency. + If model cache is already in place, AUTO will directly use the selected device instead of + temporarily leveraging CPU as first-inference device. +* Dynamic models are now loaded to the selected device, instead of loading to CPU without + considering device priority. +* Fixed the exceptions when use AUTO with stateful models having dynamic input or output. + CPU Device Plugin ----------------------------- -* 1st token performance of LLMs has been improved on the 4th and 5th generations of Intel® Xeon® - processors with Intel® Advanced Matrix Extensions (Intel® AMX). -* LLM compilation time and memory footprint have been improved through additional optimizations - with compressed embeddings. -* Performance of MoE (e.g. Mixtral), Gemma, and GPT-J has been improved further. -* Performance has been improved significantly for a wide set of models on ARM devices. -* FP16 inference precision is now the default for all types of models on ARM devices. -* CPU architecture-agnostic build has been implemented, to enable unified binary distribution - on different ARM devices. +* Performance when using latency mode in FP32 precision has been improved on Intel client + platforms, including Core Ultra (codename Meteor Lake) and 13th Gen Core processors + (codename Raptor Lake). +* 2nd token latency and memory footprint for FP16 LLMs have been improved significantly on AVX2 + and AVX512 based CPU platforms, particularly for small batch sizes. +* PagedAttention has been optimized on AVX2, AVX512 and AMX platforms together with INT8 KV cache + support to improve the performance when serving LLM workloads on Intel CPUs. +* LLMs with shared embeddings have been optimized to improve performance and memory consumption + on several models including Gemma. +* Performance on ARM-based servers is significantly improved with upgrade to TBB 2021.2.5. +* Improved FP32 and FP16 performance on ARM CPU. + GPU Device Plugin ----------------------------- +* Both first token and average token latency of LLMs is improved on all GPU platforms, most + significantly on discrete GPUs. Memory usage of LLMs has been reduced as well. +* Stable Diffusion FP16 performance improved on Core Ultra platforms, with significant pipeline + improvement for models with dynamic-shaped input. Memory usage of the pipeline has been reduced, + as well. +* Improved performance of optimized permute_f_y kernel. -* LLM first token latency has been improved on both integrated and discrete GPU platforms. -* For the ChatGLM3-6B model, average token latency has been improved on integrated GPU platforms. -* For Stable Diffusion 1.5 FP16 precision, performance has been improved on Intel® Core™ Ultra - processors. NPU Device Plugin ----------------------------- -* NPU Plugin is now part of the OpenVINO GitHub repository. All the most recent plugin changes - will be immediately available in the repo. Note that NPU is part of Intel® Core™ Ultra - processors. -* New OpenVINO™ notebook “Hello, NPU!” introducing NPU usage with OpenVINO has been added. -* Version 22H2 or later is required for Microsoft Windows® 11 64-bit to run inference on NPU. +* TBD + OpenVINO Python API ----------------------------- -* GIL-free creation of RemoteTensors is now used - holding GIL means that the process is not suited - for multithreading and removing the GIL lock will increase performance which is critical for - the concept of Remote Tensors. -* Packed data type BF16 on the Python API level has been added, opening a new way of supporting - data types not handled by numpy. -* 'pad' operator support for ov::preprocess::PrePostProcessorItem has been added. -* ov.PartialShape.dynamic(int) definition has been provided. +* Writing custom Python operators is now supported for basic scenarios (alignment with OpenVINO + C++ API.) This empowers users to implement their own specialized operations into any model. + Full support with more advanced features is within the scope of upcoming releases. OpenVINO C API ----------------------------- +* More element types are now supported to algin with the OpenVINO C++ API. -* Two new pre-processing APIs for scale and mean have been added. OpenVINO Node.js API ----------------------------- -* New methods to align JavaScript API with CPP API have been added, such as - CompiledModel.exportModel(), core.import_model(), Core set/get property and Tensor.get_size(), - and Model.is_dynamic(). -* Documentation has been extended to help developers start integrating JavaScript applications - with OpenVINO™. +* OpenVINO node.js packages now support the electron.js framework. +* Extended and improved JS API documentation for more complete usage guidelines. +* Better JS API alignment with OpenVINO C++ API, delivering more advanced features to JS users. + TensorFlow Framework Support ----------------------------- -* `tf.keras.layers.TextVectorization tokenizer `__ - is now supported. -* Conversion of models with Variable and HashTable (dictionary) resources has been improved. -* 8 NEW operations have been added - (`see the list here, marked as NEW `__). -* 10 operations have received complex tensor support. -* Input tensor names for TF1 models have been adjusted to have a single name per input. -* Hugging Face model support coverage has increased significantly, due to: +* 3 new operations are now supported. See operations marked as `NEW here `__. +* LookupTableImport has received better support, required for 2 models from TF Hub: + + * mil-nce + * openimages-v4-ssd-mobilenet-v2 + - * extraction of input signature of a model in memory has been fixed, - * reading of variable values for a model in memory has been fixed. +TensorFlow Lite Framework Support +---------------------------------- + +* The GELU operation required for customer model is now supported. PyTorch Framework Support ----------------------------- -* ModuleExtension, a new type of extension for PyTorch models is now supported - (`PR #23536 `__). -* 22 NEW operations have been added. -* Experimental support for models produced by torch.export (FX graph) has been added - (`PR #23815 `__). +* 9 new operations are now supported. +* aten::set_item now supports negative indices. +* Issue with adaptive pool when shape is list has been fixed (PR `#24586 `__). + -ONNX Framework Support +ONNX Support ----------------------------- -* 8 new operations have been added. + +* The InputModel interface should be used from now on, instead of a number of deprecated APIs + and class symbols +* Translation for ReduceMin-18 and ReduceSumSquare-18 operators has been added, to address + customer model requests +* Behavior of the Gelu-20 operator has been fixed for the case when “none” is set as the + default value. OpenVINO Model Server +++++++++++++++++++++++++++++ -* OpenVINO™ Runtime backend used is now 2024.1 -* OpenVINO™ models with String data type on output are supported. Now, OpenVINO™ Model Server - can support models with input and output of the String type, so developers can take advantage - of the tokenization built into the model as the first layer. Developers can also rely on any - postprocessing embedded into the model which returns text only. Check the - `demo on string input data with the universal-sentence-encoder model `__ - and the - `String output model demo `__. -* MediaPipe Python calculators have been updated to support relative paths for all related - configuration and Python code files. Now, the complete graph configuration folder can be - deployed in an arbitrary path without any code changes. -* KServe REST API support has been extended to properly handle the string format in JSON body, - just like the binary format compatible with NVIDIA Triton™. -* `A demo showcasing a full RAG algorithm `__ - fully delegated to the model server has been added. +* OpenVINO Model server can be now used for text generation use cases using OpenAI compatible API. +* Added support for continuous batching and PagedAttention algorithms for text generation with + fast and efficient in high concurrency load especially on Intel Xeon processors. Learn more + about it. Neural Network Compression Framework -++++++++++++++++++++++++++++++++++++++++++ ++++++++++++++++++++++++++++++++++++++ -* Model subgraphs can now be defined in the ignored scope for INT8 Post-training Quantization, - nncf.quantize(), which simplifies excluding accuracy-sensitive layers from quantization. -* A batch size of more than 1 is now partially supported for INT8 Post-training Quantization, - speeding up the process. Note that it is not recommended for transformer-based models as it - may impact accuracy. Here is an - `example demo `__. -* Now it is possible to apply fine-tuning on INT8 models after Post-training Quantization to - improve model accuracy and make it easier to move from post-training to training-aware - quantization. Here is an - `example demo `__. +* GPTQ method is now supported in nncf.compress_weights() for data-aware 4-bit weight + compression of LLMs. Enabled by `gptq=True`` in nncf.compress_weights(). +* Scale Estimation algorithm for more accurate 4-bit compressed LLMs. Enabled by + `scale_estimation=True`` in nncf.compress_weights(). +* Added support for models with bf16 weights in nncf.compress_weights(). +* nncf.quantize() method is now the recommended path for quantization initialization of + PyTorch models in Quantization-Aware Training. See example for more details. +* compressed_model.nncf.get_config() and nncf.torch.load_from_config() API have been added to + save and restore quantized PyTorch models. See example for more details. +* Automatic support for int8 quantization of PyTorch models with custom modules has been added. + Now it is not needed to register such modules before quantization. -OpenVINO Tokenizers -++++++++++++++++++++++++++++++++++++++++++ -* TensorFlow support has been extended - TextVectorization layer translation: +Other Changes and Known Issues ++++++++++++++++++++++++++++++++++++++ - * Aligned existing ops with TF ops and added a translator for them. - * Added new ragged tensor ops and string ops. +Jupyter Notebooks +----------------------------- -* A new tokenizer type, RWKV is now supported: +* Latest notebooks along with the GitHub validation status can be found in the + `OpenVINO notebook section `__ +* The following notebooks have been updated or newly added: - * Added Trie tokenizer and Fuse op for ragged tensors. - * A new way to get OV Tokenizers: build a vocab from file. + * `Image to Video Generation with Stable Video Diffusion `__ + * `Image generation with Stable Cascade `__ + * `One Step Sketch to Image translation with pix2pix-turbo and OpenVINO `__ + * `Animating Open-domain Images with DynamiCrafter and OpenVINO `__ + * `Text-to-Video retrieval with S3D MIL-NCE and OpenVINO `__ + * `Convert and Optimize YOLOv10 with OpenVINO `__ + * `Visual-language assistant with nanoLLaVA and OpenVINO `__ + * `Person Counting System using YOLOV8 and OpenVINO™ `__ + * `Quantization-Sparsity Aware Training with NNCF, using PyTorch framework `__ + * `Create an LLM-powered Chatbot using OpenVINO `__ -* Tokenizer caching has been redesigned to work with the OpenVINO™ model caching mechanism. +Known Issues +----------------------------- + +| **Component: TBB** +| ID: TBB-1400/ TBB-1401 +| Description: +| In 2024.2, oneTBB 2021.2.x is used for Intel Distribution OpenVINO Ubuntu and Red Hat + archives, instead of system TBB/oneTBB, which improved the performance on some platforms + (EMR for example), but the latency of some models drop on SPR, user can build OpenVINO with + **-DSYSTEM_TBB=ON** to get better latency performance for these models. + +| **Component: python API** +| ID: CVS-141744 +| Description: +| During post commit tests we found problem related with custom operations. Fix is ready and + will be delivered with 2024.3 release. +| - Initial problem: test_custom_op hanged on destruction because it was waiting for a + thread which tried to acquire GIL. +| - The second problem is that pybind11 doesn't allow to work with GIL besides of current + scope and it's impossible to release GIL for destructors. Blocking destructors and the + GIL pybind/pybind11#1446 +| - Current solution allows to release GIL for InferRequest and all called by chain destructors. + + +| **Component: CPU runtime** +| *ID:* MFDNN-11428 +| *Description:* +| Due to adopting a new OneDNN library, improving performance for most use cases, + particularly for AVX2 BRGEMM kernels with the latency hint, the following regressions may + be noticed: +| a. latency regression on certain models, such as unet-camvid-onnx-0001 and mask_rcnn_resnet50_atrous_coco on MTL Windows latency mode +| b. performance regression on Intel client platforms if the throughput hint is used +| The issue is being investigated and planned to be resolved in the following releases. + + +| **Component: Hardware Configuration** +| *ID:* N/A +| *Description:* +| Reduced performance for LLMs may be observed on newer CPUs. To mitigate, modify the default settings in BIOS to change the system into 2 NUMA node system: +| 1. Enter the BIOS configuration menu. +| 2. Select EDKII Menu -> Socket Configuration -> Uncore Configuration -> Uncore General Configuration -> SNC. +| 3. The SNC setting is set to *AUTO* by default. Change the SNC setting to *disabled* to configure one NUMA node per processor socket upon boot. +| 4. After system reboot, confirm the NUMA node setting using: `numatcl -H`. Expect to see only nodes 0 and 1 on a 2-socket system with the following mapping: +| Node - 0 - 1 +| 0 - 10 - 21 +| 1 - 21 - 10 -Other Changes and Known Issues -++++++++++++++++++++++++++++++++++++++++++ -Jupyter Notebooks ------------------------------ -The default branch for the OpenVINO™ Notebooks repository has been changed from 'main' to -'latest'. The 'main' branch of the notebooks repository is now deprecated and will be maintained -until September 30, 2024. -The new branch, 'latest', offers a better user experience and simplifies maintenance due to -significant refactoring and an improved directory naming structure. -Use the local -`README.md `__ -file and OpenVINO™ Notebooks at -`GitHub Pages `__ -to navigate through the content. -The following notebooks have been updated or newly added: -* `Grounded Segment Anything `__ -* `Visual Content Search with MobileCLIP `__ -* `YOLO V8 Oriented Bounding Box Detection Optimization `__ -* `Magika: AI-powered fast and efficient file type identification `__ -* `Keras Stable Diffusion `__ -* `RMBG background removal `__ -* `AnimateAnyone: pose guided image to video generation `__ -* `LLaVA-Next visual-language assistant `__ -* `TripoSR: single image 3d reconstruction `__ -* `RAG system with OpenVINO and LangChain `__ -Known Issues ------------------------------ -| **Component - CPU Plugin** -| *ID* - N/A -| *Description:* -| Default CPU pinning policy on Windows has been changed to follow Windows' policy - instead of controlling the CPU pinning in the OpenVINO plugin. This brings certain dynamic or - performance variance on Windows. Developers can use ov::hint::enable_cpu_pinning to enable - or disable CPU pinning explicitly. -| **Component - Hardware Configuration** -| *ID* - N/A -| *Description:* -| Reduced performance for LLMs may be observed on newer CPUs. To mitigate, modify the default settings in BIOS to -| change the system into 2 NUMA node system: -| 1. Enter the BIOS configuration menu. -| 2. Select EDKII Menu -> Socket Configuration -> Uncore Configuration -> Uncore General Configuration -> SNC. -| 3. The SNC setting is set to *AUTO* by default. Change the SNC setting to *disabled* to configure one NUMA node per processor socket upon boot. -| 4. After system reboot, confirm the NUMA node setting using: `numatcl -H`. Expect to see only nodes 0 and 1 on a -| 2-socket system with the following mapping: -| Node - 0 - 1 -| 0 - 10 - 21 -| 1 - 21 - 10 Previous 2024 releases +++++++++++++++++++++++++++++ +.. dropdown:: 2024.1 - 24 April 2024 + :animate: fade-in-slide-down + :color: secondary + + **What's new** + + * More Gen AI coverage and framework integrations to minimize code changes. + + * Mixtral and URLNet models optimized for performance improvements on Intel® Xeon® processors. + * Stable Diffusion 1.5, ChatGLM3-6B, and Qwen-7B models optimized for improved inference speed + on Intel® Core™ Ultra processors with integrated GPU. + * Support for Falcon-7B-Instruct, a GenAI Large Language Model (LLM) ready-to-use chat/instruct + model with superior performance metrics. + * New Jupyter Notebooks added: YOLO V9, YOLO V8 Oriented Bounding Boxes Detection (OOB), Stable + Diffusion in Keras, MobileCLIP, RMBG-v1.4 Background Removal, Magika, TripoSR, AnimateAnyone, + LLaVA-Next, and RAG system with OpenVINO and LangChain. + + * Broader LLM model support and more model compression techniques. + + * LLM compilation time reduced through additional optimizations with compressed embedding. + Improved 1st token performance of LLMs on 4th and 5th generations of Intel® Xeon® processors + with Intel® Advanced Matrix Extensions (Intel® AMX). + * Better LLM compression and improved performance with oneDNN, INT4, and INT8 support for + Intel® Arc™ GPUs. + * Significant memory reduction for select smaller GenAI models on Intel® Core™ Ultra processors + with integrated GPU. + + * More portability and performance to run AI at the edge, in the cloud, or locally. + + * The preview NPU plugin for Intel® Core™ Ultra processors is now available in the OpenVINO + open-source GitHub repository, in addition to the main OpenVINO package on PyPI. + * The JavaScript API is now more easily accessible through the npm repository, enabling + JavaScript developers' seamless access to the OpenVINO API. + * FP16 inference on ARM processors now enabled for the Convolutional Neural Network (CNN) by + default. + + + **OpenVINO™ Runtime** + + *Common* + + + * Unicode file paths for cached models are now supported on Windows. + * Pad pre-processing API to extend input tensor on edges with constants. + * A fix for inference failures of certain image generation models has been implemented + (fused I/O port names after transformation). + * Compiler's warnings-as-errors option is now on, improving the coding criteria and quality. + Build warnings will not be allowed for new OpenVINO code and the existing warnings have been + fixed. + + *AUTO Inference Mode* + + * Returning the ov::enable_profiling value from ov::CompiledModel is now supported. + + *CPU Device Plugin* + + * 1st token performance of LLMs has been improved on the 4th and 5th generations of Intel® Xeon® + processors with Intel® Advanced Matrix Extensions (Intel® AMX). + * LLM compilation time and memory footprint have been improved through additional optimizations + with compressed embeddings. + * Performance of MoE (e.g. Mixtral), Gemma, and GPT-J has been improved further. + * Performance has been improved significantly for a wide set of models on ARM devices. + * FP16 inference precision is now the default for all types of models on ARM devices. + * CPU architecture-agnostic build has been implemented, to enable unified binary distribution + on different ARM devices. + + *GPU Device Plugin* + + * LLM first token latency has been improved on both integrated and discrete GPU platforms. + * For the ChatGLM3-6B model, average token latency has been improved on integrated GPU platforms. + * For Stable Diffusion 1.5 FP16 precision, performance has been improved on Intel® Core™ Ultra + processors. + + *NPU Device Plugin* + + * NPU Plugin is now part of the OpenVINO GitHub repository. All the most recent plugin changes + will be immediately available in the repo. Note that NPU is part of Intel® Core™ Ultra + processors. + * New OpenVINO™ notebook “Hello, NPU!” introducing NPU usage with OpenVINO has been added. + * Version 22H2 or later is required for Microsoft Windows® 11 64-bit to run inference on NPU. + + *OpenVINO Python API* + + * GIL-free creation of RemoteTensors is now used - holding GIL means that the process is not suited + for multithreading and removing the GIL lock will increase performance which is critical for + the concept of Remote Tensors. + * Packed data type BF16 on the Python API level has been added, opening a new way of supporting + data types not handled by numpy. + * 'pad' operator support for ov::preprocess::PrePostProcessorItem has been added. + * ov.PartialShape.dynamic(int) definition has been provided. + + + *OpenVINO C API* + + * Two new pre-processing APIs for scale and mean have been added. + + *OpenVINO Node.js API* + + * New methods to align JavaScript API with CPP API have been added, such as + CompiledModel.exportModel(), core.import_model(), Core set/get property and Tensor.get_size(), + and Model.is_dynamic(). + * Documentation has been extended to help developers start integrating JavaScript applications + with OpenVINO™. + + *TensorFlow Framework Support* + + * `tf.keras.layers.TextVectorization tokenizer `__ + is now supported. + * Conversion of models with Variable and HashTable (dictionary) resources has been improved. + * 8 NEW operations have been added + (`see the list here, marked as NEW `__). + * 10 operations have received complex tensor support. + * Input tensor names for TF1 models have been adjusted to have a single name per input. + * Hugging Face model support coverage has increased significantly, due to: + + * extraction of input signature of a model in memory has been fixed, + * reading of variable values for a model in memory has been fixed. + + + *PyTorch Framework Support* + + * ModuleExtension, a new type of extension for PyTorch models is now supported + (`PR #23536 `__). + * 22 NEW operations have been added. + * Experimental support for models produced by torch.export (FX graph) has been added + (`PR #23815 `__). + + *ONNX Framework Support* + + * 8 new operations have been added. + + + **OpenVINO Model Server** + + * OpenVINO™ Runtime backend used is now 2024.1 + * OpenVINO™ models with String data type on output are supported. Now, OpenVINO™ Model Server + can support models with input and output of the String type, so developers can take advantage + of the tokenization built into the model as the first layer. Developers can also rely on any + postprocessing embedded into the model which returns text only. Check the + `demo on string input data with the universal-sentence-encoder model `__ + and the + `String output model demo `__. + * MediaPipe Python calculators have been updated to support relative paths for all related + configuration and Python code files. Now, the complete graph configuration folder can be + deployed in an arbitrary path without any code changes. + * KServe REST API support has been extended to properly handle the string format in JSON body, + just like the binary format compatible with NVIDIA Triton™. + * `A demo showcasing a full RAG algorithm `__ + fully delegated to the model server has been added. + + + **Neural Network Compression Framework** + + * Model subgraphs can now be defined in the ignored scope for INT8 Post-training Quantization, + nncf.quantize(), which simplifies excluding accuracy-sensitive layers from quantization. + * A batch size of more than 1 is now partially supported for INT8 Post-training Quantization, + speeding up the process. Note that it is not recommended for transformer-based models as it + may impact accuracy. Here is an + `example demo `__. + * Now it is possible to apply fine-tuning on INT8 models after Post-training Quantization to + improve model accuracy and make it easier to move from post-training to training-aware + quantization. Here is an + `example demo `__. + + **OpenVINO Tokenizers** + + * TensorFlow support has been extended - TextVectorization layer translation: + + * Aligned existing ops with TF ops and added a translator for them. + * Added new ragged tensor ops and string ops. + + * A new tokenizer type, RWKV is now supported: + + * Added Trie tokenizer and Fuse op for ragged tensors. + * A new way to get OV Tokenizers: build a vocab from file. + + * Tokenizer caching has been redesigned to work with the OpenVINO™ model caching mechanism. + + + **Other Changes and Known Issues** + + *Jupyter Notebooks* + + The default branch for the OpenVINO™ Notebooks repository has been changed from 'main' to + 'latest'. The 'main' branch of the notebooks repository is now deprecated and will be maintained + until September 30, 2024. + + The new branch, 'latest', offers a better user experience and simplifies maintenance due to + significant refactoring and an improved directory naming structure. + + Use the local + `README.md `__ + file and OpenVINO™ Notebooks at + `GitHub Pages `__ + to navigate through the content. + + + The following notebooks have been updated or newly added: + + * `Grounded Segment Anything `__ + * `Visual Content Search with MobileCLIP `__ + * `YOLO V8 Oriented Bounding Box Detection Optimization `__ + * `Magika: AI-powered fast and efficient file type identification `__ + * `Keras Stable Diffusion `__ + * `RMBG background removal `__ + * `AnimateAnyone: pose guided image to video generation `__ + * `LLaVA-Next visual-language assistant `__ + * `TripoSR: single image 3d reconstruction `__ + * `RAG system with OpenVINO and LangChain `__ + + + *Known Issues* + + | **Component: CPU Plugin** + | *ID:* N/A + | *Description:* + | Default CPU pinning policy on Windows has been changed to follow Windows' policy + instead of controlling the CPU pinning in the OpenVINO plugin. This brings certain dynamic or + performance variance on Windows. Developers can use ov::hint::enable_cpu_pinning to enable + or disable CPU pinning explicitly. + + | **Component: Hardware Configuration** + | *ID:* N/A + | *Description:* + | Reduced performance for LLMs may be observed on newer CPUs. To mitigate, modify the default settings in BIOS to + | change the system into 2 NUMA node system: + | 1. Enter the BIOS configuration menu. + | 2. Select EDKII Menu -> Socket Configuration -> Uncore Configuration -> Uncore General Configuration -> SNC. + | 3. The SNC setting is set to *AUTO* by default. Change the SNC setting to *disabled* to configure one NUMA node per processor socket upon boot. + | 4. After system reboot, confirm the NUMA node setting using: `numatcl -H`. Expect to see only nodes 0 and 1 on a + | 2-socket system with the following mapping: + | Node - 0 - 1 + | 0 - 10 - 21 + | 1 - 21 - 10 + + + + + + + + + + .. dropdown:: 2024.0 - 06 March 2024 :animate: fade-in-slide-down :color: secondary @@ -491,21 +753,21 @@ Previous 2024 releases *Known issues* - | **Component - CPU Plugin** - | *ID* - N/A + | **Component: CPU Plugin** + | *ID:* N/A | *Description:* | Starting with 24.0, model inputs and outputs will no longer have tensor names, unless explicitly set to align with the PyTorch framework behavior. - | **Component - GPU runtime** - | *ID* - 132376 + | **Component: GPU runtime** + | *ID:* 132376 | *Description:* | First-inference latency slow down for LLMs on Intel® Core™ Ultra processors. Up to 10-20% drop may occur due to radical memory optimization for processing long sequences (about 1.5-2 GB reduced memory usage). - | **Component - CPU runtime** - | *ID* - N/A + | **Component: CPU runtime** + | *ID:* N/A | *Description:* | Performance results (first token latency) may vary from those offered by the previous OpenVINO version, for “latency” hint inference of LLMs with long prompts on Xeon platforms with 2 or more @@ -523,6 +785,7 @@ Previous 2024 releases + Deprecation And Support +++++++++++++++++++++++++++++ Using deprecated features and components is not advised. They are available to enable a smooth @@ -575,90 +838,93 @@ Deprecated and to be removed in the future * “auto shape” and “auto batch size” (reshaping a model in runtime) will be removed in the future. OpenVINO's dynamic shape models are recommended instead. -* The following notebooks have been deprecated and will be removed. For an up-to-date listing - of available notebooks, refer to - `OpenVINO™ Notebook index (openvinotoolkit.github.io) `__. +* A number of notebooks have been deprecated. For an up-to-date listing of available notebooks, + refer to the `OpenVINO™ Notebook index (openvinotoolkit.github.io) `__. + + .. dropdown:: See the deprecated notebook list + :animate: fade-in-slide-down + :color: muted - * `Handwritten OCR with OpenVINO™ `__ + * `Handwritten OCR with OpenVINO™ `__ - * See alternative: `Optical Character Recognition (OCR) with OpenVINO™ `__, - * See alternative: `PaddleOCR with OpenVINO™ `__, - * See alternative: `Handwritten Text Recognition Demo `__ + * See alternative: `Optical Character Recognition (OCR) with OpenVINO™ `__, + * See alternative: `PaddleOCR with OpenVINO™ `__, + * See alternative: `Handwritten Text Recognition Demo `__ - * `Image In-painting with OpenVINO™ `__ + * `Image In-painting with OpenVINO™ `__ - * See alternative: `Image Inpainting Python Demo `__ + * See alternative: `Image Inpainting Python Demo `__ - * `Interactive Machine Translation with OpenVINO `__ + * `Interactive Machine Translation with OpenVINO `__ - * See alternative: `Machine Translation Python* Demo `__ + * See alternative: `Machine Translation Python* Demo `__ - * `Open Model Zoo Tools Tutorial `__ + * `Open Model Zoo Tools Tutorial `__ - * No alternatives, demonstrates deprecated tools. + * No alternatives, demonstrates deprecated tools. - * `Super Resolution with OpenVINO™ `__ + * `Super Resolution with OpenVINO™ `__ - * See alternative: `Super Resolution with PaddleGAN and OpenVINO `__ - * See alternative: `Image Processing C++ Demo `__ + * See alternative: `Super Resolution with PaddleGAN and OpenVINO `__ + * See alternative: `Image Processing C++ Demo `__ - * `Image Colorization with OpenVINO Tutorial `__ - * `Interactive Question Answering with OpenVINO™ `__ + * `Image Colorization with OpenVINO Tutorial `__ + * `Interactive Question Answering with OpenVINO™ `__ - * See alternative: `BERT Question Answering Embedding Python* Demo `__ - * See alternative: `BERT Question Answering Python* Demo `__ + * See alternative: `BERT Question Answering Embedding Python* Demo `__ + * See alternative: `BERT Question Answering Python* Demo `__ - * `Vehicle Detection And Recognition with OpenVINO™ `__ + * `Vehicle Detection And Recognition with OpenVINO™ `__ - * See alternative: `Security Barrier Camera C++ Demo `__ + * See alternative: `Security Barrier Camera C++ Demo `__ - * `The attention center model with OpenVINO™ `_ - * `Image Generation with DeciDiffusion `_ - * `Image generation with DeepFloyd IF and OpenVINO™ `_ - * `Depth estimation using VI-depth with OpenVINO™ `_ - * `Instruction following using Databricks Dolly 2.0 and OpenVINO™ `_ + * `The attention center model with OpenVINO™ `_ + * `Image Generation with DeciDiffusion `_ + * `Image generation with DeepFloyd IF and OpenVINO™ `_ + * `Depth estimation using VI-depth with OpenVINO™ `_ + * `Instruction following using Databricks Dolly 2.0 and OpenVINO™ `_ - * See alternative: `LLM Instruction-following pipeline with OpenVINO `__ + * See alternative: `LLM Instruction-following pipeline with OpenVINO `__ - * `Image generation with FastComposer and OpenVINO™ `__ - * `Video Subtitle Generation with OpenAI Whisper `__ + * `Image generation with FastComposer and OpenVINO™ `__ + * `Video Subtitle Generation with OpenAI Whisper `__ - * See alternative: `Automatic speech recognition using Distil-Whisper and OpenVINO `__ + * See alternative: `Automatic speech recognition using Distil-Whisper and OpenVINO `__ - * `Introduction to Performance Tricks in OpenVINO™ `__ - * `Speaker Diarization with OpenVINO™ `__ - * `Subject-driven image generation and editing using BLIP Diffusion and OpenVINO `__ - * `Text Prediction with OpenVINO™ `__ - * `Training to Deployment with TensorFlow and OpenVINO™ `__ - * `Speech to Text with OpenVINO™ `__ - * `Convert and Optimize YOLOv7 with OpenVINO™ `__ - * `Quantize Data2Vec Speech Recognition Model using NNCF PTQ API `__ + * `Introduction to Performance Tricks in OpenVINO™ `__ + * `Speaker Diarization with OpenVINO™ `__ + * `Subject-driven image generation and editing using BLIP Diffusion and OpenVINO `__ + * `Text Prediction with OpenVINO™ `__ + * `Training to Deployment with TensorFlow and OpenVINO™ `__ + * `Speech to Text with OpenVINO™ `__ + * `Convert and Optimize YOLOv7 with OpenVINO™ `__ + * `Quantize Data2Vec Speech Recognition Model using NNCF PTQ API `__ - * See alternative: `Quantize Speech Recognition Models with accuracy control using NNCF PTQ API `__ + * See alternative: `Quantize Speech Recognition Models with accuracy control using NNCF PTQ API `__ - * `Semantic segmentation with LRASPP MobileNet v3 and OpenVINO `__ - * `Video Recognition using SlowFast and OpenVINO™ `__ + * `Semantic segmentation with LRASPP MobileNet v3 and OpenVINO `__ + * `Video Recognition using SlowFast and OpenVINO™ `__ - * See alternative: `Live Action Recognition with OpenVINO™ `__ + * See alternative: `Live Action Recognition with OpenVINO™ `__ - * `Semantic Segmentation with OpenVINO™ using Segmenter `__ - * `Programming Language Classification with OpenVINO `__ - * `Stable Diffusion Text-to-Image Demo `__ + * `Semantic Segmentation with OpenVINO™ using Segmenter `__ + * `Programming Language Classification with OpenVINO `__ + * `Stable Diffusion Text-to-Image Demo `__ - * See alternative: `Stable Diffusion v2.1 using Optimum-Intel OpenVINO and multiple Intel Hardware `__ + * See alternative: `Stable Diffusion v2.1 using Optimum-Intel OpenVINO and multiple Intel Hardware `__ - * `Text-to-Image Generation with Stable Diffusion v2 and OpenVINO™ `__ + * `Text-to-Image Generation with Stable Diffusion v2 and OpenVINO™ `__ - * See alternative: `Stable Diffusion v2.1 using Optimum-Intel OpenVINO and multiple Intel Hardware `__ + * See alternative: `Stable Diffusion v2.1 using Optimum-Intel OpenVINO and multiple Intel Hardware `__ - * `Image generation with Segmind Stable Diffusion 1B (SSD-1B) model and OpenVINO `__ - * `Data Preparation for 2D Medical Imaging `__ - * `Train a Kidney Segmentation Model with MONAI and PyTorch Lightning `__ - * `Live Inference and Benchmark CT-scan Data with OpenVINO™ `__ + * `Image generation with Segmind Stable Diffusion 1B (SSD-1B) model and OpenVINO `__ + * `Data Preparation for 2D Medical Imaging `__ + * `Train a Kidney Segmentation Model with MONAI and PyTorch Lightning `__ + * `Live Inference and Benchmark CT-scan Data with OpenVINO™ `__ - * See alternative: `Quantize a Segmentation Model and Show Live Inference `__ + * See alternative: `Quantize a Segmentation Model and Show Live Inference `__ - * `Live Style Transfer with OpenVINO™ `__ + * `Live Style Transfer with OpenVINO™ `__ diff --git a/docs/articles_en/about-openvino/release-notes-openvino/system-requirements.rst b/docs/articles_en/about-openvino/release-notes-openvino/system-requirements.rst index 361bb24089cd86..4d8381ec09bba3 100644 --- a/docs/articles_en/about-openvino/release-notes-openvino/system-requirements.rst +++ b/docs/articles_en/about-openvino/release-notes-openvino/system-requirements.rst @@ -193,7 +193,7 @@ OpenCL and the OpenCL logo are trademarks of Apple Inc. used by permission by Kh Other names and brands may be claimed as the property of others. -Copyright © 2023, Intel Corporation. All rights reserved. +Copyright © 2024, Intel Corporation. All rights reserved. For more complete information about compiler optimizations, see our Optimization Notice. diff --git a/docs/articles_en/get-started/install-openvino/install-openvino-archive-linux.rst b/docs/articles_en/get-started/install-openvino/install-openvino-archive-linux.rst index a991bae6fe030b..294d966df9b37c 100644 --- a/docs/articles_en/get-started/install-openvino/install-openvino-archive-linux.rst +++ b/docs/articles_en/get-started/install-openvino/install-openvino-archive-linux.rst @@ -26,7 +26,7 @@ Install OpenVINO™ Runtime on Linux from an Archive File Ubuntu20 arm64 V n/a n/a CentOS7 x86_64 V V n/a Ubuntu18 x86_64 V V n/a - Ubuntu20 x86_64 V V V + Ubuntu20 x86_64 V V n/a Ubuntu22 x86_64 V V V Ubuntu24 x86_64 V V V RHEL8 x86_64 V V n/a diff --git a/docs/articles_en/openvino-workflow/deployment-locally/integrate-openvino-with-ubuntu-snap.rst b/docs/articles_en/openvino-workflow/deployment-locally/integrate-openvino-with-ubuntu-snap.rst index a3d903ab083f9f..c47fe7f17d84ed 100644 --- a/docs/articles_en/openvino-workflow/deployment-locally/integrate-openvino-with-ubuntu-snap.rst +++ b/docs/articles_en/openvino-workflow/deployment-locally/integrate-openvino-with-ubuntu-snap.rst @@ -50,7 +50,7 @@ separate snaps. It involves three steps: 1. Configure the OpenVINO snapcraft.yaml. - * Add the part to build and install OpenVINO as described in the 1st Method: + Add the part to build and install OpenVINO as described in the 1st Method: .. code-block:: sh @@ -72,8 +72,8 @@ separate snaps. It involves three steps: - pkg-config - gzip - * Define the slots provided by the OpenVINO Snap. Slots are the interfaces your Snap - exposes for other Snaps to connect to: + Define the slots provided by the OpenVINO Snap. Slots are the interfaces your Snap + exposes for other Snaps to connect to: .. code-block:: sh diff --git a/docs/sphinx_setup/_static/css/custom.css b/docs/sphinx_setup/_static/css/custom.css index 383204118df66e..ee94f21b0ee851 100644 --- a/docs/sphinx_setup/_static/css/custom.css +++ b/docs/sphinx_setup/_static/css/custom.css @@ -20,9 +20,9 @@ main .searchForm { pre { white-space: pre-wrap; word-wrap: break-word; - background-color: white; - color: red !important; -} + /*background-color: white; + color: red !important; */ +} /*confirm this is not necessary, if so, remove */ button.copybtn { opacity: 100; From 8c00079679b456324162062530c4ad37bcc7753b Mon Sep 17 00:00:00 2001 From: Maciej Smyk Date: Thu, 13 Jun 2024 15:24:58 +0200 Subject: [PATCH 06/31] [DOCS] Snippets fix for master (#25010) Fixing snippets. --- .../documentation/openvino-extensibility.rst | 4 ++-- .../custom-openvino-operations.rst | 12 ++++++------ 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/docs/articles_en/documentation/openvino-extensibility.rst b/docs/articles_en/documentation/openvino-extensibility.rst index 13fa2c36a4b5fd..b276a713f6f6de 100644 --- a/docs/articles_en/documentation/openvino-extensibility.rst +++ b/docs/articles_en/documentation/openvino-extensibility.rst @@ -146,13 +146,13 @@ This macro should have a vector of all OpenVINO Extensions as an argument. Based on that, the declaration of an extension class might look like the following: -.. doxygensnippet:: ./src/core/template_extension/new/ov_extension.cpp +.. doxygensnippet:: src/core/template_extension/ov_extension.cpp :language: cpp :fragment: [ov_extension:entry_point] 2. Configure the build of your extension library, using the following CMake script: -.. doxygensnippet:: ./src/core/template_extension/new/CMakeLists.txt +.. doxygensnippet:: src/core/template_extension/CMakeLists.txt :language: cpp :fragment: [cmake:extension] diff --git a/docs/articles_en/documentation/openvino-extensibility/custom-openvino-operations.rst b/docs/articles_en/documentation/openvino-extensibility/custom-openvino-operations.rst index aafcfe23538281..cb9035a93a7033 100644 --- a/docs/articles_en/documentation/openvino-extensibility/custom-openvino-operations.rst +++ b/docs/articles_en/documentation/openvino-extensibility/custom-openvino-operations.rst @@ -16,7 +16,7 @@ Operation Class To add your custom operation, create a new class that extends ``ov::Op``, which is in turn derived from ``ov::Node``, the base class for all graph operations in OpenVINO™. To add ``ov::Op``, include the next file: -.. doxygensnippet:: ./src/core/template_extension/new/identity.hpp +.. doxygensnippet:: src/core/template_extension/identity.hpp :language: cpp :fragment: [op:common_include] @@ -45,7 +45,7 @@ OpenVINO™ operation contains two constructors: * Default constructor, which enables you to create an operation without attributes * Constructor that creates and validates an operation with specified inputs and attributes -.. doxygensnippet:: ./src/core/template_extension/new/identity.cpp +.. doxygensnippet:: src/core/template_extension/identity.cpp :language: cpp :fragment: [op:ctor] @@ -54,7 +54,7 @@ OpenVINO™ operation contains two constructors: ``ov::Node::validate_and_infer_types`` method validates operation attributes and calculates output shapes using attributes of the operation. -.. doxygensnippet:: ./src/core/template_extension/new/identity.cpp +.. doxygensnippet:: src/core/template_extension/identity.cpp :language: cpp :fragment: [op:validate] @@ -63,7 +63,7 @@ OpenVINO™ operation contains two constructors: ``ov::Node::clone_with_new_inputs`` method creates a copy of the operation with new inputs. -.. doxygensnippet:: ./src/core/template_extension/new/identity.cpp +.. doxygensnippet:: src/core/template_extension/identity.cpp :language: cpp :fragment: [op:copy] @@ -72,7 +72,7 @@ OpenVINO™ operation contains two constructors: ``ov::Node::visit_attributes`` method enables you to visit all operation attributes. -.. doxygensnippet:: ./src/core/template_extension/new/identity.cpp +.. doxygensnippet:: src/core/template_extension/identity.cpp :language: cpp :fragment: [op:visit_attributes] @@ -81,7 +81,7 @@ OpenVINO™ operation contains two constructors: ``ov::Node::evaluate`` method enables you to apply constant folding to an operation. -.. doxygensnippet:: ./src/core/template_extension/new/identity.cpp +.. doxygensnippet:: src/core/template_extension/identity.cpp :language: cpp :fragment: [op:evaluate] From be8472a3e146d3de0bc4ee0e213e918b484565c0 Mon Sep 17 00:00:00 2001 From: Tatiana Savina Date: Thu, 13 Jun 2024 17:07:16 +0200 Subject: [PATCH 07/31] [DOCS] Move arrows (#25008) ### Details: - *item1* - *...* ### Tickets: - *ticket-id* --- .../supported-devices.rst | 8 ------ .../about-openvino/performance-benchmarks.rst | 9 ------ .../performance-benchmarks-faq.rst | 3 +- .../documentation/legacy-features.rst | 8 ------ docs/articles_en/get-started.rst | 2 -- .../get-started/install-openvino.rst | 28 +++++++++---------- .../_static/css/jquery.dataTables.min.css | 2 +- 7 files changed, 16 insertions(+), 44 deletions(-) diff --git a/docs/articles_en/about-openvino/compatibility-and-support/supported-devices.rst b/docs/articles_en/about-openvino/compatibility-and-support/supported-devices.rst index e8a6e96af27626..fbb3b948165dd2 100644 --- a/docs/articles_en/about-openvino/compatibility-and-support/supported-devices.rst +++ b/docs/articles_en/about-openvino/compatibility-and-support/supported-devices.rst @@ -77,14 +77,6 @@ Feature Support and API Coverage | || as of OpenVINO 2023.3, 08 Jan, 2024. | +-------------------------+-----------+------------------+-------------------+ - -Devices similar to the ones used for benchmarking can be accessed using -`Intel® DevCloud for the Edge `__, -a remote development environment with access to Intel® hardware and the latest versions -of the Intel® Distribution of OpenVINO™ Toolkit. -`Learn more `__ or -`Register here `__. - For setting up a relevant configuration, refer to the :doc:`Integrate with Customer Application <../../openvino-workflow/running-inference/integrate-openvino-with-your-application>` topic (step 3 "Configure input and output"). diff --git a/docs/articles_en/about-openvino/performance-benchmarks.rst b/docs/articles_en/about-openvino/performance-benchmarks.rst index 4eaf34579d09b2..ced358db18c044 100644 --- a/docs/articles_en/about-openvino/performance-benchmarks.rst +++ b/docs/articles_en/about-openvino/performance-benchmarks.rst @@ -199,15 +199,6 @@ connection is dedicated only to measuring performance. You can also test performance for your system yourself, following the guide on :doc:`getting performance numbers `. -Performance of a particular application can also be evaluated virtually using -`Intel® DevCloud for the Edge `__. -It is a remote development environment with access to Intel® hardware and the latest versions -of the Intel® Distribution of the OpenVINO™ Toolkit. To learn more about it, visit -`the website `__ -or -`create an account `__. - - .. raw:: html

Disclaimers

diff --git a/docs/articles_en/about-openvino/performance-benchmarks/performance-benchmarks-faq.rst b/docs/articles_en/about-openvino/performance-benchmarks/performance-benchmarks-faq.rst index 23037d02bc8485..868c828845a092 100644 --- a/docs/articles_en/about-openvino/performance-benchmarks/performance-benchmarks-faq.rst +++ b/docs/articles_en/about-openvino/performance-benchmarks/performance-benchmarks-faq.rst @@ -117,8 +117,7 @@ Performance Information F.A.Q. Intel partners with vendors all over the world. For a list of Hardware Manufacturers, see the `Intel® AI: In Production Partners & Solutions Catalog `__. For more details, see the :doc:`Supported Devices <../compatibility-and-support/supported-devices>`. - documentation. Before purchasing any hardware, you can test and run - models remotely, using `Intel® DevCloud for the Edge `__. + documentation. .. dropdown:: How can I optimize my models for better performance or accuracy? diff --git a/docs/articles_en/documentation/legacy-features.rst b/docs/articles_en/documentation/legacy-features.rst index dd5938398beccd..a470f9bcd9cc4b 100644 --- a/docs/articles_en/documentation/legacy-features.rst +++ b/docs/articles_en/documentation/legacy-features.rst @@ -107,14 +107,6 @@ Discontinued: :language: cpp :fragment: [export_compiled_model] -.. dropdown:: DL Workbench - - | *New solution:* DevCloud version - | *Old solution:* local distribution discontinued in OpenVINO 2022.3 - | The stand-alone version of DL Workbench, a GUI tool for previewing and benchmarking - deep learning models, has been discontinued. You can use its cloud version: - | `Intel® Developer Cloud for the Edge `__. - .. dropdown:: TensorFlow integration (OVTF) | *New solution:* Direct model support and OpenVINO Converter (OVC) diff --git a/docs/articles_en/get-started.rst b/docs/articles_en/get-started.rst index c734bd704d2974..3c62dec7f261c2 100644 --- a/docs/articles_en/get-started.rst +++ b/docs/articles_en/get-started.rst @@ -59,8 +59,6 @@ See the :doc:`installation overview page ` for opt OpenVINO provides a wide array of examples and documentation showing how to work with models, run inference, and deploy applications. Step through the sections below to learn the basics of OpenVINO and explore its advanced optimization features. For further details, visit :doc:`OpenVINO documentation `. -OpenVINO users of all experience levels can try `Intel® DevCloud `__ , a free web-based service for developing, testing, and running OpenVINO applications on an online cluster of the latest Intel® hardware. - .. _openvino-basics: OpenVINO Basics diff --git a/docs/articles_en/get-started/install-openvino.rst b/docs/articles_en/get-started/install-openvino.rst index a1e42970b8ad81..166df8eb104cd7 100644 --- a/docs/articles_en/get-started/install-openvino.rst +++ b/docs/articles_en/get-started/install-openvino.rst @@ -23,16 +23,16 @@ Install OpenVINO™ 2024.2 -.. dropdown:: Supported OpenVINO Versions +OpenVINO 2024.2, described here, is not a Long-Term-Support version! +All currently supported versions are: - OpenVINO 2024.2, described here, is not a Long-Term-Support version! - All currently supported versions are: +* 2024.2 (development) +* 2023.3 (LTS) +* 2022.3 (LTS) - * 2024.2 (development) - * 2023.3 (LTS) - * 2022.3 (LTS) +.. dropdown:: Distributions and Device Support - Moreover, different OpenVINO distributions may support slightly different sets of features. + Different OpenVINO distributions may support slightly different sets of features. Read installation guides for particular distributions for more details. Refer to the :doc:`OpenVINO Release Policy <../../../about-openvino/release-notes-openvino/release-policy>` to learn more about the release types. @@ -40,17 +40,17 @@ Install OpenVINO™ 2024.2 .. dropdown:: Distribution Comparison for OpenVINO 2024.2 =============== ========== ====== =============== ======== ============ ========== ========== ========== - Device Archives PyPI APT/YUM/ZYPPER Conda Homebrew vcpkg Conan npm + Device Archives PyPI APT/YUM/ZYPPER Conda Homebrew vcpkg Conan npm =============== ========== ====== =============== ======== ============ ========== ========== ========== - CPU V V V V V V V V - GPU V V V V V V V V - NPU V\* V\* V\ * n/a n/a n/a n/a V\* + CPU V V V V V V V V + GPU V V V V V V V V + NPU V\* V\* V\ * n/a n/a n/a n/a V\* =============== ========== ====== =============== ======== ============ ========== ========== ========== - | \* **Of the Linux systems, versions 22.04 and 24.04 include drivers for NPU.** + | \* **Of the Linux systems, version 22.04 includes drivers for NPU.** | **For Windows, CPU inference on ARM64 is not supported.** -.. dropdown:: Effortless GenAI integration with OpenVINO GenAI Flavor +.. dropdown:: Effortless GenAI integration with OpenVINO GenAI Flavor** A new OpenVINO GenAI Flavor streamlines application development by providing LLM-specific interfaces for easy integration of language models, handling tokenization and @@ -67,7 +67,7 @@ Install OpenVINO™ 2024.2 The OpenVINO Development Tools is still available for older versions of OpenVINO, as well as the current one, from the GitHub repository and PyPI. :doc:`Learn more <../documentation/legacy-features/install-dev-tools>`. -.. dropdown:: Building OpenVINO from source +.. dropdown:: Building OpenVINO from Source OpenVINO Toolkit source files are available on GitHub as open source. If you want to build your own version of OpenVINO for your platform, follow the `OpenVINO Build Instructions `__. diff --git a/docs/sphinx_setup/_static/css/jquery.dataTables.min.css b/docs/sphinx_setup/_static/css/jquery.dataTables.min.css index aff1ca672c3098..671093e42a20dd 100644 --- a/docs/sphinx_setup/_static/css/jquery.dataTables.min.css +++ b/docs/sphinx_setup/_static/css/jquery.dataTables.min.css @@ -1 +1 @@ -:root{--dt-row-selected: 13, 110, 253;--dt-row-selected-text: 255, 255, 255;--dt-row-selected-link: 9, 10, 11}table.dataTable td.dt-control{text-align:center;cursor:pointer}table.dataTable td.dt-control:before{height:1em;width:1em;margin-top:-9px;display:inline-block;color:white;border:.15em solid white;border-radius:1em;box-shadow:0 0 .2em #444;box-sizing:content-box;text-align:center;text-indent:0 !important;font-family:"Courier New",Courier,monospace;line-height:1em;content:"+";background-color:#31b131}table.dataTable tr.dt-hasChild td.dt-control:before{content:"-";background-color:#d33333}table.dataTable thead>tr>th.sorting,table.dataTable thead>tr>th.sorting_asc,table.dataTable thead>tr>th.sorting_desc,table.dataTable thead>tr>th.sorting_asc_disabled,table.dataTable thead>tr>th.sorting_desc_disabled,table.dataTable thead>tr>td.sorting,table.dataTable thead>tr>td.sorting_asc,table.dataTable thead>tr>td.sorting_desc,table.dataTable thead>tr>td.sorting_asc_disabled,table.dataTable thead>tr>td.sorting_desc_disabled{cursor:pointer;position:relative;padding-right:26px}table.dataTable thead>tr>th.sorting:before,table.dataTable thead>tr>th.sorting:after,table.dataTable thead>tr>th.sorting_asc:before,table.dataTable thead>tr>th.sorting_asc:after,table.dataTable thead>tr>th.sorting_desc:before,table.dataTable thead>tr>th.sorting_desc:after,table.dataTable thead>tr>th.sorting_asc_disabled:before,table.dataTable thead>tr>th.sorting_asc_disabled:after,table.dataTable thead>tr>th.sorting_desc_disabled:before,table.dataTable thead>tr>th.sorting_desc_disabled:after,table.dataTable thead>tr>td.sorting:before,table.dataTable thead>tr>td.sorting:after,table.dataTable thead>tr>td.sorting_asc:before,table.dataTable thead>tr>td.sorting_asc:after,table.dataTable thead>tr>td.sorting_desc:before,table.dataTable thead>tr>td.sorting_desc:after,table.dataTable thead>tr>td.sorting_asc_disabled:before,table.dataTable thead>tr>td.sorting_asc_disabled:after,table.dataTable thead>tr>td.sorting_desc_disabled:before,table.dataTable thead>tr>td.sorting_desc_disabled:after{position:absolute;display:block;opacity:.125;right:10px;line-height:9px;font-size:.8em}table.dataTable thead>tr>th.sorting:before,table.dataTable thead>tr>th.sorting_asc:before,table.dataTable thead>tr>th.sorting_desc:before,table.dataTable thead>tr>th.sorting_asc_disabled:before,table.dataTable thead>tr>th.sorting_desc_disabled:before,table.dataTable thead>tr>td.sorting:before,table.dataTable thead>tr>td.sorting_asc:before,table.dataTable thead>tr>td.sorting_desc:before,table.dataTable thead>tr>td.sorting_asc_disabled:before,table.dataTable thead>tr>td.sorting_desc_disabled:before{bottom:50%;content:"▲";content:"▲"/""}table.dataTable thead>tr>th.sorting:after,table.dataTable thead>tr>th.sorting_asc:after,table.dataTable thead>tr>th.sorting_desc:after,table.dataTable thead>tr>th.sorting_asc_disabled:after,table.dataTable thead>tr>th.sorting_desc_disabled:after,table.dataTable thead>tr>td.sorting:after,table.dataTable thead>tr>td.sorting_asc:after,table.dataTable thead>tr>td.sorting_desc:after,table.dataTable thead>tr>td.sorting_asc_disabled:after,table.dataTable thead>tr>td.sorting_desc_disabled:after{top:50%;content:"▼";content:"▼"/""}table.dataTable thead>tr>th.sorting_asc:before,table.dataTable thead>tr>th.sorting_desc:after,table.dataTable thead>tr>td.sorting_asc:before,table.dataTable thead>tr>td.sorting_desc:after{opacity:.6}table.dataTable thead>tr>th.sorting_desc_disabled:after,table.dataTable thead>tr>th.sorting_asc_disabled:before,table.dataTable thead>tr>td.sorting_desc_disabled:after,table.dataTable thead>tr>td.sorting_asc_disabled:before{display:none}table.dataTable thead>tr>th:active,table.dataTable thead>tr>td:active{outline:none}div.dataTables_scrollBody>table.dataTable>thead>tr>th:before,div.dataTables_scrollBody>table.dataTable>thead>tr>th:after,div.dataTables_scrollBody>table.dataTable>thead>tr>td:before,div.dataTables_scrollBody>table.dataTable>thead>tr>td:after{display:none}div.dataTables_processing{position:absolute;top:50%;left:50%;width:200px;margin-left:-100px;margin-top:-26px;text-align:center;padding:2px}div.dataTables_processing>div:last-child{position:relative;width:80px;height:15px;margin:1em auto}div.dataTables_processing>div:last-child>div{position:absolute;top:0;width:13px;height:13px;border-radius:50%;background:rgb(13, 110, 253);background:rgb(var(--dt-row-selected));animation-timing-function:cubic-bezier(0, 1, 1, 0)}div.dataTables_processing>div:last-child>div:nth-child(1){left:8px;animation:datatables-loader-1 .6s infinite}div.dataTables_processing>div:last-child>div:nth-child(2){left:8px;animation:datatables-loader-2 .6s infinite}div.dataTables_processing>div:last-child>div:nth-child(3){left:32px;animation:datatables-loader-2 .6s infinite}div.dataTables_processing>div:last-child>div:nth-child(4){left:56px;animation:datatables-loader-3 .6s infinite}@keyframes datatables-loader-1{0%{transform:scale(0)}100%{transform:scale(1)}}@keyframes datatables-loader-3{0%{transform:scale(1)}100%{transform:scale(0)}}@keyframes datatables-loader-2{0%{transform:translate(0, 0)}100%{transform:translate(24px, 0)}}table.dataTable.nowrap th,table.dataTable.nowrap td{white-space:nowrap}table.dataTable th.dt-left,table.dataTable td.dt-left{text-align:left}table.dataTable th.dt-center,table.dataTable td.dt-center,table.dataTable td.dataTables_empty{text-align:center}table.dataTable th.dt-right,table.dataTable td.dt-right{text-align:right}table.dataTable th.dt-justify,table.dataTable td.dt-justify{text-align:justify}table.dataTable th.dt-nowrap,table.dataTable td.dt-nowrap{white-space:nowrap}table.dataTable thead th,table.dataTable thead td,table.dataTable tfoot th,table.dataTable tfoot td{text-align:left}table.dataTable thead th.dt-head-left,table.dataTable thead td.dt-head-left,table.dataTable tfoot th.dt-head-left,table.dataTable tfoot td.dt-head-left{text-align:left}table.dataTable thead th.dt-head-center,table.dataTable thead td.dt-head-center,table.dataTable tfoot th.dt-head-center,table.dataTable tfoot td.dt-head-center{text-align:center}table.dataTable thead th.dt-head-right,table.dataTable thead td.dt-head-right,table.dataTable tfoot th.dt-head-right,table.dataTable tfoot td.dt-head-right{text-align:right}table.dataTable thead th.dt-head-justify,table.dataTable thead td.dt-head-justify,table.dataTable tfoot th.dt-head-justify,table.dataTable tfoot td.dt-head-justify{text-align:justify}table.dataTable thead th.dt-head-nowrap,table.dataTable thead td.dt-head-nowrap,table.dataTable tfoot th.dt-head-nowrap,table.dataTable tfoot td.dt-head-nowrap{white-space:nowrap}table.dataTable tbody th.dt-body-left,table.dataTable tbody td.dt-body-left{text-align:left}table.dataTable tbody th.dt-body-center,table.dataTable tbody td.dt-body-center{text-align:center}table.dataTable tbody th.dt-body-right,table.dataTable tbody td.dt-body-right{text-align:right}table.dataTable tbody th.dt-body-justify,table.dataTable tbody td.dt-body-justify{text-align:justify}table.dataTable tbody th.dt-body-nowrap,table.dataTable tbody td.dt-body-nowrap{white-space:nowrap}table.dataTable{width:100%;margin:0 auto;clear:both;border-collapse:separate;border-spacing:0}table.dataTable thead th,table.dataTable tfoot th{font-weight:bold}table.dataTable thead th,table.dataTable thead td{padding:10px;border-bottom:1px solid rgba(0, 0, 0, 0.3)}table.dataTable thead th:active,table.dataTable thead td:active{outline:none}table.dataTable tfoot th,table.dataTable tfoot td{padding:10px 10px 6px 10px;border-top:1px solid rgba(0, 0, 0, 0.3)}table.dataTable tbody tr{background-color:transparent}table.dataTable tbody tr.selected>*{box-shadow:inset 0 0 0 9999px rgba(13, 110, 253, 0.9);box-shadow:inset 0 0 0 9999px rgba(var(--dt-row-selected), 0.9);color:rgb(255, 255, 255);color:rgb(var(--dt-row-selected-text))}table.dataTable tbody tr.selected a{color:rgb(9, 10, 11);color:rgb(var(--dt-row-selected-link))}table.dataTable tbody th,table.dataTable tbody td{padding:8px 10px}table.dataTable.row-border tbody th,table.dataTable.row-border tbody td,table.dataTable.display tbody th,table.dataTable.display tbody td{border-top:1px solid rgba(0, 0, 0, 0.15)}table.dataTable.row-border tbody tr:first-child th,table.dataTable.row-border tbody tr:first-child td,table.dataTable.display tbody tr:first-child th,table.dataTable.display tbody tr:first-child td{border-top:none}table.dataTable.cell-border tbody th,table.dataTable.cell-border tbody td{border-top:1px solid rgba(0, 0, 0, 0.15);border-right:1px solid rgba(0, 0, 0, 0.15)}table.dataTable.cell-border tbody tr th:first-child,table.dataTable.cell-border tbody tr td:first-child{border-left:1px solid rgba(0, 0, 0, 0.15)}table.dataTable.cell-border tbody tr:first-child th,table.dataTable.cell-border tbody tr:first-child td{border-top:none}table.dataTable.stripe>tbody>tr.odd>*,table.dataTable.display>tbody>tr.odd>*{box-shadow:inset 0 0 0 9999px rgba(0, 0, 0, 0.023)}table.dataTable.stripe>tbody>tr.odd.selected>*,table.dataTable.display>tbody>tr.odd.selected>*{box-shadow:inset 0 0 0 9999px rgba(13, 110, 253, 0.923);box-shadow:inset 0 0 0 9999px rgba(var(--dt-row-selected, 0.923))}table.dataTable.hover>tbody>tr:hover>*,table.dataTable.display>tbody>tr:hover>*{box-shadow:inset 0 0 0 9999px rgba(0, 0, 0, 0.035)}table.dataTable.hover>tbody>tr.selected:hover>*,table.dataTable.display>tbody>tr.selected:hover>*{box-shadow:inset 0 0 0 9999px #0d6efd !important;box-shadow:inset 0 0 0 9999px rgba(var(--dt-row-selected, 1)) !important}table.dataTable.order-column>tbody tr>.sorting_1,table.dataTable.order-column>tbody tr>.sorting_2,table.dataTable.order-column>tbody tr>.sorting_3,table.dataTable.display>tbody tr>.sorting_1,table.dataTable.display>tbody tr>.sorting_2,table.dataTable.display>tbody tr>.sorting_3{box-shadow:inset 0 0 0 9999px rgba(0, 0, 0, 0.019)}table.dataTable.order-column>tbody tr.selected>.sorting_1,table.dataTable.order-column>tbody tr.selected>.sorting_2,table.dataTable.order-column>tbody tr.selected>.sorting_3,table.dataTable.display>tbody tr.selected>.sorting_1,table.dataTable.display>tbody tr.selected>.sorting_2,table.dataTable.display>tbody tr.selected>.sorting_3{box-shadow:inset 0 0 0 9999px rgba(13, 110, 253, 0.919);box-shadow:inset 0 0 0 9999px rgba(var(--dt-row-selected, 0.919))}table.dataTable.display>tbody>tr.odd>.sorting_1,table.dataTable.order-column.stripe>tbody>tr.odd>.sorting_1{box-shadow:inset 0 0 0 9999px rgba(0, 0, 0, 0.054)}table.dataTable.display>tbody>tr.odd>.sorting_2,table.dataTable.order-column.stripe>tbody>tr.odd>.sorting_2{box-shadow:inset 0 0 0 9999px rgba(0, 0, 0, 0.047)}table.dataTable.display>tbody>tr.odd>.sorting_3,table.dataTable.order-column.stripe>tbody>tr.odd>.sorting_3{box-shadow:inset 0 0 0 9999px rgba(0, 0, 0, 0.039)}table.dataTable.display>tbody>tr.odd.selected>.sorting_1,table.dataTable.order-column.stripe>tbody>tr.odd.selected>.sorting_1{box-shadow:inset 0 0 0 9999px rgba(13, 110, 253, 0.954);box-shadow:inset 0 0 0 9999px rgba(var(--dt-row-selected, 0.954))}table.dataTable.display>tbody>tr.odd.selected>.sorting_2,table.dataTable.order-column.stripe>tbody>tr.odd.selected>.sorting_2{box-shadow:inset 0 0 0 9999px rgba(13, 110, 253, 0.947);box-shadow:inset 0 0 0 9999px rgba(var(--dt-row-selected, 0.947))}table.dataTable.display>tbody>tr.odd.selected>.sorting_3,table.dataTable.order-column.stripe>tbody>tr.odd.selected>.sorting_3{box-shadow:inset 0 0 0 9999px rgba(13, 110, 253, 0.939);box-shadow:inset 0 0 0 9999px rgba(var(--dt-row-selected, 0.939))}table.dataTable.display>tbody>tr.even>.sorting_1,table.dataTable.order-column.stripe>tbody>tr.even>.sorting_1{box-shadow:inset 0 0 0 9999px rgba(0, 0, 0, 0.019)}table.dataTable.display>tbody>tr.even>.sorting_2,table.dataTable.order-column.stripe>tbody>tr.even>.sorting_2{box-shadow:inset 0 0 0 9999px rgba(0, 0, 0, 0.011)}table.dataTable.display>tbody>tr.even>.sorting_3,table.dataTable.order-column.stripe>tbody>tr.even>.sorting_3{box-shadow:inset 0 0 0 9999px rgba(0, 0, 0, 0.003)}table.dataTable.display>tbody>tr.even.selected>.sorting_1,table.dataTable.order-column.stripe>tbody>tr.even.selected>.sorting_1{box-shadow:inset 0 0 0 9999px rgba(13, 110, 253, 0.919);box-shadow:inset 0 0 0 9999px rgba(var(--dt-row-selected, 0.919))}table.dataTable.display>tbody>tr.even.selected>.sorting_2,table.dataTable.order-column.stripe>tbody>tr.even.selected>.sorting_2{box-shadow:inset 0 0 0 9999px rgba(13, 110, 253, 0.911);box-shadow:inset 0 0 0 9999px rgba(var(--dt-row-selected, 0.911))}table.dataTable.display>tbody>tr.even.selected>.sorting_3,table.dataTable.order-column.stripe>tbody>tr.even.selected>.sorting_3{box-shadow:inset 0 0 0 9999px rgba(13, 110, 253, 0.903);box-shadow:inset 0 0 0 9999px rgba(var(--dt-row-selected, 0.903))}table.dataTable.display tbody tr:hover>.sorting_1,table.dataTable.order-column.hover tbody tr:hover>.sorting_1{box-shadow:inset 0 0 0 9999px rgba(0, 0, 0, 0.082)}table.dataTable.display tbody tr:hover>.sorting_2,table.dataTable.order-column.hover tbody tr:hover>.sorting_2{box-shadow:inset 0 0 0 9999px rgba(0, 0, 0, 0.074)}table.dataTable.display tbody tr:hover>.sorting_3,table.dataTable.order-column.hover tbody tr:hover>.sorting_3{box-shadow:inset 0 0 0 9999px rgba(0, 0, 0, 0.062)}table.dataTable.display tbody tr:hover.selected>.sorting_1,table.dataTable.order-column.hover tbody tr:hover.selected>.sorting_1{box-shadow:inset 0 0 0 9999px rgba(13, 110, 253, 0.982);box-shadow:inset 0 0 0 9999px rgba(var(--dt-row-selected, 0.982))}table.dataTable.display tbody tr:hover.selected>.sorting_2,table.dataTable.order-column.hover tbody tr:hover.selected>.sorting_2{box-shadow:inset 0 0 0 9999px rgba(13, 110, 253, 0.974);box-shadow:inset 0 0 0 9999px rgba(var(--dt-row-selected, 0.974))}table.dataTable.display tbody tr:hover.selected>.sorting_3,table.dataTable.order-column.hover tbody tr:hover.selected>.sorting_3{box-shadow:inset 0 0 0 9999px rgba(13, 110, 253, 0.962);box-shadow:inset 0 0 0 9999px rgba(var(--dt-row-selected, 0.962))}table.dataTable.no-footer{border-bottom:1px solid rgba(0, 0, 0, 0.3)}table.dataTable.compact thead th,table.dataTable.compact thead td,table.dataTable.compact tfoot th,table.dataTable.compact tfoot td,table.dataTable.compact tbody th,table.dataTable.compact tbody td{padding:4px}table.dataTable th,table.dataTable td{box-sizing:content-box}.dataTables_wrapper{position:relative;clear:both}.dataTables_wrapper .dataTables_length{float:left}.dataTables_wrapper .dataTables_length select{border:1px solid #aaa;border-radius:3px;padding:5px;background-color:transparent;padding:4px}.dataTables_wrapper .dataTables_filter{float:right;text-align:right}.dataTables_wrapper .dataTables_filter input{border:1px solid #aaa;border-radius:3px;padding:5px;background-color:transparent;margin-left:3px}.dataTables_wrapper .dataTables_info{clear:both;float:left;padding-top:.755em}.dataTables_wrapper .dataTables_paginate{float:right;text-align:right;padding-top:.25em}.dataTables_wrapper .dataTables_paginate .paginate_button{box-sizing:border-box;display:inline-block;min-width:1.5em;padding:.5em 1em;margin-left:2px;text-align:center;text-decoration:none !important;cursor:pointer;color:inherit !important;border:1px solid transparent;border-radius:2px;background:transparent}.dataTables_wrapper .dataTables_paginate .paginate_button.current,.dataTables_wrapper .dataTables_paginate .paginate_button.current:hover{color:inherit !important;border:1px solid rgba(0, 0, 0, 0.3);background-color:rgba(230, 230, 230, 0.1);background:-webkit-gradient(linear, left top, left bottom, color-stop(0%, rgba(230, 230, 230, 0.1)), color-stop(100%, rgba(0, 0, 0, 0.1)));background:-webkit-linear-gradient(top, rgba(230, 230, 230, 0.1) 0%, rgba(0, 0, 0, 0.1) 100%);background:-moz-linear-gradient(top, rgba(230, 230, 230, 0.1) 0%, rgba(0, 0, 0, 0.1) 100%);background:-ms-linear-gradient(top, rgba(230, 230, 230, 0.1) 0%, rgba(0, 0, 0, 0.1) 100%);background:-o-linear-gradient(top, rgba(230, 230, 230, 0.1) 0%, rgba(0, 0, 0, 0.1) 100%);background:linear-gradient(to bottom, rgba(230, 230, 230, 0.1) 0%, rgba(0, 0, 0, 0.1) 100%)}.dataTables_wrapper .dataTables_paginate .paginate_button.disabled,.dataTables_wrapper .dataTables_paginate .paginate_button.disabled:hover,.dataTables_wrapper .dataTables_paginate .paginate_button.disabled:active{cursor:default;color:#666 !important;border:1px solid transparent;background:transparent;box-shadow:none}.dataTables_wrapper .dataTables_paginate .paginate_button:hover{color:white !important;border:1px solid #111;background-color:#585858;background:-webkit-gradient(linear, left top, left bottom, color-stop(0%, #585858), color-stop(100%, #111));background:-webkit-linear-gradient(top, #585858 0%, #111 100%);background:-moz-linear-gradient(top, #585858 0%, #111 100%);background:-ms-linear-gradient(top, #585858 0%, #111 100%);background:-o-linear-gradient(top, #585858 0%, #111 100%);background:linear-gradient(to bottom, #585858 0%, #111 100%)}.dataTables_wrapper .dataTables_paginate .paginate_button:active{outline:none;background-color:#2b2b2b;background:-webkit-gradient(linear, left top, left bottom, color-stop(0%, #2b2b2b), color-stop(100%, #0c0c0c));background:-webkit-linear-gradient(top, #2b2b2b 0%, #0c0c0c 100%);background:-moz-linear-gradient(top, #2b2b2b 0%, #0c0c0c 100%);background:-ms-linear-gradient(top, #2b2b2b 0%, #0c0c0c 100%);background:-o-linear-gradient(top, #2b2b2b 0%, #0c0c0c 100%);background:linear-gradient(to bottom, #2b2b2b 0%, #0c0c0c 100%);box-shadow:inset 0 0 3px #111}.dataTables_wrapper .dataTables_paginate .ellipsis{padding:0 1em}.dataTables_wrapper .dataTables_length,.dataTables_wrapper .dataTables_filter,.dataTables_wrapper .dataTables_info,.dataTables_wrapper .dataTables_processing,.dataTables_wrapper .dataTables_paginate{color:inherit}.dataTables_wrapper .dataTables_scroll{clear:both}.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody{-webkit-overflow-scrolling:touch}.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody>table>thead>tr>th,.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody>table>thead>tr>td,.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody>table>tbody>tr>th,.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody>table>tbody>tr>td{vertical-align:middle}.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody>table>thead>tr>th>div.dataTables_sizing,.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody>table>thead>tr>td>div.dataTables_sizing,.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody>table>tbody>tr>th>div.dataTables_sizing,.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody>table>tbody>tr>td>div.dataTables_sizing{height:0;overflow:hidden;margin:0 !important;padding:0 !important}.dataTables_wrapper.no-footer .dataTables_scrollBody{border-bottom:1px solid rgba(0, 0, 0, 0.3)}.dataTables_wrapper.no-footer div.dataTables_scrollHead table.dataTable,.dataTables_wrapper.no-footer div.dataTables_scrollBody>table{border-bottom:none}.dataTables_wrapper:after{visibility:hidden;display:block;content:"";clear:both;height:0}@media screen and (max-width: 767px){.dataTables_wrapper .dataTables_info,.dataTables_wrapper .dataTables_paginate{float:none;text-align:center}.dataTables_wrapper .dataTables_paginate{margin-top:.5em}}@media screen and (max-width: 640px){.dataTables_wrapper .dataTables_length,.dataTables_wrapper .dataTables_filter{float:none;text-align:center}.dataTables_wrapper .dataTables_filter{margin-top:.5em}} +:root{--dt-row-selected: 13, 110, 253;--dt-row-selected-text: 255, 255, 255;--dt-row-selected-link: 9, 10, 11}table.dataTable td.dt-control{text-align:center;cursor:pointer}table.dataTable td.dt-control:before{height:1em;width:1em;margin-top:-9px;display:inline-block;color:white;border:.15em solid white;border-radius:1em;box-shadow:0 0 .2em #444;box-sizing:content-box;text-align:center;text-indent:0 !important;font-family:"Courier New",Courier,monospace;line-height:1em;content:"+";background-color:#31b131}table.dataTable tr.dt-hasChild td.dt-control:before{content:"-";background-color:#d33333}table.dataTable thead>tr>th.sorting,table.dataTable thead>tr>th.sorting_asc,table.dataTable thead>tr>th.sorting_desc,table.dataTable thead>tr>th.sorting_asc_disabled,table.dataTable thead>tr>th.sorting_desc_disabled,table.dataTable thead>tr>td.sorting,table.dataTable thead>tr>td.sorting_asc,table.dataTable thead>tr>td.sorting_desc,table.dataTable thead>tr>td.sorting_asc_disabled,table.dataTable thead>tr>td.sorting_desc_disabled{cursor:pointer;position:relative;padding-left:26px}table.dataTable thead>tr>th.sorting:before,table.dataTable thead>tr>th.sorting:after,table.dataTable thead>tr>th.sorting_asc:before,table.dataTable thead>tr>th.sorting_asc:after,table.dataTable thead>tr>th.sorting_desc:before,table.dataTable thead>tr>th.sorting_desc:after,table.dataTable thead>tr>th.sorting_asc_disabled:before,table.dataTable thead>tr>th.sorting_asc_disabled:after,table.dataTable thead>tr>th.sorting_desc_disabled:before,table.dataTable thead>tr>th.sorting_desc_disabled:after,table.dataTable thead>tr>td.sorting:before,table.dataTable thead>tr>td.sorting:after,table.dataTable thead>tr>td.sorting_asc:before,table.dataTable thead>tr>td.sorting_asc:after,table.dataTable thead>tr>td.sorting_desc:before,table.dataTable thead>tr>td.sorting_desc:after,table.dataTable thead>tr>td.sorting_asc_disabled:before,table.dataTable thead>tr>td.sorting_asc_disabled:after,table.dataTable thead>tr>td.sorting_desc_disabled:before,table.dataTable thead>tr>td.sorting_desc_disabled:after{position:absolute;display:block;opacity:.125;left:10px;line-height:9px;font-size:.8em}table.dataTable thead>tr>th.sorting:before,table.dataTable thead>tr>th.sorting_asc:before,table.dataTable thead>tr>th.sorting_desc:before,table.dataTable thead>tr>th.sorting_asc_disabled:before,table.dataTable thead>tr>th.sorting_desc_disabled:before,table.dataTable thead>tr>td.sorting:before,table.dataTable thead>tr>td.sorting_asc:before,table.dataTable thead>tr>td.sorting_desc:before,table.dataTable thead>tr>td.sorting_asc_disabled:before,table.dataTable thead>tr>td.sorting_desc_disabled:before{bottom:50%;content:"▲";content:"▲"/""}table.dataTable thead>tr>th.sorting:after,table.dataTable thead>tr>th.sorting_asc:after,table.dataTable thead>tr>th.sorting_desc:after,table.dataTable thead>tr>th.sorting_asc_disabled:after,table.dataTable thead>tr>th.sorting_desc_disabled:after,table.dataTable thead>tr>td.sorting:after,table.dataTable thead>tr>td.sorting_asc:after,table.dataTable thead>tr>td.sorting_desc:after,table.dataTable thead>tr>td.sorting_asc_disabled:after,table.dataTable thead>tr>td.sorting_desc_disabled:after{top:50%;content:"▼";content:"▼"/""}table.dataTable thead>tr>th.sorting_asc:before,table.dataTable thead>tr>th.sorting_desc:after,table.dataTable thead>tr>td.sorting_asc:before,table.dataTable thead>tr>td.sorting_desc:after{opacity:.6}table.dataTable thead>tr>th.sorting_desc_disabled:after,table.dataTable thead>tr>th.sorting_asc_disabled:before,table.dataTable thead>tr>td.sorting_desc_disabled:after,table.dataTable thead>tr>td.sorting_asc_disabled:before{display:none}table.dataTable thead>tr>th:active,table.dataTable thead>tr>td:active{outline:none}div.dataTables_scrollBody>table.dataTable>thead>tr>th:before,div.dataTables_scrollBody>table.dataTable>thead>tr>th:after,div.dataTables_scrollBody>table.dataTable>thead>tr>td:before,div.dataTables_scrollBody>table.dataTable>thead>tr>td:after{display:none}div.dataTables_processing{position:absolute;top:50%;left:50%;width:200px;margin-left:-100px;margin-top:-26px;text-align:center;padding:2px}div.dataTables_processing>div:last-child{position:relative;width:80px;height:15px;margin:1em auto}div.dataTables_processing>div:last-child>div{position:absolute;top:0;width:13px;height:13px;border-radius:50%;background:rgb(13, 110, 253);background:rgb(var(--dt-row-selected));animation-timing-function:cubic-bezier(0, 1, 1, 0)}div.dataTables_processing>div:last-child>div:nth-child(1){left:8px;animation:datatables-loader-1 .6s infinite}div.dataTables_processing>div:last-child>div:nth-child(2){left:8px;animation:datatables-loader-2 .6s infinite}div.dataTables_processing>div:last-child>div:nth-child(3){left:32px;animation:datatables-loader-2 .6s infinite}div.dataTables_processing>div:last-child>div:nth-child(4){left:56px;animation:datatables-loader-3 .6s infinite}@keyframes datatables-loader-1{0%{transform:scale(0)}100%{transform:scale(1)}}@keyframes datatables-loader-3{0%{transform:scale(1)}100%{transform:scale(0)}}@keyframes datatables-loader-2{0%{transform:translate(0, 0)}100%{transform:translate(24px, 0)}}table.dataTable.nowrap th,table.dataTable.nowrap td{white-space:nowrap}table.dataTable th.dt-left,table.dataTable td.dt-left{text-align:left}table.dataTable th.dt-center,table.dataTable td.dt-center,table.dataTable td.dataTables_empty{text-align:center}table.dataTable th.dt-right,table.dataTable td.dt-right{text-align:right}table.dataTable th.dt-justify,table.dataTable td.dt-justify{text-align:justify}table.dataTable th.dt-nowrap,table.dataTable td.dt-nowrap{white-space:nowrap}table.dataTable thead th,table.dataTable thead td,table.dataTable tfoot th,table.dataTable tfoot td{text-align:left}table.dataTable thead th.dt-head-left,table.dataTable thead td.dt-head-left,table.dataTable tfoot th.dt-head-left,table.dataTable tfoot td.dt-head-left{text-align:left}table.dataTable thead th.dt-head-center,table.dataTable thead td.dt-head-center,table.dataTable tfoot th.dt-head-center,table.dataTable tfoot td.dt-head-center{text-align:center}table.dataTable thead th.dt-head-right,table.dataTable thead td.dt-head-right,table.dataTable tfoot th.dt-head-right,table.dataTable tfoot td.dt-head-right{text-align:right}table.dataTable thead th.dt-head-justify,table.dataTable thead td.dt-head-justify,table.dataTable tfoot th.dt-head-justify,table.dataTable tfoot td.dt-head-justify{text-align:justify}table.dataTable thead th.dt-head-nowrap,table.dataTable thead td.dt-head-nowrap,table.dataTable tfoot th.dt-head-nowrap,table.dataTable tfoot td.dt-head-nowrap{white-space:nowrap}table.dataTable tbody th.dt-body-left,table.dataTable tbody td.dt-body-left{text-align:left}table.dataTable tbody th.dt-body-center,table.dataTable tbody td.dt-body-center{text-align:center}table.dataTable tbody th.dt-body-right,table.dataTable tbody td.dt-body-right{text-align:right}table.dataTable tbody th.dt-body-justify,table.dataTable tbody td.dt-body-justify{text-align:justify}table.dataTable tbody th.dt-body-nowrap,table.dataTable tbody td.dt-body-nowrap{white-space:nowrap}table.dataTable{width:100%;margin:0 auto;clear:both;border-collapse:separate;border-spacing:0}table.dataTable thead th,table.dataTable tfoot th{font-weight:bold}table.dataTable thead th,table.dataTable thead td{padding:10px;border-bottom:1px solid rgba(0, 0, 0, 0.3)}table.dataTable thead th:active,table.dataTable thead td:active{outline:none}table.dataTable tfoot th,table.dataTable tfoot td{padding:10px 10px 6px 10px;border-top:1px solid rgba(0, 0, 0, 0.3)}table.dataTable tbody tr{background-color:transparent}table.dataTable tbody tr.selected>*{box-shadow:inset 0 0 0 9999px rgba(13, 110, 253, 0.9);box-shadow:inset 0 0 0 9999px rgba(var(--dt-row-selected), 0.9);color:rgb(255, 255, 255);color:rgb(var(--dt-row-selected-text))}table.dataTable tbody tr.selected a{color:rgb(9, 10, 11);color:rgb(var(--dt-row-selected-link))}table.dataTable tbody th,table.dataTable tbody td{padding:8px 10px}table.dataTable.row-border tbody th,table.dataTable.row-border tbody td,table.dataTable.display tbody th,table.dataTable.display tbody td{border-top:1px solid rgba(0, 0, 0, 0.15)}table.dataTable.row-border tbody tr:first-child th,table.dataTable.row-border tbody tr:first-child td,table.dataTable.display tbody tr:first-child th,table.dataTable.display tbody tr:first-child td{border-top:none}table.dataTable.cell-border tbody th,table.dataTable.cell-border tbody td{border-top:1px solid rgba(0, 0, 0, 0.15);border-right:1px solid rgba(0, 0, 0, 0.15)}table.dataTable.cell-border tbody tr th:first-child,table.dataTable.cell-border tbody tr td:first-child{border-left:1px solid rgba(0, 0, 0, 0.15)}table.dataTable.cell-border tbody tr:first-child th,table.dataTable.cell-border tbody tr:first-child td{border-top:none}table.dataTable.stripe>tbody>tr.odd>*,table.dataTable.display>tbody>tr.odd>*{box-shadow:inset 0 0 0 9999px rgba(0, 0, 0, 0.023)}table.dataTable.stripe>tbody>tr.odd.selected>*,table.dataTable.display>tbody>tr.odd.selected>*{box-shadow:inset 0 0 0 9999px rgba(13, 110, 253, 0.923);box-shadow:inset 0 0 0 9999px rgba(var(--dt-row-selected, 0.923))}table.dataTable.hover>tbody>tr:hover>*,table.dataTable.display>tbody>tr:hover>*{box-shadow:inset 0 0 0 9999px rgba(0, 0, 0, 0.035)}table.dataTable.hover>tbody>tr.selected:hover>*,table.dataTable.display>tbody>tr.selected:hover>*{box-shadow:inset 0 0 0 9999px #0d6efd !important;box-shadow:inset 0 0 0 9999px rgba(var(--dt-row-selected, 1)) !important}table.dataTable.order-column>tbody tr>.sorting_1,table.dataTable.order-column>tbody tr>.sorting_2,table.dataTable.order-column>tbody tr>.sorting_3,table.dataTable.display>tbody tr>.sorting_1,table.dataTable.display>tbody tr>.sorting_2,table.dataTable.display>tbody tr>.sorting_3{box-shadow:inset 0 0 0 9999px rgba(0, 0, 0, 0.019)}table.dataTable.order-column>tbody tr.selected>.sorting_1,table.dataTable.order-column>tbody tr.selected>.sorting_2,table.dataTable.order-column>tbody tr.selected>.sorting_3,table.dataTable.display>tbody tr.selected>.sorting_1,table.dataTable.display>tbody tr.selected>.sorting_2,table.dataTable.display>tbody tr.selected>.sorting_3{box-shadow:inset 0 0 0 9999px rgba(13, 110, 253, 0.919);box-shadow:inset 0 0 0 9999px rgba(var(--dt-row-selected, 0.919))}table.dataTable.display>tbody>tr.odd>.sorting_1,table.dataTable.order-column.stripe>tbody>tr.odd>.sorting_1{box-shadow:inset 0 0 0 9999px rgba(0, 0, 0, 0.054)}table.dataTable.display>tbody>tr.odd>.sorting_2,table.dataTable.order-column.stripe>tbody>tr.odd>.sorting_2{box-shadow:inset 0 0 0 9999px rgba(0, 0, 0, 0.047)}table.dataTable.display>tbody>tr.odd>.sorting_3,table.dataTable.order-column.stripe>tbody>tr.odd>.sorting_3{box-shadow:inset 0 0 0 9999px rgba(0, 0, 0, 0.039)}table.dataTable.display>tbody>tr.odd.selected>.sorting_1,table.dataTable.order-column.stripe>tbody>tr.odd.selected>.sorting_1{box-shadow:inset 0 0 0 9999px rgba(13, 110, 253, 0.954);box-shadow:inset 0 0 0 9999px rgba(var(--dt-row-selected, 0.954))}table.dataTable.display>tbody>tr.odd.selected>.sorting_2,table.dataTable.order-column.stripe>tbody>tr.odd.selected>.sorting_2{box-shadow:inset 0 0 0 9999px rgba(13, 110, 253, 0.947);box-shadow:inset 0 0 0 9999px rgba(var(--dt-row-selected, 0.947))}table.dataTable.display>tbody>tr.odd.selected>.sorting_3,table.dataTable.order-column.stripe>tbody>tr.odd.selected>.sorting_3{box-shadow:inset 0 0 0 9999px rgba(13, 110, 253, 0.939);box-shadow:inset 0 0 0 9999px rgba(var(--dt-row-selected, 0.939))}table.dataTable.display>tbody>tr.even>.sorting_1,table.dataTable.order-column.stripe>tbody>tr.even>.sorting_1{box-shadow:inset 0 0 0 9999px rgba(0, 0, 0, 0.019)}table.dataTable.display>tbody>tr.even>.sorting_2,table.dataTable.order-column.stripe>tbody>tr.even>.sorting_2{box-shadow:inset 0 0 0 9999px rgba(0, 0, 0, 0.011)}table.dataTable.display>tbody>tr.even>.sorting_3,table.dataTable.order-column.stripe>tbody>tr.even>.sorting_3{box-shadow:inset 0 0 0 9999px rgba(0, 0, 0, 0.003)}table.dataTable.display>tbody>tr.even.selected>.sorting_1,table.dataTable.order-column.stripe>tbody>tr.even.selected>.sorting_1{box-shadow:inset 0 0 0 9999px rgba(13, 110, 253, 0.919);box-shadow:inset 0 0 0 9999px rgba(var(--dt-row-selected, 0.919))}table.dataTable.display>tbody>tr.even.selected>.sorting_2,table.dataTable.order-column.stripe>tbody>tr.even.selected>.sorting_2{box-shadow:inset 0 0 0 9999px rgba(13, 110, 253, 0.911);box-shadow:inset 0 0 0 9999px rgba(var(--dt-row-selected, 0.911))}table.dataTable.display>tbody>tr.even.selected>.sorting_3,table.dataTable.order-column.stripe>tbody>tr.even.selected>.sorting_3{box-shadow:inset 0 0 0 9999px rgba(13, 110, 253, 0.903);box-shadow:inset 0 0 0 9999px rgba(var(--dt-row-selected, 0.903))}table.dataTable.display tbody tr:hover>.sorting_1,table.dataTable.order-column.hover tbody tr:hover>.sorting_1{box-shadow:inset 0 0 0 9999px rgba(0, 0, 0, 0.082)}table.dataTable.display tbody tr:hover>.sorting_2,table.dataTable.order-column.hover tbody tr:hover>.sorting_2{box-shadow:inset 0 0 0 9999px rgba(0, 0, 0, 0.074)}table.dataTable.display tbody tr:hover>.sorting_3,table.dataTable.order-column.hover tbody tr:hover>.sorting_3{box-shadow:inset 0 0 0 9999px rgba(0, 0, 0, 0.062)}table.dataTable.display tbody tr:hover.selected>.sorting_1,table.dataTable.order-column.hover tbody tr:hover.selected>.sorting_1{box-shadow:inset 0 0 0 9999px rgba(13, 110, 253, 0.982);box-shadow:inset 0 0 0 9999px rgba(var(--dt-row-selected, 0.982))}table.dataTable.display tbody tr:hover.selected>.sorting_2,table.dataTable.order-column.hover tbody tr:hover.selected>.sorting_2{box-shadow:inset 0 0 0 9999px rgba(13, 110, 253, 0.974);box-shadow:inset 0 0 0 9999px rgba(var(--dt-row-selected, 0.974))}table.dataTable.display tbody tr:hover.selected>.sorting_3,table.dataTable.order-column.hover tbody tr:hover.selected>.sorting_3{box-shadow:inset 0 0 0 9999px rgba(13, 110, 253, 0.962);box-shadow:inset 0 0 0 9999px rgba(var(--dt-row-selected, 0.962))}table.dataTable.no-footer{border-bottom:1px solid rgba(0, 0, 0, 0.3)}table.dataTable.compact thead th,table.dataTable.compact thead td,table.dataTable.compact tfoot th,table.dataTable.compact tfoot td,table.dataTable.compact tbody th,table.dataTable.compact tbody td{padding:4px}table.dataTable th,table.dataTable td{box-sizing:content-box}.dataTables_wrapper{position:relative;clear:both}.dataTables_wrapper .dataTables_length{float:left}.dataTables_wrapper .dataTables_length select{border:1px solid #aaa;border-radius:3px;padding:5px;background-color:transparent;padding:4px}.dataTables_wrapper .dataTables_filter{float:right;text-align:right}.dataTables_wrapper .dataTables_filter input{border:1px solid #aaa;border-radius:3px;padding:5px;background-color:transparent;margin-left:3px}.dataTables_wrapper .dataTables_info{clear:both;float:left;padding-top:.755em}.dataTables_wrapper .dataTables_paginate{float:right;text-align:right;padding-top:.25em}.dataTables_wrapper .dataTables_paginate .paginate_button{box-sizing:border-box;display:inline-block;min-width:1.5em;padding:.5em 1em;margin-left:2px;text-align:center;text-decoration:none !important;cursor:pointer;color:inherit !important;border:1px solid transparent;border-radius:2px;background:transparent}.dataTables_wrapper .dataTables_paginate .paginate_button.current,.dataTables_wrapper .dataTables_paginate .paginate_button.current:hover{color:inherit !important;border:1px solid rgba(0, 0, 0, 0.3);background-color:rgba(230, 230, 230, 0.1);background:-webkit-gradient(linear, left top, left bottom, color-stop(0%, rgba(230, 230, 230, 0.1)), color-stop(100%, rgba(0, 0, 0, 0.1)));background:-webkit-linear-gradient(top, rgba(230, 230, 230, 0.1) 0%, rgba(0, 0, 0, 0.1) 100%);background:-moz-linear-gradient(top, rgba(230, 230, 230, 0.1) 0%, rgba(0, 0, 0, 0.1) 100%);background:-ms-linear-gradient(top, rgba(230, 230, 230, 0.1) 0%, rgba(0, 0, 0, 0.1) 100%);background:-o-linear-gradient(top, rgba(230, 230, 230, 0.1) 0%, rgba(0, 0, 0, 0.1) 100%);background:linear-gradient(to bottom, rgba(230, 230, 230, 0.1) 0%, rgba(0, 0, 0, 0.1) 100%)}.dataTables_wrapper .dataTables_paginate .paginate_button.disabled,.dataTables_wrapper .dataTables_paginate .paginate_button.disabled:hover,.dataTables_wrapper .dataTables_paginate .paginate_button.disabled:active{cursor:default;color:#666 !important;border:1px solid transparent;background:transparent;box-shadow:none}.dataTables_wrapper .dataTables_paginate .paginate_button:hover{color:white !important;border:1px solid #111;background-color:#585858;background:-webkit-gradient(linear, left top, left bottom, color-stop(0%, #585858), color-stop(100%, #111));background:-webkit-linear-gradient(top, #585858 0%, #111 100%);background:-moz-linear-gradient(top, #585858 0%, #111 100%);background:-ms-linear-gradient(top, #585858 0%, #111 100%);background:-o-linear-gradient(top, #585858 0%, #111 100%);background:linear-gradient(to bottom, #585858 0%, #111 100%)}.dataTables_wrapper .dataTables_paginate .paginate_button:active{outline:none;background-color:#2b2b2b;background:-webkit-gradient(linear, left top, left bottom, color-stop(0%, #2b2b2b), color-stop(100%, #0c0c0c));background:-webkit-linear-gradient(top, #2b2b2b 0%, #0c0c0c 100%);background:-moz-linear-gradient(top, #2b2b2b 0%, #0c0c0c 100%);background:-ms-linear-gradient(top, #2b2b2b 0%, #0c0c0c 100%);background:-o-linear-gradient(top, #2b2b2b 0%, #0c0c0c 100%);background:linear-gradient(to bottom, #2b2b2b 0%, #0c0c0c 100%);box-shadow:inset 0 0 3px #111}.dataTables_wrapper .dataTables_paginate .ellipsis{padding:0 1em}.dataTables_wrapper .dataTables_length,.dataTables_wrapper .dataTables_filter,.dataTables_wrapper .dataTables_info,.dataTables_wrapper .dataTables_processing,.dataTables_wrapper .dataTables_paginate{color:inherit}.dataTables_wrapper .dataTables_scroll{clear:both}.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody{-webkit-overflow-scrolling:touch}.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody>table>thead>tr>th,.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody>table>thead>tr>td,.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody>table>tbody>tr>th,.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody>table>tbody>tr>td{vertical-align:middle}.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody>table>thead>tr>th>div.dataTables_sizing,.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody>table>thead>tr>td>div.dataTables_sizing,.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody>table>tbody>tr>th>div.dataTables_sizing,.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody>table>tbody>tr>td>div.dataTables_sizing{height:0;overflow:hidden;margin:0 !important;padding:0 !important}.dataTables_wrapper.no-footer .dataTables_scrollBody{border-bottom:1px solid rgba(0, 0, 0, 0.3)}.dataTables_wrapper.no-footer div.dataTables_scrollHead table.dataTable,.dataTables_wrapper.no-footer div.dataTables_scrollBody>table{border-bottom:none}.dataTables_wrapper:after{visibility:hidden;display:block;content:"";clear:both;height:0}@media screen and (max-width: 767px){.dataTables_wrapper .dataTables_info,.dataTables_wrapper .dataTables_paginate{float:none;text-align:center}.dataTables_wrapper .dataTables_paginate{margin-top:.5em}}@media screen and (max-width: 640px){.dataTables_wrapper .dataTables_length,.dataTables_wrapper .dataTables_filter{float:none;text-align:center}.dataTables_wrapper .dataTables_filter{margin-top:.5em}} From 6cd57cc16e683dc644a5c8af567018c2f96337e1 Mon Sep 17 00:00:00 2001 From: hyunback kim Date: Fri, 14 Jun 2024 12:23:26 +0900 Subject: [PATCH 08/31] [GPU] Enable shape agnostic Gemm in dpas platform. (#24916) Current Gemm in dpas always compile and use onednn kernel in 1st inference. Shape agnostic Gemm kernel is not used. So PR enable SA Gemm in dpas for reducing 1st inference latency. ### Tickets: - *143315* --------- Signed-off-by: hyunback --- .../include/intel_gpu/runtime/format.hpp | 3 +- .../src/graph/impls/onednn/gemm_onednn.cpp | 69 ++++++++++++++++--- .../src/graph/impls/onednn/utils.cpp | 1 + .../intel_gpu/src/graph/include/gemm_inst.h | 10 +-- .../intel_gpu/src/graph/layout_optimizer.cpp | 20 ------ .../src/plugin/transformations_pipeline.cpp | 4 -- src/plugins/intel_gpu/src/runtime/format.cpp | 1 + .../tests/unit/test_cases/gemm_gpu_test.cpp | 6 ++ .../unit/test_cases/hash_key_gpu_test.cpp | 6 +- 9 files changed, 80 insertions(+), 40 deletions(-) diff --git a/src/plugins/intel_gpu/include/intel_gpu/runtime/format.hpp b/src/plugins/intel_gpu/include/intel_gpu/runtime/format.hpp index 75e0425e961457..7fb92284edf1dd 100644 --- a/src/plugins/intel_gpu/include/intel_gpu/runtime/format.hpp +++ b/src/plugins/intel_gpu/include/intel_gpu/runtime/format.hpp @@ -75,6 +75,7 @@ struct format { enum type : int32_t { // Data formats bfyx, ///< the most common format for activations in clDNN. + bfxy, bfzyx, ///< format for 5d data tensors bfwzyx, ///< batch, feature, 4D spatial bfuwzyx, ///< 7d tensor @@ -291,7 +292,7 @@ struct format { /// @brief Checks if @p format is simple data format static bool is_simple_data_format(const format& fmt) { return (fmt == yxfb || fmt == byxf || fmt == byfx || fmt == bxfy || fmt == bfyx || fmt == fyxb || fmt == fybx || - fmt == xbfy || fmt == ybfx || fmt == fbyx || fmt == bfzyx || fmt == bfwzyx || fmt == bfuwzyx || + fmt == bfxy ||fmt == xbfy || fmt == ybfx || fmt == fbyx || fmt == bfzyx || fmt == bfwzyx || fmt == bfuwzyx || fmt == bfvuwzyx); } diff --git a/src/plugins/intel_gpu/src/graph/impls/onednn/gemm_onednn.cpp b/src/plugins/intel_gpu/src/graph/impls/onednn/gemm_onednn.cpp index 10c1a970d1793b..a9d0e93d879f95 100644 --- a/src/plugins/intel_gpu/src/graph/impls/onednn/gemm_onednn.cpp +++ b/src/plugins/intel_gpu/src/graph/impls/onednn/gemm_onednn.cpp @@ -81,7 +81,6 @@ struct gemm_onednn : typed_primitive_onednn_impl { if (gemm_with_bias) { in_layouts.emplace_back(impl_params.get_input_layout(2)); } - in_layouts = gemm_inst::transform_input_layouts(prim, in_layouts); out_l = gemm_inst::transform_output_layout(prim, in_layouts, out_l); @@ -129,14 +128,67 @@ struct gemm_onednn : typed_primitive_onednn_impl { in1_strides = onednn::get_strides(in1_padded_dims); } - if (prim->transpose_input0) { - in0_fmt = transpose_format(in0_fmt); - std::swap(in0_dims[in0_dims.size() - 1], in0_dims[in0_dims.size() - 2]); - } + // Check whether transpose_order increase sequential or not. + // Return true when transpose_order is not 0, 1, 2, 3. + auto has_transpose_order = [](std::vector transpose_order) { + for (size_t i = 0; i < transpose_order.size(); i++) { + if (i != static_cast(transpose_order[i])) { + return true; + } + } + return false; + }; - if (prim->transpose_input1) { - in1_fmt = transpose_format(in1_fmt); - std::swap(in1_dims[in1_dims.size() - 1], in1_dims[in1_dims.size() - 2]); + if (batched_dims_can_be_removed) { + if (has_transpose_order(prim->input0_transpose_order)) { + in0_fmt = transpose_format(in0_fmt); + std::swap(in0_dims[in0_dims.size() - 1], in0_dims[in0_dims.size() - 2]); + } + if (has_transpose_order(prim->input1_transpose_order)) { + in1_fmt = transpose_format(in1_fmt); + std::swap(in1_dims[in1_dims.size() - 1], in1_dims[in1_dims.size() - 2]); + } + if (has_transpose_order(prim->output_transpose_order)) { + out_fmt = transpose_format(out_fmt); + std::swap(out_dims[out_dims.size() - 1], out_dims[out_dims.size() - 2]); + } + } else { + auto transpose_dims_and_format_tag = [](std::vector transpose_order, + dnnl::memory::dims& dims, + dnnl::memory::format_tag& tag, + bool is_input = true) { + std::vector order(std::begin(transpose_order), std::end(transpose_order)); + if (dims.size() > order.size()) { + size_t orders_to_add = dims.size() - order.size(); + for (size_t i = 0; i < orders_to_add; ++i) + order.insert(order.begin(), i); + for (size_t i = orders_to_add; i < order.size(); ++i) + order[i] = order[i] + orders_to_add; + } + + bool ret = false; + format transposed_format = format::bfyx; + if (is_input) { + ret = gemm_inst::is_fusable_permute_input_order_onednn(order, transposed_format); + } else { + ret = gemm_inst::is_fusable_permute_output_order_onednn(order, transposed_format); + } + + if (ret) { + tag = convert_data_format(transposed_format); + dnnl::memory::dims original_dims = dims; + for (size_t i = 0; i < original_dims.size(); ++i) { + dims[i] = original_dims[order[i]]; + } + } else { + std::ostringstream ostream; + std::copy(order.begin(), order.end() - 1, std::ostream_iterator(ostream, ", ")); + OPENVINO_ASSERT(false, "[GPU] Can't find fusable transpoed format: ", ostream.str()); + } + }; + if (has_transpose_order(prim->input0_transpose_order)) transpose_dims_and_format_tag(prim->input0_transpose_order, in0_dims, in0_fmt); + if (has_transpose_order(prim->input1_transpose_order)) transpose_dims_and_format_tag(prim->input1_transpose_order, in1_dims, in1_fmt); + if (has_transpose_order(prim->output_transpose_order)) transpose_dims_and_format_tag(prim->output_transpose_order, out_dims, out_fmt, false); } if (gemm_with_bias) { @@ -374,6 +426,7 @@ attach_gemm_onednn::attach_gemm_onednn() { }; std::vector fmt = { format::bfyx, + format::bfxy, format::byxf, format::byfx, format::bxfy, diff --git a/src/plugins/intel_gpu/src/graph/impls/onednn/utils.cpp b/src/plugins/intel_gpu/src/graph/impls/onednn/utils.cpp index 6214a8db4d8255..a8ba49a96256ea 100644 --- a/src/plugins/intel_gpu/src/graph/impls/onednn/utils.cpp +++ b/src/plugins/intel_gpu/src/graph/impls/onednn/utils.cpp @@ -144,6 +144,7 @@ std::vector> format_map = { { cldnn::format::g_os_is_zyx_isv16_osv16, dnnl::memory::format_tag::gIOdhw16i16o }, { cldnn::format::bfyx, dnnl::memory::format_tag::nchw }, + { cldnn::format::bfxy, dnnl::memory::format_tag::abdc }, { cldnn::format::byxf, dnnl::memory::format_tag::nhwc }, { cldnn::format::byfx, dnnl::memory::format_tag::acbd }, { cldnn::format::bxfy, dnnl::memory::format_tag::adbc }, diff --git a/src/plugins/intel_gpu/src/graph/include/gemm_inst.h b/src/plugins/intel_gpu/src/graph/include/gemm_inst.h index f6b79c1d08c8e6..b6bb55ceb55497 100644 --- a/src/plugins/intel_gpu/src/graph/include/gemm_inst.h +++ b/src/plugins/intel_gpu/src/graph/include/gemm_inst.h @@ -39,6 +39,7 @@ class typed_primitive_inst : public typed_primitive_inst_base { static bool is_fusable_permute_input_order_onednn(const std::vector& permute_order, format& fmt) { const std::vector gemm_in_format_white_list = {format::bfyx, + format::bfxy, format::fyxb, format::byfx, format::bxfy, @@ -62,10 +63,11 @@ class typed_primitive_inst : public typed_primitive_inst_base { static bool is_fusable_permute_output_order_onednn(const std::vector& target_order, format& fmt) { const std::vector gemm_out_format_white_list = {format::bfyx, - format::fyxb, - format::fybx, - format::byfx, - format::ybfx}; + format::bfxy, + format::fyxb, + format::fybx, + format::byfx, + format::ybfx}; for (const auto& cand_format : gemm_out_format_white_list) { const auto cand_format_order = format::traits(static_cast(cand_format))._order; diff --git a/src/plugins/intel_gpu/src/graph/layout_optimizer.cpp b/src/plugins/intel_gpu/src/graph/layout_optimizer.cpp index f2c9457336c095..b7d4b7230247cd 100644 --- a/src/plugins/intel_gpu/src/graph/layout_optimizer.cpp +++ b/src/plugins/intel_gpu/src/graph/layout_optimizer.cpp @@ -949,26 +949,6 @@ static bool is_node_for_onednn(gemm_node const& node) { if (!layout_optimizer::are_data_types_suitable_for_onednn((program_node&)node)) return false; - auto gemm_prim = node.get_primitive(); - - for (size_t idx = 0; idx < gemm_prim->output_transpose_order.size(); idx++) { - if (idx != static_cast(gemm_prim->output_transpose_order[idx])) - return false; - } - - if (gemm_prim->transpose_input0 > 1 || gemm_prim->transpose_input0 > 1) - return false; - - for (size_t idx = 0; idx < (gemm_prim->input0_transpose_order.size() - 2); idx++) { - if (idx != static_cast(gemm_prim->input0_transpose_order[idx])) - return false; - } - - for (size_t idx = 0; idx < (gemm_prim->input1_transpose_order.size() - 2); idx++) { - if (idx != static_cast(gemm_prim->input1_transpose_order[idx])) - return false; - } - return true; } diff --git a/src/plugins/intel_gpu/src/plugin/transformations_pipeline.cpp b/src/plugins/intel_gpu/src/plugin/transformations_pipeline.cpp index 424c2341fbe472..4b18dbf3fa4b71 100644 --- a/src/plugins/intel_gpu/src/plugin/transformations_pipeline.cpp +++ b/src/plugins/intel_gpu/src/plugin/transformations_pipeline.cpp @@ -807,10 +807,6 @@ void TransformationsPipeline::apply(std::shared_ptr func) { manager.register_pass(); manager.register_pass(); manager.register_pass(); - if (device_info.supports_immad) { - manager.get_pass_config()->disable(); - manager.get_pass_config()->disable(); - } if (!device_info.supports_immad) { manager.register_pass(); diff --git a/src/plugins/intel_gpu/src/runtime/format.cpp b/src/plugins/intel_gpu/src/runtime/format.cpp index cdaa822c0fdec8..a4a8ad36681176 100644 --- a/src/plugins/intel_gpu/src/runtime/format.cpp +++ b/src/plugins/intel_gpu/src/runtime/format.cpp @@ -25,6 +25,7 @@ static const std::map format_traits_map { FMT_TRAITS(yxfb, 1, 1, 2, 0, {2, 3, 1, 0}, "yxfb", "bfxy", {}), FMT_TRAITS(byxf, 1, 1, 2, 0, {0, 2, 3, 1}, "byxf", "bfxy", {}), FMT_TRAITS(bfyx, 1, 1, 2, 0, {0, 1, 2, 3}, "bfyx", "bfxy", {}), + FMT_TRAITS(bfxy, 1, 1, 2, 0, {0, 1, 3, 2}, "bfxy", "bfxy", {}), FMT_TRAITS(fbyx, 1, 1, 2, 0, {1, 0, 2, 3}, "fbyx", "bfxy", {}), FMT_TRAITS(fyxb, 1, 1, 2, 0, {1, 2, 3, 0}, "fyxb", "bfxy", {}), FMT_TRAITS(fybx, 1, 1, 2, 0, {1, 2, 0, 3}, "fybx", "bfxy", {}), diff --git a/src/plugins/intel_gpu/tests/unit/test_cases/gemm_gpu_test.cpp b/src/plugins/intel_gpu/tests/unit/test_cases/gemm_gpu_test.cpp index 180d8cdb036483..7b1d1b6132f568 100644 --- a/src/plugins/intel_gpu/tests/unit/test_cases/gemm_gpu_test.cpp +++ b/src/plugins/intel_gpu/tests/unit/test_cases/gemm_gpu_test.cpp @@ -1563,6 +1563,8 @@ TEST_F(gemm_gpu_tests, transpose_matmul_transpose_static_3d) { this->test_transpose_matmul_transpose(3, false, false); } +#ifndef ENABLE_ONEDNN_FOR_GPU +// Disable onednn test because onednn does not support format_tag::cbda, format_tag::badc. TEST_F(gemm_gpu_tests, transpose_matmul_transpose_dynamic_4d) { this->test_transpose_matmul_transpose(4, true, false); } @@ -1570,6 +1572,7 @@ TEST_F(gemm_gpu_tests, transpose_matmul_transpose_dynamic_4d) { TEST_F(gemm_gpu_tests, transpose_matmul_transpose_static_4d) { this->test_transpose_matmul_transpose(4, false, false); } +#endif INSTANTIATE_TEST_SUITE_P( GemmGPUTest_t1t2, @@ -3224,7 +3227,10 @@ TEST_F(gemm_gpu_tests, transpose_matmul_dynamic_4d_cached) { this->test_transpose_matmul_f16(4, true, true, /*BMKN*/{19, 37, 23, 29}, /*input0_order*/{0, 2, 3, 1}, /*input1_order*/{1, 2, 3, 0}); } +#ifndef ENABLE_ONEDNN_FOR_GPU +// Disable onednn test because onednn does not support format_tag::cbda, format_tag::badc. TEST_F(gemm_gpu_tests, transpose_matmul_transpose_dynamic_4d_cached) { this->test_transpose_matmul_transpose(4, true, true); } +#endif } // namespace diff --git a/src/plugins/intel_gpu/tests/unit/test_cases/hash_key_gpu_test.cpp b/src/plugins/intel_gpu/tests/unit/test_cases/hash_key_gpu_test.cpp index 873ad4f85a0ded..e9f2338b67d86e 100644 --- a/src/plugins/intel_gpu/tests/unit/test_cases/hash_key_gpu_test.cpp +++ b/src/plugins/intel_gpu/tests/unit/test_cases/hash_key_gpu_test.cpp @@ -105,7 +105,7 @@ class check_hash_value: public ::testing::Test { const auto params_hash = prim_inst->get_impl_params()->hash(); ASSERT_EQ(primitive_hash, 8439414674502129643UL); - ASSERT_EQ(params_hash, 9235751886952244871UL); + ASSERT_EQ(params_hash, 18030913546439900045UL); } void test_gemm_basic(bool is_caching_test) { @@ -176,7 +176,7 @@ class check_hash_value: public ::testing::Test { const auto params_hash = prim_inst->get_impl_params()->hash(); ASSERT_EQ(primitive_hash, 16293979194373117693UL); - ASSERT_EQ(params_hash, 4712165546063627148UL); + ASSERT_EQ(params_hash, 3339057685641907457UL); } void test_reshape_basic(bool is_caching_test) { @@ -225,7 +225,7 @@ class check_hash_value: public ::testing::Test { const auto params_hash = prim_inst->get_impl_params()->hash(); ASSERT_EQ(primitive_hash, 13549661972131371304UL); - ASSERT_EQ(params_hash, 7127098854451559675UL); + ASSERT_EQ(params_hash, 17196242702975187963UL); } void test_quantize_basic(bool is_caching_test) { From 7b519903c348188c0d0464f7670f7ddd267b1235 Mon Sep 17 00:00:00 2001 From: Sebastian Golebiewski Date: Fri, 14 Jun 2024 10:49:15 +0200 Subject: [PATCH 09/31] [DOCS] Reference to Hugging Face (#24961) Adding reference to Hugging Face in documentation. --- .../performance-benchmarks-faq.rst | 8 +- .../documentation/legacy-features.rst | 3 + .../legacy-features/install-dev-tools.rst | 105 +++++++++---- .../legacy-features/model-zoo.rst | 30 +++- .../convert-tensorflow-efficient-det.rst | 12 +- .../convert-tensorflow-object-detection.rst | 5 + .../custom-gpu-operations.rst | 78 ++++++--- .../install-openvino/install-openvino-apt.rst | 7 +- .../install-openvino-brew.rst | 9 +- .../install-openvino-vcpkg.rst | 6 + .../install-openvino/install-openvino-yum.rst | 6 + .../install-openvino-zypper.rst | 6 + .../learn-openvino/llm_inference_guide.rst | 51 ++++-- .../llm_inference_guide/llm-inference-hf.rst | 35 +++-- .../llm-inference-native-ov.rst | 32 ++-- .../weight-compression.rst | 148 ++++++++++++------ .../openvino-workflow/model-optimization.rst | 41 ++++- .../conversion-parameters.rst | 111 ++++++++++--- .../model-preparation/convert-model-onnx.rst | 22 ++- .../convert-model-paddle.rst | 23 ++- .../convert-model-pytorch.rst | 4 +- .../convert-model-tensorflow-lite.rst | 22 ++- .../convert-model-tensorflow.rst | 116 ++++++++++---- .../model-preparation/convert-model-to-ir.rst | 4 +- .../setting-input-shapes.rst | 50 ++++-- ...tegrate-openvino-with-your-application.rst | 3 +- 26 files changed, 695 insertions(+), 242 deletions(-) diff --git a/docs/articles_en/about-openvino/performance-benchmarks/performance-benchmarks-faq.rst b/docs/articles_en/about-openvino/performance-benchmarks/performance-benchmarks-faq.rst index 868c828845a092..6c731dc374010b 100644 --- a/docs/articles_en/about-openvino/performance-benchmarks/performance-benchmarks-faq.rst +++ b/docs/articles_en/about-openvino/performance-benchmarks/performance-benchmarks-faq.rst @@ -17,7 +17,13 @@ Performance Information F.A.Q. .. dropdown:: Where can I find the models used in the performance benchmarks? - All models used are included in the GitHub repository of :doc:`Open Model Zoo <../../documentation/legacy-features/model-zoo>`. + All models used are included in the GitHub repository of + :doc:`Open Model Zoo <../../documentation/legacy-features/model-zoo>`. + + .. important:: + + Due to the deprecation of Open Model Zoo, models in the OpenVINO IR format are now + published on `Hugging Face `__. .. dropdown:: Will there be any new models added to the list used for benchmarking? diff --git a/docs/articles_en/documentation/legacy-features.rst b/docs/articles_en/documentation/legacy-features.rst index a470f9bcd9cc4b..489e6e77fe4191 100644 --- a/docs/articles_en/documentation/legacy-features.rst +++ b/docs/articles_en/documentation/legacy-features.rst @@ -59,6 +59,9 @@ offering. until they are fully removed. | :doc:`See the Open Model ZOO documentation ` | `Check the OMZ GitHub project `__ +| As for public model databases, `Hugging Face `__ has + become the recommended model source for OpenVINO. + diff --git a/docs/articles_en/documentation/legacy-features/install-dev-tools.rst b/docs/articles_en/documentation/legacy-features/install-dev-tools.rst index 6466eb8711a381..de2b35529aeafc 100644 --- a/docs/articles_en/documentation/legacy-features/install-dev-tools.rst +++ b/docs/articles_en/documentation/legacy-features/install-dev-tools.rst @@ -8,14 +8,18 @@ Install OpenVINO™ Development Tools :description: Learn how to install OpenVINO™ Development Tools on Windows, Linux, and macOS operating systems, using a PyPi package. -OpenVINO Development Tools is a set of utilities that make it easy to develop and optimize models and applications for OpenVINO. It provides the following tools: +OpenVINO Development Tools is a set of utilities that make it easy to develop and +optimize models and applications for OpenVINO. It provides the following tools: * Model conversion API * Benchmark Tool * Accuracy Checker and Annotation Converter * Model Downloader and other Open Model Zoo tools -The instructions on this page show how to install OpenVINO Development Tools. If you are a Python developer, it only takes a few simple steps to install the tools with PyPI. If you are developing in C/C++, OpenVINO Runtime must be installed separately before installing OpenVINO Development Tools. +The instructions on this page show how to install OpenVINO Development Tools. If you are a +Python developer, it only takes a few simple steps to install the tools with PyPI. If you +are developing in C/C++, OpenVINO Runtime must be installed separately before installing +OpenVINO Development Tools. In both cases, Python 3.8 - 3.11 needs to be installed on your machine before starting. @@ -28,16 +32,28 @@ In both cases, Python 3.8 - 3.11 needs to be installed on your machine before st For Python Developers ##################### -If you are a Python developer, follow the steps in the :ref:`Installing OpenVINO Development Tools ` section on this page to install it. Installing OpenVINO Development Tools will also install OpenVINO Runtime as a dependency, so you don’t need to install OpenVINO Runtime separately. This option is recommended for new users. +If you are a Python developer, follow the steps in the +:ref:`Installing OpenVINO Development Tools ` section on this page to +install it. Installing OpenVINO Development Tools will also install OpenVINO Runtime as +a dependency, so you don’t need to install OpenVINO Runtime separately. This option is +recommended for new users. .. _cpp_developers: For C/C++ Developers ####################### -If you are a C/C++ developer, you must first install OpenVINO Runtime separately to set up the C/C++ libraries, sample code, and dependencies for building applications with OpenVINO. These files are not included with the PyPI distribution. See the :doc:`Selector Tool <../../get-started/install-openvino>` page to install OpenVINO Runtime from an archive file for your operating system. +If you are a C/C++ developer, you must first install OpenVINO Runtime separately to set +up the C/C++ libraries, sample code, and dependencies for building applications with +OpenVINO. These files are not included with the PyPI distribution. See the +:doc:`Selector Tool <../../get-started/install-openvino>` page to install OpenVINO Runtime +from an archive file for your operating system. -Once OpenVINO Runtime is installed, you may install OpenVINO Development Tools for access to tools like ``mo``, Model Downloader, Benchmark Tool, and other utilities that will help you optimize your model and develop your application. Follow the steps in the :ref:`Installing OpenVINO Development Tools ` section on this page to install it. +Once OpenVINO Runtime is installed, you may install OpenVINO Development Tools for access +to tools like ``mo``, Model Downloader, Benchmark Tool, and other utilities that will help +you optimize your model and develop your application. Follow the steps in the +:ref:`Installing OpenVINO Development Tools ` section on this page +to install it. .. _install_dev_tools: @@ -45,14 +61,16 @@ Installing OpenVINO™ Development Tools ###################################### Follow these step-by-step instructions to install OpenVINO Development Tools on your computer. -There are two options to install OpenVINO Development Tools: installation into an existing environment with a deep learning framework that was used -for model training or creation; or installation into a new environment. +There are two options to install OpenVINO Development Tools: installation into an existing +environment with a deep learning framework that was used for model training or creation; +or installation into a new environment. Installation into an Existing Environment with the Source Deep Learning Framework +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -To install OpenVINO Development Tools (see the :ref:`Install the Package ` section of this article) into an existing environment -with the deep learning framework used for the model training or creation, run the following command: +To install OpenVINO Development Tools (see the :ref:`Install the Package ` +section of this article) into an existing environment with the deep learning framework used +for the model training or creation, run the following command: .. code-block:: sh @@ -62,13 +80,16 @@ with the deep learning framework used for the model training or creation, run th Installation in a New Environment +++++++++++++++++++++++++++++++++ -If you do not have an environment with a deep learning framework for the input model or you encounter any compatibility issues between OpenVINO -and your version of deep learning framework, you may install OpenVINO Development Tools with validated versions of frameworks into a new environment. +If you do not have an environment with a deep learning framework for the input model or you +encounter any compatibility issues between OpenVINO and your version of deep learning +framework, you may install OpenVINO Development Tools with validated versions of +frameworks into a new environment. Step 1. Set Up Python Virtual Environment ----------------------------------------- -Create a virtual Python environment to avoid dependency conflicts. To create a virtual environment, use the following command: +Create a virtual Python environment to avoid dependency conflicts. To create a virtual +environment, use the following command: .. tab-set:: @@ -117,7 +138,8 @@ Activate the newly created Python virtual environment by issuing this command: Step 3. Set Up and Update PIP to the Highest Version ---------------------------------------------------- -Make sure `pip` is installed in your environment and upgrade it to the latest version by issuing the following command: +Make sure `pip` is installed in your environment and upgrade it to the latest version by +issuing the following command: .. code-block:: sh @@ -129,7 +151,8 @@ Make sure `pip` is installed in your environment and upgrade it to the latest ve Step 4. Install the Package --------------------------- -To install and configure the components of the development package together with validated versions of specific frameworks, use the commands below. +To install and configure the components of the development package together with validated +versions of specific frameworks, use the commands below. .. code-block:: sh @@ -137,9 +160,11 @@ To install and configure the components of the development package together with where the ``extras`` parameter specifies the source deep learning framework for the input model -and is one or more of the following values separated with "," : ``onnx``, ``pytorch``, ``tensorflow``, ``tensorflow2``. +and is one or more of the following values separated with "," : ``onnx``, ``pytorch``, +``tensorflow``, ``tensorflow2``. -For example, to install and configure dependencies required for working with TensorFlow 2.x and ONNX models, use the following command: +For example, to install and configure dependencies required for working with TensorFlow 2.x +and ONNX models, use the following command: .. code-block:: sh @@ -148,9 +173,14 @@ For example, to install and configure dependencies required for working with Ten .. note:: - Model conversion API support for TensorFlow 1.x environment has been deprecated. Use the ``tensorflow2`` parameter to install a TensorFlow 2.x environment that can convert both TensorFlow 1.x and 2.x models. If your model isn't compatible with the TensorFlow 2.x environment, use the `tensorflow` parameter to install the TensorFlow 1.x environment. The TF 1.x environment is provided only for legacy compatibility reasons. + Model conversion API support for TensorFlow 1.x environment has been deprecated. Use the + ``tensorflow2`` parameter to install a TensorFlow 2.x environment that can convert both + TensorFlow 1.x and 2.x models. If your model isn't compatible with the TensorFlow 2.x + environment, use the `tensorflow` parameter to install the TensorFlow 1.x environment. + The TF 1.x environment is provided only for legacy compatibility reasons. -For more details on the openvino-dev PyPI package, see `pypi.org `__ . +For more details on the openvino-dev PyPI package, see +`pypi.org `__ . Step 5. Test the Installation ------------------------------ @@ -161,9 +191,13 @@ To verify the package is properly installed, run the command below (this may tak mo -h -You will see the help message for ``mo`` if installation finished successfully. If you get an error, refer to the :doc:`Troubleshooting Guide <../../get-started/troubleshooting-install-config>` for possible solutions. +You will see the help message for ``mo`` if installation finished successfully. If you get an +error, refer to the :doc:`Troubleshooting Guide <../../get-started/troubleshooting-install-config>` +for possible solutions. -Congratulations! You finished installing OpenVINO Development Tools with C/C++ capability. Now you can start exploring OpenVINO's functionality through example C/C++ applications. See the "What's Next?" section to learn more! +Congratulations! You finished installing OpenVINO Development Tools with C/C++ capability. +Now you can start exploring OpenVINO's functionality through example C/C++ applications. +See the "What's Next?" section to learn more! What's Next? ############ @@ -176,9 +210,12 @@ Get started with Python .. image:: ../../assets/images/get_started_with_python.gif :width: 400 -Try the `Python Quick Start Example <../../notebooks/vision-monodepth-with-output.html>`__ to estimate depth in a scene using an OpenVINO monodepth model in a Jupyter Notebook inside your web browser. +Try the `Python Quick Start Example <../../notebooks/vision-monodepth-with-output.html>`__ +to estimate depth in a scene using an OpenVINO monodepth model in a Jupyter Notebook +inside your web browser. -Visit the :doc:`Tutorials <../../learn-openvino/interactive-tutorials-python>` page for more Jupyter Notebooks to get you started with OpenVINO, such as: +Visit the :doc:`Tutorials <../../learn-openvino/interactive-tutorials-python>` page for more +Jupyter Notebooks to get you started with OpenVINO, such as: * `OpenVINO Python API Tutorial <../../notebooks/openvino-api-with-output.html>`__ * `Basic image classification program with Hello Image Classification <../../notebooks/hello-world-with-output.html>`__ @@ -191,9 +228,11 @@ Get started with C++ :width: 400 -Try the :doc:`C++ Quick Start Example <../../learn-openvino/openvino-samples/get-started-demos>` for step-by-step instructions on building and running a basic image classification C++ application. +Try the :doc:`C++ Quick Start Example <../../learn-openvino/openvino-samples/get-started-demos>` +for step-by-step instructions on building and running a basic image classification C++ application. -Visit the :doc:`Samples <../../learn-openvino/openvino-samples>` page for other C++ example applications to get you started with OpenVINO, such as: +Visit the :doc:`Samples <../../learn-openvino/openvino-samples>` page for other C++ +example applications to get you started with OpenVINO, such as: * :doc:`Basic object detection with the Hello Reshape SSD C++ sample <../../learn-openvino/openvino-samples/hello-reshape-ssd>` * :doc:`Object classification sample <../../learn-openvino/openvino-samples/hello-classification>` @@ -201,10 +240,20 @@ Visit the :doc:`Samples <../../learn-openvino/openvino-samples>` page for other Learn OpenVINO Development Tools ++++++++++++++++++++++++++++++++ -* Explore a variety of pre-trained deep learning models in the :doc:`Open Model Zoo ` and deploy them in demo applications to see how they work. -* Want to import a model from another framework and optimize its performance with OpenVINO? Visit the :doc:`Convert a Model ` page. -* Accelerate your model's speed even further with quantization and other compression techniques using :doc:`Neural Network Compression Framework (NNCF) <../../openvino-workflow/model-optimization-guide/quantizing-models-post-training>`. -* Benchmark your model's inference speed with one simple command using the :doc:`Benchmark Tool <../../learn-openvino/openvino-samples/benchmark-tool>`. +* Explore a variety of pre-trained deep learning models in the + :doc:`Open Model Zoo ` and deploy them in demo applications to see how they work. + + .. important:: + + Due to the deprecation of Open Model Zoo, models in the OpenVINO IR format are now + published on `Hugging Face `__. + +* Want to import a model from another framework and optimize its performance with OpenVINO? + Visit the :doc:`Convert a Model ` page. +* Accelerate your model's speed even further with quantization and other compression techniques + using :doc:`Neural Network Compression Framework (NNCF) <../../openvino-workflow/model-optimization-guide/quantizing-models-post-training>`. +* Benchmark your model's inference speed with one simple command using the + :doc:`Benchmark Tool <../../learn-openvino/openvino-samples/benchmark-tool>`. Additional Resources #################### diff --git a/docs/articles_en/documentation/legacy-features/model-zoo.rst b/docs/articles_en/documentation/legacy-features/model-zoo.rst index 281e217f75c9c4..f2b26f2a983efc 100644 --- a/docs/articles_en/documentation/legacy-features/model-zoo.rst +++ b/docs/articles_en/documentation/legacy-features/model-zoo.rst @@ -29,9 +29,29 @@ Model Zoo ../../omz_model_api_ovms_adapter -Open Model Zoo for OpenVINO™ toolkit delivers a wide variety of free, pre-trained deep learning models and demo applications that provide full application templates to help you implement deep learning in Python, C++, or OpenCV Graph API (G-API). Models and demos are available in the `Open Model Zoo GitHub repo `__ and licensed under Apache License Version 2.0. - -Browse through over 200 neural network models, both :doc:`public <../../omz_models_group_public>` and from :doc:`Intel <../../omz_models_group_intel>`, and pick the right one for your solution. Types include object detection, classification, image segmentation, handwriting recognition, text to speech, pose estimation, and others. The Intel models have already been converted to work with OpenVINO™ toolkit, while public models can easily be converted using the :doc:`OpenVINO Model Conversion API <../../openvino-workflow/model-preparation>` utility. - -Get started with simple :doc:`step-by-step procedures <../../learn-openvino/openvino-samples/get-started-demos>` to learn how to build and run demo applications or discover the :doc:`full set of demos <../../omz_demos>` and adapt them for implementing specific deep learning scenarios in your applications. +.. note:: + + Since the deprecation of Open Model Zoo, OpenVINO has significantly extended its presence on the + `Hugging Face `__ model repository. It is currently + the recommended source of optimized OpenVINO IR models. + +Open Model Zoo for OpenVINO™ toolkit delivers a wide variety of free, pre-trained deep learning +models and demo applications that provide full application templates to help you implement deep +learning in Python, C++, or OpenCV Graph API (G-API). Models and demos are available in the +`Open Model Zoo GitHub repo `__ +and licensed under Apache License Version 2.0. + +Browse through over 200 neural network models, both +:doc:`public <../../omz_models_group_public>` and from +:doc:`Intel <../../omz_models_group_intel>`, and pick the right one for your solution. +Types include object detection, classification, image segmentation, handwriting recognition, +text to speech, pose estimation, and others. The Intel models have already been converted +to work with OpenVINO™ toolkit, while public models can easily be converted using the +:doc:`OpenVINO Model Conversion API <../../openvino-workflow/model-preparation>` utility. + +Get started with simple +:doc:`step-by-step procedures <../../learn-openvino/openvino-samples/get-started-demos>` +to learn how to build and run demo applications or discover the +:doc:`full set of demos <../../omz_demos>` and adapt them for implementing specific deep +learning scenarios in your applications. diff --git a/docs/articles_en/documentation/legacy-features/transition-legacy-conversion-api/legacy-conversion-api/[legacy]-supported-model-formats/[legacy]-conversion-tutorials/convert-tensorflow-efficient-det.rst b/docs/articles_en/documentation/legacy-features/transition-legacy-conversion-api/legacy-conversion-api/[legacy]-supported-model-formats/[legacy]-conversion-tutorials/convert-tensorflow-efficient-det.rst index 47a6342ff7c989..daebe992d8441c 100644 --- a/docs/articles_en/documentation/legacy-features/transition-legacy-conversion-api/legacy-conversion-api/[legacy]-supported-model-formats/[legacy]-conversion-tutorials/convert-tensorflow-efficient-det.rst +++ b/docs/articles_en/documentation/legacy-features/transition-legacy-conversion-api/legacy-conversion-api/[legacy]-supported-model-formats/[legacy]-conversion-tutorials/convert-tensorflow-efficient-det.rst @@ -5,7 +5,7 @@ Converting TensorFlow EfficientDet Models .. meta:: - :description: Learn how to convert an EfficientDet model + :description: Learn how to convert an EfficientDet model from TensorFlow to the OpenVINO Intermediate Representation. @@ -14,7 +14,7 @@ Converting TensorFlow EfficientDet Models The code described here has been **deprecated!** Do not use it to avoid working with a legacy solution. It will be kept for some time to ensure backwards compatibility, but **you should not use** it in contemporary applications. This guide describes a deprecated conversion method. The guide on the new and recommended method can be found in the :doc:`Python tutorials <../../../../../../learn-openvino/interactive-tutorials-python>`. - + This tutorial explains how to convert EfficientDet public object detection models to the Intermediate Representation (IR). .. _efficientdet-to-ir: @@ -55,9 +55,15 @@ The attribute ``image_size`` specifies the shape to be defined for the model con The color channel order (RGB or BGR) of an input data should match the channel order of the model training dataset. If they are different, perform the ``RGB<->BGR`` conversion specifying the command-line parameter: ``--reverse_input_channels``. Otherwise, inference results may be incorrect. For more information about the parameter, refer to the **When to Reverse Input Channels** section of the :doc:`Converting a Model to Intermediate Representation (IR) <../../[legacy]-setting-input-shapes>` guide. -OpenVINO toolkit provides samples that can be used to infer EfficientDet model. +OpenVINO toolkit provides samples that can be used to infer EfficientDet model. For more information, refer to the :doc:`Open Model Zoo Demos <../../../../../../omz_demos>`. +.. important:: + + Due to the deprecation of Open Model Zoo, models in the OpenVINO IR format have are now + published on `Hugging Face `__. + + Interpreting Results of the TensorFlow Model and the IR ####################################################### diff --git a/docs/articles_en/documentation/legacy-features/transition-legacy-conversion-api/legacy-conversion-api/[legacy]-supported-model-formats/[legacy]-conversion-tutorials/convert-tensorflow-object-detection.rst b/docs/articles_en/documentation/legacy-features/transition-legacy-conversion-api/legacy-conversion-api/[legacy]-supported-model-formats/[legacy]-conversion-tutorials/convert-tensorflow-object-detection.rst index 3eb5a93e6e0feb..8b1a04029962b1 100644 --- a/docs/articles_en/documentation/legacy-features/transition-legacy-conversion-api/legacy-conversion-api/[legacy]-supported-model-formats/[legacy]-conversion-tutorials/convert-tensorflow-object-detection.rst +++ b/docs/articles_en/documentation/legacy-features/transition-legacy-conversion-api/legacy-conversion-api/[legacy]-supported-model-formats/[legacy]-conversion-tutorials/convert-tensorflow-object-detection.rst @@ -89,6 +89,11 @@ Speech Recognition, Natural Language Processing and others. Refer to the links b * :doc:`OpenVINO Samples <../../../../../../learn-openvino/openvino-samples>` * :doc:`Open Model Zoo Demos <../../../../model-zoo>` +.. important:: + + Due to the deprecation of Open Model Zoo, models in the OpenVINO IR format are now + published on `Hugging Face `__. + Feeding Input Images to the Samples ################################### diff --git a/docs/articles_en/documentation/openvino-extensibility/custom-gpu-operations.rst b/docs/articles_en/documentation/openvino-extensibility/custom-gpu-operations.rst index 9c544d4dbb2b66..015c416ac5c258 100644 --- a/docs/articles_en/documentation/openvino-extensibility/custom-gpu-operations.rst +++ b/docs/articles_en/documentation/openvino-extensibility/custom-gpu-operations.rst @@ -9,14 +9,21 @@ How to Implement Custom GPU Operations enable operations not supported by OpenVINO. -To enable operations not supported by OpenVINO™ out of the box, you may need an extension for OpenVINO operation set, and a custom kernel for the device you will target. This article describes custom kernel support for the GPU device. +To enable operations not supported by OpenVINO™ out of the box, you may need an extension +for OpenVINO operation set, and a custom kernel for the device you will target. This +article describes custom kernel support for the GPU device. -The GPU codepath abstracts many details about OpenCL. You need to provide the kernel code in OpenCL C and an XML configuration file that connects the kernel and its parameters to the parameters of the operation. +The GPU codepath abstracts many details about OpenCL. You need to provide the kernel +code in OpenCL C and an XML configuration file that connects the kernel and its +parameters to the parameters of the operation. There are two options for using the custom operation configuration file: -* Include a section with your kernels into the automatically-loaded ``/cldnn_global_custom_kernels/cldnn_global_custom_kernels.xml`` file. -* Call the ``ov::Core::set_property()`` method from your application with the ``"CONFIG_FILE"`` key and the configuration file name as a value before loading the network that uses custom operations to the plugin: +* Include a section with your kernels into the automatically-loaded + ``/cldnn_global_custom_kernels/cldnn_global_custom_kernels.xml`` file. +* Call the ``ov::Core::set_property()`` method from your application with the + ``"CONFIG_FILE"`` key and the configuration file name as a value before loading + the network that uses custom operations to the plugin: .. tab-set:: @@ -35,14 +42,21 @@ There are two options for using the custom operation configuration file: :fragment: [part0] -All OpenVINO samples, except the trivial ``hello_classification``, and most Open Model Zoo demos -feature a dedicated command-line option ``-c`` to load custom kernels. For example, to load custom operations for the classification sample, run the command below: +All OpenVINO samples, except the trivial ``hello_classification``, and most Open +Model Zoo demos feature a dedicated command-line option ``-c`` to load custom kernels. +For example, to load custom operations for the classification sample, run the command below: .. code-block:: cpp $ ./classification_sample -m /bvlc_alexnet_fp16.xml -i ./validation_set/daily/227x227/apron.bmp -d GPU -c /custom_layer_example.xml +.. important:: + + Due to the deprecation of Open Model Zoo, models in the OpenVINO IR format are now + published on `Hugging Face `__. + + .. _config-file-format: Configuration File Format @@ -80,7 +94,8 @@ The ``CustomLayer`` node contains the entire configuration for a single custom o - Description * - ``name`` - (1) - - The name of the operation type to be used. This name should be identical to the type used in the IR. + - The name of the operation type to be used. This name should be identical to + the type used in the IR. * - ``type`` - (1) - Must be ``SimpleGPU`` . @@ -111,7 +126,8 @@ The ``Source`` node points to a single OpenCL source file. - Description * - ``filename`` - (1) - - Name of the file containing OpenCL source code. The path is relative to your executable. Multiple source nodes will have their sources concatenated in order. + - Name of the file containing OpenCL source code. The path is relative to your + executable. Multiple source nodes will have their sources concatenated in order. **Sub-nodes**: None @@ -129,16 +145,19 @@ the sources during compilation (JIT). - Description * - ``name`` - (1) - - The name of the defined JIT. For static constants, this can include the value as well, which is taken as a string. + - The name of the defined JIT. For static constants, this can include the value + as well, which is taken as a string. * - ``param`` - (0/1) - This parameter value is used as the value of this JIT definition. * - ``type`` - (0/1) - - The parameter type. Accepted values: ``int`` , ``float`` , and ``int[]`` , ``float[]`` for arrays. + - The parameter type. Accepted values: ``int`` , ``float`` , and ``int[]`` , + ``float[]`` for arrays. * - ``default`` - (0/1) - - The default value to be used if the specified parameters are missing from the operation in the OpenVINO IR. + - The default value to be used if the specified parameters are missing from the + operation in the OpenVINO IR. **Sub-nodes:** None @@ -197,7 +216,8 @@ The ``Tensor`` node configures a single input or output tensor. - 0-based index in the operation input/output ports in the OpenVINO IR * - ``format`` - (0/1) - - Data layout declaration for the tensor. Accepted values: ``BFYX`` , ``BYXF`` , ``YXFB`` , ``FYXB`` , and same values in all lowercase. Default value: ``BFYX``. + - Data layout declaration for the tensor. Accepted values: ``BFYX`` , ``BYXF`` , + ``YXFB`` , ``FYXB`` , and same values in all lowercase. Default value: ``BFYX``. CompilerOptions Node and Sub-Node Structure +++++++++++++++++++++++++++++++++++++++++++ @@ -231,10 +251,14 @@ queuing an OpenCL program for execution. - Description * - ``global`` ``local`` - (0/1) (0/1) - - An array of up to three integers or formulas for defining OpenCL work-sizes to be used during execution. The formulas can use the values of the B,F,Y,X dimensions and contain the operators: +,-,/,\*,%. All operators are evaluated in integer arithmetic. Default value: ``global=”B\*F\*Y\*X” local=””`` + - An array of up to three integers or formulas for defining OpenCL work-sizes to + be used during execution. The formulas can use the values of the B,F,Y,X + dimensions and contain the operators: +,-,/,\*,%. All operators are evaluated + in integer arithmetic. Default value: ``global=”B\*F\*Y\*X” local=””`` * - ``dim`` - (0/1) - - A tensor to take the work-size from. Accepted values: ``input N`` , ``output`` , where ``N`` is an index of input tensor starting with 0. Default value: ``output`` + - A tensor to take the work-size from. Accepted values: ``input N`` , ``output`` , + where ``N`` is an index of input tensor starting with 0. Default value: ``output`` **Sub-nodes**: None @@ -242,7 +266,8 @@ Example Configuration File ########################## The following code sample provides an example configuration file in XML -format. For information on the configuration file structure, see the `Configuration File Format <#config-file-format>`__. +format. For information on the configuration file structure, see the +`Configuration File Format <#config-file-format>`__. .. code-block:: xml :force: @@ -291,21 +316,27 @@ For an example, see `Example Kernel <#example-kernel>`__. * - ``_TYPE`` - The datatype of the tensor: ``float`` , ``half`` , or ``char`` * - ``_FORMAT_`` - - The format of the tensor, BFYX, BYXF, YXFB , FYXB, or ANY. The format is concatenated to the defined name. You can use the tensor format to define codepaths in your code with ``#ifdef/#endif`` . + - The format of the tensor, BFYX, BYXF, YXFB , FYXB, or ANY. The format is + concatenated to the defined name. You can use the tensor format to define + codepaths in your code with ``#ifdef/#endif`` . * - ``_LOWER_PADDING`` - - An array of padding elements used for the tensor dimensions before they start. Always ordered as BFYX. + - An array of padding elements used for the tensor dimensions before they start. + Always ordered as BFYX. * - ``_LOWER_PADDING_SIZE`` - The size of the ``_LOWER_PADDING`` array * - ``_UPPER_PADDING`` - - An array of padding elements used for the tensor dimensions after they end. Always ordered as BFYX. + - An array of padding elements used for the tensor dimensions after they end. + Always ordered as BFYX. * - ``_UPPER_PADDING_SIZE`` - The size of the ``_UPPER_PADDING`` array * - ``_PITCHES`` - - The offset (in elements) between adjacent elements in each dimension. Always ordered as BFYX. + - The offset (in elements) between adjacent elements in each dimension. + Always ordered as BFYX. * - ``_PITCHES_SIZE`` - The size of the ``_PITCHES`` array * - ``_OFFSET`` - - The number of elements from the start of the tensor to the first valid element, bypassing the lower padding. + - The number of elements from the start of the tensor to the first valid element, + bypassing the lower padding. All ```` values are automatically defined for every tensor bound to this operation, such as ``INPUT0``, ``INPUT1``, and ``OUTPUT0``, as shown @@ -345,7 +376,9 @@ Example Kernel .. _debugging-tips: .. note:: - As described in the previous section, all items such as the ``INPUT0_TYPE`` are actually defined as OpenCL (pre-)compiler inputs by OpenVINO for efficiency reasons. See the `Debugging Tips <#debugging-tips>`__ below for information on debugging the results. + As described in the previous section, all items such as the ``INPUT0_TYPE`` are + actually defined as OpenCL (pre-)compiler inputs by OpenVINO for efficiency reasons. + See the `Debugging Tips <#debugging-tips>`__ below for information on debugging the results. Debugging Tips ############## @@ -359,5 +392,6 @@ your output can be truncated to fit the buffer. Also, because of buffering, you actually get an entire buffer of output when the execution ends. -For more information, refer to the `printf Function `__. +For more information, refer to the +`printf Function `__. diff --git a/docs/articles_en/get-started/install-openvino/install-openvino-apt.rst b/docs/articles_en/get-started/install-openvino/install-openvino-apt.rst index 058b93f3b9dd75..004f74f74043fd 100644 --- a/docs/articles_en/get-started/install-openvino/install-openvino-apt.rst +++ b/docs/articles_en/get-started/install-openvino/install-openvino-apt.rst @@ -252,13 +252,8 @@ You can also try the following: * Learn more about :doc:`OpenVINO Workflow <../../../openvino-workflow>`. * To prepare your models for working with OpenVINO, see :doc:`Model Preparation <../../../openvino-workflow/model-preparation>`. -* See pre-trained deep learning models in our :doc:`Open Model Zoo <../../../documentation/legacy-features/model-zoo>`. +* See pre-trained deep learning models on `Hugging Face `__ * Learn more about :doc:`Inference with OpenVINO Runtime <../../../openvino-workflow/running-inference>`. * See sample applications in :doc:`OpenVINO toolkit Samples Overview <../../../learn-openvino/openvino-samples>`. * Take a glance at the OpenVINO `product home page `__ . - - - - - diff --git a/docs/articles_en/get-started/install-openvino/install-openvino-brew.rst b/docs/articles_en/get-started/install-openvino/install-openvino-brew.rst index a5f5abeaf34db9..11bd8d90b6b641 100644 --- a/docs/articles_en/get-started/install-openvino/install-openvino-brew.rst +++ b/docs/articles_en/get-started/install-openvino/install-openvino-brew.rst @@ -96,7 +96,14 @@ Now that you've installed OpenVINO Runtime, you can try the following things: * Learn more about :doc:`OpenVINO Workflow <../../../openvino-workflow>`. * To prepare your models for working with OpenVINO, see :doc:`Model Preparation <../../../openvino-workflow/model-preparation>`. -* See pre-trained deep learning models in our :doc:`Open Model Zoo <../../../documentation/legacy-features/model-zoo>`. +* See pre-trained deep learning models in our + :doc:`Open Model Zoo <../../../documentation/legacy-features/model-zoo>`. + + .. important:: + + Due to the deprecation of Open Model Zoo, models in the OpenVINO IR format are now + published on `Hugging Face `__. + * Learn more about :doc:`Inference with OpenVINO Runtime <../../../openvino-workflow/running-inference>`. * See sample applications in :doc:`OpenVINO toolkit Samples Overview <../../../learn-openvino/openvino-samples>`. * Check out the OpenVINO `product home page `__. diff --git a/docs/articles_en/get-started/install-openvino/install-openvino-vcpkg.rst b/docs/articles_en/get-started/install-openvino/install-openvino-vcpkg.rst index 3074bd8135e4e7..828b5205169fea 100644 --- a/docs/articles_en/get-started/install-openvino/install-openvino-vcpkg.rst +++ b/docs/articles_en/get-started/install-openvino/install-openvino-vcpkg.rst @@ -102,6 +102,12 @@ Now that you've installed OpenVINO Runtime, you can try the following things: * Learn more about :doc:`OpenVINO Workflow <../../../openvino-workflow>`. * To prepare your models for working with OpenVINO, see :doc:`Model Preparation <../../../openvino-workflow/model-preparation>`. * See pre-trained deep learning models in our :doc:`Open Model Zoo <../../../documentation/legacy-features/model-zoo>`. + + .. important:: + + Due to the deprecation of Open Model Zoo, models in the OpenVINO IR format are now + published on `Hugging Face `__. + * Learn more about :doc:`Inference with OpenVINO Runtime <../../../openvino-workflow/running-inference>`. * See sample applications in :doc:`OpenVINO toolkit Samples Overview <../../../learn-openvino/openvino-samples>`. * Check out the OpenVINO `product home page `__ . diff --git a/docs/articles_en/get-started/install-openvino/install-openvino-yum.rst b/docs/articles_en/get-started/install-openvino/install-openvino-yum.rst index a5559e937e50d6..cbb25eac817f97 100644 --- a/docs/articles_en/get-started/install-openvino/install-openvino-yum.rst +++ b/docs/articles_en/get-started/install-openvino/install-openvino-yum.rst @@ -226,6 +226,12 @@ You can also try the following things: * Learn more about :doc:`OpenVINO Workflow <../../../openvino-workflow>`. * To prepare your models for working with OpenVINO, see :doc:`Model Preparation <../../../openvino-workflow/model-preparation>`. * See pre-trained deep learning models in our :doc:`Open Model Zoo <../../../documentation/legacy-features/model-zoo>`. + + .. important:: + + Due to the deprecation of Open Model Zoo, models in the OpenVINO IR format are now + published on `Hugging Face `__. + * Learn more about :doc:`Inference with OpenVINO Runtime <../../../openvino-workflow/running-inference>`. * See sample applications in :doc:`OpenVINO toolkit Samples Overview <../../../learn-openvino/openvino-samples>`. * Take a glance at the OpenVINO `product home page `__ . diff --git a/docs/articles_en/get-started/install-openvino/install-openvino-zypper.rst b/docs/articles_en/get-started/install-openvino/install-openvino-zypper.rst index 20166da049fee7..ee0b2633299c66 100644 --- a/docs/articles_en/get-started/install-openvino/install-openvino-zypper.rst +++ b/docs/articles_en/get-started/install-openvino/install-openvino-zypper.rst @@ -170,6 +170,12 @@ You can also try the following things: * Learn more about :doc:`OpenVINO Workflow <../../../openvino-workflow>`. * To prepare your models for working with OpenVINO, see :doc:`Model Preparation <../../../openvino-workflow/model-preparation>`. * See pre-trained deep learning models in our :doc:`Open Model Zoo <../../../documentation/legacy-features/model-zoo>`. + + .. important:: + + Due to the deprecation of Open Model Zoo, models in the OpenVINO IR format are now + published on `Hugging Face `__. + * Learn more about :doc:`Inference with OpenVINO Runtime <../../../openvino-workflow/running-inference>`. * See sample applications in :doc:`OpenVINO toolkit Samples Overview <../../../learn-openvino/openvino-samples>`. * Take a glance at the OpenVINO `product home page `__ . diff --git a/docs/articles_en/learn-openvino/llm_inference_guide.rst b/docs/articles_en/learn-openvino/llm_inference_guide.rst index 874e53899e1cfd..e154662eb31cac 100644 --- a/docs/articles_en/learn-openvino/llm_inference_guide.rst +++ b/docs/articles_en/learn-openvino/llm_inference_guide.rst @@ -26,19 +26,41 @@ conversion to advanced use cases. The advantages of using OpenVINO for LLM deployment: -* **OpenVINO offers optimized LLM inference**; provides a full C/C++ API, leading to faster operation than Python-based runtimes; includes a Python API for rapid development, with the option for further optimization in C++. - -* **Compatible with diverse hardware**, supports CPUs, GPUs, and neural accelerators across ARM and x86/x64 architectures, integrated Intel® Processor Graphics, discrete Intel® Arc™ A-Series Graphics, and discrete Intel® Data Center GPU Flex Series; features automated optimization to maximize performance on target hardware. - -* **Requires fewer dependencies** than frameworks like Hugging Face and PyTorch, resulting in a smaller binary size and reduced memory footprint, making deployments easier and updates more manageable. - -* **Provides compression and precision management techniques** such as 8-bit and 4-bit weight compression, including embedding layers, and storage format reduction. This includes fp16 precision for non-compressed models and int8/int4 for compressed models, like GPTQ models from Hugging Face. - -* **Supports a wide range of deep learning models and architectures** including text, image, and audio generative models like Llama 2, MPT, OPT, Stable Diffusion, Stable Diffusion XL. This enables the development of multimodal applications, allowing for write-once, deploy-anywhere capabilities. - -* **Enhances inference capabilities**: fused inference primitives such as Scaled Dot Product Attention, Rotary Positional Embedding, Group Query Attention, and Mixture of Experts. It also offers advanced features like in-place KV-cache, dynamic quantization, KV-cache quantization and encapsulation, dynamic beam size configuration, and speculative sampling. - -* **Provides stateful model optimization**: models from the Hugging Face Transformers are converted into a stateful form, optimizing inference performance and memory usage in long-running text generation tasks by managing past KV-cache tensors more efficiently internally. This feature is automatically activated for many supported models, while unsupported ones remain stateless. Learn more about the :doc:`Stateful models and State API <../openvino-workflow/running-inference/stateful-models>`. +* **OpenVINO offers optimized LLM inference**; provides a full C/C++ API, leading to + faster operation than Python-based runtimes; includes a Python API for rapid + development, with the option for further optimization in C++. + +* **Compatible with diverse hardware**, supports CPUs, GPUs, and neural accelerators + across ARM and x86/x64 architectures, integrated Intel® Processor Graphics, discrete + Intel® Arc™ A-Series Graphics, and discrete Intel® Data Center GPU Flex Series; + features automated optimization to maximize performance on target hardware. + +* **Requires fewer dependencies** than frameworks like Hugging Face and PyTorch, + resulting in a smaller binary size and reduced memory footprint, making deployments + easier and updates more manageable. + +* **Provides compression and precision management techniques** such as 8-bit and 4-bit + weight compression, including embedding layers, and storage format reduction. This + includes fp16 precision for non-compressed models and int8/int4 for compressed models, + like GPTQ models from `Hugging Face `__. + +* **Supports a wide range of deep learning models and architectures** including text, + image, and audio generative models like Llama 2, MPT, OPT, Stable Diffusion, Stable + Diffusion XL. This enables the development of multimodal applications, allowing for + write-once, deploy-anywhere capabilities. + +* **Enhances inference capabilities**: fused inference primitives such as Scaled Dot + Product Attention, Rotary Positional Embedding, Group Query Attention, and Mixture + of Experts. It also offers advanced features like in-place KV-cache, dynamic + quantization, KV-cache quantization and encapsulation, dynamic beam size + configuration, and speculative sampling. + +* **Provides stateful model optimization**: models from the Hugging Face Transformers + are converted into a stateful form, optimizing inference performance and memory usage + in long-running text generation tasks by managing past KV-cache tensors more + efficiently internally. This feature is automatically activated for many supported + models, while unsupported ones remain stateless. Learn more about the + :doc:`Stateful models and State API <../openvino-workflow/running-inference/stateful-models>`. OpenVINO offers three main paths for Generative AI use cases: @@ -121,4 +143,5 @@ approaches. - Best suited for high-performance, resource-optimized production environments * - Model Serving - Paid service, based on CPU/GPU usage with Hugging Face - - Free code solution, run script for own server; costs may incur for cloud services like AWS but generally cheaper than Hugging Face rates + - Free code solution, run script for own server; costs may incur for cloud services + like AWS but generally cheaper than Hugging Face rates diff --git a/docs/articles_en/learn-openvino/llm_inference_guide/llm-inference-hf.rst b/docs/articles_en/learn-openvino/llm_inference_guide/llm-inference-hf.rst index a0edebf83d1749..4ee10dd9b10637 100644 --- a/docs/articles_en/learn-openvino/llm_inference_guide/llm-inference-hf.rst +++ b/docs/articles_en/learn-openvino/llm_inference_guide/llm-inference-hf.rst @@ -3,14 +3,16 @@ Run LLMs with Hugging Face and Optimum Intel ===================================================== -The steps below show how to load and infer LLMs from Hugging Face using Optimum Intel. -They also show how to convert models into OpenVINO IR format so they can be optimized -by NNCF and used with other OpenVINO tools. +The steps below show how to load and infer LLMs from +`Hugging Face `__ using Optimum Intel. They also show how to +convert models into OpenVINO IR format so they can be optimized by NNCF and used with +other OpenVINO tools. Prerequisites ############################################################ -* Create a Python environment by following the instructions on the :doc:`Install OpenVINO PIP <../../get-started/install-openvino>` page. +* Create a Python environment by following the instructions on the + :doc:`Install OpenVINO PIP <../../get-started/install-openvino>` page. * Install the necessary dependencies for Optimum Intel: .. code-block:: console @@ -20,7 +22,8 @@ Prerequisites Loading a Hugging Face Model to Optimum Intel ############################################################ -To start using OpenVINO as a backend for Hugging Face, change the original Hugging Face code in two places: +To start using OpenVINO as a backend for Hugging Face, change the original Hugging Face +code in two places: .. code-block:: diff @@ -225,10 +228,15 @@ OpenVINO runtime provides a set of optimizations for more efficient LLM inferenc includes **Dynamic quantization** of activations of 4/8-bit quantized MatMuls and **KV-cache quantization**. -* **Dynamic quantization** enables quantization of activations of MatMul operations that have 4 or 8-bit quantized weights (see :doc:`LLM Weight Compression <../../openvino-workflow/model-optimization-guide/weight-compression>`). - It improves inference latency and throughput of LLMs, though it may cause insignificant deviation in generation accuracy. Quantization is performed in a - group-wise manner, with configurable group size. It means that values in a group share quantization parameters. Larger group sizes lead to faster inference but lower accuracy. Recommended group size values are ``32``, ``64``, or ``128``. To enable Dynamic quantization, use the corresponding - inference property as follows: +* **Dynamic quantization** enables quantization of activations of MatMul operations + that have 4 or 8-bit quantized weights (see + :doc:`LLM Weight Compression <../../openvino-workflow/model-optimization-guide/weight-compression>`). + It improves inference latency and throughput of LLMs, though it may cause + insignificant deviation in generation accuracy. Quantization is performed in a group-wise + manner, with configurable group size. It means that values in a group share quantization + parameters. Larger group sizes lead to faster inference but lower accuracy. Recommended + group size values are ``32``, ``64``, or ``128``. To enable Dynamic quantization, use + the corresponding inference property as follows: .. code-block:: python @@ -238,9 +246,12 @@ includes **Dynamic quantization** of activations of 4/8-bit quantized MatMuls an ov_config={"DYNAMIC_QUANTIZATION_GROUP_SIZE": "32", "PERFORMANCE_HINT": "LATENCY"} ) -* **KV-cache quantization** allows lowering the precision of Key and Value cache in LLMs. This helps reduce memory consumption during inference, improving latency and throughput. KV-cache can be quantized into the following precisions: - ``u8``, ``bf16``, ``f16``. If ``u8`` is used, KV-cache quantization is also applied in a group-wise manner. Thus, it can use ``DYNAMIC_QUANTIZATION_GROUP_SIZE`` value if defined. - Otherwise, the group size ``32`` is used by default. KV-cache quantization can be enabled as follows: +* **KV-cache quantization** allows lowering the precision of Key and Value cache in LLMs. + This helps reduce memory consumption during inference, improving latency and throughput. + KV-cache can be quantized into the following precisions: ``u8``, ``bf16``, ``f16``. + If ``u8`` is used, KV-cache quantization is also applied in a group-wise manner. Thus, + it can use ``DYNAMIC_QUANTIZATION_GROUP_SIZE`` value if defined. Otherwise, the group + size ``32`` is used by default. KV-cache quantization can be enabled as follows: .. code-block:: python diff --git a/docs/articles_en/learn-openvino/llm_inference_guide/llm-inference-native-ov.rst b/docs/articles_en/learn-openvino/llm_inference_guide/llm-inference-native-ov.rst index 12850aa5ab31f7..c1923e543e3b64 100644 --- a/docs/articles_en/learn-openvino/llm_inference_guide/llm-inference-native-ov.rst +++ b/docs/articles_en/learn-openvino/llm_inference_guide/llm-inference-native-ov.rst @@ -3,28 +3,41 @@ Run LLMs with Base OpenVINO =============================== -To run Generative AI models using native OpenVINO APIs you need to follow regular **Convert -> Optimize -> Deploy** path with a few simplifications. +To run Generative AI models using native OpenVINO APIs you need to follow regular +**Convert -> Optimize -> Deploy** path with a few simplifications. -To convert a model from Hugging Face, you can use Optimum-Intel export feature that allows you to export model in the OpenVINO format without invoking conversion API and tools directly. -In this case, the conversion process is a bit more simplified. You can still use a regular conversion path if the model comes from outside of Hugging Face ecosystem, i.e., in source framework format (PyTorch, etc.) +To convert a model from `Hugging Face `__, you can use +Optimum-Intel export feature that allows you to export model in the OpenVINO format without +invoking conversion API and tools directly. In this case, the conversion process is a bit +more simplified. You can still use a regular conversion path if the model comes from +outside of Hugging Face ecosystem, i.e., in source framework format (PyTorch, etc.) -Model optimization can be performed within Hugging Face or directly using NNCF as described in :doc:`Weight Compression <../../openvino-workflow/model-optimization-guide/weight-compression>`. +Model optimization can be performed within Hugging Face or directly using NNCF as described in +:doc:`Weight Compression <../../openvino-workflow/model-optimization-guide/weight-compression>`. .. note:: - It is recommended to use models in 4-bit precision, as maintaining the model in its original precision may result in significantly decreased performance. + It is recommended to use models in 4-bit precision, as maintaining the model in its + original precision may result in significantly decreased performance. -Inference code that uses native API cannot benefit from Hugging Face pipelines. You need to write your custom code or take it from the available examples. Below are some examples of popular Generative AI scenarios: +Inference code that uses native API cannot benefit from Hugging Face pipelines. +You need to write your custom code or take it from the available examples. Below are +some examples of popular Generative AI scenarios: -* In case of LLMs for text generation, you need to handle tokenization, inference and token selection loop, and de-tokenization. If token selection involves beam search, it also needs to be written. -* For image generation models, you need to make a pipeline that includes several model inferences: inference for source (e.g., text) encoder models, inference loop for diffusion process and inference for the decoding part. Scheduler code is also required. +* In case of LLMs for text generation, you need to handle tokenization, inference and + token selection loop, and de-tokenization. If token selection involves beam search, + it also needs to be written. +* For image generation models, you need to make a pipeline that includes several model + inferences: inference for source (e.g., text) encoder models, inference loop for + diffusion process and inference for the decoding part. Scheduler code is also required. To write such pipelines, you can follow the examples provided as part of OpenVINO: * `OpenVINO Latent Consistency Model C++ image generation pipeline `__ * `OpenVINO Stable Diffusion (with LoRA) C++ image generation pipeline `__ -To perform inference, models must be first converted to OpenVINO IR format using Hugging Face Optimum-Intel API. +To perform inference, models must be first converted to OpenVINO IR format using +Hugging Face Optimum-Intel API. An inference pipeline for a text generation LLM is set up in the following stages: @@ -179,4 +192,3 @@ Additional Resources * :doc:`Stateful Models Low-Level Details <../../openvino-workflow/running-inference/stateful-models>` * :doc:`Working with Textual Data <../../openvino-workflow/running-inference/string-tensors>` - diff --git a/docs/articles_en/openvino-workflow/model-optimization-guide/weight-compression.rst b/docs/articles_en/openvino-workflow/model-optimization-guide/weight-compression.rst index 7ce2893107e626..a393a0925cba3c 100644 --- a/docs/articles_en/openvino-workflow/model-optimization-guide/weight-compression.rst +++ b/docs/articles_en/openvino-workflow/model-optimization-guide/weight-compression.rst @@ -13,27 +13,32 @@ memory footprint, a crucial factor for Large Language Models (LLMs). Unlike full model quantization, where weights and activations are quantized, weight compression in `Neural Network Compression Framework (NNCF) `__ -only targets the model's weights. This approach -allows the activations to remain as floating-point numbers, preserving most -of the model's accuracy while improving its speed and reducing -its size. +only targets the model's weights. This approach allows the activations to remain as +floating-point numbers, preserving most of the model's accuracy while improving its +speed and reducing its size. The reduction in size is especially noticeable with larger models, for instance the 7 billion parameter Llama 2 model can be reduced -from about 25GB to 4GB using 4-bit weight compression. With smaller models (i.e. less than 1B parameters), -weight compression may result in more accuracy reduction than with larger models. +from about 25GB to 4GB using 4-bit weight compression. With smaller models (i.e. less +than 1B parameters), weight compression may result in more accuracy reduction than +with larger models. LLMs and other models that require extensive memory to store the weights during inference can benefit from weight compression as it: -* enables inference of exceptionally large models that cannot be accommodated in the device memory; +* enables inference of exceptionally large models that cannot be accommodated in the + device memory; -* reduces storage and memory overhead, making models more lightweight and less resource intensive for deployment; +* reduces storage and memory overhead, making models more lightweight and less resource + intensive for deployment; -* improves inference speed by reducing the latency of memory access when computing the operations with weights, for example, Linear layers. The weights are smaller and thus faster to load from memory; +* improves inference speed by reducing the latency of memory access when computing the + operations with weights, for example, Linear layers. The weights are smaller and thus + faster to load from memory; -* unlike quantization, does not require sample data to calibrate the range of activation values. +* unlike quantization, does not require sample data to calibrate the range of + activation values. Currently, `NNCF `__ provides weight quantization to 8 and 4-bit integer data types as a compression @@ -50,7 +55,8 @@ Transformer-based models. Models with 8-bit compressed weights are performant on vast majority of supported CPU and GPU platforms. -The code snippet below shows how to do 8-bit quantization of the model weights represented in OpenVINO IR using NNCF: +The code snippet below shows how to do 8-bit quantization of the model weights represented +in OpenVINO IR using NNCF: .. tab-set:: @@ -70,7 +76,8 @@ where INT4 is considered as the primary precision and INT8 is the backup one. It usually results in a smaller model size and lower inference latency, although the accuracy degradation could be higher, depending on the model. -The code snippet below shows how to do 4-bit quantization of the model weights represented in OpenVINO IR using NNCF: +The code snippet below shows how to do 4-bit quantization of the model weights represented +in OpenVINO IR using NNCF: .. tab-set:: @@ -108,13 +115,16 @@ memory reduction, speed gain, and accuracy loss. -The INT4 method has several parameters that can provide different performance-accuracy trade-offs after optimization: +The INT4 method has several parameters that can provide different performance-accuracy +trade-offs after optimization: * ``mode`` - there are two optimization modes: symmetric and asymmetric. **Symmetric Compression** - ``INT4_SYM`` - INT4 Symmetric mode involves quantizing weights to an unsigned 4-bit integer symmetrically with a fixed zero point of 8. This mode is faster than the INT8, making it ideal for situations where **speed and size reduction are prioritized over accuracy**. + INT4 Symmetric mode involves quantizing weights to an unsigned 4-bit integer + symmetrically with a fixed zero point of 8. This mode is faster than the INT8, making + it ideal for situations where **speed and size reduction are prioritized over accuracy**. .. code-block:: python @@ -125,7 +135,10 @@ The INT4 method has several parameters that can provide different performance-ac **Asymmetric Compression** - ``INT4_ASYM`` - INT4 Asymmetric mode also uses an unsigned 4-bit integer but quantizes weights asymmetrically with a non-fixed zero point. This mode slightly compromises speed in favor of better accuracy compared to the symmetric mode. This mode is useful when **minimal accuracy loss is crucial**, but a faster performance than INT8 is still desired. + INT4 Asymmetric mode also uses an unsigned 4-bit integer but quantizes weights + asymmetrically with a non-fixed zero point. This mode slightly compromises speed in + favor of better accuracy compared to the symmetric mode. This mode is useful when + **minimal accuracy loss is crucial**, but a faster performance than INT8 is still desired. .. code-block:: python @@ -134,19 +147,31 @@ The INT4 method has several parameters that can provide different performance-ac compressed_model = compress_weights(model, mode=CompressWeightsMode.INT4_ASYM) -* ``group_size`` controls the size of the group of weights that share the same quantization parameters. Shared quantization parameters help to speed up the calculation of activation values as they are dequantized and quantized between layers. However, they can reduce accuracy. The following group sizes are recommended: ``128``, ``64``, ``32`` (``128`` is default value). +* ``group_size`` controls the size of the group of weights that share the same + quantization parameters. Shared quantization parameters help to speed up the + calculation of activation values as they are dequantized and quantized between + layers. However, they can reduce accuracy. The following group sizes are + recommended: ``128``, ``64``, ``32`` (``128`` is default value). - `Smaller Group Size`: Leads to a more accurate model but increases the model's footprint and reduces inference speed. + `Smaller Group Size`: Leads to a more accurate model but increases the model's + footprint and reduces inference speed. - `Larger Group Size`: Results in faster inference and a smaller model, but might compromise accuracy. + `Larger Group Size`: Results in faster inference and a smaller model, but might + compromise accuracy. -* ``ratio`` controls the ratio between INT4 and INT8 compressed layers in the model. Ratio is a decimal between 0 and 1. For example, 0.8 means that 80% of layers will be compressed to INT4, while the rest will be compressed to INT8 precision. The default value for ratio is 1. +* ``ratio`` controls the ratio between INT4 and INT8 compressed layers in the model. + Ratio is a decimal between 0 and 1. For example, 0.8 means that 80% of layers will be + compressed to INT4, while the rest will be compressed to INT8 precision. The default + value for ratio is 1. - `Higher Ratio (more INT4)`: Reduces the model size and increase inference speed but might lead to higher accuracy degradation. + `Higher Ratio (more INT4)`: Reduces the model size and increase inference speed but + might lead to higher accuracy degradation. - `Lower Ratio (more INT8)`: Maintains better accuracy but results in a larger model size and potentially slower inference. + `Lower Ratio (more INT8)`: Maintains better accuracy but results in a larger model size + and potentially slower inference. - In this example, 90% of the model's layers are quantized to INT4 asymmetrically with a group size of 64: + In this example, 90% of the model's layers are quantized to INT4 asymmetrically with + a group size of 64: .. code-block:: python @@ -160,25 +185,43 @@ The INT4 method has several parameters that can provide different performance-ac ratio=0.9, ) -* ``dataset`` - calibration dataset for data-aware weight compression. It is required for some compression options, for example, some types ``sensitivity_metric`` can use data for precision selection. +* ``dataset`` - calibration dataset for data-aware weight compression. It is required + for some compression options, for example, some types ``sensitivity_metric`` can use + data for precision selection. -* ``sensitivity_metric`` - controls the metric to estimate the sensitivity of compressing layers in the bit-width selection algorithm. Some of the metrics require dataset to be provided. The following types are supported: +* ``sensitivity_metric`` - controls the metric to estimate the sensitivity of compressing + layers in the bit-width selection algorithm. Some of the metrics require dataset to be + provided. The following types are supported: - * ``nncf.SensitivityMetric.WEIGHT_QUANTIZATION_ERROR`` - data-free metric computed as the inverted 8-bit quantization noise. Weights with highest value of this metric can be accurately quantized channel-wise to 8-bit. The idea is to leave these weights in 8 bit, and quantize the rest of layers to 4-bit group-wise. Since group-wise is more accurate than per-channel, accuracy should not degrade. + * ``nncf.SensitivityMetric.WEIGHT_QUANTIZATION_ERROR`` - data-free metric computed as + the inverted 8-bit quantization noise. Weights with highest value of this metric can + be accurately quantized channel-wise to 8-bit. The idea is to leave these weights in + 8 bit, and quantize the rest of layers to 4-bit group-wise. Since group-wise is more + accurate than per-channel, accuracy should not degrade. - * ``nncf.SensitivityMetric.HESSIAN_INPUT_ACTIVATION`` - requires dataset. The average Hessian trace of weights with respect to the layer-wise quantization error multiplied by L2 norm of 8-bit quantization noise. + * ``nncf.SensitivityMetric.HESSIAN_INPUT_ACTIVATION`` - requires dataset. The average + Hessian trace of weights with respect to the layer-wise quantization error multiplied + by L2 norm of 8-bit quantization noise. - * ``nncf.SensitivityMetric.MEAN_ACTIVATION_VARIANCE`` - requires dataset. The mean variance of the layers' inputs multiplied by inverted 8-bit quantization noise. + * ``nncf.SensitivityMetric.MEAN_ACTIVATION_VARIANCE`` - requires dataset. The mean + variance of the layers' inputs multiplied by inverted 8-bit quantization noise. - * ``nncf.SensitivityMetric.MAX_ACTIVATION_VARIANCE`` - requires dataset. The maximum variance of the layers' inputs multiplied by inverted 8-bit quantization noise. + * ``nncf.SensitivityMetric.MAX_ACTIVATION_VARIANCE`` - requires dataset. The maximum + variance of the layers' inputs multiplied by inverted 8-bit quantization noise. - * ``nncf.SensitivityMetric.MEAN_ACTIVATION_MAGNITUDE`` - requires dataset. The mean magnitude of the layers' inputs multiplied by inverted 8-bit quantization noise. + * ``nncf.SensitivityMetric.MEAN_ACTIVATION_MAGNITUDE`` - requires dataset. The mean + magnitude of the layers' inputs multiplied by inverted 8-bit quantization noise. -* ``all_layers`` - boolean parameter that enables INT4 weight quantization of all Fully-Connected and Embedding layers, including the first and last layers in the model. +* ``all_layers`` - boolean parameter that enables INT4 weight quantization of all + Fully-Connected and Embedding layers, including the first and last layers in the model. -* ``awq`` - boolean parameter that enables the AWQ method for more accurate INT4 weight quantization. Especially helpful when the weights of all the layers are quantized to 4 bits. The method can sometimes result in reduced accuracy when used with Dynamic Quantization of activations. Requires dataset. +* ``awq`` - boolean parameter that enables the AWQ method for more accurate INT4 weight + quantization. Especially helpful when the weights of all the layers are quantized to + 4 bits. The method can sometimes result in reduced accuracy when used with + Dynamic Quantization of activations. Requires dataset. -For data-aware weight compression refer to the following `example `__. +For data-aware weight compression refer to the following +`example `__. The example below shows data-free 4-bit weight quantization applied on top of OpenVINO IR. Before trying the example, make sure Optimum Intel @@ -191,11 +234,11 @@ is installed in your environment by running the following command: The first example loads a pre-trained Hugging Face model using the Optimum Intel API, compresses it to INT4 using NNCF, and then executes inference with a text phrase. -If the model comes from Hugging Face and is supported by Optimum, it can -be easier to use the Optimum Intel API to perform weight compression. The compression -type is specified when the model is loaded using the ``load_in_8bit=True`` or ``load_in_4bit=True`` parameter. -The second example uses the Weight Compression API from Optimum Intel instead of NNCF -to compress the model to INT8. +If the model comes from `Hugging Face `__ and is supported +by Optimum, it may be easier to use the Optimum Intel API to perform weight compression. +The compression type is specified when the model is loaded using the ``load_in_8bit=True`` +or ``load_in_4bit=True`` parameter. The second example uses the Weight Compression API +from Optimum Intel instead of NNCF to compress the model to INT8. .. tab-set:: @@ -291,14 +334,17 @@ Make sure to install GPTQ dependencies by running the following command: results = pipe(phrase) print(results) -An `example of a model `__ that has been optimized using GPTQ. +An `example of a model `__ +that has been optimized using GPTQ. Compression Metrics Examples ######################################## -The table below shows examples of text-generation Language Models with different optimization settings in a data-free setup, where no dataset is used at the optimization step. -The Perplexity metric is a measurement of response accuracy, where a higher complexity score indicates a lower accuracy. -It is measured on the `Lambada OpenAI dataset `__. +The table below shows examples of text-generation Language Models with different +optimization settings in a data-free setup, where no dataset is used at the optimization step. +The Perplexity metric is a measurement of response accuracy, where a higher complexity +score indicates a lower accuracy. It is measured on the +`Lambada OpenAI dataset `__. .. list-table:: :widths: 40 55 25 25 @@ -370,7 +416,8 @@ It is measured on the `Lambada OpenAI dataset `__. +The following table shows accuracy metric in a data-aware 4-bit weight quantization +setup measured on the `Wikitext dataset `__. .. list-table:: :widths: 40 55 25 25 @@ -406,21 +453,28 @@ The following table shows accuracy metric in a data-aware 4-bit weight quantizat - 2.6 -\*Perplexity metric in both tables was measured without the Dynamic Quantization feature enabled in the OpenVINO runtime. +\*Perplexity metric in both tables was measured without the Dynamic Quantization feature +enabled in the OpenVINO runtime. Auto-tuning of Weight Compression Parameters ############################################ -To find the optimal weight compression parameters for a particular model, refer to the `example `__ , where weight compression parameters are being searched from the subset of values. To speed up the search, a self-designed -validation pipeline called `WhoWhatBench `__ is used. -The pipeline can quickly evaluate the changes in the accuracy of the optimized model compared to the baseline. +To find the optimal weight compression parameters for a particular model, refer to the +`example `__ , +where weight compression parameters are being searched from the subset of values. +To speed up the search, a self-designed validation pipeline called +`WhoWhatBench `__ +is used. The pipeline can quickly evaluate the changes in the accuracy of the optimized +model compared to the baseline. Additional Resources #################### - `Data-aware Weight Compression Example `__ - `Tune Weight Compression Parameters Example `__ -- `OpenVINO GenAI Repo `__: Repository containing example pipelines that implement image and text generation tasks. It also provides a tool to benchmark LLMs. +- `OpenVINO GenAI Repo `__ + : Repository containing example pipelines that implement image and text generation + tasks. It also provides a tool to benchmark LLMs. - `WhoWhatBench `__ - `NNCF GitHub `__ - :doc:`Post-training Quantization ` diff --git a/docs/articles_en/openvino-workflow/model-optimization.rst b/docs/articles_en/openvino-workflow/model-optimization.rst index 2cf08990d6b1d6..6b56ee121b47ae 100644 --- a/docs/articles_en/openvino-workflow/model-optimization.rst +++ b/docs/articles_en/openvino-workflow/model-optimization.rst @@ -13,23 +13,48 @@ Model Optimization Guide model-optimization-guide/weight-compression -Model optimization is an optional offline step of improving the final model performance and reducing the model size by applying special optimization methods, such as 8-bit quantization, pruning, etc. OpenVINO offers three optimization paths implemented in `Neural Network Compression Framework (NNCF) `__: +Model optimization is an optional offline step of improving the final model performance +and reducing the model size by applying special optimization methods, such as 8-bit +quantization, pruning, etc. OpenVINO offers three optimization paths implemented in +`Neural Network Compression Framework (NNCF) `__: -- :doc:`Post-training Quantization ` is designed to optimize the inference of deep learning models by applying the post-training 8-bit integer quantization that does not require model retraining or fine-tuning. +- :doc:`Post-training Quantization ` + is designed to optimize the inference of deep learning models by applying the + post-training 8-bit integer quantization that does not require model retraining + or fine-tuning. + +- :doc:`Training-time Optimization ` + , a suite of advanced methods for training-time model optimization within the DL + framework, such as PyTorch and TensorFlow 2.x. It supports methods like + Quantization-aware Training, Structured and Unstructured Pruning, etc. -- :doc:`Training-time Optimization `, a suite of advanced methods for training-time model optimization within the DL framework, such as PyTorch and TensorFlow 2.x. It supports methods like Quantization-aware Training, Structured and Unstructured Pruning, etc. +- :doc:`Weight Compression `, + an easy-to-use method for Large Language Models footprint reduction and inference acceleration. -- :doc:`Weight Compression `, an easy-to-use method for Large Language Models footprint reduction and inference acceleration. +.. note:: -.. note:: OpenVINO also supports optimized models (for example, quantized) from source frameworks such as PyTorch, TensorFlow, and ONNX (in Q/DQ; Quantize/DeQuantize format). No special steps are required in this case and optimized models can be converted to the OpenVINO Intermediate Representation format (IR) right away. + OpenVINO also supports optimized models (for example, quantized) from source + frameworks such as PyTorch, TensorFlow, and ONNX (in Q/DQ; Quantize/DeQuantize format). + No special steps are required in this case and optimized models can be converted to + the OpenVINO Intermediate Representation format (IR) right away. -Post-training Quantization is the fastest way to optimize an arbitrary DL model and should be applied first, but it is limited in terms of achievable accuracy-performance trade-off. The recommended approach to obtain OpenVINO quantized model is to convert a model from original framework to ``ov.Model`` and ensure that the model works correctly in OpenVINO, for example, by calculating the model metrics. Then, ``ov.Model`` can be used as input for the ``nncf.quantize()`` method to get the quantized model or as input for the ``nncf.compress_weights()`` method to compress weights of Large Language Models (see the diagram below). +Post-training Quantization is the fastest way to optimize an arbitrary DL model and should +be applied first, but it is limited in terms of achievable accuracy-performance trade-off. +The recommended approach to obtain OpenVINO quantized model is to convert +`a model from original framework `__ to ``ov.Model`` +and ensure that the model works correctly in OpenVINO, for example, by calculating the +model metrics. Then, ``ov.Model`` can be used as input for the ``nncf.quantize()`` +method to get the quantized model or as input for the ``nncf.compress_weights()`` +method to compress weights of Large Language Models (see the diagram below). -In case of unsatisfactory accuracy or performance after Post-training Quantization, Training-time Optimization can be used as an option. +In case of unsatisfactory accuracy or performance after Post-training Quantization, +Training-time Optimization can be used as an option. .. image:: ../assets/images/DEVELOPMENT_FLOW_V3_crunch.svg -Once the model is optimized using the aforementioned methods, it can be used for inference using the regular OpenVINO inference workflow. No changes to the inference code are required. +Once the model is optimized using the aforementioned methods, it can be used for +inference using the regular OpenVINO inference workflow. No changes to the inference +code are required. .. image:: ../assets/images/WHAT_TO_USE.svg diff --git a/docs/articles_en/openvino-workflow/model-preparation/conversion-parameters.rst b/docs/articles_en/openvino-workflow/model-preparation/conversion-parameters.rst index bb1626559f6987..6a7023fc16afc3 100644 --- a/docs/articles_en/openvino-workflow/model-preparation/conversion-parameters.rst +++ b/docs/articles_en/openvino-workflow/model-preparation/conversion-parameters.rst @@ -7,9 +7,15 @@ Conversion Parameters .. meta:: :description: Model Conversion API provides several parameters to adjust model conversion. -This document describes all available parameters for ``openvino.convert_model``, ``ovc``, and ``openvino.save_model`` without focusing on a particular framework model format. Use this information for your reference as a common description of the conversion API capabilities in general. Part of the options can be not relevant to some specific frameworks. Use :doc:`Supported Model Formats <../model-preparation>` page for more dedicated framework-dependent tutorials. +This document describes all available parameters for ``openvino.convert_model``, ``ovc``, +and ``openvino.save_model`` without focusing on a particular framework model format. +Use this information for your reference as a common description of the conversion API +capabilities in general. Part of the options can be not relevant to some specific +frameworks. Use :doc:`Supported Model Formats <../model-preparation>` page for more +dedicated framework-dependent tutorials. -In most cases when it is required to convert a model the following simple syntax can be used: +You can obtain a model from `Hugging Face `__. When you +need to convert it, in most cases, you can use the following simple syntax: .. tab-set:: @@ -36,15 +42,34 @@ In most cases when it is required to convert a model the following simple syntax ovc path_to_your_model -Providing just a path to the model or model object as ``openvino.convert_model`` argument is frequently enough to make a successful conversion. However, depending on the model topology and original deep learning framework, additional parameters may be required, which are described below. - -- ``example_input`` parameter available in Python ``openvino.convert_model`` only is intended to trace the model to obtain its graph representation. This parameter is crucial for converting PyTorch models and may sometimes be required for TensorFlow models. For more details, refer to the :doc:`PyTorch Model Conversion ` or :doc:`TensorFlow Model Conversion `. - -- ``input`` parameter to set or override shapes for model inputs. It configures dynamic and static dimensions in model inputs depending on your inference requirements. For more information on this parameter, refer to the :doc:`Setting Input Shapes ` guide. - -- ``output`` parameter to select one or multiple outputs from the original model. This is useful when the model has outputs that are not required for inference in a deployment scenario. By specifying only necessary outputs, you can create a more compact model that infers faster. - -- ``compress_to_fp16`` parameter that is provided by ``ovc`` CLI tool and ``openvino.save_model`` Python function, gives controls over the compression of model weights to FP16 format when saving OpenVINO model to IR. This option is enabled by default which means all produced IRs are saved using FP16 data type for weights which saves up to 2x storage space for the model file and in most cases doesn't sacrifice model accuracy. In case it does affect accuracy, the compression can be disabled by setting this flag to ``False``: +Providing just a path to the model or model object as ``openvino.convert_model`` argument +is frequently enough to make a successful conversion. However, depending on the model +topology and original deep learning framework, additional parameters may be required, +which are described below. + +- ``example_input`` parameter available in Python ``openvino.convert_model`` only is + intended to trace the model to obtain its graph representation. This parameter is crucial + for converting PyTorch models and may sometimes be required for TensorFlow models. + For more details, refer to the :doc:`PyTorch Model Conversion ` + or :doc:`TensorFlow Model Conversion `. + +- ``input`` parameter to set or override shapes for model inputs. It configures dynamic + and static dimensions in model inputs depending on your inference requirements. For more + information on this parameter, refer to the :doc:`Setting Input Shapes ` + guide. + +- ``output`` parameter to select one or multiple outputs from the original model. + This is useful when the model has outputs that are not required for inference in a + deployment scenario. By specifying only necessary outputs, you can create a more + compact model that infers faster. + +- ``compress_to_fp16`` parameter that is provided by ``ovc`` CLI tool and + ``openvino.save_model`` Python function, gives controls over the compression of + model weights to FP16 format when saving OpenVINO model to IR. This option is enabled + by default which means all produced IRs are saved using FP16 data type for weights + which saves up to 2x storage space for the model file and in most cases doesn't + sacrifice model accuracy. In case it does affect accuracy, the compression can be + disabled by setting this flag to ``False``: .. tab-set:: @@ -75,23 +100,59 @@ For details on how plugins handle compressed ``FP16`` models, see Refer to the :doc:`Post-training optimization <../model-optimization-guide/quantizing-models-post-training>` guide for more information about that. -- ``extension`` parameter which makes possible conversion of the models consisting of operations that are not supported by OpenVINO out-of-the-box. It requires implementing of an OpenVINO extension first, please refer to :doc:`Frontend Extensions <../../documentation/openvino-extensibility/frontend-extensions>` guide. - -- ``share_weigths`` parameter with default value ``True`` allows reusing memory with original weights. For models loaded in Python and then passed to ``openvino.convert_model``, that means that OpenVINO model will share the same areas in program memory where the original weights are located. For models loaded from files by ``openvino.convert_model``, file memory mapping is used to avoid extra memory allocation. When enabled, the original model cannot be modified (Python object cannot be deallocated and original model file cannot be deleted) for the whole lifetime of OpenVINO model. Even model inference by original framework can lead to model modification. If it is not desired, set ``share_weights=False`` when calling ``openvino.convert_model``. - -.. note:: ``ovc`` does not have ``share_weights`` option and always uses sharing to reduce conversion time and consume less amount of memory during the conversion. +- ``extension`` parameter which makes possible conversion of the models consisting of + operations that are not supported by OpenVINO out-of-the-box. It requires implementing of + an OpenVINO extension first, please refer to + :doc:`Frontend Extensions <../../documentation/openvino-extensibility/frontend-extensions>` + guide. + +- ``share_weigths`` parameter with default value ``True`` allows reusing memory with + original weights. For models loaded in Python and then passed to ``openvino.convert_model``, + that means that OpenVINO model will share the same areas in program memory where the + original weights are located. For models loaded from files by ``openvino.convert_model``, + file memory mapping is used to avoid extra memory allocation. When enabled, the + original model cannot be modified (Python object cannot be deallocated and original + model file cannot be deleted) for the whole lifetime of OpenVINO model. Even model + inference by original framework can lead to model modification. If it is not desired, + set ``share_weights=False`` when calling ``openvino.convert_model``. + + .. note:: + + ``ovc`` does not have ``share_weights`` option and always uses sharing to reduce + conversion time and consume less amount of memory during the conversion. + +- ``output_model`` parameter in ``ovc`` and ``openvino.save_model`` specifies name for + output ``.xml`` file with the resulting OpenVINO IR. The accompanying ``.bin`` file + name will be generated automatically by replacing ``.xml`` extension with ``.bin`` + extension. The value of ``output_model`` must end with ``.xml`` extension. For ``ovc`` + command line tool, ``output_model`` can also contain a name of a directory. In this case, + the resulting OpenVINO IR files will be put into that directory with a base name of + ``.xml`` and ``.bin`` files matching the original model base name passed to ``ovc`` as a + parameter. For example, when calling ``ovc your_model.onnx --output_model directory_name``, + files ``directory_name/your_model.xml`` and ``directory_name/your_model.bin`` will be + created. If ``output_model`` is not used, then the current directory is used as + a destination directory. + + .. note:: + + ``openvino.save_model`` does not support a directory for ``output_model`` + parameter value because ``openvino.save_model`` gets OpenVINO model object + represented in a memory and there is no original model file name available for + output file name generation. For the same reason, ``output_model`` is a mandatory + parameter for ``openvino.save_model``. + +- ``verbose`` parameter activates extra diagnostics printed to the standard output. + Use for debugging purposes in case there is an issue with the conversion and to collect + information for better bug reporting to OpenVINO team. -- ``output_model`` parameter in ``ovc`` and ``openvino.save_model`` specifies name for output ``.xml`` file with the resulting OpenVINO IR. The accompanying ``.bin`` file name will be generated automatically by replacing ``.xml`` extension with ``.bin`` extension. The value of ``output_model`` must end with ``.xml`` extension. For ``ovc`` command line tool, ``output_model`` can also contain a name of a directory. In this case, the resulting OpenVINO IR files will be put into that directory with a base name of ``.xml`` and ``.bin`` files matching the original model base name passed to ``ovc`` as a parameter. For example, when calling ``ovc your_model.onnx --output_model directory_name``, files ``directory_name/your_model.xml`` and ``directory_name/your_model.bin`` will be created. If ``output_model`` is not used, then the current directory is used as a destination directory. - -.. note:: ``openvino.save_model`` does not support a directory for ``output_model`` parameter value because ``openvino.save_model`` gets OpenVINO model object represented in a memory and there is no original model file name available for output file name generation. For the same reason, ``output_model`` is a mandatory parameter for ``openvino.save_model``. - -- ``verbose`` parameter activates extra diagnostics printed to the standard output. Use for debugging purposes in case there is an issue with the conversion and to collect information for better bug reporting to OpenVINO team. +.. note:: -.. note:: Weights sharing does not equally work for all the supported model formats. The value of this flag is considered as a hint for the conversion API, and actual sharing is used only if it is implemented and possible for a particular model representation. + Weights sharing does not equally work for all the supported model formats. The value + of this flag is considered as a hint for the conversion API, and actual sharing is + used only if it is implemented and possible for a particular model representation. -You can always run ``ovc -h`` or ``ovc --help`` to recall all the supported parameters for ``ovc``. +You can always run ``ovc -h`` or ``ovc --help`` to recall all the supported +parameters for ``ovc``. Use ``ovc --version`` to check the version of OpenVINO package installed. - - diff --git a/docs/articles_en/openvino-workflow/model-preparation/convert-model-onnx.rst b/docs/articles_en/openvino-workflow/model-preparation/convert-model-onnx.rst index b52552ad55730e..9c903388a5c3bd 100644 --- a/docs/articles_en/openvino-workflow/model-preparation/convert-model-onnx.rst +++ b/docs/articles_en/openvino-workflow/model-preparation/convert-model-onnx.rst @@ -11,18 +11,30 @@ Converting an ONNX Model Introduction to ONNX #################### -`ONNX `__ is a representation format for deep learning models that enables AI developers to easily transfer models between different frameworks. +`ONNX `__ is a representation format for deep learning models +that enables AI developers to easily transfer models between different frameworks. -.. note:: An ONNX model file can be loaded by ``openvino.Core.read_model`` or ``openvino.Core.compile_model`` methods by OpenVINO runtime API without the need to prepare an OpenVINO IR first. Refer to the :doc:`inference example <../running-inference/integrate-openvino-with-your-application>` for more details. Using ``openvino.convert_model`` is still recommended if the model load latency is important for the inference application. +.. note:: + + An ONNX model file can be loaded by ``openvino.Core.read_model`` or + ``openvino.Core.compile_model`` methods by OpenVINO runtime API without the need to + prepare an OpenVINO IR first. Refer to the + :doc:`inference example <../running-inference/integrate-openvino-with-your-application>` + for more details. Using ``openvino.convert_model`` is still recommended if the model + load latency is important for the inference application. Converting an ONNX Model ######################## -This page provides instructions on model conversion from the ONNX format to the OpenVINO IR format. +This page provides instructions on model conversion from the ONNX format to the +OpenVINO IR format. -For model conversion, you need an ONNX model either directly downloaded from a public repository or converted from any framework that supports exporting to the ONNX format. +For model conversion, you need an ONNX model either directly downloaded from +an online database, for example `Hugging Face `__ , or +converted from any framework that supports exporting to the ONNX format. -To convert an ONNX model, run model conversion with the path to the input model ``.onnx`` file: +To convert an ONNX model, run model conversion with the path to the input +model ``.onnx`` file: .. tab-set:: diff --git a/docs/articles_en/openvino-workflow/model-preparation/convert-model-paddle.rst b/docs/articles_en/openvino-workflow/model-preparation/convert-model-paddle.rst index c70724b4047f95..97c968bc4a7692 100644 --- a/docs/articles_en/openvino-workflow/model-preparation/convert-model-paddle.rst +++ b/docs/articles_en/openvino-workflow/model-preparation/convert-model-paddle.rst @@ -8,16 +8,31 @@ Converting a PaddlePaddle Model :description: Learn how to convert a model from the PaddlePaddle format to the OpenVINO Model. -This page provides general instructions on how to convert a model from the PaddlePaddle format to the OpenVINO IR format using OpenVINO model conversion API. The instructions are different depending on the PaddlePaddle model format. +This page provides general instructions on how to convert a model from the PaddlePaddle +format to the OpenVINO IR format using OpenVINO model conversion API. The instructions +are different depending on the PaddlePaddle model format. -.. note:: PaddlePaddle model serialized in a file can be loaded by ``openvino.Core.read_model`` or ``openvino.Core.compile_model`` methods by OpenVINO runtime API without preparing OpenVINO IR first. Refer to the :doc:`inference example <../running-inference/integrate-openvino-with-your-application>` for more details. Using ``openvino.convert_model`` is still recommended if model load latency matters for the inference application. +.. note:: + + PaddlePaddle model serialized in a file can be loaded by ``openvino.Core.read_model`` + or ``openvino.Core.compile_model`` methods by OpenVINO runtime API without preparing + OpenVINO IR first. Refer to the + :doc:`inference example <../running-inference/integrate-openvino-with-your-application>` + for more details. Using ``openvino.convert_model`` is still recommended if model load + latency matters for the inference application. Converting PaddlePaddle Model Files ################################### -PaddlePaddle inference model includes ``.pdmodel`` (storing model structure) and ``.pdiparams`` (storing model weight). For details on how to export a PaddlePaddle inference model, refer to the `Exporting PaddlePaddle Inference Model `__ Chinese guide. +PaddlePaddle inference model includes ``.pdmodel`` (storing model structure) and +``.pdiparams`` (storing model weight). For details on how to export a PaddlePaddle +inference model, refer to the +`Exporting PaddlePaddle Inference Model `__ +Chinese guide. -To convert a PaddlePaddle model, use the ``ovc`` or ``openvino.convert_model`` and specify the path to the input ``.pdmodel`` model file: +You can download a PaddlePaddle model from `Hugging Face `__. +To convert the model, use the ``ovc`` or ``openvino.convert_model`` +and specify the path to the input ``.pdmodel`` model file: .. tab-set:: diff --git a/docs/articles_en/openvino-workflow/model-preparation/convert-model-pytorch.rst b/docs/articles_en/openvino-workflow/model-preparation/convert-model-pytorch.rst index 7289c6cbe020c0..6ac806daf0cda0 100644 --- a/docs/articles_en/openvino-workflow/model-preparation/convert-model-pytorch.rst +++ b/docs/articles_en/openvino-workflow/model-preparation/convert-model-pytorch.rst @@ -7,7 +7,9 @@ Converting a PyTorch Model PyTorch format to the OpenVINO Model. -To convert a PyTorch model, use the ``openvino.convert_model`` function. +You can download a PyTorch model from `PyTorch Hub `__ or +`Hugging Face `__. +To convert the model, use the ``openvino.convert_model`` function. Here is the simplest example of PyTorch model conversion using a model from ``torchvision``: diff --git a/docs/articles_en/openvino-workflow/model-preparation/convert-model-tensorflow-lite.rst b/docs/articles_en/openvino-workflow/model-preparation/convert-model-tensorflow-lite.rst index ecf08f9ff55575..93738f48f1d39f 100644 --- a/docs/articles_en/openvino-workflow/model-preparation/convert-model-tensorflow-lite.rst +++ b/docs/articles_en/openvino-workflow/model-preparation/convert-model-tensorflow-lite.rst @@ -9,7 +9,10 @@ Converting a TensorFlow Lite Model TensorFlow Lite format to the OpenVINO Model. -To convert an TensorFlow Lite model, run model conversion with the path to the ``.tflite`` model file: +You can download a TensorFlow Lite model from +`Kaggle `__ +or `Hugging Face `__. +To convert the model, run model conversion with the path to the ``.tflite`` model file: .. tab-set:: @@ -28,16 +31,27 @@ To convert an TensorFlow Lite model, run model conversion with the path to the ` ovc your_model_file.tflite -.. note:: TensorFlow Lite model file can be loaded by ``openvino.Core.read_model`` or ``openvino.Core.compile_model`` methods by OpenVINO runtime API without preparing OpenVINO IR first. Refer to the :doc:`inference example <../running-inference/integrate-openvino-with-your-application>` for more details. Using ``openvino.convert_model`` is still recommended if model load latency matters for the inference application. +.. note:: + + TensorFlow Lite model file can be loaded by ``openvino.Core.read_model`` or + ``openvino.Core.compile_model`` methods by OpenVINO runtime API without preparing + OpenVINO IR first. Refer to the + :doc:`inference example <../running-inference/integrate-openvino-with-your-application>` + for more details. Using ``openvino.convert_model`` is still recommended if model + load latency matters for the inference application. Supported TensorFlow Lite Layers ################################### -For the list of supported standard layers, refer to the :doc:`Supported Operations <../../about-openvino/compatibility-and-support/supported-operations-framework-frontend>` page. +For the list of supported standard layers, refer to the +:doc:`Supported Operations <../../about-openvino/compatibility-and-support/supported-operations-framework-frontend>` +page. Supported TensorFlow Lite Models ################################### -More than eighty percent of public TensorFlow Lite models are supported from open sources `TensorFlow Hub `__ and `MediaPipe `__. +More than eighty percent of public TensorFlow Lite models are supported from open +sources `Kaggle `__ +and `MediaPipe `__. Unsupported models usually have custom TensorFlow Lite operations. diff --git a/docs/articles_en/openvino-workflow/model-preparation/convert-model-tensorflow.rst b/docs/articles_en/openvino-workflow/model-preparation/convert-model-tensorflow.rst index 84aa153cfb82be..1db451045e702d 100644 --- a/docs/articles_en/openvino-workflow/model-preparation/convert-model-tensorflow.rst +++ b/docs/articles_en/openvino-workflow/model-preparation/convert-model-tensorflow.rst @@ -8,13 +8,39 @@ Converting a TensorFlow Model :description: Learn how to convert a model from a TensorFlow format to the OpenVINO Model. -This page provides general instructions on how to run model conversion from a TensorFlow format to the OpenVINO IR format. The instructions are different depending on whether your model was created with TensorFlow v1.X or TensorFlow v2.X. +This page provides general instructions on how to run model conversion from a TensorFlow +format to the OpenVINO IR format. The instructions are different depending on whether +your model was created with TensorFlow v1.X or TensorFlow v2.X. -.. note:: TensorFlow models can be loaded by ``openvino.Core.read_model`` or ``openvino.Core.compile_model`` methods by OpenVINO runtime API without preparing OpenVINO IR first. Refer to the :doc:`inference example <../running-inference/integrate-openvino-with-your-application>` for more details. Using ``openvino.convert_model`` is still recommended if model load latency matters for the inference application. +TensorFlow models can be obtained from +`Kaggle `__ +or `Hugging Face `__. -.. note:: ``openvino.convert_model`` uses sharing of model weights by default. That means that OpenVINO model will share the same areas in program memory where the original weights are located, for this reason the original model cannot be modified (Python object cannot be deallocated and original model file cannot be deleted) for the whole lifetime of OpenVINO model. Model inference for TensorFlow models can lead to model modification, so original TF model should not be inferred during the lifetime of OpenVINO model. If it is not desired, set ``share_weights=False`` when calling ``openvino.convert_model``. +.. note:: + + TensorFlow models can be loaded by ``openvino.Core.read_model`` or + ``openvino.Core.compile_model`` methods by OpenVINO runtime API without preparing + OpenVINO IR first. Refer to the + :doc:`inference example <../running-inference/integrate-openvino-with-your-application>` + for more details. Using ``openvino.convert_model`` is still recommended if model load + latency matters for the inference application. + +.. note:: + + ``openvino.convert_model`` uses sharing of model weights by default. That means that + OpenVINO model will share the same areas in program memory where the original weights + are located, for this reason the original model cannot be modified (Python object + cannot be deallocated and original model file cannot be deleted) for the whole + lifetime of OpenVINO model. Model inference for TensorFlow models can lead to model + modification, so original TF model should not be inferred during the lifetime of + OpenVINO model. If it is not desired, set ``share_weights=False`` when calling + ``openvino.convert_model``. + +.. note:: -.. note:: Examples below that convert TensorFlow models from a file, do not require any version of TensorFlow to be installed on the system, except in cases when the ``tensorflow`` module is imported explicitly. + Examples below that convert TensorFlow models from a file, do not require any version + of TensorFlow to be installed on the system, except in cases when the ``tensorflow`` + module is imported explicitly. Converting TensorFlow 2 Models ############################## @@ -25,7 +51,8 @@ Below are the instructions on how to convert each of them. SavedModel Format +++++++++++++++++ -A model in the SavedModel format consists of a directory with a ``saved_model.pb`` file and two subfolders: ``variables`` and ``assets`` inside. +A model in the SavedModel format consists of a directory with a ``saved_model.pb`` +file and two subfolders: ``variables`` and ``assets`` inside. To convert a model, run conversion with the directory as the model argument: .. tab-set:: @@ -59,8 +86,9 @@ SavedModel format. Here is an example of how to do it: model = tf.keras.models.load_model('model.h5') tf.saved_model.save(model,'model') -Converting a Keras H5 model with a custom layer to the SavedModel format requires special considerations. -For example, the model with a custom layer ``CustomLayer`` from ``custom_layer.py`` is converted as follows: +Converting a Keras H5 model with a custom layer to the SavedModel format requires special +considerations. For example, the model with a custom layer ``CustomLayer`` from +``custom_layer.py`` is converted as follows: .. code-block:: py :force: @@ -82,7 +110,8 @@ Converting TensorFlow 1 Models Converting Frozen Model Format +++++++++++++++++++++++++++++++ -To convert a TensorFlow model, run model conversion with the path to the input model ``*.pb*`` file: +To convert a TensorFlow model, run model conversion with the path to the input +model ``*.pb*`` file: .. tab-set:: @@ -107,9 +136,12 @@ Converting Non-Frozen Model Formats There are three ways to store non-frozen TensorFlow models. -1. **SavedModel format**. In this case, a model consists of a special directory with a ``.pb`` file -and several subfolders: ``variables``, ``assets``, and ``assets.extra``. For more information about the SavedModel directory, refer to the `README `__ file in the TensorFlow repository. -To convert such TensorFlow model, run the conversion similarly to other model formats and pass a path to the directory as a model argument: +1. **SavedModel format**. In this case, a model consists of a special directory with a + ``.pb`` file and several subfolders: ``variables``, ``assets``, and ``assets.extra``. + For more information about the SavedModel directory, refer to the + `README `__ + file in the TensorFlow repository. To convert such TensorFlow model, run the conversion + similarly to other model formats and pass a path to the directory as a model argument: .. tab-set:: @@ -128,9 +160,12 @@ To convert such TensorFlow model, run the conversion similarly to other model fo ovc path_to_saved_model_dir -2. **Checkpoint**. In this case, a model consists of two files: ``inference_graph.pb`` (or ``inference_graph.pbtxt``) and ``checkpoint_file.ckpt``. -If you do not have an inference graph file, refer to the `Freezing Custom Models in Python <#Freezing-Custom-Models-in-Python>`__ section. -To convert the model with the inference graph in ``.pb`` format, provide paths to both files as an argument for ``ovc`` or ``openvino.convert_model``: +2. **Checkpoint**. In this case, a model consists of two files: ``inference_graph.pb`` + (or ``inference_graph.pbtxt``) and ``checkpoint_file.ckpt``. + If you do not have an inference graph file, refer to the + `Freezing Custom Models in Python <#Freezing-Custom-Models-in-Python>`__ section. + To convert the model with the inference graph in ``.pb`` format, provide paths to both + files as an argument for ``ovc`` or ``openvino.convert_model``: .. tab-set:: @@ -149,11 +184,16 @@ To convert the model with the inference graph in ``.pb`` format, provide paths t ovc path_to_inference_graph.pb path_to_checkpoint_file.ckpt -To convert the model with the inference graph in the ``.pbtxt`` format, specify the path to ``.pbtxt`` file instead of the ``.pb`` file. The conversion API automatically detects the format of the provided file, there is no need to specify the model file format explicitly when calling ``ovc`` or ``openvino.convert_model`` in all examples in this document. +To convert the model with the inference graph in the ``.pbtxt`` format, specify the path +to ``.pbtxt`` file instead of the ``.pb`` file. The conversion API automatically detects +the format of the provided file, there is no need to specify the model file format +explicitly when calling ``ovc`` or ``openvino.convert_model`` in all examples in this document. -3. **MetaGraph**. In this case, a model consists of three or four files stored in the same directory: ``model_name.meta``, ``model_name.index``, -``model_name.data-00000-of-00001`` (the numbers may vary), and ``checkpoint`` (optional). -To convert such a TensorFlow model, run the conversion providing a path to `.meta` file as an argument: +3. **MetaGraph**. In this case, a model consists of three or four files stored in the same + directory: ``model_name.meta``, ``model_name.index``, + ``model_name.data-00000-of-00001`` (the numbers may vary), and ``checkpoint`` (optional). + To convert such a TensorFlow model, run the conversion providing a path to ``.meta`` + file as an argument: .. tab-set:: @@ -176,9 +216,11 @@ To convert such a TensorFlow model, run the conversion providing a path to `.met Freezing Custom Models in Python ++++++++++++++++++++++++++++++++ -When a model is defined in Python code, you must create an inference graph file. Graphs are usually built in a form -that allows model training. That means all trainable parameters are represented as variables in the graph. -To be able to use such a graph with the model conversion API, it should be frozen first before passing to the ``openvino.convert_model`` function: +When a model is defined in Python code, you must create an inference graph file. Graphs are +usually built in a form that allows model training. That means all trainable parameters are +represented as variables in the graph. To be able to use such a graph with the model +conversion API, it should be frozen first before passing to the +``openvino.convert_model`` function: .. code-block:: py :force: @@ -192,22 +234,28 @@ To be able to use such a graph with the model conversion API, it should be froze Where: -* ``sess`` is the instance of the TensorFlow Session object where the network topology is defined. -* ``["name_of_the_output_node"]`` is the list of output node names in the graph; ``frozen`` graph will include only those nodes from the original ``sess.graph_def`` that are directly or indirectly used to compute given output nodes. The ``'name_of_the_output_node'`` is an example of a possible output node name. You should derive the names based on your own graph. +* ``sess`` is the instance of the TensorFlow Session object where the network topology + is defined. +* ``["name_of_the_output_node"]`` is the list of output node names in the graph; + ``frozen`` graph will include only those nodes from the original ``sess.graph_def`` + that are directly or indirectly used to compute given output nodes. The + ``'name_of_the_output_node'`` is an example of a possible output node name. + You should derive the names based on your own graph. Converting TensorFlow Models from Memory Using Python API ############################################################ Model conversion API supports passing TensorFlow/TensorFlow2 models directly from memory. -* ``Trackable``. The object returned by ``hub.load()`` can be converted to ``ov.Model`` with ``convert_model()``. +* ``Trackable``. The object returned by ``hub.load()`` can be converted to + ``ov.Model`` with ``convert_model()``. .. code-block:: py :force: import tensorflow_hub as hub import openvino as ov - + model = hub.load("https://tfhub.dev/google/movenet/singlepose/lightning/4") ov_model = ov.convert_model(model) @@ -234,7 +282,10 @@ Model conversion API supports passing TensorFlow/TensorFlow2 models directly fro model = tf.keras.applications.ResNet50(weights="imagenet") ov_model = ov.convert_model(model) -* ``tf.keras.layers.Layer``. The ``ov.Model`` converted from ``tf.keras.layers.Layer`` does not contain original input and output names. So it is recommended to convert the model to ``tf.keras.Model`` before conversion or use ``hub.load()`` for TensorFlow Hub models. +* ``tf.keras.layers.Layer``. The ``ov.Model`` converted from ``tf.keras.layers.Layer`` + does not contain original input and output names. So it is recommended to convert the + model to ``tf.keras.Model`` before conversion or use ``hub.load()`` for + TensorFlow Hub models. .. code-block:: py :force: @@ -265,7 +316,12 @@ Model conversion API supports passing TensorFlow/TensorFlow2 models directly fro model = MyModule(name="simple_module") ov_model = ov.convert_model(model, input=[-1]) -.. note:: There is a known bug in ``openvino.convert_model`` on using ``tf.Variable`` nodes in the model graph. The results of the conversion of such models are unpredictable. It is recommended to save a model with ``tf.Variable`` into TensorFlow Saved Model format and load it with ``openvino.convert_model``. +.. note:: + + There is a known bug in ``openvino.convert_model`` on using ``tf.Variable`` nodes in + the model graph. The results of the conversion of such models are unpredictable. It + is recommended to save a model with ``tf.Variable`` into TensorFlow Saved Model format + and load it with ``openvino.convert_model``. * ``tf.compat.v1.Graph`` @@ -328,7 +384,9 @@ Model conversion API supports passing TensorFlow/TensorFlow2 models directly fro Supported TensorFlow and TensorFlow 2 Keras Layers ################################################## -For the list of supported standard layers, refer to the :doc:`Supported Operations <../../about-openvino/compatibility-and-support/supported-operations-framework-frontend>` page. +For the list of supported standard layers, refer to the +:doc:`Supported Operations <../../about-openvino/compatibility-and-support/supported-operations-framework-frontend>` +page. Summary ####### @@ -339,5 +397,3 @@ In this document, you learned: * Which TensorFlow models are supported. * How to freeze a TensorFlow model. - - diff --git a/docs/articles_en/openvino-workflow/model-preparation/convert-model-to-ir.rst b/docs/articles_en/openvino-workflow/model-preparation/convert-model-to-ir.rst index ac008631e49fff..be67f581173309 100644 --- a/docs/articles_en/openvino-workflow/model-preparation/convert-model-to-ir.rst +++ b/docs/articles_en/openvino-workflow/model-preparation/convert-model-to-ir.rst @@ -18,7 +18,8 @@ Convert to OpenVINO IR Convert from PaddlePaddle -:doc:`IR (Intermediate Representation) <../../documentation/openvino-ir-format>` is OpenVINO own format consisting of ``.xml`` and ``.bin`` files. +:doc:`IR (Intermediate Representation) <../../documentation/openvino-ir-format>` is +OpenVINO own format consisting of ``.xml`` and ``.bin`` files. Convert the model into OpenVINO IR for `better performance <#ir-conversion-benefits>`__. Convert Models @@ -616,4 +617,5 @@ Additional Resources #################### * :doc:`Transition guide from the legacy to new conversion API <../../documentation/legacy-features/transition-legacy-conversion-api>` +* `Download models from Hugging Face `__. diff --git a/docs/articles_en/openvino-workflow/model-preparation/setting-input-shapes.rst b/docs/articles_en/openvino-workflow/model-preparation/setting-input-shapes.rst index 7ab05fed2ec56a..9e17fdaad9999c 100644 --- a/docs/articles_en/openvino-workflow/model-preparation/setting-input-shapes.rst +++ b/docs/articles_en/openvino-workflow/model-preparation/setting-input-shapes.rst @@ -20,7 +20,8 @@ performance and memory consumption. For more information on changing input shapes in runtime, refer to the :doc:`Changing input shapes <../running-inference/changing-input-shape>` guide. To learn more about dynamic shapes in runtime, refer to the -:doc:`Dynamic Shapes <../running-inference/dynamic-shapes>` guide. +:doc:`Dynamic Shapes <../running-inference/dynamic-shapes>` guide. To download models, +you can visit `Hugging Face `__. The OpenVINO Runtime API may present certain limitations in inferring models with undefined dimensions on some hardware. See the :doc:`Feature support matrix <../../about-openvino/compatibility-and-support/supported-devices>` @@ -49,9 +50,13 @@ and specify the input shape of ``[2,300,300,3]``: ovc MobileNet.pb --input [2,300,300,3] -If a model has multiple inputs, the input shape should be specified in ``input`` parameter as a list. In ``ovc``, this is a command separate list, and in ``openvino.convert_model`` this is a Python list or tuple with number of elements matching the number of inputs in the model. Use input names from the original model to define the mapping between inputs and shapes specified. -The following example demonstrates the conversion of the ONNX OCR model with a pair of inputs ``data`` and ``seq_len`` -and specifies shapes ``[3,150,200,1]`` and ``[3]`` for them respectively: +If a model has multiple inputs, the input shape should be specified in ``input`` parameter +as a list. In ``ovc``, this is a command separate list, and in ``openvino.convert_model`` +this is a Python list or tuple with number of elements matching the number of inputs in +the model. Use input names from the original model to define the mapping between inputs +and shapes specified. The following example demonstrates the conversion of the ONNX OCR +model with a pair of inputs ``data`` and ``seq_len`` and specifies shapes ``[3,150,200,1]`` +and ``[3]`` for them respectively: .. tab-set:: @@ -71,7 +76,9 @@ and specifies shapes ``[3,150,200,1]`` and ``[3]`` for them respectively: ovc ocr.onnx --input data[3,150,200,1],seq_len[3] -If the order of inputs is defined in the input model and the order is known for the user, names could be omitted. In this case, it is important to specify shapes in the same order of input model inputs: +If the order of inputs is defined in the input model and the order is known for the user, +names could be omitted. In this case, it is important to specify shapes in the +same order of input model inputs: .. tab-set:: @@ -91,12 +98,19 @@ If the order of inputs is defined in the input model and the order is known for ovc ocr.onnx --input [3,150,200,1],[3] -Whether the model has a specified order of inputs depends on the original framework. Usually, it is convenient to set shapes without specifying the names of the parameters in the case of PyTorch model conversion because a PyTorch model is considered as a callable that usually accepts positional parameters. On the other hand, names of inputs are convenient when converting models from model files, because naming of inputs is a good practice for many frameworks that serialize models to files. +Whether the model has a specified order of inputs depends on the original framework. +Usually, it is convenient to set shapes without specifying the names of the parameters +in the case of PyTorch model conversion because a PyTorch model is considered as +a callable that usually accepts positional parameters. On the other hand, names of inputs +are convenient when converting models from model files, because naming of inputs is +a good practice for many frameworks that serialize models to files. -The ``input`` parameter allows overriding original input shapes if it is supported by the model topology. -Shapes with dynamic dimensions in the original model can be replaced with static shapes for the converted model, and vice versa. -The dynamic dimension can be marked in model conversion API parameter as ``-1`` or ``?`` when using ``ovc``. -For example, launch model conversion for the ONNX OCR model and specify dynamic batch dimension for inputs: +The ``input`` parameter allows overriding original input shapes if it is supported by +the model topology. Shapes with dynamic dimensions in the original model can be replaced +with static shapes for the converted model, and vice versa. The dynamic dimension can be +marked in model conversion API parameter as ``-1`` or ``?`` when using ``ovc``. +For example, launch model conversion for the ONNX OCR model and specify dynamic batch +dimension for inputs: .. tab-set:: @@ -116,9 +130,13 @@ For example, launch model conversion for the ONNX OCR model and specify dynamic ovc ocr.onnx --input "data[?,150,200,1],seq_len[?]" -To optimize memory consumption for models with undefined dimensions in run-time, model conversion API provides the capability to define boundaries of dimensions. -The boundaries of undefined dimension can be specified with ellipsis in the command line or with ``openvino.Dimension`` class in Python. -For example, launch model conversion for the ONNX OCR model and specify a boundary for the batch dimension 1..3, which means that the input tensor will have batch dimension minimum 1 and maximum 3 in inference: +To optimize memory consumption for models with undefined dimensions in run-time, +model conversion API provides the capability to define boundaries of dimensions. +The boundaries of undefined dimension can be specified with ellipsis in the command +line or with ``openvino.Dimension`` class in Python. +For example, launch model conversion for the ONNX OCR model and specify a boundary for +the batch dimension 1..3, which means that the input tensor will have batch dimension +minimum 1 and maximum 3 in inference: .. tab-set:: @@ -139,5 +157,9 @@ For example, launch model conversion for the ONNX OCR model and specify a bounda ovc ocr.onnx --input data[1..3,150,200,1],seq_len[1..3] -In practice, not every model is designed in a way that allows change of input shapes. An attempt to change the shape for such models may lead to an exception during model conversion, later in model inference, or even to wrong results of inference without explicit exception raised. A knowledge about model topology is required to set shapes appropriately. +In practice, not every model is designed in a way that allows change of input shapes. +An attempt to change the shape for such models may lead to an exception during model +conversion, later in model inference, or even to wrong results of inference without +explicit exception raised. A knowledge about model topology is required to set +shapes appropriately. diff --git a/docs/articles_en/openvino-workflow/running-inference/integrate-openvino-with-your-application.rst b/docs/articles_en/openvino-workflow/running-inference/integrate-openvino-with-your-application.rst index ce5e6fd20722a1..222c8760d0a880 100644 --- a/docs/articles_en/openvino-workflow/running-inference/integrate-openvino-with-your-application.rst +++ b/docs/articles_en/openvino-workflow/running-inference/integrate-openvino-with-your-application.rst @@ -432,7 +432,8 @@ To build your project using CMake with the default build tools currently availab Additional Resources #################### -* See the :doc:`OpenVINO Samples <../../learn-openvino/openvino-samples>` page or the `Open Model Zoo Demos `__ page for specific examples of how OpenVINO pipelines are implemented for applications like image classification, text prediction, and many others. +* See the :doc:`OpenVINO Samples <../../learn-openvino/openvino-samples>` page for specific examples of how OpenVINO pipelines are implemented for applications like image classification, text prediction, and many others. +* Models in the OpenVINO IR format on `Hugging Face `__. * :doc:`OpenVINO™ Runtime Preprocessing ` * :doc:`String Tensors ` * :doc:`Using Encrypted Models with OpenVINO <../../documentation/openvino-security/openvino-encrypted-models>` From 8ae4a1051e40da5935c5e25ca4c5d05758f61e57 Mon Sep 17 00:00:00 2001 From: Aleksandr Voron Date: Fri, 14 Jun 2024 11:30:56 +0200 Subject: [PATCH 10/31] [CPU][ARM] Enable MVN SLT f16 tests (#24983) MVN SLT f16 tests were disabled by setting high threshold because of ACL accuracy issue: https://github.com/ARM-software/ComputeLibrary/issues/1095 Issue is fixed and ACL with the fix is being used by OpenVINO --- .../custom/single_layer_tests/classes/mvn.cpp | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/src/plugins/intel_cpu/tests/functional/custom/single_layer_tests/classes/mvn.cpp b/src/plugins/intel_cpu/tests/functional/custom/single_layer_tests/classes/mvn.cpp index b0c9486a06bae4..598447f8ec8363 100644 --- a/src/plugins/intel_cpu/tests/functional/custom/single_layer_tests/classes/mvn.cpp +++ b/src/plugins/intel_cpu/tests/functional/custom/single_layer_tests/classes/mvn.cpp @@ -5,8 +5,10 @@ #include "mvn.hpp" #include "gtest/gtest.h" #include "utils/cpu_test_utils.hpp" +#include "utils/general_utils.h" using namespace CPUTestUtils; +using namespace ov::intel_cpu; namespace ov { namespace test { @@ -116,11 +118,10 @@ void MvnLayerCPUTest::SetUp() { mvn->set_reduction_axes(axes); } - rel_threshold = 0.015f; - if (additionalConfig[ov::hint::inference_precision.name()] == ov::element::f16) { - //FIXME: ref and acl mvn implementation has accuracy issues on fp16 (#116344) - abs_threshold = .05f; - rel_threshold = 250.f; + rel_threshold = 5e-4; + if (one_of(additionalConfig[ov::hint::inference_precision.name()], ov::element::f16, ov::element::bf16)) { + rel_threshold = 1e-2; + abs_threshold = .03f; } configuration.insert(additionalConfig.begin(), additionalConfig.end()); updateSelectedType(getPrimitiveType(), netPrecision, configuration); From 32e48c336b7df89f6447b3bbed0fdb9cf51dc211 Mon Sep 17 00:00:00 2001 From: Sofya Balandina Date: Fri, 14 Jun 2024 10:58:30 +0100 Subject: [PATCH 11/31] [subgraph dumper] Change model package patterns (#25006) ### Details: - *item1* - *...* ### Tickets: - *ticket-id* --- .../data/default_re_to_find_models.lst | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/tests/test_utils/functional_test_utils/layer_tests_summary/data/default_re_to_find_models.lst b/src/tests/test_utils/functional_test_utils/layer_tests_summary/data/default_re_to_find_models.lst index 37551cc69f5111..a3950761eca271 100644 --- a/src/tests/test_utils/functional_test_utils/layer_tests_summary/data/default_re_to_find_models.lst +++ b/src/tests/test_utils/functional_test_utils/layer_tests_summary/data/default_re_to_find_models.lst @@ -1,5 +1,5 @@ -ww*_dynamic* -ww*_pytorch* -ww*_static* -ww*_tfhub* +[ww|WW]*_dynamic* +[ww|WW]*_pytorch* +[ww|WW]*_static* +[ww|WW]*_tfhub* # ww*_tflite* \ No newline at end of file From 7d485b99417ea437b62416ab645368c79f51b9c6 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 14 Jun 2024 14:33:07 +0400 Subject: [PATCH 12/31] Bump codecov/codecov-action from 4.4.1 to 4.5.0 (#25019) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Bumps [codecov/codecov-action](https://github.com/codecov/codecov-action) from 4.4.1 to 4.5.0.
Commits
  • e28ff12 chore(release): bump to 4.5.0 (#1477)
  • 7594baa Use an existing token even if the PR is from a fork (#1471)
  • 81c0a51 feat: add support for tokenless v3 (#1410)
  • f5e203f build(deps-dev): bump @​typescript-eslint/eslint-plugin from 7.12.0 to 7.13.0 ...
  • 7c48363 build(deps-dev): bump braces from 3.0.2 to 3.0.3 (#1475)
  • 69e5d09 build(deps-dev): bump @​typescript-eslint/parser from 7.12.0 to 7.13.0 (#1474)
  • feaf700 fix: handle trailing commas (#1470)
  • 7b6a727 build(deps): bump github/codeql-action from 3.25.7 to 3.25.8 (#1472)
  • ccf7a1f build(deps-dev): bump @​typescript-eslint/eslint-plugin from 7.11.0 to 7.12.0 ...
  • f03f015 build(deps-dev): bump @​typescript-eslint/parser from 7.11.0 to 7.12.0 (#1467)
  • Additional commits viewable in compare view

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=codecov/codecov-action&package-manager=github_actions&previous-version=4.4.1&new-version=4.5.0)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/coverage.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/coverage.yml b/.github/workflows/coverage.yml index a145276590d3e6..436f335276d169 100644 --- a/.github/workflows/coverage.yml +++ b/.github/workflows/coverage.yml @@ -137,6 +137,6 @@ jobs: lcov --capture --directory ${{ github.workspace }}/. --output-file coverage.info genhtml coverage.info --output-directory coverage-report - name: Collect coverage - uses: codecov/codecov-action@125fc84a9a348dbcf27191600683ec096ec9021c # v4.4.1 + uses: codecov/codecov-action@e28ff129e5465c2c0dcc6f003fc735cb6ae0c673 # v4.5.0 with: verbose: true From 209e31fceb7893e8be7f9a5ae355745ff86acc18 Mon Sep 17 00:00:00 2001 From: Karol Blaszczak Date: Fri, 14 Jun 2024 13:55:50 +0200 Subject: [PATCH 13/31] Docs bunch of release adjustments (#25014) --- .../compatibility-and-support.rst | 5 +- .../supported-models.rst | 49 +- .../generative-ai-performance.rst | 3 +- .../about-openvino/release-notes-openvino.rst | 8 +- .../system-requirements.rst | 1 + .../get-started/install-openvino.rst | 2 +- .../_static/download/supported_models.csv | 1210 +++++++++++++++++ docs/sphinx_setup/_static/models.csv | 14 - 8 files changed, 1246 insertions(+), 46 deletions(-) create mode 100644 docs/sphinx_setup/_static/download/supported_models.csv delete mode 100644 docs/sphinx_setup/_static/models.csv diff --git a/docs/articles_en/about-openvino/compatibility-and-support.rst b/docs/articles_en/about-openvino/compatibility-and-support.rst index f2c467be34676e..f9ea2b2b34ba90 100644 --- a/docs/articles_en/about-openvino/compatibility-and-support.rst +++ b/docs/articles_en/about-openvino/compatibility-and-support.rst @@ -1,5 +1,3 @@ -.. {#compatibility_and_support} - Compatibility and Support ========================= @@ -9,12 +7,15 @@ Compatibility and Support :hidden: compatibility-and-support/supported-devices + compatibility-and-support/supported-models compatibility-and-support/supported-operations-inference-devices compatibility-and-support/supported-operations-framework-frontend :doc:`Supported Devices ` - compatibility information for supported hardware accelerators. +:doc:`Supported Models ` - a list of selected models confirmed to work with given hardware. + :doc:`Supported Operations ` - a listing of framework layers supported by OpenVINO. :doc:`Supported Operations ` - a listing of layers supported by OpenVINO inference devices. diff --git a/docs/articles_en/about-openvino/compatibility-and-support/supported-models.rst b/docs/articles_en/about-openvino/compatibility-and-support/supported-models.rst index 0c1195063196e9..3131545954c032 100644 --- a/docs/articles_en/about-openvino/compatibility-and-support/supported-models.rst +++ b/docs/articles_en/about-openvino/compatibility-and-support/supported-models.rst @@ -1,44 +1,47 @@ Supported Models ======================== -.. toctree:: - :maxdepth: 1 - :hidden: +The following table lists a selection of models that are validated against various hardware +devices. The list includes only models used in validation, other models from frameworks supported +by OpenVINO may also work properly. - about-openvino/performance-benchmarks - about-openvino/compatibility-and-support - Release Notes - Additional Resources .. raw:: html - +
- + .. csv-table:: :class: modeldata stripe :name: supportedModelsTable :header-rows: 1 - :file: ../../_static/models.csv + :file: ../../_static/download/supported_models.csv + + +| Note: +| The validation process involves using OpenVINO, natively or as a backend, to load each model + onto the designated hardware and execute inference. If no errors are reported and inference + finishes, the model receives the **passed** status (indicated by a check mark in the table). + The models that are not tested are indicated by **empty** status cells. +| The models come from different public model repositories, such as, OpenVINO Model Zoo, + ONNX Model Zoo, Pytorch Model Zoo, and HuggingFace. +| In the precision column, optimum-intel default corresponds to FP32 for small models and INT8 + for models greater than 1B parameters. \ No newline at end of file diff --git a/docs/articles_en/about-openvino/performance-benchmarks/generative-ai-performance.rst b/docs/articles_en/about-openvino/performance-benchmarks/generative-ai-performance.rst index a56b623c574a34..f174b9a9fd1d3d 100644 --- a/docs/articles_en/about-openvino/performance-benchmarks/generative-ai-performance.rst +++ b/docs/articles_en/about-openvino/performance-benchmarks/generative-ai-performance.rst @@ -5,9 +5,8 @@ This page is regularly updated to help you identify the best-performing LLMs on The table below lists the key performance indicators for a selection of Large Language Models running on an Intel® Core™ Ultra 7-165H based system. -.. raw:: html +For complete information on the system config, see: `Hardware Platforms [PDF] `__ - For complete information on the system config, see: Hardware Platforms [PDF] .. raw:: html diff --git a/docs/articles_en/about-openvino/release-notes-openvino.rst b/docs/articles_en/about-openvino/release-notes-openvino.rst index 68c64e83a61aa0..989be4057b8d3a 100644 --- a/docs/articles_en/about-openvino/release-notes-openvino.rst +++ b/docs/articles_en/about-openvino/release-notes-openvino.rst @@ -64,6 +64,7 @@ What's new * Addition of the Generate API, a simplified API for text generation using large language models with only a few lines of code. The API is available through the newly launched OpenVINO GenAI package. + * Support for Intel Atom® Processor X Series. For more details, see :doc:`System Requirements <./release-notes-openvino/system-requirements>`. * Preview: Support for Intel® Xeon® 6 processor. @@ -77,8 +78,6 @@ Common efficient LLM weight compression. * Common OV headers have been optimized, improving binary compilation time and reducing binary size. -* Support for Intel Atom® Processor X Series has been added. For more details, see - :doc:`System Requirements <./release-notes-openvino/system-requirements>`. AUTO Inference Mode @@ -115,13 +114,14 @@ GPU Device Plugin * Stable Diffusion FP16 performance improved on Core Ultra platforms, with significant pipeline improvement for models with dynamic-shaped input. Memory usage of the pipeline has been reduced, as well. -* Improved performance of optimized permute_f_y kernel. +* Optimized permute_f_y kernel performance has been improved. NPU Device Plugin ----------------------------- -* TBD +* A new set of configuration options is now available. +* Performance increase has been unlocked, with the new `2408 NPU driver `__. OpenVINO Python API diff --git a/docs/articles_en/about-openvino/release-notes-openvino/system-requirements.rst b/docs/articles_en/about-openvino/release-notes-openvino/system-requirements.rst index 4d8381ec09bba3..a02d133453c8b9 100644 --- a/docs/articles_en/about-openvino/release-notes-openvino/system-requirements.rst +++ b/docs/articles_en/about-openvino/release-notes-openvino/system-requirements.rst @@ -19,6 +19,7 @@ CPU .. tab-item:: Supported Hardware + * Intel® Xeon® 6 processor (preview) * Intel Atom® Processor X Series * Intel Atom® processor with Intel® SSE4.2 support * Intel® Pentium® processor N4200/5, N3350/5, N3450/5 with Intel® HD Graphics diff --git a/docs/articles_en/get-started/install-openvino.rst b/docs/articles_en/get-started/install-openvino.rst index 166df8eb104cd7..a6ac01f2549c2d 100644 --- a/docs/articles_en/get-started/install-openvino.rst +++ b/docs/articles_en/get-started/install-openvino.rst @@ -50,7 +50,7 @@ All currently supported versions are: | \* **Of the Linux systems, version 22.04 includes drivers for NPU.** | **For Windows, CPU inference on ARM64 is not supported.** -.. dropdown:: Effortless GenAI integration with OpenVINO GenAI Flavor** +.. dropdown:: Effortless GenAI integration with OpenVINO GenAI Flavor A new OpenVINO GenAI Flavor streamlines application development by providing LLM-specific interfaces for easy integration of language models, handling tokenization and diff --git a/docs/sphinx_setup/_static/download/supported_models.csv b/docs/sphinx_setup/_static/download/supported_models.csv new file mode 100644 index 00000000000000..798c37467b67bc --- /dev/null +++ b/docs/sphinx_setup/_static/download/supported_models.csv @@ -0,0 +1,1210 @@ +Model,Framework,Precision,AI PC CPU,AI PC GPU,AI PC NPU +Denoise,tf,FP16,v,, +Denoise,tf,FP32,v,, +Denoise,tf,FP16,,v,v +Denoise,tf,FP32,,,v +GPT-2,onnx,FP16,v,, +GPT-2,onnx,FP32,v,, +GPT-2,onnx,FP16,,v, +GPT-2,onnx,FP32,,v, +Sharpen-LensBlur,tf,FP16,v,, +Sharpen-LensBlur,tf,FP32,v,, +Sharpen-LensBlur,tf,FP16,,v,v +Sharpen-LensBlur,tf,FP16-INT8,,v, +Sharpen-LensBlur,tf,FP32,,v,v +Sharpen-MotionBlur,tf,FP16,v,, +Sharpen-MotionBlur,tf,FP16-INT8,v,, +Sharpen-MotionBlur,tf,FP32,v,, +Sharpen-MotionBlur,tf,FP16,,v,v +Sharpen-MotionBlur,tf,FP16-INT8,,v,v +Sharpen-MotionBlur,tf,FP32,,v,v +Sharpen-Sharpen,tf,FP16,v,, +Sharpen-Sharpen,tf,FP16-INT8,v,, +Sharpen-Sharpen,tf,FP32,v,, +Sharpen-Sharpen,tf,FP16,,v,v +Sharpen-Sharpen,tf,FP16-INT8,,v, +Sharpen-Sharpen,tf,FP32,,v,v +Sphereface,caffe,FP16,v,, +Sphereface,caffe,FP32,v,, +Sphereface,caffe,FP16,,v,v +Sphereface,caffe,FP32,,v,v +aclnet,onnx,FP16,v,, +aclnet,onnx,FP16-INT8,v,, +aclnet,onnx,FP32,v,, +aclnet,onnx,FP16,,v,v +aclnet,onnx,FP16-INT8,,v,v +aclnet,onnx,FP32,,v,v +aclnet-int8,onnx,FP16-INT8,,,v +alexnet-caffe,caffe,FP16,v,, +alexnet-caffe,caffe,FP32,v,, +alexnet-caffe,caffe,FP16,,v, +alexnet-caffe,caffe,FP32,,v, +alexnet-onnx,onnx,FP16,v,, +alexnet-onnx,onnx,FP16-INT8,v,, +alexnet-onnx,onnx,FP32,v,, +alexnet-onnx,onnx,FP16,,v,v +alexnet-onnx,onnx,FP16-INT8,,v, +alexnet-onnx,onnx,FP32,,v,v +began,onnx,FP16,v,, +began,onnx,FP32,v,, +began,onnx,FP16,,v,v +began,onnx,FP32,,v,v +bert-base-cased-onnx,onnx,FP16,v,, +bert-base-cased-onnx,onnx,FP16-INT8,v,, +bert-base-cased-onnx,onnx,FP32,v,, +bert-base-cased-onnx,onnx,FP16,,v,v +bert-base-cased-onnx,onnx,FP16-INT8,,v,v +bert-base-cased-onnx,onnx,FP32,,,v +bert-base-cased-paddle,paddle,FP16,v,, +bert-base-cased-paddle,paddle,FP16-INT8,v,, +bert-base-cased-paddle,paddle,FP32,v,, +bert-base-cased-paddle,paddle,FP16,,v, +bert-base-cased-paddle,paddle,FP16-INT8,,v, +bert-base-cased-squad2,onnx,FP16,v,, +bert-base-cased-squad2,onnx,FP32,v,, +bert-base-cased-squad2,onnx,FP16,,v, +bert-base-chinese-xnli-zh,tf,FP16,,,v +bert-base-chinese-xnli-zh,tf,FP32,,,v +bert-base-ner,onnx,FP16,v,, +bert-base-ner,onnx,FP16-INT8,v,, +bert-base-ner,onnx,FP32,v,, +bert-base-ner,onnx,FP16,,v,v +bert-base-ner,onnx,FP16-INT8,,v,v +bert-base-uncased-mrpc,onnx,FP16,,,v +bert-base-uncased-mrpc,onnx,FP16-INT8,,,v +bert-base-uncased-mrpc,onnx,FP32,,,v +bert-large-uncased-whole-word-masking-squad-0001,onnx,FP16,v,, +bert-large-uncased-whole-word-masking-squad-0001,onnx,FP32,v,, +bert-large-uncased-whole-word-masking-squad-0001,onnx,FP16,,v,v +bert-large-uncased-whole-word-masking-squad-0001,onnx,FP32,,v,v +bert-large-uncased-whole-word-masking-squad-int8-0001,onnx,FP16-INT8,v,, +bert-large-uncased-whole-word-masking-squad-int8-0001,onnx,FP16-INT8,,v,v +bisenet-v2,paddle,FP16,v,, +bisenet-v2,paddle,FP32,v,, +bisenet-v2,paddle,FP16,,v,v +brain-tumor-segmentation-0002,onnx,FP16,v,, +brain-tumor-segmentation-0002,onnx,FP16-INT8,v,, +colorization-siggraph,onnx,FP16,v,, +colorization-siggraph,onnx,FP32,v,, +colorization-siggraph,onnx,FP16,,v,v +colorization-siggraph,onnx,FP32,,,v +colorization-v2,onnx,FP16-INT8,,,v +common-sign-language-0001,onnx,FP16,v,, +common-sign-language-0001,onnx,FP32,v,, +common-sign-language-0001,onnx,FP16,,v,v +common-sign-language-0001,onnx,FP32,,v,v +crnn-tf,tf,FP16,v,, +crnn-tf,tf,FP32,v,, +crnn-tf,tf,FP16,,v, +darknet19,tf,FP16,v,, +darknet19,tf,FP16-INT8,v,, +darknet19,tf,FP32,v,, +darknet19,tf,FP16,,v,v +darknet19,tf,FP16-INT8,,v,v +darknet19,tf,FP32,,v, +deeplab-v3p-resnet50-os8,paddle,FP16,v,, +deeplab-v3p-resnet50-os8,paddle,FP16-INT8,v,, +deeplab-v3p-resnet50-os8,paddle,FP32,v,, +deeplab-v3p-resnet50-os8,paddle,FP16,,v, +deeplab-v3p-resnet50-os8,paddle,FP16-INT8,,v, +deeplab-v3p-resnet50-os8,paddle,FP32,,v, +deeplabv3,tf,FP16,v,, +deeplabv3,tf,FP16-INT8,v,, +deeplabv3,tf,FP32,v,, +deeplabv3,tf,FP16,,v, +deeplabv3,tf,FP16-INT8,,v, +deeplabv3,tf,FP32,,v, +densenet-121-caffe,caffe,FP16,v,, +densenet-121-caffe,caffe,FP16,,v,v +densenet-121-caffe,caffe,FP32,,,v +densenet-121-onnx,onnx,FP16,v,, +densenet-121-onnx,onnx,FP16-INT8,v,, +densenet-121-onnx,onnx,FP32,v,, +densenet-121-onnx,onnx,FP16,,v,v +densenet-121-onnx,onnx,FP16-INT8,,v, +densenet-121-tf,tf,FP16,v,, +densenet-121-tf,tf,FP32,v,, +densenet-121-tf,tf,FP16,,v,v +densenet-121-tf,tf,FP32,,v, +densenet-121-tf2,tf2,FP16,v,, +densenet-121-tf2,tf2,FP32,v,, +densenet-121-tf2,tf2,FP16,,v,v +densenet-121-tf2,tf2,FP32,,v,v +detr_resnet50,onnx,FP16,v,, +detr_resnet50,onnx,FP32,v,, +detr_resnet50,onnx,FP16,,v, +dien_alibaba,tf,FP16,v,, +dien_alibaba,tf,FP32,v,, +dien_alibaba,tf,FP16,,v, +distilbert-base-cased,onnx,FP16,v,, +distilbert-base-cased,onnx,FP32,v,, +distilbert-base-cased,onnx,FP16,,v,v +distilbert-base-cased,onnx,FP32,,v,v +distilbert-base-uncased,onnx,FP16,,,v +distilbert-base-uncased,onnx,FP16-INT8,,,v +distilbert-base-uncased-sst-2,onnx,FP16,v,, +distilbert-base-uncased-sst-2,onnx,FP16-INT8,v,, +distilbert-base-uncased-sst-2,onnx,FP32,v,, +distilbert-base-uncased-sst-2,onnx,FP16,,v,v +distilbert-base-uncased-sst-2,onnx,FP16-INT8,,v, +distilbert-base-uncased-sst-2,onnx,FP32,,,v +dna_r9.4.1@v3,onnx,FP16,v,, +dna_r9.4.1@v3,onnx,FP32,v,, +dpn-68,onnx,FP16,v,, +dpn-68,onnx,FP16-INT8,v,, +dpn-68,onnx,FP32,v,, +dpn-68,onnx,FP16,,v,v +dpn-68,onnx,FP32,,v,v +east_resnet_v1_50,tf,FP16,v,, +east_resnet_v1_50,tf,FP16-INT8,v,, +east_resnet_v1_50,tf,FP32,v,, +east_resnet_v1_50,tf,FP16,,v,v +east_resnet_v1_50,tf,FP16-INT8,,v, +east_resnet_v1_50,tf,FP32,,v, +ebgan,onnx,FP16,v,, +ebgan,onnx,FP32,v,, +ebgan,onnx,FP16,,v,v +ebgan,onnx,FP32,,,v +edsr3-nas,onnx,FP16,v,, +edsr3-nas,onnx,FP32,v,, +edsr3-nas,onnx,FP16,,v,v +edsr3-nas,onnx,FP32,,v,v +edsr3_super_resolution,tf,FP16,v,, +edsr3_super_resolution,tf,FP32,v,, +edsr3_super_resolution,tf,FP16,,v,v +edsr3_super_resolution,tf,FP32,,v,v +efficientdet-d0-tf,tf,FP16,v,, +efficientdet-d0-tf,tf,FP16-INT8,v,, +efficientdet-d0-tf,tf,FP16,,v,v +efficientdet-d0-tf,tf,FP16-INT8,,v,v +efficientnet-b0-onnx,onnx,FP16,v,, +efficientnet-b0-onnx,onnx,FP16-INT8,v,, +efficientnet-b0-onnx,onnx,FP32,v,, +efficientnet-b0-onnx,onnx,FP16,,v,v +efficientnet-b0-onnx,onnx,FP16-INT8,,v,v +efficientnet-b0-onnx,onnx,FP32,,v,v +efficientnet-b0-tf,tf,FP16,v,, +efficientnet-b0-tf,tf,FP16-INT8,v,, +efficientnet-b0-tf,tf,FP32,v,, +efficientnet-b0-tf,tf,FP16,,v,v +efficientnet-b0-tf,tf,FP16-INT8,,v,v +efficientnet-b0-tf,tf,FP32,,v, +efficientnet-v2-m,onnx,FP16,v,, +efficientnet-v2-m,onnx,FP16-INT8,v,, +efficientnet-v2-m,onnx,FP32,v,, +efficientnet-v2-m,onnx,FP16,,v,v +efficientnet-v2-m,onnx,FP16-INT8,,v,v +efficientnet-v2-m,onnx,FP32,,v,v +emotions-recognition-retail-0003,caffe,FP16,,,v +emotions-recognition-retail-0003,caffe,FP16-INT8,,,v +esrgan,onnx,FP16,v,, +esrgan,onnx,FP32,v,, +esrgan,onnx,FP16,,,v +f3net,onnx,FP16,,,v +f3net,onnx,FP16-INT8,,,v +f3net,onnx,FP32,,,v +face-detection-0200,onnx,FP16,,,v +face-detection-0202,onnx,FP16,,,v +face-detection-0202,onnx,FP32,,,v +face-detection-0204,onnx,FP16,,,v +face-detection-adas-0001,caffe,FP16,,,v +face-detection-adas-0001,caffe,FP32,,,v +face-detection-retail-0004,caffe,FP16,,,v +face-detection-retail-0004,caffe,FP32,,,v +face-detection-retail-0044,caffe,FP16,,,v +face-detection-retail-0044,caffe,FP32,,,v +face-recognition-mobilefacenet-arcface,mxnet,FP16,,,v +face-recognition-mobilefacenet-arcface,mxnet,FP16-INT8,,,v +face-recognition-resnet50-arcface,mxnet,FP16,v,, +face-recognition-resnet50-arcface,mxnet,FP16,,v,v +face-recognition-resnet50-aws,mxnet,FP16,,,v +face-recognition-resnet50-aws,mxnet,FP32,,,v +face-reidentification-retail-0095,onnx,FP16,,,v +face-reidentification-retail-0095,onnx,FP16-INT8,,,v +faceboxes-caffe,caffe,FP16,v,, +faceboxes-caffe,caffe,FP32,v,, +faceboxes-caffe,caffe,FP16,,v,v +faceboxes-caffe,caffe,FP32,,v, +faceboxes-onnx,onnx,FP16,v,, +faceboxes-onnx,onnx,FP16-INT8,v,, +faceboxes-onnx,onnx,FP32,v,, +faceboxes-onnx,onnx,FP16,,v,v +faceboxes-onnx,onnx,FP16-INT8,,v,v +faceboxes-onnx,onnx,FP32,,v,v +facenet,onnx,FP16,,,v +facenet,onnx,FP16-INT8,,,v +facenet-20180408-102900,tf,FP16,v,, +facenet-20180408-102900,tf,FP32,v,, +facenet-20180408-102900,tf,FP16,,v,v +facenet-20180408-102900,tf,FP32,,v, +facial-landmarks-35-adas-0002,caffe,FP16,,,v +facial-landmarks-35-adas-0002,caffe,FP16-INT8,,,v +facial-landmarks-98-detection-0001,onnx,FP16,v,, +facial-landmarks-98-detection-0001,onnx,FP32,v,, +facial-landmarks-98-detection-0001,onnx,FP16,,v,v +facial-landmarks-98-detection-0001,onnx,FP32,,v,v +faster-rcnn-resnet101-coco-sparse-60-0001,tf,FP16,v,, +faster-rcnn-resnet101-coco-sparse-60-0001,tf,FP32,v,, +faster-rcnn-resnet101-coco-sparse-60-0001,tf,FP16,,v, +faster-rcnn-resnet101-coco-sparse-60-0001,tf,FP32,,v, +faster_rcnn_inception_resnet_v2_atrous_coco,tf,FP16,v,, +faster_rcnn_inception_resnet_v2_atrous_coco,tf,FP32,v,, +faster_rcnn_inception_resnet_v2_atrous_coco,tf,FP16,,v, +faster_rcnn_inception_v2_coco,tf,FP16,v,, +faster_rcnn_inception_v2_coco,tf,FP32,v,, +faster_rcnn_inception_v2_coco,tf,FP16,,v, +faster_rcnn_resnet101_coco,tf,FP16,v,, +faster_rcnn_resnet101_coco,tf,FP16,,v, +faster_rcnn_resnet101_coco,tf,FP32,,v, +faster_rcnn_resnet101_kitti,tf,FP16,v,, +faster_rcnn_resnet101_kitti,tf,FP32,v,, +faster_rcnn_resnet101_kitti,tf,FP16,,v, +faster_rcnn_resnet50_coco,tf,FP16,v,, +faster_rcnn_resnet50_coco,tf,FP16-INT8,v,, +faster_rcnn_resnet50_coco,tf,FP32,v,, +faster_rcnn_resnet50_coco,tf,FP16,,v, +faster_rcnn_resnet50_coco,tf,FP16-INT8,,v, +faster_rcnn_resnet50_fpn_coco,onnx,FP16,v,, +fastscnn,paddle,FP16,v,, +fastscnn,paddle,FP32,v,, +fastscnn,paddle,FP16,,v,v +fastseg-small,onnx,FP16,v,, +fastseg-small,onnx,FP16-INT8,v,, +fastseg-small,onnx,FP32,v,, +fastseg-small,onnx,FP16,,v, +fastseg-small,onnx,FP16-INT8,,v, +fastseg-small,onnx,FP32,,v, +fcrn-dp-nyu-depth-v2-tf,tf,FP16,,,v +fcrn-dp-nyu-depth-v2-tf,tf,FP16-INT8,,,v +fcrn-dp-nyu-depth-v2-tf,tf,FP32,,,v +forward-tacotron-duration-prediction,onnx,FP16,v,, +forward-tacotron-duration-prediction,onnx,FP32,v,, +forward-tacotron-duration-prediction,onnx,FP16,,,v +forward-tacotron-duration-prediction,onnx,FP32,,,v +fsrcnn-x4,tf,FP16,v,, +fsrcnn-x4,tf,FP32,v,, +fsrcnn-x4,tf,FP16,,v,v +gaze-estimation-adas-0002,onnx,FP16,,,v +googlenet-v4-caffe,caffe,FP16,v,, +googlenet-v4-caffe,caffe,FP32,v,, +googlenet-v4-caffe,caffe,FP16,,v,v +googlenet-v4-tf,tf,FP16,v,, +googlenet-v4-tf,tf,FP16-INT8,v,, +googlenet-v4-tf,tf,FP32,v,, +googlenet-v4-tf,tf,FP16,,v, +googlenet-v4-tf,tf,FP16-INT8,,v, +handwritten-japanese-recognition-0001,onnx,FP16-INT8,,,v +hg-s8-b1-mpii,onnx,FP16,v,, +hg-s8-b1-mpii,onnx,FP16-INT8,v,, +hg-s8-b1-mpii,onnx,FP16,,v,v +hg-s8-b1-mpii,onnx,FP16-INT8,,v, +higher-hrnet-w32-512,onnx,FP16,v,, +higher-hrnet-w32-512,onnx,FP32,v,, +higher-hrnet-w32-512,onnx,FP16,,v, +horizontal-text-detection-0001,onnx,FP16,v,, +horizontal-text-detection-0001,onnx,FP16-INT8,v,, +horizontal-text-detection-0001,onnx,FP32,v,, +horizontal-text-detection-0001,onnx,FP16,,v, +horizontal-text-detection-0001,onnx,FP16-INT8,,v, +horizontal-text-detection-0001,onnx,FP32,,v, +human-pose-estimation-3d-0001,onnx,FP16,v,, +human-pose-estimation-3d-0001,onnx,FP32,v,, +human-pose-estimation-3d-0001,onnx,FP16,,v,v +human-pose-estimation-3d-0001,onnx,FP32,,v,v +hybrid-cs-model-mri,tf2,FP16,,,v +hybrid-cs-model-mri,tf2,FP32,,,v +i3d-flow,tf,FP16,v,, +i3d-flow,tf,FP16-INT8,v,, +i3d-flow,tf,FP32,v,, +i3d-flow,tf,FP16,,v, +i3d-flow,tf,FP32,,v, +instance-segmentation-security-0002,onnx,FP16,v,, +instance-segmentation-security-0002,onnx,FP32,v,, +instance-segmentation-security-0010,onnx,FP16,v,, +instance-segmentation-security-0010,onnx,FP32,v,, +mask_rcnn_inception_resnet_v2_atrous_coco,tf,FP16,v,, +mask_rcnn_inception_resnet_v2_atrous_coco,tf,FP32,v,, +mask_rcnn_inception_resnet_v2_atrous_coco,tf,FP16,,v, +mask_rcnn_inception_resnet_v2_atrous_coco,tf,FP32,,v, +mask_rcnn_inception_v2_coco,tf,FP16,v,, +mask_rcnn_inception_v2_coco,tf,FP16-INT8,v,, +mask_rcnn_inception_v2_coco,tf,FP32,v,, +mask_rcnn_inception_v2_coco,tf,FP16,,v, +mask_rcnn_inception_v2_coco,tf,FP16-INT8,,v, +mask_rcnn_inception_v2_coco,tf,FP32,,v, +mask_rcnn_resnet101_atrous_coco,tf,FP16,v,, +mask_rcnn_resnet101_atrous_coco,tf,FP16-INT8,v,, +mask_rcnn_resnet101_atrous_coco,tf,FP16,,v, +mask_rcnn_resnet101_atrous_coco,tf,FP16-INT8,,v, +mask_rcnn_resnet50_atrous_coco,tf,FP16,v,, +mask_rcnn_resnet50_atrous_coco,tf,FP16-INT8,v,, +mask_rcnn_resnet50_atrous_coco,tf,FP32,v,, +mask_rcnn_resnet50_atrous_coco,tf,FP16,,v, +mask_rcnn_resnet50_atrous_coco,tf,FP16-INT8,,v, +mask_rcnn_resnet50_atrous_coco,tf,FP32,,v, +midasnet,onnx,FP16,,,v +midasnet,onnx,FP16-INT8,,,v +midasnet,onnx,FP32,,,v +mobilebert,onnx,FP16-INT8,v,, +mobilebert,onnx,FP16-INT8,,v, +mobilenet-ssd,caffe,FP16,v,, +mobilenet-ssd,caffe,FP32,v,, +mobilenet-ssd,caffe,FP16,,v,v +mobilenet-v2-caffe,caffe,FP16,v,, +mobilenet-v2-caffe,caffe,FP32,v,, +mobilenet-v2-caffe,caffe,FP16,,v,v +mobilenet-v2-onnx,onnx,FP16,v,, +mobilenet-v2-onnx,onnx,FP16-INT8,v,, +mobilenet-v2-onnx,onnx,FP32,v,, +mobilenet-v2-onnx,onnx,FP16,,v,v +mobilenet-v2-onnx,onnx,FP16-INT8,,v,v +mobilenet-v2-paddle,paddle,FP16,v,, +mobilenet-v2-paddle,paddle,FP16-INT8,v,, +mobilenet-v2-paddle,paddle,FP32,v,, +mobilenet-v2-paddle,paddle,FP16,,v,v +mobilenet-v2-paddle,paddle,FP16-INT8,,v,v +mobilenet-v2-paddle,paddle,FP32,,v,v +mobilenet-v2-1.0-224-tf,tf,FP16,v,, +mobilenet-v2-1.0-224-tf,tf,FP16-INT8,v,, +mobilenet-v2-1.0-224-tf,tf,FP32,v,, +mobilenet-v2-1.0-224-tf,tf,FP16,,v,v +mobilenet-v2-1.0-224-tf,tf,FP16-INT8,,v,v +mobilenet-v2-1.0-224-tf2,tf2,FP16,v,, +mobilenet-v2-1.0-224-tf2,tf2,FP16-INT8,v,, +mobilenet-v2-1.0-224-tf2,tf2,FP32,v,, +mobilenet-v2-1.0-224-tf2,tf2,FP16,,v,v +mobilenet-v2-1.0-224-tf2,tf2,FP16-INT8,,v,v +mobilenet-v3-large-1.0-224-onnx,onnx,FP16,v,, +mobilenet-v3-large-1.0-224-onnx,onnx,FP16-INT8,v,, +mobilenet-v3-large-1.0-224-onnx,onnx,FP32,v,, +mobilenet-v3-large-1.0-224-onnx,onnx,FP16,,v,v +mobilenet-v3-large-1.0-224-onnx,onnx,FP16-INT8,,v,v +mobilenet-v3-large-1.0-224-onnx,onnx,FP32,,,v +mobilenet-v3-large-1.0-224-paddle,paddle,FP16,v,, +mobilenet-v3-large-1.0-224-paddle,paddle,FP16-INT8,v,, +mobilenet-v3-large-1.0-224-paddle,paddle,FP32,v,, +mobilenet-v3-large-1.0-224-paddle,paddle,FP16,,v,v +mobilenet-v3-large-1.0-224-paddle,paddle,FP16-INT8,,v,v +mobilenet-v3-large-1.0-224-paddle,paddle,FP32,,v,v +mobilenet-v3-large-1.0-224-tf,tf,FP16,v,, +mobilenet-v3-large-1.0-224-tf,tf,FP32,v,, +mobilenet-v3-large-1.0-224-tf,tf,FP16,,v,v +mobilenet-v3-large-1.0-224-tf,tf,FP32,,v,v +mobilenet-v3-large-1.0-224-tf2,tf2,FP16,v,, +mobilenet-v3-large-1.0-224-tf2,tf2,FP16-INT8,v,, +mobilenet-v3-large-1.0-224-tf2,tf2,FP32,v,, +mobilenet-v3-large-1.0-224-tf2,tf2,FP16,,v,v +mobilenet-v3-large-1.0-224-tf2,tf2,FP16-INT8,,v,v +mobilenet-v3-large-1.0-224-tf2,tf2,FP32,,,v +mobilenet-yolo-v4-syg,tf,FP16,,,v +mobilenet-yolo-v4-syg,tf,FP16-INT8,,,v +mobilenet-yolo-v4-syg,tf,FP32,,,v +modnet_webcam_portrait_matting,onnx,FP16-INT8,,,v +mozilla-deepspeech-0.8.2,tf,FP16,v,, +mozilla-deepspeech-0.8.2,tf,FP16-INT8,v,, +mozilla-deepspeech-0.8.2,tf,FP32,v,, +mozilla-deepspeech-0.8.2,tf,FP16-INT8,,,v +mozilla-deepspeech-0.8.2,tf,FP32,,,v +ocrnet-hrnet-w18,paddle,FP16,v,, +ocrnet-hrnet-w18,paddle,FP16-INT8,v,, +ocrnet-hrnet-w18,paddle,FP32,v,, +ocrnet-hrnet-w18,paddle,FP16,,v,v +ocrnet-hrnet-w18,paddle,FP16-INT8,,v, +ocrnet-hrnet-w48,paddle,FP16,v,, +ocrnet-hrnet-w48,paddle,FP32,v,, +octave-resnext-101-0.25,mxnet,FP16,v,, +octave-resnext-101-0.25,mxnet,FP32,v,, +octave-resnext-101-0.25,mxnet,FP16,,v,v +open-closed-eye-0001,onnx,FP16,,,v +open-closed-eye-0001,onnx,FP16-INT8,,,v +open-closed-eye-0001,onnx,FP32,,,v +pedestrian-detection-adas-0002,caffe,FP16,,,v +pedestrian-detection-adas-0002,caffe,FP16-INT8,,,v +pedestrian-detection-adas-0002,caffe,FP32,,,v +person-detection-0100,onnx,FP16,,,v +person-detection-0101,onnx,FP16,,,v +person-detection-0201,onnx,FP16,,,v +person-detection-0201,onnx,FP32,,,v +person-vehicle-bike-detection-crossroad-0078,caffe,FP16,v,, +person-vehicle-bike-detection-crossroad-0078,caffe,FP16-INT8,v,, +person-vehicle-bike-detection-crossroad-0078,caffe,FP16,,v,v +person-vehicle-bike-detection-crossroad-0078,caffe,FP16-INT8,,v,v +person-vehicle-bike-detection-crossroad-0078,caffe,FP32,,v, +pp-ocr-det,paddle,FP16,v,, +pp-ocr-det,paddle,FP16-INT8,v,, +pp-ocr-det,paddle,FP32,v,, +pp-ocr-det,paddle,FP16-INT8,,v,v +pp-ocr-rec,paddle,FP16,v,, +pp-ocr-rec,paddle,FP32,v,, +pp-yolo,paddle,FP16,v,, +pp-yolo,paddle,FP32,v,, +prnet,tf,FP16,,,v +prnet,tf,FP16-INT8,,,v +prnet,tf,FP32,,,v +product-detection-0001,onnx,FP16,,,v +product-detection-0001,onnx,FP16-INT8,,,v +product-detection-0001,onnx,FP32,,,v +quartznet-15x5-en,onnx,FP16,v,, +quartznet-15x5-en,onnx,FP16-INT8,v,, +quartznet-15x5-en,onnx,FP32,v,, +resnet-18,onnx,FP16,v,, +resnet-18,onnx,FP16-INT8,v,, +resnet-18,onnx,FP32,v,, +resnet-18,onnx,FP16,,v,v +resnet-18,onnx,FP16-INT8,,v,v +resnet-18,onnx,FP32,,,v +resnet-50-onnx,onnx,FP16,v,, +resnet-50-onnx,onnx,FP16-INT8,v,, +resnet-50-onnx,onnx,FP32,v,, +resnet-50-onnx,onnx,FP16,,v,v +resnet-50-onnx,onnx,FP16-INT8,,v,v +resnet-50-onnx,onnx,FP32,,v,v +resnet-50-paddle,paddle,FP16,v,, +resnet-50-paddle,paddle,FP16-INT8,v,, +resnet-50-paddle,paddle,FP32,v,, +resnet-50-paddle,paddle,FP16,,v,v +resnet-50-paddle,paddle,FP16-INT8,,v,v +resnet-50-paddle,paddle,FP32,,v, +resnet-50-tf,tf,FP16,v,, +resnet-50-tf,tf,FP16-INT8,v,, +resnet-50-tf,tf,FP32,v,, +resnet-50-tf,tf,FP16,,v,v +resnet-50-tf,tf,FP16-INT8,,v,v +resnet-50-tf,tf,FP32,,,v +resnet-50-pytorch,onnx,FP16,v,, +resnet-50-pytorch,onnx,FP16-INT8,v,, +resnet-50-pytorch,onnx,FP32,v,, +resnet-50-pytorch,onnx,FP16,,v,v +resnet-50-pytorch,onnx,FP16-INT8,,v,v +resnet-50-pytorch,onnx,FP32,,v,v +resnext-101-32x8d,onnx,FP16,v,, +resnext-101-32x8d,onnx,FP32,v,, +resnext-101-32x8d,onnx,FP16,,v, +resnext101-32x16d-swsl,onnx,FP16,v,, +resnext101-32x16d-swsl,onnx,FP16-INT8,v,, +resnext101-32x16d-swsl,onnx,FP32,v,, +resnext101-32x16d-swsl,onnx,FP16,,v, +resnext101-32x16d-swsl,onnx,FP16-INT8,,v,v +retinanet,tf2,FP16,v,, +retinanet,tf2,FP32,v,, +retinanet,tf2,FP16,,v,v +retinanet,tf2,FP32,,v,v +retinanet_resnet34,onnx,FP16,,,v +retinanet_resnet34,onnx,FP16-INT8,,,v +retinanet_resnet34,onnx,FP32,,,v +rnnt,onnx,FP16,v,, +rnnt,onnx,FP32,v,, +road-segmentation-adas-0001,caffe,FP16,,,v +roberta-base,onnx,FP16,v,, +roberta-base,onnx,FP16-INT8,v,, +roberta-base,onnx,FP32,v,, +roberta-base,onnx,FP16,,v, +roberta-base,onnx,FP16-INT8,,v, +roberta-base-mrpc,onnx,FP16-INT8,v,, +roberta-base-mrpc,onnx,FP16-INT8,,v,v +roberta-large,onnx,FP16,v,, +roberta-large,onnx,FP32,v,, +roberta-large,onnx,FP16,,v, +roberta-large,onnx,FP32,,v, +sbert-base-mean-tokens,onnx,FP16,,,v +sbert-base-mean-tokens,onnx,FP16-INT8,,,v +sbert-base-mean-tokens,onnx,FP32,,,v +se-resnet-50,caffe,FP16,v,, +se-resnet-50,caffe,FP32,v,, +se-resnet-50,caffe,FP16,,v,v +se-resnet-50,caffe,FP32,,,v +se-resnext-101,caffe,FP16,v,, +se-resnext-101,caffe,FP16,,v,v +se-resnext-101,caffe,FP32,,v, +se-resnext-50-caffe,caffe,FP16,v,, +se-resnext-50-caffe,caffe,FP32,v,, +se-resnext-50-caffe,caffe,FP16,,v,v +se-resnext-50-caffe,caffe,FP32,,v, +se-resnext-50-onnx,onnx,FP16,v,, +se-resnext-50-onnx,onnx,FP16-INT8,v,, +se-resnext-50-onnx,onnx,FP32,v,, +se-resnext-50-onnx,onnx,FP16,,v,v +se-resnext-50-onnx,onnx,FP32,,v,v +se-resnext-50-tf,tf,FP16,v,, +se-resnext-50-tf,tf,FP32,v,, +se-resnext-50-tf,tf,FP16,,v,v +se-resnext-50-tf,tf,FP32,,v, +semantic-segmentation-adas-0001,caffe,FP16,v,, +semantic-segmentation-adas-0001,caffe,FP16-INT8,v,, +semantic-segmentation-adas-0001,caffe,FP32,v,, +semantic-segmentation-adas-0001,caffe,FP16,,v, +shufflenet-v2-x1.0-onnx,onnx,FP16,v,, +shufflenet-v2-x1.0-onnx,onnx,FP16-INT8,v,, +shufflenet-v2-x1.0-onnx,onnx,FP32,v,, +shufflenet-v2-x1.0-onnx,onnx,FP16,,v,v +shufflenet-v2-x1.0-onnx,onnx,FP16-INT8,,v,v +shufflenet-v2-x1.0-tf,tf,FP16,v,, +shufflenet-v2-x1.0-tf,tf,FP16-INT8,v,, +shufflenet-v2-x1.0-tf,tf,FP32,v,, +shufflenet-v2-x1.0-tf,tf,FP16,,v,v +shufflenet-v2-x1.0-tf,tf,FP16-INT8,,v,v +shufflenet-v2-x1.0-tf,tf,FP32,,v, +single-image-super-resolution-1032,onnx,FP16,v,, +single-image-super-resolution-1032,onnx,FP16,,v,v +squeezenet1.1-caffe,caffe,FP16,v,, +squeezenet1.1-caffe,caffe,FP32,v,, +squeezenet1.1-caffe,caffe,FP16,,v,v +squeezenet1.1-caffe,caffe,FP32,,v,v +squeezenet1.1-mxnet,mxnet,FP16,v,, +squeezenet1.1-mxnet,mxnet,FP32,v,, +squeezenet1.1-mxnet,mxnet,FP16,,v,v +squeezenet1.1-mxnet,mxnet,FP32,,v,v +squeezenet1.1-onnx,onnx,FP16,v,, +squeezenet1.1-onnx,onnx,FP32,v,, +squeezenet1.1-onnx,onnx,FP16,,v,v +srgan-onnx,onnx,FP16,v,, +srgan-onnx,onnx,FP16,,,v +srgan-tf,tf,FP16,v,, +srgan-tf,tf,FP16-INT8,v,, +srgan-tf,tf,FP32,v,, +srgan-tf,tf,FP16,,v, +srgan-tf,tf,FP16-INT8,,v,v +ssd-resnet34-1200,onnx,FP16,v,, +ssd-resnet34-1200,onnx,FP16-INT8,v,, +ssd-resnet34-1200,onnx,FP32,v,, +ssd-resnet34-1200,onnx,FP16,,v, +ssd-resnet34-1200,onnx,FP16-INT8,,v, +ssd300-onnx-0001,onnx,FP16,,,v +ssd300-onnx-0001,onnx,FP16-INT8,,,v +ssd_mobilenet_v1_coco,tf,FP16,v,, +ssd_mobilenet_v1_coco,tf,FP16-INT8,v,, +ssd_mobilenet_v1_coco,tf,FP32,v,, +ssd_mobilenet_v1_coco,tf,FP16,,v,v +ssd_mobilenet_v1_coco,tf,FP16-INT8,,v,v +ssd_mobilenet_v1_coco,tf,FP32,,v,v +ssdlite-mobilenet-v3-small-320-coco,paddle,FP16,v,, +ssdlite-mobilenet-v3-small-320-coco,paddle,FP32,v,, +ssdlite_mobilenet_v2,tf,FP16,v,, +ssdlite_mobilenet_v2,tf,FP16-INT8,v,, +ssdlite_mobilenet_v2,tf,FP32,v,, +ssdlite_mobilenet_v2,tf,FP16,,v,v +ssdlite_mobilenet_v2,tf,FP16-INT8,,v, +ssdlite_mobilenet_v2,tf,FP32,,v,v +style_transfer,onnx,FP16,v,, +style_transfer,onnx,FP16-INT8,v,, +style_transfer,onnx,FP32,v,, +style_transfer,onnx,FP16,,v,v +style_transfer,onnx,FP16-INT8,,v,v +style_transfer,onnx,FP32,,v,v +stylegan2,tf,FP16,v,, +stylegan2,tf,FP32,v,, +stylegan2,tf,FP16,,v, +swin-tiny-patch4-window7-224,onnx,FP16,v,, +swin-tiny-patch4-window7-224,onnx,FP16-INT8,v,, +swin-tiny-patch4-window7-224,onnx,FP32,v,, +swin-tiny-patch4-window7-224,onnx,FP16,,v, +swin-tiny-patch4-window7-224,onnx,FP16-INT8,,v,v +swin-tiny-patch4-window7-224,onnx,FP32,,v, +t2t-vit-7,onnx,FP16,v,, +t2t-vit-7,onnx,FP16-INT8,v,, +t2t-vit-7,onnx,FP32,v,, +t2t-vit-7,onnx,FP16,,v, +t2t-vit-7,onnx,FP16-INT8,,v, +t2t-vit-7,onnx,FP32,,v, +tedlium_dnn4_smbr,kaldi,FP16,v,, +tedlium_dnn4_smbr,kaldi,FP16-INT8,v,, +tedlium_dnn4_smbr,kaldi,FP32,v,, +tedlium_dnn4_smbr,kaldi,FP16,,v,v +tedlium_dnn4_smbr,kaldi,FP16-INT8,,v, +text-image-super-resolution-0001,onnx,FP16,v,, +text-image-super-resolution-0001,onnx,FP16-INT8,v,, +text-image-super-resolution-0001,onnx,FP32,v,, +text-image-super-resolution-0001,onnx,FP16,,v,v +text-image-super-resolution-0001,onnx,FP16-INT8,,v,v +text-image-super-resolution-0001,onnx,FP32,,v,v +text-recognition-0012,tf,FP16,v,, +text-recognition-0012,tf,FP32,v,, +text-recognition-0012,tf,FP16,,v,v +text-recognition-0012,tf,FP32,,v, +text-recognition-0013,onnx,FP16,,,v +text-recognition-0013,onnx,FP32,,,v +text-recognition-0014,onnx,FP16,,,v +text-recognition-0014,onnx,FP16-INT8,,,v +text-recognition-0014,onnx,FP32,,,v +text-to-speech-en-multi-0001,null,FP32,v,, +tiny_yolo_v2,onnx,FP16,,,v +tiny_yolo_v2,onnx,FP32,,,v +tinybert_6layer_768dim_cola,onnx,FP16,,,v +tinybert_6layer_768dim_cola,onnx,FP16-INT8,,,v +tinybert_6layer_768dim_cola,onnx,FP32,,,v +tiramisu-fc-densenet-103,tf2,FP16,,,v +tiramisu-fc-densenet-103,tf2,FP16-INT8,,,v +tiramisu-fc-densenet-103,tf2,FP32,,,v +topaz_video_super_resolution,tf,FP16,v,, +topaz_video_super_resolution,tf,FP32,v,, +topaz_video_super_resolution,tf,FP16,,v,v +topaz_video_super_resolution,tf,FP32,,v,v +ultra-lightweight-face-detection-rfb-320,onnx,FP16,,,v +ultra-lightweight-face-detection-slim-320,onnx,FP16,,,v +unet-2d,onnx,FP16,,,v +unet-camvid-onnx-0001,onnx,FP16,v,, +unet-camvid-onnx-0001,onnx,FP16-INT8,v,, +unet-camvid-onnx-0001,onnx,FP32,v,, +unet-camvid-onnx-0001,onnx,FP16,,v,v +unet-camvid-onnx-0001,onnx,FP16-INT8,,v,v +unet3d_mlperf-onnx,onnx,FP16,v,, +unet3d_mlperf-onnx,onnx,FP16-INT8,v,, +unet3d_mlperf-onnx,onnx,FP32,v,, +unet3d_mlperf-onnx,onnx,FP16,,v, +unet3d_mlperf-onnx,onnx,FP16-INT8,,v, +unet3d_mlperf-onnx,onnx,FP32,,v, +unet3d_mlperf-tf,tf,FP16,v,, +unet3d_mlperf-tf,tf,FP16-INT8,v,, +unet3d_mlperf-tf,tf,FP16,,v, +unet3d_mlperf-tf,tf,FP16-INT8,,v, +urlnet,tf2,FP16,v,, +urlnet,tf2,FP32,v,, +urlnet,tf2,FP16,,v,v +urlnet,tf2,FP32,,v,v +vehicle-detection-adas-0002,caffe,FP16,,,v +vitstr-small-patch16-224,onnx,FP16,,,v +vitstr-small-patch16-224,onnx,FP32,,,v +wav2vec2-base,onnx,FP16,v,, +wav2vec2-base,onnx,FP16-INT8,v,, +wav2vec2-base,onnx,FP32,v,, +wavernn-rnn,onnx,FP16,,,v +wavernn-rnn,onnx,FP32,,,v +wavernn-upsampler,onnx,FP16,v,, +wavernn-upsampler,onnx,FP32,v,, +wavernn-upsampler,onnx,FP16,,v,v +wavernn-upsampler,onnx,FP32,,,v +wdsr-small-x4,onnx,FP16,v,, +wdsr-small-x4,onnx,FP16-INT8,v,, +wdsr-small-x4,onnx,FP32,v,, +wdsr-small-x4,onnx,FP16,,v,v +wdsr-small-x4,onnx,FP16-INT8,,,v +wdsr-small-x4,onnx,FP32,,v, +weld-porosity-detection-0001,onnx,FP16,,,v +weld-porosity-detection-0001,onnx,FP32,,,v +xlm-roberta-base,onnx,FP16,v,, +xlm-roberta-base,onnx,FP32,v,, +xlm-roberta-base,onnx,FP16,,v, +yolo-v2-ava-0001,tf,FP16,v,, +yolo-v2-ava-0001,tf,FP16-INT8,v,, +yolo-v2-ava-0001,tf,FP32,v,, +yolo-v2-ava-0001,tf,FP16,,v,v +yolo-v2-ava-0001,tf,FP16-INT8,,v,v +yolo-v2-ava-0001,tf,FP32,,v,v +yolo-v2-ava-sparse-70-0001,tf,FP16,,,v +yolo-v2-ava-sparse-70-0001,tf,FP16-INT8,,,v +yolo-v2-ava-sparse-70-0001,tf,FP32,,,v +yolo-v3-caffe,caffe,FP16,v,, +yolo-v3-caffe,caffe,FP32,v,, +yolo-v3-caffe,caffe,FP16,,v, +yolo-v3-caffe,caffe,FP32,,v, +yolo-v3-tf,tf,FP16,v,, +yolo-v3-tf,tf,FP32,v,, +yolo-v3-tf,tf,FP16,,v,v +yolo-v3-tf,tf,FP32,,v,v +yolo_v3-onnx,onnx,FP16,v,, +yolo_v3-onnx,onnx,FP16,,v, +yolo_v3_tiny,onnx,FP16,v,, +yolo_v3_tiny-onnx,onnx,FP16-INT8,v,, +yolo_v3_tiny-onnx,onnx,FP32,v,, +yolo_v3_tiny-onnx,onnx,FP16,,v, +yolo_v3_tiny-onnx,onnx,FP16-INT8,,v, +yolo_v3_tiny-tf,tf,FP16,v,, +yolo_v3_tiny-tf,tf,FP16-INT8,v,, +yolo_v3_tiny-tf,tf,FP32,v,, +yolo_v3_tiny-tf,tf,FP16,,v,v +yolo_v3_tiny-tf,tf,FP16-INT8,,v,v +yolo_v4-tf,tf,FP16,v,, +yolo_v4-tf,tf,FP16-INT8,v,, +yolo_v4-tf,tf,FP32,v,, +yolo_v4-tf,tf,FP16,,v, +yolo_v4-tf,tf,FP16-INT8,,v,v +yolo_v4-tf2,tf2,FP16,v,, +yolo_v4-tf2,tf2,FP16-INT8,v,, +yolo_v4-tf2,tf2,FP16,,v, +yolo_v4-tf2,tf2,FP16-INT8,,v,v +yolo_v5l,onnx,FP16,v,, +yolo_v5l,onnx,FP16-INT8,v,, +yolo_v5l,onnx,FP32,v,, +yolo_v5l,onnx,FP16,,v, +yolo_v5l,onnx,FP16-INT8,,v,v +yolo_v5m,onnx,FP16,v,, +yolo_v5m,onnx,FP16-INT8,v,, +yolo_v5m,onnx,FP32,v,, +yolo_v5m,onnx,FP16,,v,v +yolo_v5m,onnx,FP16-INT8,,v,v +yolo_v5m,onnx,FP32,,,v +yolo_v5m-v6,onnx,FP16,v,, +yolo_v5m-v6,onnx,FP16-INT8,v,, +yolo_v5m-v6,onnx,FP32,v,, +yolo_v5m-v6,onnx,FP16,,v,v +yolo_v5m-v6,onnx,FP16-INT8,,v,v +yolo_v5m-v6,onnx,FP32,,v,v +yolo_v5s,onnx,FP16,v,, +yolo_v5s,onnx,FP16-INT8,v,, +yolo_v5s,onnx,FP32,v,, +yolo_v5s,onnx,FP16,,v,v +yolo_v5s,onnx,FP16-INT8,,v,v +yolo_v5s,onnx,FP32,,v,v +yolo_v5s-v6,onnx,FP16,v,, +yolo_v5s-v6,onnx,FP16-INT8,v,, +yolo_v5s-v6,onnx,FP32,v,, +yolo_v5s-v6,onnx,FP16,,v,v +yolo_v5s-v6,onnx,FP16-INT8,,v,v +yolo_v5s-v6,onnx,FP32,,,v +yolo_v5x,onnx,FP16,v,, +yolo_v5x,onnx,FP32,v,, +yolo_v5x,onnx,FP16,,v,v +yolo_v8n,onnx,FP16,v,, +yolo_v8n,onnx,FP16-INT8,v,, +yolo_v8n,onnx,FP32,v,, +yolo_v8n,onnx,FP16,,v,v +yolo_v8n,onnx,FP16-INT8,,v,v +yolof,onnx,FP16,v,, +yolof,onnx,FP16-INT8,v,, +yolof,onnx,FP32,v,, +yolof,onnx,FP16,,v, +yolof,onnx,FP16-INT8,,v, +yolor_p6,onnx,FP16,v,, +yolor_p6,onnx,FP32,v,, +yolor_p6,onnx,FP16,,v,v +yolor_p6,onnx,FP16-INT8,,,v +arcfaceresnet100-8_resnet100,onnx,FP32,v,v,v +bertsquad-12,onnx,FP32,v,v,v +bvlcalexnet-12,onnx,FP32,v,v,v +caffenet-12,onnx,FP32,v,v,v +candy-8_candy,onnx,FP32,v,v,v +efficientnet-lite4-11_efficientnet-lite4,onnx,FP32,v,v,v +emotion-ferplus-8_model,onnx,FP32,v,v,v +fcn-resnet101-11,onnx,FP32,v,v,v +fcn-resnet50-11,onnx,FP32,v,v,v +googlenet-12,onnx,FP32,v,v,v +gpt2-lm-head-10_GPT-2-LM-HEAD,onnx,FP32,v,v,v +inception-v1-12,onnx,FP32,v,v,v +inception-v2-7_model,onnx,FP32,v,v,v +MaskRCNN-12,onnx,FP32,v,v,v +mnist-12,onnx,FP32,v,v,v +mosaic-8_mosaic,onnx,FP32,v,v,v +pointilism-8_pointilism,onnx,FP32,v,v,v +rain-princess-8_rain_princess,onnx,FP32,v,v,v +rcnn-ilsvrc13-7_model,onnx,FP32,v,v,v +ResNet101-DUC-12,onnx,FP32,v,v,v +resnet101-v1-7,onnx,FP32,v,v,v +resnet101-v2-7,onnx,FP32,v,v,v +resnet152-v1-7,onnx,FP32,v,v,v +resnet152-v2-7,onnx,FP32,v,v,v +resnet18-v1-7,onnx,FP32,v,v,v +resnet18-v2-7,onnx,FP32,v,v,v +resnet34-v1-7,onnx,FP32,v,v,v +resnet34-v2-7,onnx,FP32,v,v,v +resnet50-caffe2-v1-7_model,onnx,FP32,v,v,v +resnet50-v2-7,onnx,FP32,v,v,v +retinanet-9_test_retinanet_resnet101,onnx,FP32,v,v,v +shufflenet-7_model,onnx,FP32,v,v,v +squeezenet1.0-12,onnx,FP32,v,v,v +ssd-10,onnx,FP32,v,v,v +super-resolution-10_super_resolution,onnx,FP32,v,v,v +t5-decoder-with-lm-head-12_t5-decoder-with-lm-head,onnx,FP32,v,v,v +t5-encoder-12_t5-encoder,onnx,FP32,v,v,v +udnie-8_udnie,onnx,FP32,v,v,v +version-RFB-320,onnx,FP32,v,v,v +version-RFB-640,onnx,FP32,v,v,v +vgg16-12,onnx,FP32,v,v,v +vgg19-7_vgg19,onnx,FP32,v,v,v +vgg19-caffe2-7_model,onnx,FP32,v,v,v +yolov2-coco-9,onnx,FP32,v,v,v +yolov4,onnx,FP32,v,v,v +zfnet512-12,onnx,FP32,v,v,v +arcfaceresnet100-8_resnet100,onnx,FP16,,,v +bertsquad-12,onnx,FP16,,,v +bvlcalexnet-12,onnx,FP16,,,v +caffenet-12,onnx,FP16,,,v +candy-8_candy,onnx,FP16,,,v +efficientnet-lite4-11_efficientnet-lite4,onnx,FP16,,,v +emotion-ferplus-8_model,onnx,FP16,,,v +fcn-resnet101-11,onnx,FP16,,,v +fcn-resnet50-11,onnx,FP16,,,v +googlenet-12,onnx,FP16,,,v +gpt2-lm-head-10_GPT-2-LM-HEAD,onnx,FP16,,,v +inception-v1-12,onnx,FP16,,,v +inception-v2-7_model,onnx,FP16,,,v +MaskRCNN-12,onnx,FP16,,,v +mnist-12,onnx,FP16,,,v +mosaic-8_mosaic,onnx,FP16,,,v +pointilism-8_pointilism,onnx,FP16,,,v +rain-princess-8_rain_princess,onnx,FP16,,,v +rcnn-ilsvrc13-7_model,onnx,FP16,,,v +ResNet101-DUC-12,onnx,FP16,,,v +resnet101-v1-7,onnx,FP16,,,v +resnet101-v2-7,onnx,FP16,,,v +resnet152-v1-7,onnx,FP16,,,v +resnet152-v2-7,onnx,FP16,,,v +resnet18-v1-7,onnx,FP16,,,v +resnet18-v2-7,onnx,FP16,,,v +resnet34-v1-7,onnx,FP16,,,v +resnet34-v2-7,onnx,FP16,,,v +resnet50-caffe2-v1-7_model,onnx,FP16,,,v +resnet50-v2-7,onnx,FP16,,,v +retinanet-9_test_retinanet_resnet101,onnx,FP16,,,v +shufflenet-7_model,onnx,FP16,,,v +squeezenet1.0-12,onnx,FP16,,,v +ssd_mobilenet_v1_10_ssd_mobilenet_v1,onnx,FP16,,,v +ssd-10,onnx,FP16,,,v +super-resolution-10_super_resolution,onnx,FP16,,,v +t5-decoder-with-lm-head-12_t5-decoder-with-lm-head,onnx,FP16,,,v +t5-encoder-12_t5-encoder,onnx,FP16,,,v +udnie-8_udnie,onnx,FP16,,,v +version-RFB-320,onnx,FP16,,,v +version-RFB-640,onnx,FP16,,,v +vgg16-12,onnx,FP16,,,v +vgg19-7_vgg19,onnx,FP16,,,v +vgg19-caffe2-7_model,onnx,FP16,,,v +yolov2-coco-9,onnx,FP16,,,v +yolov4,onnx,FP16,,,v +zfnet512-12,onnx,FP16,,,v +adv_inception_v3,pytorch,FP32,v,, +beit_base_patch16_224,pytorch,FP32,v,, +botnet26t_256,pytorch,FP32,v,, +cait_m36_384,pytorch,FP32,v,, +coat_lite_mini,pytorch,FP32,v,, +convit_base,pytorch,FP32,v,, +convmixer_768_32,pytorch,FP32,v,, +convnext_base,pytorch,FP32,v,, +crossvit_9_240,pytorch,FP32,v,, +cspdarknet53,pytorch,FP32,v,, +deit_base_distilled_patch16_224,pytorch,FP32,v,, +dla102,pytorch,FP32,v,, +dm_nfnet_f0,pytorch,FP32,v,, +dpn107,pytorch,FP32,v,, +eca_botnext26ts_256,pytorch,FP32,v,, +eca_halonext26ts,pytorch,FP32,v,, +ese_vovnet19b_dw,pytorch,FP32,v,, +fbnetc_100,pytorch,FP32,v,, +fbnetv3_b,pytorch,FP32,v,, +gernet_l,pytorch,FP32,v,, +ghostnet_100,pytorch,FP32,v,, +gluon_inception_v3,pytorch,FP32,v,, +gmixer_24_224,pytorch,FP32,v,, +gmlp_s16_224,pytorch,FP32,v,, +hrnet_w18,pytorch,FP32,v,, +inception_v3,pytorch,FP32,v,, +jx_nest_base,pytorch,FP32,v,, +lcnet_050,pytorch,FP32,v,, +levit_128,pytorch,FP32,v,, +mixer_b16_224,pytorch,FP32,v,, +mixnet_l,pytorch,FP32,v,, +mnasnet_100,pytorch,FP32,v,, +mobilenetv2_100,pytorch,FP32,v,, +mobilenetv3_large_100,pytorch,FP32,v,, +mobilevit_s,pytorch,FP32,v,, +nfnet_l0,pytorch,FP32,v,, +pit_b_224,pytorch,FP32,v,, +pnasnet5large,pytorch,FP32,v,, +poolformer_m36,pytorch,FP32,v,, +regnety_002,pytorch,FP32,v,, +repvgg_a2,pytorch,FP32,v,, +res2net101_26w_4s,pytorch,FP32,v,, +res2net50_14w_8s,pytorch,FP32,v,, +res2next50,pytorch,FP32,v,, +resmlp_12_224,pytorch,FP32,v,, +resnest101e,pytorch,FP32,v,, +rexnet_100,pytorch,FP32,v,, +sebotnet33ts_256,pytorch,FP32,v,, +selecsls42b,pytorch,FP32,v,, +spnasnet_100,pytorch,FP32,v,, +swin_base_patch4_window7_224,pytorch,FP32,v,, +swsl_resnext101_32x16d,pytorch,FP32,v,, +tf_efficientnet_b0,pytorch,FP32,v,, +tf_mixnet_l,pytorch,FP32,v,, +tinynet_a,pytorch,FP32,v,, +tnt_s_patch16_224,pytorch,FP32,v,, +twins_pcpvt_base,pytorch,FP32,v,, +visformer_small,pytorch,FP32,v,, +vit_base_patch16_224,pytorch,FP32,v,, +volo_d1_224,pytorch,FP32,v,, +xcit_large_24_p8_224,pytorch,FP32,v,, +albert-base-v2,pytorch,intel-optimum default,,v, +albert-base-v2-sst2,pytorch,intel-optimum default,,v, +albert-large-v2,pytorch,intel-optimum default,,v, +albert-large-v2-finetuned-mnli,pytorch,intel-optimum default,,v, +Aquila2-7B,pytorch,intel-optimum default,,v, +Aquila-7B,pytorch,intel-optimum default,,v, +AquilaChat2-7B,pytorch,intel-optimum default,,v, +AquilaChat-7B,pytorch,intel-optimum default,,v, +ast-finetuned-speech-commands-v2,pytorch,intel-optimum default,,v, +Baichuan2-13B-Chat,pytorch,intel-optimum default,,v, +Baichuan2-7B-Base,pytorch,intel-optimum default,,v, +Baichuan2-7B-Chat,pytorch,intel-optimum default,,v, +bart-base-japanese,pytorch,intel-optimum default,,v, +beit-base-patch16-224-pt22k-ft22k,pytorch,intel-optimum default,,v, +bert-base-cased-conversational,pytorch,intel-optimum default,,v, +bert-base-NER,pytorch,intel-optimum default,,v, +bert-base-uncased,pytorch,intel-optimum default,,v, +bert-base-uncased-yelp-polarity,pytorch,intel-optimum default,,v, +BERT-Large-CT-STSb,pytorch,intel-optimum default,,v, +bert-large-NER,pytorch,intel-optimum default,,v, +bert-large-uncased,pytorch,intel-optimum default,,v, +bert-large-uncased-whole-word-masking-finetuned-sst-2,pytorch,intel-optimum default,,v, +bert-small-finetuned-squadv2,pytorch,intel-optimum default,,v, +bge-base-en-v1.5,pytorch,intel-optimum default,,v, +bge-large-en-v1.5,pytorch,intel-optimum default,,v, +bge-reranker-base,pytorch,intel-optimum default,,v, +bge-reranker-large,pytorch,intel-optimum default,,v, +BioMedLM,pytorch,intel-optimum default,,v, +blenderbot-400M-distill,pytorch,intel-optimum default,,v, +bloom-560m,pytorch,intel-optimum default,,v, +bloomz-1b1,pytorch,intel-optimum default,,v, +bloomz-3b,pytorch,intel-optimum default,,v, +bloomz-7b1-mt,pytorch,intel-optimum default,,v, +codegemma-1.1-2b,pytorch,intel-optimum default,,v, +codegemma-1.1-7b-it,pytorch,intel-optimum default,,v, +codegemma-2b,pytorch,intel-optimum default,,v, +codegemma-7b,pytorch,intel-optimum default,,v, +codegen2-1B_P,pytorch,intel-optimum default,,v, +codegen2-3_7B_P,pytorch,intel-optimum default,,v, +codegen2-7B_P,pytorch,intel-optimum default,,v, +codegen-2B-multi,pytorch,intel-optimum default,,v, +codegen-350M-mono,pytorch,intel-optimum default,,v, +codegen-6B-multi,pytorch,intel-optimum default,,v, +CodeQwen1.5-7B-Chat,pytorch,intel-optimum default,,v, +convbert-base-turkish-mc4-toxicity-uncased,pytorch,intel-optimum default,,v, +convnext-base-224,pytorch,intel-optimum default,,v, +deberta-v3-large,pytorch,intel-optimum default,,v, +distilbert-base-nli-mean-tokens,pytorch,intel-optimum default,,v, +distilbert-base-uncased-distilled-squad,pytorch,intel-optimum default,,v, +distilbert-NER,pytorch,intel-optimum default,,v, +distil-large-v3,pytorch,intel-optimum default,,v, +distil-medium.en,pytorch,intel-optimum default,,v, +electra-base-french-europeana-cased-generator,pytorch,intel-optimum default,,v, +electra-large-discriminator-nli-efl-tweeteval,pytorch,intel-optimum default,,v, +falcon-11B,pytorch,intel-optimum default,,v, +falcon-7b,pytorch,intel-optimum default,,v, +falcon-7b-instruct,pytorch,intel-optimum default,,v, +flaubert_base_cased,pytorch,intel-optimum default,,v, +flaubert-base-uncased-finetuned-cooking,pytorch,intel-optimum default,,v, +gemma-1.1-2b-it,pytorch,intel-optimum default,,v, +gemma-1.1-7b-it,pytorch,intel-optimum default,,v, +gemma-2b,pytorch,intel-optimum default,,v, +gemma-2b-it,pytorch,intel-optimum default,,v, +gemma-7b,pytorch,intel-optimum default,,v, +gemma-7b-it,pytorch,intel-optimum default,,v, +GPT2Neo1.3BPoints,pytorch,intel-optimum default,,v, +granite-3b-code-base,pytorch,intel-optimum default,,v, +granite-3b-code-instruct,pytorch,intel-optimum default,,v, +granite-8b-code-base,pytorch,intel-optimum default,,v, +granite-8b-code-instruct,pytorch,intel-optimum default,,v, +hubert-large-ls960-ft,pytorch,intel-optimum default,,v, +ibert-roberta-base,pytorch,intel-optimum default,,v, +ibert-roberta-base-finetuned-mrpc,pytorch,intel-optimum default,,v, +internlm2-1_8b,pytorch,intel-optimum default,,v, +internlm2-7b,pytorch,intel-optimum default,,v, +internlm2-chat-1_8b,pytorch,intel-optimum default,,v, +internlm2-chat-7b,pytorch,intel-optimum default,,v, +internlm2-chat-7b-sft,pytorch,intel-optimum default,,v, +internlm2-math-7b,pytorch,intel-optimum default,,v, +internlm2-math-base-7b,pytorch,intel-optimum default,,v, +klue-roberta-base-ner,pytorch,intel-optimum default,,v, +LCM_Dreamshaper_v7,pytorch,intel-optimum default,,v, +levit-256,pytorch,intel-optimum default,,v, +Llama-2-13b-chat-hf,pytorch,intel-optimum default,,v, +Llama-2-13b-hf,pytorch,intel-optimum default,,v, +Llama-2-7b-chat-hf,pytorch,intel-optimum default,,v, +Llama-2-7b-hf,pytorch,intel-optimum default,,v, +m2m100_418M,pytorch,intel-optimum default,,v, +Magicoder-CL-7B,pytorch,intel-optimum default,,v, +Magicoder-DS-6.7B,pytorch,intel-optimum default,,v, +Magicoder-S-CL-7B,pytorch,intel-optimum default,,v, +Magicoder-S-DS-6.7B,pytorch,intel-optimum default,,v, +MarianCausalLM,pytorch,intel-optimum default,,v, +marian-finetuned-kde4-en-to-cn-accelerate,pytorch,intel-optimum default,,v, +mbart-large-50-many-to-one-mmt,pytorch,intel-optimum default,,v, +Meta-Llama-3-8B,pytorch,intel-optimum default,,v, +Meta-Llama-3-8B-Instruct,pytorch,intel-optimum default,,v, +Meta-Llama-Guard-2-8B,pytorch,intel-optimum default,,v, +MindChat-Qwen2-4B,pytorch,intel-optimum default,,v, +MiniCPM-2B-sft-bf16,pytorch,intel-optimum default,,v, +Mistral-7B-Instruct-v0.2,pytorch,intel-optimum default,,v, +Mistral-7B-Instruct-v0.3,pytorch,intel-optimum default,,v, +Mistral-7B-v0.3,pytorch,intel-optimum default,,v, +mobilevit-xx-small,pytorch,intel-optimum default,,v, +mpt-7b,pytorch,intel-optimum default,,v, +mpt-7b-8k,pytorch,intel-optimum default,,v, +mpt-7b-8k-chat,pytorch,intel-optimum default,,v, +mpt-7b-chat,pytorch,intel-optimum default,,v, +mpt-7b-instruct,pytorch,intel-optimum default,,v, +mpt-7b-storywriter,pytorch,intel-optimum default,,v, +ms-marco-electra-base,pytorch,intel-optimum default,,v, +mt5-base,pytorch,intel-optimum default,,v, +mt5-large,pytorch,intel-optimum default,,v, +mt5-small,pytorch,intel-optimum default,,v, +neural-chat-7b-v1-1,pytorch,intel-optimum default,,v, +neural-chat-7b-v3-3,pytorch,intel-optimum default,,v, +openchat-3.6-8b-20240522,pytorch,intel-optimum default,,v, +opt-1.3b,pytorch,intel-optimum default,,v, +opt-125m,pytorch,intel-optimum default,,v, +opt-13b,pytorch,intel-optimum default,,v, +opt-2.7b,pytorch,intel-optimum default,,v, +opt-350m,pytorch,intel-optimum default,,v, +opt-6.7b,pytorch,intel-optimum default,,v, +opt-iml-1.3b,pytorch,intel-optimum default,,v, +Pegasus-7b-slerp,pytorch,intel-optimum default,,v, +pegasus-samsum,pytorch,intel-optimum default,,v, +persimmon-8b-chat,pytorch,intel-optimum default,,v, +phi-2,pytorch,intel-optimum default,,v, +Phi-3-medium-4k-instruct,pytorch,intel-optimum default,,v, +Phi-3-mini-128k-instruct,pytorch,intel-optimum default,,v, +pix2struct-base,pytorch,intel-optimum default,,v, +Polish_RoBERTa_large_OPI,pytorch,intel-optimum default,,v, +pythia-1.4b,pytorch,intel-optimum default,,v, +pythia-12b,pytorch,intel-optimum default,,v, +pythia-14m,pytorch,intel-optimum default,,v, +pythia-160m,pytorch,intel-optimum default,,v, +pythia-1b,pytorch,intel-optimum default,,v, +pythia-2.8b,pytorch,intel-optimum default,,v, +pythia-410m,pytorch,intel-optimum default,,v, +pythia-6.9b,pytorch,intel-optimum default,,v, +pythia-70m,pytorch,intel-optimum default,,v, +Pythia-Chat-Base-7B,pytorch,intel-optimum default,,v, +Qwen1.5-0.5B,pytorch,intel-optimum default,,v, +Qwen1.5-0.5B-Chat,pytorch,intel-optimum default,,v, +Qwen1.5-1.8B,pytorch,intel-optimum default,,v, +Qwen1.5-1.8B-Chat,pytorch,intel-optimum default,,v, +Qwen1.5-4B,pytorch,intel-optimum default,,v, +Qwen1.5-4B-Chat,pytorch,intel-optimum default,,v, +Qwen1.5-7B,pytorch,intel-optimum default,,v, +Qwen1.5-7B-Chat,pytorch,intel-optimum default,,v, +Qwen-1_8B,pytorch,intel-optimum default,,v, +Qwen-1_8B-Chat,pytorch,intel-optimum default,,v, +Qwen-7B,pytorch,intel-optimum default,,v, +Qwen-7B-Chat,pytorch,intel-optimum default,,v, +RedPajama-INCITE-7B-Base,pytorch,intel-optimum default,,v, +RedPajama-INCITE-7B-Chat,pytorch,intel-optimum default,,v, +RedPajama-INCITE-7B-Instruct,pytorch,intel-optimum default,,v, +RedPajama-INCITE-Chat-3B-v1,pytorch,intel-optimum default,,v, +roberta-base-squad2,pytorch,intel-optimum default,,v, +roberta-large-mnli,pytorch,intel-optimum default,,v, +roberta-large-ner-english,pytorch,intel-optimum default,,v, +roberta-large-squadv2,pytorch,intel-optimum default,,v, +roformer_small_generator,pytorch,intel-optimum default,,v, +stable-diffusion-2-1,pytorch,intel-optimum default,,v, +stable-diffusion-v1-4,pytorch,intel-optimum default,,v, +stable-diffusion-v1-5,pytorch,intel-optimum default,,v, +stable-diffusion-xl-base-1.0,pytorch,intel-optimum default,,v, +stablelm-2-1_6b,pytorch,intel-optimum default,,v, +stablelm-2-1_6b-chat,pytorch,intel-optimum default,,v, +stablelm-2-12b,pytorch,intel-optimum default,,v, +stablelm-2-12b-chat,pytorch,intel-optimum default,,v, +stablelm-2-zephyr-1_6b,pytorch,intel-optimum default,,v, +stablelm-3b-4e1t,pytorch,intel-optimum default,,v, +stablelm-base-alpha-3b,pytorch,intel-optimum default,,v, +stablelm-tuned-alpha-7b,pytorch,intel-optimum default,,v, +stablelm-zephyr-3b,pytorch,intel-optimum default,,v, +sup-simcse-roberta-base,pytorch,intel-optimum default,,v, +t5-base,pytorch,intel-optimum default,,v, +t5-large,pytorch,intel-optimum default,,v, +t5-small,pytorch,intel-optimum default,,v, +trocr-base-handwritten,pytorch,intel-optimum default,,v, +twitter-roberta-base-sentiment-latest,pytorch,intel-optimum default,,v, +unispeech-1350-en-90-it-ft-1h,pytorch,intel-optimum default,,v, +unispeech-sat-base-plus-sd,pytorch,intel-optimum default,,v, +unispeech-sat-base-sv,pytorch,intel-optimum default,,v, +unispeech-sat-large-sv,pytorch,intel-optimum default,,v, +wav2vec2-base-superb-sd,pytorch,intel-optimum default,,v, +wav2vec2-base-superb-sid,pytorch,intel-optimum default,,v, +wav2vec2-base-superb-sv,pytorch,intel-optimum default,,v, +whisper-base,pytorch,intel-optimum default,,v, +whisper-large-v2,pytorch,intel-optimum default,,v, +whisper-medium,pytorch,intel-optimum default,,v, +whisper-small,pytorch,intel-optimum default,,v, +WizardMath-7B-V1.1,pytorch,intel-optimum default,,v, +xlm-clm-ende-1024,pytorch,intel-optimum default,,v, +xlm-roberta-base-language-detection,pytorch,intel-optimum default,,v, +xlm-roberta-base-uncased-conll2003,pytorch,intel-optimum default,,v, +xlm-roberta-large,pytorch,intel-optimum default,,v, +xlm-roberta-large-en-ru-mnli,pytorch,intel-optimum default,,v, +xlm-roberta-large-finetuned-conll03-english,pytorch,intel-optimum default,,v, +XVERSE-7B-Chat,pytorch,intel-optimum default,,v, +zephyr-7b-beta,pytorch,intel-optimum default,,v, +tiny-random-albert,pytorch,intel-optimum default,v,, +tiny-random-bert,pytorch,intel-optimum default,v,, +tiny-random-ConvBertForSequenceClassification,pytorch,intel-optimum default,v,, +tiny-random-distilbert,pytorch,intel-optimum default,v,, +tiny-random-electra,pytorch,intel-optimum default,v,, +tiny-random-flaubert,pytorch,intel-optimum default,v,, +tiny-random-ibert,pytorch,intel-optimum default,v,, +tiny-random-roberta,pytorch,intel-optimum default,v,, +tiny-random-roformer,pytorch,intel-optimum default,v,, +tiny-random-squeezebert,pytorch,intel-optimum default,v,, +tiny-random-xlm,pytorch,intel-optimum default,v,, +stsb-bert-tiny-safetensors,pytorch,intel-optimum default,v,, +tiny-random-bart,pytorch,INT4,v,, +tiny-random-baichuan2,pytorch,INT4,v,, +tiny-random-baichuan2-13b,pytorch,INT4,v,, +tiny-random-BlenderbotModel,pytorch,INT4,v,, +tiny-random-BloomModel,pytorch,INT4,v,, +tiny-random-chatglm2,pytorch,INT4,v,, +tiny-random-CodeGenForCausalLM,pytorch,INT4,v,, +tiny-random-codegen2,pytorch,INT4,v,, +tiny-random-GemmaForCausalLM,pytorch,INT4,v,, +tiny-random-gpt2,pytorch,INT4,v,, +tiny-random-GPTNeoModel,pytorch,INT4,v,, +tiny-random-GPTNeoXForCausalLM,pytorch,INT4,v,, +tiny-llama-fast-tokenizer,pytorch,INT4,v,, +tiny-marian-en-de,pytorch,INT4,v,, +tiny-random-minicpm,pytorch,INT4,v,, +tiny-random-mistral,pytorch,INT4,v,, +tiny-mixtral,pytorch,INT4,v,, +tiny-random-MptForCausalLM,pytorch,INT4,v,, +tiny-random-olmo-hf,pytorch,INT4,v,, +tiny-random-OPTModel,pytorch,INT4,v,, +tiny-random-pegasus,pytorch,INT4,v,, +tiny-random-qwen,pytorch,INT4,v,, +tiny-random-StableLmForCausalLM,pytorch,INT4,v,, +tiny-random-Starcoder2ForCausalLM,pytorch,INT4,v,, +tiny-random-PhiForCausalLM,pytorch,INT4,v,, +tiny-random-phi3,pytorch,INT4,v,, +tiny-random-internlm2,pytorch,INT4,v,, +tiny-random-orion,pytorch,INT4,v,, +really-tiny-falcon-testing,pytorch,INT4,v,, +tiny-random-falcon-40b,pytorch,INT4,v,, +tiny-random-PersimmonForCausalLM,pytorch,INT4,v,, +tiny-random-CohereForCausalLM,pytorch,INT4,v,, +tiny-random-aquilachat,pytorch,INT4,v,, +tiny-random-aquila2,pytorch,INT4,v,, +tiny-random-xverse,pytorch,INT4,v,, +tiny-random-internlm,pytorch,INT4,v,, +tiny-random-dbrx,pytorch,INT4,v,, +tiny-random-qwen1.5-moe,pytorch,INT4,v,, +tiny-random-deberta,pytorch,intel-optimum default,v,, +tiny-xlm-roberta,pytorch,intel-optimum default,v,, +tiny-random-BeitForImageClassification,pytorch,intel-optimum default,v,, +tiny-random-convnext,pytorch,intel-optimum default,v,, +tiny-random-LevitModel,pytorch,intel-optimum default,v,, +tiny-random-MobileNetV2Model,pytorch,intel-optimum default,v,, +tiny-random-mobilevit,pytorch,intel-optimum default,v,, +tiny-random-resnet,pytorch,intel-optimum default,v,, +tiny-random-vit,pytorch,intel-optimum default,v,, +tiny-random-m2m_100,pytorch,intel-optimum default,v,, +tiny-random-mbart,pytorch,intel-optimum default,v,, +mt5-tiny-random,pytorch,intel-optimum default,v,, +tiny-random-t5,pytorch,intel-optimum default,v,, +tiny-random-unispeech,pytorch,intel-optimum default,v,, +wav2vec2-random-tiny-classifier,pytorch,intel-optimum default,v,, +tiny-random-Data2VecAudioModel,pytorch,intel-optimum default,v,, +tiny-random-HubertModel,pytorch,intel-optimum default,v,, +tiny-random-SEWModel,pytorch,intel-optimum default,v,, +sew-d-tiny-100k-ft-ls100h,pytorch,intel-optimum default,v,, +tiny-random-UnispeechSatModel,pytorch,intel-optimum default,v,, +tiny-random-WavlmModel,pytorch,intel-optimum default,v,, +tiny-random-Wav2Vec2Model,pytorch,intel-optimum default,v,, +tiny-random-wav2vec2-conformer,pytorch,intel-optimum default,v,, +pix2struct-tiny-random,pytorch,intel-optimum default,v,, +whisper-tiny.en,pytorch,intel-optimum default,v,, +tiny-random-VisionEncoderDecoderModel-vit-gpt2,pytorch,intel-optimum default,v,, +trocr-small-handwritten,pytorch,intel-optimum default,v,, +tiny-doc-qa-vision-encoder-decoder,pytorch,intel-optimum default,v,, +vit-with-attentions,pytorch,intel-optimum default,v,, +vit-with-hidden_states,pytorch,intel-optimum default,v,, +tiny-stable-diffusion-torch,pytorch,intel-optimum default,v,, +tiny-random-stable-diffusion-xl,pytorch,intel-optimum default,v,, +tiny-random-stable-diffusion-xl-refiner,pytorch,intel-optimum default,v,, +tiny-random-latent-consistency,pytorch,intel-optimum default,v,, diff --git a/docs/sphinx_setup/_static/models.csv b/docs/sphinx_setup/_static/models.csv deleted file mode 100644 index 4f1278817729ea..00000000000000 --- a/docs/sphinx_setup/_static/models.csv +++ /dev/null @@ -1,14 +0,0 @@ -Topology,Source framework,Precision,4th GEN Xeon Scalable Procesor,3rd GEN Xeon Scalable Processor,Fles Series discrete GP,Arc Series Discrete GPU -aclnet,onnx,BF16,accurate,,, -aclnet,onnx,FP16,accurate,accurate,accurate,accurate -aclnet,onnx,FP32,accurate,accurate,accurate,accurate -aclnet-int8 ,onnx,FP16-INT8,accurate,accurate,accurate,accurate -aclnet-int8,onnx,FP32,completes,,, -action-recognition-0001 ,null,BF16,accurate,,, -action-recognition-0001,null,BF16,accurate,accurate,accurate,accurate -action-recognition-0001,null,FP16-INT8,accurate,accurate,accurate,accurate -action-recognition-0001,null,FP32 ,accurate,accurate,accurate,accurate -age-gender-recognition-retail-0013,null,BF16,accurate,,, -age-gender-recognition-retail-0013,null,BF16,accurate,accurate,accurate,accurate -age-gender-recognition-retail-0013,null,FP16-INT8,accurate,accurate,completes,completes -age-gender-recognition-retail-0013,null,FP32 ,completes,completes,completes,completes \ No newline at end of file From ba6873b0fda082156dd7f11f6824fd5876062144 Mon Sep 17 00:00:00 2001 From: Ilya Lavrenov Date: Fri, 14 Jun 2024 17:23:40 +0400 Subject: [PATCH 14/31] Move python configuration to common function (#25005) ### Details: - *item1* - *...* ### Tickets: - *ticket-id* --- .github/workflows/linux.yml | 8 +++---- .../cross_compile/python_helpers.cmake | 13 +++++++++++ cmake/developer_package/features.cmake | 1 - cmake/developer_package/options.cmake | 3 +++ src/bindings/python/CMakeLists.txt | 22 ------------------- 5 files changed, 19 insertions(+), 28 deletions(-) diff --git a/.github/workflows/linux.yml b/.github/workflows/linux.yml index 633a414d713ad7..b6f1d901af101e 100644 --- a/.github/workflows/linux.yml +++ b/.github/workflows/linux.yml @@ -224,7 +224,7 @@ jobs: run: | /usr/bin/python3.8 -m pip install -U pip /usr/bin/python3.8 -m pip install -r ${OPENVINO_REPO}/src/bindings/python/wheel/requirements-dev.txt - cmake -UPYTHON* \ + cmake -UPython* -U_Python* -UPYTHON* \ -UTBB* \ -DENABLE_SYSTEM_TBB=ON \ -DENABLE_PYTHON_PACKAGING=ON \ @@ -245,11 +245,9 @@ jobs: - name: CMake configure, build and install - OpenVINO JS API if: fromJSON(needs.smart_ci.outputs.affected_components).JS_API - run: - cmake -DCPACK_GENERATOR=NPM -DENABLE_SYSTEM_TBB=OFF -UTBB* -S ${OPENVINO_REPO} -B ${BUILD_DIR} - + run: | + cmake -UTBB* -DCPACK_GENERATOR=NPM -DENABLE_SYSTEM_TBB=OFF -S ${OPENVINO_REPO} -B ${BUILD_DIR} cmake --build ${BUILD_DIR} --parallel - cmake -DCMAKE_INSTALL_PREFIX=${INSTALL_DIR_JS} -P ${BUILD_DIR}/cmake_install.cmake # diff --git a/cmake/developer_package/cross_compile/python_helpers.cmake b/cmake/developer_package/cross_compile/python_helpers.cmake index a6c7de739375f1..050c99db9a852f 100644 --- a/cmake/developer_package/cross_compile/python_helpers.cmake +++ b/cmake/developer_package/cross_compile/python_helpers.cmake @@ -49,6 +49,19 @@ endfunction() # Wrapper for find_package(Python3) to allow cross-compilation macro(ov_find_python3 find_package_mode) + # Settings for FindPython3.cmake + if(NOT DEFINED Python3_USE_STATIC_LIBS) + set(Python3_USE_STATIC_LIBS OFF) + endif() + + if(NOT DEFINED Python3_FIND_VIRTUALENV) + set(Python3_FIND_VIRTUALENV FIRST) + endif() + + if(NOT DEFINED Python3_FIND_IMPLEMENTATIONS) + set(Python3_FIND_IMPLEMENTATIONS CPython PyPy) + endif() + if(CMAKE_VERSION VERSION_GREATER_EQUAL 3.18) set(python3_development_component Development.Module) else() diff --git a/cmake/developer_package/features.cmake b/cmake/developer_package/features.cmake index da2fbf6af4f5fe..cbe343f208f4b7 100644 --- a/cmake/developer_package/features.cmake +++ b/cmake/developer_package/features.cmake @@ -6,7 +6,6 @@ include(options) include(target_flags) set (CPACK_GENERATOR "TGZ" CACHE STRING "Cpack generator for OpenVINO") -list (APPEND OV_OPTIONS CPACK_GENERATOR) ov_dependent_option (ENABLE_LTO "Enable Link Time Optimization" OFF "LINUX;NOT ARM;CMAKE_CXX_COMPILER_VERSION VERSION_GREATER 4.9" OFF) diff --git a/cmake/developer_package/options.cmake b/cmake/developer_package/options.cmake index a54a8bed1d4e08..3ad42f156c706c 100644 --- a/cmake/developer_package/options.cmake +++ b/cmake/developer_package/options.cmake @@ -11,11 +11,13 @@ endif() macro(ov_option variable description value) option(${variable} "${description}" ${value}) list(APPEND OV_OPTIONS ${variable}) + set(OV_OPTIONS "${OV_OPTIONS}" CACHE INTERNAL "A list of OpenVINO cmake options") endmacro() macro(ov_dependent_option variable description def_value condition fallback_value) cmake_dependent_option(${variable} "${description}" ${def_value} "${condition}" ${fallback_value}) list(APPEND OV_OPTIONS ${variable}) + set(OV_OPTIONS "${OV_OPTIONS}" CACHE INTERNAL "A list of OpenVINO cmake options") endmacro() macro(ov_option_enum variable description value) @@ -29,6 +31,7 @@ macro(ov_option_enum variable description value) endif() list(APPEND OV_OPTIONS ${variable}) + set(OV_OPTIONS "${OV_OPTIONS}" CACHE INTERNAL "A list of OpenVINO cmake options") set(${variable} ${value} CACHE STRING "${description}") set_property(CACHE ${variable} PROPERTY STRINGS ${OPTION_ENUM_ALLOWED_VALUES}) diff --git a/src/bindings/python/CMakeLists.txt b/src/bindings/python/CMakeLists.txt index f075dc21250e3a..e9250fbba6a61a 100644 --- a/src/bindings/python/CMakeLists.txt +++ b/src/bindings/python/CMakeLists.txt @@ -35,28 +35,6 @@ if(NOT DEFINED OpenVINODeveloperPackage_RELOCATABLE) set(OpenVINODeveloperPackage_RELOCATABLE OFF) endif() -# -# Settings for FindPython3.cmake -# - -if(NOT DEFINED Python3_USE_STATIC_LIBS) - set(Python3_USE_STATIC_LIBS OFF) -endif() - -if(NOT DEFINED Python3_FIND_VIRTUALENV) - set(Python3_FIND_VIRTUALENV FIRST) -endif() - -if(NOT DEFINED Python3_FIND_IMPLEMENTATIONS) - set(Python3_FIND_IMPLEMENTATIONS CPython PyPy) -endif() - -if(CMAKE_VERSION VERSION_GREATER_EQUAL 3.18) - set(python3_development_component Development.Module) -else() - set(python3_development_component Development) -endif() - # # Check python requirements # From 862cdc5fa43d6e3549383979655b2317216fd3dd Mon Sep 17 00:00:00 2001 From: Mircea-Aurelian Dan Date: Fri, 14 Jun 2024 17:29:34 +0300 Subject: [PATCH 15/31] [EISW-89683] Switch `DEVICE_KEEMBAY` to `DEVICE_NPU` (#20230) ### Details: - *Align OV with latest renaming in `vpux-plugin`* - After [PR #5738](https://github.com/intel-innersource/applications.ai.vpu-accelerators.vpux-plugin/pull/5738) in `vpux-plugin` was merged, we are ready to update `ov::test::utils::DEVICE_KEEMBAY` to `ov::test::utils::DEVICE_NPU` on openvino side. ### Tickets: - *[EISW-89683](https://jira.devtools.intel.com/browse/EISW-89683)* --- .../tests/unit/compile_model_metric_test.cpp | 48 +++++++++---------- .../tests/functional/common/utils.cpp | 14 ------ .../tests/functional/common/utils.hpp | 14 ------ .../ov_infer_request/properties_tests.hpp | 2 +- .../common_test_utils/test_constants.hpp | 2 +- .../common_test_utils/src/test_constants.cpp | 2 +- 6 files changed, 27 insertions(+), 55 deletions(-) diff --git a/src/plugins/auto/tests/unit/compile_model_metric_test.cpp b/src/plugins/auto/tests/unit/compile_model_metric_test.cpp index c5b0ddedc0d32b..48dc4c8057f049 100644 --- a/src/plugins/auto/tests/unit/compile_model_metric_test.cpp +++ b/src/plugins/auto/tests/unit/compile_model_metric_test.cpp @@ -172,7 +172,7 @@ TEST_P(ExecNetworkget_propertyOptimalNumInferReq, OPTIMAL_NUMBER_OF_INFER_REQUES .WillByDefault(RETURN_MOCK_VALUE(actualOptimalNum)); ON_CALL( *core, - get_property(StrEq(ov::test::utils::DEVICE_KEEMBAY), StrEq(ov::optimal_number_of_infer_requests.name()), _)) + get_property(StrEq(ov::test::utils::DEVICE_NPU), StrEq(ov::optimal_number_of_infer_requests.name()), _)) .WillByDefault(RETURN_MOCK_VALUE(actualOptimalNum)); } if (isSupportNumRequests) @@ -196,7 +196,7 @@ TEST_P(ExecNetworkget_propertyOptimalNumInferReq, OPTIMAL_NUMBER_OF_INFER_REQUES std::tuple rangeOfStreams = std::make_tuple(1, 3); ON_CALL(*core, get_property(StrEq(ov::test::utils::DEVICE_GPU), StrEq(ov::optimal_batch_size.name()), _)) .WillByDefault(RETURN_MOCK_VALUE(gpuOptimalBatchNum)); - ON_CALL(*core, get_property(StrEq(ov::test::utils::DEVICE_KEEMBAY), StrEq(ov::optimal_batch_size.name()), _)) + ON_CALL(*core, get_property(StrEq(ov::test::utils::DEVICE_NPU), StrEq(ov::optimal_batch_size.name()), _)) .WillByDefault(RETURN_MOCK_VALUE(npuOptimalBatchNum)); ON_CALL(*core, get_property(_, StrEq(ov::range_for_streams.name()), _)) .WillByDefault(RETURN_MOCK_VALUE(rangeOfStreams)); @@ -330,28 +330,28 @@ const std::vector testConfigs = { ConfigParams{false, 3, 5, false, 0, 5, true, ov::test::utils::DEVICE_GPU, 1, 6, true, true}, ConfigParams{true, 3, 5, false, 6, 5, true, ov::test::utils::DEVICE_GPU, 6, 6, true, true}, ConfigParams{false, 3, 5, false, 6, 5, true, ov::test::utils::DEVICE_GPU, 6, 6, true, true}, - ConfigParams{false, 3, -1, false, 2, -1, true, ov::test::utils::DEVICE_KEEMBAY, 1, 0, false, true}, - ConfigParams{true, 3, -1, false, 2, -1, true, ov::test::utils::DEVICE_KEEMBAY, 8, 0, false, true}, - ConfigParams{true, 3, -1, false, 2, -1, true, ov::test::utils::DEVICE_KEEMBAY, 8, 0, false, false}, - ConfigParams{true, 3, -1, false, 0, -1, true, ov::test::utils::DEVICE_KEEMBAY, 8, 0, true, false}, - ConfigParams{true, 3, -1, false, 2, -1, true, ov::test::utils::DEVICE_KEEMBAY, 2, 0, true, false}, - ConfigParams{true, 3, -1, false, 2, -1, true, ov::test::utils::DEVICE_KEEMBAY, 2, 1, true, false}, - ConfigParams{true, 3, -1, false, 2, -1, true, ov::test::utils::DEVICE_KEEMBAY, 6, 6, false, false}, - ConfigParams{true, 3, -1, false, 2, -1, true, ov::test::utils::DEVICE_KEEMBAY, 8, 10, false, false}, - ConfigParams{true, 3, -1, false, 4, -1, true, ov::test::utils::DEVICE_KEEMBAY, 4, 6, true, true}, - ConfigParams{true, 3, -1, false, 4, -1, true, ov::test::utils::DEVICE_KEEMBAY, 2, 2, true, true}, - ConfigParams{true, 3, -1, false, 0, -1, true, ov::test::utils::DEVICE_KEEMBAY, 8, 10, true, true}, - ConfigParams{true, 3, -1, false, 0, -1, true, ov::test::utils::DEVICE_KEEMBAY, 6, 6, true, true}, - ConfigParams{false, 3, -1, false, 0, -1, true, ov::test::utils::DEVICE_KEEMBAY, 1, 0, true, true}, - ConfigParams{true, 3, -1, false, 0, -1, true, ov::test::utils::DEVICE_KEEMBAY, 8, 0, true, true}, - ConfigParams{false, 3, -1, false, 2, -1, true, ov::test::utils::DEVICE_KEEMBAY, 2, 0, true, true}, - ConfigParams{true, 3, -1, false, 2, -1, true, ov::test::utils::DEVICE_KEEMBAY, 2, 0, true, true}, - ConfigParams{false, 3, -1, true, 2, -1, false, ov::test::utils::DEVICE_KEEMBAY, 2, 0, false, true}, - ConfigParams{true, 3, -1, true, 2, -1, false, ov::test::utils::DEVICE_KEEMBAY, 2, 0, false, true}, - ConfigParams{false, 3, 5, false, 2, 5, true, ov::test::utils::DEVICE_KEEMBAY, 1, 0, false, true}, - ConfigParams{true, 3, 5, false, 2, 5, true, ov::test::utils::DEVICE_KEEMBAY, 8, 0, false, true}, - ConfigParams{false, 3, 5, true, 2, 5, false, ov::test::utils::DEVICE_KEEMBAY, 2, 0, false, true}, - ConfigParams{true, 3, 5, true, 2, 5, false, ov::test::utils::DEVICE_KEEMBAY, 2, 0, false, true}, + ConfigParams{false, 3, -1, false, 2, -1, true, ov::test::utils::DEVICE_NPU, 1, 0, false, true}, + ConfigParams{true, 3, -1, false, 2, -1, true, ov::test::utils::DEVICE_NPU, 8, 0, false, true}, + ConfigParams{true, 3, -1, false, 2, -1, true, ov::test::utils::DEVICE_NPU, 8, 0, false, false}, + ConfigParams{true, 3, -1, false, 0, -1, true, ov::test::utils::DEVICE_NPU, 8, 0, true, false}, + ConfigParams{true, 3, -1, false, 2, -1, true, ov::test::utils::DEVICE_NPU, 2, 0, true, false}, + ConfigParams{true, 3, -1, false, 2, -1, true, ov::test::utils::DEVICE_NPU, 2, 1, true, false}, + ConfigParams{true, 3, -1, false, 2, -1, true, ov::test::utils::DEVICE_NPU, 6, 6, false, false}, + ConfigParams{true, 3, -1, false, 2, -1, true, ov::test::utils::DEVICE_NPU, 8, 10, false, false}, + ConfigParams{true, 3, -1, false, 4, -1, true, ov::test::utils::DEVICE_NPU, 4, 6, true, true}, + ConfigParams{true, 3, -1, false, 4, -1, true, ov::test::utils::DEVICE_NPU, 2, 2, true, true}, + ConfigParams{true, 3, -1, false, 0, -1, true, ov::test::utils::DEVICE_NPU, 8, 10, true, true}, + ConfigParams{true, 3, -1, false, 0, -1, true, ov::test::utils::DEVICE_NPU, 6, 6, true, true}, + ConfigParams{false, 3, -1, false, 0, -1, true, ov::test::utils::DEVICE_NPU, 1, 0, true, true}, + ConfigParams{true, 3, -1, false, 0, -1, true, ov::test::utils::DEVICE_NPU, 8, 0, true, true}, + ConfigParams{false, 3, -1, false, 2, -1, true, ov::test::utils::DEVICE_NPU, 2, 0, true, true}, + ConfigParams{true, 3, -1, false, 2, -1, true, ov::test::utils::DEVICE_NPU, 2, 0, true, true}, + ConfigParams{false, 3, -1, true, 2, -1, false, ov::test::utils::DEVICE_NPU, 2, 0, false, true}, + ConfigParams{true, 3, -1, true, 2, -1, false, ov::test::utils::DEVICE_NPU, 2, 0, false, true}, + ConfigParams{false, 3, 5, false, 2, 5, true, ov::test::utils::DEVICE_NPU, 1, 0, false, true}, + ConfigParams{true, 3, 5, false, 2, 5, true, ov::test::utils::DEVICE_NPU, 8, 0, false, true}, + ConfigParams{false, 3, 5, true, 2, 5, false, ov::test::utils::DEVICE_NPU, 2, 0, false, true}, + ConfigParams{true, 3, 5, true, 2, 5, false, ov::test::utils::DEVICE_NPU, 2, 0, false, true}, }; INSTANTIATE_TEST_SUITE_P(smoke_Auto_BehaviorTests, diff --git a/src/plugins/intel_npu/tests/functional/common/utils.cpp b/src/plugins/intel_npu/tests/functional/common/utils.cpp index 1fbbdbebd663ca..7ac8b3ed4561f2 100644 --- a/src/plugins/intel_npu/tests/functional/common/utils.cpp +++ b/src/plugins/intel_npu/tests/functional/common/utils.cpp @@ -7,20 +7,6 @@ #include "npu_private_properties.hpp" #include "utils.hpp" -namespace ov { - -namespace test { - -namespace utils { - -const char* DEVICE_NPU = "NPU"; - -} // namespace utils - -} // namespace test - -} // namespace ov - std::string getBackendName(const ov::Core& core) { return core.get_property("NPU", ov::intel_npu::backend_name.name()).as(); } diff --git a/src/plugins/intel_npu/tests/functional/common/utils.hpp b/src/plugins/intel_npu/tests/functional/common/utils.hpp index 3616f81d71ab17..bb116a2c8fecc1 100644 --- a/src/plugins/intel_npu/tests/functional/common/utils.hpp +++ b/src/plugins/intel_npu/tests/functional/common/utils.hpp @@ -8,20 +8,6 @@ #include #include "common_test_utils/unicode_utils.hpp" -namespace ov { - -namespace test { - -namespace utils { - -extern const char* DEVICE_NPU; - -} // namespace utils - -} // namespace test - -} // namespace ov - std::string getBackendName(const ov::Core& core); std::vector getAvailableDevices(const ov::Core& core); diff --git a/src/tests/functional/plugin/shared/include/behavior/ov_infer_request/properties_tests.hpp b/src/tests/functional/plugin/shared/include/behavior/ov_infer_request/properties_tests.hpp index 7a450252c6a2c9..aa0aecd1aec57c 100644 --- a/src/tests/functional/plugin/shared/include/behavior/ov_infer_request/properties_tests.hpp +++ b/src/tests/functional/plugin/shared/include/behavior/ov_infer_request/properties_tests.hpp @@ -121,7 +121,7 @@ TEST_P(InferRequestPropertiesTest, ReusableCPUStreamsExecutor) { // Load CNNNetwork to target plugins execNet = core->compile_model(function, target_device, config); auto req = execNet.create_infer_request(); - if (target_device == ov::test::utils::DEVICE_KEEMBAY) { + if (target_device == ov::test::utils::DEVICE_NPU) { ASSERT_EQ(1u, ov::threading::executor_manager()->get_executors_number()); ASSERT_EQ(0u, ov::threading::executor_manager()->get_idle_cpu_streams_executors_number()); } else if ((target_device == ov::test::utils::DEVICE_AUTO) || diff --git a/src/tests/test_utils/common_test_utils/include/common_test_utils/test_constants.hpp b/src/tests/test_utils/common_test_utils/include/common_test_utils/test_constants.hpp index eaab39e7d5eb0f..136cd6c8d20f41 100644 --- a/src/tests/test_utils/common_test_utils/include/common_test_utils/test_constants.hpp +++ b/src/tests/test_utils/common_test_utils/include/common_test_utils/test_constants.hpp @@ -11,8 +11,8 @@ namespace utils { extern const char* DEVICE_AUTO; extern const char* DEVICE_CPU; extern const char* DEVICE_GPU; +extern const char* DEVICE_NPU; extern const char* DEVICE_BATCH; -extern const char* DEVICE_KEEMBAY; extern const char* DEVICE_MULTI; extern const char* DEVICE_TEMPLATE; extern const char* DEVICE_HETERO; diff --git a/src/tests/test_utils/common_test_utils/src/test_constants.cpp b/src/tests/test_utils/common_test_utils/src/test_constants.cpp index b8825be76c10a9..fb6ea31250c6ba 100644 --- a/src/tests/test_utils/common_test_utils/src/test_constants.cpp +++ b/src/tests/test_utils/common_test_utils/src/test_constants.cpp @@ -11,7 +11,7 @@ namespace utils { const char* DEVICE_AUTO = "AUTO"; const char* DEVICE_CPU = "CPU"; const char* DEVICE_GPU = "GPU"; -const char* DEVICE_KEEMBAY = "NPU"; +const char* DEVICE_NPU = "NPU"; const char* DEVICE_BATCH = "BATCH"; const char* DEVICE_MULTI = "MULTI"; const char* DEVICE_TEMPLATE = "TEMPLATE"; From 4dd6069936071582abc4e290ca373ab20decda84 Mon Sep 17 00:00:00 2001 From: Attila Csok Date: Fri, 14 Jun 2024 09:12:58 -0700 Subject: [PATCH 16/31] [intel-npu] Fix for pci_info throw with old drivers (#25023) ### Details: - zero-backend/pci information: Older drivers return errors not covered by current error managment, leading to Throw in zero_device intitialization, leading to total incompatibility with certain old drivers. Since pci information is not essential for the correct functioning of the plugin, i am removing throws completely, falling back to error message and default values. ### Tickets: - none --- .../intel_npu/src/backend/src/zero_device.cpp | 17 +++++------------ 1 file changed, 5 insertions(+), 12 deletions(-) diff --git a/src/plugins/intel_npu/src/backend/src/zero_device.cpp b/src/plugins/intel_npu/src/backend/src/zero_device.cpp index a29261bffe7d65..5ce3b5d7c0fd7b 100644 --- a/src/plugins/intel_npu/src/backend/src/zero_device.cpp +++ b/src/plugins/intel_npu/src/backend/src/zero_device.cpp @@ -24,27 +24,20 @@ ZeroDevice::ZeroDevice(const std::shared_ptr& initStructs // Query PCI information // Older drivers do not have this implementend. Linux driver returns NOT_IMPLEMENTED, while windows driver returns // zero values. If this is detected, we populate only device with ID from device_properties for backwards - // compatibility + // compatibility. For any other error, we just fall-back to device ID to assure backwards compatibilty with even + // older drivers pci_properties.stype = ZE_STRUCTURE_TYPE_PCI_EXT_PROPERTIES; ze_result_t retpci = zeDevicePciGetPropertiesExt(_initStructs->getDevice(), &pci_properties); if (ZE_RESULT_SUCCESS == retpci) { - // win backwards compatibility + // windows driver specific backwards compatibility if (pci_properties.address.device == 0) { log.warning("PCI information not available in driver. Falling back to deviceId"); pci_properties.address.device = device_properties.deviceId; } - } else if (ZE_RESULT_ERROR_UNSUPPORTED_FEATURE == retpci) { + } else { + // general backwards compatibility log.warning("PCI information not available in driver. Falling back to deviceId"); - // linux backwards compatibilty pci_properties.address.device = device_properties.deviceId; - } else { - OPENVINO_THROW("L0 zeDevicePciGetPropertiesExt result: ", - ze_result_to_string(retpci), - ", code 0x", - std::hex, - uint64_t(retpci), - " - ", - ze_result_to_description(retpci)); } /// Calculate and store device GOPS with formula: frequency * number of tiles * ops per tile From 80dcdc959c7e52aac19f2be7ddad6fba1b933dea Mon Sep 17 00:00:00 2001 From: Egor Duplenskii Date: Fri, 14 Jun 2024 18:58:50 +0200 Subject: [PATCH 17/31] [CPU] Do not add Input / Output to executable nodes (#24327) To reduce infer overhead --- src/plugins/intel_cpu/src/graph.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/plugins/intel_cpu/src/graph.cpp b/src/plugins/intel_cpu/src/graph.cpp index b31e2dab77efdf..e17d4d7ae029ef 100644 --- a/src/plugins/intel_cpu/src/graph.cpp +++ b/src/plugins/intel_cpu/src/graph.cpp @@ -289,7 +289,8 @@ static std::tuple, std::vector> ExtractExecutableNo std::vector executableGraphNodes; for (size_t i = 0; i < graphNodes.size(); i++) { const auto& graphNode = graphNodes[i]; - if ((!graphNode->isConstant() && CPU_DEBUG_CAPS_ALWAYS_TRUE(graphNode->isExecutable())) || graphNode->isDynamicNode()) { + if ((!graphNode->isConstant() && CPU_DEBUG_CAPS_ALWAYS_TRUE(graphNode->isExecutable())) || // non-constant executable or + (graphNode->isDynamicNode() && !one_of(graphNode->getType(), Type::Input, Type::Output))) { // dynamic, except inputs / outputs /* @todo * Revise implementation. * With current way it is possible that with debug_caps enabled From 6e67d7f8321fc869c78fd265ce6969e82a1c65c5 Mon Sep 17 00:00:00 2001 From: Ilya Lavrenov Date: Sat, 15 Jun 2024 01:50:06 +0400 Subject: [PATCH 18/31] Try to disable package registry (#25041) ### Details: - *item1* - *...* ### Tickets: - *ticket-id* --- CMakeLists.txt | 5 ++++- .../developer_package/OpenVINODeveloperScriptsConfig.cmake | 7 +++++++ 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index adfdc58a8de05b..494a3e4ce21d61 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -41,7 +41,10 @@ if(POLICY CMP0149) cmake_policy(SET CMP0149 NEW) endif() -project(OpenVINO DESCRIPTION "OpenVINO toolkit") +project(OpenVINO + DESCRIPTION "OpenVINO toolkit" + HOMEPAGE_URL "https://docs.openvino.ai/2024/home.html" + LANGUAGES C CXX) find_package(OpenVINODeveloperScripts REQUIRED PATHS "${OpenVINO_SOURCE_DIR}/cmake/developer_package" diff --git a/cmake/developer_package/OpenVINODeveloperScriptsConfig.cmake b/cmake/developer_package/OpenVINODeveloperScriptsConfig.cmake index 904ad86e31d8f0..ee8111bd185d85 100644 --- a/cmake/developer_package/OpenVINODeveloperScriptsConfig.cmake +++ b/cmake/developer_package/OpenVINODeveloperScriptsConfig.cmake @@ -211,6 +211,8 @@ set(CMAKE_POLICY_DEFAULT_CMP0068 NEW) set(CMAKE_POLICY_DEFAULT_CMP0074 NEW) # CMake 3.13+: option() honors normal variables. set(CMAKE_POLICY_DEFAULT_CMP0077 NEW) +# CMake 3.15+: export(PACKAGE) does not populate package registry by default. +set(CMAKE_POLICY_DEFAULT_CMP0090 NEW) # CMake 3.15: Modules FindPython3, FindPython2 and FindPython use LOCATION for lookup strategy set(CMAKE_POLICY_DEFAULT_CMP0094 NEW) # CMake 3.19+: An imported target missing its location property fails during generation. @@ -222,6 +224,11 @@ set(CMAKE_POLICY_DEFAULT_CMP0135 NEW) # CMake 3.27+ :Visual Studio Generators select latest Windows SDK by default. set(CMAKE_POLICY_DEFAULT_CMP0149 NEW) +set(CMAKE_FIND_USE_PACKAGE_REGISTRY OFF CACHE BOOL "Disables search in user / system package registries") +set(CMAKE_FIND_PACKAGE_NO_PACKAGE_REGISTRY ON CACHE BOOL "Disables search in user package registries") +set(CMAKE_FIND_PACKAGE_NO_SYSTEM_PACKAGE_REGISTRY ON CACHE BOOL "Disables search in system package registries") +set(CMAKE_EXPORT_PACKAGE_REGISTRY OFF CACHE BOOL "Disables package registry. Required for 3rd party projects like rapidjson, gflags") +set(CMAKE_EXPORT_NO_PACKAGE_REGISTRY ON CACHE BOOL "Disables package registry. Required for 3rd party projects like rapidjson, gflags") set(CMAKE_WARN_DEPRECATED OFF CACHE BOOL "Don't warn about obsolete cmake versions in 3rdparty") set(CMAKE_WARN_ON_ABSOLUTE_INSTALL_DESTINATION ON CACHE BOOL "Warn about absolute paths in destination") From a46e46a053b4f821e4b2c3e1a494e4ce6bbb0149 Mon Sep 17 00:00:00 2001 From: Tatiana Savina Date: Sat, 15 Jun 2024 13:37:06 +0200 Subject: [PATCH 19/31] [DOCS] Release links update (#25026) ### Details: - *item1* - *...* ### Tickets: - *ticket-id* --- .../install-openvino-archive-linux.rst | 74 ++++++---------- .../install-openvino-archive-macos.rst | 20 ++--- .../install-openvino-archive-windows.rst | 18 ++-- .../install-openvino-genai.rst | 85 +++++++++++++++---- 4 files changed, 114 insertions(+), 83 deletions(-) diff --git a/docs/articles_en/get-started/install-openvino/install-openvino-archive-linux.rst b/docs/articles_en/get-started/install-openvino/install-openvino-archive-linux.rst index 294d966df9b37c..028fbef02df15a 100644 --- a/docs/articles_en/get-started/install-openvino/install-openvino-archive-linux.rst +++ b/docs/articles_en/get-started/install-openvino/install-openvino-archive-linux.rst @@ -25,8 +25,7 @@ Install OpenVINO™ Runtime on Linux from an Archive File Debian9 armhf V n/a n/a Ubuntu20 arm64 V n/a n/a CentOS7 x86_64 V V n/a - Ubuntu18 x86_64 V V n/a - Ubuntu20 x86_64 V V n/a + Ubuntu20 x86_64 V V V Ubuntu22 x86_64 V V V Ubuntu24 x86_64 V V V RHEL8 x86_64 V V n/a @@ -60,11 +59,6 @@ Install OpenVINO™ Runtime on Linux from an Archive File * GCC 9.3.0 - .. tab-item:: Ubuntu 18.04 - :sync: ubuntu-18 - - * GCC 7.5.0 - .. tab-item:: RHEL 8 :sync: rhel-8 @@ -91,8 +85,6 @@ Install OpenVINO™ Runtime on Linux from an Archive File gcc -v - - Installing OpenVINO Runtime ############################################################ @@ -117,7 +109,7 @@ Step 1: Download and Install the OpenVINO Core Components cd /Downloads -4. Download the `OpenVINO Runtime archive file for your system `_, extract the files, rename the extracted folder and move it to the desired path: +4. Download the `OpenVINO Runtime archive file for your system `_, extract the files, rename the extracted folder and move it to the desired path: .. tab-set:: @@ -132,9 +124,9 @@ Step 1: Download and Install the OpenVINO Core Components .. code-block:: sh - curl -L https://storage.openvinotoolkit.org/repositories/openvino/packages/2024.1/linux/l_openvino_toolkit_ubuntu22_2024.1.0.15008.f4afc983258_x86_64.tgz --output openvino_2024.1.0.tgz - tar -xf openvino_2024.1.0.tgz - sudo mv l_openvino_toolkit_ubuntu24_2024.1.0.15008.f4afc983258_x86_64 /opt/intel/openvino_2024.1.0 + curl -L https://storage.openvinotoolkit.org/repositories/openvino/packages/2024.2/linux/l_openvino_toolkit_ubuntu24_2024.2.0.15519.5c0f38f83f6_x86_64.tgz --output openvino_2024.2.0.tgz + tar -xf openvino_2024.2.0.tgz + sudo mv l_openvino_toolkit_ubuntu24_2024.2.0.15519.5c0f38f83f6_x86_64 /opt/intel/openvino_2024.2.0 .. tab-item:: Ubuntu 22.04 :sync: ubuntu-22 @@ -142,9 +134,9 @@ Step 1: Download and Install the OpenVINO Core Components .. code-block:: sh - curl -L https://storage.openvinotoolkit.org/repositories/openvino/packages/2024.1/linux/l_openvino_toolkit_ubuntu22_2024.1.0.15008.f4afc983258_x86_64.tgz --output openvino_2024.1.0.tgz - tar -xf openvino_2024.1.0.tgz - sudo mv l_openvino_toolkit_ubuntu22_2024.1.0.15008.f4afc983258_x86_64 /opt/intel/openvino_2024.1.0 + curl -L https://storage.openvinotoolkit.org/repositories/openvino/packages/2024.2/linux/l_openvino_toolkit_ubuntu22_2024.2.0.15519.5c0f38f83f6_x86_64.tgz --output openvino_2024.2.0.tgz + tar -xf openvino_2024.2.0.tgz + sudo mv l_openvino_toolkit_ubuntu22_2024.2.0.15519.5c0f38f83f6_x86_64 /opt/intel/openvino_2024.2.0 .. tab-item:: Ubuntu 20.04 :sync: ubuntu-20 @@ -152,20 +144,9 @@ Step 1: Download and Install the OpenVINO Core Components .. code-block:: sh - curl -L https://storage.openvinotoolkit.org/repositories/openvino/packages/2024.1/linux/l_openvino_toolkit_ubuntu20_2024.1.0.15008.f4afc983258_x86_64.tgz --output openvino_2024.1.0.tgz - tar -xf openvino_2024.1.0.tgz - sudo mv l_openvino_toolkit_ubuntu20_2024.1.0.15008.f4afc983258_x86_64 /opt/intel/openvino_2024.1.0 - - - .. tab-item:: Ubuntu 18.04 - :sync: ubuntu-18 - - .. code-block:: sh - - - curl -L https://storage.openvinotoolkit.org/repositories/openvino/packages/2024.1/linux/l_openvino_toolkit_ubuntu18_2024.1.0.15008.f4afc983258_x86_64.tgz --output openvino_2024.1.0.tgz - tar -xf openvino_2024.1.0.tgz - sudo mv l_openvino_toolkit_ubuntu18_2024.1.0.15008.f4afc983258_x86_64 /opt/intel/openvino_2024.1.0 + curl -L https://storage.openvinotoolkit.org/repositories/openvino/packages/2024.2/linux/l_openvino_toolkit_ubuntu20_2024.2.0.15519.5c0f38f83f6_x86_64.tgz --output openvino_2024.2.0.tgz + tar -xf openvino_2024.2.0.tgz + sudo mv l_openvino_toolkit_ubuntu20_2024.2.0.15519.5c0f38f83f6_x86_64 /opt/intel/openvino_2024.2.0 .. tab-item:: RHEL 8 :sync: rhel-8 @@ -173,18 +154,18 @@ Step 1: Download and Install the OpenVINO Core Components .. code-block:: sh - curl -L https://storage.openvinotoolkit.org/repositories/openvino/packages/2024.1/linux/l_openvino_toolkit_rhel8_2024.1.0.15008.f4afc983258_x86_64.tgz --output openvino_2024.1.0.tgz - tar -xf openvino_2024.1.0.tgz - sudo mv l_openvino_toolkit_rhel8_2024.1.0.15008.f4afc983258_x86_64 /opt/intel/openvino_2024.1.0 + curl -L https://storage.openvinotoolkit.org/repositories/openvino/packages/2024.2/linux/l_openvino_toolkit_rhel8_2024.2.0.15519.5c0f38f83f6_x86_64.tgz --output openvino_2024.2.0.tgz + tar -xf openvino_2024.2.0.tgz + sudo mv l_openvino_toolkit_rhel8_2024.2.0.15519.5c0f38f83f6_x86_64 /opt/intel/openvino_2024.2.0 .. tab-item:: CentOS 7 :sync: centos-7 .. code-block:: sh - curl -L https://storage.openvinotoolkit.org/repositories/openvino/packages/2024.1/linux/l_openvino_toolkit_centos7_2024.1.0.15008.f4afc983258_x86_64.tgz --output openvino_2024.1.0.tgz - tar -xf openvino_2024.1.0.tgz - sudo mv l_openvino_toolkit_centos7_2024.1.0.15008.f4afc983258_x86_64 /opt/intel/openvino_2024.1.0 + curl -L https://storage.openvinotoolkit.org/repositories/openvino/packages/2024.2/linux/l_openvino_toolkit_centos7_2024.2.0.15519.5c0f38f83f6_x86_64.tgz --output openvino_2024.2.0.tgz + tar -xf openvino_2024.2.0.tgz + sudo mv l_openvino_toolkit_centos7_2024.2.0.15519.5c0f38f83f6_x86_64 /opt/intel/openvino_2024.2.0 .. tab-item:: ARM 64-bit @@ -192,26 +173,25 @@ Step 1: Download and Install the OpenVINO Core Components .. code-block:: sh - - curl -L https://storage.openvinotoolkit.org/repositories/openvino/packages/2024.1/linux/l_openvino_toolkit_ubuntu20_2024.1.0.15008.f4afc983258_arm64.tgz -O openvino_2024.1.0.tgz - tar -xf openvino_2024.1.0.tgz - sudo mv l_openvino_toolkit_ubuntu20_2024.1.0.15008.f4afc983258_arm64 /opt/intel/openvino_2024.1.0 + curl -L https://storage.openvinotoolkit.org/repositories/openvino/packages/2024.2/linux/l_openvino_toolkit_ubuntu20_2024.2.0.15519.5c0f38f83f6_arm64.tgz -O openvino_2024.2.0.tgz + tar -xf openvino_2024.2.0.tgz + sudo mv l_openvino_toolkit_ubuntu20_2024.2.0.15519.5c0f38f83f6_arm64 /opt/intel/openvino_2024.2.0 .. tab-item:: ARM 32-bit :sync: arm-32 .. code-block:: sh - curl -L https://storage.openvinotoolkit.org/repositories/openvino/packages/2024.1/linux/l_openvino_toolkit_debian9_2024.1.0.15008.f4afc983258_armhf.tgz -O openvino_2024.1.0.tgz - tar -xf openvino_2024.1.0.tgz - sudo mv l_openvino_toolkit_debian9_2024.1.0.15008.f4afc983258_armhf /opt/intel/openvino_2024.1.0 + curl -L https://storage.openvinotoolkit.org/repositories/openvino/packages/2024.2/linux/l_openvino_toolkit_debian9_2024.2.0.15519.5c0f38f83f6_armhf.tgz -O openvino_2024.2.0.tgz + tar -xf openvino_2024.2.0.tgz + sudo mv l_openvino_toolkit_debian9_2024.2.0.15519.5c0f38f83f6_armhf /opt/intel/openvino_2024.2.0 5. Install required system dependencies on Linux. To do this, OpenVINO provides a script in the extracted installation directory. Run the following command: .. code-block:: sh - cd /opt/intel/openvino_2024.1.0 + cd /opt/intel/openvino_2024.2.0 sudo -E ./install_dependencies/install_openvino_dependencies.sh 6. (Optional) Install *numpy* Python Library: @@ -220,11 +200,11 @@ Step 1: Download and Install the OpenVINO Core Components This step is required only when you decide to use Python API. - You can use the ``requirements.txt`` file from the ``/opt/intel/openvino_2024.1.0/python`` folder: + You can use the ``requirements.txt`` file from the ``/opt/intel/openvino_2024.2.0/python`` folder: .. code-block:: sh - cd /opt/intel/openvino_2024.1.0 + cd /opt/intel/openvino_2024.2.0 python3 -m pip install -r ./python/requirements.txt 7. For simplicity, it is useful to create a symbolic link as below: @@ -233,7 +213,7 @@ Step 1: Download and Install the OpenVINO Core Components cd /opt/intel - sudo ln -s openvino_2024.1.0 openvino_2024 + sudo ln -s openvino_2024.2.0 openvino_2024 .. note:: If you have already installed a previous release of OpenVINO 2024, a symbolic link to the ``openvino_2024`` folder may already exist. diff --git a/docs/articles_en/get-started/install-openvino/install-openvino-archive-macos.rst b/docs/articles_en/get-started/install-openvino/install-openvino-archive-macos.rst index 2421ec54c32354..03902a8edb7dc6 100644 --- a/docs/articles_en/get-started/install-openvino/install-openvino-archive-macos.rst +++ b/docs/articles_en/get-started/install-openvino/install-openvino-archive-macos.rst @@ -63,7 +63,7 @@ Step 1: Install OpenVINO Core Components cd /Downloads -4. Download the `OpenVINO Runtime archive file for macOS `__, extract the files, rename the extracted folder and move it to the desired path: +4. Download the `OpenVINO Runtime archive file for macOS `__, extract the files, rename the extracted folder and move it to the desired path: .. tab-set:: @@ -73,9 +73,9 @@ Step 1: Install OpenVINO Core Components .. code-block:: sh - curl -L https://storage.openvinotoolkit.org/repositories/openvino/packages/2024.1/macos/m_openvino_toolkit_macos_12_6_2024.1.0.15008.f4afc983258_x86_64.tgz --output openvino_2024.1.0.tgz - tar -xf openvino_2024.1.0.tgz - sudo mv m_openvino_toolkit_macos_12_6_2024.1.0.15008.f4afc983258_x86_64 /opt/intel/openvino_2024.1.0 + curl -L https://storage.openvinotoolkit.org/repositories/openvino/packages/2024.2/macos/m_openvino_toolkit_macos_12_6_2024.2.0.15519.5c0f38f83f6_x86_64.tgz --output openvino_2024.2.0.tgz + tar -xf openvino_2024.2.0.tgz + sudo mv m_openvino_toolkit_macos_12_6_2024.2.0.15519.5c0f38f83f6_x86_64 /opt/intel/openvino_2024.2.0 .. tab-item:: ARM, 64-bit :sync: arm-64 @@ -83,9 +83,9 @@ Step 1: Install OpenVINO Core Components .. code-block:: sh - curl -L https://storage.openvinotoolkit.org/repositories/openvino/packages/2024.1/macos/m_openvino_toolkit_macos_12_6_2024.1.0.15008.f4afc983258_arm64.tgz --output openvino_2024.1.0.tgz - tar -xf openvino_2024.1.0.tgz - sudo mv m_openvino_toolkit_macos_12_6_2024.1.0.15008.f4afc983258_arm64 /opt/intel/openvino_2024.1.0 + curl -L https://storage.openvinotoolkit.org/repositories/openvino/packages/2024.2/macos/m_openvino_toolkit_macos_12_6_2024.2.0.15519.5c0f38f83f6_arm64.tgz --output openvino_2024.2.0.tgz + tar -xf openvino_2024.2.0.tgz + sudo mv m_openvino_toolkit_macos_12_6_2024.2.0.15519.5c0f38f83f6_arm64 /opt/intel/openvino_2024.2.0 5. (Optional) Install *numpy* Python Library: @@ -94,11 +94,11 @@ Step 1: Install OpenVINO Core Components This step is required only when you decide to use Python API. - You can use the ``requirements.txt`` file from the ``/opt/intel/openvino_2024.1.0/python`` folder: + You can use the ``requirements.txt`` file from the ``/opt/intel/openvino_2024.2.0/python`` folder: .. code-block:: sh - cd /opt/intel/openvino_2024.1.0 + cd /opt/intel/openvino_2024.2.0 python3 -m pip install -r ./python/requirements.txt 6. For simplicity, it is useful to create a symbolic link as below: @@ -106,7 +106,7 @@ Step 1: Install OpenVINO Core Components .. code-block:: sh - sudo ln -s /opt/intel/openvino_2024.1.0 /opt/intel/openvino_2024 + sudo ln -s /opt/intel/openvino_2024.2.0 /opt/intel/openvino_2024 .. note:: diff --git a/docs/articles_en/get-started/install-openvino/install-openvino-archive-windows.rst b/docs/articles_en/get-started/install-openvino/install-openvino-archive-windows.rst index ffa5e612ab1571..c9e32e907837b0 100644 --- a/docs/articles_en/get-started/install-openvino/install-openvino-archive-windows.rst +++ b/docs/articles_en/get-started/install-openvino/install-openvino-archive-windows.rst @@ -78,19 +78,19 @@ Step 1: Download and Install OpenVINO Core Components ``C:\Program Files (x86)\Intel`` is the recommended folder. You may also use a different path if desired or if you don't have administrator privileges on your computer. -2. Download the `OpenVINO Runtime archive file for Windows `__ to your local ``Downloads`` folder. +2. Download the `OpenVINO Runtime archive file for Windows `__ to your local ``Downloads`` folder. If you prefer using command-lines, run the following commands in the command prompt window you opened: .. code-block:: sh cd /Downloads - curl -L https://storage.openvinotoolkit.org/repositories/openvino/packages/2024.0/windows/w_openvino_toolkit_windows_2024.1.0.15008.f4afc983258_x86_64.zip --output openvino_2024.1.0.zip --output openvino_2024.0.0.zip + curl -L https://storage.openvinotoolkit.org/repositories/openvino/packages/2024.2/windows/w_openvino_toolkit_windows_2024.2.0.15519.5c0f38f83f6_x86_64.zip --output openvino_2024.2.0.zip --output openvino_2024.2.0.zip .. note:: - A ``.sha256`` file is provided together with the archive file to validate your download process. To do that, download the ``.sha256`` file from the same repository and run ``CertUtil -hashfile openvino_2024.1.0.zip SHA256``. Compare the returned value in the output with what's in the ``.sha256`` file: if the values are the same, you have downloaded the correct file successfully; if not, create a Support ticket `here `__. + A ``.sha256`` file is provided together with the archive file to validate your download process. To do that, download the ``.sha256`` file from the same repository and run ``CertUtil -hashfile openvino_2024.2.0.zip SHA256``. Compare the returned value in the output with what's in the ``.sha256`` file: if the values are the same, you have downloaded the correct file successfully; if not, create a Support ticket `here `__. 3. Use your favorite tool to extract the archive file, rename the extracted folder, and move it to the ``C:\Program Files (x86)\Intel`` directory. @@ -99,9 +99,9 @@ Step 1: Download and Install OpenVINO Core Components .. code-block:: sh - tar -xf openvino_2024.1.0.zip - ren w_openvino_toolkit_windows_2024.1.0.15008.f4afc983258_x86_64 openvino_2024.1.0 - move openvino_2024.1.0 "C:\Program Files (x86)\Intel" + tar -xf openvino_2024.2.0.zip + ren w_openvino_toolkit_windows_2024.2.0.15519.5c0f38f83f6_x86_64 openvino_2024.2.0 + move openvino_2024.2.0 "C:\Program Files (x86)\Intel" 4. (Optional) Install *numpy* Python Library: @@ -110,11 +110,11 @@ Step 1: Download and Install OpenVINO Core Components This step is required only when you decide to use Python API. - You can use the ``requirements.txt`` file from the ``C:\Program Files (x86)\Intel\openvino_2024.1.0\python`` folder: + You can use the ``requirements.txt`` file from the ``C:\Program Files (x86)\Intel\openvino_2024.2.0\python`` folder: .. code-block:: sh - cd "C:\Program Files (x86)\Intel\openvino_2024.1.0" + cd "C:\Program Files (x86)\Intel\openvino_2024.2.0" python -m pip install -r .\python\requirements.txt @@ -123,7 +123,7 @@ Step 1: Download and Install OpenVINO Core Components .. code-block:: sh cd C:\Program Files (x86)\Intel - mklink /D openvino_2024 openvino_2024.1.0 + mklink /D openvino_2024 openvino_2024.2.0 .. note:: diff --git a/docs/articles_en/get-started/install-openvino/install-openvino-genai.rst b/docs/articles_en/get-started/install-openvino/install-openvino-genai.rst index 5927d11b18e8c8..cd6714149e7211 100644 --- a/docs/articles_en/get-started/install-openvino/install-openvino-genai.rst +++ b/docs/articles_en/get-started/install-openvino/install-openvino-genai.rst @@ -9,16 +9,30 @@ For a quickstart guide, refer to the :doc:`GenAI API Guide <../../learn-openvino To see GenAI in action, check the Jupyter notebooks: `LLM-powered Chatbot `__ and -`LLM Instruction-following pipeline `__ +`LLM Instruction-following pipeline `__. -The OpenVINO GenAI flavor is available for installation via Archive and PyPI distributions: +The OpenVINO GenAI flavor is available for installation via PyPI and Archive distributions: + +PyPI Installation +############################### + +To install the GenAI flavor of OpenVINO via PyPI, follow the standard :doc:`installation steps `, +but use the *openvino-genai* package instead of *openvino*: + +.. code-block:: python + + python -m pip install openvino-genai Archive Installation ############################### +The OpenVINO GenAI archive package includes the OpenVINO™ Runtime and :doc:`Tokenizers <../../learn-openvino/llm_inference_guide/ov-tokenizers>`. To install the GenAI flavor of OpenVINO from an archive file, follow the standard installation steps for your system but instead of using the vanilla package file, download the one with OpenVINO GenAI: +Linux +++++++++++++++++++++++++++ + .. tab-set:: .. tab-item:: x86_64 @@ -31,32 +45,69 @@ but instead of using the vanilla package file, download the one with OpenVINO Ge .. code-block:: sh - - curl -L https://storage.openvinotoolkit.org/repositories/openvino/packages/2024.1/linux/l_openvino_toolkit_ubuntu22_2024.1.0.15008.f4afc983258_x86_64.tgz --output openvino_2024.1.0.tgz - tar -xf openvino_2024.1.0.tgz - sudo mv l_openvino_toolkit_ubuntu24_2024.1.0.15008.f4afc983258_x86_64 /opt/intel/openvino_2024.1.0 + curl -L https://storage.openvinotoolkit.org/repositories/openvino_genai/packages/2024.2/linux/openvino_genai_ubuntu24_2024.2.0.0_x86_64.tar.gz --output openvino_genai_2024.2.0.0.tgz + tar -xf openvino_genai_2024.2.0.0.tgz .. tab-item:: Ubuntu 22.04 :sync: ubuntu-22 .. code-block:: sh - curl -L https://storage.openvinotoolkit.org/repositories/openvino/packages/2024.1/linux/l_openvino_toolkit_ubuntu22_2024.1.0.15008.f4afc983258_x86_64.tgz --output openvino_2024.1.0.tgz - tar -xf openvino_2024.1.0.tgz - sudo mv l_openvino_toolkit_ubuntu22_2024.1.0.15008.f4afc983258_x86_64 /opt/intel/openvino_2024.1.0 + curl -L https://storage.openvinotoolkit.org/repositories/openvino_genai/packages/2024.2/linux/openvino_genai_ubuntu22_2024.2.0.0_x86_64.tar.gz --output openvino_genai_2024.2.0.0.tgz + tar -xf openvino_genai_2024.2.0.0.tgz + + .. tab-item:: Ubuntu 20.04 + :sync: ubuntu-20 + + .. code-block:: sh + + curl -L https://storage.openvinotoolkit.org/repositories/openvino_genai/packages/2024.2/linux/openvino_genai_ubuntu20_2024.2.0.0_x86_64.tar.gz --output openvino_genai_2024.2.0.0.tgz + tar -xf openvino_genai_2024.2.0.0.tgz + + + .. tab-item:: ARM 64-bit + :sync: arm-64 + + .. code-block:: sh + + curl -L https://storage.openvinotoolkit.org/repositories/openvino_genai/packages/2024.2/linux/openvino_genai_ubuntu20_2024.2.0.0_arm64.tar.gz -O openvino_genai_2024.2.0.0.tgz + tar -xf openvino_genai_2024.2.0.0.tgz + + +Windows +++++++++++++++++++++++++++ + +.. code-block:: sh + + cd /Downloads + curl -L https://storage.openvinotoolkit.org/repositories/openvino_genai/packages/2024.2/windows/openvino_genai_windows_2024.2.0.0_x86_64.zip --output openvino_genai_2024.2.0.0.zip + +macOS +++++++++++++++++++++++++++ + +.. tab-set:: + + .. tab-item:: x86, 64-bit + :sync: x86-64 + + .. code-block:: sh + + curl -L https://storage.openvinotoolkit.org/repositories/openvino_genai/packages/2024.2/macos/openvino_genai_macos_12_6_2024.2.0.0_x86_64.tar.gz --output openvino_genai_2024.2.0.0.tgz + tar -xf openvino_genai_2024.2.0.0.tgz + + .. tab-item:: ARM, 64-bit + :sync: arm-64 + + .. code-block:: sh + + curl -L https://storage.openvinotoolkit.org/repositories/openvino_genai/packages/2024.2/macos/openvino_genai_macos_11_0_2024.2.0.0_arm64.tar.gz --output openvino_genai_2024.2.0.0.tgz + tar -xf openvino_genai_2024.2.0.0.tgz + Here are the full guides: :doc:`Linux `, :doc:`Windows `, and :doc:`macOS `. -PyPI Installation -############################### - -To install the GenAI flavor of OpenVINO via PyPI, follow the standard :doc:`installation steps `, -but use the *openvino-genai* package instead of *openvino*: -.. code-block:: python - - python -m pip install openvino-genai From 78fcf9de187a6651d10819c522cfe195a22119db Mon Sep 17 00:00:00 2001 From: Ilya Lavrenov Date: Sat, 15 Jun 2024 20:44:04 +0400 Subject: [PATCH 20/31] Use ZIP cpack generator on Windows (#25042) ### Details: - *item1* - *...* ### Tickets: - *ticket-id* --- .github/workflows/job_tokenizers.yml | 16 ++-------------- cmake/developer_package/features.cmake | 6 +++++- 2 files changed, 7 insertions(+), 15 deletions(-) diff --git a/.github/workflows/job_tokenizers.yml b/.github/workflows/job_tokenizers.yml index 684abf8e026a45..fbe5b97a1ea520 100644 --- a/.github/workflows/job_tokenizers.yml +++ b/.github/workflows/job_tokenizers.yml @@ -92,15 +92,6 @@ jobs: Expand-Archive openvino_package.zip -DestinationPath "${{ env.INSTALL_DIR }}" popd - # - # Dependencies - # - - - name: Install python dependencies - run: | - # wheel packaging - python3 -m pip install -r ${{ env.OPENVINO_TOKENIZERS_REPO }}/requirements-build.txt - # # Build # @@ -109,19 +100,16 @@ jobs: if: runner.os != 'Windows' run: | source ${INSTALL_DIR}/setupvars.sh - python -m build --wheel --outdir ${EXTENSION_BUILD_DIR} ${OPENVINO_TOKENIZERS_REPO} + python -m pip wheel -v --no-deps --wheel-dir ${EXTENSION_BUILD_DIR} ${OPENVINO_TOKENIZERS_REPO} env: - CMAKE_ARGS: '-DBUILD_FAST_TOKENIZERS=OFF' CMAKE_BUILD_PARALLEL_LEVEL: '4' - CMAKE_GENERATOR: 'Unix Makefiles' - name: Build tokenizers wheel (Windows) if: runner.os == 'Windows' run: | . "${{ env.INSTALL_DIR }}/setupvars.ps1" - python3 -m build --wheel --outdir ${env:EXTENSION_BUILD_DIR} ${env:OPENVINO_TOKENIZERS_REPO} + python3 -m pip wheel -v --no-deps --wheel-dir ${env:EXTENSION_BUILD_DIR} ${env:OPENVINO_TOKENIZERS_REPO} env: - CMAKE_ARGS: '-DBUILD_FAST_TOKENIZERS=OFF' CMAKE_BUILD_PARALLEL_LEVEL: '4' # diff --git a/cmake/developer_package/features.cmake b/cmake/developer_package/features.cmake index cbe343f208f4b7..d2fdcd4cf12049 100644 --- a/cmake/developer_package/features.cmake +++ b/cmake/developer_package/features.cmake @@ -5,7 +5,11 @@ include(options) include(target_flags) -set (CPACK_GENERATOR "TGZ" CACHE STRING "Cpack generator for OpenVINO") +if(WIN32) + set (CPACK_GENERATOR "ZIP" CACHE STRING "Cpack generator for OpenVINO") +else() + set (CPACK_GENERATOR "TGZ" CACHE STRING "Cpack generator for OpenVINO") +endif() ov_dependent_option (ENABLE_LTO "Enable Link Time Optimization" OFF "LINUX;NOT ARM;CMAKE_CXX_COMPILER_VERSION VERSION_GREATER 4.9" OFF) From 020a19f5fbd54f64b0793e4ddeffcc1e455ce3db Mon Sep 17 00:00:00 2001 From: Karol Blaszczak Date: Sun, 16 Jun 2024 15:36:57 +0200 Subject: [PATCH 21/31] [DOCS] release final touches (#25034) --- .../supported-models.rst | 6 +++-- .../about-openvino/release-notes-openvino.rst | 7 +++--- docs/sphinx_setup/index.rst | 25 ++++++------------- 3 files changed, 16 insertions(+), 22 deletions(-) diff --git a/docs/articles_en/about-openvino/compatibility-and-support/supported-models.rst b/docs/articles_en/about-openvino/compatibility-and-support/supported-models.rst index 3131545954c032..aa4a2a984a3ca0 100644 --- a/docs/articles_en/about-openvino/compatibility-and-support/supported-models.rst +++ b/docs/articles_en/about-openvino/compatibility-and-support/supported-models.rst @@ -35,6 +35,8 @@ by OpenVINO may also work properly. | Note: +| The results as of June 17 2024, for OpenVINO version 2024.2. + | The validation process involves using OpenVINO, natively or as a backend, to load each model onto the designated hardware and execute inference. If no errors are reported and inference finishes, the model receives the **passed** status (indicated by a check mark in the table). @@ -43,5 +45,5 @@ by OpenVINO may also work properly. | The models come from different public model repositories, such as, OpenVINO Model Zoo, ONNX Model Zoo, Pytorch Model Zoo, and HuggingFace. -| In the precision column, optimum-intel default corresponds to FP32 for small models and INT8 - for models greater than 1B parameters. \ No newline at end of file +| In the precision column, the "optimum-intel default" label corresponds to FP32 for small + models and INT8 for models greater than 1B parameters. \ No newline at end of file diff --git a/docs/articles_en/about-openvino/release-notes-openvino.rst b/docs/articles_en/about-openvino/release-notes-openvino.rst index 989be4057b8d3a..63c7fc1cd9197a 100644 --- a/docs/articles_en/about-openvino/release-notes-openvino.rst +++ b/docs/articles_en/about-openvino/release-notes-openvino.rst @@ -35,7 +35,7 @@ What's new Python Custom Operation empowers users to implement their own specialized operations into any model. * Notebooks expansion to ensure better coverage for new models. Noteworthy notebooks added: - DynamiCrafter, YOLOv10, and Chatbot notebook with Phi-3. + DynamiCrafter, YOLOv10, Chatbot notebook with Phi-3, and QWEN2. * Broader Large Language Model (LLM) support and more model compression techniques. @@ -52,7 +52,7 @@ What's new * Model Serving Enhancements: - * OpenVINO Model Server (OVMS) now supports OpenAI-compatible API along with Continuous + * Preview: OpenVINO Model Server (OVMS) now supports OpenAI-compatible API along with Continuous Batching and PagedAttention, enabling significantly higher throughput for parallel inferencing, especially on Intel® Xeon® processors, when serving LLMs to many concurrent users. @@ -61,13 +61,14 @@ What's new * Integration of TorchServe through torch.compile OpenVINO backend for easy model deployment, provisioning to multiple instances, model versioning, and maintenance. - * Addition of the Generate API, a simplified API for text generation using large language + * Preview: addition of the Generate API, a simplified API for text generation using large language models with only a few lines of code. The API is available through the newly launched OpenVINO GenAI package. * Support for Intel Atom® Processor X Series. For more details, see :doc:`System Requirements <./release-notes-openvino/system-requirements>`. * Preview: Support for Intel® Xeon® 6 processor. + OpenVINO™ Runtime +++++++++++++++++++++++++++++ diff --git a/docs/sphinx_setup/index.rst b/docs/sphinx_setup/index.rst index f3e06b3f956f13..0c7a58e769d089 100644 --- a/docs/sphinx_setup/index.rst +++ b/docs/sphinx_setup/index.rst @@ -14,6 +14,7 @@ and on-device, in the browser or in the cloud. Check out the `OpenVINO Cheat Sheet. `__ + .. container:: :name: ov-homepage-banner @@ -24,31 +25,21 @@ Check out the `OpenVINO Cheat Sheet.
    -
  • -

    An open-source toolkit for optimizing and deploying deep learning models.

    -

    Boost your AI deep-learning inference performance!

    - Learn more +
  • +

    New Generative AI API

    +

    Generate text with LLMs in only a few lines of code!

    + Check out our guide
  • -

    Better OpenVINO integration with PyTorch!

    -

    Use PyTorch models directly, without converting them first.

    - Learn more +

    Python custom operations

    +

    Implement specialized operations for any model out of the box!

    + Learn more
  • OpenVINO via PyTorch 2.0 torch.compile()

    Use OpenVINO directly in PyTorch-native applications!

    Learn more
  • -
  • -

    Do you like Generative AI?

    -

    You will love how it performs with OpenVINO!

    - Check out our new notebooks -
  • -
  • -

    Boost your AI deep learning interface performance.

    -

    Use Intel's open-source OpenVino toolkit for optimizing and deploying deep learning models.

    - Learn more -
From be6ee87515e17ab105f2f4252f270023e6d8953c Mon Sep 17 00:00:00 2001 From: Edward Shogulin Date: Sun, 16 Jun 2024 16:54:30 +0100 Subject: [PATCH 22/31] [LPT] ReduceSum: zero point support: core update rollback (#25011) ### Details: - *[LPT] ReduceSum: zero point support* - *Original PR: https://github.com/openvinotoolkit/openvino/pull/24977* ### Tickets: - *CVS-142256* --- src/core/src/op/multiply.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/core/src/op/multiply.cpp b/src/core/src/op/multiply.cpp index 88dbd347d46edf..fa3ef518c03202 100644 --- a/src/core/src/op/multiply.cpp +++ b/src/core/src/op/multiply.cpp @@ -51,7 +51,7 @@ bool Multiply::evaluate(TensorVector& outputs, const TensorVector& inputs) const this, outputs, inputs, - OV_PP_ET_LIST(f32, f64, i8, i32, i64, u8, u32, u64), + OV_PP_ET_LIST(f32, f64, i32, i64, u32, u64), multiply::Evaluate, inputs[0].get_element_type(), inputs[0], From a84a676059f3e19d8b2470030ca8f6985e55b23d Mon Sep 17 00:00:00 2001 From: yanlan song Date: Mon, 17 Jun 2024 09:10:10 +0800 Subject: [PATCH 23/31] [GPU] fix striding in transpose case (#24836) ### Details: - For dims A, B, C, D, abcd format is expressed in strides: {B*C*D, C*D, D, 1}. abdc format would be expressed in strides the following way: {B*C*D, C*D, 1, D}. Adjust strides with B_, C_, D_ accordingly to make them bigger for certain dimensions. for example, input 1 dimension as [2,3,11,7], transposed input strides should be 231x77x1x7 ./benchdnn --matmul --engine=gpu.0 --stag=abcd ---strides=:231x77x1x7: 2x3x5x7:2x3x7x11 ### Tickets: - 142250 --------- Signed-off-by: song bell Co-authored-by: Chen Peter --- .../src/graph/impls/onednn/gemm_onednn.cpp | 9 +- .../tests/unit/test_cases/gemm_gpu_test.cpp | 157 ++++++++++++++++++ 2 files changed, 161 insertions(+), 5 deletions(-) diff --git a/src/plugins/intel_gpu/src/graph/impls/onednn/gemm_onednn.cpp b/src/plugins/intel_gpu/src/graph/impls/onednn/gemm_onednn.cpp index a9d0e93d879f95..5d6334bdc87657 100644 --- a/src/plugins/intel_gpu/src/graph/impls/onednn/gemm_onednn.cpp +++ b/src/plugins/intel_gpu/src/graph/impls/onednn/gemm_onednn.cpp @@ -114,18 +114,17 @@ struct gemm_onednn : typed_primitive_onednn_impl { if (in0_l.data_padding) { dnnl::memory::dims in0_padded_dims = onednn::convert_gemm_tensor(in0_l.get_buffer_size(), rank, batched_dims_can_be_removed); + in0_strides = onednn::get_strides(in0_padded_dims); if (prim->transpose_input0) { - std::swap(in0_padded_dims[in0_padded_dims.size() - 1], in0_padded_dims[in0_padded_dims.size() - 2]); + std::swap(in0_strides[in0_strides.size() - 1], in0_strides[in0_strides.size() - 2]); } - in0_strides = onednn::get_strides(in0_padded_dims); } if (in1_l.data_padding) { dnnl::memory::dims in1_padded_dims = onednn::convert_gemm_tensor(in1_l.get_buffer_size(), rank, batched_dims_can_be_removed); - if (prim->transpose_input1) { - std::swap(in1_padded_dims[in1_padded_dims.size() - 1], in1_padded_dims[in1_padded_dims.size() - 2]); - } in1_strides = onednn::get_strides(in1_padded_dims); + if (prim->transpose_input1) + std::swap(in1_strides[in1_strides.size() - 1], in1_strides[in1_strides.size() - 2]); } // Check whether transpose_order increase sequential or not. diff --git a/src/plugins/intel_gpu/tests/unit/test_cases/gemm_gpu_test.cpp b/src/plugins/intel_gpu/tests/unit/test_cases/gemm_gpu_test.cpp index 7b1d1b6132f568..2e4bebe8f3274d 100644 --- a/src/plugins/intel_gpu/tests/unit/test_cases/gemm_gpu_test.cpp +++ b/src/plugins/intel_gpu/tests/unit/test_cases/gemm_gpu_test.cpp @@ -2805,6 +2805,159 @@ class gemm_onednn: public ::testing::Test { ASSERT_EQ(res_lock[i], res_ref_lock[i]) << i; } } + + void test_dynamic_padding_transpose() { + tests::random_generator rg; + rg.set_seed(GET_SUITE_NAME); + + auto& engine = get_test_engine(); + + if (!engine.get_device_info().supports_immad) + return; + + const unsigned long BATCH_SIZE = 31; + const unsigned long M_SIZE = 11; + const unsigned long K_SIZE = 37; + const unsigned long N_SIZE = 49; + + auto fill_mem = [&](cldnn::memory_ptr mem, std::vector& data) { + cldnn::mem_lock mem_ptr(mem, get_test_stream()); + auto&& l = mem->get_layout(); + auto data_idx = 0; + for (cldnn::tensor::value_type b = 0; b < l.batch(); ++b) { + for (cldnn::tensor::value_type f = 0; f < l.feature(); ++f) { + for (cldnn::tensor::value_type y = 0; y < l.spatial(1); ++y) { + for (cldnn::tensor::value_type x = 0; x < l.spatial(0); ++x) { + auto tensor_coord = cldnn::tensor{{b, f, x, y}, 0}; + auto buffer_idx = l.get_linear_offset(tensor_coord); + mem_ptr[buffer_idx] = data[data_idx++]; + } + } + } + } + }; + + const auto align_size_n = 15; + + const auto aligned_n_size = align_to(N_SIZE, align_size_n); + auto padding_size_n = static_cast(aligned_n_size - N_SIZE); + + ov::Shape in1_shape = { 1, BATCH_SIZE, M_SIZE, K_SIZE }; + ov::Shape in2_shape = { 1, BATCH_SIZE, N_SIZE, K_SIZE }; + ov::Shape in1_shape_aligned = in1_shape; + ov::Shape in2_shape_aligned = { 1, BATCH_SIZE, aligned_n_size, K_SIZE }; + + tensor dyn_pad_dims_input2({0, 0, 0, 0}, 0); + dyn_pad_dims_input2 = tensor({0, 0, 0, 1}, 0); + + + auto in1_layout = layout{ {-1, -1, -1, -1}, data_types::f16, format::bfyx}; + auto in2_layout = layout{ {-1, -1, -1, -1}, data_types::f16, format::bfyx, padding({0, 0, 0, 0}, {0, 0, 0, 0}, 0.0f, dyn_pad_dims_input2)}; + + auto aligned_input2_mem = engine.allocate_memory({ov::PartialShape(in2_shape_aligned), data_types::f16, format::bfyx}); + + auto input1_mem = engine.allocate_memory({ov::PartialShape(in1_shape_aligned), data_types::f16, format::bfyx}); + + auto input2_mem = engine.reinterpret_buffer(*aligned_input2_mem, layout{ov::PartialShape(in2_shape), + data_types::f16, + format::bfyx, + padding({0, 0, 0, 0}, {0, 0, 0, padding_size_n}, 0.0f, dyn_pad_dims_input2)}); + + auto input_1_data = rg.generate_random_1d(ov::shape_size(in1_shape), -2, 2); + auto input_2_data = rg.generate_random_1d(ov::shape_size(in2_shape), -2, 2); + + fill_mem(input1_mem, input_1_data); + fill_mem(input2_mem, input_2_data); + + auto get_ref_results = [&]() { + ov::Shape in1_shape = { 1, BATCH_SIZE, M_SIZE, K_SIZE }; + ov::Shape in2_shape = { 1, BATCH_SIZE, N_SIZE, K_SIZE }; + auto in1_layout = layout{ {-1, -1, -1, -1}, data_types::f16, format::bfyx}; + auto in2_layout = layout{ {-1, -1, -1, -1}, data_types::f16, format::bfyx}; + + auto input1_mem = engine.allocate_memory(layout{ov::PartialShape(in1_shape), data_types::f16, format::bfyx}); + auto input2_mem = engine.allocate_memory(layout{ov::PartialShape(in2_shape), data_types::f16, format::bfyx}); + + fill_mem(input1_mem, input_1_data); + fill_mem(input2_mem, input_2_data); + + topology topology; + topology.add(input_layout("input1", in1_layout), + input_layout("input2", in2_layout), + gemm("gemm_ref", { input_info("input1"), input_info("input2") }, data_types::f16, false, true, 1.0f, 0.0f, 4, 4), + permute("permute", input_info("gemm_ref"), {0, 2, 1, 3}), + reorder("reorder", input_info("permute"), format::bfyx, data_types::f32) + ); + + ov::intel_gpu::ImplementationDesc gemm_impl = { format::bfyx, std::string(""), impl_types::onednn }; + ExecutionConfig cfg{ ov::intel_gpu::queue_type(QueueTypes::in_order), + ov::intel_gpu::force_implementations(ov::intel_gpu::ImplForcingMap{ {"gemm", gemm_impl} }), + ov::intel_gpu::optimize_data(true), + ov::intel_gpu::allow_new_shape_infer(true) }; + + network network(engine, topology, cfg); + network.set_input_data("input1", input1_mem); + network.set_input_data("input2", input2_mem); + + auto outputs = network.execute(); + OPENVINO_ASSERT(outputs.size() == 1); + OPENVINO_ASSERT(outputs.begin()->first == "reorder"); + + auto inst = network.get_primitive("reorder"); + + auto output_mem = outputs.at("reorder").get_memory(); + auto output_layout = outputs.at("reorder").get_layout(); + + return engine.reinterpret_buffer(*output_mem, output_layout); + }; + + topology topology; + topology.add(input_layout("input1", in1_layout), + input_layout("input2", in2_layout), + gemm("gemm", { input_info("input1"), input_info("input2") }, data_types::f16, false, true, 1.0f, 0.0f, 4, 4), + permute("permute", input_info("gemm"), {0, 2, 1, 3}), + reorder("reorder", input_info("permute"), format::bfyx, data_types::f32) + ); + + ov::intel_gpu::ImplementationDesc gemm_impl = { format::bfyx, std::string(""), impl_types::onednn }; + ExecutionConfig cfg{ ov::intel_gpu::queue_type(QueueTypes::in_order), + ov::intel_gpu::force_implementations(ov::intel_gpu::ImplForcingMap{ {"gemm", gemm_impl} }), + ov::intel_gpu::optimize_data(true), + ov::intel_gpu::allow_new_shape_infer(true) }; + network network(engine, topology, cfg); + network.set_input_data("input1", input1_mem); + network.set_input_data("input2", input2_mem); + + auto outputs = network.execute(); + + auto output_mem = outputs.at("reorder").get_memory(); + auto output_layout = outputs.at("reorder").get_layout(); + + auto res = engine.reinterpret_buffer(*output_mem, output_layout); + + auto ref_res = get_ref_results(); + + mem_lock res_lock(res, get_test_stream()); + mem_lock res_ref_lock(ref_res, get_test_stream()); + for (size_t i = 0; i < res->count(); i++) { + ASSERT_EQ(res_lock[i], res_ref_lock[i]) << i; + } + + // WA: Call wait_all() to wait for all queued kernels compilation finish + network.get_program()->get_compilation_context().wait_all(); + auto outputs_onednn = network.execute(); + + auto output_mem_onednn = outputs_onednn.at("reorder").get_memory(); + auto output_layout_onednn = outputs_onednn.at("reorder").get_layout(); + + auto res_onednn = engine.reinterpret_buffer(*output_mem_onednn, output_layout_onednn); + + mem_lock res_lock_onednn(res_onednn, get_test_stream()); + for (size_t i = 0; i < res->count(); i++) { + ASSERT_EQ(res_lock_onednn[i], res_ref_lock[i]) << i; + } + + } }; TEST_F(gemm_onednn, impl_replacement_with_cldnn) { @@ -2828,6 +2981,10 @@ TEST_F(gemm_onednn, dynamic_padding_n_dim_only) { this->test_dynamic_padding(true); } +TEST_F(gemm_onednn, dynamic_padding_input_transpose) { + this->test_dynamic_padding_transpose(); +} + template class GemmBaseOneDNNTest : public ::GemmBaseTest { public: From 68a8277450179fae0fe082614067c7df1a1a4187 Mon Sep 17 00:00:00 2001 From: Taylor Yeonbok Lee Date: Mon, 17 Jun 2024 14:40:18 +0900 Subject: [PATCH 24/31] [GPU] Fix random error in KV Cache test of changing batch (#25043) ### Details: - skip random error in KV Cache test (This is to fix original test, no new test needed) ### Tickets: - 142899 --- src/plugins/intel_gpu/src/graph/primitive_inst.cpp | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/plugins/intel_gpu/src/graph/primitive_inst.cpp b/src/plugins/intel_gpu/src/graph/primitive_inst.cpp index 65acce7e967aa1..61dc8cfa72195b 100644 --- a/src/plugins/intel_gpu/src/graph/primitive_inst.cpp +++ b/src/plugins/intel_gpu/src/graph/primitive_inst.cpp @@ -1033,9 +1033,8 @@ void primitive_inst::do_runtime_in_place_kv_cache() { auto& present_layout = _impl_params->output_layouts[0]; const auto& sequence_axis = desc->concat_axis; const auto& gather_axis = desc->gather_axis; - - const auto& prev_batch_size = static_cast(past_layout.get_shape()[gather_axis]); - const auto& beam_size = static_cast(present_layout.get_shape()[gather_axis]); + const auto prev_batch_size = static_cast(past_layout.get_shape()[gather_axis]); + const auto beam_size = static_cast(present_layout.get_shape()[gather_axis]); if (prev_batch_size != beam_size) { // If the previous batch size is not same as beam size, need explicit concat _impl_params->_can_be_optimized = false; From c764511727f03929ef4c6415c9b62ff233c6ec6b Mon Sep 17 00:00:00 2001 From: Andrew Kwangwoong Park Date: Mon, 17 Jun 2024 14:56:32 +0900 Subject: [PATCH 25/31] [GPU] Add axis attribute to crop for VariadicSplit and Split dynamic support (#24999) ### Details: - Add axis attribute to crop for `VariadicSplit` and `Split` dynamic support - This attribute is required to apply dynamic padding by `prepare_buffer_fusing` opt pass at build time ### Tickets: - 143096 --------- Signed-off-by: Andrew Park --- .../include/intel_gpu/primitives/crop.hpp | 12 ++++++-- src/plugins/intel_gpu/src/graph/crop.cpp | 30 ++++++++++++------- src/plugins/intel_gpu/src/plugin/ops/rnn.cpp | 6 ++-- .../intel_gpu/src/plugin/ops/split.cpp | 10 +++++-- .../tests/unit/shape_infer/crop_si_test.cpp | 19 +++++++++++- .../tests/unit/test_cases/crop_gpu_test.cpp | 14 +++++---- 6 files changed, 67 insertions(+), 24 deletions(-) diff --git a/src/plugins/intel_gpu/include/intel_gpu/primitives/crop.hpp b/src/plugins/intel_gpu/include/intel_gpu/primitives/crop.hpp index 909f4c8a83f1f0..abe6d287bd41a9 100644 --- a/src/plugins/intel_gpu/include/intel_gpu/primitives/crop.hpp +++ b/src/plugins/intel_gpu/include/intel_gpu/primitives/crop.hpp @@ -104,6 +104,7 @@ struct crop : public primitive_base { /// @param reference_input Reference input tensor with the required dimensions. /// @param offsets Input offsets. /// @param output_idx Output data index of splited output. + /// @param axis Axis along data to split. /// @param num_splits The number of pieces that the data tensor should be split into. crop(const primitive_id& id, const std::vector& inputs, @@ -111,10 +112,11 @@ struct crop : public primitive_base { const tensor& offsets, const crop_ngraph_op_mode op_mode, const int output_idx, + const int64_t axis = -1, const size_t num_splits = 1, const padding& output_padding = padding()) - : primitive_base(id, inputs, {output_padding}), reference_input(reference_input), - offsets(offsets), output_idx(output_idx), num_splits(num_splits), op_mode(op_mode) {} + : primitive_base(id, inputs, {output_padding}), reference_input(reference_input), offsets(offsets), + output_idx(output_idx), axis(axis), num_splits(num_splits), op_mode(op_mode) {} /// @brief Reference input tensor with the required dimensions. tensor reference_input; @@ -122,6 +124,8 @@ struct crop : public primitive_base { tensor offsets; /// @brief data index of splited output. int output_idx = 0; + /// @brief axis along data to split + int64_t axis = -1; /// @brief num_splits which Split has number of split as property size_t num_splits = 1; /// @brief original ngraph operation type @@ -132,6 +136,7 @@ struct crop : public primitive_base { seed = hash_combine(seed, reference_input.hash()); seed = hash_combine(seed, offsets.hash()); seed = hash_combine(seed, output_idx); + seed = hash_combine(seed, axis); seed = hash_combine(seed, num_splits); seed = hash_combine(seed, op_mode); return seed; @@ -146,6 +151,7 @@ struct crop : public primitive_base { return reference_input == rhs_casted.reference_input && offsets == rhs_casted.offsets && output_idx == rhs_casted.output_idx && + axis == rhs_casted.axis && num_splits == rhs_casted.num_splits && op_mode == rhs_casted.op_mode; } @@ -155,6 +161,7 @@ struct crop : public primitive_base { ob << reference_input; ob << offsets; ob << output_idx; + ob << axis; ob << num_splits; ob << make_data(&op_mode, sizeof(crop_ngraph_op_mode)); } @@ -164,6 +171,7 @@ struct crop : public primitive_base { ib >> reference_input; ib >> offsets; ib >> output_idx; + ib >> axis; ib >> num_splits; ib >> make_data(&op_mode, sizeof(crop_ngraph_op_mode)); } diff --git a/src/plugins/intel_gpu/src/graph/crop.cpp b/src/plugins/intel_gpu/src/graph/crop.cpp index ade00e32152eb9..1a95f56b91ded9 100644 --- a/src/plugins/intel_gpu/src/graph/crop.cpp +++ b/src/plugins/intel_gpu/src/graph/crop.cpp @@ -45,7 +45,7 @@ std::vector crop_inst::calc_output_layouts(const crop_node& /*node*/, co "Output data type forcing is not supported for crop_node!"); auto desc = impl_param.typed_desc(); - const auto in_layout = impl_param.get_input_layout(); + const auto in_layout = impl_param.get_input_layout(0); std::vector output_shapes = {ShapeType()}; std::vector input_shapes = { impl_param.input_layouts[0].get(), @@ -53,16 +53,21 @@ std::vector crop_inst::calc_output_layouts(const crop_node& /*node*/, co for (size_t i = 1; i < impl_param.input_layouts.size(); ++i) { input_shapes.push_back(impl_param.input_layouts[i].get()); } + int64_t axis = desc->axis; // TODO: calling shape_infer for all cropped outpus is redundant... Need to optimize. if (desc->op_mode == cldnn::crop_ngraph_op_mode::variadic_split) { std::unordered_map const_data; - OPENVINO_ASSERT(impl_param.memory_deps.count(1) > 0, "[GPU] Can't find Crop(ngraph VariadicSplit op mode) axis values memory dependency"); - auto axis_values_mem = impl_param.memory_deps.at(1); - cldnn::mem_lock axis_values_mem_lock(axis_values_mem, impl_param.get_stream()); - const_data.emplace(1, make_tensor(axis_values_mem->get_layout(), axis_values_mem_lock.data())); - + // If axis is negative value, it's not nomralized axis value, so it's non-constant input + if (axis < 0) { + OPENVINO_ASSERT(impl_param.memory_deps.count(1) > 0, "[GPU] Can't find Crop(ngraph VariadicSplit op mode) axis values memory dependency"); + auto axis_values_mem = impl_param.memory_deps.at(1); + cldnn::mem_lock axis_values_mem_lock(axis_values_mem, impl_param.get_stream()); + const_data.emplace(1, make_tensor(axis_values_mem->get_layout(), axis_values_mem_lock.data())); + } else { + const_data.emplace(1, ov::Tensor(ov::element::i64, ov::Shape{}, static_cast(&axis))); + } if (impl_param.memory_deps.count(2) > 0) { auto split_length_mem = impl_param.memory_deps.at(2); cldnn::mem_lock split_length_mem_lock(split_length_mem, impl_param.get_stream()); @@ -79,10 +84,15 @@ std::vector crop_inst::calc_output_layouts(const crop_node& /*node*/, co } else if (desc->op_mode == cldnn::crop_ngraph_op_mode::split) { std::unordered_map const_data; - OPENVINO_ASSERT(impl_param.memory_deps.count(1) > 0, "[GPU] Can't find Crop(ngraph Split op mode) axis values memory dependency"); - auto axis_values_mem = impl_param.memory_deps.at(1); - cldnn::mem_lock axis_values_mem_lock(axis_values_mem, impl_param.get_stream()); - const_data.emplace(1, make_tensor(axis_values_mem->get_layout(), axis_values_mem_lock.data())); + // If axis is negative value, it's not nomralized axis value, so it's non-constant input + if (axis < 0) { + OPENVINO_ASSERT(impl_param.memory_deps.count(1) > 0, "[GPU] Can't find Crop(ngraph Split op mode) axis values memory dependency"); + auto axis_values_mem = impl_param.memory_deps.at(1); + cldnn::mem_lock axis_values_mem_lock(axis_values_mem, impl_param.get_stream()); + const_data.emplace(1, make_tensor(axis_values_mem->get_layout(), axis_values_mem_lock.data())); + } else { + const_data.emplace(1, ov::Tensor(ov::element::i64, ov::Shape{}, static_cast(&axis))); + } ov::op::v1::Split op; op.set_friendly_name(desc->id); diff --git a/src/plugins/intel_gpu/src/plugin/ops/rnn.cpp b/src/plugins/intel_gpu/src/plugin/ops/rnn.cpp index dec429b6c0496e..713e24fe7571bd 100644 --- a/src/plugins/intel_gpu/src/plugin/ops/rnn.cpp +++ b/src/plugins/intel_gpu/src/plugin/ops/rnn.cpp @@ -132,7 +132,7 @@ static void CreateLSTMCellOp(ProgramBuilder& p, const std::shared_ptr lock{data_mem, stream}; auto buf = lock.data(); - const size_t axis = 1; + const int64_t axis = 1; std::memcpy(&buf[0], &axis, constLayout.bytes_count()); p.add_primitive(*op, cldnn::data(outputDataID, data_mem)); @@ -141,7 +141,7 @@ static void CreateLSTMCellOp(ProgramBuilder& p, const std::shared_ptrget_output_partial_shape(0)), {layerName}); @@ -152,7 +152,7 @@ static void CreateLSTMCellOp(ProgramBuilder& p, const std::shared_ptrget_output_partial_shape(1))); } else { diff --git a/src/plugins/intel_gpu/src/plugin/ops/split.cpp b/src/plugins/intel_gpu/src/plugin/ops/split.cpp index fc323033be94a9..b36cef6fc079fa 100644 --- a/src/plugins/intel_gpu/src/plugin/ops/split.cpp +++ b/src/plugins/intel_gpu/src/plugin/ops/split.cpp @@ -4,7 +4,8 @@ #include "intel_gpu/plugin/program_builder.hpp" #include "intel_gpu/plugin/common_utils.hpp" - +#include "openvino/core/validation_util.hpp" +#include "openvino/op/constant.hpp" #include "openvino/op/split.hpp" #include "openvino/op/variadic_split.hpp" @@ -57,6 +58,11 @@ static void CreateCommonSplitOp(ProgramBuilder& p, const std::shared_ptr(op->get_input_node_shared_ptr(1)); + if (const_axis) { + axis = ov::util::normalize_axis(op.get(), const_axis->cast_vector()[0], op->get_input_partial_shape(0).rank()); + } cldnn::crop_ngraph_op_mode op_mode = cldnn::crop_ngraph_op_mode::variadic_split; auto num_splits = static_cast(1); if (ov::is_type(op)) { @@ -69,13 +75,13 @@ static void CreateCommonSplitOp(ProgramBuilder& p, const std::shared_ptr(i), + axis, num_splits); p.add_primitive(*op, cropPrim); } diff --git a/src/plugins/intel_gpu/tests/unit/shape_infer/crop_si_test.cpp b/src/plugins/intel_gpu/tests/unit/shape_infer/crop_si_test.cpp index 8141dfbeeeb808..103d62525f4003 100644 --- a/src/plugins/intel_gpu/tests/unit/shape_infer/crop_si_test.cpp +++ b/src/plugins/intel_gpu/tests/unit/shape_infer/crop_si_test.cpp @@ -22,6 +22,7 @@ struct crop_si_test_params { tensor reference_input_size; std::vector offsets; std::vector> const_values; + int64_t axis; std::vector input_layouts; std::vector expected_layouts; size_t param_num_splits; @@ -61,7 +62,7 @@ TEST_P(crop_si_test, shape_infer) { for (size_t output_idx = 0; output_idx < p.expected_layouts.size(); output_idx++) { auto prim_id = "crop.out" + std::to_string(output_idx); - auto crop_prim = std::make_shared(prim_id, input_prim_ids, p.reference_input_size, p.offsets[output_idx], op_mode, static_cast(output_idx), p.param_num_splits); + auto crop_prim = std::make_shared(prim_id, input_prim_ids, p.reference_input_size, p.offsets[output_idx], op_mode, static_cast(output_idx), p.axis, p.param_num_splits); auto& crop_node = prog.get_or_create(crop_prim); for (auto& prim : input_prims) { @@ -83,6 +84,7 @@ INSTANTIATE_TEST_SUITE_P(smoke, crop_si_test, tensor({1,1,1,1,1,1,1}), {tensor({0,0,0,0,1,1,1}),tensor({0,0,0,0,1,1,1})}, {{-1}, {1,1}}, + -1, {{{1,32,2},data_types::f32,format::bfyx}, {{},data_types::i64,format::bfyx}, {{2},data_types::i64,format::bfyx}}, {{{1,32,1},data_types::f32,format::bfyx}, {{1,32,1},data_types::f32,format::bfyx}}, 0 }, @@ -90,6 +92,7 @@ INSTANTIATE_TEST_SUITE_P(smoke, crop_si_test, tensor({1,1,1,1,1,1,1}), {tensor({0,0,0,0,1,1,1}),tensor({0,0,0,0,1,1,1})}, {{-1}, {1,1}}, + -1, {{ov::PartialShape::dynamic(),data_types::f32,format::bfyx}, {{},data_types::i64,format::bfyx}, {{2},data_types::i64,format::bfyx}}, {{ov::PartialShape::dynamic(),data_types::f32,format::bfyx}, {ov::PartialShape::dynamic(),data_types::f32,format::bfyx}}, 0 }, @@ -97,6 +100,7 @@ INSTANTIATE_TEST_SUITE_P(smoke, crop_si_test, tensor({3,1,1,1,1,1,1}), {tensor({0,0,0,0,1,1,1}),tensor({0,0,0,0,1,1,1})}, {}, + -1, {{ov::PartialShape::dynamic(),data_types::f32,format::bfyx}}, {{ov::PartialShape::dynamic(1),data_types::f32,format::bfyx}}, 0 }, @@ -104,6 +108,7 @@ INSTANTIATE_TEST_SUITE_P(smoke, crop_si_test, tensor({3,1,1,1,1,1,1}), {tensor({0,0,0,0,1,1,1}),tensor({0,0,0,0,1,1,1})}, {}, + -1, {{{4},data_types::f32,format::bfyx}}, {{{3},data_types::f32,format::bfyx}}, 0 }, @@ -111,6 +116,7 @@ INSTANTIATE_TEST_SUITE_P(smoke, crop_si_test, tensor({-1,-1,-1,-1,-1,-1,-1}), {tensor({0,0,0,0,1,1,1}),tensor({0,0,0,0,1,1,1})}, {}, + -1, {{{4,3,2,5},data_types::f32,format::bfyx}}, {{{3,2,1,4},data_types::f32,format::bfyx}}, 0 }, @@ -118,6 +124,7 @@ INSTANTIATE_TEST_SUITE_P(smoke, crop_si_test, tensor({1,1,1,1,1,1,1}), {tensor({0,0,0,0,1,1,1}),tensor({0,1,0,0,1,1,1}),tensor({0,2,0,0,1,1,1}),tensor({0,3,0,0,1,1,1})}, {{1}, {1,1,1,1}}, + 1, {{{4819,4,1,1,4},data_types::f32,format::bfzyx}, {{},data_types::i64,format::bfzyx}, {{4},data_types::i64,format::bfzyx}}, {{{4819,1,1,1,4},data_types::f32,format::bfzyx}, {{4819,1,1,1,4},data_types::f32,format::bfzyx}, {{4819,1,1,1,4},data_types::f32,format::bfzyx}, {{4819,1,1,1,4},data_types::f32,format::bfzyx}}, 0 }, @@ -125,6 +132,7 @@ INSTANTIATE_TEST_SUITE_P(smoke, crop_si_test, tensor({4507,1,1,1,1,1,1}), {tensor({0,2,0,0,1,1,1})}, {}, + -1, {{{4507,3,1,1},data_types::f32,format::bfyx}}, {{{4507,1,1,1},data_types::f32,format::bfyx}}, 0 }, @@ -132,6 +140,7 @@ INSTANTIATE_TEST_SUITE_P(smoke, crop_si_test, tensor({1,1,1,1,1,1,1}), {tensor({0,0,0,0,1,1,1}),tensor({0,0,0,0,1,1,1})}, {{2}, {11,3}}, + 2, {{{1,14,14,384},data_types::f32,format::bfyx}, {{},data_types::i64,format::bfyx}, {{2},data_types::i64,format::bfyx}}, {{{1,14,11,384},data_types::f32,format::bfyx}, {{1,14,3,384},data_types::f32,format::bfyx}}, 0 }, @@ -139,6 +148,7 @@ INSTANTIATE_TEST_SUITE_P(smoke, crop_si_test, tensor({1,1,2048,1,1,1,1}), {tensor({0,2,0,0,1,1,1})}, {}, + -1, {{{1,16,1,2048},data_types::f32,format::bfyx}}, {{{1,1,1,2048},data_types::f32,format::bfyx}}, 0 }, @@ -146,6 +156,7 @@ INSTANTIATE_TEST_SUITE_P(smoke, crop_si_test, tensor({1,1,1,1,1,1,1}), {tensor({0,0,0,0,1,1,1}),tensor({0,1320,0,0,1,1,1})}, {{1},{1320,99}}, + 1, {{{1,1419},data_types::f32,format::bfyx}, {{},data_types::i64,format::bfyx}, {{2},data_types::i64,format::bfyx}}, {{{1,1320},data_types::f32,format::bfyx}, {{1,99},data_types::f32,format::bfyx}}, 0 }, @@ -153,6 +164,7 @@ INSTANTIATE_TEST_SUITE_P(smoke, crop_si_test, tensor({1,128,2,64,1,1,1}), {tensor({0,0,8,0,1,1,1})}, {}, + -1, {{{1,128,64,10},data_types::f32,format::bfyx}}, {{{1,128,64,2},data_types::f32,format::bfyx}}, 0 }, @@ -160,6 +172,7 @@ INSTANTIATE_TEST_SUITE_P(smoke, crop_si_test, tensor({1,1,1,1,1,1,1}), {tensor({0,0,0,0,1,1,1}), tensor({0,1,0,0,1,1,1})}, {{1}}, + 1, {{{4,2},data_types::f32,format::bfyx}, {{},data_types::i64,format::bfyx}}, {{{4,1},data_types::f32,format::bfyx}, {{4,1},data_types::f32,format::bfyx}}, 2 }, @@ -167,6 +180,7 @@ INSTANTIATE_TEST_SUITE_P(smoke, crop_si_test, tensor({1,1,1,1,1,1,1}), {tensor({0,0,0,0,1,1,1}), tensor({0,0,2048,0,1,1,1})}, {{2}}, + 2, {{{5,1,4096,1},data_types::f32,format::bfyx}, {{},data_types::i64,format::bfyx}}, {{{5,1,2048,1},data_types::f32,format::bfyx}, {{5,1,2048,1},data_types::f32,format::bfyx}}, 2 }, @@ -174,6 +188,7 @@ INSTANTIATE_TEST_SUITE_P(smoke, crop_si_test, tensor({1,1400,1,1,1,1,1}), {tensor({0,100,0,0,1,1,1})}, {}, + -1, {{{1,1500,1,1},data_types::f32,format::bfyx}}, {{{1,1400,1,1},data_types::f32,format::bfyx}}, 0 }, @@ -181,6 +196,7 @@ INSTANTIATE_TEST_SUITE_P(smoke, crop_si_test, tensor({1,1,1,1,1,1,1}), {tensor({0,0,0,0,1,1,1})}, {{2},{1}}, + 2, {{{7,1,1},data_types::f32,format::bfyx}, {{},data_types::i64,format::bfyx}, {{1},data_types::i64,format::bfyx}}, {{{7,1,1},data_types::f32,format::bfyx}}, 0 }, @@ -188,6 +204,7 @@ INSTANTIATE_TEST_SUITE_P(smoke, crop_si_test, tensor({128,100,1,3,1,1,1}), {tensor({0,0,0,0,1,1,1})}, {}, + -1, {{{128,100,4},data_types::f32,format::bfyx}}, {{{128,100,3},data_types::f32,format::bfyx}}, 0 } diff --git a/src/plugins/intel_gpu/tests/unit/test_cases/crop_gpu_test.cpp b/src/plugins/intel_gpu/tests/unit/test_cases/crop_gpu_test.cpp index 849a4ec779682e..5b6b432531923a 100644 --- a/src/plugins/intel_gpu/tests/unit/test_cases/crop_gpu_test.cpp +++ b/src/plugins/intel_gpu/tests/unit/test_cases/crop_gpu_test.cpp @@ -1357,21 +1357,22 @@ TEST(crop_gpu, dynamic_in1x4x1x1_split) { auto crop_y_size = 1; auto feature_offset_1 = 0; auto feature_offset_2 = 2; + auto axis = 1; auto input_dyn_layout = layout{ ov::PartialShape{ov::Dimension(1, 10), feature_num, y_size, x_size}, data_types::f32, format::bfyx }; auto input_actual_layout = layout{ ov::PartialShape{batch_num, feature_num, y_size, x_size}, data_types::f32, format::bfyx }; auto input_mem = engine.allocate_memory(input_actual_layout); auto data_mem = engine.allocate_memory({ {}, data_types::i64, format::bfyx }); - set_values(data_mem, {1}); + set_values(data_mem, {axis}); cldnn::crop_ngraph_op_mode op_mode = cldnn::crop_ngraph_op_mode::split; size_t num_splits = 2; topology topology; topology.add(input_layout("input", input_dyn_layout)); topology.add(data("data", data_mem)); - topology.add(crop("crop1", { input_info("input"), input_info("data") }, tensor(batch(crop_batch_num), spatial(crop_x_size, crop_y_size), feature(crop_feature_num_1)), { tensor(feature(feature_offset_1), spatial(0,0),batch(0)) }, op_mode, 0, num_splits)); - topology.add(crop("crop2", { input_info("input"), input_info("data") }, tensor(batch(crop_batch_num), spatial(crop_x_size, crop_y_size), feature(crop_feature_num_2)), { tensor(feature(feature_offset_2), spatial(0,0),batch(0)) }, op_mode, 1, num_splits)); + topology.add(crop("crop1", { input_info("input"), input_info("data") }, tensor(batch(crop_batch_num), spatial(crop_x_size, crop_y_size), feature(crop_feature_num_1)), { tensor(feature(feature_offset_1), spatial(0,0),batch(0)) }, op_mode, 0, axis, num_splits)); + topology.add(crop("crop2", { input_info("input"), input_info("data") }, tensor(batch(crop_batch_num), spatial(crop_x_size, crop_y_size), feature(crop_feature_num_2)), { tensor(feature(feature_offset_2), spatial(0,0),batch(0)) }, op_mode, 1, axis, num_splits)); std::vector input_vec = { -1.0f, 2.0f, -3.0f, 4.0f }; std::vector out1 = { -1.0f, 2.0f }; @@ -1421,6 +1422,7 @@ TEST(crop_gpu, dynamic_in1x4x1x1_varaidic_split) { auto crop_y_size = 1; auto feature_offset_1 = 0; auto feature_offset_2 = 3; + auto axis = 1; auto input_dyn_layout = layout{ ov::PartialShape{ov::Dimension(1, 10), feature_num, y_size, x_size}, data_types::f32, format::bfyx }; auto input_actual_layout = layout{ ov::PartialShape{batch_num, feature_num, y_size, x_size}, data_types::f32, format::bfyx }; @@ -1434,8 +1436,8 @@ TEST(crop_gpu, dynamic_in1x4x1x1_varaidic_split) { topology.add(input_layout("input", input_dyn_layout)); topology.add(data("axis", axis_mem)); topology.add(data("splits_length", splits_length_mem)); - topology.add(crop("crop1", { input_info("input"), input_info("axis"), input_info("splits_length") }, tensor(batch(crop_batch_num), spatial(crop_x_size, crop_y_size), feature(crop_feature_num_1)), { tensor(feature(feature_offset_1), spatial(0,0),batch(0)) }, op_mode, 0)); - topology.add(crop("crop2", { input_info("input"), input_info("axis"), input_info("splits_length") }, tensor(batch(crop_batch_num), spatial(crop_x_size, crop_y_size), feature(crop_feature_num_2)), { tensor(feature(feature_offset_2), spatial(0,0),batch(0)) }, op_mode, 1)); + topology.add(crop("crop1", { input_info("input"), input_info("axis"), input_info("splits_length") }, tensor(batch(crop_batch_num), spatial(crop_x_size, crop_y_size), feature(crop_feature_num_1)), { tensor(feature(feature_offset_1), spatial(0,0),batch(0)) }, op_mode, 0, axis)); + topology.add(crop("crop2", { input_info("input"), input_info("axis"), input_info("splits_length") }, tensor(batch(crop_batch_num), spatial(crop_x_size, crop_y_size), feature(crop_feature_num_2)), { tensor(feature(feature_offset_2), spatial(0,0),batch(0)) }, op_mode, 1, axis)); std::vector input_vec = { -1.0f, 2.0f, -3.0f, 4.0f }; std::vector out1 = { -1.0f, 2.0f, -3.0f }; @@ -1443,7 +1445,7 @@ TEST(crop_gpu, dynamic_in1x4x1x1_varaidic_split) { std::vector splits_vec = {3, 1}; set_values(input_mem, input_vec); - set_values(axis_mem, {1}); + set_values(axis_mem, {axis}); set_values(splits_length_mem, splits_vec); ExecutionConfig config = get_test_default_config(engine); From 0e7313e54408ae09b4fce52dfa2c688a6b42593a Mon Sep 17 00:00:00 2001 From: "Wang, Yang" Date: Mon, 17 Jun 2024 16:26:56 +0800 Subject: [PATCH 26/31] [AUTO] Fix the crash when model is empty (#25025) ### Details: - *crash when compile_model with model path and ov::cache_dir is set* - *...* ### Tickets: - *N/A* --------- Co-authored-by: Chen Peter --- src/plugins/auto/src/auto_schedule.cpp | 10 ++-- .../functional/behavior/caching_test.cpp | 48 +++++++++++++++++++ 2 files changed, 55 insertions(+), 3 deletions(-) diff --git a/src/plugins/auto/src/auto_schedule.cpp b/src/plugins/auto/src/auto_schedule.cpp index 3de0cc9f00b871..613287af14534b 100644 --- a/src/plugins/auto/src/auto_schedule.cpp +++ b/src/plugins/auto/src/auto_schedule.cpp @@ -155,9 +155,13 @@ void AutoSchedule::init() { const auto properties = m_context->m_ov_core->create_compile_config(ov::DeviceIDParser(device).get_device_name(), device_config); - auto blobId = - ov::ModelCache::compute_hash(std::const_pointer_cast(m_context->m_model), - properties); + std::string blobId; + if (m_context->m_model) + blobId = ov::ModelCache::compute_hash( + std::const_pointer_cast(m_context->m_model), + properties); + else + blobId = ov::ModelCache::compute_hash(m_context->m_model_path, properties); std::string cached_model_path = ov::util::make_path(cache_dir, blobId + ".blob"); m_compile_context[CPU].m_is_enabled = !ov::util::file_exists(cached_model_path); LOG_DEBUG_TAG("device: %s %s cached blob: %s ", diff --git a/src/plugins/auto/tests/functional/behavior/caching_test.cpp b/src/plugins/auto/tests/functional/behavior/caching_test.cpp index 1b2df23f9c0d1c..1ef107cd59991f 100644 --- a/src/plugins/auto/tests/functional/behavior/caching_test.cpp +++ b/src/plugins/auto/tests/functional/behavior/caching_test.cpp @@ -4,6 +4,7 @@ #include "auto_func_test.hpp" #include "common_test_utils/include/common_test_utils/file_utils.hpp" +#include "openvino/pass/serialize.hpp" using namespace ov::auto_plugin::tests; @@ -74,6 +75,53 @@ TEST_F(AutoFuncTests, load_cached_model_to_actual_device_and_disable_CPU_acceler core.set_property(ov::cache_dir("")); } +TEST_F(AutoFuncTests, load_model_path_to_actual_device_and_disable_CPU_accelerating_default_startup_fallback) { + std::string filePrefix = ov::test::utils::generateTestFilePrefix(); + auto m_xml_path = filePrefix + ".xml"; + auto m_bin_path = filePrefix + ".bin"; + ov::pass::Serialize(m_xml_path, m_bin_path).run_on_model(model_cannot_batch); + core.set_property(ov::cache_dir(cache_path)); + core.set_property("MOCK_GPU", ov::device::id("test")); // device id for cache property distinguish with MOCK_CPU + { + auto compiled_model = core.compile_model(m_xml_path, + "AUTO", + {ov::device::priorities("MOCK_GPU", "MOCK_CPU"), + ov::hint::performance_mode(ov::hint::PerformanceMode::THROUGHPUT)}); + } + // No cached model for actual device + // will cache model for both actual device and CPU plugin + ASSERT_EQ(ov::test::utils::listFilesWithExt(cache_path, "blob").size(), 2); + ov::test::utils::removeFilesWithExt(cache_path, "blob"); + { + auto compiled_model = core.compile_model( + m_xml_path, + "AUTO", + {ov::device::priorities("MOCK_GPU"), ov::hint::performance_mode(ov::hint::PerformanceMode::THROUGHPUT)}); + } + { + auto compiled_model = core.compile_model(m_xml_path, + "AUTO", + {ov::device::priorities("MOCK_GPU", "MOCK_CPU"), + ov::hint::performance_mode(ov::hint::PerformanceMode::THROUGHPUT)}); + } + // cached model exists for actual device + // will reuse cached model for actual device without CPU accelerating(No cached model for CPU) + ASSERT_EQ(ov::test::utils::listFilesWithExt(cache_path, "blob").size(), 1); + + core.set_property("MOCK_GPU", ov::device::id("test_regenerate")); + { + auto compiled_model = core.compile_model(m_xml_path, + "AUTO", + {ov::device::priorities("MOCK_GPU", "MOCK_CPU"), + ov::hint::performance_mode(ov::hint::PerformanceMode::THROUGHPUT)}); + } + // model hash id changed for actual device + // will cache model for both actual device and CPU as accelerator + ASSERT_EQ(ov::test::utils::listFilesWithExt(cache_path, "blob").size(), 3); + core.set_property(ov::cache_dir("")); + ov::test::utils::removeIRFiles(m_xml_path, m_bin_path); +} + TEST_F(AutoFuncTests, load_cached_model_to_actual_device_and_disable_CPU_accelerating_set_startup_fallback) { core.set_property(ov::cache_dir(cache_path)); core.set_property("MOCK_GPU", ov::device::id("test")); // device id for cache property distinguish with MOCK_CPU From e6e423caaf13ab74debb9f0defa6d6d2a4fcd21d Mon Sep 17 00:00:00 2001 From: Nesterov Alexander Date: Mon, 17 Jun 2024 11:58:54 +0200 Subject: [PATCH 27/31] [CPU][ARM] Remove skip tests for transpose (#25035) ### Details: - Run tests 1000 times and can't reproduce it ### Tickets: - CVS-123019 --- .../functional/shared_tests_instances/skip_tests_config.cpp | 4 ---- 1 file changed, 4 deletions(-) diff --git a/src/plugins/intel_cpu/tests/functional/shared_tests_instances/skip_tests_config.cpp b/src/plugins/intel_cpu/tests/functional/shared_tests_instances/skip_tests_config.cpp index 94b9331b6bbe3d..048c6e306fcfe1 100644 --- a/src/plugins/intel_cpu/tests/functional/shared_tests_instances/skip_tests_config.cpp +++ b/src/plugins/intel_cpu/tests/functional/shared_tests_instances/skip_tests_config.cpp @@ -354,10 +354,6 @@ std::vector disabledTestPatterns() { retVector.emplace_back(R"(smoke_NegativeQuantizedMatMulMultiplyFusion.*)"); // int8 specific retVector.emplace_back(R"(smoke_Quantized.*)"); - - // Issue: 123019 - retVector.emplace_back(R"(smoke_staticShapes4D.*INFERENCE_PRECISION_HINT=f16.*)"); - retVector.emplace_back(R"(smoke_dynamicShapes4D.*INFERENCE_PRECISION_HINT=f16.*)"); // Issue: 124309 retVector.emplace_back(R"(.*InferRequestPreprocessConversionTest.*oLT=NHWC.*)"); retVector.emplace_back(R"(.*smoke_NoReshape/OVCompiledModelGraphUniqueNodeNamesTest.CheckUniqueNodeNames.*)"); From 85910aca5c6ee84f1dd23504a15b5caf7af8ccf9 Mon Sep 17 00:00:00 2001 From: Karol Blaszczak Date: Mon, 17 Jun 2024 12:25:27 +0200 Subject: [PATCH 28/31] [DOCS] relnotes tiny tweak and some more (#25066) --- .../about-openvino/release-notes-openvino.rst | 8 ++++---- .../install-openvino/install-openvino-docker-linux.rst | 9 +++++---- docs/sphinx_setup/index.rst | 6 +++--- 3 files changed, 12 insertions(+), 11 deletions(-) diff --git a/docs/articles_en/about-openvino/release-notes-openvino.rst b/docs/articles_en/about-openvino/release-notes-openvino.rst index 63c7fc1cd9197a..89d983941ff6f4 100644 --- a/docs/articles_en/about-openvino/release-notes-openvino.rst +++ b/docs/articles_en/about-openvino/release-notes-openvino.rst @@ -234,10 +234,10 @@ Known Issues | **Component: TBB** | ID: TBB-1400/ TBB-1401 | Description: -| In 2024.2, oneTBB 2021.2.x is used for Intel Distribution OpenVINO Ubuntu and Red Hat - archives, instead of system TBB/oneTBB, which improved the performance on some platforms - (EMR for example), but the latency of some models drop on SPR, user can build OpenVINO with - **-DSYSTEM_TBB=ON** to get better latency performance for these models. +| In 2024.2, oneTBB 2021.2.x is used for Intel Distribution of OpenVINO Ubuntu and Red Hat + archives, instead of system TBB/oneTBB. This improves performance on the new generation of + Xeon platforms but may increase latency of some models on the previous generation. You can + build OpenVINO with **-DSYSTEM_TBB=ON** to get better latency performance for these models. | **Component: python API** | ID: CVS-141744 diff --git a/docs/articles_en/get-started/install-openvino/install-openvino-docker-linux.rst b/docs/articles_en/get-started/install-openvino/install-openvino-docker-linux.rst index 6aa5240098da10..7ebb7c75115b31 100644 --- a/docs/articles_en/get-started/install-openvino/install-openvino-docker-linux.rst +++ b/docs/articles_en/get-started/install-openvino/install-openvino-docker-linux.rst @@ -1,9 +1,6 @@ -.. {#openvino_docs_install_guides_installing_openvino_docker} - Install Intel® Distribution of OpenVINO™ toolkit from a Docker Image ======================================================================= - .. meta:: :description: Learn how to use a prebuilt Docker image or create an image manually to install OpenVINO™ Runtime on Linux and Windows operating systems. @@ -42,10 +39,14 @@ To start using Dockerfiles the following conditions must be met: OpenVINO's `Docker `__ and :doc:`Bare Metal <../install-openvino>` distributions are identical, so the documentation applies to both. + Note that starting with OpenVINO 2024.4, Ubuntu docker images will no longer be provided + and will be replaced by Debian-based ones. + .. note:: OpenVINO development environment in a docker container is also available in the - `notebook repository `__. It can be implemented in + `notebook repository `__. + It can be implemented in `OpenShift RedHat OpenData Science (RHODS) `__. More information about Docker CI for Intel® Distribution of OpenVINO™ toolset can be found diff --git a/docs/sphinx_setup/index.rst b/docs/sphinx_setup/index.rst index 0c7a58e769d089..d1b1dc7aa734fa 100644 --- a/docs/sphinx_setup/index.rst +++ b/docs/sphinx_setup/index.rst @@ -31,9 +31,9 @@ Check out the `OpenVINO Cheat Sheet. Check out our guide
  • -

    Python custom operations

    -

    Implement specialized operations for any model out of the box!

    - Learn more +

    Improved model serving

    +

    OpenVINO Model Server has improved parallel inferencing!

    + Learn more
  • OpenVINO via PyTorch 2.0 torch.compile()

    From 2f157d53a288995f481fe64b08a40851932c3de7 Mon Sep 17 00:00:00 2001 From: Andrei Kashchikhin Date: Mon, 17 Jun 2024 13:27:24 +0100 Subject: [PATCH 29/31] [CI] [GHA] Unskip `ov_subgraphs_dumper_tests` in Sanitizer workflow, fix dependency issue (#24926) ### Tickets: - *134419* - *134423* --- .github/workflows/linux_sanitizers.yml | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/.github/workflows/linux_sanitizers.yml b/.github/workflows/linux_sanitizers.yml index fb298026f4b473..1015c8d48a3f21 100644 --- a/.github/workflows/linux_sanitizers.yml +++ b/.github/workflows/linux_sanitizers.yml @@ -35,8 +35,8 @@ jobs: include: - SANITIZER: 'AddressAndLeak' SANITIZER_CMAKE_OPTION: '-DENABLE_SANITIZER=ON' - - SANITIZER: 'UndefinedBehavior' - SANITIZER_CMAKE_OPTION: '-DENABLE_UB_SANITIZER=ON' +# - SANITIZER: 'UndefinedBehavior' # Ticket: 144163 +# SANITIZER_CMAKE_OPTION: '-DENABLE_UB_SANITIZER=ON' # - SANITIZER: 'Thread' # Problems with protobuf # SANITIZER_CMAKE_OPTION: '-DENABLE_THREAD_SANITIZER=ON' env: @@ -135,7 +135,6 @@ jobs: -DENABLE_NCC_STYLE=OFF \ -DENABLE_TESTS=ON \ -DENABLE_STRICT_DEPENDENCIES=OFF \ - -DENABLE_SYSTEM_TBB=ON \ -DENABLE_SYSTEM_OPENCL=ON \ -DCMAKE_VERBOSE_MAKEFILE=ON \ -DCPACK_GENERATOR=TGZ \ @@ -360,7 +359,7 @@ jobs: --gtest_output=xml:${INSTALL_TEST_DIR}/TEST-TensorFlowLiteFrontend.xml - name: Transformations func tests - if: always() + if: ${{ 'false' }} # Ticket: 143900 run: | source ${INSTALL_DIR}/setupvars.sh @@ -389,7 +388,7 @@ jobs: --gtest_output=xml:${INSTALL_TEST_DIR}/TEST-CPUUnitTests.xml - name: ov_subgraphs_dumper_tests tests - if: ${{ 'false' }} # Ticket: 134419 + if: always() run: | source ${INSTALL_DIR}/setupvars.sh ${INSTALL_TEST_DIR}/ov_subgraphs_dumper_tests --gtest_print_time=1 \ From 75440d765c430889a6adb11e8f3f196f8575b4ff Mon Sep 17 00:00:00 2001 From: Vishniakov Nikolai Date: Mon, 17 Jun 2024 16:26:44 +0200 Subject: [PATCH 30/31] [OV JS] Add human-pose-estimation sample (#24616) ### Details: - Add human-pose-estimation sample for js bindings ### Tickets: - 141204 --- .github/dependency_review.yml | 2 + samples/js/node/README.md | 9 +- ...ello-detection.nnb => hello-detection.nnb} | 0 ...egmentation.nnb => hello-segmentation.nnb} | 0 .../{001-hello-world.nnb => hello-world.nnb} | 0 samples/js/node/notebooks/pose-estimation.nnb | 133 +++++ ...n-answering.nnb => question-answering.nnb} | 0 samples/js/node/package-lock.json | 525 ++++++++++++++++++ samples/js/node/package.json | 1 + 9 files changed, 666 insertions(+), 4 deletions(-) rename samples/js/node/notebooks/{004-hello-detection.nnb => hello-detection.nnb} (100%) rename samples/js/node/notebooks/{003-hello-segmentation.nnb => hello-segmentation.nnb} (100%) rename samples/js/node/notebooks/{001-hello-world.nnb => hello-world.nnb} (100%) create mode 100644 samples/js/node/notebooks/pose-estimation.nnb rename samples/js/node/notebooks/{213-question-answering.nnb => question-answering.nnb} (100%) diff --git a/.github/dependency_review.yml b/.github/dependency_review.yml index 7a1b3a4386a9da..11639f4d2d4b22 100644 --- a/.github/dependency_review.yml +++ b/.github/dependency_review.yml @@ -3,8 +3,10 @@ allow-licenses: - 'BSD-2-Clause' - 'BSD-3-Clause' - 'BSD-2-Clause AND BSD-3-Clause' + - 'BSD-3-Clause AND BSD-3-Clause-Clear' - 'MIT' - 'Apache-2.0' + - 'Apache-2.0 AND BSD-3-Clause' - 'ISC' - 'Apache-2.0 AND MIT' - 'BlueOak-1.0.0' diff --git a/samples/js/node/README.md b/samples/js/node/README.md index f0b18b15dd4352..d7d8563d054f47 100644 --- a/samples/js/node/README.md +++ b/samples/js/node/README.md @@ -21,10 +21,11 @@ Use [Node.js Notebooks (REPL)](https://marketplace.visualstudio.com/items?itemNa VSCode extension to run these notebook samples - ./notebooks - - 001-hello-world.nnb - - 003-hello-segmentation.nnb - - 004-hello-detection.nnb - - 213-question-answering.nnb + - hello-world.nnb + - hello-segmentation.nnb + - hello-detection.nnb + - question-answering.nnb + - pose-estimation.nnb ## See Also diff --git a/samples/js/node/notebooks/004-hello-detection.nnb b/samples/js/node/notebooks/hello-detection.nnb similarity index 100% rename from samples/js/node/notebooks/004-hello-detection.nnb rename to samples/js/node/notebooks/hello-detection.nnb diff --git a/samples/js/node/notebooks/003-hello-segmentation.nnb b/samples/js/node/notebooks/hello-segmentation.nnb similarity index 100% rename from samples/js/node/notebooks/003-hello-segmentation.nnb rename to samples/js/node/notebooks/hello-segmentation.nnb diff --git a/samples/js/node/notebooks/001-hello-world.nnb b/samples/js/node/notebooks/hello-world.nnb similarity index 100% rename from samples/js/node/notebooks/001-hello-world.nnb rename to samples/js/node/notebooks/hello-world.nnb diff --git a/samples/js/node/notebooks/pose-estimation.nnb b/samples/js/node/notebooks/pose-estimation.nnb new file mode 100644 index 00000000000000..6ca358ed2b0cf4 --- /dev/null +++ b/samples/js/node/notebooks/pose-estimation.nnb @@ -0,0 +1,133 @@ +{ + "cells": [ + { + "language": "markdown", + "source": [ + "# Human Pose Estimation with OpenVINO™\n\nThis notebook demonstrates live pose estimation with OpenVINO, using the OpenPose human-pose-estimation-0001 model" + ], + "outputs": [] + }, + { + "language": "markdown", + "source": [ + "## Imports" + ], + "outputs": [] + }, + { + "language": "javascript", + "source": [ + "const path = require('node:path');\nconst { cv } = require('opencv-wasm');\nconst { display } = require('node-kernel');\nconst tf = require('@tensorflow/tfjs-node');\nconst {\n getImageData,\n displayArrayAsImage,\n arrayToImageData,\n getImageBuffer,\n transform,\n downloadFile,\n} = require('../helpers.js');\n\nconst { addon: ov } = require('openvino-node');\n" + ], + "outputs": [] + }, + { + "language": "markdown", + "source": [ + "## Download the Model" + ], + "outputs": [] + }, + { + "language": "javascript", + "source": [ + "const baseArtifactsDir = '../../assets/models';\n\nconst modelName = 'human-pose-estimation-0001';\nconst modelXMLName = `${modelName}.xml`;\nconst modelBINName = `${modelName}.bin`;\n\nconst modelXMLPath = baseArtifactsDir + '/' + modelXMLName;\n\nconst baseURL = `https://storage.openvinotoolkit.org/repositories/open_model_zoo/2022.1/models_bin/3/${modelName}/FP16-INT8/`;\n\nawait downloadFile(baseURL + modelXMLName, modelXMLName, baseArtifactsDir);\nawait downloadFile(baseURL + modelBINName, modelBINName, baseArtifactsDir);\n\nconst imgUrl = 'https://storage.openvinotoolkit.org/repositories/openvino_notebooks/data/data/image/intel_rnb.jpg';\nconst imageFilename = path.parse(imgUrl).base;\n\nawait downloadFile(imgUrl, imageFilename, '../../assets/images');\n\nconst imagePath = `../../assets/images/${imageFilename}`\n" + ], + "outputs": [ + { + "items": [ + { + "mime": "application/vnd.code.notebook.stdout", + "value": [ + "Proxy agent configured using: 'http://proxy-dmz.intel.com:911'", + "Proxy agent configured using: 'http://proxy-dmz.intel.com:911'", + "Proxy agent configured using: 'http://proxy-dmz.intel.com:911'", + "File successfully stored at '/home/nvishnya/Code/wasm-openvino/samples/js/assets/images/intel_rnb.jpg'", + "" + ] + } + ] + } + ] + }, + { + "language": "markdown", + "source": [ + "## Load the Model" + ], + "outputs": [] + }, + { + "language": "typescript", + "source": [ + "const core = new ov.Core();\nconst model = await core.readModel(modelXMLPath);\nconst compiledModel = await core.compileModel(model, 'CPU', { PERFORMANCE_HINT: 'LATENCY' });\n\nconst inputLayer = compiledModel.inputs[0];\nconst outputLayers = compiledModel.outputs;\n\nconst [height, width] = inputLayer.shape.slice(2);\n\nconst heatmapsOutputKey = 'Mconv7_stage2_L2';\n\nconst THRESHOLD = 0.3;\nconst COLOR = [0, 255, 0, 255];" + ], + "outputs": [] + }, + { + "language": "markdown", + "source": [ + "## Load an Image" + ], + "outputs": [] + }, + { + "language": "typescript", + "source": [ + "const imgData = await getImageData(imagePath);\n\nconst originalImage = cv.matFromImageData(imgData);\nconst { cols: originalWidth, rows: originalHeight } = originalImage;\n\nconst image = new cv.Mat();\ncv.cvtColor(originalImage, image, cv.COLOR_RGBA2RGB);\ncv.cvtColor(image, image, cv.COLOR_BGR2RGB);\ncv.resize(image, image, new cv.Size(width, height), cv.INTER_AREA);\n\n// NHWC to NCHW\nconst inputImage = transform(image.data, { width, height }, [0, 1, 2]);" + ], + "outputs": [] + }, + { + "language": "markdown", + "source": [ + "## Define postprocessing functions" + ], + "outputs": [] + }, + { + "language": "typescript", + "source": [ + "\n// Utility function to get the coordinates of the maximum value in a tensor\nfunction getCoords(tensor) {\n const { values, indices } = tf.topk(tensor.flatten(), 1);\n const [maxVal] = values.dataSync();\n const [maxIndex] = indices.dataSync();\n const x = maxIndex % tensor.shape[1];\n const y = Math.floor(maxIndex / tensor.shape[1]);\n\n return { x, y, confidence: maxVal };\n}\n\n// Draw keypoints on the input image\nfunction drawKeypoints(image, keypoints) {\n keypoints.forEach(keypoint => {\n if (keypoint.confidence > THRESHOLD) {\n cv.circle(image,\n new cv.Point(keypoint.x, keypoint.y),\n 2,\n COLOR,\n 3,\n );\n }\n });\n}\n\n// Draw skeleton (lines between keypoints) on the input image\nfunction drawSkeleton(image, keypoints) {\n const skeleton = [\n [1, 2], [1, 5], [2, 3], [3, 4], [5, 6], [6, 7], [1, 8], [8, 9], [9, 10],\n [1, 11], [11, 12], [12, 13], [1, 0], [0, 14], [14, 16], [0, 15], [15, 17],\n ];\n\n skeleton.forEach(([start, end]) => {\n const startPoint = keypoints[start];\n const endPoint = keypoints[end];\n\n if (startPoint.confidence > THRESHOLD\n && endPoint.confidence > THRESHOLD) {\n cv.line(image,\n new cv.Point(startPoint.x, startPoint.y),\n new cv.Point(endPoint.x, endPoint.y),\n COLOR,\n 2,\n );\n }\n });\n}\n\nfunction toTFTensor(ovTensor) {\n return tf.tensor(ovTensor.data, ovTensor.getShape());\n}" + ], + "outputs": [] + }, + { + "language": "markdown", + "source": [ + "## Do Inference" + ], + "outputs": [] + }, + { + "language": "typescript", + "source": [ + "const tensorData = new Float32Array(inputImage);\nconst tensor = new ov.Tensor(ov.element.f32, inputLayer.shape, tensorData);\n\nconst inferRequest = compiledModel.createInferRequest();\ninferRequest.setInputTensor(tensor);\nconst outputs = inferRequest.infer();\n\nconst heatmaps = outputs[heatmapsOutputKey];" + ], + "outputs": [] + }, + { + "language": "markdown", + "source": [ + "## Process result" + ], + "outputs": [] + }, + { + "language": "typescript", + "source": [ + "try {\n const outputHeatmapShape = heatmaps.getShape();\n\n // Define constants\n const numKeypoints = 18;\n const heatmapWidth = outputHeatmapShape[3];\n const heatmapHeight = outputHeatmapShape[2];\n\n // Extract keypoints from heatmaps\n let keypoints = [];\n const heatmapsTFTensors = toTFTensor(heatmaps);\n const xCoef = originalWidth / heatmapWidth;\n const yCoef = originalHeight / heatmapHeight;\n\n for (let i = 0; i < numKeypoints; i++) {\n const heatmap = heatmapsTFTensors.slice(\n [0, i, 0, 0],\n [1, 1, heatmapHeight, heatmapWidth]).squeeze();\n\n const { x, y, confidence } = getCoords(heatmap);\n\n keypoints.push({\n x: x * xCoef,\n y: y * yCoef,\n confidence,\n });\n }\n\n drawKeypoints(originalImage, keypoints);\n drawSkeleton(originalImage, keypoints);\n\n displayArrayAsImage(originalImage.data, originalWidth, originalHeight, display);\n} catch(e) {\n console.log(e);\n}" + ], + "outputs": [ + { + "items": [ + { + "mime": "image/jpeg", + "value": "data:image/jpeg;base64,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" + } + ] + } + ] + } + ] +} \ No newline at end of file diff --git a/samples/js/node/notebooks/213-question-answering.nnb b/samples/js/node/notebooks/question-answering.nnb similarity index 100% rename from samples/js/node/notebooks/213-question-answering.nnb rename to samples/js/node/notebooks/question-answering.nnb diff --git a/samples/js/node/package-lock.json b/samples/js/node/package-lock.json index a3a71bd28141ba..4173f10a1c98e5 100644 --- a/samples/js/node/package-lock.json +++ b/samples/js/node/package-lock.json @@ -9,6 +9,7 @@ "version": "1.0.0", "license": "Apache-2.0", "devDependencies": { + "@tensorflow/tfjs-node": "^4.19.0", "args": "^5.0.3", "canvas": "^2.11.2", "eslint": "^8.39.0", @@ -1710,6 +1711,297 @@ "node": ">= 8" } }, + "node_modules/@tensorflow/tfjs": { + "version": "4.20.0", + "resolved": "https://registry.npmjs.org/@tensorflow/tfjs/-/tfjs-4.20.0.tgz", + "integrity": "sha512-+ZLfJq2jyIOE2/+yKPoyD/gfy3RZypbfMrlzvBDgodTK5jnexprihhX38hxilh9HPWvWQXJqiUjKJP5ECCikrw==", + "dev": true, + "dependencies": { + "@tensorflow/tfjs-backend-cpu": "4.20.0", + "@tensorflow/tfjs-backend-webgl": "4.20.0", + "@tensorflow/tfjs-converter": "4.20.0", + "@tensorflow/tfjs-core": "4.20.0", + "@tensorflow/tfjs-data": "4.20.0", + "@tensorflow/tfjs-layers": "4.20.0", + "argparse": "^1.0.10", + "chalk": "^4.1.0", + "core-js": "3.29.1", + "regenerator-runtime": "^0.13.5", + "yargs": "^16.0.3" + }, + "bin": { + "tfjs-custom-module": "dist/tools/custom_module/cli.js" + } + }, + "node_modules/@tensorflow/tfjs-backend-cpu": { + "version": "4.20.0", + "resolved": "https://registry.npmjs.org/@tensorflow/tfjs-backend-cpu/-/tfjs-backend-cpu-4.20.0.tgz", + "integrity": "sha512-1QRQ6AqAa/VB8JOArf5nY3Dc/QQHXbfuxgdIdQhKrABEHgvlaWt2Vv696UhIlVl75YoNY+vWlCwBdGQIKYfFGw==", + "dev": true, + "dependencies": { + "@types/seedrandom": "^2.4.28", + "seedrandom": "^3.0.5" + }, + "engines": { + "yarn": ">= 1.3.2" + }, + "peerDependencies": { + "@tensorflow/tfjs-core": "4.20.0" + } + }, + "node_modules/@tensorflow/tfjs-backend-webgl": { + "version": "4.20.0", + "resolved": "https://registry.npmjs.org/@tensorflow/tfjs-backend-webgl/-/tfjs-backend-webgl-4.20.0.tgz", + "integrity": "sha512-M03fJonJGxm2u3SCzRNA2JLh0gxaAye64SEmGAXOehizowxy42l+lMsPWU8xU7r7mN6PEilBNkuKAf5YJ7Xumg==", + "dev": true, + "dependencies": { + "@tensorflow/tfjs-backend-cpu": "4.20.0", + "@types/offscreencanvas": "~2019.3.0", + "@types/seedrandom": "^2.4.28", + "seedrandom": "^3.0.5" + }, + "engines": { + "yarn": ">= 1.3.2" + }, + "peerDependencies": { + "@tensorflow/tfjs-core": "4.20.0" + } + }, + "node_modules/@tensorflow/tfjs-converter": { + "version": "4.20.0", + "resolved": "https://registry.npmjs.org/@tensorflow/tfjs-converter/-/tfjs-converter-4.20.0.tgz", + "integrity": "sha512-UJ2ntQ1TNtVHB5qGMwB0j306bs3KH1E1HKJ9Dxvrc6PUaivOV+CPKqmbidOFG5LylXeRC36JBdhe+gVT2nFHNw==", + "dev": true, + "peerDependencies": { + "@tensorflow/tfjs-core": "4.20.0" + } + }, + "node_modules/@tensorflow/tfjs-core": { + "version": "4.20.0", + "resolved": "https://registry.npmjs.org/@tensorflow/tfjs-core/-/tfjs-core-4.20.0.tgz", + "integrity": "sha512-m/cc9qDc63al9UhdbXRUYTLGfJJlhuN5tylAX/2pJMLj32c8a6ThGDJYoKzpf32n5g3MQGYLchjClDxeGdXMPQ==", + "dev": true, + "dependencies": { + "@types/long": "^4.0.1", + "@types/offscreencanvas": "~2019.7.0", + "@types/seedrandom": "^2.4.28", + "@webgpu/types": "0.1.38", + "long": "4.0.0", + "node-fetch": "~2.6.1", + "seedrandom": "^3.0.5" + }, + "engines": { + "yarn": ">= 1.3.2" + } + }, + "node_modules/@tensorflow/tfjs-core/node_modules/@types/offscreencanvas": { + "version": "2019.7.3", + "resolved": "https://registry.npmjs.org/@types/offscreencanvas/-/offscreencanvas-2019.7.3.tgz", + "integrity": "sha512-ieXiYmgSRXUDeOntE1InxjWyvEelZGP63M+cGuquuRLuIKKT1osnkXjxev9B7d1nXSug5vpunx+gNlbVxMlC9A==", + "dev": true + }, + "node_modules/@tensorflow/tfjs-data": { + "version": "4.20.0", + "resolved": "https://registry.npmjs.org/@tensorflow/tfjs-data/-/tfjs-data-4.20.0.tgz", + "integrity": "sha512-k6S8joXhoXkatcoT6mYCxBzRCsnrLfnl6xjLe46SnXO0oEEy4Vuzbmp5Ydl1uU2hHr73zL91EdAC1k8Hng/+oA==", + "dev": true, + "dependencies": { + "@types/node-fetch": "^2.1.2", + "node-fetch": "~2.6.1", + "string_decoder": "^1.3.0" + }, + "peerDependencies": { + "@tensorflow/tfjs-core": "4.20.0", + "seedrandom": "^3.0.5" + } + }, + "node_modules/@tensorflow/tfjs-layers": { + "version": "4.20.0", + "resolved": "https://registry.npmjs.org/@tensorflow/tfjs-layers/-/tfjs-layers-4.20.0.tgz", + "integrity": "sha512-SCHZH29Vyw+Y9eoaJHiaNo6yqM9vD3XCKncoczonRRywejm3FFqddg1AuWAfSE9XoNPE21o9PsknvKLl/Uh+Cg==", + "dev": true, + "peerDependencies": { + "@tensorflow/tfjs-core": "4.20.0" + } + }, + "node_modules/@tensorflow/tfjs-node": { + "version": "4.20.0", + "resolved": "https://registry.npmjs.org/@tensorflow/tfjs-node/-/tfjs-node-4.20.0.tgz", + "integrity": "sha512-pVSOlzsVqh5ck3aiNPJCltB3ASKjsLqNPvJ28lXn9Xg648U4eHDk8G47m9w4uf0FdVcWDfjPM3hDCbBZ/E2KXg==", + "dev": true, + "hasInstallScript": true, + "dependencies": { + "@mapbox/node-pre-gyp": "1.0.9", + "@tensorflow/tfjs": "4.20.0", + "adm-zip": "^0.5.2", + "google-protobuf": "^3.9.2", + "https-proxy-agent": "^2.2.1", + "progress": "^2.0.0", + "rimraf": "^2.6.2", + "tar": "^6.2.1" + }, + "engines": { + "node": ">=8.11.0" + } + }, + "node_modules/@tensorflow/tfjs-node/node_modules/@mapbox/node-pre-gyp": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@mapbox/node-pre-gyp/-/node-pre-gyp-1.0.9.tgz", + "integrity": "sha512-aDF3S3rK9Q2gey/WAttUlISduDItz5BU3306M9Eyv6/oS40aMprnopshtlKTykxRNIBEZuRMaZAnbrQ4QtKGyw==", + "dev": true, + "dependencies": { + "detect-libc": "^2.0.0", + "https-proxy-agent": "^5.0.0", + "make-dir": "^3.1.0", + "node-fetch": "^2.6.7", + "nopt": "^5.0.0", + "npmlog": "^5.0.1", + "rimraf": "^3.0.2", + "semver": "^7.3.5", + "tar": "^6.1.11" + }, + "bin": { + "node-pre-gyp": "bin/node-pre-gyp" + } + }, + "node_modules/@tensorflow/tfjs-node/node_modules/@mapbox/node-pre-gyp/node_modules/agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "dev": true, + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/@tensorflow/tfjs-node/node_modules/@mapbox/node-pre-gyp/node_modules/https-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "dev": true, + "dependencies": { + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/@tensorflow/tfjs-node/node_modules/@mapbox/node-pre-gyp/node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@tensorflow/tfjs-node/node_modules/agent-base": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-4.3.0.tgz", + "integrity": "sha512-salcGninV0nPrwpGNn4VTXBb1SOuXQBiqbrNXoeizJsHrsL6ERFM2Ne3JUSBWRE6aeNJI2ROP/WEEIDUiDe3cg==", + "dev": true, + "dependencies": { + "es6-promisify": "^5.0.0" + }, + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/@tensorflow/tfjs-node/node_modules/https-proxy-agent": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-2.2.4.tgz", + "integrity": "sha512-OmvfoQ53WLjtA9HeYP9RNrWMJzzAz1JGaSFr1nijg0PVR1JaD/xbJq1mdEIIlxGpXp9eSe/O2LgU9DJmTPd0Eg==", + "dev": true, + "dependencies": { + "agent-base": "^4.3.0", + "debug": "^3.1.0" + }, + "engines": { + "node": ">= 4.5.0" + } + }, + "node_modules/@tensorflow/tfjs-node/node_modules/https-proxy-agent/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/@tensorflow/tfjs-node/node_modules/rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "dev": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + } + }, + "node_modules/@tensorflow/tfjs/node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/@types/long": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@types/long/-/long-4.0.2.tgz", + "integrity": "sha512-MqTGEo5bj5t157U6fA/BiDynNkn0YknVdh48CMPkTSpFTVmvao5UQmm7uEF6xBEo7qIMAlY/JSleYaE6VOdpaA==", + "dev": true + }, + "node_modules/@types/node": { + "version": "20.14.2", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.14.2.tgz", + "integrity": "sha512-xyu6WAMVwv6AKFLB+e/7ySZVr/0zLCzOa7rSpq6jNwpqOrUbcACDWC+53d4n2QHOnDou0fbIsg8wZu/sxrnI4Q==", + "dev": true, + "dependencies": { + "undici-types": "~5.26.4" + } + }, + "node_modules/@types/node-fetch": { + "version": "2.6.11", + "resolved": "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-2.6.11.tgz", + "integrity": "sha512-24xFj9R5+rfQJLRyM56qh+wnVSYhyXC2tkoBndtY0U+vubqNsYXGjufB2nn8Q6gt0LrARwL6UBtMCSVCwl4B1g==", + "dev": true, + "dependencies": { + "@types/node": "*", + "form-data": "^4.0.0" + } + }, + "node_modules/@types/offscreencanvas": { + "version": "2019.3.0", + "resolved": "https://registry.npmjs.org/@types/offscreencanvas/-/offscreencanvas-2019.3.0.tgz", + "integrity": "sha512-esIJx9bQg+QYF0ra8GnvfianIY8qWB0GBx54PK5Eps6m+xTj86KLavHv6qDhzKcu5UUOgNfJ2pWaIIV7TRUd9Q==", + "dev": true + }, + "node_modules/@types/seedrandom": { + "version": "2.4.34", + "resolved": "https://registry.npmjs.org/@types/seedrandom/-/seedrandom-2.4.34.tgz", + "integrity": "sha512-ytDiArvrn/3Xk6/vtylys5tlY6eo7Ane0hvcx++TKo6RxQXuVfW0AF/oeWqAj9dN29SyhtawuXstgmPlwNcv/A==", + "dev": true + }, + "node_modules/@webgpu/types": { + "version": "0.1.38", + "resolved": "https://registry.npmjs.org/@webgpu/types/-/types-0.1.38.tgz", + "integrity": "sha512-7LrhVKz2PRh+DD7+S+PVaFd5HxaWQvoMqBbsV9fNJO1pjUs1P8bM2vQVNfk+3URTqbuTI7gkXi0rfsN0IadoBA==", + "dev": true + }, "node_modules/abbrev": { "version": "1.1.1", "dev": true, @@ -1734,6 +2026,15 @@ "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, + "node_modules/adm-zip": { + "version": "0.5.12", + "resolved": "https://registry.npmjs.org/adm-zip/-/adm-zip-0.5.12.tgz", + "integrity": "sha512-6TVU49mK6KZb4qG6xWaaM4C7sA/sgUMLy/JYMOzkcp3BvVLpW0fXDFQiIzAuxFCt/2+xD7fNIiPFAoLZPhVNLQ==", + "dev": true, + "engines": { + "node": ">=6.0" + } + }, "node_modules/agent-base": { "version": "7.1.0", "dev": true, @@ -1882,6 +2183,12 @@ "node": ">=4" } }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + "dev": true + }, "node_modules/balanced-match": { "version": "1.0.2", "dev": true, @@ -1949,6 +2256,17 @@ "node": ">=10" } }, + "node_modules/cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "dev": true, + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, "node_modules/color-convert": { "version": "2.0.1", "dev": true, @@ -1973,6 +2291,18 @@ "color-support": "bin.js" } }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dev": true, + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, "node_modules/concat-map": { "version": "0.0.1", "dev": true, @@ -1983,6 +2313,17 @@ "dev": true, "license": "ISC" }, + "node_modules/core-js": { + "version": "3.29.1", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.29.1.tgz", + "integrity": "sha512-+jwgnhg6cQxKYIIjGtAHq2nwUOolo9eoFZ4sHfUH09BLXBgxnH4gA0zEd+t+BO2cNB8idaBtZFcFTRjQJRJmAw==", + "dev": true, + "hasInstallScript": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, "node_modules/cross-spawn": { "version": "7.0.3", "dev": true, @@ -2028,6 +2369,15 @@ "dev": true, "license": "MIT" }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, "node_modules/delegates": { "version": "1.0.0", "dev": true, @@ -2057,6 +2407,30 @@ "dev": true, "license": "MIT" }, + "node_modules/es6-promise": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.8.tgz", + "integrity": "sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==", + "dev": true + }, + "node_modules/es6-promisify": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/es6-promisify/-/es6-promisify-5.0.0.tgz", + "integrity": "sha512-C+d6UdsYDk0lMebHNR4S2NybQMMngAOnOwYBQjTOiv0MkoJMP0Myw2mgpDLBcpfCmRLxyFqYhS/CfOENq4SJhQ==", + "dev": true, + "dependencies": { + "es6-promise": "^4.0.3" + } + }, + "node_modules/escalade": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz", + "integrity": "sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, "node_modules/escape-string-regexp": { "version": "4.0.0", "dev": true, @@ -2270,6 +2644,20 @@ "dev": true, "license": "ISC" }, + "node_modules/form-data": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", + "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "dev": true, + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/fs-minipass": { "version": "2.1.0", "dev": true, @@ -2316,6 +2704,15 @@ "node": ">=10" } }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true, + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, "node_modules/glob": { "version": "7.2.3", "dev": true, @@ -2360,6 +2757,12 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/google-protobuf": { + "version": "3.21.2", + "resolved": "https://registry.npmjs.org/google-protobuf/-/google-protobuf-3.21.2.tgz", + "integrity": "sha512-3MSOYFO5U9mPGikIYCzK0SaThypfGgS6bHqrUGXG3DPHCrb+txNqeEcns1W0lkGfk0rCyNXm7xB9rMxnCiZOoA==", + "dev": true + }, "node_modules/grapheme-splitter": { "version": "1.0.4", "dev": true, @@ -2544,6 +2947,12 @@ "dev": true, "license": "MIT" }, + "node_modules/long": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/long/-/long-4.0.0.tgz", + "integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==", + "dev": true + }, "node_modules/lru-cache": { "version": "6.0.0", "dev": true, @@ -2577,6 +2986,27 @@ "semver": "bin/semver.js" } }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dev": true, + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, "node_modules/mimic-response": { "version": "2.1.0", "dev": true, @@ -2821,6 +3251,15 @@ "node": ">= 0.8.0" } }, + "node_modules/progress": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, "node_modules/punycode": { "version": "2.3.0", "dev": true, @@ -2861,6 +3300,21 @@ "node": ">= 6" } }, + "node_modules/regenerator-runtime": { + "version": "0.13.11", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", + "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==", + "dev": true + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/resolve-from": { "version": "4.0.0", "dev": true, @@ -2933,6 +3387,12 @@ ], "license": "MIT" }, + "node_modules/seedrandom": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/seedrandom/-/seedrandom-3.0.5.tgz", + "integrity": "sha512-8OwmbklUNzwezjGInmZ+2clQmExQPvomqjL7LFqOYqtmuxRgQYqOD3mHaU+MvZn5FLUeVxVfQjwLZW/n/JFuqg==", + "dev": true + }, "node_modules/semver": { "version": "7.5.4", "dev": true, @@ -3005,6 +3465,12 @@ "simple-concat": "^1.0.0" } }, + "node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", + "dev": true + }, "node_modules/string_decoder": { "version": "1.3.0", "dev": true, @@ -3108,6 +3574,12 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/undici-types": { + "version": "5.26.5", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", + "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", + "dev": true + }, "node_modules/uri-js": { "version": "4.4.1", "dev": true, @@ -3157,16 +3629,69 @@ "string-width": "^1.0.2 || 2 || 3 || 4" } }, + "node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, "node_modules/wrappy": { "version": "1.0.2", "dev": true, "license": "ISC" }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true, + "engines": { + "node": ">=10" + } + }, "node_modules/yallist": { "version": "4.0.0", "dev": true, "license": "ISC" }, + "node_modules/yargs": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "dev": true, + "dependencies": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/yargs-parser": { + "version": "20.2.9", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", + "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", + "dev": true, + "engines": { + "node": ">=10" + } + }, "node_modules/yocto-queue": { "version": "0.1.0", "dev": true, diff --git a/samples/js/node/package.json b/samples/js/node/package.json index 719c9f1e22ae89..07e8f48143242a 100644 --- a/samples/js/node/package.json +++ b/samples/js/node/package.json @@ -8,6 +8,7 @@ "eslint": "^8.39.0", "https-proxy-agent": "^7.0.2", "opencv-wasm": "^4.3.0-10", + "@tensorflow/tfjs-node": "^4.19.0", "openvino-node": "file:../../../src/bindings/js/node/" }, "scripts": { From f59d42c76643310d92ea4c9eb611c00048ff4470 Mon Sep 17 00:00:00 2001 From: Alina Kladieva Date: Mon, 17 Jun 2024 17:45:08 +0200 Subject: [PATCH 31/31] [GHA] Fix condition for skip_workflow in Smart CI (#25071) --- .github/actions/smart-ci/smart_ci.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/actions/smart-ci/smart_ci.py b/.github/actions/smart-ci/smart_ci.py index 80d285da0e8d0e..1c8558f4779108 100644 --- a/.github/actions/smart-ci/smart_ci.py +++ b/.github/actions/smart-ci/smart_ci.py @@ -225,7 +225,7 @@ def main(): skip_workflow = False if is_merge_queue or (args.pr and not run_full_scope): - if args.skip_when_only_listed_labels_set: + if args.skip_when_only_listed_labels_set and changed_component_names: excepted_labels = set(args.skip_when_only_listed_labels_set.split(',')) excepted_labels_only = changed_component_names - excepted_labels == set() skip_workflow = excepted_labels_only