インフラ・DevOps
AMD Strix Halo RDMAクラスターセットアップガイド
AMD Strix Halo RDMA Cluster Setup Guide (github.com)
要約
このガイドは、Intel E810(RoCE v2)を介してリンクされた2つのAMD Strix Haloノードクラスターを、Tensor Parallelismを使用した分散vLLM推論のために設定する方法を詳細に説明しています。Fedora上でのホスト構成、RDMAクラスターの概念とアーキテクチャ、ハードウェア要件、およびトラブルシューティングについて解説しています。
全文翻訳
AMD Strix Halo RDMAクラスターセットアップガイド
このガイドは、Tensor Parallelismを使用した分散vLLM推論のために、Intel E810(RoCE v2)を介してリンクされた2つのノードAMD Strix Haloクラスターを設定する方法を詳細に説明しています。
目次
TL;DR(クイックスタート)
概念とアーキテクチャ
ハードウェアの前提条件
ホスト構成(Fedora)
4.1 パッケージのインストール
4.2 ネイティブファームウェアの確認
4.3 ネットワーク構成
4.4 BIOSとカーネル構成
4.5 ファイアウォールルール
ツールボックスのインストールとネットワーク検証
5.1 前提条件: パスワードなしSSH
5.2 インストール
5.3 RDMA接続の検証
クラスターの実行
6.1 セットアップと検証
6.2 vLLMの起動
トラブルシューティング
参照と謝辞
1. TL;DR(クイックスタート)
両方のノードで:
準備: Fedora 43とE810 NICをインストール/更新します(ファームウェアの確認: ethtool -i <iface>)。
BIOS/カーネル: iGPUを512MBに設定し、カーネルパラメータ(iommu=pt, pci=reallocなど)を適用します。
SSH: ノード間でパスワードなしSSHを設定します。
ネットワーク: 静的IP(192.168.100.1 & .2)を割り当て、MTU 9000を設定し、ファイアウォールでインターフェースを信頼します。
ツールボックスのインストール: ./refresh_toolbox.shを実行します(これにより、RDMAサポートとカスタムlibrccl.soパッチを含むコンテナが自動的にインストールされます)。
クラスターの実行: start-vllm-clusterを実行します。「2. Start Ray Cluster」を選択します(TUIのプロンプトに従います)。「4. Launch VLLM Serve」を選択し、モデルを選択します。(ゲート付きモデルの場合は、まずHF_TOKENをエクスポートしてください!)
重要な注意点: refresh_toolbox.shスクリプトは、Infiniband/RDMAデバイスを検出し、コンテナを自動的に構成して公開します。
2. 概念とアーキテクチャ
Strix Haloクラスターを最大限に活用するには、関連するテクノロジーを理解することが役立ちます:
vLLM: 高性能推論エンジン。単一のGPU(またはAPU)では処理できない大規模なモデルを実行するために、Tensor Parallelism(TP)を使用してモデルを分割します。
Ray: 分散コンピューティングフレームワーク。vLLMはRayを使用してクラスターをオーケストレーションし、各ノードの「ワーカー」プロセスを管理し、それらが正しく起動することを確認します。Rayは制御プレーン(コマンドの発行)を処理します。
RCCL(ROCm Collective Communication Library): NVIDIAのNCCLに相当するAMDのライブラリ。このライブラリはデータプレーン、特にGPU間のテンソルデータの超高速同期を処理します。TP=2の場合、2つのノードはニューラルネットワークのすべてのレイヤーの後で部分的な結果を交換する必要があります。これは毎秒数千回発生します。
RoCE v2(RDMA over Converged Ethernet): RCCLが、CPUとOSカーネルをバイパスして、あるノードのメモリから別のノードのメモリにデータを直接書き込むことを可能にするプロトコルです。
RDMAなし: レイテンシは~70-100µs(TCP/IPオーバーヘッド)。
RDMAあり: レイテンシは~5µs。
なぜ重要か: インタラクティブなトークン生成の場合、高いレイテンシはパフォーマンスを低下させます。RoCEにより、2つのノードが単一のマシンのように感じられます。
3. ハードウェアの前提条件
ノード: AMD Ryzen AI MAX+ "Strix Halo"、128GBのUnified Memoryを搭載した2x Framework Desktopメインボード。
ネットワークカード: Intel Ethernet Controller E810-CQDA1(または類似の100GbE QSFP28)。
接続: ダイレクトアタッチ銅線(DAC)ケーブル(例: QSFPTEK 100G QSFP28 DAC)。2ノードの場合、スイッチは不要です。
PCIeに関する注意: FrameworkマザーボードのPCIeスロットは物理的にx4であるため、16xカードを接続するにはライザーが必要です(例: CY PCI-E Express 4x to 16x Extender)。
テストセットアップに関する注意: このセットアップのボードの1つは、x16カードを直接受け入れるようにPCIeスロットが改造されています(Frameworkが超音波カッターで切断)。これはユーザーには推奨されません。ライザーは、より安価で安全かつ簡単なソリューションです。パフォーマンスは同一です(~50Gbps帯域幅、~5µsレイテンシ)。
4. ホスト構成(Fedora)
両ノードのホストOS(Fedora 43)でこれらの手順を実行します。
テスト済みホスト構成:
ノード カーネル OS IP(RDMAインターフェース)
ノード1 6.18.5-200.fc43.x86_64 Fedora Linux 43 192.168.100.1/30
ノード2 6.18.6-200.fc43.x86_64 Fedora Linux 43 192.168.100.2/30
注: これらの特定のカーネルバージョンは動作することが確認されています。Fedora 43が推奨されます。
4.1 パッケージのインストール
コアRDMAユーザースペースツールをインストールします。プロプライエタリなIntelドライバーは不要です。カーネル内のドライバーが完全に機能します。
Ethernetドライバー: ice
RDMAドライバー: irdma(RoCE v2 & iWARP用の統合ドライバー)
sudo dnf install rdma-core libibverbs-utils perftest
rdma-core: RDMAサブシステム用のユーザースペースコンポーネント(ライブラリ、デーモン、構成ツール)。
libibverbs-utils: RDMAデバイスをクエリするためのユーティリティ(例: ibv_devinfo)。
perftest: RDMAの帯域幅とレイテンシを検証するためのベンチマークスイート(例: ib_write_bw, ib_send_lat)。
4.2 ネイティブファームウェアの確認
ethtoolを使用して、Intel E810カードの現在のファームウェアバージョンを確認します。
ethtool -i enp194s0np0
推奨ファームウェア: ファームウェアが以下に示すバージョン(Firmware 4.91...)以上であることを確認してください。ファームウェアが古い場合は、Intel® Ethernet NVM Update Tool for E810 Seriesを使用して更新してください。
出力例:
driver: ice
version: 6.18.5-200.fc43.x86_64
firmware-version: 4.91 0x800214b5 1.3909.0
expansion-rom-version:
bus-info: 0000:c2:00.0
supports-statistics: yes
supports-test: yes
supports-eeprom-access: yes
supports-register-dump: yes
supports-priv-flags: yes
4.3 ネットワーク構成
このガイドでは、サブネット192.168.100.0/30を想定しています。
インターフェースの特定: ip linkを実行して、100GbEカード(例: enp194s0np0)を見つけます。
ノード1(ヘッド - 192.168.100.1):
# Bring link up
sudo ip link set enp194s0np0 up
# Assign IP
sudo ip addr add 192.168.100.1/30 dev enp194s0np0
# Set MTU (Jumbo Frames)
sudo nmcli connection modify "rdma0" ethernet.mtu 9000
sudo nmcli connection up "rdma0"
ノード2(ワーカー - 192.168.100.2):
# Bring link up
sudo ip link set enp194s0np0 up
# Assign IP
sudo ip addr add 192.168.100.2/30 dev enp194s0np0
# Set MTU
sudo nmcli connection modify "rdma0" ethernet.mtu 9000
sudo nmcli connection up "rdma0"
ルーティングの確認: 両方でルートが存在することを確認します:
sudo ip route add 192.168.100.0/30 dev enp194s0np0
リンクの確認: rdma link
# 出力は以下のように表示されるはずです: state ACTIVE physical_state LINK_UP used_usec X ...
4.4 BIOSとカーネル構成
1. BIOS設定: iGPUメモリ割り当てを可能な限り最小(512MB)に設定します。GTT(Graphics Translation Table)を使用して、システムメモリをGPU用の「Unified Memory」として動的に割り当てます。
2. カーネルパラメータ: GRUBを更新して、Unified Memoryを有効にし、RDMAパフォーマンスを最適化し、PCIリソース割り当てを修正します。/etc/default/grubを編集し、GRUB_CMDLINE_LINUXに以下を追加します:
iommu=pt pci=realloc pcie_aspm=off amdgpu.gttsize=126976 ttm.pages_limit=32505856
パラメータの説明:
iommu=pt: IOMMUを「パススルー」モードに設定します。これはパフォーマンスに不可欠であり、RDMA NICとiGPU Unified Memoryアクセスの両方のオーバーヘッドを削減します。
pci=realloc: PCI BARを再割り当てします。E810やStrix Haloのようなデバイスの大きなアドレス空間を適切にマッピングするために、コンシューマプラットフォームでよく必要とされます。
pcie_aspm=off: PCIeアクティブステート電力管理を無効にします。100GbE接続でのレイテンシスパイクやリンクネゴシエーションの問題を防ぎます。
amdgpu.gttsize=126976: GPU GTTサイズを約124GiB(126976MB)に制限します。これは、GPUが独自の「VRAM」としてアドレス指定できるシステムRAMの量を定義します。
ttm.pages_limit=32505856: トランスレーションテーブルマネージャーを約124GiB(4KBページ単位)に制限し、GTTサイズと一致させます。
3. 変更の適用:
sudo grub2-mkconfig -o /boot/grub2/grub.cfg
sudo reboot
4.5 ファイアウォールルール
RayやNCCLなどのアプリケーションは、ランダムな高ポートを使用します。内部RDMAインターフェースを完全に信頼するのが最も簡単です。
# インターフェースを永続的に信頼ゾーンに割り当てる
sudo firewall-cmd --permanent --zone=trusted --add-interface=enp194s0np0
# ファイアウォールの再読み込み
sudo firewall-cmd --reload
5. ツールボックスのインストールとネットワーク検証
5.1 前提条件: パスワードなしSSH
クラスター管理および検証スクリプトは、リモートノードでコマンドを実行するためにSSHに依存しています。両ノード間でパスワードなしSSHを設定する必要があります(rootまたはsudo有効化ユーザー)。
ガイド: How to Set Up SSH Keys on Linux (DigitalOcean)
クイックチェック: 各ノードからssh <other-node-ip> dateを実行します。パスワードを尋ねられることなく日付が出力されるはずです。
5.2 インストール
このリポジトリで提供されているツールボックスコンテナには、重要なパッチが含まれています: カスタム