eRDMA をコンテナ (Docker) 環境に統合することで、アプリケーションはオペレーティングシステムカーネルをバイパスし、ホストの物理 eRDMA デバイスに直接アクセスできるようになります。これにより、データ転送と通信が高速化され、大規模なデータ転送と高性能ネットワーキングを必要とするコンテナ化されたアプリケーションに最適です。このトピックでは、eRDMA コンテナイメージを使用して、GPU コンピューティング型インスタンスで eRDMA を迅速に設定する方法について説明します。
サービスで大規模な RDMA ネットワーキング機能が必要な場合は、サポートされている GPU コンピューティング型インスタンスタイプに Elastic RDMA Interface (ERI) をアタッチできます。詳細については、「eRDMA の概要」をご参照ください。
事前準備
GPU コンピューティング型インスタンスで eRDMA コンテナイメージを設定する前に、その詳細を取得してください。インスタンスを作成する前にサポートされている GPU コンピューティング型インスタンスタイプ、およびイメージをプルする前にイメージアドレスを把握しておく必要があります。
Container Registry コンソールにログインします。
左側メニューで、アーティファクトセンター をクリックします。
リポジトリ名 検索ボックスに「
erdma」と入力し、ターゲットイメージegs/erdmaを選択します。eRDMA コンテナイメージは、約 3 か月ごとに更新されます。次の表に、イメージの詳細を示します。
イメージ名
バージョン情報
イメージアドレス
サポート対象インスタンス
メリット
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 コンピューティング型インスタンスファミリー」をご参照ください。
コンテナから Alibaba Cloud eRDMA ネットワークに直接アクセスできます。
互換性のある 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 の有効化」をご参照ください。
ECS コンソールで eRDMA ネットワークカードを備えた GPU 高速化インスタンスを作成する際に、[GPU ドライバーのインストール] オプションと インストール [eRDMA ソフトウェアスタック] オプションを選択することをお勧めします。
説明GPU コンピューティング型インスタンスが作成されると、システムは Tesla ドライバー、CUDA、cuDNN ライブラリ、および eRDMA ソフトウェアスタックを自動的にインストールします。これは手動インストールよりも高速です。
[Image] セクションで [Ubuntu 20.04 64-bit] を選択します。GPU ドライバーのインストールには約 10〜20 分かかります。インストールにより、インスタンスの起動時間が長くなるほか、自動再起動が行われます。
GPU コンピューティング型インスタンスに接続します。
詳細な手順については、「Workbench を使用した Linux インスタンスへの接続」をご参照ください。
次のコマンドを実行して、Ubuntu の GPU コンピューティング型インスタンスに 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
設定の確認
この例では、host1 と host2 の 2 つの GPU コンピューティング型インスタンスを使用します。各インスタンスには Docker 環境がインストールされ、eRDMA コンテナが正常に実行されています。
host1 と host2 のコンテナで、eRDMA ネットワークアダプターが正常に機能しているかをそれぞれ確認します。
次のコマンドを実行して、コンテナ環境に入ります。
sudo docker exec -it erdma bash次のコマンドを実行して、コンテナ内の eRDMA ネットワークデバイスを確認します。
ibv_devinfo出力には、両方の eRDMA ネットワークデバイスの状態が
PORT_ACTIVEと表示され、正常に動作していることを示します。root@xxx:~/# ibv_devinfo hca_id: erdma_0 transport: eRDMA (0) fw_ver: 0.2.0 node_guid: 0216:3eff:fe2c:6aad sys_image_guid: 0216:3eff:fe2c:6aad vendor_id: 0x1ded vendor_part_id: 4223 hw_ver: 0x0 phys_port_cnt: 1 port: 1 state: PORT_ACTIVE (4) max_mtu: 1024 (3) active_mtu: 1024 (3) sm_lid: 0 port_lid: 0 port_lmc: 0x00 link_layer: Ethernet hca_id: erdma_1 transport: eRDMA (0) fw_ver: 0.2.0 node_guid: 0216:3eff:fe16:58b6 sys_image_guid: 0216:3eff:fe16:58b6 vendor_id: 0x1ded vendor_part_id: 4223 hw_ver: 0x0 phys_port_cnt: 1 port: 1 state: PORT_ACTIVE (4) max_mtu: 1024 (3) active_mtu: 1024 (3) sm_lid: 0 port_lid: 0 port_lmc: 0x00 link_layer: Ethernet
コンテナ内で、host1 と host2 で nccl-test を実行します。
次のコマンドを実行して、nccl-tests のコードをダウンロードします。
git clone https://github.com/NVIDIA/nccl-tests.git次のコマンドを実行して、nccl-tests をコンパイルします。
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 ${host2}コマンドを実行して、2 つのコンテナ間のパスワードなしの接続をテストできます。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" \ /root/nccl-tests/build/all_reduce_perf -b 1G -e 1G -f 2 -g 1 -n 20出力は次のようになります。
iZ2zei2cgn3427b89ubkfvZ:2732:2765 [7] NCCL INFO comm 0x562feba84040 rank 7 nranks 16 cudaDev 7 busId f1000 commId 0x89cad9815cd2a14b - Init COMPLETE iZ2zei2cgn3427b89ubkfvZ:2728:2770 [5] NCCL INFO comm 0x55d55c96d340 rank 5 nranks 16 cudaDev 5 busId ea000 commId 0x89cad9815cd2a14b - Init COMPLETE # # out-of-place in-place # size count type redop root time algbw busbw #wrong time algbw busbw #wrong # (B) (elements) (us) (GB/s) (GB/s) (us) (GB/s) (GB/s) 1073741824 268435456 float sum -1 158061 6.79 12.74 0 156821 6.85 12.84 0 iZ2zeiwklcnbixy8g0r8grZ:4068:4068 [2] NCCL INFO comm 0x563b4653f3c0 rank 10 nranks 16 cudaDev 2 busId 71000 - Destroy COMPLETE iZ2zei2cgn3427b89ubkfvZ:2724:2724 [2] NCCL INFO comm 0x55c35266a000 rank 2 nranks 16 cudaDev 2 busId 71000 - Destroy COMPLETE iZ2zeiwklcnbixy8g0r8grZ:4071:4071 [5] NCCL INFO comm 0x563a86fc7210 rank 13 nranks 16 cudaDev 5 busId ea000 - Destroy COMPLETE iZ2zeiwklcnbixy8g0r8grZ:4067:4067 [1] NCCL INFO comm 0x559741cc9290 rank 9 nranks 16 cudaDev 1 busId 6a000 - Destroy COMPLETE iZ2zeiwklcnbixy8g0r8grZ:4075:4075 [7] NCCL INFO comm 0x55d60e86e170 rank 15 nranks 16 cudaDev 7 busId f1000 - Destroy COMPLETE iZ2zei2cgn3427b89ubkfvZ:2723:2723 [1] NCCL INFO comm 0x5596ca34a0b0 rank 1 nranks 16 cudaDev 1 busId 6a000 - Destroy COMPLETE iZ2zei2cgn3427b89ubkfvZ:2728:2728 [5] NCCL INFO comm 0x55d55c96d340 rank 5 nranks 16 cudaDev 5 busId ea000 - Destroy COMPLETE iZ2zeiwklcnbixy8g0r8grZ:4072:4072 [6] NCCL INFO comm 0x5609dddc4170 rank 14 nranks 16 cudaDev 6 busId f0000 - Destroy COMPLETE iZ2zei2cgn3427b89ubkfvZ:2725:2725 [3] NCCL INFO comm 0x564411727220 rank 3 nranks 16 cudaDev 3 busId 72000 - Destroy COMPLETE iZ2zei2cgn3427b89ubkfvZ:2726:2726 [4] NCCL INFO comm 0x557b9ed258a0 rank 4 nranks 16 cudaDev 4 busId e9000 - Destroy COMPLETE iZ2zeiwklcnbixy8g0r8grZ:4069:4069 [3] NCCL INFO comm 0x55b879b75000 rank 11 nranks 16 cudaDev 3 busId 72000 - Destroy COMPLETE iZ2zeiwklcnbixy8g0r8grZ:4070:4070 [4] NCCL INFO comm 0x557580c1a5f0 rank 12 nranks 16 cudaDev 4 busId e9000 - Destroy COMPLETE iZ2zei2cgn3427b89ubkfvZ:2730:2730 [6] NCCL INFO comm 0x562b87361c0 rank 6 nranks 16 cudaDev 6 busId f0000 - Destroy COMPLETE iZ2zeiwklcnbixy8g0r8grZ:4066:4066 [0] NCCL INFO comm 0x558bf49799a0 rank 8 nranks 16 cudaDev 0 busId 69000 - Destroy COMPLETE iZ2zei2cgn3427b89ubkfvZ:2722:2722 [0] NCCL INFO comm 0x5589a9d7a980 rank 0 nranks 16 cudaDev 0 busId 69000 - Destroy COMPLETE iZ2zei2cgn3427b89ubkfvZ:2732:2732 [7] NCCL INFO comm 0x562feba84040 rank 7 nranks 16 cudaDev 7 busId f1000 - Destroy COMPLETE # Out of bounds values : 0 OK # Avg bus bandwidth : 12.7876 #
ホスト (コンテナ外) で、次のコマンドを実行して eRDMA ネットワーク上のトラフィックを監視します。
eadm stat -d erdma_0 -l出力は、eRDMA ネットワーク上にトラフィックがあることを示しています。
root@xxxZ:~# eadm stat -d erdma_0 -l Monitoring erdma_0... (press CTRL-C to stop) 14:53:00 rx: 5.50 GiB/s 4537261 p/s tx: 5.49 GiB/s 4538210 p/s
関連トピック
同じ Virtual Private Cloud (VPC) 内のインスタンス間で RDMA による高速な相互接続を有効にするには、GPU コンピューティング型インスタンスで eRDMA を設定できます。手順については、「GPU コンピューティング型インスタンスでの eRDMA の有効化」をご参照ください。
大規模なデータ転送と高性能ネットワーキングを含むユースケースでは、GPU コンピューティング型インスタンスに Docker 環境を手動で設定し、eRDMA を有効にして効率を向上させることができます。手順については、「Docker コンテナでの eRDMA の有効化」をご参照ください。