先日発売された、Intel Arc A770 が Linux の DeepLearning フレームワークを語る上でどこまで対応できるか検証をしてみました。


まずは、OSの選定です。Arc シリーズが Kernel 6.0.0 でサポートされると話題になったので、Ubuntu 22.04 からスタートしてみましたが、こちらは最終的に OpenVINO のpython のライブラリ関係が上手く動作せず、ベンチマークまではたどり着けませんでしたので、改めて下記を参考にして、Ubunu20.04 から再出発してみます。


Intel Arc シリーズのドライバーインストール方法


Ubuntu 22.04 でインストールした際には、GPU のモニタリングツールとして、intel_gpu_top が使えましたが、残念ながら上述の対応では、これが使えません。

(openvino_env) ulgs_root@arc770:~$ intel_gpu_top
Failed to detect engines! (No such file or directory)
(Kernel 4.16 or newer is required for i915 PMU support.)


気を取り直して、Pytorch Intel GPU とググってみて出てきた、OpenVINO をインストールしてみます。


OpenVINO のインストール


Docker でも何でも構いませんが、今回は、pip を使って、システム上で使えるようにしてみました。さてベンチマークはどんな感じでしょうか?


OpenVINO ベンチマーク結果


いずれはここに、a770 の結果も掲載されると思いますが、実施時点(2022/11/29) では掲載されていませんでした。それでは下記を参考に、ベンチマークを取得してみましょう。


OpenVINO のベンチマーク実施方法


まずは、モデルのダウンロード、(数時間かかりますので、放置で別の仕事をされたほうがいいともいます。)

(openvino_env) ulgs_root@arc770:~$ omz_downloader --all

どのモデルが用意されているのかは、状況によって違うようで、精度の選択肢は、FP16, FP32, FP16-INT8, FP32-INT8 といろいろあるみたいですが、全ての精度があるわけでもないようです。執筆時点では、

[FP16] の場合

benchmark_app -m omz_models/intel/person-detection-0200/FP16/person-detection-0200.xml
 -d GPU -hint throughput

Count:          102920 iterations
Duration:       60002.57 ms
Latency:
    Median:     2.33 ms
    AVG:        2.33 ms
    MIN:        2.23 ms
    MAX:        9.88 ms
Throughput: 1715.26 FPS


[FP16-INT8]の場合

benchmark_app -m omz_models/intel/person-detection-0200/FP16-INT8/person-detection-0200.xml
 -d GPU -hint throughput
Count:          108960 iterations
Duration:       60002.68 ms
Latency:
    Median:     2.20 ms
    AVG:        2.20 ms
    MIN:        1.99 ms
    MAX:        9.13 ms
Throughput: 1815.92 FPS

[FP32]の場合

benchmark_app -m omz_models/intel/person-detection-0200/FP32/person-detection-0200.xml -d GPU -hint throughput
[ INFO ] First inference took 7.85 ms
[Step 11/11] Dumping statistics report
Count:          82412 iterations
Duration:       60004.27 ms
Latency:
    Median:     2.91 ms
    AVG:        2.91 ms
    MIN:        2.73 ms
    MAX:        12.67 ms
Throughput: 1373.44 FPS


さてここまで取ってみて、あれ?これって推論のベンチマークですか?と気が付きます。学習は?できないの?・・・・

いろいろ探してみましたが、現時点で高速化されているのは、推論であり、学習ではなさそうです。表向きには、リリースされて、SC2022辺りで、Auroa に採用されたはずの、Intel Data Center GPU Max 向けには、現在開発が進んでいるそうですが、Arc シリーズではまだ動きそうにありません。


[OpenVINO で Imagenet 系 Public のベンチマークの取得方法]


(Resnet-50-TF)

omz_download を使ってモデルダウンロードをした中で、Intel ディレクトリにある最適化されたものはいいのですが、Public 的なものはそのままベンチマークを取れません。どのように最適化しているかは、


omz_converter,omz_quantifizer が必要になります。

Public Model の converter: omz_download --all は数時間かかるので、resnet-50 だけを抽出してみましょう。

$ omz_downloader --name resnet-50-tf -o resnet50
################|| Downloading resnet-50-tf ||################

========== Downloading resnet50/public/resnet-50-tf/resnet_v1-50.pb
... 100%, 99775 KB, 609 KB/s, 163 seconds passed

モデルをダウンロードしたら、次は、モデル変換します。そうすると、FP16, FP32 のディレクトリが作成されます。

$ omz_converter -d resnet50 --name resnet-50-tf
$ ls resnet50/public/resnet-50-tf/
FP16  FP32  resnet_v1-50.pb

次に、INT8 のデータを作るには、imagenet の val データが必要になります。詳細は下記をご覧ください。
Int8 向けのDataset をImagenet dataset から作る。


1. Imagenet2010のval データをダウンロードする、研究者しかダウンロードできないとありますが、表向きです。どっかから取得してください。data/ILSVRC2012_img_val ディレクトリに展開します。
2. val.txt をダウンロードして下さい。data/val.txt として保管してください。

3. ILSRC2017_val.txt をダウンロードしてください。data/val15.txt に名前を変更してください。


$ omz_quantizer --dataset_dir data -o resnet50/ --name resnet-50-tf
Moving quantized model to resnet50/public/resnet-50-tf/FP32-INT8...
$ ls resnet50/public/resnet-50-tf/
FP16  FP16-INT8  FP32  FP32-INT8  resnet_v1-50.pb

これで準備ができました、ベンチマークを取ってみましょう。

[FP16]

$ benchmark_app -m resnet50/public/resnet-50-tf/FP16/resnet-50-tf.xml -d GPU -hint th
roughput
[ INFO ] Benchmarking in inference only mode (inputs filling are not included in measurement loop).
[ INFO ] First inference took 735.53 ms
[Step 11/11] Dumping statistics report
Count:          161792 iterations
Duration:       60281.44 ms
Latency:
    Median:     190.32 ms
    AVG:        190.39 ms
    MIN:        137.79 ms
    MAX:        239.81 ms
Throughput: 2683.94 FPS

[FP16-INT8]

$ benchmark_app -m resnet50/public/resnet-50-tf/FP16-INT8/resnet-50-tf.xml -d GPU -hi
nt throughput -progress
[Step 11/11] Dumping statistics report
Count:          208896 iterations
Duration:       60313.30 ms
Latency:
    Median:     294.90 ms
    AVG:        294.82 ms
    MIN:        191.62 ms
    MAX:        351.69 ms
Throughput: 3463.51 FPS


[FP32]

$ benchmark_app -m resnet50/public/resnet-50-tf/FP32/resnet-50-tf.xml -d GPU -hint th
roughput -progress
[Step 11/11] Dumping statistics report
Count:          69888 iterations
Duration:       60381.00 ms
Latency:
    Median:     220.29 ms
    AVG:        220.77 ms
    MIN:        154.10 ms
    MAX:        271.93 ms
Throughput: 1157.45 FPS

[FP32-INT8]

$ benchmark_app -m resnet50/public/resnet-50-tf/FP32-INT8/resnet-50-tf.xml -d GPU -hi
nt throughput -progress
[Step 11/11] Dumping statistics report
Count:          208896 iterations
Duration:       60576.27 ms
Latency:
    Median:     296.17 ms
    AVG:        296.14 ms
    MIN:        186.20 ms
    MAX:        341.13 ms
Throughput: 3448.48 FPS


といった感じです。同じ環境とは言えませんが、Nvidia T4 が4500 程度出ているはずなので、微妙な感触です。FP16-INT8 の結果は、より高い値が出ている場合もあるとのことですので、何か最適化する方法があるのかもしれません。ただ、今回はここまでとなります。