Hugging Face Transformers と Ray による Retrieval Augmented Generation

Hugging Face は、Retrieval Augmented Generation (RAG) モデルのドキュメント検索メカニズムに Ray を統合しました。この統合により、検索呼び出しのレイテンシを最大 2 倍削減し、知識集約型の NLP タスクにおける分散ファインチューニングの拡張性を向上させます。

Retrieval Augmented Generation (RAG) の理解

Retrieval Augmented Generation (RAG) は、実行中に Wikipedia のテキストコーパスなどの外部知識ベースから文脈ドキュメントを検索することで知識を強化する、sequence-to-sequence (seq2seq) アーキテクチャです。モデルに組み込まれたパラメータのみに依存する標準的なモデルとは異なり、RAG はこれらの内部パラメータと外部のパッセージから取得した情報を組み合わせて出力を生成します。この二重ソースのアプローチにより、RAG は、質問応答のような知識集約型のタスクにおいて、他の最先端モデルを凌駕することができます。

Ray による分散ファインチューニングの拡張

検索ステップは RAG の性能にとって不可欠ですが、分散ファインチューニング中に大きな複雑さをもたらします。データ並列トレーニングルーチンでは、ドキュメントインデックスが各トレーニングワーカーが複製コピーをロードするには大きすぎる場合が多く、潜在的なボトルネックとなります。

以前は、RAG のファインチューニングにおいて、ドキュメント検索に torch.distributed 通信パッケージが使用されていました。しかし、この実装には主に 2 つの制限がありました。

  1. 同期のボトルネック: rank 0 ワーカーがすべてのワーカーからの入力を受け取り、インデックスクエリを実行し、結果を各ワーカーに配布する責任を負っていたため、トレーニングワーカーの数が増えるにつれてパフォーマンスが制限されました。
  2. フレームワーク依存性: 検索プロセスグループはトレーニングプロセスグループに紐付けられていたため、トレーニングプロセスに PyTorch を使用する必要がありました。

torch.distributed を、汎用的な分散および並列プログラミング用の Python ライブラリである Ray に置き換えることで、Hugging Face はフレームワークに依存しない実装を実現しました。Ray のステートフルなアクター抽象化を使用することで、トレーニングプロセスとは別の複数のプロセスがインデックスをロードし、検索クエリを並行して処理できるため、rank 0 のボトルネックが解消されます。

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

Ray を統合することで、マルチ GPU ファインチューニング中の検索性能が torch.distributed の実装と比較して大幅に向上します。GPU の数が増えるにつれてパフォーマンスの差は広がり、Ray の検索プロセス数を増やすことでさらに速度が最適化されます。

Implementation 2 GPU 3 GPU 4 GPU
torch.distributed 2.12 sec/retrieval 2.62 sec/retrieve 3.438 sec/retrieve
Ray (2 retrieval processes) 1.49 sec/retrieve 1.539 sec/retrieve
Ray (4 retrieval processes) 1.145 sec/retrieve 1.484 sec/retrieve 1.66 sec/retrieve

注: ベンチマークは、GPU ごとのバッチサイズを 8 とし、500 トレーニングステップにわたって実施され、rank 0 ワーカーにおける文脈ドキュメントの検索時間を測定しました。

実装と使用方法

ユーザーは、Hugging Face が提供する PyTorch Lightning ベースのファインチューニングスクリプトを使用して、Ray ベースの検索を実装できます。プロセスには raytransformers のインストール、およびファインチューニングスクリプトでの以下の設定が含まれます。

  • Distributed Retriever: ray に設定。
  • Retrieval Workers: --num_retrieval_workers フラグを介して指定。

さらなる最適化を求める場合は、Ray Tune との統合を利用して、スケーラブルなハイパーパラメータチューニングを行い、モデルの精度を向上させることができます。

Sources