Elastic Remote Direct Memory Access (eRDMA) は、Alibaba Cloudが提供するRDMAネットワークサービスです。 eRDMAは、低レイテンシ、高スループット、および高弾力性を備えています。 eRDMAは、第4世代のSHENLONGアーキテクチャとVirtual Private Cloud (VPC) に基づいて開発されています。 eRDMAはRDMAエコシステムと完全に互換性があり、Elastic Compute Service (ECS) インスタンス用の超大規模な包括的ネットワークを提供します。 このトピックでは、Container Service for Kubernetes (ACK) クラスターでeRDMAを設定および使用する方法について説明します。
手順
ステップ1: ノードプールの作成
ノードに対してeRDMAを有効にするには、別のノードプールを使用する必要があります。
ACKコンソールにログインします。 左側のナビゲーションウィンドウで、[クラスター] をクリックします。
[クラスター] ページで、管理するクラスターの名前をクリックします。 左側のナビゲーションウィンドウで、 を選択します。
の右上隅にノードプールページをクリックします。ノードプールの作成.
次の表に、主要なパラメーターを示します。 その他のパラメーターの詳細については、「ノードプールの作成」をご参照ください。
パラメーター
説明
オペレーティングシステム
Alibaba Cloud Linux 3.xを選択します。
期待されるノード
値を 0 に設定します。 ノードプールの作成後にノードを追加できます。
CPUポリシー (推奨)
[詳細オプションの表示] をクリックし、[静的] を選択します。
ステップ2: eRDMA拡張ECSインスタンスの追加
eRDMA強化ECSインスタンスの設定
ECSインスタンスでサポートされているネットワークカードのクォータは、ECSインスタンスタイプによって異なります。 したがって、ECSインスタンスタイプは、eRDMAクォータ、帯域幅、および設定手順に影響します。
[インスタンスファミリーの概要] を参照して、さまざまなインスタンスタイプのネットワークカードクォータを表示できます。 ほとんどのインスタンスタイプは、1つのネットワークカードのみをサポートします。 eRDMA拡張ECSインスタンスを設定するには、次の手順を実行します。
1つのネットワークカードのみをサポートするインスタンスタイプ
ECSインスタンスを作成します。
ECSコンソールにログインします。 左側のナビゲーションウィンドウで、[概要] をクリックします。
[概要] タブで、[インスタンスの作成] をクリックします。
次の表に、主要なパラメーターを示します。 その他のパラメーターの詳細については、「クイックスタート」をご参照ください。
パラメーター
説明
ネットワークとゾーン
ACKクラスターのVPCを選択します。
インスタンス
eRDMAをサポートするインスタンスタイプを選択します。 詳細は、「インスタンスファミリー」をご参照ください。
ENI
[eRDMAインターフェイス] を選択します。
複数のネットワークカードをサポートするインスタンスタイプ
ECSインスタンスを作成します。
ECSコンソールにログインします。 左側のナビゲーションウィンドウで、[概要] をクリックします。
On the概要タブをクリックします。インスタンスの作成.
次の表に、主要なパラメーターを示します。 その他のパラメーターの詳細については、「クイックスタート」をご参照ください。
パラメーター
説明
ネットワークとゾーン
ACKクラスターのVPCを選択します。
インスタンス
eRDMAと複数のネットワークカードをサポートするインスタンスタイプを選択します。 詳細は、「インスタンスファミリー」をご参照ください。
複数のeRDMA ENIを作成し、ECSインスタンスにバインドします。
ECSインスタンスでサポートされているネットワークカードの数と同じ数のelastic network Interface (ENI) を作成します。 ENIの作成時に [Elastic RDMA Interface] を選択します。 詳細については、「セカンダリENIの作成」をご参照ください。
eRDMA ENIを各eRDMA拡張ECSインスタンスにバインドします。 詳細については、「セカンダリENIのバインド」をご参照ください。
ACKクラスターがTerwayを使用している場合は、TerwayがeRDMA ENIを変更した場合にTerway ENIフィルターを設定します。 詳細については、「ENIフィルターの設定」をご参照ください。
eRDMA拡張ECSインスタンスをノードプールに追加する
ECSインスタンスをノードプールに追加します。
ACKコンソールにログインします。 左側のナビゲーションウィンドウで、[クラスター] をクリックします。
[クラスター] ページで、管理するクラスターの名前をクリックします。 左側のウィンドウで、 を選択します。
On theノードプールページをクリックします。もっとで、アクションノードプールの列をクリックし、既存のノードを追加.
[既存のECSインスタンスの選択] ウィザードページで、ECSインスタンスを手動で追加します。 詳細については、「既存のECSインスタンスをACKクラスターに追加する」をご参照ください。
各ECSインスタンスに最新のeRDMAドライバーをインストールします。
ステップ3: アプリケーションを実行する
Dockerfileを変更してeRDMAリポジトリをインストールし、コンテナイメージから作成されたアプリケーションがeRDMAを使用できるようにコンテナイメージを再構築します。 これを行うには、次のコマンドを実行します。
# Debian or Ubuntu: Make sure that the OS name and version in sources.list are the same as those you use. wget -qO - https://mirrors.aliyun.com/erdma/GPGKEY | apt-key add - && echo "deb [ arch=amd64 ] https://mirrors.aliyun.com/erdma/apt/{OS|ubuntu} {Version|focal}/erdma main" | tee /etc/apt/sources.list.d/erdma.list && apt update && apt install -y libibverbs1 ibverbs-providers ibverbs-utils librdmacm1 # Alibaba Cloud Linux or rhel: Find the yum.repos.d directory and create a file named erdma.repo. cat > /etc/yum.repos.d/erdma.repo <<EOF [erdma] name = ERDMA Repository baseurl = http://mirrors.aliyun.com/erdma/yum/redhat/7/erdma/x86_64/ gpgcheck = 0 enabled = 1 EOF yum install -y ethtool groff-base hwdata libnl3 pciutils sudo yum install libibverbs rdma-core librdmacm libibverbs-utils -y --disablerepo=* --enablerepo="erdma"
アプリケーションポッドを実行するモードを設定します。
アプリケーションのポッドパラメーターを設定します。
特権: アプリケーションのポッドを特権モードで実行して、eRDMAデバイスを認識するように設定します。 のシナリオ1を参照してください。Alibaba Cloud Linux 3でGPUリソースを要求するポッドを実行したときに、「NVMLの初期化に失敗しました: 不明なエラー」というエラーメッセージが表示された場合はどうすればよいですか。
HostNetwork: アプリケーションのポッドをホストネットワークで実行するように設定します。 詳細については、「ホストネットワークの使用」をご参照ください。
次のYAMLテンプレートを使用して、TensorFlowアプリケーションをデプロイします。
apiVersion: apps/v1 kind: Deployment metadata: labels: app: netperf name: netperf spec: replicas: 2 selector: matchLabels: app: netperf template: metadata: labels: app: netperf spec: hostNetwork: true containers: - command: - bash - -c - sleep 360000 image: registry-vpc.cn-beijing.aliyuncs.com/wangbs/tftest imagePullPolicy: Always name: netperf resources: limits: cpu: "10" requests: cpu: "10" securityContext: privileged: true
アプリケーションを実行してeRDMAをテストします。
次のコマンドを実行し、ポッドのIPアドレスを記録します。
kubectl get pod -o wide
期待される出力:
PSとWorkerという名前の2つのプロセスを作成します。 次のコマンドでポッドのIPアドレスを指定します。
PS: Worker: 次の出力が返されます。 TensorFlowアプリケーションのコンピューティングパフォーマンスを確認できます。
# Worker CUDA_VISIBLE_DEVICES= python benchmarks/scripts/tf_cnn_benchmarks/tf_cnn_benchmarks.py \ --ps_hosts=172.18.XX.XX:9100\ --worker_hosts=172.18.XX.XX:9200 \ --job_name=worker \ --task_index=0 \ --server_protocol=grpc+verbs \ --variable_update=parameter_server \ --local_parameter_device=cpu \ --model=resnet50 \ --device=cpu \ --batch_size=16 \ --data_format=NHWC # PS CUDA_VISIBLE_DEVICES= python benchmarks/scripts/tf_cnn_benchmarks/tf_cnn_benchmarks.py \ --ps_hosts=172.18.XX.XX:9100\ --worker_hosts=172.18.XX.XX:9200 \ --job_name=ps \ --local_parameter_device=cpu \ --task_index=0 \ --device=cpu \ --data_format=NHWC \ --server_protocol=grpc+verbs