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 パフォーマンスを最適化するために特定の実行フローに従います:
- Tracing: フォワードパスとバックワードパスが実行される際、中間表現 (IR) グラフがオンザフライでトレースされます。
- Truncation:
xm.mark_step()が呼び出されると(多くの場合MpDeviceLoaderを介して間接的に)、ライブグラフがカットされます。 - Compilation: IR グラフは XLA Higher Level Operations (HLO) に変換(lowered)され、TPU バイナリとしてコンパイルされ、実行されます。
- 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 構成を使用して実施されました。