「CPU上での分散Llama 2」
CPU上の分散Llama 2
Pythonとllama.cppおよびPySparkを使用したコモディティハードウェア上の一括推論のおもちゃの例。
なぜ?
この演習は、Meta AIのLLM(Large Language Model)であるLlama 2を使用して、複数のドキュメントをまとめることについてです。非構造化、準構造化、構造化テキストのスケーラブルな要約は、単独の機能として存在することもあり、下流の機械学習モデルにフィードするデータパイプラインの一部でもあります。
具体的には、次のことを同時に実現することを目指しています:
- CPU上でのLlama 2の実行(つまり、GPUの容量制約の除去)
- Apache Sparkとのシームレスな統合(ビッグデータエコシステムの重要な部分)
- サードパーティのエンドポイントの使用禁止(つまり、エアギャップインフラストラクチャや機密性の要件により、モデルはローカルで実行する必要があります)
方法
私たちにはすでに多くの作業がされています!
llama.cppプロジェクトは、数値の重みの解像度(「量子化」)を低下させることにより、CPU上で簡略化されたLLMの実行を可能にします。これらの使いやすいモデルファイルは簡単に入手できます。
次に、llama-cpp-pythonバインディングを使用すると、Python内からllama.cppを簡単に使用できます。
最後に、SparkのapplyInPandas()
(ドキュメント)を使用すると、巨大なデータソースをPandasサイズのチャンクに分割し、それらを独立して処理できます。ただし、このアプローチは、ベクトル化されたSpark関数が同じ結果を達成できる場合にはアンチパターンとなる場合がありますが、私たちの場合、Sparkを単純なオーケストレータとして使用して、llama.cppの使用をスケールアウトさせています。バッチ処理でllama.cppをより効率的に使用する方法は他にもあるかもしれませんが、Sparkの耐障害性とスケーラビリティの自動的な利点とシンプルさが魅力的です。
計画
楽しいテストとして、Llama 2を使用してレオ・トルストイの『戦争と平和』を要約します。この小説は1200ページ以上の長編で、360以上の章があります。各章をドキュメントとして扱います。Llama 2はすでにこの小説について「知っている」ため、キーキャラクターについて尋ねると、以下の出力が生成されます(llama-2–7b-chat.ggmlv3.q8_0.bin
を使用):
プロンプト:「戦争と平和」のアンナ・パヴロヴナについて簡単に説明してください。
レスポンス:アンナ・パヴロヴナはレオ・トルストイの小説「戦争と平和」の主要なキャラクターです。彼女は裕福で知識豊富で魅力的な社交界の人物であり、美しさと機知で知られています。彼女は美しさと魅力にもかかわらず、操り人形であり、狡猾であり、しばしば彼女の知性と機知を使って欲しいものを手に入れます。小説全体を通して、アンナ・パヴロヴナは称賛に値する特徴と欠点を持つ複雑で多面的なキャラクターとして描かれています。彼女は主人公ピエール・ベズホフと特に親しい関係であり、彼の個人的な成長と感情的な発展に重要な役割を果たします。
手順:
- 7Bの量子化されたチャットモデルとllama-cpp-pythonをインストールします。
- 小説をダウンロードし、章ごとに分割してSparkの
DataFrame
を作成します。 - 章ごとに分割し、要約を生成します。
インストール
Sparkクラスターの設定は私たちの範囲外です。Sparkがローカルで実行されているか、SynapseやElastic Map Reduceなどの管理されたサービス、またはKubernetesなどのカスタム展開を介して実行されていることを前提とします。
すべてのワーカーノードには、物理マシン、VM、またはサーバーレスプールのポッドであるかどうかに関係なく、2つのアーティファクトがインストールされる必要があります:
- GGML形式のLLama 2モデル(
/models
にあります) - llama-cpp-pythonモジュール(
pip
を使用してインストール)
私たちは、ここで見つかるLlama 2の7B chat “Q8″バージョンを使用しています。ダウンロードリンクは変更される可能性がありますが、単一ノードの「ベアメタル」のセットアップは以下のようになります:
python3
とこの例を使用してモデルを使用できることを確認してください。要約すると、すべてのSparkコンテキストは/models
からモデルを読み取り、llama-cpp-pythonモジュールにアクセスできる必要があります。
小説のテキストの処理
以下のBashコマンドは小説をダウンロードし、単語のカウントを表示します。
次に、Pythonでテキストファイルを読み取り、Project Gutenbergのヘッダーとフッターを削除します。正規表現CHAPTER .+
で分割して、章の文字列のリストを作成し、それらからSparkのDataFrame
を作成します(このコードでは、spark
という名前のSparkSession
が存在することを前提としています)。
コードは次の出力を生成するはずです:
number of chapters = 365max words per chapter = 3636+------------------------------------------------------------+-------+| text|chapter|+------------------------------------------------------------+-------+|\n\n“Well, Prince, so Genoa and Lucca are now just family...| 1||\n\nAnna Pávlovna’s drawing room was gradually filling. T...| 2||\n\nAnna Pávlovna’s reception was in full swing. The spin...| 3||\n\nJust then another visitor entered the drawing room: P...| 4||\n\n“And what do you think of this latest comedy, the cor...| 5||\n\nHaving thanked Anna Pávlovna for her charming soiree,...| 6||\n\nThe rustle of a woman’s dress was heard in the next r...| 7||\n\nThe friends were silent. Neither cared to begin talki...| 8||\n\nIt was past one o’clock when Pierre left his friend. ...| 9||\n\nPrince Vasíli kept the promise he had given to Prince...| 10|+------------------------------------------------------------+-------+
素晴らしい!今、私たちはフルチャプターテキストと番号を含む365行のDataFrame
を持っています。最後のステップは、各章の要約を含む新しいDataFrame
を作成することです。
Spark処理
以下は、単一の章の要約を生成するためのPythonコードです(単一の行を返すためにlimit(1)
を呼び出していることに注意してください)。スニペットの下に説明があります:
llama2_summarize()
関数は、Sparkによってグループごとに適用されるコードです。 chapter
列でグループ化しているため、関数は各章の行で呼び出されます。 df
引数は単に単一行のPandas DataFrame
です。 モデルはllama2_summarize()
の各呼び出しのたびに読み込まれることに注意してください。これは簡単さのために取るショートカットですが、非効率です。
最後に、Sparkを使用してgroupby()
を行い、applyInPandas()
を呼び出し、章の要約と番号を含むスキーマを設定します。
出力(可読性のために書式設定されています)は次のようになります:
summaryThe chapter is about a conversation between Prince Vasíli Kurágin and Anna Pávlovna Schérer, a well-known socialite and favorite of Empress Márya Fëdorovna. They are discussing various political matters, including the possibility of war with France and Austria's role in the conflict. Prince Vasíli is hoping to secure a post for his son through the Dowager Empress, while Anna Pávlovna is enthusiastic about Russia's potential to save Europe from Napoleon's tyranny. The conversation also touches on personal matters,such as Prince Vasíli's dissatisfaction with his younger sonand Anna Pávlovna's suggestion that he marry off his profligate son Anatole to a wealthy heiress.chapter1
(この章には登場しないにもかかわらず、ナポレオンの使用に注意してください!再度言いますが、これは実際に見たことのない文書を使用した現実的な例ではなく、楽しい演習です。)
この単一の章のテストの実行時間は、64コアの仮想マシンで約2分です。モデルのサイズ/量子化やモデルのパラメータなど、実行時間に影響を与える多くの選択肢があります。重要な結果は、Sparkクラスターを適切にスケーリングアウトすることで、数分ですべての章を要約できるということです。数十万(または数百万!)のドキュメントを毎日処理することは、安価な仮想マシンで構成された大規模なSparkクラスターを使用して可能です。
概要
「温度」や「top_p」といった標準のLLMパラメータの調整や、結果の「創造性」とランダム性を制御するためのプロンプトエンジニアリングなど、まだ触れていないことがたくさんあります。また、Llama 2 7Bモデルを選んだ理由も正当化されていません。特定のユースケースに適した、より小さく、パフォーマンスの良いモデルやモデルファミリーがあるかもしれません。
代わりに、Sparkを使用して(量子化された)LLMのワークロードを簡単に分散させる方法を示しました。次のステップには、以下が含まれるかもしれません:
- モデルのより効率的なロード/キャッシュ
- 異なるユースケースに対するパラメータの最適化
- カスタムプロンプト
We will continue to update VoAGI; if you have any questions or suggestions, please contact us!
Was this article helpful?
93 out of 132 found this helpful
Related articles