2台のMac StudioをThunderbolt 5で連結! 計128GBメモリ環境と分散推論「exo」でLLMを爆速化してみた

2台のMac StudioをThunderbolt 5で連結! 計128GBメモリ環境と分散推論「exo」でLLMを爆速化してみた

「exo」というソフトウェアを知っているだろうか。複数のデバイスをネットワークで接続し、まるで1台の大きなマシンのように協調させてLLM(大規模言語モデル)を動かせる、オープンソースのフレームワークだ。

 通常、LLMを動かすためには膨大なメモリを搭載した高価なサーバが必要だ。しかしexoを使うと、手元にある複数のデバイスを束ねて、単体では動かせなかった大きなモデルを推論できるようになる。

 exoはテンソル並列処理という方式を採用しており、モデルの重みを複数のノードに分散して処理する特徴を持つ。対応するバックエンドはMLXやllama.cppなど複数あり、Apple Siliconを搭載したMacとの親和性が特に高いことが特徴だ。

 さらに、OpenAI互換のAPIエンドポイントも備えているため、既存のツールやアプリケーションからもそのままクラスタを利用できるという大きなメリットがある。

 今回は16CPU、40GPUのM4 Maxに64GBユニファイドメモリを搭載した「Mac Studio」2台を使った環境を構築してみたので、その一部始終を紹介しよう。

なぜMac Studioを2台使ってクラスタを組むのか

 Mac Studioのクラスタ構成に興味を持ったきっかけは2つある。

 1つ目は、以前使っていたLLMサーバのスペックだ。Mac Studioに移行する前は、128GBのメモリを搭載したサーバでローカルLLMを動かしていた。Mac Studio 1台のユニファイドメモリは64GBだが、これを2台束ねれば合計128GBのメモリプールを構築でき、以前のサーバと同等のモデルサイズを動かせる環境を実現できると考えたためだ。

 2つ目は、Thunderbolt 5ブリッジを使った「RDMA」(Remote Direct Memory Access)のサポートだ。CPUを介さずに直接メモリ間でデータをやりとりできる技術で、TCP/IPベースの通信と比べてレイテンシが大幅に下がり、帯域をより効率的に利用できる仕組みだ。

 もともとM4チップを搭載した「Mac mini」が発売された当初、exoとThunderbolt 4を組み合わせれば小さなLLMクラスタを構成できると考えていたものの、TCP/IPでのクラスタ構成はノード間の通信がボトルネックになると考えて二の足を踏んでいた。

 そんな中、macOS Tahoe 26.3から、Thunderbolt接続でRDMAを有効化できるようになった。ユニファイドメモリの広い帯域幅を生かしつつ、Thunderbolt 4より高速なThunderbolt 5を搭載したMac Studioであれば、十分なパフォーマンスを発揮すると考え、macOS Tahoe 26.3が出た翌日にApple 丸の内で同じ構成のMac Studioをもう1台購入するに至った。

exoの導入手順

 さて、前置きはこれくらいにして、実際にMac Studioを2台を使ってexoクラスタを構成してみよう。macOS環境でのexoの導入手順は非常に簡単だ。

 まず、GitHubの公式リリースページにアクセスし、.dmgファイルをダウンロードしてインストールする(執筆段階のバージョンはEXO-1.0.69.dmg)。

 インストール後、アプリケーションフォルダーからexoを起動すると、「EXO Network Configuration」画面が表示されるので、「Install」をクリックして進める。

 続いて「Add devices to run larger models」という画面が表示される。既にThunderbolt 5ケーブルでMac Studio同士を接続し、片方のセットアップが完了していれば、「Your EXO network」にクラスタ構成が表示されるので、「Continue」をクリックしよう。

 なお、Thunderbolt 5ケーブルでノード間を接続し、かつRDMAを利用する場合はRJ-45ポートの左隣のThunderbolt 5ポートはexoでRDMAを利用できないため、それ以外のポートに接続するようにしてほしい。

 モデルのダウンロードが終わると、exoのメイン画面が表示される。今回のテスト環境では、最初にセットアップしたMac Studioで事前に「gpt-oss-20b」インスタンスを作成していたため、「INSTANCES」の一覧にその状態が表示されている。

 驚くことにexoのクラスタ構成は、それぞれのノードにexoをインストールして、Thunderbolt 5ケーブルを接続するだけ、と高度な処理を実現するにもかかわらず、その手順は非常に簡単だ。

 新たにインスタンスを作成する場合は、「LOAD MODEL」から読み込みたいモデルを選択する。デフォルト設定では、モデルの読み込みに必要なメモリ数に応じて、インスタンスの構成案が自動的に表示されるため、あとは「LAUNCH」をクリックすればOKだ。

RDMAの有効化手順

 さてexoの導入は完了したが、これだけではRDMAは利用できない。RDMAはまだ実験的な機能の扱いで、システム設定からは有効化できず、一度復旧モードで立ち上げる必要がある。

 まずはMac Studioを一度シャットダウンし、電源ボタンを長押しして「オプション」アイコンからスタートアップオプション画面を開こう。

 続いて、macOS復旧画面が表示されるので、FileVault 2でディスク暗号化を実施している場合は、普段利用しているアカウントを選択してログインする。

 復旧画面が表示されたら、上部のメニューバーから「ユーティリティ」→「ターミナル」の順にクリックし、ターミナルを起動する。

 ターミナルが表示されたら「rdma_ctl enable」コマンドを実行しよう。

 無事に成功すると「RDMA Enabled」と表示されるので、復旧画面から再起動してmacOSを立ち上げる。これでRDMAの有効化は完了だ。これを全ノードで実施しよう。

TCP/IPとRDMA、Pipeline並列とTensor並列の性能比較

 さてexoクラスタの構築とRDMAの有効化が完了したので、早速TCP/IP構成とRDMA構成とでどの程度パフォーマンスが変わるのか見てみよう。

 今回ノード間接続に利用するThunderbolt 5の帯域は最大120Gbpsだ。従来のTCP/IPでexoクラスタを組んだ場合、プロトコルのオーバーヘッドやCPUのコピー処理が入るため、実効帯域はこれより低くなる。

 一方、RDMAを有効化すると、メモリ間の転送がCPUを経由せず直接行われるため、レイテンシの低減と帯域効率の向上が同時に得られるはずだ。

 今回はこの仮説を検証するため、「gpt-oss-120b-MXFP4-Q8」モデルを利用し、以下のプロンプトを実行した際の生成スピード(TPS)の違いを比較した。

「あなたは架空の国の首相です。経済成長率が2%で停滞し、失業率が5%に上昇しています。財政赤字も拡大傾向です。経済成長を加速し、失業率を下げ、財政健全化を同時に達成するための政策パッケージを3つ提案し、それぞれの政策がどのように相互作用するか、メリット・デメリットも含めて説明してください。」

 並列処理方式(Sharding Strategy)と通信方式(Interconnect)を組み合わせたテスト結果は以下の通りだ。

・Pipeline並列+TCP/IP構成(デフォルト):毎秒59.1トークン

・Pipeline並列+RDMA構成:毎秒58.4トークン

・Tensor並列+RDMA構成:毎秒80.8トークン

 この結果から「RDMAさえ有効化していれば高いパフォーマンスが得られる」という仮説は成り立たず、並列処理の方式によってRDMAの恩恵が大きく変わるという興味深い事実が判明した。

 デフォルトの「Pipeline並列」のまま通信をRDMAに変更しても、毎秒58.4トークンとパフォーマンスは向上するどころか微減(誤差の範囲)にとどまっている。

 これは、Pipeline並列がモデルの層(レイヤー)をノード間で分割し、データをバケツリレーのように順次渡していく方式で、通信の頻度自体が比較的少ないため、広帯域・低レイテンシなRDMAの強みが生かされにくい。

 加えて、バケツリレー方式ゆえに前のノードの処理が終わるまで「待ち時間」が発生しやすく、計算リソースにアイドル時間が生じてしまうという構造的な弱点もある。

 一方、「Tensor並列」とRDMAを組み合わせた構成では毎秒80.8トークンと、デフォルト構成比で約1.36倍の大幅な向上が見られた。

 Tensor並列は、モデルの重み(テンソル)自体を複数ノードに分散させ、各ノードが部分的な計算結果を出し、ノード間で集約(All-Reduce)してから次の計算をする形式だ。

 このため各ノードの計算リソースを常にフル稼働させやすく、極めて効率的に活用できる。ただし、Pipeline並列のノード間通信はレイヤー境界でのアクティベーション転送のみで、1回あたりのサイズは大きいが回数は少ない。

 一方Tensor並列は計算のたびにAll-Reduceが走るため、通信回数が桁違いに多くなる。

 ここで、CPUを経由せずに直接メモリ間を高速通信できるRDMAの真価が発揮され、これほどまでに顕著なパフォーマンス向上につながったのだ。

 RDMAを利用したパフォーマンス向上を実現したい場合は、並列処理方式を「Tensor並列」に指定することも忘れないようにしよう。

RDMAに最適化したモデルの読み込み手順

 exoの環境構築時にモデルの読み込みについてデフォルト設定で説明していたが、exo上でRDMAとTensor並列を有効にしてモデルを起動して、最高のパフォーマンスを得る手順を解説しよう。手順は以下の通りだ。

 exoのメイン画面右側にある「LOAD MODEL」から、目的のモデル(今回の例では gpt-oss-120b-MXFP4-Q8 )を選択する。

 続いて、その下にある「ADVANCED OPTIONS」をクリックして詳細設定を展開しよう。すると、「Sharding Strategy(並列処理方式)」と「Interconnect(ノード間の接続方式)」が選択できるので、「Sharding Strategy」を「Tensor」に、「Interconnect」を「RDMA(Fast)」にそれぞれ指定し、「LAUNCH」をクリックしよう。

 これで、Tensor並列とRDMAを組み合わせた、Mac Studioクラスタの真価を発揮できる構成でLLMが起動する。

まとめ

 今回はMac Studio 2台でローカルLLMサーバクラスタを構築してみたが、非常に満足できる構成に仕上がった。

 やはりmacOS Tahoe 26.3からThunderboltブリッジでRDMAをサポートされるようになった点は、ローカルLLMサーバを組むにあたって大きな転換点だ。

 もともとApple SiliconはユニファイドメモリとCPU自体の性能が非常に高く、LLMサーバとして利用するには最高の環境と考えていたものの、メモリサイズが大きいものを選ぶと一回の出費が非常に大きくなる課題も抱えていた。

 そんな中、Thunderboltブリッジを使ってかつノード間の通信レイテンシも低い構成が取れるようになったことは、非常にうれしい話だ。

 もしノードを追加するとなった場合でも、macOSとexoの組み合わせであれば、難なくクラスタの増強が可能な点も筆者は高く評価している。

 今回は得られるパフォーマンスと電源効率からMac Studioを購入したが、exoは他のmacOSデバイスでも利用できるため、M4 Mac miniを使った小さなexoクラスタを組める。コストを抑えながらより大きなモデルを扱いたい場合は、一度検討してみるのもいいだろう。

🍎たったひとつの真実見抜く、見た目は大人、頭脳は子供、その名は名馬鹿ヒカル!🍏