Pelatihan machine learning menggunakan Elastic Fabric Adapter - Amazon EKS

Bantu tingkatkan halaman ini

Ingin berkontribusi pada panduan pengguna ini? Gulir ke bagian bawah halaman ini dan pilih Edit halaman ini GitHub. Kontribusi Anda akan membantu membuat panduan pengguna kami lebih baik untuk semua orang.

Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.

Pelatihan machine learning menggunakan Elastic Fabric Adapter

Topik ini menjelaskan cara mengintegrasikan Elastic Fabric Adapter (EFA) dengan Pods dikerahkan di cluster Amazon EKS Anda. Elastic Fabric Adapter (EFA) adalah antarmuka jaringan untuk instans Amazon EC2 yang dapat Anda aktifkan untuk menjalankan aplikasi yang membutuhkan komunikasi antar-simpul tingkat tinggi dalam hitungan skala pada AWS. Ini merupakan sistem operasi antarmuka bypass hardware yang meningkatkan performa komunikasi antar-instans, yang sangat penting untuk skala aplikasi ini. Dengan EFA, aplikasi Komputasi Performa Tinggi (HPC) yang menggunakan aplikasi Message Passing Interface (MPI) dan Machine Learning (ML) yang juga menggunakan NVIDIA Collective Communications Library (NCCL) yang dapat menskalakan ke ribuan CPU atau GPU. Hasilnya, Anda mendapatkan kinerja aplikasi klaster HPC lokal dengan elastisitas dan fleksibilitas cloud sesuai permintaan. AWS Mengintegrasikan EFA dengan aplikasi yang berjalan di klaster Amazon EKS dapat mengurangi waktu untuk menyelesaikan beban kerja pelatihan yang terdistribusi pada skala besar tanpa harus menambahkan instans tambahan terhadap klaster Anda. Untuk informasi selengkapnya, lihat Elastic Fabric Adaptor.

Plugin EFA yang dijelaskan dalam topik ini sepenuhnya mendukung instans P4d Amazon EC2, yang mewakili awal mula perkembangan yang terdistribusi saat ini pada machine learning di cloud. Setiap instans p4d.24xlarge memiliki delapan GPU NVIDIA A100, dan 400 Gbps GPUDirectRDMA diatas EFA. GPUDirectRDMA memungkinkan Anda untuk dapat berkomunikasi secara langsung melalui GPU-ke-GPU pada seluruh simpul dengan bypass CPU, meningkatkan komunikasi bandwidth kolektif dan menurunkan latensi. Amazon EKS dan EFA terintegrasi dengan instans P4d yang menyediakan metode mulus untuk mengambil keuntungan dari kinerja tertinggi dari komputasi instans Amazon EC2 untuk pelatihan machine learning yang terdistribusi.

Prasyarat
  • Sebuah klaster Amazon EKS yang sudah ada. Jika Anda belum memiliki klaster yang belum ada, gunakan salah satu panduan Memulai dengan Amazon EKS kami untuk membuatnya. Klaster Anda harus men-deploy pada VPC yang memiliki setidaknya satu subnet privat dengan memiliki cukup alamat IP yang tersedia untuk men-deploy pada simpul. Subnet privat harus memiliki akses internet luar yang disediakan oleh perangkat eksternal, seperti gateway NAT.

    Jika Anda berencana untuk menggunakan eksctl untuk membuat grup node Anda, juga eksctl dapat membuat cluster untuk Anda.

  • Versi 2.12.3 atau yang lebih baru atau versi 1.27.160 atau yang lebih baru dari AWS Command Line Interface (AWS CLI) diinstal dan dikonfigurasi pada perangkat Anda atau AWS CloudShell. Untuk memeriksa versi Anda saat ini, gunakanaws --version | cut -d / -f2 | cut -d ' ' -f1. Package manager seperti yumapt-get,, atau Homebrew untuk macOS sering beberapa versi di belakang versi terbaru dari file AWS CLI. Untuk menginstal versi terbaru, lihat Menginstal, memperbarui, dan menghapus konfigurasi AWS CLI dan Cepat dengan aws configure di Panduan AWS Command Line Interface Pengguna. AWS CLI Versi yang diinstal AWS CloudShell mungkin juga beberapa versi di belakang versi terbaru. Untuk memperbaruinya, lihat Menginstal AWS CLI ke direktori home Anda di Panduan AWS CloudShell Pengguna.

  • Alat baris kubectl perintah diinstal pada perangkat Anda atau AWS CloudShell. Versi dapat sama dengan atau hingga satu versi minor lebih awal atau lebih lambat dari Kubernetes versi cluster Anda. Misalnya, jika versi cluster Anda1.29, Anda dapat menggunakan kubectl versi1.28,1.29, atau 1.30 dengan itu. Untuk menginstal atau memutakhirkan kubectl, lihat Menginstal atau memperbarui kubectl.

  • Anda harus memiliki Amazon VPC CNI plugin for Kubernetes versi 1.7.10 atau yang lebih baru diinstal sebelum meluncurkan node pekerja yang mendukung beberapa Adaptor Kain Elastis, sepertip4d.24xlarge. Untuk informasi selengkapnya tentang memperbarui Amazon VPC CNI plugin for Kubernetes versi Anda, lihatBekerja dengan add-on Amazon VPC CNI plugin for Kubernetes Amazon EKS.

Buat grup simpul

Prosedur berikut ini membantu Anda menciptakan grup simpul dengan grup simpul didukung p4d.24xlarge dengan antarmuka EFA dan RDMA GPUDirect, dan menjalankan contoh tes NVIDIA Collective Communications Library (NCCL) untuk Performa NCCL multi-simpul menggunakan EFA. Contohnya dapat menggunakan templat untuk didistribusikan pada pelatihan deep learning di Amazon EKS dengan menggunakan EFA.

  1. Tentukan jenis instans Amazon EC2 yang mendukung EFA yang tersedia di tempat Wilayah AWS Anda ingin menerapkan node. Ganti region-code dengan Wilayah AWS yang Anda inginkan untuk menyebarkan grup node Anda.

    aws ec2 describe-instance-types --region region-code --filters Name=network-info.efa-supported,Values=true \ --query "InstanceTypes[*].[InstanceType]" --output text

    Saat Anda menerapkan node, jenis instance yang ingin Anda terapkan harus tersedia di tempat klaster Anda berada. Wilayah AWS

  2. Tentukan Availability Zone tempat tipe instans yang ingin Anda gunakan tersedia. Dalam tutorial ini, jenis p4d.24xlarge instance digunakan dan harus dikembalikan dalam output untuk Wilayah AWS yang Anda tentukan pada langkah sebelumnya. Saat Anda menerapkan node di cluster produksi, ganti p4d.24xlarge dengan jenis instance apa pun yang dikembalikan pada langkah sebelumnya.

    aws ec2 describe-instance-type-offerings --region region-code --location-type availability-zone --filters Name=instance-type,Values=p4d.24xlarge \ --query 'InstanceTypeOfferings[*].Location' --output text

    Contoh output adalah sebagai berikut.

    us-west-2a    us-west-2c    us-west-2b

    Perhatikan Availability Zones yang dikembalikan untuk digunakan di langkah selanjutnya. Saat Anda menyebarkan node ke cluster, VPC Anda harus memiliki subnet dengan alamat IP yang tersedia di salah satu Availability Zone yang dikembalikan dalam output.

  3. Buat grup node menggunakan salah satu eksctl atau AWS CLI dan AWS CloudFormation.

    eksctl
    Prasyarat

    Versi 0.183.0 atau yang lebih baru dari alat baris eksctl perintah yang diinstal pada perangkat Anda atau AWS CloudShell. Untuk menginstal atau memperbaruieksctl, lihat Instalasi dalam eksctl dokumentasi.

    1. Salin isi berikut ke file bernama efa-cluster.yaml. Ganti example values dengan milik Anda sendiri. Anda dapat mengganti p4d.24xlarge dengan instance yang berbeda, tetapi jika Anda melakukannya, pastikan bahwa nilai untuk availabilityZones adalah Availability Zones yang dikembalikan untuk jenis instance di langkah 1.

      apiVersion: eksctl.io/v1alpha5 kind: ClusterConfig metadata: name: my-efa-cluster region: region-code version: "1.XX" iam: withOIDC: true availabilityZones: ["us-west-2a", "us-west-2c"] managedNodeGroups: - name: my-efa-ng instanceType: p4d.24xlarge minSize: 1 desiredCapacity: 2 maxSize: 3 availabilityZones: ["us-west-2a"] volumeSize: 300 privateNetworking: true efaEnabled: true
    2. Membuat grup simpul yang dikelola dalam klaster yang sudah ada.

      eksctl create nodegroup -f efa-cluster.yaml

      Jika Anda tidak memiliki klaster yang sudah ada, Anda dapat menjalankan perintah berikut ini untuk membuat klaster dan grup simpul.

      eksctl create cluster -f efa-cluster.yaml
      catatan

      Karena tipe instance yang digunakan dalam contoh ini memiliki GPU, eksctl secara otomatis menginstal plugin perangkat NVIDIA Kubernetes pada setiap instance untuk Anda.

    AWS CLI and AWS CloudFormation

    Terdapat beberapa persyaratan di jaringan EFA, termasuk membuat grup keamanan khusus EFA, membuat Amazon EC2 Grup penempatan, dan menciptakan templat peluncuran yang menentukan satu atau lebih antarmuka EFA, dan termasuk instalasi driver EFA sebagai bagian dari data pengguna Amazon EC2. Untuk mempelajari lebih lanjut tentang persyaratan EFA, lihat Memulai EFA dan MPI di Panduan Pengguna Amazon EC2. Langkah-langkah berikut membuat semua ini untuk Anda. Ganti semua contoh Nilai dengan nilai Anda sendiri.

    1. Mengatur beberapa variabel yang digunakan dalam langkah selanjutnya. Ganti semua example values dengan milik Anda sendiri. Ganti my-cluster dengan nama klaster Anda yang sudah ada. Nilai untuk kemudian node_group_resources_name digunakan untuk membuat AWS CloudFormation tumpukan. Nilai untuk node_group_name kemudian akan digunakan untuk membuat grup simpul di klaster Anda.

      cluster_name="my-cluster" cluster_region="region-code" node_group_resources_name="my-efa-nodegroup-resources" node_group_name="my-efa-nodegroup"
    2. Identifikasi subnet privat pada VPC Anda di Availability Zone yang sama dengan tipe instans di mana Anda dapat men-deploy berada.

      1. Ambil kembali versi klaster Anda dan simpan dalam variabel untuk digunakan dalam langkah selanjutnya.

        cluster_version=$(aws eks describe-cluster \ --name $cluster_name \ --query "cluster.version" \ --output text)
      2. Mengambil kembali ID VPC klaster Anda yang sudah ada dan menyimpannya dalam variabel untuk digunakan di langkah selanjutnya.

        vpc_id=$(aws eks describe-cluster \ --name $cluster_name \ --query "cluster.resourcesVpcConfig.vpcId" \ --output text)
      3. Mengambil kembali ID dari grup keamanan pesawat pengendali untuk klaster Anda dan menyimpannya dalam variabel untuk digunakan di langkah selanjutnya.

        control_plane_security_group=$(aws eks describe-cluster \ --name $cluster_name \ --query "cluster.resourcesVpcConfig.clusterSecurityGroupId" \ --output text)
      4. Dapatkan daftar subnet ID di VPC Anda yang berada di Availability Zone dengan kembali ke langkah 1.

        aws ec2 describe-subnets \ --filters "Name=vpc-id,Values=$vpc_id" "Name=availability-zone,Values=us-west-2a" \ --query 'Subnets[*].SubnetId' \ --output text

        Jika tidak ada output yang dikembalikan, coba Availability Zone yang berbeda dengan kembali ke langkah 1. Jika tidak ada subnet yang dikembalikan kepada Anda di Availability Zone pada langkah 1, maka Anda perlu membuat subnet di Availability Zone dengan kembali ke langkah 1. Jika Anda tidak memiliki ruang di VPC Anda untuk membuat subnet lain, maka Anda dapat menambahkan blok CIDR ke VPC dan membuat subnet di blok CIDR baru, atau membuat cluster baru di VPC baru.

      5. Menentukan apakah subnet adalah subnet privat dengan memeriksa tabel rute untuk subnet.

        aws ec2 describe-route-tables \ --filter Name=association.subnet-id,Values=subnet-0d403852a65210a29 \ --query "RouteTables[].Routes[].GatewayId" \ --output text

        Contoh output adalah sebagai berikut.

        local

        Jika outputnya local igw-02adc64c1b72722e2, maka subnet merupakan subnet publik. Anda harus memilih subnet privat di Availability Zone dengan kembali ke langkah 1. Setelah Anda mengidentifikasi subnet privat, catat ID untuk digunakan di langkah selanjutnya.

      6. Mengatur variabel dengan ID subnet privat dari langkah sebelumnya untuk digunakan pada langkah-langkah selanjutnya.

        subnet_id=your-subnet-id
    3. Unduh AWS CloudFormation template.

      curl -O https://raw.githubusercontent.com/aws-samples/aws-efa-eks/main/cloudformation/efa-p4d-managed-nodegroup.yaml
    4. Salin teks berikut ke komputer Anda. Ganti p4d.24xlarge dengan tipe instance dari langkah 1. Ganti subnet-0d403852a65210a29 dengan ID subnet pribadi yang Anda identifikasi pada langkah 2.b.v. Ganti path-to-downloaded-cfn-template dengan jalur ke efa-p4d-managed-nodegroup.yaml yang Anda unduh di langkah sebelumnya. Ganti your-public-key-name dengan nama kunci publik Anda. Setelah Anda membuat penggantian, jalankan perintah yang dimodifikasi.

      aws cloudformation create-stack \ --stack-name ${node_group_resources_name} \ --capabilities CAPABILITY_IAM \ --template-body file://path-to-downloaded-cfn-template \ --parameters \ ParameterKey=ClusterName,ParameterValue=${cluster_name} \ ParameterKey=ClusterControlPlaneSecurityGroup,ParameterValue=${control_plane_security_group} \ ParameterKey=VpcId,ParameterValue=${vpc_id} \ ParameterKey=SubnetId,ParameterValue=${subnet_id} \ ParameterKey=NodeGroupName,ParameterValue=${node_group_name} \ ParameterKey=NodeImageIdSSMParam,ParameterValue=/aws/service/eks/optimized-ami/${cluster_version}/amazon-linux-2-gpu/recommended/image_id \ ParameterKey=KeyName,ParameterValue=your-public-key-name \ ParameterKey=NodeInstanceType,ParameterValue=p4d.24xlarge
    5. Menentukan kapan Anda men-deploy tumpukan pada langkah sebelumnya yang telah di-deploy.

      aws cloudformation wait stack-create-complete --stack-name $node_group_resources_name

      Tidak ada output dari perintah sebelumnya, tetapi prompt shell Anda tidak kembali hingga tumpukan telah dibuat.

    6. Membuat grup simpul Anda menggunakan sumber daya yang dibuat oleh tumpukan AWS CloudFormation pada langkah sebelumnya.

      1. Ambil informasi dari AWS CloudFormation tumpukan yang digunakan dan simpan dalam variabel.

        node_instance_role=$(aws cloudformation describe-stacks \ --stack-name $node_group_resources_name \ --query='Stacks[].Outputs[?OutputKey==`NodeInstanceRole`].OutputValue' \ --output text) launch_template=$(aws cloudformation describe-stacks \ --stack-name $node_group_resources_name \ --query='Stacks[].Outputs[?OutputKey==`LaunchTemplateID`].OutputValue' \ --output text)
      2. Membuat grup simpul yang dikelola dengan menggunakan templat peluncuran dan simpul IAM role yang dibuat pada langkah sebelumnya.

        aws eks create-nodegroup \ --cluster-name $cluster_name \ --nodegroup-name $node_group_name \ --node-role $node_instance_role \ --subnets $subnet_id \ --launch-template id=$launch_template,version=1
      3. Mengonfirmasi bahwa simpul telah diciptakan.

        aws eks describe-nodegroup \ --cluster-name ${cluster_name} \ --nodegroup-name ${node_group_name} | jq -r .nodegroup.status

        Jangan lanjutkan hingga status telah kembali dari perintah sebelumnya ACTIVE. Membutuhkan waktu beberapa menit hingga simpul sudah siap.

    7. Jika Anda memilih jenis instans GPU, Anda harus menerapkan plugin perangkat NVIDIA untuk. Kubernetes Ganti vX.X.X dengan versi NVIDIA/K8S-Device-Plugin yang Anda inginkan sebelum menjalankan perintah berikut.

      kubectl apply -f https://raw.githubusercontent.com/NVIDIA/k8s-device-plugin/vX.X.X/nvidia-device-plugin.yml
  4. Men-deploy plugin perangkat EFA Kubernetes.

    Plugin perangkat EFA Kubernetes mendeteksi serta mengiklankan antarmuka EFA sebagai sumber daya yang dapat dialokasikan ke Kubernetes. Aplikasi dapat menggunakan jenis sumber daya yang diperluas vpc.amazonaws.com/efa dalam spesifikasi Pod permintaan seperti CPU dan memori. Untuk informasi selengkapnya, lihat Mengkonsumsi sumber daya yang diperluas dalam Kubernetes dokumentasi. Setelah diminta, plugin secara otomatis menetapkan dan memasang antarmuka EFA ke file. Pod Menggunakan plugin perangkat menyederhanakan pengaturan EFA dan tidak memerlukan a Pod untuk berjalan dalam mode istimewa.

    helm repo add eks https://aws.github.io/eks-chart helm install aws-efa-k8s-device-plugin --namespace kube-system eks/aws-efa-k8s-device-plugin

(Opsional) mend-deploy sebuah sampel aplikasi yang kompatibel dengan EFA

Men-deploy Operasi MPI Kubeflow

Untuk tes NCCL Anda dapat menerapkan Operasi Kubeflow MPI. Operasi MPI mempermudah untuk menjalankan pelatihan terdistribusi tipe-Allreduce di Kubernetes. Untuk informasi lebih lanjut, lihat Operator MPI diGitHub.

kubectl apply -f https://raw.githubusercontent.com/kubeflow/mpi-operator/master/deploy/v2beta1/mpi-operator.yaml
Menjalankan multi-simpul uji performa NCCL untuk memverifikasi GPUDirectrDMA/EFA

Untuk memverifikasi Performa NCCL dengan GPUDirectRDMA melalui EFA, jalankan uji standar Performa NCCL. Untuk informasi lebih lanjut, lihat repo NCCL-Tests resmi di. GitHub Anda dapat menggunakan contoh Dockerfile yang disertakan dengan pengujian ini yang sudah dibuat untuk keduanya NVIDIA CUDA11.2dan versi terbaru EFA.

Sebagai alternatif, Anda dapat mengunduh AWS Docker gambar yang tersedia dari repo Amazon ECR.

penting

Sebuah pertimbangan penting yang diperlukan untuk mengadopsi EFA dengan Kubernetes untuk mengkonfigurasi dan mengelola Huge Pages sebagai sumber daya dalam klaster. Untuk informasi selengkapnya, lihat Mengelola Halaman Besar dalam Kubernetes dokumentasi. Instans Amazon EC2 dengan diinstalnya pra-alokasi 5128 2M Huge Pages EFA driver, yang dapat diminta sebagai sumber daya untuk dikonsumsi dalam spesifikasi pekerjaan Anda.

Selesaikan langkah-langkah berikut ini untuk menjalankan dua simpul uji kinerja NCCL. Pada contoh tes tugas NCCL, setiap pekerja meminta delapan GPU, 5210Mi dari hugepages-2Mi, empat EFA, dan memori sebesar 8000Mi, yang berarti secara efektif setiap pekerja mengkonsumsi semua sumber daya dari instans p4d.24xlarge.

  1. Buat tugas NCCL-test.

    kubectl apply -f https://raw.githubusercontent.com/aws-samples/aws-efa-eks/main/examples/simple/nccl-efa-tests.yaml

    Contoh output adalah sebagai berikut.

    nccl-tests-efa mpijob.kubeflow.org/ dibuat

  2. Lihat lari AndaPods.

    kubectl get pods

    Contoh output adalah sebagai berikut.

    NAME READY STATUS RESTARTS AGE nccl-tests-efa-launcher-nbql9 0/1 Init:0/1 0 2m49s nccl-tests-efa-worker-0 1/1 Running 0 2m49s nccl-tests-efa-worker-1 1/1 Running 0 2m49s

    Operator MPI membuat peluncur Pod dan 2 pekerja Pods (satu di setiap node).

  3. Lihat log untuk efa-launcherPod. Ganti wzr8j dengan nilai dari output Anda.

    kubectl logs -f nccl-tests-efa-launcher-nbql9

Untuk contoh lainnya, lihat repositori sampel Amazon EKS EFA di. GitHub