vLLMとRDMAで構築するローカルLLMクラスタ (4):PCIeボトルネックの解消とNFS over RDMA

執筆者:佐藤友昭

※ 「vLLMとRDMAで構築するローカルLLMクラスタ」連載記事一覧はこちら


4ノードでのLM実行時の傾向(つづき)

4ノードでの測定結果を前回投稿で紹介した。ハードウェアのインストールの仕方や NFS ストレージ( ストレージノード)のマウントの仕方が結果にどう影響するか試したのでその結果を紹介したい。

GPU と ConnectX をどの PCIe スロットにインストールするか

今回使用している PC 用マザーボードは GPU と ConnectX の両方を PCIe x16 レーンに接続することができない。GPU か ConnectX の一方を x16 レーンに接続したら他方は x4 レーンに接続することになる。PCIe レーン数が潤沢にある WS やサーバー用のマザーボードが既にある場合はそれを使用した方がよいだろう。本稿では PC 用マザーボードでコストパフォーマンスを追求する。

前回の結果はネットワーク帯域を優先し ConnectX を CPU 側の x16 レーンに接続した。GPU は残されたチップセット側の x4 レーンに接続している。

GPU をチップセット側から CPU 側に移動する (Good!)

今回まず、GPU を接続する x4 レーンをチップセット側から CPU 側の x4 レーンに移動することを試した。CPU とチップセット間の DMI を省略することでレイテンシの減少が期待できる。GPU を PC 本体内から外付け GPU ドッキングステーションに移動し、PC と OCulink ケーブルで接続する。PC 側の OCulink コネクタは CPU 側の NVMe スロットに接続する。 この状態で前回と同じ測定を実施し、平均トークン数/秒の値が改善するかどうかを見た。以下がその結果をトークンパラレル数(以下TP)とパイプラインパラレル数(以下PP)、モデルに着目してまとめたものである。

構成 モデル 改善率 備考
TP=1系 全モデル 0-1% ほぼ差なし
TP=2, PP=1 Llama-3.2-1B +8.6%
Llama-3.2-3B +4.5%
その他 +1-2%
TP=4, PP=1 Llama-3.2-1B +8.3% 最大の改善
Llama-3.2-3B +8.3%
その他 +3-4%
TP=2, PP=2 Llama-3.2-1B +6.7%
Llama-3.2-3B +5.7%
その他 +2-3%

TP=1 では差がなく、TP の値が大きいほど、モデルが小さいほど性能向上が見られた。TP の値が大きいほど GPU 間通信の頻度が高く、モデルが小さいほど通信オーバヘッドの影響を受けやすいものと思われる。

GPU を敢えて外付けにすることで性能が向上するのは直感に反する感じではあるが、いわゆる Mini PC と呼ばれるカテゴリの PC 製品でも ConnectX 1枚程度であれば内蔵できるものもあるようなので、OCulink による外付け GPU 構成もコストパフォーマンスに優れた選択肢となる可能性があるということである。

GPU と ConnectX の PCIe レーンを交換する (Bad!)

直感的に、ネットワーク性能を優先した方がスケーラビリティに有利と踏んで ConnectX の方を x16 レーンに接続したが、一応、GPU の方を x16 レーンに接続する構成も試した。残念ながら GPU ドッキングステーションと ConnectX-5 は相性が良くなかったらしく正常に動作しなかったので、ConnectX は CPU 側ではなくチップセット側の x4 レーンに接続する。

構成 モデル 変化率 備考
TP=1系 全モデル ±1%以内 ほぼ差なし
TP=2, PP=1 Llama-3.2-1B -7.0%
Llama-3.2-3B -4.8%
その他 -1-2%
TP=4, PP=1 Llama-3.2-1B -19.7% 最大の性能低下
Llama-3.2-3B -19.0%
Llama-2-7b -13.8%
Llama-3-8B -13.0%
その他 -8-14%
TP=2, PP=2 Llama-3.2-1B -3.4%
Llama-3.2-3B -5.4%
その他 -1-2%

TP=1 では差がないが、TP の値が大きいほど、モデルが小さいほど性能低下が見られた。やはりネットワーク性能を優先して GPU ではなく ConnectX の方を x16 レーンに接続するのが正しそうである。

PC 用マザーボードの CPU 側の x16 スロットは見るからに GPU 様向けという豪華な雰囲気であるが、そこに ConnectX をインストールし、ともすると x4 スロットしかないチップセット側に GPU をインストールすると性能が得られるというのも直感に反する感じではある。(GPU を、チップセット側ではなく CPU 側の x4 レーンに接続した方が性能が得られたというのは既に述べた。)

既に 200Gbps や 400Gbps、800Gbps 世代の新しい ConnectX、スイッチ、ケーブルがあるならそれを使用した方がよいことは言うまでもないだろう。ConnectX-4 以降であれば 100Gbps 製品があり、RoCE スイッチも 16 ポートの 100Gbps 製品の中古の価格が下がってきているので GPU よりはかなり少ない投資で性能を得ることができる。ひとつ気をつけたいのがケーブルである。ConnectX で使用するのであれば、Mellanox(NVIDIA)互換品ではなく少々高くても Mellanox(NVIDIA) 純正品をお勧めする。

NFS/RDMA でマウントする

前回の測定は NFS/TCP でマウントしている。NFS/RDMA でマウントするとモデルのロード時間で若干の短縮が期待できる。平均トークン数/秒の値はモデルのロード後に測定しているのでストレージの速度は影響しないものと思われる。

そこで、一連の測定に掛かったエラプス時間を比較した。これにはモデルのロード時間が含まれる。

構成 NFS/TCP NFS/RDMA 短縮時間 改善率
TP=1, PP=1 (5モデル実行) 8m14.902s 8m4.041s -10.861s -2.2%
TP=1, PP=2 (6モデル実行) 10m33.774s 10m18.254s -15.520s -2.5%
TP=1, PP=4 (7モデル実行) 12m31.049s 12m21.970s -9.079s -1.2%
TP=2, PP=1 (6モデル実行) 11m5.422s 9m39.420s -1m26.002s -13.0%
TP=4, PP=1 (7モデル実行) 10m40.740s 10m0.765s -39.975s -6.2%
TP=2, PP=2 (7モデル実行) 10m21.150s 9m56.201s -24.949s -4.0%

平均トークン数/秒の値は +/- 1% 以内だった。エラプス時間においても体感的な差はさほどなく、NFS/TCP で十分と思われる。

課題と今後の予定

今回まで RTX 4000 Ada GPU 4台を使用してきたが、次回以降は RTX 2000 Ada GPU 4台に変更する。購入価格的には 1/2 以下で、「安価な GPU」と言って差し支えない範囲と思われる。一応、Ada アーキテクチャの RTX GPU なので GPUDirect RDMA 機能もサポートしているものと想定している。4台の PC のうち、H670 と H770 チップセットのマザーボードについては GPUDirect RDMA が動作したと読める POC 情報を見たことがあるので試してみたい。

次回以降はこういった LM 分散実行環境向けの NFS ストレージ(ストレージノード)の方に話をシフトしていく予定である。