Transformers documentation

Training on TPU with TensorFlow

Hugging Face's logo
Join the Hugging Face community

and get access to the augmented documentation experience

to get started

Training on TPU with TensorFlow

詳现な説明が䞍芁で、単にTPUのコヌドサンプルを入手しおトレヌニングを開始したい堎合は、私たちのTPUの䟋のノヌトブックをチェックしおください

What is a TPU?

TPUはTensor Processing Unitテン゜ル凊理ナニットの略です。これらはGoogleが蚭蚈したハヌドりェアで、ニュヌラルネットワヌク内のテン゜ル蚈算を倧幅に高速化するために䜿甚されたす。これはGPUのようなものです。ネットワヌクのトレヌニングず掚論の䞡方に䜿甚できたす。䞀般的にはGoogleのクラりドサヌビスを介しおアクセスされたすが、Google ColabずKaggle Kernelsを通じおも無料で小芏暡のTPUに盎接アクセスできたす。

🀗 TransformersのすべおのTensorFlowモデルはKerasモデルですので、この文曞のほずんどの方法は䞀般的にKerasモデル甚のTPUトレヌニングに適甚できたすただし、TransformersずDatasetsのHuggingFace゚コシステムhug-o-systemに固有のポむントもいく぀かあり、それに぀いおは適甚するずきにそれを瀺したす。

What kinds of TPU are available?

新しいナヌザヌは、さたざたなTPUずそのアクセス方法に関する幅広い情報によく混乱したす。理解するための最初の重芁な違いは、TPUノヌドずTPU VMの違いです。

TPUノヌドを䜿甚するず、事実䞊リモヌトのTPUに間接的にアクセスしたす。別個のVMが必芁で、ネットワヌクずデヌタパむプラむンを初期化し、それらをリモヌトノヌドに転送したす。Google ColabでTPUを䜿甚するず、TPUノヌドスタむルでアクセスしおいたす。

TPUノヌドを䜿甚するず、それに慣れおいない人々にはかなり予期しない動䜜が発生するこずがありたす特に、TPUはPythonコヌドを実行しおいるマシンず物理的に異なるシステムに配眮されおいるため、デヌタはロヌカルマシンにロヌカルで栌玍されおいるデヌタパむプラむンが完党に倱敗したす。代わりに、デヌタはGoogle Cloud Storageに栌玍する必芁がありたす。ここでデヌタパむプラむンはリモヌトのTPUノヌドで実行されおいる堎合でも、デヌタにアクセスできたす。

すべおのデヌタをnp.ndarrayたたはtf.Tensorずしおメモリに収めるこずができる堎合、ColabたたはTPUノヌドを䜿甚しおいる堎合でも、デヌタをGoogle Cloud Storageにアップロヌドせずにfit()でトレヌニングできたす。

🀗 Hugging Face固有のヒント🀗: TFコヌドの䟋でよく芋るであろうDataset.to_tf_dataset()ずその高レベルのラッパヌであるmodel.prepare_tf_dataset()は、TPUノヌドで倱敗したす。これは、tf.data.Datasetを䜜成しおいるにもかかわらず、それが「玔粋な」tf.dataパむプラむンではなく、tf.numpy_functionたたはDataset.from_generator()を䜿甚しお基盀ずなるHuggingFace Datasetからデヌタをストリヌムで読み蟌むこずからです。このHuggingFace Datasetはロヌカルディスク䞊のデヌタをバックアップしおおり、リモヌトTPUノヌドが読み取るこずができないためです。

TPUにアクセスする第二の方法は、TPU VMを介しおです。TPU VMを䜿甚する堎合、TPUが接続されおいるマシンに盎接接続したす。これはGPU VMでトレヌニングを行うのず同様です。TPU VMは䞀般的にデヌタパむプラむンに関しおは特に䜜業がしやすく、䞊蚘のすべおの譊告はTPU VMには適甚されたせん

これは䞻芳的な文曞ですので、こちらの意芋です可胜な限りTPUノヌドの䜿甚を避けおください。 TPU VMよりも混乱しやすく、デバッグが難しいです。将来的にはサポヌトされなくなる可胜性もありたす - Googleの最新のTPUであるTPUv4は、TPU VMずしおのみアクセスできるため、TPUノヌドは将来的には「レガシヌ」のアクセス方法になる可胜性が高いです。ただし、無料でTPUにアクセスできるのはColabずKaggle Kernelsの堎合がありたす。その堎合、どうしおも䜿甚しなければならない堎合の取り扱い方法を説明しようずしたす詳现はTPUの䟋のノヌトブックで詳现な説明を確認しおください。

What sizes of TPU are available?

単䞀のTPUv2-8/v3-8/v4-8は8぀のレプリカを実行したす。TPUは数癟から数千のレプリカを同時に実行できるポッドに存圚したす。単䞀のTPUよりも倚くのTPUを䜿甚するが、ポッド党䜓ではない堎合たずえばv3-32、TPUフリヌトはポッドスラむスずしお参照されたす。

Colabを介しお無料のTPUにアクセスする堎合、通垞は単䞀のv2-8 TPUが提䟛されたす。

I keep hearing about this XLA thing. What’s XLA, and how does it relate to TPUs?

XLAは、TensorFlowずJAXの䞡方で䜿甚される最適化コンパむラです。JAXでは唯䞀のコンパむラであり、TensorFlowではオプションですがしかしTPUでは必須です、Kerasモデルをトレヌニングする際にmodel.compile()に匕数jit_compile=Trueを枡すこずで最も簡単に有効にできたす。゚ラヌが発生せず、パフォヌマンスが良奜であれば、それはTPUに移行する準備が敎った良い兆候です

TPU䞊でのデバッグは䞀般的にCPU/GPUよりも少し難しいため、TPUで詊す前にたずCPU/GPUでXLAを䜿甚しおコヌドを実行するこずをお勧めしたす。もちろん、長時間トレヌニングする必芁はありたせん。モデルずデヌタパむプラむンが期埅通りに動䜜するかを確認するための数ステップだけです。

XLAコンパむルされたコヌドは通垞高速です。したがっお、TPUで実行する予定がない堎合でも、jit_compile=Trueを远加するこずでパフォヌマンスを向䞊させるこずができたす。ただし、以䞋のXLA互換性に関する泚意事項に泚意しおください

苊い経隓から生たれたヒント: jit_compile=Trueを䜿甚するこずは、CPU/GPUコヌドがXLA互換であるこずを確認し、速床を向䞊させる良い方法ですが、実際にTPUでコヌドを実行する際には倚くの問題を匕き起こす可胜性がありたす。 XLAコンパむルはTPU䞊で暗黙的に行われるため、実際にコヌドをTPUで実行する前にその行を削陀するこずを忘れないでください

How do I make my model XLA compatible?

倚くの堎合、コヌドはすでにXLA互換かもしれたせんただし、XLAでは動䜜する通垞のTensorFlowでも動䜜しないいく぀かの芁玠がありたす。以䞋に、3぀の䞻芁なルヌルにたずめおいたす

🀗 HuggingFace固有のヒント🀗: TensorFlowモデルず損倱関数をXLA互換に曞き盎すために倚くの努力を払っおいたす。通垞、モデルず損倱関数はデフォルトでルヌル1ず2に埓っおいるため、transformersモデルを䜿甚しおいる堎合はこれらをスキップできたす。ただし、独自のモデルず損倱関数を蚘述する堎合は、これらのルヌルを忘れないでください

XLA Rule #1: Your code cannot have “data-dependent conditionals”

これは、任意のifステヌトメントがtf.Tensor内の倀に䟝存しおいない必芁があるこずを意味したす。䟋えば、次のコヌドブロックはXLAでコンパむルできたせん

if tf.reduce_sum(tensor) > 10:
    tensor = tensor / 2.0

これは最初は非垞に制限的に思えるかもしれたせんが、ほずんどのニュヌラルネットコヌドはこれを行う必芁はありたせん。通垞、この制玄を回避するためにtf.condを䜿甚するかドキュメントはこちらを参照、条件を削陀しお代わりに指瀺倉数を䜿甚したりするこずができたす。次のように

sum_over_10 = tf.cast(tf.reduce_sum(tensor) > 10, tf.float32)
tensor = tensor / (1.0 + sum_over_10)

このコヌドは、䞊蚘のコヌドずたったく同じ効果を持っおいたすが、条件を回避するこずで、XLAで問題なくコンパむルできるこずを確認したす

XLA Rule #2: Your code cannot have “data-dependent shapes”

これは、コヌド内のすべおの tf.Tensor オブゞェクトの圢状が、その倀に䟝存しないこずを意味したす。たずえば、tf.unique 関数はXLAでコンパむルできないので、このルヌルに違反したす。なぜなら、これは入力 Tensor の䞀意の倀の各むンスタンスを含む tensor を返すためです。この出力の圢状は、入力 Tensor の重耇具合によっお異なるため、XLAはそれを凊理しないこずになりたす

䞀般的に、ほずんどのニュヌラルネットワヌクコヌドはデフォルトでルヌル2に埓いたす。ただし、いく぀かの䞀般的なケヌスでは問題が発生するこずがありたす。非垞に䞀般的なケヌスの1぀は、ラベルマスキングを䜿甚する堎合です。ラベルを無芖しお損倱を蚈算する堎所を瀺すために、ラベルを負の倀に蚭定する方法です。NumPyたたはPyTorchのラベルマスキングをサポヌトする損倱関数を芋るず、次のようなブヌルむンデックスを䜿甚したコヌドがよく芋られたす

label_mask = labels >= 0
masked_outputs = outputs[label_mask]
masked_labels = labels[label_mask]
loss = compute_loss(masked_outputs, masked_labels)
mean_loss = torch.mean(loss)

このコヌドはNumPyやPyTorchでは完党に機胜したすが、XLAでは動䜜したせんなぜなら、masked_outputsずmasked_labelsの圢状はマスクされた䜍眮の数に䟝存するため、これはデヌタ䟝存の圢状になりたす。ただし、ルヌル1ず同様に、このコヌドを曞き盎しお、デヌタ䟝存の圢状なしでたったく同じ出力を生成できるこずがありたす。

label_mask = tf.cast(labels >= 0, tf.float32)
loss = compute_loss(outputs, labels)
loss = loss * label_mask  # Set negative label positions to 0
mean_loss = tf.reduce_sum(loss) / tf.reduce_sum(label_mask)

ここでは、デヌタ䟝存の圢状を避けるために、各䜍眮で損倱を蚈算しおから、平均を蚈算する際に分子ず分母の䞡方でマスクされた䜍眮をれロ化する方法を玹介したす。これにより、最初のアプロヌチずたったく同じ結果が埗られたすが、XLA互換性を維持したす。泚意点ずしお、ルヌル1ず同じトリックを䜿甚したす - tf.boolをtf.float32に倉換しお指暙倉数ずしお䜿甚したす。これは非垞に䟿利なトリックですので、自分のコヌドをXLAに倉換する必芁がある堎合には芚えおおいおください

XLA Rule #3: XLA will need to recompile your model for every different input shape it sees

これは重芁なルヌルです。これは぀たり、入力圢状が非垞に倉動的な堎合、XLA はモデルを䜕床も再コンパむルする必芁があるため、倧きなパフォヌマンスの問題が発生する可胜性があるずいうこずです。これは NLP モデルで䞀般的に発生し、トヌクナむズ埌の入力テキストの長さが異なる堎合がありたす。他のモダリティでは、静的な圢状が䞀般的であり、このルヌルはほずんど問題になりたせん。

ルヌル3を回避する方法は䜕でしょうか鍵は「パディング」です - すべおの入力を同じ長さにパディングし、次に「attention_mask」を䜿甚するこずで、可倉圢状ず同じ結果を埗るこずができたすが、XLA の問題は発生したせん。ただし、過床のパディングも深刻な遅延を匕き起こす可胜性がありたす - デヌタセット党䜓で最倧の長さにすべおのサンプルをパディングするず、倚くの蚈算ずメモリを無駄にする可胜性がありたす

この問題には完璧な解決策はありたせんが、いく぀かのトリックを詊すこずができたす。非垞に䟿利なトリックの1぀は、バッチのサンプルを32たたは64トヌクンの倍数たでパディングするこずです。これにより、トヌクン数がわずかに増加するだけで、すべおの入力圢状が32たたは64の倍数である必芁があるため、䞀意の入力圢状の数が倧幅に枛少したす。䞀意の入力圢状が少ないず、XLA の再コンパむルが少なくなりたす

🀗 HuggingFace に関する具䜓的なヒント🀗: 匊瀟のトヌクナむザヌずデヌタコレクタヌには、ここで圹立぀メ゜ッドがありたす。トヌクナむザヌを呌び出す際に padding="max_length" たたは padding="longest" を䜿甚しお、パディングされたデヌタを出力するように蚭定できたす。トヌクナむザヌずデヌタコレクタヌには、䞀意の入力圢状の数を枛らすのに圹立぀ pad_to_multiple_of 匕数もありたす

How do I actually train my model on TPU?

䞀床トレヌニングが XLA 互換性があるこずを確認し、TPU Node/Colab を䜿甚する堎合はデヌタセットが適切に準備されおいる堎合、TPU 䞊で実行するこずは驚くほど簡単ですコヌドを倉曎する必芁があるのは、いく぀かの行を远加しお TPU を初期化し、モデルずデヌタセットが TPUStrategy スコヌプ内で䜜成されるようにするこずだけです。これを実際に芋るには、TPU のサンプルノヌトブックをご芧ください

Summary

ここでは倚くの情報が提䟛されたしたので、TPU でモデルをトレヌニングする際に以䞋のチェックリストを䜿甚できたす

  • コヌドが XLA の䞉぀のルヌルに埓っおいるこずを確認したす。
  • CPU/GPU で jit_compile=True を䜿甚しおモデルをコンパむルし、XLA でトレヌニングできるこずを確認したす。
  • デヌタセットをメモリに読み蟌むか、TPU 互換のデヌタセット読み蟌みアプロヌチを䜿甚したすノヌトブックを参照。
  • コヌドを Colabアクセラレヌタを「TPU」に蚭定たたは Google Cloud の TPU VM に移行したす。
  • TPU 初期化コヌドを远加したすノヌトブックを参照。
  • TPUStrategy を䜜成し、デヌタセットの読み蟌みずモデルの䜜成が strategy.scope() 内で行われるこずを確認したすノヌトブックを参照。
  • TPU に移行する際に jit_compile=True を倖すのを忘れないでください
  • 🙏🙏🙏🥺🥺🥺
  • model.fit() を呌び出したす。
  • おめでずうございたす
< > Update on GitHub