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

このドキュメントでは、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 では、このドキュメントのコマンドを実行できない場合があります。

GKE クラスタとネットワークを構成する

Cluster Toolkit を使用すると、予約にバインドされた H4D VM を使用するプロダクション レディな GKE クラスタをすばやく作成できます。このセクションの Cluster Toolkit の手順では、GKE H4D ブループリントを使用します。

また、Google Cloud CLI を使用して、予約にバインドされた VM または Flex-start VM を使用してクラスタ環境を柔軟に構成することもできます。

Cluster Toolkit

  1. Cluster Toolkit を設定します。 依存関係が Cluster Toolkit にすでにプリインストールされているため、Cloud Shell を使用することをおすすめします。

  2. Cluster Toolkit をインストールしたホストマシンの IP アドレスを取得します。

    curl ifconfig.me
    

    この IP アドレスを保存して、後の手順で IP_ADDRESS 変数に使用します。

  3. 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 デプロイの状態を保存するコンピューティング リージョン。
  4. 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
        

        予約で使用可能なブロックが不明な場合は、予約トポロジを表示するをご覧ください。

  5. アプリケーションのデフォルト認証情報(ADC)を生成して、Terraform にアクセスできるようにします。Cloud Shell を使用している場合は、次のコマンドを実行します。

    gcloud auth application-default login
    
  6. ブループリントをデプロイして、H4D マシンタイプを使用して GKE インフラストラクチャをプロビジョニングします。

    ./gcluster deploy -d examples/gke-h4d/gke-h4d-deployment.yaml examples/gke-h4d/gke-h4d.yaml
    
  7. プロンプトが表示されたら、[(A)pply] を選択してブループリントをデプロイします。

  8. また、このブループリントは 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 を使用してクラスタを作成します。

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

    1. RDMA over Falcon 転送プロトコルを使用する IRDMA ネットワーク インターフェース用 VPC を作成します。

      gcloud compute --project=PROJECT_ID \
        networks create RDMA_NETWORK_PREFIX-net \
        --network-profile=COMPUTE_ZONE-vpc-falcon \
        --subnet-mode=custom
      
    2. Falcon 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
      
  2. マルチネットワーキングを使用して 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)。

  3. 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
    
  4. H4D ノードプールを作成する: H4D を使用し、Falcon VPC ネットワークに接続するノードプールを作成します。予約にバインドされた 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 でプロビジョニングされ、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=0
    

    MAX_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 の機能を確認します。

  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
    

次のステップ