OpenVINO on IceLake (Vol.8)

なんだかスケートをしているようなタイトルの連載8回目、
Intelの第10世代CPU IceLakeでOpenVINOを試してみます

前回同様、使用するのはDell XPS 13 2in1、搭載されているのは下記のCPUとなります
Intel(R) Core(TM) i7-1065G7 CPU @ 1.30GHz
このCPUはGPUを内包しており、64EUのIntel Iris Plus グラフィックスが搭載されています
また実行ユニット数は、過去最大であったIntel Iris Pro Graphics 580(i7-6770HQ)の72EUにつぐ多さとなっています
メモリはDDR4-3733 16GBが搭載されています

こちらの連載、のんびりしていたらIntelからTigerLakeが正式発表されました
予想通りと言ってはなんですが、EUの数が増えて、最大96基となります
これだけで、1.3倍の処理速度向上が見込めます
またクロックがIceLakeよりも高いとのことですので、こちらも処理速度向上が見込めます
OpenVINO.jpでもTigerLakeが手に入り次第、詳しく調査したいと思います

今回は、i7-6770HQとIceLakeに搭載されているGPUを実際のベンチマークを元に比較したいと思います

ベンチマークに使用したのはいつもの通りsecurity_barrier_camera_demoでFP16のモデルを使用し、security_barrier_camera_demo に1分間のmp4を入力しました

パラメータは以下の通りですが、今回はいろいろな方の助言を受けて、-nireq, -streams, -threadsを使用しました
こちらのパラメータの意味は以下の通りです

-nireq Optional. Number of infer requests. 0 sets the number of infer requests equal to the number of inputs.

-nstreams “<integer>” Optional. Number of streams to use for inference on the CPU or/and GPU in throughput mode (for HETERO and MULTI device cases use format <device1>:<nstreams1>,<device2>:<nstreams2> or just <nstreams>)

-nthreads “<integer>” Optional. Number of threads to use for inference on the CPU (including HETERO and MULTI cases).

上記オプションに加えて、下記のコマンドにより実行しています
また、今回はGPUに負荷をかけるために、デバイス指定は全てGPUにしています

~/inference_engine_demos_build/intel64/Release/security_barrier_camera_demo -d GPU -d_va GPU -d_lpr GPU -i /opt/intel/openvino/deployment_tools/demo/test.mp4 -m /openvino_models/ir/intel/vehicle-license-plate-detection-barrier-0106/FP16/vehicle-license-plate-detection-barrier-0106.xml -m_lpr /openvino_models/ir/intel/license-plate-recognition-barrier-0001/FP16/license-plate-recognition-barrier-0001.xml -m_va /openvino_models/ir/intel/vehicle-attributes-recognition-barrier-0039/FP16/vehicle-attributes-recognition-barrier-0039.xml -no_show;

-nireq -nstreams -nthreads Core i7-6770HQ Core i7-1065G7
1 1 1 108.0 173.1 160.28%
1 1 2 110.9 177.5 160.05%
1 1 4 108.2 164.1 151.66%
1 1 8 106.0 173.6 163.77%
1 2 1 106.8 178.4 167.04%
1 2 2 108.5 159.0 146.54%
1 2 4 105.9 147.4 139.19%
1 2 8 110.1 172.0 156.22%
1 4 1 108.7 168.5 155.01%
1 4 2 107.2 178.8 166.79%
1 4 4 104.3 174.3 167.11%
1 4 8 109.1 143.9 131.90%
1 8 1 107.1 170.6 159.29%
1 8 2 106.4 161.3 151.60%
1 8 4 108.3 170.6 157.53%
1 8 8 106.3 164.5 154.75%
2 1 1 111.9 210.8 188.38%
2 1 2 110.5 174.4 157.83%
2 1 4 110.7 209.5 189.25%
2 1 8 110.9 208.9 188.37%
2 2 1 122.8 205.8 167.59%
2 2 2 124.5 202.3 162.49%
2 2 4 123.4 203.2 164.67%
2 2 8 123.7 205.3 165.97%
2 4 1 121.3 205.0 169.00%
2 4 2 122.0 205.2 168.20%
2 4 4 122.1 204.6 167.57%
2 4 8 121.9 197.3 161.85%
2 8 1 120.0 202.3 168.58%
2 8 2 119.6 196.4 164.21%
2 8 4 120.4 202.3 168.02%
2 8 8 117.5 201.6 171.57%
4 1 1 111.2 197.7 177.79%
4 1 2 110.7 209.6 189.34%
4 1 4 111.4 203.6 182.76%
4 1 8 109.8 203.4 185.25%
4 2 1 114.0 179.6 157.54%
4 2 2 113.0 176.8 156.46%
4 2 4 111.9 175.8 157.10%
4 2 8 113.3 178.0 157.11%
4 4 1 117.7 175.6 149.19%
4 4 2 116.2 176.9 152.24%
4 4 4 118.6 171.4 144.52%
4 4 8 116.4 178.0 152.92%
4 8 1 116.8 171.9 147.17%
4 8 2 117.4 174.8 148.89%
4 8 4 117.3 175.7 149.79%
4 8 8 118.0 173.9 147.37%
8 1 1 106.3 208.1 195.77%
8 1 2 110.2 209.6 190.20%
8 1 4 113.3 202.5 178.73%
8 1 8 111.3 208.7 187.51%
8 2 1 112.7 179.2 159.01%
8 2 2 116.9 182.5 156.12%
8 2 4 112.8 177.2 157.09%
8 2 8 115.1 175.7 152.65%
8 4 1 115.3 173.2 150.22%
8 4 2 116.5 174.0 149.36%
8 4 4 118.1 177.7 150.47%
8 4 8 118.6 180.5 152.19%
8 8 1 117.2 174.8 149.15%
8 8 2 118.0 178.9 151.61%
8 8 4 119.4 177.4 148.58%
8 8 8 116.4 176.4 151.55%

ということで考察は次回に続きます…

OpenVINO on IceLake (Vol.7)

なんだかスケートをしているようなタイトルの連載7回目、
Intelの第10世代CPU IceLakeでOpenVINOを試してみます

前回同様、使用するのはDell XPS 13 2in1、搭載されているのは下記のCPUとなります
Intel(R) Core(TM) i7-1065G7 CPU @ 1.30GHz
このCPUはGPUを内包しており、64EUのIntel Iris Plus グラフィックスが搭載されています
また実行ユニット数は、過去最大であったIntel Iris Pro Graphics 580(i7-6770HQ)の72EUにつぐ多さとなっています
メモリはDDR4-3733 16GBが搭載されています

前回は、GPU内部の構造を簡単に説明しました
IntelのGPUはSlice→Sub Slice→EUと言うような構成になっています
GPUの世代により改善されていますが、基本的な構成は変わっていません
詳しいお話はこちらにありますが、本サイトでは簡単に説明します

では、今回はEUを見てみましょう

上記画像はこちらからの引用

Execution Unit(EU)はIntel GPU内の最小単位となっており、ここでデータが処理されます

細かな処理はここでは省略しますが、このような構成は大量のデータに対して同じような処理を行う場合は有利に働きます(GPGPU)
OpenVINOでの処理は、推論処理となるので、フィルタ処理を行うのと同様の場合が多いため、EUのような物がたくさんあるとCPUに負荷をかけず高速に処理ができます

前回、Intel のGPUではSlice→Subslice→EUと言う構成になっていると説明しましたが、EUは下記の図のようにSubslice上に8つ搭載されています

上記画像はこちらからの引用

つまりSubsliceの数が増えれば増えるほど、EUの数はSubsliceの8倍ずつ増えることになります
IceLakeより前のCPUに搭載されているGPU(Gen9GT2)の場合、1つのSlice上にSubsliceは3つとなり、EUの合計は24となります
Gen9では最大、3SliceのGPU(Gen9GT4)があり、こちらの場合は、EUが72基搭載されています

IceLakeに搭載されているGPU(Gen11GT2)の場合ですが、1つのSlice上にSubsliceが8つ搭載されており、EUの合計は、64基となります
またSubsliceが増えたことにより、Slice上のL3キャッシュの容量も増えているので、高速化が望めると思います

また、Gen11の世代が進むと64基の2倍、3倍の数のEUが使用できる可能性がありますので、最適化をしなくても、処理速度の向上が見込めます

次回に続く…

OpenVINO on IceLake (Vol.6)

なんだかスケートをしているようなタイトルの連載6回目、
Intelの第10世代CPU IceLakeでOpenVINOを試してみます

前回同様、使用するのはDell XPS 13 2in1、搭載されているのは下記のCPUとなります
Intel(R) Core(TM) i7-1065G7 CPU @ 1.30GHz
このCPUはGPUを内包しており、64EUのIntel Iris Plus グラフィックスが搭載されています
また実行ユニット数は、過去最大であったIntel Iris Pro Graphics 580(i7-6770HQ)の72EUにつぐ多さとなっています
メモリはDDR4-3733 16GBが搭載されています

前回までで、いったんCPUのお話には区切りがつきました
次はGPUに着目したいと思います
GPUですが、IceLakeだから特別のGPUを搭載しているか?という事はなく、企業戦略や競合他社の状況によって、色々と搭載GPUを変えていますので、GPUが搭載されている歴史をみるとCPUの流れと少し違った部分が見れるかもしれません

OpenVINOではあまり注目されていない感じがするGPUですが、GPUを効率的に使用する事でコストを下げられるのではないかと思います
組み込みの分野ではGPUを使用する事が少なく(画面を出力することすらしない)、ほとんど使用されずにそのままという状況も考えられます
これをOpenVINOに使用しない手はありません

では、GPUのお話に移りましょう

SkyLakeで搭載されていたGPUはGen9という世代のGPUです
このGPUはEU(Execution Unit)という演算ユニットがSubSlice上に搭載されています
このSubSliceはSliceの上に搭載されています
IntelのGPUはこのような構成となります

次回はEUをさらに細かく見てみます

OpenVINO on IceLake (番外編)

なんだかスケートをしているようなタイトルの番外編、
いつもはIntelの第10世代CPU IceLakeでOpenVINOを試していますが、今回はMacOSを使用します

前回Dell XPS 13 2in1、搭載されているのは下記のCPU
Intel(R) Core(TM) i7-1065G7 CPU @ 1.30GHz
を使用しました
今回使用するのは、Intel(R) Core(TM) i3-8100B CPU @ 3.60GHz(開発コードはCoffee Lake)搭載のMacMini 2018を使用します

このMacにOpenVINO Toolkit 2020.3をインストールし実行をしますが、なぜMacなのでしょうか?

6/22のWWDCでAppleは今後のMac用CPUにはArmチップを載せることを発表しました(PCWatchの記事
こちらの方向性はAppleの考え方なので別に構わないのですが、OpenVINOがMacOS上でどのような扱いになるのかが気になるところです

と言うことで、現状のMacOSでのOpenVINOの動作をみてみましょう

まずはOpenVINO Toolkitのサポート状況ですが、2020.3現在でHWサポートは下記のようになっています

NOTE: The current version of the Intel® Distribution of OpenVINO™ toolkit for macOS* supports inference on Intel CPUs and Intel® Neural Compute Sticks 2 only.

OpenVINOはMacOS上ではCPUとNCS2のみのサポートとなります
次にCPUのサポート状況を実際に下記のコマンドを実行して検証してみましょう

~/inference_engine_cpp_samples_build/intel64/Release/benchmark_app -m ~/openvino_models/ir/intel/vehicle-license-plate-detection-barrier-0106/FP16/vehicle-license-plate-detection-barrier-0106.xml -i ./images/ -pc

Performance Counterの結果は下記の通りです

 148 jit_avx2_1x1_FP32
  76 jit_avx2_FP32
  64 jit_avx2_dw_FP32

この結果をみると、第4回のCometlakeで実行した結果を同じになります
それはそれで同じ結果が出るのは優秀だと思いますが、この命令をみると気づく点がありませんか?

そうです、AVX2を使用しています
AVX2を使用していると言うことは当然、Arm上では動作しません
同様にArmを使用しているRaspberryPiでのOpenVINO ToolkitはNCS2のみのサポートでした

恐らくですが、今後OpenVINO ToolkitのMacOSサポートはRaspberryPiのサポート同様、NCS2のみになると思います
IntelのGPUを使用した場合には、ひょっとするとGPUサポートも追加される可能性はありますが、今のところAppleがArm+Intel GPUの組み合わせを行う理由が見つかりません

と言うことで、AppleはIntel CPU搭載のMacを並行して販売するとのことですが、Mac好きの開発者の方は今のうちに確保しておくほうが吉かも…
また最新Macを使用してOpenVINOを開発する方は注意が必要ですね

以上、番外編でした

OpenVINO on IceLake (Vol.5)

なんだかスケートをしているようなタイトルの連載5回目、
Intelの第10世代CPU IceLakeでOpenVINOを試してみます

前回同様、使用するのはDell XPS 13 2in1、搭載されているのは下記のCPUとなります
Intel(R) Core(TM) i7-1065G7 CPU @ 1.30GHz
このCPUはGPUを内包しており、64EUのIntel Iris Plus グラフィックスが搭載されています
また実行ユニット数は、過去最大であったIntel Iris Pro Graphics 580(i7-6770HQ)の72EUにつぐ多さとなっています
メモリはDDR4-3733 16GBが搭載されています

このPCにUbuntu18.04をインストールし、OpenVINOの実行をしますが、前回に引き続き今回もCPUでの実行に注目してみましょう

INT8の場合の比較をしてみますが、使用したのは前回と同様のコマンドです

~/inference_engine_cpp_samples_build/intel64/Release/benchmark_app  -i ./images -m ~/openvino_models/ir/intel/vehicle-license-plate-detection-barrier-0106/FP16-INT8/vehicle-license-plate-detection-barrier-0106.xml -pc

こちらをIcelake,Cometlakeの双方で実行してみました

CometlakeでモデルをINT8として実行した結果(左の数値は実際に呼び出された関数の数)は、
   4 jit_avx2_FP32
 220 jit_avx2_I8
  12 jit_avx2_dw_I8

Icelakeで実行した結果は、
 148 jit_avx512_1x1_I8
   4 jit_avx512_FP32
 140 jit_avx512_I8

となり、AVXとして呼び出されている全ての関数がAVX512対応になっているようです
また、Cometlakeで呼び出されていたavx2の関数は236関数ですが、Icelakeになると、292関数となり呼び出される回数が増えています
全ての関数を調査したわけではないですが、最適化が進んでいると考えられます

またIcelakeではAVX512 VNNI(Vector Neural Network Instructions)が搭載されました
こちらの命令はCNN系の計算に非常によく使われる演算が入っていますので、この最適化が行われていると思われます
(VNNIについての詳しい演算方法は、IntelのIntrinsics Guideが詳しいです)

OpenVINO toolkitを使用している上では、AVX512系の命令が使用されているかどうかはユーザーからは判断がつきにくいです
これはPerformance Counterの結果にjitと言う名称がついているように、実行時に関数が呼ばれるJust-In-Timeと言う形式が取られているためです

ただこの方式が悪いわけではなく、実行ファイルはどのプラットフォームで動作させても良く、プラットフォームのCPUが対応している方式をライブラリ側が自動的に判別してくれる、と言う方式になっています
そのため、ユーザーが明示的にCPUを選んでコンパイルする必要がなく、ライブラリの更新とともに自動的に速くなる可能性が高いです

少し話がそれましたが、AVX512 VNNIを使用することで、レジスタサイズが倍の処理ができます
そのため、INT8の処理を行う場合でも、Cometlakeの倍の処理速度が出るのは不思議ではありません
そのため、第二回の結果のようにCometlakeに対して、1.6倍の性能差が現れたものと思われます
2倍ではなく1.6倍と言う部分が気になりますが、前述したようにINT8の場合は、AVX2と比較してAVX512を呼び出す部分が増えています
そのため、切り替えに時間がかかっているのでは?と推測しています

続く…

OpenVINO on IceLake (Vol.4)

なんだかスケートをしているようなタイトルの連載4回目、
Intelの第10世代CPU IceLakeでOpenVINOを試してみます

前回同様、使用するのはDell XPS 13 2in1、搭載されているのは下記のCPUとなります
Intel(R) Core(TM) i7-1065G7 CPU @ 1.30GHz
このCPUはGPUを内包しており、64EUのIntel Iris Plus グラフィックスが搭載されています
また実行ユニット数は、過去最大であったIntel Iris Pro Graphics 580(i7-6770HQ)の72EUにつぐ多さとなっています
メモリはDDR4-3733 16GBが搭載されています

このPCにUbuntu18.04をインストールし、OpenVINOの実行をしますが、前回に引き続き今回もCPUでの実行に注目してみましょう

比較するのはCometlake(インテル® Core™ i5-10210U プロセッサー)搭載の ノートPCとなります

前回はCometlakeとIcelake のCPUの機能の違いを比べてみましたが、実際にそれらがアプリケーションから呼ばれているかをOpenVINO toolkitにあるbenchmark_appを使用してチェックしてみましょう

ここで、security_barrier_camera_demoを使わずに最初からbenchmark_app使ったら?と言う声が聞こえてきそうですが、私が試す限りbenchmark_appではCPUの周波数が固定されてしまうようです
そのためデータの確認用に使用します

~/inference_engine_cpp_samples_build/intel64/Release/benchmark_app  -i ./images -m ~/openvino_models/ir/intel/vehicle-license-plate-detection-barrier-0106/FP16/vehicle-license-plate-detection-barrier-0106.xml -pc

このアプリケーションのオプションで-pcがありますが、こちらはPerformance countersオプションとなり、アプリケーションから呼び出しているライブラリが出力されます(下記は出力例となります)

 [ INFO ] Pefrormance counts for 0-th infer request:
 Placeholder                   NOT_RUN        layerType: Input              realTime: 0         cpu: 0               execType: unknown
 Placeholder_U8_FP32_Add_/F... EXECUTED       layerType: Reorder            realTime: 282       cpu: 282             execType: jit_uni_I8
 Add_/Fused_Add_               EXECUTED       layerType: ScaleShift         realTime: 243       cpu: 243             execType: jit_avx2_FP32
 MobilenetV2/Conv/BatchNorm... EXECUTED       layerType: Convolution        realTime: 615       cpu: 615             execType: jit_avx2_FP32
 MobilenetV2/Conv/Relu6        NOT_RUN        layerType: Clamp              realTime: 0         cpu: 0               execType: undef
 MobilenetV2/expanded_conv/... EXECUTED       layerType: Convolution        realTime: 560       cpu: 560             execType: jit_avx2_dw_FP32
 MobilenetV2/expanded_conv/... NOT_RUN        layerType: Clamp              realTime: 0         cpu: 0               execType: undef
 MobilenetV2/expanded_conv/... EXECUTED       layerType: Convolution        realTime: 592       cpu: 592             execType: jit_avx2_1x1_FP32
 MobilenetV2/expanded_conv/add NOT_RUN        layerType: Eltwise            realTime: 0         cpu: 0               execType: undef
 MobilenetV2/expanded_conv_... EXECUTED       layerType: Convolution        realTime: 2613      cpu: 2613            execType: jit_avx2_1x1_FP32
 MobilenetV2/expanded_conv_... NOT_RUN        layerType: Clamp              realTime: 0         cpu: 0               execType: undef
 MobilenetV2/expanded_conv_... EXECUTED       layerType: Convolution        realTime: 2192      cpu: 2192            execType: jit_avx2_dw_FP32
 MobilenetV2/expanded_conv_... NOT_RUN        layerType: Clamp              realTime: 0         cpu: 0               execType: undef
 MobilenetV2/expanded_conv_... EXECUTED       layerType: Convolution        realTime: 680       cpu: 680             execType: jit_avx2_1x1_FP32
 MobilenetV2/expanded_conv_... EXECUTED       layerType: Convolution        realTime: 889       cpu: 889             execType: jit_avx2_1x1_FP32 
...

CometlakeでモデルをFP16として実行した結果(左の数値は実際に呼び出された関数の数)は、
 148 jit_avx2_1x1_FP32
  76 jit_avx2_FP32
  64 jit_avx2_dw_FP32

Icelakeで実行した結果は、
   4 jit_avx2_1x1_FP32
 144 jit_avx512_1x1_FP32
  76 jit_avx512_FP32
  64 jit_avx512_dw_FP32

となっており、avx2が呼び出されていたほとんどの関数をavx512で置き換えています
これらを元にするとAVX512を使用したことが高速化につながった一つの要因だと考えられます

他の要因としては、キャッシュサイズが考えられます
Icelakeの各キャッシュは
L1d キャッシュ: 48K
L1i キャッシュ: 32K
L2 キャッシュ: 512K
L3 キャッシュ: 8192K
となり、CometlakeのL2キャッシュサイズ256K、L3キャッシュサイズの6MBを上回っていることを考えると、全体のスピードが上がる可能性が高いと考えられます

また、メモリに対するアクセス速度が変更されています
IcelakeはLPDDR4-3733 最大2チャンネルを使用し、チップの制限が無ければ29.8GB/s x 2の転送ができます
CometlakeはLPDDR4-2933 最大2チャンネルとなり、こちらもチップの制限が無ければ23.4GB/s x 2の転送ができます
双方を比較すると27%となります

次回はINT8の場合を考えてみましょう

続く…

OpenVINO on IceLake (Vol.3)

なんだかスケートをしているようなタイトルの連載3回目、
Intelの第10世代CPU IceLakeでOpenVINOを試してみます

前回同様、使用するのはDell XPS 13 2in1、搭載されているのは下記のCPUとなります
Intel(R) Core(TM) i7-1065G7 CPU @ 1.30GHz
このCPUはGPUを内包しており、64EUのIntel Iris Plus グラフィックスが搭載されています
また実行ユニット数は、過去最大であったIntel Iris Pro Graphics 580(i7-6770HQ)の72EUにつぐ多さとなっています
メモリはDDR4-3733 16GBが搭載されています

このPCにUbuntu18.04をインストールし、OpenVINOの実行をしますが、前回に引き続き今回もCPUでの実行に注目してみましょう

前回のsecurity_barrier_camera_demoのパラメータとFPSが下記となります

~/inference_engine_demos_build/intel64/Release/security_barrier_camera_demo -d CPU -d_va CPU -d_lpr CPU -i /opt/intel/openvino/deployment_tools/demo/car_1.bmp -m /openvino_models/ir/intel/vehicle-license-plate-detection-barrier-0106/FP16/vehicle-license-plate-detection-barrier-0106.xml -m_lpr /openvino_models/ir/intel/license-plate-recognition-barrier-0001/FP16/license-plate-recognition-barrier-0001.xml -m_va /openvino_models/ir/intel/vehicle-attributes-recognition-barrier-0039/FP16/vehicle-attributes-recognition-barrier-0039.xml -no_show;

FP16IcelakeCometlake※1Skylake※2
1回目85.737.331.8
2回目99.933.836.5
3回目90.538.135.8
4回目105.137.531.3
5回目107.335.435.4
6回目84.933.136.4
7回目92.138.230.2
8回目100.431.231.6
9回目105.135.736.1
10回目99.236.331.9
Average97.02 FPS35.66 FPS33.7 FPS

※1: インテル® Core™ i5-10210U プロセッサー搭載 ノートPC
※2: インテル® Core™ i7-6770HQ プロセッサー搭載 PC

理想的にCPUが動作するのであれば、Cometlakeでは最大4.2GHzでの動作、Skylakeでは最大3.5GHzの動作となるので、20%程度の差は発生します
そのため、CometlakeとSkylakeの処理速度はつじつまが合う気がします

次に、CometlakeとIcelakeの差が倍以上となっています
Icelakeは最大3.9GHzでの動作ですので、クロック自体もCometlakeの方が高くなります
ここまで違うと計測ミスの可能性もあります
そのため、CPUの違いや、この実行ファイルがどのような動きをしているか知る必要があります

Icelakeの違い

Skylake、CometlakeとIcelakeの違いはどこにあるのでしょうか?
Linuxで/proc/cpuinfoを確認してみましょう
下記はcpuinfoのflagsだけを取り出した物です
SkylakeとCometlakeには違いがほとんどありませんが、Icelakeには追加されているflagが複数あることがわかります

Skylake Cometlake Icelake
fpu fpu fpu
vme vme vme
de de de
pse pse pse
tsc tsc tsc
msr msr msr
pae pae pae
mce mce mce
cx8 cx8 cx8
apic apic apic
sep sep sep
mtrr mtrr mtrr
pge pge pge
mca mca mca
cmov cmov cmov
pat pat pat
pse36 pse36 pse36
clflush clflush clflush
dts dts dts
acpi acpi acpi
mmx mmx mmx
fxsr fxsr fxsr
sse sse sse
sse2 sse2 sse2
ss ss ss
ht ht ht
tm tm tm
pbe pbe pbe
syscall syscall syscall
nx nx nx
pdpe1gb pdpe1gb pdpe1gb
rdtscp rdtscp rdtscp
lm lm lm
constant_tsc constant_tsc constant_tsc
art art art
arch_perfmon arch_perfmon arch_perfmon
pebs pebs pebs
bts bts bts
rep_good rep_good rep_good
nopl nopl nopl
xtopology xtopology xtopology
nonstop_tsc nonstop_tsc nonstop_tsc
cpuid cpuid cpuid
aperfmperf aperfmperf aperfmperf
tsc_known_freq tsc_known_freq tsc_known_freq
pni pni pni
pclmulqdq pclmulqdq pclmulqdq
dtes64 dtes64 dtes64
monitor monitor monitor
ds_cpl ds_cpl ds_cpl
vmx vmx vmx
est est est
tm2 tm2 tm2
ssse3 ssse3 ssse3
sdbg sdbg sdbg
fma fma fma
cx16 cx16 cx16
xtpr xtpr xtpr
pdcm pdcm pdcm
pcid pcid pcid
sse4_1 sse4_1 sse4_1
sse4_2 sse4_2 sse4_2
x2apic x2apic x2apic
movbe movbe movbe
popcnt popcnt popcnt
tsc_deadline_timer tsc_deadline_timer tsc_deadline_timer
aes aes aes
xsave xsave xsave
avx avx avx
f16c f16c f16c
rdrand rdrand rdrand
lahf_lm lahf_lm lahf_lm
abm abm abm
3dnowprefetch 3dnowprefetch 3dnowprefetch
cpuid_fault cpuid_fault cpuid_fault
epb epb epb
invpcid_single invpcid_single invpcid_single
pti ssbd ssbd
ssbd ibrs ibrs
ibrs ibpb ibpb
ibpb stibp stibp
stibp ibrs_enhanced ibrs_enhanced
tpr_shadow tpr_shadow tpr_shadow
vnmi vnmi vnmi
flexpriority flexpriority flexpriority
ept ept ept
vpid vpid vpid

ept_ad ept_ad
fsgsbase fsgsbase fsgsbase
tsc_adjust tsc_adjust tsc_adjust
bmi1 bmi1 bmi1
hle

avx2 avx2 avx2
smep smep smep
bmi2 bmi2 bmi2
erms erms erms
invpcid invpcid invpcid
rtm

mpx mpx


avx512f


avx512dq
rdseed rdseed rdseed
adx adx adx
smap smap smap


avx512ifma
clflushopt clflushopt clflushopt
intel_pt intel_pt intel_pt


avx512cd


sha_ni


avx512bw


avx512vl
xsaveopt xsaveopt xsaveopt
xsavec xsavec xsavec
xgetbv1 xgetbv1 xgetbv1
xsaves xsaves xsaves
dtherm dtherm dtherm
ida ida ida
arat arat arat
pln pln pln
pts pts pts
hwp hwp hwp
hwp_notify hwp_notify
hwp_act_window hwp_act_window hwp_act_window
hwp_epp hwp_epp hwp_epp


hwp_pkg_req


avx512vbmi


umip


pku


ospke


avx512_vbmi2


gfni


vaes


vpclmulqdq


avx512_vnni


avx512_bitalg


avx512_vpopcntdq


rdpid
md_clear md_clear md_clear
flush_l1d flush_l1d flush_l1d

arch_capabilities arch_capabilities

この表内での違いはAVX512関連の有無となります
(AVX512関連の資料はわかりやすいものをXLSoftさんがPDFで提供しているので、こちらにリンクしておきます)

次にこの命令群が実際にアプリケーション内で使用されているかどうかを調べてみましょう

続く…

OpenVINO on IceLake (Vol.2)

なんだかスケートをしているようなタイトルの連載2回目、
Intelの第10世代CPU IceLakeでOpenVINOを試してみます

前回 同様、使用するのはDell XPS 13 2in1、搭載されているのは下記のCPUとなります
Intel(R) Core(TM) i7-1065G7 CPU @ 1.30GHz
このCPUはGPUを内包しており、64EUのIntel Iris Plus グラフィックスが搭載されています
また実行ユニット数は、過去最大であったIntel Iris Pro Graphics 580(i7-6770HQ)の72EUにつぐ多さとなっています
メモリはDDR4-3733 16GBが搭載されています

このPCにUbuntu18.04をインストールし、OpenVINOの実行をしますが、今回はCPUでの実行に注目してみましょう

前回 はsecurity_barrier_camera_demoで実行してみました
かなり速い結果が出たことを気付いた方はいらっしゃるでしょうか
こちらが FP16のモデルを使用し、security_barrier_camera_demo を10回実行した結果です

~/inference_engine_demos_build/intel64/Release/security_barrier_camera_demo -d CPU -d_va CPU -d_lpr CPU -i /opt/intel/openvino/deployment_tools/demo/car_1.bmp -m /openvino_models/ir/intel/vehicle-license-plate-detection-barrier-0106/FP16/vehicle-license-plate-detection-barrier-0106.xml -m_lpr /openvino_models/ir/intel/license-plate-recognition-barrier-0001/FP16/license-plate-recognition-barrier-0001.xml -m_va /openvino_models/ir/intel/vehicle-attributes-recognition-barrier-0039/FP16/vehicle-attributes-recognition-barrier-0039.xml -no_show;

FP16Icelake
1回目85.7
2回目99.9
3回目90.5
4回目105.1
5回目107.3
6回目84.9
7回目92.1
8回目100.4
9回目105.1
10回目99.2
Average97.02 FPS

こちらだけではわからないので、他のCPUで実行した結果も並べてみます

FP16IcelakeCometlake※1Skylake※2
1回目85.737.331.8
2回目99.933.836.5
3回目90.538.135.8
4回目105.137.531.3
5回目107.335.435.4
6回目84.933.136.4
7回目92.138.230.2
8回目100.431.231.6
9回目105.135.736.1
10回目99.236.331.9
Average97.02 FPS35.66 FPS33.7 FPS

※1: インテル® Core™ i5-10210U プロセッサー搭載 ノートPC
※2: インテル® Core™ i7-6770HQ プロセッサー搭載 PC

これらの比較は厳密にはメモリの帯域なども考慮しないといけませんが、CPUでの実行にかなりの差が出てきています
またCometlakeでは最大4.2GHzのクロックになり、Icelakeの3.9GHzを上回っています
メモリ帯域を差し引いたとしてもこれほどの差が出てくるとは思えません
SkylakeのPCですが、こちらは最大3.5GHzとなり、Cometlakeとの比較を考えるとなんとなく納得できます。

次にInt8のモデルを使用した計測結果はこちらです

INT8IcelakeCometlakeSkylake
1回目129.183.964.9
2回目127.678.357.5
3回目125.881.267.3
4回目12665.974.8
5回目1208577.2
6回目116.69074.4
7回目152.876.885.3
8回目112.477.386.7
9回目126.37885.5
10回目147.675.969
Average128.42 FPS79.23 FPS74.26 FPS

やはり、Icelakeのスピードが際立っています
平均値を基にどのくらい早くなっているかを表にすると下記のようになりました

 対 Skylake対 Cometlake
FP162.882.72
INT81.731.62

巷にあるベンチマークサイトなどではこのような結果は見当たりません
次回はこちらの謎を考えてみましょう

続く…

OpenVINO on IceLake (Vol.1)

なんだかスケートをしているようなタイトルですが、そうではありません
Intelの第10世代CPU IceLakeでOpenVINOを試してみます

このCPUは10nmで製造されているCPUで、10nmとしては2018年に発売されたCannonLakeにつぐものとなりますが、SkyLakeのシュリンク版のCannonLakeとは違い、新規に設計されたものとなります

今回、使用するのはDell XPS 13 2in1、搭載されているのは下記のCPUとなります
Intel(R) Core(TM) i7-1065G7 CPU @ 1.30GHz
このCPUはGPUを内包しており、64EUのIntel Iris Plus グラフィックスが搭載されています
また実行ユニット数は、過去最大であったIntel Iris Pro Graphics 580(i7-6770HQ)の72EUにつぐ多さとなっています
メモリはDDR4-3733 16GBが搭載されています

このPCにUbuntu18.04をインストールし、OpenVINOの実行をしてみましょう

Windowsがインストールされているので、パーテーションの分割は必要ですが、Ubuntuのインストールは問題なくできると思います

次にここを参考にOpenVINOをインストールします
今回は2020.3をインストールしましたが、私がインストールした際には特に問題は出ませんでした
ただ、使用しているPCのインターフェイスがUSB TypeCしかなく、NCS2が標準では挿入できません…時代が変わるのは早いですね

お決まりのdemo_security_barrier_camera.shを動作させてみましょう
(CLIでの実行のため、-no_showオプションを付けています)

cd /opt/intel/openvino/deployment_tools/demo
./demo_security_barrier_camera.sh -sample-options -no_show

 [ INFO ] InferenceEngine: 0x7f33899f4030
 [ INFO ] Files were added: 1
 [ INFO ]     /opt/intel/openvino/deployment_tools/demo/car_1.bmp
 [ INFO ] Loading device CPU
 CPU
 MKLDNNPlugin version ......... 2.1
 Build ........... 42025
 

 [ INFO ] Loading detection model to the CPU plugin
 [ INFO ] Loading Vehicle Attribs model to the CPU plugin
 [ INFO ] Loading Licence Plate Recognition (LPR) model to the CPU plugin
 [ INFO ] Number of InferRequests: 1 (detection), 3 (classification), 3 (recognition)
 [ INFO ] 4 streams for CPU
 [ INFO ] Display resolution: 1920x1080
 [ INFO ] Number of allocated frames: 3
 [ INFO ] Resizable input with support of ROI crop and auto resize is disabled
 90.8FPS for (1 / 1) frames
 Detection InferRequests usage: 100.0% 

と上記のような結果となりました

処理速度としては、90.8FPSとなります
CPUで処理していることを考えるとかなり高速な処理だと思います

次回からはもっと深く見てみましょう

続く…