Elastic Remote Direct Memory Access (eRDMA) は、Dockerコンテナーで使用できる高性能ネットワークテクノロジーで、コンテナーアプリケーションがカーネルをバイパスしてホスト上の物理eRDMAデバイスに直接アクセスできるようにします。 eRDMAは、データ転送と通信の効率を向上させ、コンテナでの大規模なデータ転送と高性能ネットワーク通信を伴うシナリオに適しています。 このトピックでは、eRDMAコンテナイメージを使用して、GPUアクセラレーションインスタンスでeRDMAを効率的に設定する方法について説明します。
ビジネスで大規模なRDMAネットワークサービス機能が必要な場合は、elastic RDMAインターフェイス (ERI) を作成し、eRDMAをサポートするインスタンスタイプのGPUアクセラレーションインスタンスにアタッチできます。 詳細については、「概要」をご参照ください。
始める前に
便利な方法でGPUアクセラレーションインスタンスのコンテナイメージを構成するには、eRDMAコンテナイメージの詳細を取得する必要があります。 たとえば、GPU高速化インスタンスを作成する前に、コンテナイメージが使用可能なGPU高速化インスタンスタイプを決定し、コンテナイメージをプルする前にイメージアドレスを決定する必要があります。
Container Registry コンソールにログインします。
左側のナビゲーションウィンドウで、[アーティファクトセンター] をクリックします。
[リポジトリ名] 検索ボックスに
erdmaと入力し、Enterキーを押します。egs/erdmaコンテナーイメージを見つけてクリックします。画像は約3か月ごとに更新されます。 次の表に、eRDMAコンテナイメージの詳細を示します。
イメージ名
バージョン情報
画像アドレス
利用可能なGPU高速化インスタンス
メリット
eRDMA
Python: 3.10.12
CUDA: 12.4.1
cuDNN: 9.1.0.70
NCCL: 2.21.5
ベースイメージ: Ubuntu 22.04
egs-registry.cn-hangzhou.cr.aliyuncs.com/egs/erdma:cuda12.4.1-cudnn9-ubuntu22.04
eRDMAコンテナイメージは、
ebmgn8isやgn8isインスタンスなど、第8世代のGPUアクセラレーションインスタンス。説明GPU高速化インスタンスの詳細については、「GPU高速化コンピューティング最適化インスタンスファミリー (gn、ebm、sccシリーズ) 」をご参照ください。
コンテナーからAlibaba Cloud eRDMAネットワークに直接アクセスできます。
Alibaba Cloudは、既存の機能をサポートするために、一致するeRDMA、ドライバー、およびCUDAを提供しています。
eRDMA
Python: 3.10.12
CUDA: 12.1.1
cuDNN: 8.9.0.131
NCCL: 2.17.1
ベースイメージ: Ubuntu 22.04
egs-registry.cn-hangzhou.cr.aliyuncs.com/egs/erdma:cuda12.1.1-cudnn8-ubuntu22.04
手順
GPU高速化インスタンスにDockerをインストールし、DockerコンテナでeRDMAを使用した後、コンテナからeRDMAデバイスに直接アクセスできます。 この例では、Ubuntu 20.04オペレーティングシステムが使用されています。
GPU高速化インスタンスを作成し、eRDMAを設定します。
操作の詳細については、「GPUアクセラレーションインスタンスでのeRDMAの設定」をご参照ください。
Elastic Compute Service (ECS) コンソールに移動して、ERIsが設定されているGPU高速化インスタンスを作成することを推奨します。 操作を実行するときは、[GPUドライバーの自動インストール] および [eRDMAソフトウェアスタックの自動インストール] を選択します。
説明GPU高速化インスタンスを作成すると、システムは自動的にTeslaドライバー、CUDA、cuDNNライブラリ、およびeRDMAソフトウェアスタックをインストールします。 この方法は、手動インストールよりも高速です。

GPU高速化インスタンスに接続します。
詳細については、「Workbenchを使用したSSH経由のLinuxインスタンスへの接続」をご参照ください。
次のコマンドを実行して、GPU高速化UbuntuインスタンスにDockerをインストールします。
sudo apt-get update sudo apt-get -y install ca-certificates curl sudo install -m 0755 -d /etc/apt/keyrings sudo curl -fsSL http://mirrors.cloud.aliyuncs.com/docker-ce/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc sudo chmod a+r /etc/apt/keyrings/docker.asc echo \ "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] http://mirrors.cloud.aliyuncs.com/docker-ce/linux/ubuntu \ $(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \ sudo tee /etc/apt/sources.list.d/docker.list > /dev/null sudo apt-get update sudo apt-get install -y docker-ce docker-ce-cli containerd.io次のコマンドを実行して、Dockerがインストールされているかどうかを確認します。
docker -v次のコマンドを実行して、nvidia-container-toolkitソフトウェアパッケージをインストールします。
curl -fsSL https://nvidia.github.io/libnvidia-container/gpgkey | sudo gpg --dearmor -o /usr/share/keyrings/nvidia-container-toolkit-keyring.gpg \ && curl -s -L https://nvidia.github.io/libnvidia-container/stable/deb/nvidia-container-toolkit.list | \ sed 's#deb https://#deb [signed-by=/usr/share/keyrings/nvidia-container-toolkit-keyring.gpg] https://#g' | \ sudo tee /etc/apt/sources.list.d/nvidia-container-toolkit.list sudo apt-get update sudo apt-get install -y nvidia-container-toolkit次のコマンドを順番に実行して、システム起動時にDockerを起動し、Dockerサービスを再起動します。
sudo systemctl enable docker sudo systemctl restart docker次のコマンドを実行して、eRDMAコンテナイメージをプルします。
sudo docker pull egs-registry.cn-hangzhou.cr.aliyuncs.com/egs/erdma:cuda12.1.1-cudnn8-ubuntu22.04次のコマンドを実行して、eRDMAコンテナを実行します。
sudo docker run -d -t --network=host --gpus all \ --privileged \ --ipc=host --ulimit memlock=-1 --ulimit stack=67108864 \ --name erdma \ -v /root:/root \ egs-registry.cn-hangzhou.cr.aliyuncs.com/egs/erdma:cuda12.1.1-cudnn8-ubuntu22.04
eRDMAのテストと検証
このセクションでは、host1とhost2という名前の2つのGPUアクセラレーションインスタンスでeRDMAをテストする方法の例を示します。 この例では、Dockerはインスタンスにインストールされ、eRDMAコンテナはDockerで期待どおりに実行されます。
host1とhost2のコンテナ内のeRDMAデバイスが期待どおりに動作するかどうかを個別に確認します。
次のコマンドを実行して、コンテナにアクセスします。
sudo docker exec -it erdma bash次のコマンドを実行して、コンテナ内のeRDMAデバイスに関する情報を表示します。
ibv_devinfo次の出力は、2つのeRDMAデバイスが
PORT_ACTIVE状態であることを示しています。 これは、デバイスが期待どおりに動作することを示します。
コンテナー内のhost1およびhost2のnccl-testファイルでテストコードを実行します。
次のコマンドを実行して、nccl-testファイル内のテストコードをダウンロードします。
git clone https://github.com/NVIDIA/nccl-tests.git次のコマンドを実行して、テストコードをコンパイルします。
apt update apt install openmpi-bin libopenmpi-dev -y cd nccl-tests && make MPI=1 CUDA_HOME=/usr/local/cuda NCCL_HOME=/usr/local/cuda MPI_HOME=/usr/lib/x86_64-linux-gnu/openmpihost1とhost2の間にパスワードなしの接続を確立し、ポート12345でSSH接続を設定します。
SSH接続が設定されるまで待ちます。 次に、コンテナーで
ssh -p 12345 ipコマンドを実行して、host1とhost2の間にパスワードなしで接続できるかどうかをテストします。host1のコンテナーで次のコマンドを実行してSSHキーを生成し、公開キーをhost2のコンテナーにコピーします。
ssh-keygen ssh-copy-id -i ~/.ssh/id_rsa.pub ${host2}host2のコンテナーで次のコマンドを実行してSSHサービスをインストールし、SSHサーバーのリスニングポートを
12345に設定します。apt-get update && apt-get install ssh -y mkdir /run/sshd /usr/sbin/sshd -p 12345host1のコンテナで次のコマンドを実行して、host2のコンテナへのパスワードなしの接続が確立できるかどうかをテストします。
ssh root@{host2} -p 12345
host1のコンテナでall_reduce_perfファイルのテストコードを実行します。
mpirun --allow-run-as-root -np 16 -npernode 8 -H 172.16.15.237:8,172.16.15.235:8 \ --bind-to none -mca btl_tcp_if_include eth0 \ -x NCCL_SOCKET_IFNAME=eth0 \ -x NCCL_IB_DISABLE=0 \ -x NCCL_IB_GID_INDEX=1 \ -x NCCL_NET_GDR_LEVEL=5 \ -x NCCL_DEBUG=INFO \ -x NCCL_ALGO=Ring -x NCCL_P2P_LEVEL=3 \ -x LD_LIBRARY_PATH -x PATH \ -mca plm_rsh_args "-p 12345" \ /workspace/nccl-tests/build/all_reduce_perf -b 1G -e 1G -f 2 -g 1 -n 20次の図に出力を示します。

次のコマンドを実行して、トラフィックがホスト (コンテナの外部) のeRDMAネットワーク経由で送信されるかどうかを確認します。
eadm stat -d erdma_0 -l次の出力は、トラフィックがeRDMAネットワークを介して送信されることを示します。

関連ドキュメント
仮想プライベートクラウド (VPC) 内のGPUアクセラレーションインスタンスがRDMAに基づいて互いにすばやく接続できるように、GPUアクセラレーションインスタンスでeRDMAを設定できます。 操作の詳細については、「GPUアクセラレーションインスタンスでのeRDMAの設定」をご参照ください。
大規模なデータ転送と高性能ネットワーク通信を伴うシナリオでは、データ転送と通信効率を向上させるために、GPUアクセラレーションインスタンスのDockerコンテナでeRDMAを使用する必要があります。 詳細については、「DockerコンテナーでのeRDMAの使用」をご参照ください。