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を呼び出す部分が増えています
そのため、切り替えに時間がかかっているのでは?と推測しています

続く…