Huggingface TransformersとRayを使用した検索増強生成

Using Huggingface Transformers and Ray for Enhanced Search Generation.

アノスケールのチームからのゲストブログ投稿:Amog Kamsetty氏

Huggingface Transformersは最近、Retrieval Augmented Generation(RAG)モデルを追加しました。これは、外部のドキュメント(ウィキペディアなど)を活用して知識を拡充し、知識集約的なタスクで最先端の結果を実現する新しいNLPアーキテクチャです。このブログ投稿では、スケーラブルなアプリケーションを構築するためのライブラリであるRayをRAGの文脈におけるドキュメント検索メカニズムに統合する方法を紹介します。これにより、検索呼び出しの速度が2倍に向上し、RAGの分散ファインチューニングのスケーラビリティが向上します。

Retrieval Augmented Generation(RAG)とは何ですか?

RAGの概要です。モデルは外部のデータセットから文脈ドキュメントを取得し、実行の一環として使用します。これらの文脈ドキュメントは元の入力と組み合わせて出力を生成するために使用されます。このGIFはFacebookのオリジナルのブログ投稿から取得されました。

最近、HuggingfaceはFacebook AIと提携して、RAGモデルをTransformersライブラリの一部として導入しました。

RAGは他のseq2seqモデルと同様に機能しますが、外部の知識ベース(ウィキペディアのテキストコーパスなど)から文脈ドキュメントを取得する中間コンポーネントを持っています。これらのドキュメントは入力シーケンスと組み合わせて基礎となるseq2seqジェネレータに渡されます。

この情報検索ステップにより、RAGはモデルパラメータに埋め込まれた知識と文脈のパッセージに含まれる情報という複数の知識源を活用することができます。これにより、質問応答などのタスクで他の最先端モデルを上回るパフォーマンスを発揮します。Huggingfaceが提供するデモを使用して、自分自身で試すこともできます。

ファインチューニングのスケーリング

これらの文脈ドキュメントの取得は、RAGの最先端の結果にとって重要ですが、追加の複雑さをもたらします。データ並列トレーニングルーチンを介してトレーニングプロセスをスケーリングアップする際、ドキュメントの検索の単純な実装はトレーニングのボトルネックになることがあります。さらに、検索コンポーネントで使用されるドキュメントインデックスは非常に大きいため、各トレーニングワーカーが自分自身の複製されたインデックスを読み込むことは不可能です。

以前のRAGファインチューニングの実装では、torch.distributed通信パッケージを使用してドキュメント検索部分を活用していました。しかし、この実装は柔軟性に欠け、スケーラビリティに制約がありました。

その代わりに、フレームワークに依存しないアドホックな並行プログラミングのためのより柔軟な実装が必要です。それには、Rayが完璧に適しています。Rayは一般的な分散および並列プログラミングのためのシンプルで強力なPythonライブラリです。Rayを使用して分散ドキュメント検索を行うことで、torch.distributedに比べて検索呼び出しごとに2倍の高速化と、ファインチューニングのスケーラビリティの向上を実現しました。

ドキュメント検索のためのRay

torch.distributedの実装によるドキュメント検索

torch.distributedを使用したドキュメント検索の主な欠点は、トレーニングに使用されるプロセスグループに依存していて、ランク0のトレーニングワーカーのみがインデックスをメモリに読み込んでいたことです。

その結果、この実装にはいくつかの制限がありました:

  1. 同期のボトルネック:ランク0のワーカーはすべてのワーカーから入力を受け取り、インデックスクエリを実行し、その結果を他のワーカーに送信する必要がありました。これにより、複数のトレーニングワーカーでのパフォーマンスが制限されました。
  2. PyTorch固有の:ドキュメント検索プロセスグループはトレーニングに使用される既存のプロセスグループに依存する必要があり、トレーニングにはPyTorchを使用する必要がありました。

Rayの実装によるドキュメント検索

これらの制限を克服するために、Rayに基づく分散検索の革新的な実装を導入しました。Rayの状態を持つアクター抽象化を使用して、トレーニングプロセスとは別の複数のプロセスを使用してインデックスを読み込み、検索クエリを処理します。複数のRayアクターを使用することで、検索はもはやボトルネックではなくなり、RAGにはPyTorchの要件もありません。

以下の結果からもわかるように、Rayベースの実装を使用すると、マルチGPUファインチューニングの検索パフォーマンスが向上します。以下の結果は、リトリーバル呼び出しごとの秒数を示しており、GPUの数を増やすとRayを使用した方がtorch.distributedよりもパフォーマンスが向上します。また、リトリーバルを実行するRayプロセスの数を増やすと、単一のリトリーバルプロセスがボトルネックではなくなるため、より多くのトレーニングワーカーでもパフォーマンスが向上します。

2つのGPU 3つのGPU 4つのGPU
torch.distributed 2.12秒/検索 2.62秒/検索 3.438秒/検索
Ray 2つの検索プロセス 1.49秒/検索 1.539秒/検索 2.029秒/検索
Ray 4つの検索プロセス 1.145秒/検索 1.484秒/検索 1.66秒/検索

異なる検索実装のパフォーマンス比較です。各ドキュメント検索実装について、パフォーマンスを向上させるために、8つのGPUバッチサイズで500回のトレーニングステップを実行し、ランク0のトレーニングワーカーで各バッチのコンテキストドキュメントの取得にかかる時間を計測します。結果からわかるように、複数の検索プロセスを使用することでパフォーマンスが向上し、特に複数のGPUでのトレーニングをスケールさせる場合に効果的です。

どのように使いますか?

Huggingfaceは、PyTorch Lightningベースのファインチューニングスクリプトを提供しており、Rayの検索実装をオプションとして追加しました。

試すために、まず必要な要件をインストールしてください。

pip install ray
pip install transformers
pip install -r transformers/examples/research_projects/rag/requirements.txt

次に、データパスやその他の設定を指定してfinetune-rag-ray.shを実行できます。

# 分散検索のためにRayを使用してRAGをファインチューニングするサンプルスクリプト。

# lightning_base.pyにアクセスするために親ディレクトリをPythonパスに追加します。
export PYTHONPATH="../":"${PYTHONPATH}"

# シングルノードのRayクラスタを開始します。
ray start --head

# サンプルのファインチューニング実行です。data_dir、output_dir、model_name_or_pathを指定する必要があります。
# 全ての可能なオプションを表示するには、./examples/rag/finetune_rag_ray.sh --help を実行してください。

python examples/rag/finetune_rag.py \
    --data_dir $DATA_DIR \
    --output_dir $OUTPUT_DIR \
    --model_name_or_path $MODEL_NAME_OR_PATH \
    --model_type rag_sequence \
    --fp16 \
    --gpus 8 \
    --profile \
    --do_train \
    --do_predict \
    --n_val -1 \
    --train_batch_size 8 \
    --eval_batch_size 1 \
    --max_source_length 128 \
    --max_target_length 25 \
    --val_max_target_length 25 \
    --test_max_target_length 25 \
    --label_smoothing 0.1 \
    --dropout 0.1 \
    --attention_dropout 0.1 \
    --weight_decay 0.001 \
    --adam_epsilon 1e-08 \
    --max_grad_norm 0.1 \
    --lr_scheduler polynomial \
    --learning_rate 3e-05 \
    --num_train_epochs 100 \
    --warmup_steps 500 \
    --gradient_accumulation_steps 1 \
    --distributed_retriever ray \
    --num_retrieval_workers 4

# Rayクラスタを停止します。
ray stop

次は何ですか?

Huggingface transformersとRayの検索実装を使用して、より高速な分散ファインチューニングのためのRAGを活用することで、自身の知識集約型タスクで検索ベースの生成を行うことができます。

また、ハイパーパラメータのチューニングもトランスフォーマーファインチューニングの別の側面であり、精度に大きな影響を与えることがあります。スケーラブルで簡単なハイパーパラメータのチューニングには、Ray Tuneライブラリをご覧ください。Ray TuneのPyTorch Lightningとの統合、またはHuggingface transformersとの組み込み統合を使用することで、RAGモデルのパーフェクトなハイパーパラメータを見つけるための実験を実行できます。

最後に、HuggingfaceでのRAGのTensorflow実装もお楽しみに!

RAG+Rayの統合を試す予定がある場合は、Ray Discourseでの経験をお気軽に共有していただくか、RayコミュニティのSlackに参加してさらなる議論に参加していただければ幸いです!

また、https://medium.com/distributed-computing-with-ray/retrieval-augmented-generation-with-huggingface-transformers-and-ray-b09b56161b1e でも公開されています。

We will continue to update VoAGI; if you have any questions or suggestions, please contact us!

Share:

Was this article helpful?

93 out of 132 found this helpful

Discover more

人工知能

「アナコンダのCEO兼共同創業者、ピーターウォングによるインタビューシリーズ」

ピーター・ワンはAnacondaのCEO兼共同創設者ですAnaconda(以前はContinuum Analyticsとして知られる)を設立する前は、ピー...

人工知能

エンテラソリューションズの創設者兼CEO、スティーブン・デアンジェリス- インタビューシリーズ

スティーブン・デアンジェリスは、エンタラソリューションズの創設者兼CEOであり、自律的な意思決定科学(ADS®)技術を用いて...

人工知能

ギル・ジェロン、Orca SecurityのCEO&共同創設者-インタビューシリーズ

ギル・ゲロンは、オルカ・セキュリティのCEO兼共同設立者ですギルは20年以上にわたりサイバーセキュリティ製品をリードし、提...

人工知能

「ジャスティン・マクギル、Content at Scaleの創設者兼CEO - インタビューシリーズ」

ジャスティンは2008年以来、起業家、イノベーター、マーケターとして活動しています彼は15年以上にわたりSEOマーケティングを...

機械学習

もし芸術が私たちの人間性を表現する方法であるなら、人工知能はどこに適合するのでしょうか?

MITのポストドクターであるジヴ・エプスタイン氏(SM '19、PhD '23)は、芸術やその他のメディアを作成するために生成的AIを...

人工知能

「マーシャンの共同創設者であるイータン・ギンスバーグについてのインタビューシリーズ」

エタン・ギンズバーグは、マーシャンの共同創業者であり、すべてのプロンプトを最適なLLMに動的にルーティングするプラットフ...