LLM 推論のフォールトトレランス

2024年12月23日 月曜日


【この記事を書いた人】
Pierre Louis Aublin

I'm a researcher at IIJ Research Laboratory, working on security and fault-tolerance of distributed systems to making the Internet a safe place for everyone.

「LLM 推論のフォールトトレランス」のイメージ

IIJ 2024 TECHアドベントカレンダー 12/23の記事です】
※この記事は、原文「Fault-Tolerance for LLM Inference」の和訳です

はじめに

大規模言語モデル (LLM) は、チャットボット、コンテンツ生成 (テキスト、画像、動画)、翻訳など、さまざまなタスクでますます人気が高まっています。

LLM ユーザは、プロンプト (要求を説明するテキスト) を送信して、このようなシステムと対話します。次に、LLM は、推論 と呼ばれるプロセスで GPU セットを活用して回答を生成し、その後、ユーザに回答を返します。

以前の機械学習システムと比較すると、最先端の LLM には数百 GB の GPU メモリが必要ですが、NVIDIA A100 などのハイエンド GPU には 80 GB の RAM しかありません。そのため、モデルを複数の GPU に分割する必要があります。

残念ながら、大規模な GPU の導入は失敗しがちです。これは、Eisenman らPatel らによって実証されています。

推論中に障害が発生すると、ユーザリクエストを最初から再計算する必要があり、追加のレイテンシと計算が発生します。そのため、一部の研究者は LLM 推論をフォールト トレラントにしています。

この投稿では、LLM 推論のメカニズムについて詳しく説明し、A100 GPU で行われたいくつかの実験を紹介し、最後にフォールト トレラント LLM 推論用の DéjàVu システムについて説明します。

LLM 推論の概要

LLM 推論は、ユーザが「東京は」というプロンプトを送信している下の図に示すように、複数のフェーズから成るプロセスです。

LLM 推論プロセス

モデルは最初にそれをトークン化し、モデルのみが理解できる トークン と呼ばれる数値のセットを出力します。次に、トークンは LLM によって 1 回の反復で処理されます。これらの 2 つの計算は、プロンプト処理フェーズ を定義します。このフェーズでは、キー値キャッシュ (KV キャッシュ) に保存された コンテキスト と新しいトークンの両方が出力されます。

推論の​​ 2 番目のフェーズは トークン生成フェーズ で、回答の残りのすべてのトークンが計算されます。1 回の LLM 反復で、以前のコンテキスト (KV キャッシュに保存) とトークンを入力として、1 つの新しいトークンが計算されます。KV キャッシュに保存される新しいコンテキストと新しいトークンが出力されます。

最後に、LLM は、ルックアップ テーブルにアクセスするのと同様のプロセスで、トークンを人間が読める出力に変換します。この出力 (上の図では「東京は日本の首都です」) は、クライアントに返されます。

障害を許容するための 1 つのアイデアは、KV キャッシュを永続化して、リクエストを最初からではなく、障害前の最新の状態から再計算できるようにすることです。

私たちの実験

私たちは、OPT-13B モデルを使用して、2 つの A100 GPU (それぞれ 80 GB の RAM を搭載) でいくつかの実験を実行しました。モデルをロードすると、GPU ごとに 40 GB のメモリが割り当てられます。バッチ サイズは 8 に設定されています。目標は、永続的な KV キャッシュを実装することで、潜在的なレイテンシ ゲインを評価することです。

最初の実験では、各推論段階の平均処理時間を測定します。実験は、合計 2000 トークン (プロンプトの 40 トークンを含む) を生成した後に停止します。下の図からわかるように、プロンプトの処理には 1.7 秒かかりますが、1 つのトークン生成には 2.4 秒かかります。したがって、推論中に 1 回失敗すると、数秒の遅延が発生します。

推論処理時間

2 番目の実験では、失敗を導入しながら Microsoft Azure コードトレース を再生します。指定された割合のリクエストが失敗すると、GPU は最初から再計算する必要があります。

結果は下の図に示されています。失敗がない場合、トレース全体が 253 分 (4 時間強) で再生されます。失敗を導入すると、この実行時間は増加します。失敗したリクエストが 10% の場合は 277 分、20% の場合は 303 分、というように、失敗したリクエストが 100% の場合は最大 507 分になります (つまり、すべてのリクエストを 2 回実行する必要があります)。これは、9% (失敗が 10%) から 100% (失敗が 100%) への増加を表しています。

失敗時の推論

DéjàVu

DéjàVu は、LLM 推論システムのフォールト トレラント システムであり、Strati らが第 41 回国際機械学習会議 (2024) で発表したシステムです。以下の図は、研究論文から引用したもので、そのアーキテクチャを示しています。

DéjàVu アーキテクチャ

DéjàVu は、永続ストレージまたはメイン メモリに KV キャッシュを複製します。障害が発生した場合、KV キャッシュは最新の利用可能なバックアップから復元できるため、推論をゼロからやり直す必要はありません。

障害を検出できるように、GPU は定期的にハートビート メッセージを中央コントローラ コンポーネントに送信します。一定期間が経過しても特定の GPU からハートビートを受信しない場合、GPU に障害があるものとみなされます。

KV キャッシュをホスト CPU に効率的にストリーミング (つまり送信) するために、DéjàVu は KV キャッシュの更新を GPU メモリの 1 つの連続領域に集約します。これにより、小さく連続していない GPU メモリ領域を 1 つずつ転送する場合と比べて、GPU 帯域幅全体を使用できるため、GPU 転送の効率が向上します。

DéjàVu は、プロンプト処理とトークン生成を異なる GPU セットで実行して、これら 2 つのタスク間の競合を回避するなどの他の最適化を提案します。

DéjàVu は、A100 GPU を搭載した実際のハードウェアで評価されています。著者らは、障害のないケースでは、低レイテンシを実現しながら FasterTransformer (ベースライン) の 2 倍のパフォーマンスを発揮することを示しています (下記参照)。

障害のないケースでの DéjàVu のパフォーマンス

障害のあるケースでは、DéjàVu はフォールト トレラントな複製 KV キャッシュのおかげで、ベースラインよりも 16% 速く実行を完了できます (下記図参照)。

障害時の DéjàVu パフォーマンス

結論

この記事では、LLM 推論プロセス中の障害が問題であると主張しました。リクエストをゼロから再実行する必要があり、クライアントが認識するレイテンシが増加するためです。

2 つの A100 GPU でいくつかの実験を実行し、障害のあるリクエスト (つまり、再実行が必要なリクエスト) の割合を増やしました。10% などの低い障害の割合は、リクエストのセット全体を実行するのに 10% 長い時間がかかることを意味します。

最後に、KV キャッシュをスマートに複製し、LLM 推論プロセスの中間状態を保存することで、LLM 推論にフォールト トレランスをもたらすシステムである DéjàVu を紹介しました。その結果、リクエストはゼロからではなく、GPU 障害に近いポイントから再開できます。

謝辞

GPU へのアクセスを許可してくださった IIJ クラウド部門に感謝します。

IIJ Engineers blog読者プレゼントキャンペーン

Xのフォロー&条件付きツイートで、「IoT米」と「バリーくんシール」のセットを抽選でプレゼント!
応募期間は2024/12/02~2024/12/31まで。詳細はこちらをご覧ください。
今すぐポストするならこちら→ フォローもお忘れなく!

Pierre Louis Aublin

2024年12月23日 月曜日

I'm a researcher at IIJ Research Laboratory, working on security and fault-tolerance of distributed systems to making the Internet a safe place for everyone.

Related
関連記事