MENU

TensorFlowベンチマーク! C++とPythonで推論処理の性能比較をしてみた

今回はTensorFlowベンチマークを取っていきます。

当然C++の方が高性能を期待できるので、Pythonがどれくらい迫れるかが楽しみですね。

この記事はこちらでも紹介しています。

目次

TensorFlowベンチマーク

TensorFlowはC++実装であるため、C++とPythonの2つの言語で実装できます。

今回はC++とPythonの双方で推論処理を実装し、性能を比較評価していきます。

NVIDIA A100のベンチマークも兼ねています。

今回評価に使ったソースコードは shohata/tensorflow_perf に置いてあります。

次の記事でTensorFlow C++実装方法を紹介しています。

あわせて読みたい
TensorFlowをC++でコーディングする方法 TensorFlowはC++で実装された機械学習フレームワークです。 そのため、PythonだけでなくC++で実装することも可能です。 C++で実装すれば、組み込みへの利用や、推論処理...

TensorFlowベンチマーク評価

今回のベンチマークでは大量の画像を推論し、そのトータルの時間を計測します。

ベンチマーク項目

ベンチマークの項目は次の通りです。

  • 総推論数 (Total Predictions)
  • 経過時間 (Duration Time)
  • スループット (Throughput)
  • レイテンシ (Latency)

総推論数は大体同じならば良いものとします。

スループットは総推論数を経過時間で割った値です。

レイテンシは経過時間を総合推論数で割った値です。

ベンチマーク条件

MLのベンチマーク条件は次の通りです。

項目
データセットIMAGENET2012
MLモデルResNet50
バッチ数32
フレームワークTensorFlow v2.14.0
CUDA11.8
cuDNN8.7

サーバスペックは次の通りです。

項目
OSUbuntu 22.04.4 LTS
GPUNVIDIA A100 80GB
CPUIntel Xeon Processor (Icelake)
コア数16
スレッド数16
メモリ64GB

ベンチマークパターン

ベンチマークは次の3パターンで行います。

  1. ジョブシステム(ワーカー数=4)
  2. ジョブシステム(ワーカー数=1)
  3. forループ

1つ目がジョブシステムを使ってマルチスレッドで推論するパターンです。

最も高速であることを期待できます。

2つ目がジョブシステムを使ってシングルスレッドで推論するパターンです。

1バッチにかかる時間、つまりレイテンシを測定することが期待できます。

最後にforループを使うパターンです。

C++の高速性が期待できます。

これら3つのパターンを考えました。

TensorFlowベンチマーク取得

C++実装とPython実装でベンチマークを取得しました。

C++実装のTensorFlowベンチマーク取得

C++実装のソースコードと実行結果です。

Successfully run the measurement #1.
Total predictions: 32000
Duration time: 15542 ms
Throughput: 2058.94 FPS
Latency: 0.485687 ms
Successfully run the measurement #2.
Total predictions: 32000
Duration time: 16216 ms
Throughput: 1973.36 FPS
Latency: 0.50675 ms
Successfully run the measurement #3.
Total predictions: 32000
Duration time: 16299 ms
Throughput: 1963.31 FPS
Latency: 0.509344 ms

Python実装のTensorFlowベンチマーク取得

Python実装のソースコードと実行結果です。

Successfully run the measurement #1.
Total predictions:  40064
Duration time:      22638.29686 ms
Throughput:          1769.74444 FPS
Latency:                0.56505 ms
Successfully run the measurement #2.
Total predictions:  40064
Duration time:      22174.23981 ms
Throughput:          1806.78122 FPS
Latency:                0.55347 ms
Successfully run the measurement #3.
Total predictions:  40064
Duration time:      86710.36790 ms
Throughput:           462.04394 FPS
Latency:                2.16430 ms

TensorFlowベンチマーク結果

以上を踏まえてベンチマーク結果を表にまとめました。

NThroughput (C++)Throughput (Python)Latency (C++)Latency (Python)
12058.94 FPS1769.74 FPS0.486 ms0.565 ms
21973.36 FPS1806.78 FPS0.507 ms0.553 ms
31963.31 FPS462.04 FPS0.509 ms2.164 ms

C++実装の方がPython実装より高速

期待通りC++実装の方がPython実装を上回る性能を示しました。

スループットが評価1では約16%、評価2では約9%、評価3では約425%高い結果を示しました。

ワーカー数は影響しない

意外なのがワーカー数4と1で結果がさほど変わらないことです。

C++実装で約4%の向上に留まりました。

むしろPython実装ではワーカ数の多い方が、性能が約2%低下する結果となりました。

今回の条件の場合、マルチスレッドは大きく貢献しないことがわかりました。

forループはC++実装の圧勝

forループでの比較は予想通りC++実装の方が圧倒的に高い結果となりました。

Pythonのfor文はオーバーヘッドが大きく遅いことで有名です。

その評判通り、Python実装のスループットは約4分の1まで低下しました。

高速化においてPythonのfor文がいかに禁忌かがよくわかる結果です。

一方でC++実装ではfor文を使ってもほとんどスループットが低下しませんでした。

今回の場合、C++実装ではforループでも十分な性能を出せることがわかりました。

感想

C++実装の方が高い性能になり喜ばしい反面、思ったより性能差がなくてガックリしました。

というのも実装するのがPythonの10倍大変だったからです。

資料も少なく手探りの実装で、ジョブシステムも標準ライブラリにないので手作りです。

コードの行数も3倍あります。

そこまで頑張って16%の性能向上……。

10倍とは言わなくても、2倍くらい速くならないかなとか思っていました。

Pythonってよくできているんですね。

でも、高速化やC++の勉強になったのはよかったです。

まとめ

今回はC++実装とPython実装で推論処理の性能を比較しました。

期待通りC++実装の方が高速化を期待できます。

一方でPython実装もうまく書けばC++実装に迫る性能を発揮することがわかりました。

極限まで高速化したい方は是非C++実装をお試しください。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

所畑 聡一郎のアバター 所畑 聡一郎 ソフトウェアエンジニア

ソフトウェアエンジニアとして活動しています。
コーディングが大好きです。

目次