Menjalankan workload komputasi berperforma tinggi (HPC) dengan H4D

Dokumen ini menjelaskan cara menjalankan workload komputasi berperforma tinggi (HPC) di cluster Google Kubernetes Engine (GKE) yang menggunakan seri mesin H4D dan akses memori langsung jarak jauh (RDMA).

H4D adalah seri mesin dalam Kelompok mesin yang dioptimalkan untuk komputasi untuk Compute Engine. Seri mesin ini dioptimalkan untuk performa tinggi, biaya rendah, dan skalabilitas. H4D berfungsi dengan baik untuk aplikasi yang diskalakan di beberapa node. Instance H4D yang dikonfigurasi untuk menggunakan RDMA mendukung bandwidth jaringan hingga 200 Gbps antar-node.

Sebelum memulai

Sebelum memulai, pastikan Anda telah melakukan tugas berikut:

  • Aktifkan Google Kubernetes Engine API.
  • Aktifkan Google Kubernetes Engine API
  • Jika ingin menggunakan Google Cloud CLI untuk tugas ini, instal lalu lakukan inisialisasi gcloud CLI. Jika sebelumnya Anda telah menginstal gcloud CLI, dapatkan versi terbaru dengan menjalankan perintah gcloud components update. gcloud CLI versi sebelumnya mungkin tidak mendukung menjalankan perintah dalam dokumen ini.

Mengonfigurasi cluster dan jaringan GKE

Anda dapat menggunakan Cluster Toolkit untuk membuat cluster GKE yang siap produksi dengan cepat yang menggunakan VM H4D yang terikat reservasi. Petunjuk Cluster Toolkit di bagian ini menggunakan Blueprint GKE H4D.

Atau, Anda dapat menggunakan Google Cloud CLI untuk fleksibilitas maksimum dalam mengonfigurasi lingkungan cluster dengan VM yang terikat reservasi atau VM Flex-start.

Cluster Toolkit

  1. Siapkan Cluster Toolkit. Sebaiknya gunakan Cloud Shell untuk melakukannya karena dependensi sudah diinstal sebelumnya untuk Cluster Toolkit.

  2. Dapatkan alamat IP untuk mesin host tempat Anda menginstal Cluster Toolkit:

    curl ifconfig.me
    

    Simpan alamat IP ini untuk digunakan sebagai variabel IP_ADDRESS pada langkah berikutnya.

  3. Buat bucket Cloud Storage untuk menyimpan status deployment Terraform:

    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
    

    Ganti variabel berikut:

    • BUCKET_NAME: nama bucket Cloud Storage baru.
    • PROJECT_ID: Google Cloud Project ID Anda.
    • COMPUTE_REGION_TERRAFORM_STATE: region komputasi tempat Anda ingin menyimpan status deployment Terraform.
  4. Dalam cetak biru examples/gke-h4d/gke-h4d-deployment.yaml dari repo GitHub, isi setelan berikut di bagian terraform_backend_defaults dan vars agar sesuai dengan nilai spesifik untuk deployment Anda:

    • DEPLOYMENT_NAME: nama unik untuk deployment, yang panjangnya harus antara 6 dan 30 karakter. Jika nama deployment tidak unik dalam project, pembuatan cluster akan gagal. Nilai defaultnya adalah gke-h4d.
    • BUCKET_NAME: nama bucket Cloud Storage yang Anda buat di langkah sebelumnya.
    • PROJECT_ID: Google Cloud Project ID Anda.
    • COMPUTE_REGION: region komputasi untuk cluster, yang harus cocok dengan region tempat mesin tersedia untuk pemesanan Anda.
    • COMPUTE_ZONE: zona komputasi untuk node pool mesin H4D. Perhatikan bahwa zona ini harus cocok dengan zona tempat mesin tersedia dalam reservasi Anda.
    • NODE_COUNT: jumlah node H4D di cluster Anda.
    • IP_ADDRESS/SUFFIX: Rentang alamat IP yang ingin Anda izinkan untuk terhubung dengan cluster. Blok CIDR ini harus mencakup alamat IP mesin yang ingin Anda gunakan untuk memanggil Terraform. Untuk mengetahui informasi selengkapnya, lihat Cara kerja jaringan yang diizinkan.
    • Untuk kolom reservation, gunakan salah satu opsi berikut, bergantung pada apakah Anda ingin menargetkan blok tertentu dalam reservasi saat menyediakan node pool:

      • Untuk menempatkan node pool di mana saja dalam reservasi, berikan nama reservasi Anda (RESERVATION_NAME).
      • Untuk menargetkan blok tertentu dalam reservasi, gunakan nama reservasi dan blok dalam format berikut:

          RESERVATION_NAME/reservationBlocks/BLOCK_NAME
        

        Jika Anda tidak tahu blok mana yang tersedia dalam reservasi Anda, lihat Melihat topologi reservasi.

  5. Buat Kredensial Default Aplikasi (ADC) untuk memberikan akses ke Terraform. Jika menggunakan Cloud Shell, Anda dapat menjalankan perintah berikut:

    gcloud auth application-default login
    
  6. Deploy blueprint untuk menyediakan infrastruktur GKE menggunakan jenis mesin H4D:

    ./gcluster deploy -d examples/gke-h4d/gke-h4d-deployment.yaml examples/gke-h4d/gke-h4d.yaml
    
  7. Jika diminta, pilih (T)erapkan untuk men-deploy blueprint.

  8. Selain itu, cetak biru ini menyediakan instance Filestore dan menghubungkannya ke cluster GKE dengan Volume Persisten (PV). Contoh template Job disertakan dalam cetak biru ini. Template ini menjalankan Tugas paralel yang membaca dan menulis data ke penyimpanan bersama ini. kubectl create ditampilkan di output deployment yang dapat digunakan untuk memicu Job contoh.

Google Cloud CLI

Ganti nilai berikut untuk perintah di bagian ini:

  • PROJECT_ID: Google Cloud Project ID Anda.
  • CLUSTER_NAME: nama cluster Anda.
  • CONTROL_PLANE_LOCATION: lokasi Compute Engine bidang kontrol cluster Anda. Berikan region untuk cluster regional, atau zona untuk cluster zona. Cluster regional direkomendasikan untuk beban kerja produksi. Untuk cluster regional, region harus menyertakan zona tempat H4D tersedia. Untuk cluster zona, zona harus memiliki ketersediaan H4D. Jika Anda menggunakan reservasi, region dan zona harus cocok dengan region dan zona reservasi.
  • COMPUTE_ZONE: zona node pool Anda. Ini harus berupa zona tempat H4D tersedia. Jika Anda menggunakan reservasi, region dan zona harus cocok dengan region dan zona reservasi. Anda tidak dapat membuat node pool multi-zona jika ingin node H4D berfungsi dengan Cloud RDMA.
  • RDMA_NETWORK_PREFIX: awalan jaringan RDMA (misalnya, h4d-rdma).
  • RDMA_SUBNET_CIDR: rentang CIDR subnet RDMA. Pastikan rentang ini tidak tumpang-tindih dengan jaringan default cluster.
  • NODE_POOL_NAME: nama node pool H4D Anda.
  • NODE_COUNT: jumlah node H4D yang akan dibuat di node pool.
  • H4D_MACHINE_TYPE: jenis mesin H4D yang akan digunakan (misalnya, h4d-highmem-192-lssd).

Buat cluster dengan gcloud CLI menggunakan langkah-langkah berikut:

  1. Buat VPC dan subnet: Konfigurasi Virtual Private Cloud (VPC) dan subnet default untuk cluster. Untuk kartu antarmuka jaringan (NIC) IRDMA, buat VPC dan subnet khusus. VPC yang dibuat dengan petunjuk berikut menggunakan profil jaringan VPC Falcon sesuai kebutuhan.

    1. Buat VPC untuk antarmuka jaringan IRDMA yang menggunakan protokol transportasi RDMA over Falcon:

      gcloud compute --project=PROJECT_ID \
        networks create RDMA_NETWORK_PREFIX-net \
        --network-profile=COMPUTE_ZONE-vpc-falcon \
        --subnet-mode=custom
      
    2. Buat subnet untuk jaringan VPC Falcon:

      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. Buat cluster GKE dengan multi-networking: Buat cluster. Secara opsional, dengan perintah ini, Anda dapat secara eksplisit memberikan rentang CIDR sekunder untuk layanan dan Pod.

    Jalankan perintah berikut:

    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]
    

    Jika Anda menggunakan flag opsional ini, ganti nilai tambahan berikut:

    • SERVICE_CIDR: rentang CIDR sekunder untuk layanan.
    • POD_CIDR: rentang CIDR sekunder untuk Pod.

    Saat Anda menggunakan tanda ini, pastikan rentang CIDR tidak tumpang-tindih dengan rentang subnet untuk jaringan node tambahan. Misalnya, SERVICE_CIDR=10.65.0.0/19 dan POD_CIDR=10.64.0.0/19.

  3. Buat objek jaringan GKE: Konfigurasi jaringan VPC menggunakan set parameter jaringan GKE. Terapkan objek GKENetworkParamSet dan 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. Buat node pool H4D: Buat node pool yang menggunakan H4D dan terhubung ke jaringan VPC Falcon. Anda dapat menggunakan node H4D terikat pemesanan dan penempatan rapat. Atau, Anda dapat menggunakan node H4D yang disediakan dengan flex-start. Pilih tab yang sesuai dengan opsi konsumsi Anda:

    Terikat dengan reservasi

    1. Buat kebijakan resource untuk penempatan rapat. Penempatan rapat mengoptimalkan performa untuk workload HPC yang terkait erat—yang berjalan di beberapa node—dengan memastikan bahwa node ditempatkan secara fisik satu sama lain dalam suatu zona.

      Jalankan perintah berikut:

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

      Ganti nilai berikut:

      • POLICY_NAME: nama kebijakan resource (misalnya, h4d-compact).
      • REGION: region cluster Anda.
    2. Buat node pool yang menggunakan H4D dan terhubung ke jaringan 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
      

      Ganti MAX_UNAVAILABLE dengan jumlah maksimum node yang dapat tidak tersedia secara bersamaan selama upgrade node pool. Untuk penempatan rapat, sebaiknya gunakan upgrade cepat tanpa lonjakan untuk mengoptimalkan kemungkinan penemuan node dengan lokasi yang sama selama upgrade.

    Flex-start

    Buat node pool yang menggunakan node H4D yang disediakan dengan flex-start, dan terhubung ke jaringan VPC Falcon:

    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
    

    Ganti MAX_NODES dengan jumlah maksimum node yang akan diskalakan secara otomatis untuk node pool yang ditentukan per zona.

Menyiapkan image Docker

Siapkan image Anda menggunakan contoh Dockerfile berikut:

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

Untuk mengetahui informasi selengkapnya tentang image yang mendukung IRDMA, lihat tab Antarmuka dalam tabel di Detail sistem operasi.

Mengonfigurasi manifes untuk RDMA

Aktifkan Cloud RDMA dengan menambahkan anotasi berikut ke metadata Pod Anda:

metadata:
  annotations:
    networking.gke.io/default-interface: 'eth0'
    networking.gke.io/interfaces: |
      [
        {"interfaceName":"eth0","network":"default"},
        {"interfaceName":"eth1","network":"rdma-0"},
      ]

Menguji RDMA dengan rping

Verifikasi fungsi Cloud RDMA dengan menjalankan rping antara server dan Pod klien:

  1. Di Pod server, jalankan perintah rping:

    rping -s
    
  2. Di Pod klien, jalankan perintah rping:

    rping -c -C 2 -d -a SERVER_IP
    

    Ganti SERVER_IP dengan alamat IP Pod server.

    Output yang berhasil akan terlihat seperti berikut:

    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
    

Langkah berikutnya

  • Pelajari lebih lanjut komputasi berperforma tinggi.
  • Beberapa workload HPC memerlukan Message Passing Interface (MPI) untuk menjalankan workload multi-node yang terkait erat dengan RDMA. Untuk mengetahui informasi selengkapnya tentang cara menyetel MPI di cluster untuk node H4D, lihat Menjalankan Workload MPI di GKE H4D.