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

複数のGPUでローカルLLMを動かすには

24GB GPUを2枚使うことで48GB GPUを1枚で代替できるでしょうか?メモリの総量は同じように見えますが、計算が進む経路は異なります。追加で中古カード1枚を購入する前に、自分が使うプログラムが2枚のGPUにどのように仕事を分配しているかを確認してみましょう。

GPUが2枚認識されることと、同時に使えることは違う

OSがGPUを2台認識しても、アプリが1台のみを使用すれば、残りのメモリはそのモデルに役立たない。実行プログラムは重みとキャッシュを分割しなければならない。各カードには自らの作業空間も確保しなければならないため、総計のメモリをモデルファイルに埋めるのは不可能である。

したがって、カードを購入する前に、望むモデル・フォーマットのマルチGPU対応をまず確認してください。同じアプリ内でも、モデル構造によって分割パスが異なる可能性があります。すでに確認された実行例は、購入候補を絞る際に重要です。

比較図:単一GPUと通信を行う2つのGPUで、複数の長さのリクエストをキャッシュブロックに配置する。
GPUを増やせばメモリと処理能力を向上させられるものの、デバイス間の通信やリクエストバッチング方式が新たな変数として生まれます。

モデルの前半と後半を分担する

モデルの前半を1つのカードに、後半を別のカードに配置するレイヤー分割を考えてみることができます。1トークンの計算はカードを順に通過するため、中間結果を渡す必要があります。両方のカードが常に同時に忙しいとは限りません。

複数のリクエストがある場合は、段階間の空き時間を利用して効果を発揮できる可能性がありますが、単一の回答を受ける場合では効果が異なる可能性があります。このアプローチの容量メリットと単一リクエスト時の速度メリットを別々に検討する理由です。

1つの大きなモデルを2つのGPUメモリに分割して保持し、部分計算結果を合成する図
ランタイムがレイヤーやテンソルを明示的に分割することで、2つのGPUのメモリを1つのモデルで効果的に活用できます。

1つのレイヤーの計算を共有することも可能です

テンソル並列は、一層の計算を複数のGPUが分担し、結果を交換する方法です。計算を並列化できる代わりに通信が繰り返されます。接続が遅い場合、計算を分担したメリットが送信時間に隠れてしまう可能性があります。

PCIe世代および実際のレイン数、GPU間の接続構造を確認してください。NVLinkのサポートについてはカードおよび構成によって異なります。理論的な帯域幅を2倍にすることでトークン速度も2倍になるという計算では、この差が見えません。

2GPUが狭い脚と広い脚で中間計算結果をやり取りする速度差を示した図
各GPUが速くてもPCIeまたはインターフェイスが遅ければ、結果のやり取りがボトルネックになり、カード数分の速度向上は得られません。

同じモデルを2回ロードすることは別の選択です

もしモデルが1チップに収まるならば、各GPUに1つずつ配置してリクエストを分割することも可能です。この場合、複数のユーザーを受け入れる手助けになるかもしれませんが、1つのリクエストが使用可能なメモリが合併されるわけでも、1つの回答が2倍速くなるわけでもありません。

個人用の大規模モデル1つだけを対象とするか、複数のアプリからの要求を同時に処理しようとするかを決定しなければなりません。同じカードを2枚購入した場合、分割と複製のいずれの構成を使うかによって、2枚目のカードが実行する処理が異なります。

GPUの価格だけでなく、PC本体の条件も確認する

2つのスロットがあっても、カードの厚さのため同時に装着できない場合があります。電源装置、ケーブル、冷却およびケースのスペースも確認する必要があります。長時間稼働するスペースの騒音や電力も、カードの価格を越えた追加コストです。

大きなモデルを実行する必要がある場合は、このような複雑性を承知する理由があります。誰かが既に導入されているモデルをさらに速く利用したい場合、単一カードの代替案と全体のコストを比較してください。メモリの合計を確保することは、毎日扱いやすいコンピュータを構築することとは別問題です。