H4D でハイ パフォーマンス コンピューティング(HPC)ワークロードを実行する


このドキュメントでは、H4D マシンシリーズとリモート ダイレクト メモリ アクセス(RDMA)を使用する Google Kubernetes Engine(GKE)クラスタで、ハイ パフォーマンス コンピューティング(HPC)ワークロードを実行する方法について説明します。

H4D は、Compute Engine 向け HPC 最適化マシン ファミリーのマシンシリーズです。このマシンシリーズは、高性能、低コスト、スケーラビリティ向けに最適化されています。H4D は、複数のノードにまたがってスケーリングするアプリケーションに適しています。RDMA を使用するように構成された H4D インスタンスは、ノード間で最大 200 Gbps のネットワーク帯域幅をサポートします。

このページの手順では、Google Cloud CLI を使用して、クラスタ環境を最大限に柔軟に構成できます。また、Cluster Toolkit を使用して、H4D を使用する本番環境対応の GKE クラスタをすばやく作成することもできます。詳細については、GKE H4D ブループリントをご覧ください。

始める前に

作業を始める前に、次のタスクが完了していることを確認してください。

  • Google Kubernetes Engine API を有効にする。
  • Google Kubernetes Engine API の有効化
  • このタスクに Google Cloud CLI を使用する場合は、gcloud CLI をインストールして初期化する。すでに gcloud CLI をインストールしている場合は、gcloud components update を実行して最新のバージョンを取得する。
  • Flex Start プロビジョニング モードを使用して、H4D VM を取得します。また、90 日を超えるリソースが必要な場合や、リクエストで 256 個を超える H4D VM が必要な場合は、アカウント チームにお問い合わせください。リージョンで使用可能な容量に応じて、H4D VM をオンデマンドでプロビジョニングすることもできます。
  • GKE バージョン 1.32.6-gke.1060000 以降を使用して、GKE Standard モードで予約済みの H4D VM を含むノードプールを作成します。
  • GKE バージョン 1.33.2-gke.4731000 以降を使用して、次のものを作成します。

  • H4D マシンタイプが使用可能なロケーションのみを使用します。詳細については、使用可能なリージョンとゾーンの表で H4D をフィルタリングしてください。

  • Container-Optimized OS ノードイメージのみを使用します。

  • H4D の制限事項を確認します。

  • H4D マシンタイプはライブ マイグレーションをサポートしていないため、ホストのメンテナンスの処理方法を確認します。詳細については、H4D インスタンスのメンテナンス エクスペリエンスをご覧ください。

  • 次のセクションのコマンドで、次の値を置き換えます。

    • PROJECT_ID: 実際のGoogle Cloud プロジェクト ID。
    • CLUSTER_NAME: クラスタの名前。
    • CONTROL_PLANE_LOCATION: クラスタのコントロール プレーンの Compute Engine のロケーション。リージョン クラスタの場合はリージョン、ゾーンクラスタの場合はゾーンを指定します。本番環境のワークロードには、リージョン クラスタをおすすめします。リージョン クラスタの場合、リージョンには H4D が使用可能なゾーンが含まれている必要があります。ゾーンクラスタの場合、ゾーンで H4D を使用できる必要があります。
    • COMPUTE_ZONE: ノードプールのゾーン。これは、H4D が利用可能なゾーンである必要があります。H4D ノードを RDMA で動作させる場合は、マルチゾーン ノードプールを作成できません。
    • RDMA_NETWORK_PREFIX: RDMA ネットワーク プレフィックス(例: h4d-rdma)。
    • RDMA_SUBNET_CIDR: RDMA サブネットの CIDR 範囲。この範囲がクラスタのデフォルト ネットワークと重複しないようにします。
    • NODE_POOL_NAME: H4D ノードプールの名前。
    • NODE_COUNT: ノードプール内に作成する H4D ノードの数。
    • H4D_MACHINE_TYPE: 使用する H4D マシンタイプ(例: h4d-highmem-192-lssd)。

VPC とサブネットを作成する

クラスタのデフォルトの Virtual Private Cloud(VPC)とサブネットを構成します。RDMA ネットワーク インターフェース カード(NIC)用に、専用の VPC とサブネットを作成します。次の手順で作成する VPC は、必要に応じて RDMA ネットワーク プロファイルを使用します。

  1. RDMA NIC 用の HPC VPC を作成します。

    gcloud compute --project=PROJECT_ID \
      networks create RDMA_NETWORK_PREFIX-net \
      --network-profile=COMPUTE_ZONE-vpc-falcon \
      --subnet-mode=custom
    
  2. RDMA ネットワークのサブネットを作成します。

    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 クラスタを作成する

マルチネットワーキングを有効にして 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/19POD_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
EOF

H4D ノードプールを作成する

H4D を使用し、RDMA ネットワークに接続するノードプールを作成します。予約バインドされた H4D ノードとコンパクトな配置を使用できます。または、Flex Start でプロビジョニングされた H4D ノードを使用することもできます。使用オプションに対応するタブを選択します。

予約で制限

  1. コンパクト プレースメントのリソース ポリシーを作成します。コンパクト プレースメントは、ノードがゾーン内で相対的に配置されるようにすることで、複数のノードにまたがって実行される密結合の HPC ワークロードのパフォーマンスを最適化します。

    次のコマンドを実行します。

    gcloud compute resource-policies create group-placement POLICY_NAME \
        --region REGION --collocation collocated
    

    次の値を置き換えます。

    • POLICY_NAME: リソース ポリシーの名前(h4d-compact など)。
    • REGION: クラスタのリージョン。
  2. 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_UNAVAILABLE
    

    MAX_UNAVAILABLE は、ノードプールのアップグレード中に同時に使用不可にできるノードの最大数に置き換えます。コンパクト プレースメントには、アップグレード中に同じ場所に配置されたノードを検出する可能性を最適化するため、高速、サージ アップグレードなしをおすすめします。

Flex Start

Flex Start でプロビジョニングされ、RDMA ネットワークに接続する 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=0

MAX_NODES は、指定したノードプールで自動的にスケーリングするゾーンの最大ノード数に置き換えます。

Docker イメージを準備する

次の Dockerfile の例を使用して、イメージを準備します。

FROM rockylinux:8.9

RUN dnf install https://depot.ciq.com/public/files/gce-accelerator/irdma-kernel-modules-el8-x86_64/irdma-repos.rpm -y

RUN dnf install rdma-core libibverbs-utils librdmacm-utils infiniband-diags perftest -y
ベスト プラクティス:

Rocky 8 は、RDMA をサポートする推奨のコンテナベースのイメージです。iRDMA ドライバは、他の Linux ディストリビューションではまだ広く利用できない可能性があります。

RDMA 用にマニフェストを構成する

次のアノテーションを Pod メタデータに追加して、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 を実行して、RDMA 機能を確認します。

  1. サーバー Pod で rping コマンドを実行します。

    rping -s
    
  2. クライアント Pod で rping コマンドを実行します。

    rping -c -C 2 -d -a SERVER_IP
    

    SERVER_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
    

次のステップ