このドキュメントでは、H4D マシンシリーズとリモート ダイレクト メモリアクセス(RDMA)を使用する Google Kubernetes Engine(GKE)クラスタでハイ パフォーマンス コンピューティング(HPC)ワークロードを実行する方法について説明します。
H4D は、Compute Engine 向けコンピューティング最適化マシン ファミリーのマシンシリーズです。このマシンシリーズは、高パフォーマンス、低コスト、ス拡張性を重視して最適化されています。H4D は、複数のノードにまたがってスケーリングするアプリケーションに適しています。RDMA を使用するように構成された H4D インスタンスは、ノード間で最大 200 Gbps のネットワーク帯域幅をサポートします。
始める前に
作業を始める前に、次のタスクが完了していることを確認してください。
- Google Kubernetes Engine API を有効にする。 Google Kubernetes Engine API の有効化
- このタスクに Google Cloud CLI を使用する場合は、gcloud CLI をインストールして初期化する。gcloud CLI をインストール済みの場合は、
gcloud components updateコマンドを実行して最新のバージョンを取得します。以前のバージョンの gcloud CLI では、このドキュメントのコマンドを実行できない場合があります。
消費オプションを選択したら、H4D VM の容量を取得します。H4D VM には、高密度リソース割り当てをおすすめします。高密度リソース割り当ては、H4D の一部のプロビジョニング モデルで使用できます。これにより、H4D 容量のクラスタ管理機能が強化されます。容量を取得する手順は次のとおりです。
次の GKE バージョンの要件を満たしていることを確認します。
- GKE バージョン 1.32.6-gke.1060000 以降を使用して、GKE Standard モードで予約済み H4D VM を含むノードプールを作成します。
GKE バージョン 1.33.2-gke.4731000 以降を使用して、次のものを作成します。
- Flex Start を使用する H4D ノード
- Autopilot を使用する H4D ノード
- Standard クラスタでクラスタの自動スケーリングを使用する H4D ノード
- Standard クラスタでノードの自動プロビジョニングを使用する H4D ノード
H4D マシンタイプを使用できるロケーションのみを使用します。詳細については、使用可能なリージョンとゾーンの表で
H4Dをフィルタリングしてご覧ください。Container-Optimized OS のノードイメージのみを使用します。
H4D の制限事項を確認します。
H4D マシンタイプはライブ マイグレーションをサポートしていないため、ホスト メンテナンスの処理方法を確認します。詳細については、H4D インスタンスのメンテナンス エクスペリエンスとライブ マイグレーションが行われない GKE ノードの停止を管理するをご覧ください。
GKE クラスタとネットワークを構成する
Cluster Toolkit を使用すると、予約にバインドされた H4D VM を使用するプロダクション レディな GKE クラスタをすばやく作成できます。このセクションの Cluster Toolkit の手順では、GKE H4D ブループリントを使用します。
また、Google Cloud CLI を使用して、予約にバインドされた VM または Flex-start VM を使用してクラスタ環境を柔軟に構成することもできます。
Cluster Toolkit
Cluster Toolkit を設定します。 依存関係が Cluster Toolkit にすでにプリインストールされているため、Cloud Shell を使用することをおすすめします。
Cluster Toolkit をインストールしたホストマシンの IP アドレスを取得します。
curl ifconfig.meこの IP アドレスを保存して、後の手順で
IP_ADDRESS変数に使用します。Terraform デプロイの状態を保存する Cloud Storage バケットを作成します。
gcloud storage buckets create gs://BUCKET_NAME \ --default-storage-class=STANDARD \ --project=PROJECT_ID \ --location=COMPUTE_REGION_TERRAFORM_STATE \ --uniform-bucket-level-access gcloud storage buckets update gs://BUCKET_NAME --versioning次の変数を置き換えます。
BUCKET_NAME: 新しい Cloud Storage バケットの名前。PROJECT_ID: 実際の Google Cloud プロジェクト ID。COMPUTE_REGION_TERRAFORM_STATE: Terraform デプロイの状態を保存するコンピューティング リージョン。
GitHub リポジトリの
examples/gke-h4d/gke-h4d-deployment.yamlブループリントで、terraform_backend_defaultsセクションとvarsセクションに次の設定を入力して、デプロイの特定の値と一致させます。DEPLOYMENT_NAME: デプロイの一意の名前。長さは 6~30 文字にする必要があります。デプロイ名がプロジェクト内で一意でない場合、クラスタの作成は失敗します。デフォルト値はgke-h4dです。BUCKET_NAME: 前の手順で作成した Cloud Storage バケットの名前。PROJECT_ID: 実際の Google Cloud プロジェクト ID。COMPUTE_REGION: クラスタのコンピューティング リージョン。これは、予約に対して使用可能なマシンがあるリージョンと一致する必要があります。COMPUTE_ZONE: H4D マシンのノードプールのコンピューティング ゾーン。このゾーンは、予約に対して使用可能なマシンがあるゾーンと一致する必要があります。NODE_COUNT: クラスタ内の H4D ノードの数。IP_ADDRESS/SUFFIX: クラスタへの接続を許可する IP アドレス範囲。この CIDR ブロックには、Terraform の呼び出しに使用するマシンの IP アドレスを含める必要があります。詳細については、承認済みネットワークの仕組みをご覧ください。reservationフィールドには、ノードプールのプロビジョニング時に、予約の特定のブロックをターゲットにするかどうかに応じて、次のいずれかを使用します。- ノードプールを予約の任意の場所に配置するには、予約の名前(
RESERVATION_NAME)を指定します。 予約の特定のブロックをターゲットにするには、予約名とブロック名を次の形式で使用します。
RESERVATION_NAME/reservationBlocks/BLOCK_NAME予約で使用可能なブロックが不明な場合は、予約トポロジを表示するをご覧ください。
- ノードプールを予約の任意の場所に配置するには、予約の名前(
アプリケーションのデフォルト認証情報(ADC)を生成して、Terraform にアクセスできるようにします。Cloud Shell を使用している場合は、次のコマンドを実行します。
gcloud auth application-default loginブループリントをデプロイして、H4D マシンタイプを使用して GKE インフラストラクチャをプロビジョニングします。
./gcluster deploy -d examples/gke-h4d/gke-h4d-deployment.yaml examples/gke-h4d/gke-h4d.yamlプロンプトが表示されたら、[(A)pply] を選択してブループリントをデプロイします。
また、このブループリントは Filestore インスタンスをプロビジョニングし、永続ボリューム(PV)を使用して GKE クラスタに接続します。このブループリントには、ジョブ テンプレートの例が含まれています。このテンプレートは、この共有ストレージにデータを読み書きする並列 Job を実行します。デプロイの出力に
kubectl createが表示されます。これは、サンプル Job をトリガーするために使用できます。
Google Cloud CLI
このセクションのコマンドで、次の値を置き換えます。
PROJECT_ID: 実際の Google Cloud プロジェクト ID。CLUSTER_NAME: クラスタの名前。CONTROL_PLANE_LOCATION: クラスタのコントロール プレーンの Compute Engine のロケーション。リージョン クラスタの場合はリージョン、ゾーンクラスタの場合はゾーンを指定します。本番環境のワークロードには、リージョン クラスタをおすすめします。リージョン クラスタの場合、リージョンには H4D を使用できるゾーンが含まれている必要があります。ゾーンクラスタの場合、ゾーンで H4D を利用できる必要があります。予約を使用している場合、リージョンとゾーンは予約のリージョンとゾーンと一致している必要があります。COMPUTE_ZONE: ノードプールのゾーン。これは、H4D を使用できるゾーンである必要があります。予約を使用している場合、リージョンとゾーンは予約のリージョンとゾーンと一致している必要があります。H4D ノードを Cloud RDMA と連携させる場合は、マルチゾーン ノードプールを作成できません。RDMA_NETWORK_PREFIX: RDMA ネットワークの接頭辞(例:h4d-rdma)。RDMA_SUBNET_CIDR: RDMA サブネットの CIDR の範囲。この範囲がクラスタのデフォルト ネットワークと重複しないようにしてください。NODE_POOL_NAME: H4D ノードプールの名前。NODE_COUNT: ノードプール内に作成する H4D ノードの数。H4D_MACHINE_TYPE: 使用するマシンタイプ(例:h4d-highmem-192-lssd)。
次の手順で、gcloud CLI を使用してクラスタを作成します。
VPC とサブネットを作成する: クラスタに対してデフォルトの Virtual Private Cloud(VPC)とサブネットを構成します。IRDMA ネットワーク インターフェース カード(NIC)の場合は、専用の VPC とサブネットを作成します。次の手順で作成する VPC では、必要に応じて Falcon VPC ネットワーク プロファイルを使用します。
RDMA over Falcon 転送プロトコルを使用する IRDMA ネットワーク インターフェース用 VPC を作成します。
gcloud compute --project=PROJECT_ID \ networks create RDMA_NETWORK_PREFIX-net \ --network-profile=COMPUTE_ZONE-vpc-falcon \ --subnet-mode=customFalcon VPC ネットワークのサブネットを作成します。
gcloud compute --project=PROJECT_ID \ networks subnets create \ RDMA_NETWORK_PREFIX-sub-0 \ --network=RDMA_NETWORK_PREFIX-net \ --region=CONTROL_PLANE_LOCATION \ --range=RDMA_SUBNET_CIDR
マルチネットワーキングを使用して GKE クラスタを作成する: クラスタを作成します。必要に応じて、このコマンドを使用して、サービスと Pod のセカンダリ CIDR の範囲を明示的に指定できます。
次のコマンドを実行します。
gcloud container clusters create CLUSTER_NAME --project PROJECT_ID \ --enable-dataplane-v2 --enable-ip-alias --location=CONTROL_PLANE_LOCATION \ --enable-multi-networking \ [--services-ipv4-cidr=SERVICE_CIDR \ --cluster-ipv4-cidr=POD_CIDR]これらのオプション フラグを使用する場合は、次の追加の値を置き換えます。
SERVICE_CIDR: Service のセカンダリ CIDR の範囲。POD_CIDR: Pod のセカンダリ CIDR の範囲。
これらのフラグを使用する場合は、CIDR の範囲が追加のノード ネットワークのサブネット範囲と重複してないことを確認してください。(例:
SERVICE_CIDR=10.65.0.0/19、POD_CIDR=10.64.0.0/19)。GKE ネットワーク オブジェクトを作成する: GKE ネットワーク パラメータ セットを使用して VPC ネットワークを構成します。
GKENetworkParamSetオブジェクトとNetworkオブジェクトを適用します。kubectl apply -f - <<EOF apiVersion: networking.gke.io/v1 kind: GKENetworkParamSet metadata: name: rdma-0 spec: vpc: RDMA_NETWORK_PREFIX-net vpcSubnet: RDMA_NETWORK_PREFIX-sub-0 deviceMode: RDMA --- apiVersion: networking.gke.io/v1 kind: Network metadata: name: rdma-0 spec: type: "Device" parametersRef: group: networking.gke.io kind: GKENetworkParamSet name: rdma-0 EOFH4D ノードプールを作成する: H4D を使用し、Falcon VPC ネットワークに接続するノードプールを作成します。予約にバインドされた H4D ノードとコンパクト プレースメントを使用できます。または、Flex Start でプロビジョニングされた H4D ノードを使用することもできます。消費オプションに対応するタブを選択します。
予約で制限
コンパクト プレースメントのリソース ポリシーを作成します。コンパクト プレースメントは、ゾーン内におけるノードの物理的な配置を相対的にすることで、複数のノードにまたがって実行される密結合の HPC ワークロードのパフォーマンスを最適化します。
次のコマンドを実行します。
gcloud compute resource-policies create group-placement POLICY_NAME \ --region REGION --collocation collocated次の値を置き換えます。
POLICY_NAME: リソース ポリシーの名前(h4d-compactなど)。REGION: クラスタのリージョン。
H4D を使用して RDMA ネットワークに接続するノードプールを作成します。
gcloud container node-pools create NODE_POOL_NAME --project PROJECT_ID \ --location=CONTROL_PLANE_LOCATION --cluster CLUSTER_NAME --num-nodes=NODE_COUNT \ --node-locations=COMPUTE_ZONE \ --machine-type H4D_MACHINE_TYPE \ --additional-node-network network=RDMA_NETWORK_PREFIX-net,subnetwork=RDMA_NETWORK_PREFIX-sub-0 \ --placement-policy POLICY_NAME \ --max-surge-upgrade 0 \ --max-unavailable-upgrade MAX_UNAVAILABLEMAX_UNAVAILABLEは、ノードプールのアップグレード中に同時に使用不可にできるノードの最大数に置き換えます。コンパクト プレースメントには、アップグレード中に同じ場所に配置されたノードを検出する可能性を最適化するため、高速、サージ アップグレードなしをおすすめします。
Flex Start
Flex Start でプロビジョニングされ、Falcon VPC ネットワークに接続する H4D ノードを使用するノードプールを作成します。
gcloud container node-pools create NODE_POOL_NAME --project PROJECT_ID \ --location=CONTROL_PLANE_LOCATION --cluster CLUSTER_NAME \ --node-locations=COMPUTE_ZONE \ --machine-type H4D_MACHINE_TYPE \ --additional-node-network network=RDMA_NETWORK_PREFIX-net,subnetwork=RDMA_NETWORK_PREFIX-sub-0 \ --flex-start --enable-autoscaling --reservation-affinity=none \ --min-nodes=0 --max-nodes=MAX_NODES --num-nodes=0MAX_NODESは、指定したノードプールで自動的にスケーリングするゾーンあたりの最大ノード数に置き換えます。
Docker イメージを準備する
次の Dockerfile の例を使用して、イメージを準備します。
FROM docker.io/rockylinux/rockylinux:8.10
RUN dnf -y install https://depot.ciq.com/public/download/ciq-sigcloud-next-8/ciq-sigcloud-next-8.x86_64/Packages/c/ciq-sigcloud-next-release-6-1.el8_10.cld_next.noarch.rpm
&& dnf -y update ciq-sigcloud-next-release
&& dnf clean all
RUN dnf install rdma-core libibverbs-utils librdmacm-utils infiniband-diags perftest -y
どのイメージが IRDMA をサポートしているかについて詳しくは、オペレーティング システムの詳細の表にある [インターフェース] タブをご覧ください。
RDMA 用にマニフェストを構成する
次のアノテーションを Pod メタデータに追加して、Cloud RDMA を有効にします。
metadata:
annotations:
networking.gke.io/default-interface: 'eth0'
networking.gke.io/interfaces: |
[
{"interfaceName":"eth0","network":"default"},
{"interfaceName":"eth1","network":"rdma-0"},
]
rping で RDMA をテストする
サーバー Pod とクライアント Pod の間で rping を実行して、Cloud RDMA の機能を確認します。
サーバー Pod で
rpingコマンドを実行します。rping -sクライアント Pod で
rpingコマンドを実行します。rping -c -C 2 -d -a SERVER_IPSERVER_IPは、サーバー Pod の IP アドレスに置き換えます。成功した場合の出力は次のようになります。
created cm_id 0x5b597bf94800 cma_event type RDMA_CM_EVENT_ADDR_RESOLVED cma_id 0x5b597bf94800 (parent) cma_event type RDMA_CM_EVENT_ROUTE_RESOLVED cma_id 0x5b597bf94800 (parent) rdma_resolve_addr - rdma_resolve_route successful created pd 0x5b597bf94fa0 created channel 0x5b597bf96830 created cq 0x5b597bf94ff0 created qp 0x5b597bf96c00 rping_setup_buffers called on cb 0x5b597bf8c820 allocated & registered buffers... cq_thread started. cma_event type RDMA_CM_EVENT_ESTABLISHED cma_id 0x5b597bf94800 (parent) ESTABLISHED rdma_connect successful RDMA addr 5b597bf8cd80 rkey dadac8c4 len 64 send completion recv completion RDMA addr 5b597bf8cff0 rkey 86ef015f len 64 send completion recv completion RDMA addr 5b597bf8cd80 rkey dadac8c4 len 64 send completion recv completion RDMA addr 5b597bf8cff0 rkey 86ef015f len 64 send completion recv completion rping_free_buffers called on cb 0x5b597bf8c820 destroy cm_id 0x5b597bf94800
次のステップ
- ハイ パフォーマンス コンピューティングの詳細を確認する。
- 一部の HPC ワークロードでは、RDMA を使用して密結合のマルチノード ワークロードを実行するために Message Passing Interface(MPI)が必要です。H4D ノードのクラスタでの MPI の設定について詳しくは、GKE H4D で MPI ワークロードを実行するをご覧ください。