Amazon EC2 の推論ワークロードに対して EFA と NIXL の使用を開始する
NVIDIA Inference Xfer Library (NIXL) は、分散推論ワークロード専用に設計された、高スループットで低レイテンシーの通信ライブラリです。NIXL は、EFA および Libfabric とともに使用すれば、プリフィルノードとデコードノード間の KV キャッシュ転送をサポートでき、さまざまなストレージレイヤー間での KV キャッシュ移動を効率化できます。詳細については、NIXL
要件
-
Ubuntu 24.04 と Ubuntu 22.04 ベースの AMI のみがサポートされています。
-
EFA は NIXL 1.0.0 以降のみをサポートしています。
Steps
EFA にはセキュリティグループ自体とのインバウンドおよびアウトバウンドのトラフィックをすべて許可するセキュリティグループが必要です。以下の手順ではセキュリティグループを作成します。このセキュリティグループではセキュリティグループ自体とのすべてのインバウンドおよびアウトバウンドのトラフィックと、SSH 接続用の任意の IPv4 アドレスからのインバウンド SSH トラフィックを許可します。
重要
このセキュリティグループはテストのみを目的としています。本番環境ではコンピュータの IP アドレスやローカルネットワークの IP アドレスの範囲など、接続元の IP アドレスからのトラフィックのみを許可するインバウンド SSH ルールを作成することをお勧めします。
その他のシナリオについてはさまざまなユースケースのセキュリティグループのルールを参照してください。
EFA 対応のセキュリティグループを作成するには
Amazon EC2 コンソールの https://console.aws.amazon.com/ec2/
を開いてください。 -
ナビゲーションペインで [Security Groups] (セキュリティグループ) を選択して、[Create security group] (セキュリティグループの作成) を選択してください。
-
[Create security group] (セキュリティグループの作成) ウィンドウで、以下を行います。
-
[セキュリティグループ名] に、
EFA-enabled security groupのような、分かりやすいセキュリティグループ名を入力してください。 -
(オプション) [説明] に、セキュリティグループの簡単な説明を入力してください。
-
[VPC] で、EFA 対応のインスタンスを起動する VPC を選択してください。
-
[セキュリティグループの作成] を選択してください。
-
-
作成したセキュリティグループを選択し、[Details] (詳細) タブで [Security group ID] (セキュリティグループ ID) をコピーします。
-
セキュリティグループが選択された状態で、[Actions] (アクション)、[Edit inbound rules] (インバウンドルールの編集) の順に選択し、次の手順を実行します。
-
[Add rule] を選択してください。
-
[Type] で、[All traffic] を選択してください。
-
[Source type] (送信元タイプ) で、[Custom] (カスタム) を選択し、コピーしたセキュリティグループ ID をフィールドに貼り付けます。
-
[ルールを追加] を選択してください。
-
[タイプ] で SSH] を選択してください。
-
[Source type] (ソースタイプ) で、[Anywhere-IPv4] を選択してください。
-
[Save Rules] (ルールの保存) を選択してください。
-
-
セキュリティグループが選択された状態で、[Actions] (アクション)、[Edit outbound rules] (アウトバウンドルールの編集) の順に選択し、次の手順を実行します。
-
[Add rule] を選択してください。
-
[Type] で、[All traffic] を選択してください。
-
[Destination type] (送信先タイプ) で、[Custom] (カスタム) を選択し、コピーしたセキュリティグループ ID をフィールドに貼り付けます。
-
[Save Rules] (ルールの保存) を選択してください。
-
EFA ソフトウェアコンポーネントのインストールおよび設定に使用する一時インスタンスを起動します。このインスタンスを使用して、EFA 対応のインスタンスを起動する EFA 対応の AMI を作成します。
一時インスタンスを起動するには
Amazon EC2 コンソールの https://console.aws.amazon.com/ec2/
を開いてください。 -
ナビゲーションペインで、[Instances] (インスタンス) を選択し、[Launch Instances] (インスタンスの起動) を選択して、新しいインスタンス起動ウィザードを開きます。
-
(オプション) [Name and tags] (名前とタグ) セクションで、
EFA-instanceなどのインスタンス名を指定します。指定した名前はリソースタグとしてインスタンスに割り当てられます (Name=)。EFA-instance -
[アプリケーションと OS のイメージ] セクションで、サポートされるオペレーティングシステムのいずれかに対応する AMI を選択してください。DLAMI リリースノートページで、サポートされている DLAMI を選択することもできます。
-
[インスタンスタイプ] セクションで、サポートされているインスタンスタイプを選択してください。
-
[Key pair] (キーペア) セクションで、インスタンスに使用するキーペアを選択してください。
-
[Network settings] (ネットワーク設定) セクションで、[Edit] (編集) を選択し、次の操作を行います。
-
[サブネット] で、インスタンスを起動するサブネットを選択してください。サブネットを選択しない場合、EFA のインスタンスを有効にすることはできません。
-
[Firewall (security groups)] (ファイアウォール (セキュリティグループ)) の場合、[Select existing security group] (既存のセキュリティグループの選択) を選択し、前のステップで作成したセキュリティグループを選択してください。
-
[高度な設定] セクションを展開します。
ネットワークインターフェイス 1 では[ネットワークカードインデックス = 0]、[デバイスインデックス = 0]、[インターフェイスタイプ = EFA と ENA の組み合わせ] を選択してください。
(オプション)
p4d.24xlargeまたはp5.48xlargeなどのマルチカードインスタンスタイプを、必要な追加のネットワークインターフェイスごとに使用する場合は[ネットワークインターフェイスの追加] を選択し、ネットワークカードインデックスの場合は次の未使用インデックスを選択してから、[デバイスインデックス = 1]、[インターフェイスタイプ = EFA と ENA の組み合わせ] または [EFA のみ] を選択してください。
-
-
[Storage] (ストレージ) セクションで、必要に応じてボリュームを設定します。
注記
Nvidia CUDA ツールキットには追加の 10 ~ 20 GiB のストレージをプロビジョニングする必要があります。十分な量のストレージをプロビジョニングしないと、Nvidia ドライバーと CUDA ツールキットをインストールしようとしたときに、
insufficient disk spaceエラーが発生します。 -
右側の [合計mary] (サマリー) パネルで、[Launch instance] (インスタンスの起動) を選択してください。
重要
AMI に Nvidia GPU ドライバー、CUDA ツールキット、cuDNN がすでに含まれている場合、または非 GPU インスタンスを使用している場合は、ステップ 3 をスキップします。
NVIDIA GPU ドライバー、NVIDIA CUDA ツールキットおよび cuDNN をインストールするには
-
すべてのソフトウェアパッケージが最新の状態であることを確認するため、インスタンスでソフトウェアの更新を実行します。
$sudo apt-get update && sudo apt-get upgrade -y -
Nvidia GPU ドライバと Nvidia CUDA ツールキットをインストールするために必要なユーティリティをインストールします。
$sudo apt-get install build-essential -y -
Nvidia GPU ドライバを使用するにはまず、
nouveauオープンソースドライバを無効にする必要があります。-
必要なユーティリティ、および現在実行しているカーネルのバージョン用のカーネルヘッダーパッケージをインストールします。
$sudo apt-get install -y gcc make linux-headers-$(uname -r) -
nouveau拒否リストファイルに/etc/modprobe.d/blacklist.confを追加します。$cat << EOF | sudo tee --append /etc/modprobe.d/blacklist.conf blacklist vga16fb blacklist nouveau blacklist rivafb blacklist nvidiafb blacklist rivatv EOF -
任意のテキストエディタを使用して
/etc/default/grubファイルを開き、以下を追加します。GRUB_CMDLINE_LINUX="rdblacklist=nouveau" -
Grub 設定を再構築します。
$sudo update-grub
-
-
インスタンスを再起動して、そのインスタンスに再接続します。
-
CUDA リポジトリを追加し、Nvidia GPU ドライバー、NVIDIA CUDA ツールキット、および cuDNN をインストールします。
$sudo apt-key adv --fetch-keys http://developer.download.nvidia.com/compute/machine-learning/repos/ubuntu2004/x86_64/7fa2af80.pub \ && wget -O /tmp/deeplearning.deb http://developer.download.nvidia.com/compute/machine-learning/repos/ubuntu2004/x86_64/nvidia-machine-learning-repo-ubuntu2004_1.0.0-1_amd64.deb \ && sudo dpkg -i /tmp/deeplearning.deb \ && wget -O /tmp/cuda.pin https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2004/x86_64/cuda-ubuntu2004.pin \ && sudo mv /tmp/cuda.pin /etc/apt/preferences.d/cuda-repository-pin-600 \ && sudo apt-key adv --fetch-keys https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2004/x86_64/3bf863cc.pub \ && sudo add-apt-repository 'deb http://developer.download.nvidia.com/compute/cuda/repos/ubuntu2004/x86_64/ /' \ && sudo apt update \ && sudo apt install nvidia-dkms-535 \ && sudo apt install -o Dpkg::Options::='--force-overwrite' cuda-drivers-535 cuda-toolkit-12-3 libcudnn8 libcudnn8-dev -y -
インスタンスを再起動して、そのインスタンスに再接続します。
-
(
p4d.24xlargeおよびp5.48xlargeのみ) NVIDIA Fabric Manager をインストールします。-
前の手順でインストールした Nvidia カーネルモジュールのバージョンと一致する Nvidia Fabric Manager のバージョンをインストールする必要があります。
Nvidia カーネルモジュールのバージョンを確認するには次のコマンドを実行します。
$cat /proc/driver/nvidia/version | grep "Kernel Module"出力例を次に示します。
NVRM version: NVIDIA UNIX x86_64 Kernel Module 450.42.01 Tue Jun 15 21:26:37 UTC 2021上記の例ではメジャーバージョン
450のカーネルモジュールがインストールされました。これはNvidia Fabric Manager のバージョン450をインストールする必要があることを意味します。 -
Nvidia Fabric Manager をインストールする 次のコマンドを、前の手順で識別されたメジャーバージョンを指定して実行します。
$sudo apt install -o Dpkg::Options::='--force-overwrite' nvidia-fabricmanager-major_version_number例えば、メジャーバージョン
450のカーネルモジュールがインストールされた場合、以下のコマンドを使用して、一致するバージョンの Nvidia Fabric Manager をインストールします。$sudo apt install -o Dpkg::Options::='--force-overwrite' nvidia-fabricmanager-450 -
サービスを開始し、インスタンスの起動時に自動的に起動することを確認します。NVIDIA Fabric Manager はNV Switch Management に必要です。
$sudo systemctl start nvidia-fabricmanager && sudo systemctl enable nvidia-fabricmanager
-
-
インスタンスが起動するたびに CUDA パスが設定されていることを確認します。
-
bash シェルの場合、次のステートメントを
/home/とusername/.bashrc/home/に追加します。username/.bash_profileexport PATH=/usr/local/cuda/bin:$PATH export LD_LIBRARY_PATH=/usr/local/cuda/lib64:/usr/local/cuda/extras/CUPTI/lib64:$LD_LIBRARY_PATH -
tcsh シェルの場合、次の文を
/home/に追加します。username/.cshrcsetenv PATH=/usr/local/cuda/bin:$PATH setenv LD_LIBRARY_PATH=/usr/local/cuda/lib64:/usr/local/cuda/extras/CUPTI/lib64:$LD_LIBRARY_PATH
-
-
以下のコマンドを実行して、Nvidia GPU ドライバが機能することを確認します。
$nvidia-smi -q | headこのコマンドはNvidia GPU、Nvidia GPU ドライバ、Nvidia CUDA ツールキットの情報を返します。
重要
AMI にすでに GDRCopy が含まれている場合、または非 GPU インスタンスを使用している場合は、ステップ 4 をスキップします。
GDRCopy をインストールして GPU ベースのプラットフォーム上で Libfabric のパフォーマンスを向上させます。GDRCopy の詳細については「GDRCopy レポジトリ
GDRCopy をインストールするには
-
必要な依存ファイルをインストールします。
$sudo apt -y install build-essential devscripts debhelper check libsubunit-dev fakeroot pkg-config dkms -
GDRCopy パッケージをダウンロードして解凍します。
$wget https://github.com/NVIDIA/gdrcopy/archive/refs/tags/v2.4.tar.gz \ && tar xf v2.4.tar.gz \ && cd gdrcopy-2.4/packages -
GDRCopy DEB パッケージをビルドします。
$CUDA=/usr/local/cuda ./build-deb-packages.sh -
GDRCopy DEB パッケージをインストールします。
$sudo dpkg -i gdrdrv-dkms_2.4-1_amd64.*.deb \ && sudo dpkg -i libgdrapi_2.4-1_amd64.*.deb \ && sudo dpkg -i gdrcopy-tests_2.4-1_amd64.*.deb \ && sudo dpkg -i gdrcopy_2.4-1_amd64.*.deb
重要
AMI に最新の EFA インストーラがすでに含まれている場合は、ステップ 5 をスキップします。
インスタンスで EFA をサポートするために必要な EFA 対応のカーネル、EFA ドライバー、Libfabric スタックをインストールします。
EFA ソフトウェアをインストールするには
-
起動したインスタンスに接続します。詳細については「SSH を使用した Linux インスタンスへの接続」を参照してください。
-
EFA ソフトウェアのインストールファイルをダウンロードします。ソフトウェアのインストールファイルは圧縮された tar (
.tar.gz) ファイルにパッケージ化されています。次のコマンドを使用して、安定している最新バージョンをダウンロードします。$curl -O https://efa-installer.amazonaws.com/aws-efa-installer-1.47.0.tar.gz -
圧縮された
.tar.gzファイルからファイルを展開してターボールを削除し、展開されたディレクトリに移動します。$tar -xf aws-efa-installer-1.47.0.tar.gz && rm -rf aws-efa-installer-1.47.0.tar.gz && cd aws-efa-installer -
EFA ソフトウェアのインストールスクリプトを実行します。
$sudo ./efa_installer.sh -yLibfabric は
/opt/amazon/efaディレクトリにインストールされます。 -
EFA インストーラーでインスタンスの再起動を求めるメッセージが表示された場合は再起動してからインスタンスに再接続します。それ以外の場合はインスタンスからログアウトし、再度ログインしてインストールを完了します。
-
EFA ソフトウェアコンポーネントが正常にインストールされたことを確認します。
$fi_info -p efa -t FI_EP_RDMコマンドによって、Libfabric の EFA インターフェイスに関する情報が返ります。以下の例はコマンド出力を示しています。
-
単一のネットワークインターフェイスを持つ
p3dn.24xlargeprovider: efa fabric: EFA-fe80::94:3dff:fe89:1b70 domain: efa_0-rdm version: 2.0 type: FI_EP_RDM protocol: FI_PROTO_EFA -
複数のネットワークインターフェイスを持つ
p4d.24xlargeおよびp5.48xlargeprovider: efa fabric: EFA-fe80::c6e:8fff:fef6:e7ff domain: efa_0-rdm version: 111.0 type: FI_EP_RDM protocol: FI_PROTO_EFA provider: efa fabric: EFA-fe80::c34:3eff:feb2:3c35 domain: efa_1-rdm version: 111.0 type: FI_EP_RDM protocol: FI_PROTO_EFA provider: efa fabric: EFA-fe80::c0f:7bff:fe68:a775 domain: efa_2-rdm version: 111.0 type: FI_EP_RDM protocol: FI_PROTO_EFA provider: efa fabric: EFA-fe80::ca7:b0ff:fea6:5e99 domain: efa_3-rdm version: 111.0 type: FI_EP_RDM protocol: FI_PROTO_EFA
-
NIXL をインストールします。NIXL の詳細については、NIXL リポジトリ
NIXL Benchmark をインストールし、テストを実行して EFA と NIXL に一時インスタンスが適切に設定されていることを確認します。NIXL Benchmark により、NIXL が適切にインストールされていることと、想定どおりに機能していることを確認できます。詳細については、nixlbench リポジトリ
NIXL Benchmark (nixlbench) では、クライアントとサーバー間の調整に ETCD が必要です。ETCD と NIXL を併用するには、ETCD サーバーとクライアント、および ETCD CPP API が必要です。
機械学習アプリケーションを一時インスタンスにインストールします。インストール手順はそれぞれの機械学習アプリケーションによって異なります。
注記
インストール手順については機械学習アプリケーションのドキュメントを参照してください。
必要なソフトウェアコンポーネントのインストール後、EFA 対応のインスタンスの起動に再利用できる AMI を作成します。
一時インスタンスから AMI を作成するには
Amazon EC2 コンソールの https://console.aws.amazon.com/ec2/
を開いてください。 -
ナビゲーションペインで、[インスタンス] を選択してください。
-
作成した一時インスタンスを選択し、[アクション]、[イメージ]、[イメージの作成] の順に選択してください。
-
[イメージの作成] で、次を行います。
-
[イメージ名] に、の分かりやすい AMI 名を入力してください。
-
(オプション) [イメージの説明] に、AMI の簡単な説明を入力してください。
-
[イメージを作成] を選択してください。
-
-
ナビゲーションペインで [AMI] を選択してください。
-
リストで作成した AMI を探します。ステータスが
pendingからavailableに変わるまで待ってから、次のステップに進みます。
この時点で、起動した一時インスタンスは不要になります。インスタンスを終了して、料金の発生を停止できます。
一時インスタンスを終了するには
Amazon EC2 コンソールの https://console.aws.amazon.com/ec2/
を開いてください。 -
ナビゲーションペインで、[インスタンス] を選択してください。
-
作成した一時インスタンスを選択し、[アクション]、[インスタンスの状態]、[インスタンスの終了] の順に選択してください。
-
確認を求めるメッセージが表示されたら、[終了] を選択してください。
ステップ 9 で作成した EFA 対応の AMI と、ステップ 1 で作成した EFA 対応のセキュリティグループを使用して、EFA および NIXL 対応インスタンスを起動します。
EFA および NIXL 対応インスタンスを起動する方法
Amazon EC2 コンソールの https://console.aws.amazon.com/ec2/
を開いてください。 -
ナビゲーションペインで、[Instances] (インスタンス) を選択し、[Launch Instances] (インスタンスの起動) を選択して、新しいインスタンス起動ウィザードを開きます。
-
(オプション) [Name and tags] (名前とタグ) セクションで、
EFA-instanceなどのインスタンス名を指定します。指定した名前はリソースタグとしてインスタンスに割り当てられます (Name=)。EFA-instance -
[Application and OS Images] (アプリケーションと OS イメージ) セクションで、[My AMI] (マイ AMI) をクリックし、前のステップで作成した AMI を選択してください。
-
[インスタンスタイプ] セクションで、サポートされているインスタンスタイプを選択してください。
-
[Key pair] (キーペア) セクションで、インスタンスに使用するキーペアを選択してください。
-
[Network settings] (ネットワーク設定) セクションで、[Edit] (編集) を選択し、次の操作を行います。
-
[サブネット] で、インスタンスを起動するサブネットを選択してください。サブネットを選択しない場合、EFA のインスタンスを有効にすることはできません。
-
[ファイアウォール (セキュリティグループ)] の場合、[既存のセキュリティグループを選択] を選択し、ステップ 1で作成したセキュリティグループを選択してください。
-
[高度な設定] セクションを展開します。
ネットワークインターフェイス 1 では[ネットワークカードインデックス = 0]、[デバイスインデックス = 0]、[インターフェイスタイプ = EFA と ENA の組み合わせ] を選択してください。
(オプション)
p4d.24xlargeまたはp5.48xlargeなどのマルチカードインスタンスタイプを、必要な追加のネットワークインターフェイスごとに使用する場合は[ネットワークインターフェイスの追加] を選択し、ネットワークカードインデックスの場合は次の未使用インデックスを選択してから、[デバイスインデックス = 1]、[インターフェイスタイプ = EFA と ENA の組み合わせ] または [EFA のみ] を選択してください。
-
-
(オプション) [Storage] (ストレージ) セクションで、必要に応じてボリュームを設定します。
-
右側の [合計mary] (サマリー) パネルで、[Number of instances] (インスタンス数) に、起動する EFA 対応のインスタンスの数を入力し、[Launch Instance] (インスタンスの起動) を選択してください。
クラスター内のすべてのインスタンスでアプリケーションを実行できるようにするにはリーダーノードからメンバーノードへのパスワードなしの SSH アクセスを有効にする必要があります。リーダーノードはアプリケーションを実行するインスタンスです。クラスター内の残りのインスタンスはメンバーノードです。
クラスター内のインスタンス間でパスワードなしの SSH を有効にするには
-
クラスター内の 1 つのインスタンスをリーダーノードとして選択し、それに接続します。
-
リーダーノード上で
strictHostKeyCheckingを無効にしForwardAgentを有効にします。任意のテキストエディタを使用して~/.ssh/configファイルを開き、以下を追加します。Host * ForwardAgent yes Host * StrictHostKeyChecking no -
RSA キーペアを生成します。
$ssh-keygen -t rsa -N "" -f ~/.ssh/id_rsaキーペアは
$HOME/.ssh/ディレクトリで作成されます。 -
リーダーノードのプライベートキーの許可を変更します。
$chmod 600 ~/.ssh/id_rsa chmod 600 ~/.ssh/config -
任意のテキストエディタで
~/.ssh/id_rsa.pubを開き、キーをコピーします。 -
クラスター内の各メンバーノードについて、次の操作を行います。
-
インスタンスに接続します。
-
任意のテキストエディタで
~/.ssh/authorized_keysを開き、前にコピーしたパブリックキーを追加します。
-
-
パスワードレス SSH が正常に機能していることをテストするにはリーダーノードに接続して、次のコマンドを実行します。
$sshmember_node_private_ipキーまたはパスワードの入力を求められずに、メンバーノードに接続できるはずです。
重要
ステップ 7 に従った場合にのみ、ステップ 13 に従ってください。
テストを実行し、EFA と NIXL に対して一時インスタンスが適切に設定されていることを確認します。
NIXL をインストールしたら、LLM 推論を通じて NIXL を使用すると、vLLM、SGLang、TensorRT-LLM などのフレームワークを提供できます。
vLLM を使用して推論ワークロードを提供する方法
-
vLLM をインストールします。
$pip install vllm -
NIXL を使用して vLLM サーバーを起動します。次のサンプルコマンドにより、NIXL ハンドシェイク接続、KV コネクタ、KV ロール、トランスポートバックエンド用として、プリフィル (プロデューサー) インスタンスが 1 つとデコード (コンシューマー) インスタンスが 1 つ作成されます。詳細な例とスクリプトについては、「NIXLConnector 使用ガイド
」を参照してください。 NIXL を EFA とともに使用するには、セットアップとユースケースに基づいて環境変数を設定します。
-
プロデューサー (プリフィラー) の設定
$vllm serveyour-application\ --port 8200 \ --enforce-eager \ --kv-transfer-config '{"kv_connector":"NixlConnector","kv_role":"kv_both","kv_buffer_device":"cuda","kv_connector_extra_config":{"backends":["LIBFABRIC"]}}' -
コンシューマー (デコーダー) の設定
$vllm serveyour-application\ --port 8200 \ --enforce-eager \ --kv-transfer-config '{"kv_connector":"NixlConnector","kv_role":"kv_both","kv_buffer_device":"cuda","kv_connector_extra_config":{"backends":["LIBFABRIC"]}}'
前述のサンプル設定では、以下を設定します。
-
kv_roleをkv_bothに設定すると、コネクタがプロデューサーとコンシューマーの両方として機能する対称機能が有効になります。これにより、実験的なセットアップや、ロールの区別が事前に決定されていないシナリオに柔軟性が生まれます。 -
kv_buffer_deviceをcudaに設定すると、GPU メモリの使用が可能になります。 -
NIXL バックエンドを
LIBFABRICに設定すると、NIXL トラフィックが EFA を通過できるようになります。
-