Hugging Face PyTorch / XLA TPU 統合

Hugging Face は、標準的な Hugging Face Trainer インターフェースを維持しながら、Cloud TPU 上で transformer モデルをトレーニングおよびスケーリングできるようにするために、PyTorch / XLA を統合しました。この統合は、PyTorch / XLA ライブラリを活用して、PyTorch フレームワークを Cloud TPU を含む XLA (Accelerated Linear Algebra) デバイスに接続します。

PyTorch / XLA 技術的実装

この統合により、PyTorch に xla デバイスタイプが導入され、TPU ハードウェア上でテンソルを作成および管理できるようになります。Hugging Face Trainer モジュールは、TrainingArguments データクラスを利用して、is_torch_tpu_available() が true の場合に TPU デバイスを自動的に検出して返します。

勾配の集約とオプティマイザーステップ

Cloud TPU デバイスは通常、複数のコア(例:単一のデバイスに 8 つのコアがある場合など)で構成されているため、データ並列レプリカ間で勾配を交換する必要があります。この統合では、xm.optimizer_step(optimizer) を使用して勾配の集約とそれに続くオプティマイザーステップを処理し、TPU コア間の同期を確保します。

入力パイプライン

ホスト CPU と TPU アクセラレータが互いに待ち状態になってアイドル状態になるのを防ぐため、PyTorch / XLA は入力パイプラインを実装しています。pl.MpDeviceLoader を使用することで、ステップ $n+1$ のトレースを、ステップ $n$ がまだ実行されている間にオーバーラップさせることができ、モデルへのデータ供給を最適化できます。

チェックポイント管理

ポータビリティを確保し、デバイス固有のロードの問題を回避するために、テンソルはチェックポイントを作成する前に CPU に移動されます。xm.save() API は、単一のプロセス(マスター・オーディナル)のみがストレージ場所に書き込むようにすることで、マルチプロセス環境におけるファイルの破損を防ぎます。

PyTorch / XLA の仕組み

遅延テンソル実行

操作を即座に実行する CPU や CUDA テンソルとは異なり、XLA テンソルは遅延(lazy)です。これらは結果が必要になるまで操作をグラフに記録します。この遅延実行により、XLA コンパイラは複数の個別の操作を単一の最適化された操作に融合(fuse)させることができます。

Trace-Compile-Execute サイクル

PyTorch / XLA は、TPU パフォーマンスを最適化するために特定の実行フローに従います:

  1. Tracing: フォワードパスとバックワードパスが実行される際、中間表現 (IR) グラフがオンザフライでトレースされます。
  2. Truncation: xm.mark_step() が呼び出されると(多くの場合 MpDeviceLoader を介して間接的に)、ライブグラフがカットされます。
  3. Compilation: IR グラフは XLA Higher Level Operations (HLO) に変換(lowered)され、TPU バイナリとしてコンパイルされ、実行されます。
  4. Caching: 再コンパイルの高コストを避けるため、コンパイルされた TPU バイナリは、HLO グラフの一意意的なハッシュをキーとしてキャッシュに保存されます。

キャッシュヒット率を最大化し、コンパイルのオーバーヘッドを最小限に抑えるために、テンソルの形状を固定(static)に保つことが推奨されます。Hugging Face モデルは、通常、入力トークンを適切にパディングすることで、静的な形状を維持します。

パフォーマンス・ベンチマーク

v3-8 Cloud TPU システム(4 TPU v3 チップ)を使用して WikiText103 データセットで bert-large-uncased をトレーニングした場合、以下の結果が得られました:

Name Global Batch Size Precision Training Time (mins)
bert-large-uncased 64 FP32 178.4
bert-large-uncased 128 BF16 106.4

これらのベンチマークは、ワークロードがホスト CPU 制限にならないよう、n1-standard-96 CPU 構成を使用して実施されました。

Sources