自作AIスパコンの構築:Exoを使用して分散ハードウェアで70Bモデルを動かす

HomeLab tutorial - IT technology blog
HomeLab tutorial - IT technology blog

ローカルAIにおけるメモリ不足の問題

大規模言語モデル(LLM)を自宅で動かすことは、多くの技術愛好家にとって究極の目標です。プライバシーを完全に守り、月額20ドルのサブスクリプションを支払うことなく自由に実験したいと考えています。しかし、80億(8B)パラメータを超えるモデルをロードしようとすると、その夢はたいてい頓挫します。「Out of Memory(OOM)」エラーに直面するか、5秒に1単語しか出力されないほどシステムが苦戦する様子を眺めることになります。

すでに所有しているハードウェアについて考えてみてください。RTX 3060(12GB VRAM)を搭載したゲーミングPC、16GBのRAMを備えたMacBook Air、そして古いオフィス用ノートパソコンがあるかもしれません。単体では、これらのマシンのどれもLlama 3 70Bモデルを動かすことはできません。メモリ要件が非常に高すぎるためです。このパワーの断片化こそが、ホームラボで基本的な「おもちゃ」のようなモデルの域を超えるための最大の障害となっています。

なぜVRAMが足りないのか

LLMのパフォーマンスは、処理能力(FLOPs)とメモリ容量という2つの要因に依存します。GPUの速度は単語が表示される速さを決定しますが、メモリ容量はモデルがそもそも起動できるかどうかを決定します。70Bパラメータのモデルは、4ビット量子化で圧縮しても、スムーズに動作させるには約40GBのVRAMが必要です。

ほとんどの消費者向けGPUは8GBまたは12GBが限界です。ユニファイドメモリを搭載したハイエンドのMacを持っていても、最大のオープンソースモデルに必要な64GBや128GBを備えていない場合が多いでしょう。問題は、家の中に総パワーが不足していることではなく、パワーが異なる筐体に「サイロ化(孤立)」していることです。これらのギャップを埋め、負荷を共有する方法が必要です。

Exo:ハードウェアのギャップを埋める

Exoは、それらのサイロを打破するために設計されたオープンソースプロジェクトです。モデルを1つのグラフィックカードに無理やり詰め込むのではなく、Exoはピアツーピア(P2P)クラスターを作成します。ネットワーク上の他のデバイスを自動的に検出し、モデルのレイヤーをそれらの間で分割します。

16GBのMacと12GBのPCを接続することを想像してみてください。Exoはこれらを28GBの単一のリソースプールとして扱います。モデルの分割やノード間のデータフローの管理といった重い処理をExoが引き受けます。そして、OpenAIのAPIと全く同じように動作する単一のAPIエンドポイントを提供します。これにより、古いマシンの集まりが、単体のパーツよりも大幅に高性能なシステムに変わります。

このセットアップを習得することは、現代のホームラボにとって不可欠なスキルです。「新しいGPUを買う」というサイクルから抜け出し、すでに所有しているハードウェアからスケーラブルなシステムを構築できるようになります。

クラスターのセットアップ

前提条件

開始する前に、すべてのデバイスが同じネットワーク内にあることを確認してください。可能であればイーサネットケーブルを使用してください。ExoはWi-Fi経由でも動作しますが、レイヤー間のデータ転送の遅延(レイテンシ)により、生成速度が低下します。クラスター内のすべてのマシンにPython 3.10以降が必要です。

1. インストール

使用するすべてのデバイスにExoをインストールする必要があります。ターミナルを開き、以下のコマンドを実行してください:

git clone https://github.com/exo-explore/exo.git
cd exo
pip install -e .

Exoはハードウェアを賢く認識します。macOSでは、自動的にMetalを使用して高速化します。WindowsやLinuxでは、ExoがNvidia GPUコアを活用できるようにCUDAツールキットがインストールされていることを確認してください。

2. プライマリノードの起動

まず、最も強力なマシンをプライマリのエントリポイントとして選びます。アーキテクチャはP2Pですが、このノードがメインのAPIゲートウェイとして機能します。次のコマンドを実行します:

exo

Exoがローカルネットワーク内のピアのスキャンを開始します。特定のモデルをすぐに実行したい場合は、次のように入力します:

exo run llama-3-70b

3. ワーカーノードの接続

次に、部屋の隅にあるMac miniや古いLinuxサーバーなど、他のデバイスに移動します。同じexoコマンドを実行してください。Exoはゼロ構成ネットワークを使用しているため、ノードは数秒以内にお互いを発見します。

プライマリ端末が更新され、合計メモリが表示されます。8GB、16GB、12GBが統合されて36GBの単一プールになるのを見るのは素晴らしい気分です。これで分散スーパーコンピュータがオンラインになったことが確認できます。

分散モデルの実行

ノードがリンクされると、Exoは各マシンのメモリに基づいてモデルを分割します。Llama 3 70Bモデルの場合、最初の25レイヤーをデスクトップに、次の30レイヤーをMacに、最後のレイヤーをノートパソコンに配置するといった具合です。

# いずれかのノードで実行してモデルを開始します
exo run llama-3.1-70b

ソフトウェアは重みを一度ダウンロードしてキャッシュします。モデルがロードされると、Exoはhttp://localhost:1234/v1でOpenAI互換のAPIをホストします。このアドレスをOpen WebUI、LM Studio、AnythingLLMなどのアプリに入力すれば、すぐにチャットを開始できます。

最適化のヒント

異なるスペックのパーツからクラスターを構築するのは、コツがいる場合があります。以下の3点に注意してください:

  • ネットワークの遅延: 最初の単語が表示されるまでに長い遅延がある場合は、接続を確認してください。Wi-Fi信号が弱いノードが1つでもあると、クラスター全体の速度が低下します。pingを使用して、ノード間のレイテンシが2〜3ms以下であることを確認してください。
  • ボトルネック: Exoは負荷を分散しますが、CPUのみの非常に遅いノートパソコンがボトルネックになる可能性があります。生成速度が著しく低下する場合は、一番古いマシンを除外して、クラスターのパフォーマンスが向上するか試してみてください。
  • ファイアウォールの設定: 一部のOSのファイアウォールはP2P通信をブロックします。ノードがお互いを認識できない場合は、Exoの起動ログに記載されているポートがローカルネットワーク内で開放されているか確認してください。

ホームAIの未来

分散推論とは、単一の消費者向けGPUのVRAM制限に縛られなくなることを意味します。ホームラボが単なる机の下のサーバー1台ではなく、真の「クラスター」となる時代に突入しています。By using Exo, you can run state-of-the-art models like Llama 3 70B or Mixtral 8x7B that were previously reserved for users with enterprise-grade A100 GPUs.

これはほんの始まりに過ぎません。ノードを追加するにつれて、ローカルAIの能力は向上します。最終的には、今あるハードウェアを使って、リビングルームで複雑なエージェントや深い推論タスクを実行できるようになるでしょう。

Share: