TensorFlow と XLA を使用した高速テキスト生成

TL;DR

Hugging Face は TensorFlow 用の transformers ライブラリ内でテキスト生成に対して XLA(Accelerated Linear Algebra)コンパイルを有効化しました。この最適化により生成速度が最大で 100 倍に向上し、多くのベンチマークではテキスト生成タスクにおいて PyTorch を上回ります。

XLA を使用した TensorFlow の高速化

XLA は TensorFlow モデルを高速化するために設計されたコンパイラで、JAX や一部の PyTorch 実装の基盤でもあります。TensorFlow 2 は透明性とデバッグ性を高めるために Eager Execution を使用していますが、その結果、グラフモードの一部の性能優位性が失われます。これらの優位性を取り戻すために、ユーザーは tf.function で関数をラップし、コードをグラフに変換できます。

tf.function または tf.keras.Model.compilejit_compile=True 引数を追加することで、ユーザーは XLA コンパイルをトリガーできます。XLA コンパイルされた関数の最初の呼び出しはコンパイル処理のため遅くなりますが、同じテンソル形状と型での以降の呼び出しは大幅に高速化されます。

XLA テキスト生成の実装要件

XLA はジャストインタイム(JIT)コンパイルと多相性に依存しています。テキスト生成中の高コストな再コンパイル(トレース)を回避するため、以下の技術要件を満たす必要があります。

入力パディング

XLA は異なるテンソル形状、型、またはテンソルでない引数に遭遇するたびに新たなコンパイルステップをトリガーするため、入力プロンプトは一定の長さにパディングする必要があります。Hugging Face は、入力の柔軟性と可能な形状数の制限をバランスさせるために、トークナイザークラスの pad_to_multiple_of 引数の使用を推奨しています。

コードベースのベクトル化

自己回帰的テキスト生成は本質的に動的で、テンソルの拡張や動的スライスを頻繁に使用しますが、これらは XLA に適していません。XLA のサポートを可能にするため、Hugging Face は TensorFlow のテキスト生成コードベースを書き換え、操作をベクトル化し、パディングされた固定サイズの構造を利用するようにしました。さらに、NLP モデルもこれらのパディング構造で位置埋め込みが正しく機能するように修正されました。

Transformers におけるテキスト生成機能

transformers ライブラリの generate 関数は、いくつかのデコード戦略をサポートしています:

  • Greedy Decoding(貪欲デコード): デフォルトの決定的アプローチ(do_sample=False)で、各ステップで最も可能性の高いトークンを選択します。
  • Sampling(サンプリング): 確率的アプローチ(do_sample=True)で、temperature 設定によりランダム性を制御できます。低い値は高確率トークンを優先し、高い値はエントロピーを増加させます。
  • Beam Search(ビームサーチ): num_beams が 1 より大きい場合に有効になり、貪欲デコードよりも出力品質を向上させるために高確率シーケンスを探索します。

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

複数の GPU モデルで TensorFlow と PyTorch を比較したベンチマークは、主に次の 2 つの結果を示しています:

  1. 大幅な高速化: XLA を使用した TensorFlow のテキスト生成は大幅に高速で、場合によっては 100 倍以上の速度向上が見られます。
  2. フレームワーク比較: 圧倒的に多くの場合、XLA を使用した TensorFlow が最速の選択肢であり、テキスト生成タスクでは PyTorch より最大で 9 倍速いこともあります。

Sources