H4D로 고성능 컴퓨팅(HPC) 워크로드 실행

이 문서에서는 H4D 머신 시리즈와 원격 직접 메모리 액세스 (RDMA)를 사용하는 Google Kubernetes Engine (GKE) 클러스터에서 고성능 컴퓨팅(HPC) 워크로드를 실행하는 방법을 설명합니다.

H4D는 Compute Engine용 컴퓨팅 최적화 머신 계열의 머신 시리즈입니다. 이 머신 시리즈는 고성능, 저비용, 확장성에 최적화되어 있습니다. H4D는 여러 노드로 확장되는 애플리케이션에 적합합니다. RDMA를 사용하도록 구성된 H4D 인스턴스는 노드 간에 최대 200Gbps의 네트워크 대역폭을 지원합니다.

시작하기 전에

시작하기 전에 다음 태스크를 수행했는지 확인합니다.

  • 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: 프로젝트 ID입니다. Google Cloud
    • COMPUTE_REGION_TERRAFORM_STATE: Terraform 배포의 상태를 저장할 컴퓨팅 리전입니다.
  4. GitHub 저장소의 examples/gke-h4d/gke-h4d-deployment.yaml 청사진에서 terraform_backend_defaultsvars 섹션의 다음 설정을 배포의 특정 값과 일치하도록 입력합니다.

    • DEPLOYMENT_NAME: 배포의 고유한 이름으로, 길이는 6~30자(영문 기준) 사이여야 합니다. 배포 이름이 프로젝트 내에서 고유하지 않으면 클러스터 생성에 실패합니다. 기본값은 gke-h4d입니다.
    • BUCKET_NAME: 이전 단계에서 만든 Cloud Storage 버킷의 이름입니다.
    • PROJECT_ID: 프로젝트 ID입니다. Google Cloud
    • COMPUTE_REGION: 클러스터의 컴퓨팅 리전으로, 예약에 사용할 수 있는 머신이 있는 리전과 일치해야 합니다.
    • COMPUTE_ZONE: H4D 머신의 노드 풀의 컴퓨팅 영역입니다. 이 영역은 예약에서 머신을 사용할 수 있는 영역과 일치해야 합니다.
    • NODE_COUNT: 클러스터의 H4D 노드 수입니다.
    • IP_ADDRESS/SUFFIX: 클러스터에 연결할 수 있도록 허용할 IP 주소 범위입니다. 이 CIDR 블록에는 Terraform을 호출하는 데 사용할 머신의 IP 주소가 포함되어야 합니다. 자세한 내용은 승인된 네트워크 작동 방식을 참조하세요.
    • `reservation` 필드의 경우 노드 풀을 프로비저닝할 때 예약의 특정 ``블록을 타겟팅할지 여부에 따라 다음 중 하나를 사용합니다.

      • 예약의 아무 곳에나 노드 풀을 배치하려면 예약 이름(RESERVATION_NAME)을 제공합니다.
      • 예약 내에서 특정 블록을 타겟팅하려면 다음 형식으로 예약 및 블록 이름을 사용합니다.

          RESERVATION_NAME/reservationBlocks/BLOCK_NAME
        

        예약에서 사용할 수 있는 블록을 모르는 경우, 예약 토폴로지 보기를 참조하세요.

  5. Terraform에 대한 액세스 권한을 제공하도록 애플리케이션 기본 사용자 인증 정보 (ADC)를 생성합니다. 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 클러스터에 연결합니다. 이 청사진에는 작업 템플릿 예시가 포함되어 있습니다. 이 템플릿은 이 공유 스토리지에서 데이터를 읽고 쓰는 병렬 작업을 실행합니다. 배포 출력에 kubectl create가 표시되며, 이를 사용하여 샘플 작업을 트리거할 수 있습니다.

Google Cloud CLI

이 섹션의 명령어에 대해 다음 값을 바꿉니다.

  • PROJECT_ID: 프로젝트 ID입니다. Google Cloud
  • 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 머신 유형 (예: h4d-highmem-192-lssd)입니다.

다음 단계에 따라 gcloud CLI로 클러스터를 만듭니다.

  1. VPC 및 서브넷 만들기: 클러스터의 기본 Virtual Private Cloud (VPC) 및 서브넷을 구성합니다. IRDMA 네트워크 인터페이스 카드 (NIC)의 경우 전용 VPC 및 서브넷을 만듭니다. 다음 안내에 따라 만든 VPC는 필요에 따라 Falcon VPC 네트워크 프로필을 사용합니다.

    1. Falcon 전송 프로토콜을 통한 RDMA를 사용하는 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 클러스터 만들기: 클러스터를 만듭니다. 필요에 따라 이 명령어를 사용하여 서비스 및 포드의 보조 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: 서비스의 보조 CIDR 범위입니다.
    • POD_CIDR: 포드의 보조 CIDR 범위입니다.

    이러한 플래그를 사용하는 경우 CIDR 범위가 추가 노드 네트워크의 서브넷 범위와 겹치지 않는지 확인합니다. 예를 들면 SERVICE_CIDR=10.65.0.0/19POD_CIDR=10.64.0.0/19입니다.

  3. GKE 네트워크 객체 만들기: GKE 네트워크 매개변수 집합을 사용하여 VPC 네트워크를 구성합니다. GKENetworkParamSetNetwork 객체를 적용합니다.

    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로 프로비저닝된 H4D 노드를 사용하고 Falcon VPC 네트워크에 연결되는 노드 풀을 만듭니다.

    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

CMD ["sleep", "infinity"]

IRDMA를 지원하는 이미지에 대한 자세한 내용은 인터페이스 탭에 있는 운영체제 세부정보 표를 참조하세요.

RDMA의 매니페스트 구성

포드 메타데이터에 다음 주석을 추가하여 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 테스트

서버와 클라이언트 포드 간에 rping을 실행하여 Cloud RDMA 기능을 확인합니다.

  1. 서버 포드에서 rping 명령어를 실행합니다.

    rping -s
    
  2. 서버 포드의 보조 RDMA 내부 IP 주소 (eth1)를 가져옵니다. 이 보조 IP 주소를 사용하여 RDMA 하드웨어를 통해 트래픽을 라우팅해야 합니다. 기본 포드 IP 주소를 사용하지 마세요.

    kubectl exec SERVER_POD_NAME -- ip -4 -o addr show eth1
    

    출력의 inet IP 주소를 기록해 둡니다. 다음 단계에서 이 IP 주소를 eth1 IP 주소로 사용합니다.

  3. 클라이언트 포드에서 rping 명령어를 실행합니다.

    rping -c -C 2 -d -a SERVER_IP
    

    SERVER_IP를 이전 단계에서 검색한 eth1 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
    

다음 단계