実行プログラムと拡張機能

GPUを2枚使えばローカルLLMも2倍速くなる?

2枚目のGPUを検討する前に、大きなモデルが必要なのか、応答を速くしたいのかを決めましょう。

使いたいモデルが1枚に収まらない、または応答に時間がかかるため、2枚目のGPU1を検討しているとします。まず目的を決めましょう。より大きなモデルを動かしたいのか、1回の応答を速くしたいのか、複数の要求を同時に処理したいのかで必要な構成は異なります。2枚のVRAM2が自動的に統合されるわけではなく、実際の結果はエンジンが対応するモデル配置とカード間の接続に左右されます。

実行条件と要点
  • GPUメモリはカードごとに分かれているため、エンジンがモデル分割に対応している必要があります。
  • レイヤー分割は容量拡張に役立つ場合がありますが、1件の要求の待ち時間がカード枚数に比例して短くなる方法ではありません。
  • レプリカは複数要求の処理量を増やす構成です。1つのモデルを分割するときのGPU間通信や同期のコストとは区別してください。

より大きなモデル、速い応答、より多くの要求のどれが必要か

モデルが1枚のGPUに収まらない、または応答を待つ時間が長く、2枚目を検討している場面を考えます。2枚なら速度も2倍になりそうですが、まず解決したい問題を分けましょう。モデルを載せること、1回の応答を速くすること、複数の人の要求を処理することは別の目標です。2枚目のGPUでより大きなモデルを読み込める場合はありますが、1人分の応答が2倍速くなる保証はありません。

文書要約1回の待ち時間を減らしたいのか、より大きなモデルを載せたいのか、複数の要求を同時に処理したいのかで、比べる値は異なります。1つの応答では最初のトークン3までの時間とその後の生成速度を分け、複数ユーザーでは処理量を見ます。以降では、今の作業を制限しているのがどれかを確認します。

消灯したモニターとGPUを1枚搭載した開いたデスクトップがあり、木の机には紙の束が置かれています。
モデルとコンテキストが1枚のGPUに収まるなら、2枚目は不要かもしれません。

カードを2枚挿してもVRAMは自動で1つにならない

OSやnvidia-smiに2枚とも表示されるかは確認できますが、それだけでは要約アプリが両方を使うとは分かりません。VRAMはカードごとに別で、実行エンジンがモデルを分けて配置し、カード間でデータを移動する設定が必要です。アプリが1枚だけを選ぶ、またはビルドにマルチGPU対応がなければ、2枚目は処理に参加しません。

2枚のVRAM容量の合計が、そのまま重みに使える容量ではありません。コンテキスト用KVキャッシュ4、一時バッファー、フレームワーク、画面表示にも領域が必要です。容量の異なるカードでは、層やバッファーの配置も変わります。要約に使うモデル形式、精度、コンテキスト長を決め、モデル読み込みログでGPUごとのメモリー配置とCPU5に残った処理を確認してください。

目的に合わせてモデルを分割または複製する

llama.cppの文書にはnone、layer、row、tensor方式があります。noneは1枚だけを使います。既定のlayer方式はモデルの層とKVキャッシュをカードごとに分けます。文書要約1件では、最初のGPUが担当する層を計算して中間結果を次のGPUへ渡し、次のカードが続きを処理します。大きなモデルを2枚に分けて載せられますが、1トークンを作るたびに2枚が同じ層を同時に計算する方式ではありません。そのため、この方式だけで1回の応答がGPU枚数に比例して速くなるわけではありません。

tensor方式は同じ処理段階をカード間で分け、並列に計算します。その分、途中結果を頻繁にやり取りすることがあります。llama.cppではrowは非推奨で新しい構成に勧められておらず、tensorは実験的で対応アーキテクチャや条件に制限があります。vLLMにもtensor・pipeline parallelism6がありますが、GPU、モデル、バッチの要件を確認してください。要約に使う実際の要求で比較し、あるエンジンのオプションを別のエンジンへそのまま移さないでください。

各GPUにモデルのレプリカを1つずつ起動すれば、それぞれが別の文書要約要求を処理できます。複数ユーザーの総処理量を増やす方法ですが、1件の要求をカード間で分けるわけではないため、個人の応答におけるトークン生成速度は自動で上がりません。サーバーが要求を各レプリカへ振り分け、モデルが各カードのメモリーに個別に収まる必要があります。

開いたデスクトップに2枚のGPUがあり、作業台に分けられた紙の束が置かれています。
レイヤー分割はモデルを複数GPUに分散して載せます。2枚にすれば1トークンの生成時間が自動で半分になるわけではありません。

カード間の接続も応答時間に影響する

カード間で中間結果をやり取りする経路も確認します。デスクトップではPCI Expressが一般的ですが、実際の帯域はスロット配線、CPU・チップセット構成、ドライバー、GPU間P2P対応によって変わります。NVLinkは一部の対応GPUやシステムにある別個の高速接続で、NVSwitchは複数GPUの接続を拡張するスイッチです。すべてのコンシューマー向けカードにあるわけではなく、2枚挿しただけでNVLinkが使えるようにはなりません。

NCCL7は複数GPUが結果を集めて同期するための集合通信ライブラリです。ケーブルやGPU間接続そのものではなく、システムは利用可能なら直接通信を使い、そうでなければ別の転送方式を使います。tensor方式のように部分結果を頻繁に集めると、計算より通信を待つ時間が長くなることがあります。データセンターの学習数値を家庭用PCの推論速度にそのまま当てはめることはできません。実際の差はモデル、分割方式、バッチ、カード間接続によって変わります。

GPUが2枚入ったデスクトップの前に、紙の束が複数置かれています。
レプリカは別々の要求を処理します。1つの回答の生成速度と、複数の要求の総処理量は分けて見る必要があります。

2枚目を買う前に現在の環境を確認する

まず1枚のGPUで文書要約モデルを実行し、アプリログでGPUごとのモデル配置、CPUに残る層、KVキャッシュのメモリーを確認します。想定するコンテキスト長と要求数を処理できる余裕も見ます。2枚構成を検討する前に、利用するエンジンがモデルと分割方式に対応するか、必要なビルドオプションを含め公式文書で確認してください。最後に、ケース・電源・マザーボードが2枚を搭載できるか、PCIeリンクとP2P対応を調べます。スロット形状だけでは帯域は分かりません。

より大きなモデルを載せたいなら、まずエンジンがlayer方式に対応しているか確認します。1回の応答を短くしたいなら、そのモデルで対応するtensorまたはpipeline8方式が実際の要求時間を減らすか比較します。複数ユーザーの要求が滞っているなら、各カードにレプリカを置く方法を検討します。比較では同じ文書とプロンプト、生成トークン数、コンテキスト長、精度、エンジン版、同時要求数をそろえます。

同じ文書要約を1枚構成と2枚構成で実行し、応答時間、GPUごとのメモリー、エンジンの転送・待ちログを比較します。モデルが1枚に安定して収まり、要求が時々しかないなら、2枚目は不要かもしれません。モデルが収まらないなら対応するlayer分割、1回の応答が遅いなら対応する並列方式、要求が滞るならレプリカを試します。2枚目は費用、電力、発熱も増やすため、ログで目的が解決しない場合は購入前にエンジンの他の対応方式とハードウェア接続を確認してください。

用語の注釈

  1. GPU — 多くの計算を並列に処理するプロセッサーです。AIモデルの実行ではモデル計算を担います。

    本文に戻る
  2. VRAM — グラフィックカードのGPUが使うメモリです。モデルの重みや計算途中の値を置き、システムRAMとは区別されます。

    本文に戻る
  3. トークン — モデルが入力や出力を分けて処理する単位です。1トークンが1文字や一定の時間に相当するわけではありません。

    本文に戻る
  4. KVキャッシュ — 過去トークンのAttention用キー・バリューを保存し、後続トークン生成で再利用するメモリです。容量はコンテキスト長やバッチサイズで変わります。

    本文に戻る
  5. CPU — コンピューターで汎用のプログラム命令を実行する中央処理装置です。AI処理ではGPUなど他のプロセッサーと役割を分けることがあります。

    本文に戻る
  6. パイプライン並列 — モデルの層を複数の装置上の段階に分けて実行する方式です。後の段階が前の結果を待つことがあり、装置を増やしても個々の応答が同比率で速くなるとは限りません。

    本文に戻る
  7. NCCL — 複数のNVIDIA GPU間でデータの交換や集約を行う集団通信ライブラリです。接続ケーブルやNVLinkそのものではありません。

    本文に戻る
  8. パイプライン — 入力から出力まで続く処理段階のまとまりです。段階ごとに異なるモデルやツールを使うことがあります。

    本文に戻る