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 |
再現する方法。
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
開始するには、最初にOPT-1.3Bのような小さなモデルを試すことができます。単一のGPUに収まるため、オフロードは必要ありません。 FlexGenは、ハギングフェイスからウェイトを自動的にダウンロードします。
python3 -m flexgen.flex_opt --model facebook/opt-1.3b
OPT-1.3Bによって生成されたテキストとベンチマーク結果が表示されます。
OPT-30Bのような大規模なモデルを実行するには、CPUオフロードを使用する必要があります。以下のコマンドを試すことができます。 引数は、パラメーター、アテンション・キャッシュ、および非表示状態のオフロード戦略を個別に指定します。 この議論の正確な意味はここにあります。
--percent
python3 -m flexgen.flex_opt --model facebook/opt-30b --percent 0 100 100 0 100 0
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 の数が多い場合、FlexGen はオフロードとパイプラインの並列処理を組み合わせてスケーリングできます。 たとえば、2 つの GPU があり、集約された GPU メモリがモデル サイズよりも小さい場合でも、オフロードが必要です。FlexGenを使用すると、これら2つの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.
FlexGenには、ハギングフェイスのトランスフォーマーのスタイルに従った生成APIがあります。https://github.com/FMInference/FlexGen/blob/4eac83a32232256f64828afbde90764d9e2f6d70/apps/chatbot.py#L60-L65
十分なGPU / CPUメモリがない場合は、次のことを試すことができます。 より多くのメモリを節約しますが、実行速度は遅くなります。
--pin-weight 0
--compress-weight
--percent 0 0 100 0 100 0
以下の機能に取り組む予定です。コミュニティへの貢献を歓迎します。
このリリースに関する初期のフィードバックのおかげで、このREADMEの初期バージョンと私たちのペーパーは、FlexGenの目的と、なぜ私たちがそれに興奮しているのかについて少し不明確であることに気付きました。 私たちの主な貢献は、バッチサイズを効果的に増やすことによって、単一のGPUインスタンスのスループットを向上させることです。 私たちは、設計空間をオフロードして自動的に検索する技術と、精度を損なうことなく4ビット量子化にまで下げることができることを示唆する結果に非常に興奮しています。 これは当然レイテンシーとトレードオフしますが、将来の作業にとって非常に興味深い方向性だと思います。 皆様のフィードバックに感謝いたします。