LLMパフォーマンスのためのチートコード:投機的デコード入門

Table of Contents

LLMパフォーマンスのためのチートコード:投機的デコード入門

実践AI 推論に関しては、応答を生成できる速度が速いほど良いのですが、ここ数週間、チップの新興企業から、驚くほど高い数値を主張する発表が数多くありました。

つい最近、Cerebras は推論のマイルストーンを達成し、Meta の 4050 億パラメータの巨大システムで 969 トークン/秒 (モデルの完全な 128K コンテキスト ウィンドウで 539 トークン/秒) を生成したと発表した。

小型のLlama 3.1 70Bモデルでは、Cerebrasはさらに高いパフォーマンスを報告し、2,100トークン/秒を超えました。AIチップのスタートアップ企業Groqも1,665トークン/秒でそれに迫っています。

これらの数値は、GPU単体で実現可能な範囲をはるかに超えています。Artificial AnalysisのLlama 3.1 70B APIリーダーボードによると、最速のGPUベースのサービスでも1秒あたり約120トークンが上限で、従来のIaaSプロバイダーでは30トークン程度となっています。

その理由の一部は、CerebrasとGroqのチップがどちらもGPUではないという事実にあります。これらは、推論に通常伴う帯域幅のボトルネックを克服するために、大容量のSRAMバンクを活用する、専用のAIアクセラレータです。

しかし、それだけではこれほど大きな飛躍は説明できません。CerebrasとGroqは以前、Llama 3.1 70Bのパフォーマンスがそれぞれ約450トークン/秒と250トークン/秒であることを示していました。

代わりに、パフォーマンスの飛躍的な向上は、投機的デコードと呼ばれる技術のおかげで可能になりました。

パフォーマンスのためのチートコード

投機的デコードの概念に馴染みがなくてもご心配なく。この手法は実は非常にシンプルで、Llama 3.1 8Bのような小さなドラフトモデルを使って初期出力を生成し、Llama 3.1 70Bや405Bのような大きなモデルをファクトチェッカーとして利用することで精度を保ちます。

研究によれば、この技術が成功すれば、トークン生成速度が 2 倍から 3 倍に向上し、実際のアプリケーションでは 6 倍以上の改善が見られることが示されています。 

このドラフトモデルは、熟練したタイピストであるパー​​ソナルアシスタントのようなものだと考えてみてください。彼らはメールへの返信をはるかに速く行え、その予測が正確であれば、あなた(この例えでは大きなモデル)は送信ボタンをクリックするだけで済みます。もし彼らがたまにメールを正しく入力しなかった場合は、あなたが介入して修正することができます。

投機的デコードを使用することで、少なくとも平均的には、ドラフトモデルに必要なリソース(TOPSまたはFLOPS、メモリ帯域幅の両方)が少なくなるため、スループットが向上します。さらに、大規模モデルが結果のチェックを継続するため、Artificial Analysisのベンチマークでは、完全なモデルを実行する場合と比較して精度の低下は実質的にないと主張しています。

ぜひお試しください

ここまで準備が整いましたので、いよいよ投機的デコードを実際にテストしてみましょう。投機的デコードは多くの人気モデルランナーでサポートされていますが、今回のハンズオンではLlama.cppを使用します。

これはLlama.cppのインストールと設定に関するガイドではありません。幸いなことに、Llama.cppの実行は比較的簡単で、macOS、Windows、Linux向けのビルド済みパッケージもいくつか用意されています。こちらから入手できます。

ただし、お使いのハードウェアで最適なパフォーマンスを得るには、常に最新リリースを手動でコンパイルすることをお勧めします。Llama.cpp のコンパイルに関する詳細は、こちらをご覧ください。

Llama.cpp をデプロイしたら、投機的デコードを使って新しいサーバーを起動できます。まずは、llama-serverお好みのターミナルエミュレータで実行ファイルを探してください。

次にモデルをダウンロードします。シンプルにするために、Hugging Faceの8ビット量子化GGUFモデルを2つ使用します。ドラフトモデルにはLlama 3.2 1B、メインモデルにはLlama 3.1 8Bを使用します。これらのモデルの実行には、12GB弱のvRAMまたはシステムメモリが必要です。

macOS または Linux を使用している場合は、 を使用してwgetモデルをプルダウンできます。

https://huggingface.co/bartowski/Meta-Llama-3.1-8B-Instruct-GGUF/resolve/main/Meta-Llama-3.1-8B-Instruct-Q8_0.gguf を wget します。 https://huggingface.co/bartowski/Llama-3.2-1B-Instruct-GGUF/resolve/main/Llama-3.2-1B-Instruct-Q8_0.gguf

次に、以下のコマンドを実行して投機的デコードをテストします。ご安心ください。各パラメータについては後ほど詳しく説明します。

./llama-speculative -m Meta-Llama-3.1-8B-Instruct-Q8_0.gguf -md Llama-3.2-1B-Instruct-Q8_0.gguf -c 4096 -cd 4096 -ngl 99 -ngld 99 --draft-max 16 --draft-min 4 -n 128 -p 「イギリスの初代首相は誰でしたか?」

注:./llama-speculative Windows ユーザーの場合はを に置き換えてください。GPU アクセラレーションを使用していない場合は ともllama-speculative.exe削除してください。-ngl 99-ngld 99

プロンプトを入力してから数秒後に、回答が表示され、生成率と、小さなモデルによってドラフトされたトークンの数と大きなモデルによって受け入れられたトークンの数を示す表示も表示されます。 

0.033秒で9トークンをエンコード、速度: 269.574 t/s
0.762秒で139トークンをデコードしました。速度: 182.501 t/s
...
n_ドラフト = 16
n_予測 = 139
n_drafted = 208
n_accept = 125
受け入れる = 60.096%

受理率が高いほど、生成率も高くなります。今回のケースでは、特にドラフトモデルではパラメータ数がかなり少ないモデルを使用しているため、受理率が低い理由が説明できるかもしれません。

しかし、受け入れ率が60%であっても、182トークン/秒というパフォーマンスの大幅な向上が見られます。Llama 3.1 8Bを使用し、投機的デコードを有効にしない場合、90~100トークン/秒に近いパフォーマンスが得られました。

それで、このコマンドでは何が起こっているのでしょうか?  

  • ./llama-speculative は、投機的デコードを使用することを指定します。
  • -m-md はそれぞれメイン(大きい)モデルとドラフト(小さい)モデルへのパスを設定します。
  • -c-cd はそれぞれメインモデルとドラフトモデルのコンテキストウィンドウを設定します。
  • -ngl 99-ngld 99 は、 Llama.cpp にメイン モデルとドラフト モデルのすべてのレイヤーを GPU にオフロードするように指示します。
  • --draft-max--draft-min は、ドラフト モデルが一度に生成するトークンの最大数と最小数を設定します。
  • --draft-p-min は、投機的デコードが行われる最小確率を設定します。
  • -n は出力するトークンの最大数を設定します。
  • -p  は、プロンプトを引用符で囲んで入力する場所です。

利用可能なパラメータの完全な内訳を確認するには、次のコマンドを実行します。

./llama-speculative --help

プロジェクトで投機的デコードを使用する場合は、次のようにして OpenAI 互換の API サーバーを起動することもできます。

./llama-server -m Meta-Llama-3.1-8B-Instruct-Q8_0.gguf -md Llama-3.2-1B-Instruct-Q8_0.gguf -c 4096 -cd 4096 -ngl 99 -ngld 99 --draft-max 8 --draft-min 4 --draft-p-min 0.9 --host 0.0.0.0 --port 8087

これにより、APIサーバーがポート8087で公開され、他のOpenAI互換APIサーバーと同様に操作できるようになります。この例は概念実証として提供されています。本番環境では、APIキーを設定し、ファイアウォールでアクセスを制限する必要があるでしょう。

ちなみに、--sampling-seq kTop-K サンプリングを優先するように設定した場合、パフォーマンスが若干向上することも確認されていますが、効果は状況によって異なる場合があります。

パラメータの完全なリストは、llama-server次のコマンドを実行すると見つかります。

./llama-server --help

サーバーが起動したら、アプリケーションやOpen WebUIなどのフロントエンドからサーバーにアクセスできるようになります。後者の設定に関する詳細は、こちらの検索拡張生成に関するガイドをご覧ください。

なぜ推測するのですか?

投機的デコードは決して新しいものではありません。この手法は、少なくとも2022年11月、つまりChatGPTがAI軍拡競争を引き起こしてから間もなく、すでに議論されていました。

しかし、モノリシック モデルがますます大きくなるにつれて、投機的デコードは、精度を損なうことなく、Llama 3.1 405B のような大規模なモノリシック モデルをより効率的に実行する手段を提供します。

Metaの405B基礎モデルは、およそ1兆7000億のパラメータを持つと言われているOpenAIのGPT4と比較すると小さいかもしれないが、それでも高スループットで実行するのは非常に難しいモデルだ。

フル解像度で毎秒25トークンの生成速度を実現するには、810GBを超えるvRAMと20TB/秒を超えるメモリ帯域幅が必要です。より高いパフォーマンスを実現するには、並列処理のレベルをさらに高める必要があり、それはより多くのGPUやアクセラレータを必要とします。

ドラフト モデルとして Llama 3.1 70B などを使用した投機的デコードを使用すると、810 に加えてさらに 140 GB のメモリが必要になりますが、理論上は 100 トークン/秒をはるかに超える生成速度を実現できます。ただし、予測ミスが発生すると、スループットが急激に低下します。

これは、投機的デコードに関連する課題の 1 つです。スループットの強化には非常に効果的ですが、テストでは、遅延が散発的かつ不安定になる可能性があります。

これは、Cerebraが以前発表したLlama 3.1の投機的デコード使用時の70Bの結果にも表れています。ドラフトモデルが何なのかは不明ですが、以前のベンチマーク結果から判断すると、8Bバリアントであることはほぼ確実です。ご覧の通り、投機的デコードを実装するとパフォーマンスが大幅に向上しますが、レイテンシの変動は依然として大きく、400トークン以上も上下に大きく変動しています。

はっきり言って、70B の場合は 1,665 ~ 2,100 トークン/秒、405B の場合は最大 969 トークン/秒で、ヒックアップに気付く前に出力の生成が完了する可能性が高くなります。

瞬く間に数百、数千のトークンを生成できる推論エンジンがなぜ必要なのかについては、Cerebras が実際にその問題をうまく説明しています。

このスライドでは、Cerebras が、今後の CoT およびエージェント AI アプリケーションのサポートにおいて、推論の高速化とレイテンシの低減がなぜ重要であるかを説明しています。

このスライドでは、Cerebrasが、CoTおよびエージェントAIアプリケーションを今後サポートするために、より高速な推論とより低いレイテンシがなぜ重要であるかを説明しています。クリックして拡大します。

OpenAIのo1を試したことがあれば、以前のモデルと比べてかなり遅いことに気づいたかもしれません。これは、このモデルが思考連鎖(CoT)ツリーを用いてタスクを個々のステップに分解し、応答を評価し、間違いや論理のギャップを特定し、ユーザーに回答を提示する前に修正するためです。

生成AIプロセスの一部としてCoTを使用すると、回答の精度と信頼性が向上し、誤った行動や幻覚を軽減できると考えられています。しかし、このアプローチの結果、処理速度は大幅に低下します。

この技術の次の進化は、エージェントワークフローにおいてCoT手法と複数のドメイン固有モデルを組み合わせることです。Cerebrasによると、このようなアプローチでは、100倍ものステップと計算能力が必要になります。つまり、トークンを高速に生成できればできるほど、追加のレイテンシをうまく隠蔽できるということです。少なくとも、それが狙いです。®

編集者注:  The Registerは、このような記事の裏付けとして、NVIDIAのRTX 6000 Ada世代グラフィックカード、IntelのArc A770 GPU、AMDのRadeon Pro W7900 DSを提供されました。これらのベンダーは、本記事およびその他の記事の内容に一切関与していません。

Discover More