この記事は TensorFlow チーム、Josh Gordon による Google Developers Blog の記事 "TensorFlow Benchmarks and a New High-Performance Guide" を元に翻訳・加筆したものです。詳しくは元記事をご覧ください。
Google は、InceptionV3や ResNetなどのイメージ分類モデルをさまざまなハードウェアや構成で学習させたときの TensorFlow の速度とスケーラビリティを比較したパフォーマンス ベンチマークを公開しました。また、スケーラビリティの高いモデルを構築するための高パフォーマンス モデルのガイドをtensorflow.org のパフォーマンス セクションに新たに追加しました。新規や既存のハードウェアから最大限のパフォーマンスを引き出すためのTensorFlow チューニングの参考資料としてご利用ください。
ベンチマークを実行するときには、実在データと合成データの両方を使ってテストを行いました。この 2 つのデータを示すことで、計算と入力の両方のパイプラインが使用され、合成データのみを使ったテストと比較して、実世界のパフォーマンス値をより正確に表せるためです。またベンチマークに使用したスクリプトと手法も公開しています。
以下に示すデータは、NVIDIA® DGX-1™、および分散構成で実行した 64 個の NVIDIA® Tesla® K80 GPU を使用した、TensorFlow のパフォーマンスの重要箇所を表しています。バッチサイズやテストに使用したさまざまなプラットフォームの構成などを含む詳細な結果は、ベンチマークのサイトで確認できます。
NVIDIA® DGX-1™(8 個の NVIDIA® Tesla® P100)を使用した
このベンチマークでは、合成データを使用したイメージ分類モデルのトレーニングで TensorFlow がNVIDIA® DGX-1™上でほぼ線形に拡張しています。8 個の NVIDIA Tesla P100 を使用した場合、GPU 単体を使った場合と比較して InceptionV3 で 7.99 倍の高速化(99% 効率)、ResNet-50 で 7.91 倍の高速化(98% 効率)が見られました。
次に、合成データと実際のデータのトレーニング結果の比較を示します。ベンチマーク結果では、GPU 上に静的に置かれた合成データのトレーニングと、ImageNet のデータを使った入力パイプラインのフル実行では、わずかの差しか見られません。TensorFlow の強みの 1 つは、最新の計算ユニットに大量の入力を限界まで送り込む入力パイプラインの能力です。
単体サーバー構成の 8 個の NVIDIA® Tesla® K80 を使用した場合、単一の GPU を使用した場合と比較して TensorFlow は Inception v3 で 7.4 倍の高速化(93% 効率)、ResNet-50 で 7.4 倍の高速化が見られました。このベンチマークでは、Google Compute Engine インスタンスを使用しています。
NVIDIA® Tesla® K80(最大 64 個の GPU)を使用した
分散構成の複数の Amazon EC2 インスタンス上で実行する 64 個の Tesla K80 を使用した場合、合成データを使用して InceptionV3 で 59 倍の高速化(92% 効率)、ResNet-50 で 52 倍の高速化(82% 効率)が見られました。
DGX-1 やその他のプラットフォームのテストでは、NVIDIA ディープ ラーニング SDKの一部である NCCL(Collective Communications Library)を使用したさまざまな構成を使用しました。テストを開始する前の私たちの仮説は、GPU 間の変数の複製と NCCL を使用したこれらの同期が最適なアプローチだろう、というものでした。結果は必ずしも予想通りではありませんでした。最適な構成は GPU により異なりましたが、それだけではなくプラットフォームやテスト対象のモデルによっても異なります。たとえば DGX-1 では、各 GPU で変数を複製し、NCLL を使用してそれらを更新した場合は VGG16 と AlexNet が最高のパフォーマンスを記録しました。一方、共有変数を CPU 上に配置した場合は、InceptionV3 と ResNet が最高のパフォーマンスを記録しています。このような複雑なふるまいは、包括的なベンチマークの重要さを示しています。各モデルはプラットフォームごとにチューニングする必要があり、「同じ手法をすべてに適用する」アプローチは多くの場合最高のパフォーマンスを得られないと考えられます。
最高のパフォーマンスを得るには、複数の設定を組み合わせて、プラットフォームごとに最高のパフォーマンスを得られる設定を判断する必要があります。高パフォーマンス モデルの作成の記事に含まれているスクリプトは、最高のパフォーマンスを得る方法を示すためだけではなく、さまざまな設定でプラットフォームのベンチマークを実行するためのツールとしても作成されています。ベンチマーク ページには、テスト対象の各プラットフォームで最高のパフォーマンスを得られた構成のリストが掲載されています。
その他のプラットフォームで実行されたさまざまなベンチマークに対して多くの人が指摘するように、1 秒あたりのサンプル数の増加は、必ずしも学習の速やかな収束とは関連しません。また、バッチ サイズの増加に伴い、高精度な学習結果への収束が難しくなる可能性があります。
今後も私たちのチームは、高精度な学習結果への収束に要する時間に注目したテストを実施したいと考えています。より高い性能を得るための TensorFlow チューニングにこれらのベンチマーク結果を役立てていただければ幸いです。
NVIDIA には、ベンチマーク テストに際し DGX-1 をご提供いただき、技術的に支援していただいたことを感謝します。私たちは、NVIDIA の次期アーキテクチャである Voltaに期待しています。また、同社と緊密に連携して、このアーキテクチャで TensorFlow のパフォーマンスを最適化し、FP16 のサポートを拡張できることを楽しみにしています。
お読みいただきありがとうございます。GitHub の問題ページ、Stack Overflow、discuss@tensorflow.orgリスト、@TensorFlowなどのフォーラムで皆さんと協力できることを楽しみにしています。
Reviewed by Kaz Sato - Staff Developer Advocate, Google Cloud
Google は、InceptionV3や ResNetなどのイメージ分類モデルをさまざまなハードウェアや構成で学習させたときの TensorFlow の速度とスケーラビリティを比較したパフォーマンス ベンチマークを公開しました。また、スケーラビリティの高いモデルを構築するための高パフォーマンス モデルのガイドをtensorflow.org のパフォーマンス セクションに新たに追加しました。新規や既存のハードウェアから最大限のパフォーマンスを引き出すためのTensorFlow チューニングの参考資料としてご利用ください。
ベンチマークを実行するときには、実在データと合成データの両方を使ってテストを行いました。この 2 つのデータを示すことで、計算と入力の両方のパイプラインが使用され、合成データのみを使ったテストと比較して、実世界のパフォーマンス値をより正確に表せるためです。またベンチマークに使用したスクリプトと手法も公開しています。
以下に示すデータは、NVIDIA® DGX-1™、および分散構成で実行した 64 個の NVIDIA® Tesla® K80 GPU を使用した、TensorFlow のパフォーマンスの重要箇所を表しています。バッチサイズやテストに使用したさまざまなプラットフォームの構成などを含む詳細な結果は、ベンチマークのサイトで確認できます。
NVIDIA® DGX-1™(8 個の NVIDIA® Tesla® P100)を使用した
トレーニング
このベンチマークでは、合成データを使用したイメージ分類モデルのトレーニングで TensorFlow がNVIDIA® DGX-1™上でほぼ線形に拡張しています。8 個の NVIDIA Tesla P100 を使用した場合、GPU 単体を使った場合と比較して InceptionV3 で 7.99 倍の高速化(99% 効率)、ResNet-50 で 7.91 倍の高速化(98% 効率)が見られました。
次に、合成データと実際のデータのトレーニング結果の比較を示します。ベンチマーク結果では、GPU 上に静的に置かれた合成データのトレーニングと、ImageNet のデータを使った入力パイプラインのフル実行では、わずかの差しか見られません。TensorFlow の強みの 1 つは、最新の計算ユニットに大量の入力を限界まで送り込む入力パイプラインの能力です。
NVIDIA® Tesla® K80(単一サーバー、8 個のGPU)
単体サーバー構成の 8 個の NVIDIA® Tesla® K80 を使用した場合、単一の GPU を使用した場合と比較して TensorFlow は Inception v3 で 7.4 倍の高速化(93% 効率)、ResNet-50 で 7.4 倍の高速化が見られました。このベンチマークでは、Google Compute Engine インスタンスを使用しています。
NVIDIA® Tesla® K80(最大 64 個の GPU)を使用した
分散型トレーニング
分散構成の複数の Amazon EC2 インスタンス上で実行する 64 個の Tesla K80 を使用した場合、合成データを使用して InceptionV3 で 59 倍の高速化(92% 効率)、ResNet-50 で 52 倍の高速化(82% 効率)が見られました。
考察
DGX-1 やその他のプラットフォームのテストでは、NVIDIA ディープ ラーニング SDKの一部である NCCL(Collective Communications Library)を使用したさまざまな構成を使用しました。テストを開始する前の私たちの仮説は、GPU 間の変数の複製と NCCL を使用したこれらの同期が最適なアプローチだろう、というものでした。結果は必ずしも予想通りではありませんでした。最適な構成は GPU により異なりましたが、それだけではなくプラットフォームやテスト対象のモデルによっても異なります。たとえば DGX-1 では、各 GPU で変数を複製し、NCLL を使用してそれらを更新した場合は VGG16 と AlexNet が最高のパフォーマンスを記録しました。一方、共有変数を CPU 上に配置した場合は、InceptionV3 と ResNet が最高のパフォーマンスを記録しています。このような複雑なふるまいは、包括的なベンチマークの重要さを示しています。各モデルはプラットフォームごとにチューニングする必要があり、「同じ手法をすべてに適用する」アプローチは多くの場合最高のパフォーマンスを得られないと考えられます。
最高のパフォーマンスを得るには、複数の設定を組み合わせて、プラットフォームごとに最高のパフォーマンスを得られる設定を判断する必要があります。高パフォーマンス モデルの作成の記事に含まれているスクリプトは、最高のパフォーマンスを得る方法を示すためだけではなく、さまざまな設定でプラットフォームのベンチマークを実行するためのツールとしても作成されています。ベンチマーク ページには、テスト対象の各プラットフォームで最高のパフォーマンスを得られた構成のリストが掲載されています。
その他のプラットフォームで実行されたさまざまなベンチマークに対して多くの人が指摘するように、1 秒あたりのサンプル数の増加は、必ずしも学習の速やかな収束とは関連しません。また、バッチ サイズの増加に伴い、高精度な学習結果への収束が難しくなる可能性があります。
今後も私たちのチームは、高精度な学習結果への収束に要する時間に注目したテストを実施したいと考えています。より高い性能を得るための TensorFlow チューニングにこれらのベンチマーク結果を役立てていただければ幸いです。
NVIDIA には、ベンチマーク テストに際し DGX-1 をご提供いただき、技術的に支援していただいたことを感謝します。私たちは、NVIDIA の次期アーキテクチャである Voltaに期待しています。また、同社と緊密に連携して、このアーキテクチャで TensorFlow のパフォーマンスを最適化し、FP16 のサポートを拡張できることを楽しみにしています。
お読みいただきありがとうございます。GitHub の問題ページ、Stack Overflow、discuss@tensorflow.orgリスト、@TensorFlowなどのフォーラムで皆さんと協力できることを楽しみにしています。
Reviewed by Kaz Sato - Staff Developer Advocate, Google Cloud