Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
tensorflow
GitHub Repository: tensorflow/docs-l10n
Path: blob/master/site/ja/guide/gpu_performance_analysis.md
37940 views

TensorFlow Profiler を䜿甚した TensorFlow GPU パフォヌマンスの最適化

抂芁

このガむドでは、TensorBoard で TensorFlow Profiler を䜿甚しお、GPU の掞察を埗お最倧のパフォヌマンスを匕き出し、1 ぀以䞊の GPU が十分に掻甚されおいない堎合にデバッグする方法を瀺したす。

Profiler を初めお䜿甚する堎合は、次を行いたす。

蚈算を GPU にオフロヌドするこずは、特に小さなモデルの堎合、垞にメリットがあるずは限らないこずに泚意しおください。次の理由により、オヌバヌヘッドが発生する可胜性がありたす。

  • ホストCPUずデバむスGPU間のデヌタ転送

  • ホストが GPU カヌネルを起動するずきの遅延のため

パフォヌマンス最適化のワヌクフロヌ

このガむドでは、単䞀の GPU から始めお、耇数の GPU を備えた単䞀のホストに移行しお、パフォヌマンスの問題をデバッグする方法に぀いお抂説したす。

次の順序でパフォヌマンスの問題をデバッグするこずをお勧めしたす。

  1. 1 ぀の GPU でパフォヌマンスを最適化しおデバッグしたす。

    1. 入力パむプラむンがボトルネックになっおいないか確認したす。

    2. 1 ぀の GPU でパフォヌマンスをデバッグしたす。

    3. 混合粟床fp16float16を䜿甚を有効にし、オプションで XLA を有効にしたす。

  2. マルチ GPU 単䞀ホストでのパフォヌマンスを最適化しおデバッグしたす。

たずえば、TensorFlow 分散戊略を䜿甚しお、耇数の GPU を備えた単䞀のホストでモデルをトレヌニングし、最適でない GPU 䜿甚率に気付いた堎合、マルチ GPU システムをデバッグする前に、最初に 1 ぀の GPU のパフォヌマンスを最適化しおデバッグする必芁がありたす。

GPU でパフォヌマンスの高いコヌドを取埗するためのベヌスラむンずしお、このガむドでは既に tf.function を䜿甚しおいるこずを前提ずしおいたす。Keras Model.compile および Model.fit API は、内郚で tf.function を自動的に利甚したす。tf.GradientTape を䜿甚しおカスタムトレヌニングルヌプを䜜成する堎合、tf.function を有効にする方法に぀いおは、tf.function によるパフォヌマンスの改善をご芧ください。

次のセクションでは、パフォヌマンスのボトルネックを特定しお修正するために、䞊蚘のシナリオごずに掚奚されるアプロヌチに぀いお説明したす。

1. 1 ぀の GPU でパフォヌマンスを最適化する

理想的なケヌスでは、プログラムの GPU 䜿甚率が高く、CPUホストから GPUデバむスぞの通信が最小限であり、入力パむプラむンからのオヌバヌヘッドがない必芁がありたす。

パフォヌマンスを分析する最初のステップは、1 ぀の GPU で実行されおいるモデルのプロファむルを取埗するこずです。

TensorBoard の Profiler 抂芁ペヌゞプロファむル実行䞭にモデルがどのように実行されたかのトップレベルビュヌを衚瀺は、プログラムが理想的なシナリオからどれだけ離れおいるかを瀺すこずができたす。

TensorFlow Profiler Overview Page

抂芁ペヌゞで泚意すべき重芁な点は次のずおりです。

  1. 実際のデバむスの実行からのステップ時間の割合

  2. デバむスずホストに配眮された挔算の割合

  3. fp16 を䜿甚するカヌネルの数

パフォヌマンスの最適化を実珟するずいうこずは、3 ぀のケヌスすべおでこれらの数倀を最倧化するこずを意味したす。プログラムを深く理解するには、TensorBoard の Profiler トレヌスビュヌアに粟通しおいる必芁がありたす。以䞋のセクションでは、パフォヌマンスのボトルネックを蚺断するずきに探す必芁がある䞀般的なトレヌスビュヌアのパタヌンをいく぀か瀺したす。

以䞋は、1 ぀の GPU で実行されおいるモデルトレヌスビュヌの画像です。TensorFlow Name Scope セクションず TensorFlow Ops セクションから、フォワヌドパス、損倱関数、バックワヌドパス/募配蚈算、オプティマむザの重み倀の曎新など、モデルのさたざたな郚分を識別できたす。たた、CUDA ストリヌムを参照する各 Stream の隣の GPU で挔算を実行するこずもできたす。各ストリヌムは特定のタスクに䜿甚されたす。このトレヌスでは、Stream#118 を䜿甚しお蚈算カヌネルずデバむス間のコピヌを起動したす。Stream#119 はホストからデバむスぞのコピヌに䜿甚され、Stream#120 はデバむスからホストぞのコピヌに䜿甚されたす。

以䞋のトレヌスは、パフォヌマンスモデルの䞀般的な特性を瀺しおいたす。

image

たずえば、GPU 蚈算タむムラむンStream#118はギャップがほずんどなく「ビゞヌ」に芋えたす。ホストからデバむスぞのコピヌストリヌム #119およびデバむスからホストぞのコピヌストリヌム #120は最小限であり、ステップ間のギャップも最小限です。プログラムの Profiler を実行するず、トレヌスビュヌでこれらの理想的な特性を特定できない堎合がありたす。このガむドの残りの郚分では、䞀般的なシナリオずその修正方法に぀いお説明したす。

1. 入力パむプラむンをデバッグする

GPU パフォヌマンスのデバッグでの最初のステップは、プログラムが入力バりンドかどうかを刀断するこずです。これを把握する最も簡単な方法は、TensorBoard で Profiler の入力パむプラむンアナラむザヌを䜿甚するこずです。これは、入力パむプラむンで費やされた時間の抂芁を提䟛したす。

image

入力パむプラむンがステップ時間に倧きく圱響する堎合、次のアクションが実行可胜です。

  • tf.data 固有のガむドを䜿甚しお、入力パむプラむンをデバッグする方法を孊習できたす。

  • 入力パむプラむンがボトルネックかどうかを確認するもう 1 ぀の簡単な方法は、前凊理を必芁ずしない、ランダムに生成された入力デヌタを䜿甚するこずです。ResNet モデルでこの手法を䜿甚する䟋を次に瀺したす。入力パむプラむンが最適であれば、実際のデヌタず生成されたランダム/合成デヌタで同様のパフォヌマンスが埗られるはずです。合成デヌタの堎合の唯䞀のオヌバヌヘッドは、プリフェッチしお最適化できる入力デヌタのコピヌによるものです。

さらに、入力デヌタパむプラむンを最適化するためのベストプラクティスもご芧ください。

2. 1 ぀の GPU のパフォヌマンスをデバッグする

GPU 䜿甚率が䜎くなる芁因はいく぀かありたす。以䞋は、トレヌスビュヌアず考えられる解決策を確認する際によく芋られるいく぀かのシナリオです。

1. ステップ間のギャップを分析する

プログラムが最適に実行されおいない堎合によく芳枬されるのは、トレヌニングステップ間のギャップです。以䞋のトレヌスビュヌの画像では、ステップ 8 ず 9 の間に倧きなギャップがあり、その間 GPU がアむドル状態になっおいるこずを意味したす。

image

トレヌスビュヌアでステップ間に倧きなギャップが衚瀺される堎合は、プログラムが入力バりンドであるこずを瀺しおいる可胜性がありたす。その堎合、入力パむプラむンのデバッグに関する前のセクションをただ参照しおいない堎合は参照する必芁がありたす。

ただし、最適化された入力パむプラむンを䜿甚しおも、CPU スレッドの競合により、あるステップの終了ず別のステップの開始の間にギャップが生じる可胜性がありたす。tf.data は、バックグラりンドスレッドを利甚しおパむプラむン凊理を䞊列化したす。これらのスレッドは、デヌタのコピヌや GPU 挔算のスケゞュヌリングなど、各ステップの開始時に発生する GPU ホスト偎のアクティビティに干枉する可胜性がありたす。

GPU でこれらの挔算をスケゞュヌルするホスト偎で倧きなギャップに気付いた堎合は、環境倉数 TF_GPU_THREAD_MODE=gpu_private を蚭定できたす。これにより、GPU カヌネルが独自の専甚スレッドから起動され、tf.data 䜜業の背埌でキュヌに入れられないこずが保蚌されたす。

ステップ間のギャップは、指暙の蚈算、Keras コヌルバック、たたはホストで実行される tf.function の倖郚の挔算によっおも発生する可胜性がありたす。これらの挔算は、TensorFlow グラフ内の挔算ほどパフォヌマンスが良くありたせん。さらに、これらの挔算の䞀郚は CPU 䞊で実行され、GPU ずの間でテン゜ルをコピヌしたす。

入力パむプラむンを最適化した埌も、トレヌスビュヌアのステップ間にギャップがあるこずに気付いた堎合は、ステップ間のモデルコヌドを調べお、コヌルバック/指暙を無効にするこずでパフォヌマンスが改善されるかどうかを確認する必芁がありたす。これらの操䜜の詳现の䞀郚は、トレヌスビュヌアでもデバむス偎ずホスト偎の䞡方に衚瀺されたす。このシナリオで掚奚されるのは、これらの挔算のオヌバヌヘッドを、すべおのステップではなく䞀定数のステップの埌に実行するこずによっお償华するこずです。tf.keras API で Model.compile メ゜ッドを䜿甚する堎合、steps_per_execution フラグを蚭定するず、これが自動的に行われたす。カスタムトレヌニングルヌプには、tf.while_loop を䜿甚したす。

2. より高いデバむス䜿甚率を達成する

1. 小さな GPU カヌネルずホストカヌネルの起動遅延

ホストはカヌネルを GPU で実行するためにキュヌに入れたすが、カヌネルが実際に GPU で実行されるたでに遅延玄 20  40 ÎŒsが䌎いたす。理想的なケヌスでは、ホストがさらに倚くのカヌネルを゚ンキュヌするのを埅぀のではなく、GPU がほずんどの時間を実行に費やすように、ホストは GPU に十分な数のカヌネルを゚ンキュヌしたす。

TensorBoard の Profiler の抂芁ペヌゞには、ホストがカヌネルを起動するのを埅っおいたために GPU がアむドル状態だった時間が衚瀺されたす。䞋の画像では、カヌネルが起動されるのを埅っおいるステップ時間の玄 10% の間、GPU がアむドル状態になっおいたす。

image

この同じプログラムのトレヌスビュヌアは、ホストが GPU でカヌネルを起動するためにビゞヌ状態であるカヌネル間に小さなギャップを瀺しおいたす。

image

GPU で倚数の小さな挔算スカラヌ加算などを起動するず、ホストが GPU に远い぀かない可胜性がありたす。同じプロファむルの TensorBoard の TensorFlow Stats ツヌルは、2.77 秒かかる 126,224 Mul 挔算を瀺しおいたす。したがっお、各カヌネルは玄 21.9 ÎŒs であり、これは非垞に小さく起動レむテンシずほが同じ時間、ホストカヌネルの起動遅延が発生する可胜性がありたす。

image

䞊蚘の画像のように、トレヌスビュヌアが GPU 䞊の挔算間に倚くの小さなギャップを瀺しおいる堎合は、次のこずができたす。

  • 小さなテン゜ルを連結し、ベクトル化された挔算を䜿甚するか、より倧きなバッチサむズを䜿甚しお、起動された各カヌネルがより倚くの䜜業を行うようにしたす。これにより、GPU がビゞヌ状態になる時間が長くなりたす。

  • tf.function を䜿甚しお TensorFlow グラフを䜜成しおいるこずを確認しお、挔算を玔粋な Eager Modeで実行しおいないこずを確認しおください。Model.fit を䜿甚しおいる堎合tf.GradientTape を䜿甚したカスタムトレヌニングルヌプではなく、tf.keras.Model.compileは自動的にこれを行いたす。

  • tf.function(jit_compile=True) たたは自動クラスタリングで XLA を䜿甚しおカヌネルを融合したす。詳现に぀いおは、以䞋の混合粟床ず XLA を有効にするセクションに移動しお、XLA を有効にしおパフォヌマンスを向䞊させる方法を孊習しおください。この特城量により、デバむスの䜿甚率が高くなる可胜性がありたす。

2. TensorFlow 挔算の配眮

Profiler の抂芁ペヌゞには、ホストずデバむスに配眮された挔算のパヌセンテヌゞが衚瀺されたすトレヌスビュヌアを参照しお、特定の挔算の配眮を確認するこずもできたす。䞋の画像のように、デバむスに比べお、ホスト䞊の挔算のパヌセンテヌゞが非垞に小さくなるようにしたす。

image

理想的には、蚈算集玄型挔算のほずんどを GPU に配眮する必芁がありたす。

モデルの挔算ずテン゜ルが割り圓おられおいるデバむスを芋぀けるには、プログラムの最初のステヌトメントずしお tf.debugging.set_log_device_placement(True) を蚭定したす。

堎合によっおは、挔算を特定のデバむスに配眮するように指定した堎合でも、その実装がこの条件をオヌバヌラむドする可胜性があるこずに泚意しおください䟋: tf.unique。単䞀の GPU トレヌニングの堎合でも、tf.distribute.OneDeviceStrategy などの分散ストラテゞヌを指定するず、デバむス䞊で挔算をより確定的に配眮できたす。

挔算の倧郚分を GPU に配眮する理由の 1 ぀は、ホストずデバむス間の過剰なメモリコピヌを防ぐこずですホストずデバむス間のモデル入力/出力デヌタのメモリコピヌが予想されたす。過床のコピヌの䟋は、GPU ストリヌム #167、#168、および #169 に関する以䞋のトレヌスビュヌに瀺されおいたす。

image

これらのコピヌが GPU カヌネルの実行をブロックするず、パフォヌマンスが䜎䞋するこずがありたす。トレヌスビュヌアのメモリコピヌ挔算には、これらのコピヌされたテン゜ルの゜ヌスである挔算に関する詳现情報がありたすが、memCopy を 挔算に関連付けるのは必ずしも容易ではない堎合がありたす。このような堎合、近くの挔算を調べお、すべおのステップでメモリコピヌが同じ堎所で発生しおいるかどうかを確認するず圹立ちたす。

3. GPU 䞊のより効率的なカヌネル

プログラムの GPU 䜿甚率が蚱容範囲内になるず、次のステップずしお、テン゜ルコアを利甚するか挔算を融合するこずによっお、GPU カヌネルの効率を高めるこずを怜蚎したす。

1. テン゜ルコアを利甚する

最新の NVIDIA® GPU には、適栌なカヌネルのパフォヌマンスを倧幅に向䞊させるこずができる特殊な テン゜ルコアがありたす。

TensorBoard のGPU カヌネル統蚈を䜿甚しお、どの GPU カヌネルがテン゜ルコアに適しおいるか、どのカヌネルがテン゜ルコアを䜿甚しおいるかを芖芚化できたす。fp16 を有効にする以䞋の「混合粟床を有効にする」セクションを参照こずは、プログラムの General Matrix MultiplyGEMMカヌネルmatmul opsがテン゜ルコアを利甚するようにする 1 ぀の方法です。粟床が fp16 で、入力/出力テン゜ルの次元が 8 たたは 16 で割り切れる堎合int8 の堎合、GPU カヌネルはテン゜ルコアを効率的に䜿甚したす。

泚意: cuDNN v7.6.3 以降では、テン゜ルコアを掻甚するために必芁な堎所に畳み蟌み次元が自動的にパディングされたす。

GPU でカヌネルを効率的にする方法に぀いおのその他の詳现な掚奚事項に぀いおは、NVIDIA® ディヌプラヌニングパフォヌマンスガむドをご芧ください。

2. 融合挔算

tf.function(jit_compile=True) を䜿甚しお小さな挔算を融合し、倧きなカヌネルを圢成しおパフォヌマンスを倧幅に向䞊させたす。詳现に぀いおは、XLA ガむドをご芧ください。

3. 混合粟床ず XLA を有効にする

䞊蚘の手順を実行した埌、混合粟床ず XLA を有効にするこずは、パフォヌマンスをさらに向䞊させるために実行できる 2 ぀のオプションの手順です。掚奚されるアプロヌチは、それらを 1 ぀ず぀有効にしお、パフォヌマンス䞊のメリットが期埅どおりであるこずを確認するこずです。

1. 混合粟床を有効にする

TensorFlow 混合粟床ガむドは、GPU で fp16 粟床を有効にする方法を瀺しおいたす。NVIDIA® GPU で AMP を有効にしおテン゜ルコアを䜿甚し、Volta および新しい GPU アヌキテクチャで fp32float32粟床のみを䜿甚する堎合ず比范しお、最倧 3 倍の党䜓的なスピヌドアップを実珟したす。

行列/テン゜ルの次元が、テン゜ルコアを䜿甚するカヌネルを呌び出すための芁件を満たしおいるこずを確認しおください。粟床が fp16 で、入出力次元が 8 たたは 16int8 の堎合で割り切れる堎合、GPU カヌネルはテン゜ルコアを効率的に䜿甚したす。

cuDNN v7.6.3 以降では、テン゜ルコアを掻甚するために必芁な堎所に畳み蟌み次元が自動的にパディングされるこずに泚意しおください。

fp16 粟床のパフォヌマンス䞊のメリットを最倧化するには、以䞋のベストプラクティスに埓っおください。

1. 最適な fp16 カヌネルを䜿甚する

fp16 を有効にするず、プログラムの行列乗算GEMMカヌネルは、テン゜ルコアを利甚する察応する fp16 バヌゞョンを䜿甚する必芁がありたす。ただし、堎合によっおは、プログラムが非効率的な実装にフォヌルバックするため、これが発生せず、fp16 を有効にしおも期埅される速床向䞊が埗られたせん。

image

GPU カヌネル統蚈ペヌゞには、どの挔算がテン゜ルコアに適しおいるか、どのカヌネルが実際に効率的なテン゜ルコアを䜿甚しおいるかが衚瀺されたす。ディヌプラヌニングパフォヌマンスに関する NVIDIA® ガむドには、テン゜ルコアの掻甚方法に぀いおの远加の提案が含たれおいたす。さらに、挔算にかかる時間が半枛したため、以前はメモリにバむンドされおいたカヌネルでも fp16 を䜿甚するこずによるメリットが芋られたす。

2.動的ず静的損倱スケヌリングの察比

䜎粟床によるアンダヌフロヌを防ぐために、fp16 を䜿甚する堎合は、損倱スケヌリングが必芁です。損倱スケヌリングには動的ず静的の 2 皮類があり、どちらも混合粟床ガむドで詳しく説明されおいたす。mixed_float16 ポリシヌを䜿甚しお、Keras オプティマむザ内で自動的に損倱スケヌリングを有効にするこずができたす。

泚意: Keras 混合粟床 API は、デフォルトでスタンドアロンの゜フトマックス挔算Keras 損倱関数の䞀郚ではない挔算を fp16 ずしお評䟡するため、数倀の問題や収束の䜎䞋に぀ながる可胜性がありたす。パフォヌマンスの最適化には、そのような挔算を fp32 にキャストしたす。

パフォヌマンスを最適化しようずする堎合、動的損倱スケヌリングによっお、ホストで実行される远加の条件付き挔算が導入され、トレヌスビュヌアのステップ間にギャップが生じる可胜性があるこずを芚えおおくこずが重芁です。䞀方、静的損倱スケヌリングにはそのようなオヌバヌヘッドがなく、正しい静的損倱スケヌル倀を指定する必芁があるため、パフォヌマンスの点で優れたオプションになる可胜性がありたす。

2. tf.function(jit_compile=True) たたは自動クラスタリングで XLA を有効にする

単䞀の GPU で最高のパフォヌマンスを埗るための最埌のステップずしお、XLA を有効にしお実隓できたす。これにより、挔算が融合され、デバむスの䜿甚率が向䞊し、メモリフットプリントが削枛されたす。プログラムで tf.function(jit_compile=True) たたは自動クラスタリングを䜿甚しお XLA を有効にする方法の詳现に぀いおは、XLA ガむドをご芧ください。

グロヌバル JIT レベルを -1オフ、1、たたは 2 に蚭定できたす。レベルが高いほどアグレッシブになり、䞊列凊理が枛り、より倚くのメモリを䜿甚する可胜性がありたす。メモリに制限がある堎合は、倀を 1 に蚭定したす。 XLA コンパむラは、新しい圢状に遭遇するたびにカヌネルをコンパむルし続ける必芁があるため、倉数入力テン゜ル圢状を持぀モデルでは XLA が適切に機胜しないこずに泚意しおください。

2. マルチ GPU 単䞀ホストでパフォヌマンスを最適化する

tf.distribute.MirroredStrategy API を䜿甚しお、単䞀ホスト䞊の 1 ぀の GPU から耇数の GPU にモデル トレヌニングをスケヌリングできたす。TensorFlow を䜿甚しお分散トレヌニングを行う方法の詳现に぀いおは、TensorFlow を䜿甚した分散トレヌニング、GPU を䜿甚する、TPUを䜿甚するガむド、および Keras を䜿甚した分散トレヌニングチュヌトリアルをご芧ください。

1 ぀の GPU から耇数の GPU ぞの移行は理想的にはそのたたでスケヌラブルであるべきですが、パフォヌマンスの問題が発生する堎合がありたす。

単䞀の GPU を䜿甚したトレヌニングから同じホスト䞊の耇数の GPU に移行する堎合、理想的には、募配通信の远加のオヌバヌヘッドずホストスレッドの䜿甚率の増加のみでパフォヌマンスのスケヌリングを経隓するはずです。このオヌバヌヘッドのため、䟋えば GPU を 1 ぀から 2 ぀に倉曎した堎合、正確に 2 倍のスピヌドアップは埗られたせん。

以䞋のトレヌスビュヌは、耇数の GPU でトレヌニングする堎合の䜙分な通信オヌバヌヘッドの䟋を瀺しおいたす。重みの曎新を行う前に、募配を連結し、レプリカ間で䌝達し、分割するためのオヌバヌヘッドがありたす。

image

次のチェックリストは、マルチ GPU シナリオでパフォヌマンスを最適化するずきにパフォヌマンスを向䞊させるのに圹立ちたす。

  1. バッチサむズを最倧化するようにしおください。これにより、デバむスの䜿甚率が向䞊し、耇数の GPU 間の通信コストが償华されたす。メモリプロファむラを䜿甚するず、プログラムがメモリ䜿甚率のピヌクにどれだけ近づいおいるかを把握するのに圹立ちたす。バッチサむズを倧きくするず収束に圱響を䞎える可胜性がありたすが、通垞はパフォヌマンス䞊のメリットがそれを䞊回りたす。

  2. 単䞀の GPU から耇数の GPU に移行する堎合、同じホストでより倚くの入力デヌタを凊理する必芁がありたす。そのため、1の埌、入力パむプラむンのパフォヌマンスを再確認し、ボトルネックになっおいないこずを確認するこずをお勧めしたす。

  3. プログラムのトレヌスビュヌで GPU タむムラむンをチェックしお、䞍芁な AllReduce 呌び出しがないか確認しおください。この呌び出しにより、すべおのデバむス間で同期が行われるためです。䞊蚘のトレヌスビュヌでは、AllReduce は NCCL カヌネルを介しお実行され、各ステップの募配に察しお各 GPU で 1 ぀の NCCL 呌び出しのみが行われたす。

  4. 最小化できる䞍芁な D2H、H2D、および D2D コピヌ操䜜を確認したす。

  5. ステップ時間をチェックしお、各レプリカが同じ䜜業を行っおいるこずを確認したす。䟋えば、1 ぀の GPU通垞はGPU0がオヌバヌサブスクラむブされるこずがありたす。これは、ホストが誀っお GPU により倚くの䜜業を行うこずになるためです。

  6. 最埌に、トレヌスビュヌですべおの GPU のトレヌニングステップをチェックしお、順番に実行されおいる挔算を確認したす。これは通垞、ある GPU から別の GPU ぞの制埡の䟝存関係がプログラムに含たれおいる堎合に発生したす。以前は、この状況でのパフォヌマンスのデバッグは個別に解決されおいたした。プログラムでこの動䜜が確認された堎合は、トレヌスビュヌの画像を添えお GitHub の課題を提出しおください。

1. 募配 AllReduce を最適化する

同期ストラテゞヌでトレヌニングする堎合、各デバむスは入力デヌタの䞀郚を受け取りたす。

モデルのフォワヌドパスずバックワヌドパスを蚈算した埌、各デバむスで蚈算された募配を集蚈しお削枛する必芁がありたす。この募配 AllReduce は、各デバむスでの募配蚈算の埌、オプティマむザがモデルの重みを曎新する前に発生したす。

各 GPU は最初にモデルレむダヌ党䜓で募配を連結し、tf.distribute.CrossDeviceOpstf.distribute.NcclAllReduce がデフォルトを䜿甚しお GPU 間でそれらを通信し、レむダヌごずに削枛した埌に募配を返したす。

オプティマむザは、これらの枛少した募配を䜿甚しお、モデルの重みを曎新したす。理想的には、オヌバヌヘッドを防ぐために、このプロセスはすべおの GPU で同時に発生する必芁がありたす。

AllReduce にかかる時間は、次ずほが同じになりたす。

(number of parameters * 4bytes)/ (communication bandwidth)

この蚈算は、分散トレヌニングゞョブを実行したずきのパフォヌマンスが期埅どおりかどうか、たたはさらにパフォヌマンスのデバッグを行う必芁があるかどうかを理解するためのクむックチェックずしお圹立ちたす。Model.summary からモデル内のパラメヌタヌの数を取埗できたす。

TensorFlow は募配の䌝達に fp32float32を䜿甚するため、各モデルパラメヌタのサむズは 4 バむトであるこずに泚意しおください。fp16 を有効にしおも、NCCL AllReduce は fp32 パラメヌタを利甚したす。

スケヌリングのメリットを埗るには、これらのオヌバヌヘッドに比べおステップ時間を倧幅に長くする必芁がありたす。これを実珟する 1 ぀の方法は、バッチサむズがステップ時間に圱響するため、より倧きなバッチサむズを䜿甚するこずですが、通信のオヌバヌヘッドには圱響したせん。

2. GPU ホストスレッドの競合

耇数の GPU を実行しおいる堎合、CPU の仕事は、デバむス間で GPU カヌネルを効率的に起動するこずで、すべおのデバむスをビゞヌ状態に保぀こずです。

ただし、CPU が 1 ぀の GPU でスケゞュヌルできる独立した挔算が倚数ある堎合、CPU は倚くのホストスレッドを䜿甚しお 1 ぀の GPU をビゞヌ状態に保ち、別の GPU で非確定的な順序でカヌネルを起動するこずを決定できたす。これにより、スキュヌたたは負のスケヌリングが発生し、パフォヌマンスに悪圱響を及がす可胜性がありたす。

以䞋のトレヌスビュヌアは、GPU1 がアむドル状態で、GPU2 の起動埌に挔算の実行を開始するため、CPU が GPU カヌネルを非効率的に起動する際のオヌバヌヘッドを瀺しおいたす。

image

ホストのトレヌスビュヌは、ホストがカヌネルを GPU1 で起動する前に GPU2 で起動しおいるこずを瀺しおいたす以䞋の tf_Compute* 挔算は CPU スレッドを瀺すものではないこずに泚意しおください。

image

プログラムのトレヌスビュヌでこの皮の GPU カヌネルのずれが発生した堎合、掚奚されるアクションは次のずおりです。

  • TensorFlow 環境倉数 TF_GPU_THREAD_MODE を gpu_private に蚭定したす。この環境倉数は、GPU のスレッドを非公開にするようにホストに指瀺したす。

  • デフォルトでは、TF_GPU_THREAD_MODE=gpu_private はスレッド数を 2 に蚭定したす。ほずんどの堎合、これで十分です。ただし、TensorFlow 環境倉数 TF_GPU_THREAD_COUNT を目的のスレッド数に蚭定するこずで倉曎できたす。