FlexGen - OPT-175B/GPT-3 などの大規模な言語モデルを <> つの GPU で実行します。ハイスループットの大量バッチ生成に重点を置く。

(Running large language models like OPT-175B/GPT-3 on a single GPU. Focusing on high-throughput large-batch generation.)

Created at: 2023-02-16 05:18:53
Language: Python
License: Apache-2.0

フレックスジェン

FlexGenは、GPUメモリが限られている大規模な言語モデル(16GB T4 GPUや24GB RTX3090ゲーミングカードなど)を実行するための高スループット生成エンジンです。 FlexGenは、IO効率の高いオフロードと圧縮によって有効バッチサイズを増やすことで、高スループットの生成を可能にします。


FlexGenは、とのコラボレーションのおかげで可能になりました

           


大規模言語モデル (LLM) 推論の高い計算要件とメモリ要件により、従来は複数のハイエンド アクセラレータでのみ実現可能です。 FlexGenは、LLM推論のリソース要件を単一のコモディティGPU(T4、3090など)にまで下げ、さまざまなハードウェアセットアップに柔軟に展開できるようにすることを目的としています。FlexGenの背後にある重要な手法は、有効なバッチサイズを増やす手法を開発することにより、レイテンシスループットのトレードオフを行うことです。

FlexGen の主な機能は次のとおりです。

高スループット、大容量バッチのオフロード
他のオフロードベースのシステム(ハギングフェイスアクセラレーション、ディープスピードゼロ推論など)よりも高いスループットの生成-場合によっては桁違いに。重要な革新は、バッチサイズを効果的に増やすことができる新しいオフロード技術です。これは、ベンチマーク (HELM など) やデータ ラングリングなどのバッチ推論シナリオに役立ちます。

📦 極端な圧縮
OPT-175Bなどのモデルのパラメータとアテンションキャッシュの両方を、精度の低下を無視して4ビットに圧縮します。

🚀 スケーラビリティ
分散パイプライン並列処理ランタイムが付属しており、より多くの GPU が与えられた場合にスケーリングできます。

制限
弱いGPUで実行されるオフロードベースのシステムとして、FlexGenにも制限があります。 FlexGen のスループットは、特に小ロットの場合、モデル全体を保持するのに十分な強力な GPU がある場合よりも大幅に低くなります。 FlexGenは主に、単一のGPUでのスループット指向のバッチ処理設定(バッチで多くのドキュメントから情報を分類または抽出するなど)に最適化されています。

|論文を読む |不和に参加する|

コンテンツ

ベンチマーク結果

生成スループット (トークン/秒)

オプト-6.7B オプト-30B オプト-175B
ハグフェイスアクセラレート 25.12 0.62 0.01
ディープスピードZeRO-推論 9.28 0.60 0.01
花びら* - - 0.05
フレックスジェン 25.26 7.32 0.69
圧縮付きフレックスジェン 29.12 8.38 1.12
  • ハードウェア: 4GB の DRAM と 16.208TB の SSD を搭載した GCP 上の NVIDIA T1 (5GB) インスタンス。
  • ワークロード: 入力シーケンス長 = 512、出力シーケンス長 = 32。バッチ サイズは、各システムの生成スループットを最大化する大きな値に調整されます。詳細については、バッチ サイズのを参照してください。
  • メトリック: 生成スループット (token/s) = 生成されたトークンの数 / (プロンプトの処理時間 + 生成の時間)。

再現する方法。

レイテンシとスループットのトレードオフ

FlexGenはバッチサイズを大きくすることでスループットを向上させるため、レイテンシーも増加しますが、これは古典的で基本的なトレードオフです。 次の図は、OPT-175B(左)とOPT-30B(右)の<>つのオフロードベースのシステムのレイテンシとスループットのトレードオフを示しています。 FlexGenは、両方のモデルでより高い最大スループットを実現します。 他のシステムでは、メモリ不足のためにスループットをさらに向上させることはできません。 "FlexGen(c)" は圧縮された FlexGen です。

ロゴ

仕組み

FlexGenは、GPU、CPU、およびディスクからのメモリと計算を集約することにより、さまざまなハードウェアリソースの制約の下で柔軟に構成できます。線形計画オプティマイザを使用して、重み、アクティブ化、アテンションキー/値(KV)キャッシュなど、テンソルを保存してアクセスするための最適なパターンを検索します。FlexGenはさらに、重みとKVキャッシュの両方を4ビットに圧縮し、精度の損失はごくわずかです。

FlexGenの重要なアイデアの1つは、レイテンシとスループットのトレードオフを果たすことです。低遅延を実現することは、オフロード方法にとって本質的に困難です。 ただし、オフロードの I/O 効率は、スループット指向のシナリオでは大幅に向上させることができます (上の図を参照)。 FlexGenは、下の図(b)に示すように、ブロックスケジュールを使用して重みを再利用し、I/Oを計算とオーバーラップしますが、他のベースラインシステムは、下の図(a)に示すように、非効率的な行ごとのスケジュールを使用します。

ロゴ

詳細については、私たちの論文をご覧ください。

取り付ける

必要条件:

指示:

git clone https://github.com/FMInference/FlexGen.git
cd FlexGen
pip3 install -e .

# (Optional) Install openmpi for multi-gpu execution
# sudo apt install openmpi-bin

シングル GPU の使用を開始する

オプト-1.3B

開始するには、最初にOPT-1.3Bのような小さなモデルを試すことができます。単一のGPUに収まるため、オフロードは必要ありません。 FlexGenは、ハギングフェイスからウェイトを自動的にダウンロードします。

python3 -m flexgen.flex_opt --model facebook/opt-1.3b

OPT-1.3Bによって生成されたテキストとベンチマーク結果が表示されます。

オプト-30B

OPT-30Bのような大規模なモデルを実行するには、CPUオフロードを使用する必要があります。以下のコマンドを試すことができます。 引数は、パラメーター、アテンション・キャッシュ、および非表示状態のオフロード戦略を個別に指定します。 この議論の正確な意味はここにあります。

--percent

python3 -m flexgen.flex_opt --model facebook/opt-30b --percent 0 100 100 0 100 0

オプト-175B

OPT-175Bを実行するには、metaseqから重みをダウンロードし、重みをAlpa形式に変換する必要があります。 次に、次の方法ですべての重みをディスクにオフロードすることができます。

python3 -m flexgen.flex_opt --model facebook/opt-175b --percent 0 0 100 0 100 0 --offload-dir YOUR_SSD_FOLDER

オフロード戦略を設定する方法と?
--percent

自動ポリシーオプティマイザーは後でリリースしますが、いくつかの戦略を手動で試す必要があります。 高スループット生成の考え方は、必要に応じてパラメーターと注意キャッシュを可能な限り CPU とディスクにオフロードすることです。 ベンチマークの参照戦略はこちらで確認できます。 メモリ不足を回避するために、より多くのテンソルをCPUとディスクにオフロードするように調整できます。

--percent

分散 GPU へのスケーリング

GPU の数が多い場合、FlexGen はオフロードとパイプラインの並列処理を組み合わせてスケーリングできます。 たとえば、2 つの GPU があり、集約された GPU メモリがモデル サイズよりも小さい場合でも、オフロードが必要です。FlexGenを使用すると、これら2つのGPUを使用してパイプラインの並列処理を実行して、生成を高速化できます。 こちらの例を参照してください。

API の例: 1 つの GPU 上のチャットボット

OPTモデルを使用してチャットボットを構築することにより.pyアプリ/チャットボットでのFlexGen APIの使用法を示します。 FlexGen は主に、データセットの評価や情報抽出などの大規模なバッチのスループット指向のシナリオ向けに最適化されていますが、 FlexGenは、他のオフロードベースのシステムよりも優れたパフォーマンスを備えたチャットボットなどのインタラクティブアプリケーションにも使用できます。 FlexGen は、この単一バッチのケースでは最高のスループットを達成できないことに注意してください。

コマンドの例

以下のコマンド例を使用できます。 十分な GPU/CPU メモリがない場合は、「メモリ不足の処理」セクションを参照してください。

# Chat with OPT-6.7B. You need at least 15GB of GPU memory.
python3 chatbot.py --model facebook/opt-6.7b
# Chat with OPT-30B. You need about 90GB of CPU memory.
python3 chatbot.py --model facebook/opt-30b --percent 0 100 100 0 100 0
# Chat with instruction-tuned OPT-IML-MAX-30B. You need about 90GB of CPU memory.
python3 chatbot.py --model facebook/opt-iml-max-30b --percent 0 100 100 0 100 0

出力例

A chat between a curious human and a knowledgeable artificial intelligence assistant.
Human: Hello! What can you do?
Assistant: As an AI assistant, I can answer questions and chat with you.
Human: What is the name of the tallest mountain in the world?
Assistant: Everest.
Human: I am planning a trip for our anniversary. What things can we do?
Assistant: Well, there are a number of things you can do for your anniversary. First, you can play cards. Second, you can go for a hike. Third, you can go to a museum.

生成 API

FlexGenには、ハギングフェイスのトランスフォーマーのスタイルに従った生成APIがあります。https://github.com/FMInference/FlexGen/blob/4eac83a32232256f64828afbde90764d9e2f6d70/apps/chatbot.py#L60-L65

メモリ不足の処理

十分なGPU / CPUメモリがない場合は、次のことを試すことができます。 より多くのメモリを節約しますが、実行速度は遅くなります。

  • を追加してウェイトを固定しないでください。これにより、CPUの重みメモリ使用量を約20%以上削減できます。
    --pin-weight 0
  • を追加して重み圧縮を有効にします。これにより、重みメモリ使用量を約70%削減できます。
    --compress-weight
  • を使用して重みをディスクにオフロードします。これには、CPUとGPUメモリがほとんど必要ありません。
    --percent 0 0 100 0 100 0

ロードマップ

以下の機能に取り組む予定です。コミュニティへの貢献を歓迎します。

  • [ ] AppleシリコンM1/M2の導入をサポート
  • [ ] Colabの導入をサポート
  • [ ] テキスト要約アプリケーションと、よりスループット指向のアプリケーションを追加します。
  • [ ] チャットボット・アプリケーションのレイテンシーを最適化する
  • []より多くのモデル(ブルーム、CodeGen、GLM)をサポート
  • [ ] コスト・モデルとポリシー・オプティマイザーのリリース
  • []pipインストール可能なパッケージをリリースする

最近の変更

このリリースに関する初期のフィードバックのおかげで、このREADMEの初期バージョンと私たちのペーパーは、FlexGenの目的と、なぜ私たちがそれに興奮しているのかについて少し不明確であることに気付きました。 私たちの主な貢献は、バッチサイズを効果的に増やすことによって、単一のGPUインスタンスのスループットを向上させることです。 私たちは、設計空間をオフロードして自動的に検索する技術と、精度を損なうことなく4ビット量子化にまで下げることができることを示唆する結果に非常に興奮しています。 これは当然レイテンシーとトレードオフしますが、将来の作業にとって非常に興味深い方向性だと思います。 皆様のフィードバックに感謝いたします。