View a markdown version of this page

Gunakan pemotongan waktu dengan GPU NVIDIA di Amazon EKS - Amazon EKS

Bantu meningkatkan halaman ini

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

Untuk berkontribusi pada panduan pengguna ini, pilih GitHub tautan Edit halaman ini di yang terletak di panel kanan setiap halaman.

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

Gunakan pemotongan waktu dengan GPU NVIDIA di Amazon EKS

Time-slicing memungkinkan beberapa Pod berbagi satu GPU NVIDIA fisik. Penjadwal Kubernetes menempatkan beberapa Pod pada GPU yang sama, dan penjadwal CUDA GPU mengalikan waktu pekerjaan. Time-slicing adalah GPU-sharing strategi yang paling sederhana. Ini hanya menggunakan perangkat lunak, tidak memerlukan perangkat keras khusus, dan berfungsi pada setiap jenis instans GPU NVIDIA AWS. Time-slicing tidak menawarkan memori atau isolasi komputasi antara Pod yang berbagi GPU. Ini paling sesuai dengan beban kerja dengan pemanfaatan GPU rendah, seperti layanan inferensi yang menganggur antara permintaan atau lingkungan pengembangan di mana beberapa pengguna berbagi GPU. Untuk beban kerja yang memerlukan memori tingkat perangkat keras dan isolasi komputasi, gunakan Multi-Instance GPU (MIG) sebagai gantinya.

Di Amazon EKS, Anda dapat mengelola pemotongan waktu dengan driver NVIDIA DRA atau plugin perangkat NVIDIA.

Time-slicing hanya dapat digunakan dengan Karpenter jika Anda menggunakan penyediaan kapasitas statis. Time-slicing saat ini tidak tersedia dalam Mode Otomatis EKS.

Time-slicing cocok ketika:

  • Pemanfaatan GPU secara konsisten rendah, misalnya layanan inferensi sensitif latensi yang menganggur di antara permintaan.

  • Beberapa pengembang berbagi satu node GPU untuk notebook atau pekerjaan pengembangan.

  • Node Anda menggunakan jenis instans GPU yang tidak mendukung MIG, seperti g6e keluarga g5g6,, atau.

  • Anda dapat menerima bahwa Pod terkadang lebih lambat karena Pod lain pada GPU yang sama sibuk.

Pertimbangkan pendekatan yang berbeda ketika:

  • Anda membutuhkan isolasi memori. Pod pada GPU yang diiris waktu berbagi memori GPU yang sama, dan satu Pod dapat menghabiskan memori yang diandalkan oleh Pod lain. Gunakan MIG untuk isolasi memori.

  • Anda memerlukan latensi per-pod atau kualitas layanan yang dapat diprediksi. Penjadwal GPU berbagi komputasi di seluruh slot berdasarkan upaya terbaik tanpa jaminan.

  • Anda menjalankan beban kerja pelatihan. Time-slicing menambahkan pengalihan konteks yang mengurangi efisiensi pelatihan. Pekerjaan yang diperiksa yang diperlambat oleh Pod lain harus dicoba lagi dari pos pemeriksaan terakhirnya.

Pertimbangan-pertimbangan

Tinjau pertimbangan berikut sebelum Anda menggunakan pemotongan waktu dalam produksi.

Pertimbangan umum

  • Tidak ada isolasi memori: Pod yang berbagi GPU yang diiris waktu berbagi memorinya. Satu Pod dapat mengalokasikan memori yang dibutuhkan Pod lain, yang dapat menyebabkan kesalahan kehabisan memori. Cocokkan jumlah Pod yang berbagi setiap GPU dengan jejak memori beban kerja Anda. Jika Pod Anda memuat model besar secara teratur, bagikan lebih sedikit Pod per GPU atau gunakan MIG.

  • Best-effort berbagi komputasi: Penjadwal GPU berbagi komputasi di seluruh Pod berdasarkan upaya terbaik dan tidak menjamin komputasi proporsional untuk setiap Pod.

  • Time-slicing dan MPS tidak dapat berbagi GPU yang sama: Time-slicing menyetel mode komputasi GPU keDEFAULT, sementara Multi-Process Layanan NVIDIA (MPS) membutuhkanEXCLUSIVE_PROCESS. Anda dapat menggunakan kedua strategi dalam cluster yang sama, tetapi tidak pada GPU fisik yang sama pada saat yang bersamaan. Time-slicing juga tidak berpengaruh pada instance MIG. Untuk berbagi satu instans MIG di seluruh kontainer, gunakan MPS sebagai gantinya.

  • Per-container metrik: NVIDIA Data Center GPU Manager (DCGM) tidak dapat mengaitkan metrik ke wadah individu saat pemotongan waktu aktif. GPU-level metrik tetap tersedia, tetapi Anda tidak dapat mengidentifikasi Pod mana yang menggunakan sejumlah sumber daya GPU tertentu.

Pertimbangan driver NVIDIA DRA

  • Fitur Alpha: Time-slicing melalui driver DRA memerlukan gerbang TimeSlicingSettings fitur, yang merupakan fitur alfa yang dinonaktifkan secara default. Untuk informasi selengkapnya, lihat Gunakan pemotongan waktu GPU dengan driver NVIDIA DRA.

  • User-mediated hanya berbagi: Pod berbagi GPU hanya dengan mereferensikan ResourceClaim atau yang sama, yang bercakupan ruang namaResourceClaimTemplate, jadi berbagi tidak dapat melintasi ruang nama. System-mediated berbagi adalah kemampuan masa depan yang diusulkan.

  • Nonaktifkan plugin perangkat bawaan di Bottleroc ket: Driver DRA tidak dapat berjalan bersama plugin perangkat NVIDIA pada node yang sama. Di Bottlerocket, nonaktifkan plugin perangkat bawaan, yang memerlukan Bottlerocket versi 1.63.0 atau yang lebih baru. Untuk informasi selengkapnya, lihat Instal driver NVIDIA DRA.

  • Dukungan komputasi: Driver NVIDIA DRA didukung dengan penyediaan kapasitas statis di Karpenter, grup node yang dikelola EKS, atau node yang dikelola sendiri, dan tidak didukung dengan Mode Otomatis EKS. Untuk informasi selengkapnya, lihat NodePool dokumentasi statis Karpenter di situs web Karpenter.

Pertimbangan plugin perangkat NVIDIA

  • Best-effort berbagi komputasi dengan slot: Plugin perangkat mengiklankan jumlah slot tetap per GPU. Jika satu Pod meminta lebih dari satu slot, itu tidak menerima komputasi tambahan. Aktif fail-requests-greater-than-one kan opsi untuk menolak Pod yang meminta lebih dari satu slot.

  • Penyediaan dengan Karpenter: Karpenter menghitung setiap nvidia.com/gpu permintaan sebagai GPU fisik bahkan ketika pemotongan waktu diaktifkan pada GPU. Untuk informasi selengkapnya, lihat masalah Karpenter #2140 di. GitHub

  • Tidak ada dukungan pada Mode Otomatis EKS: Mode Otomatis EKS mengelola plugin perangkat NVIDIA dan tidak mengekspos konfigurasinya. Karena pemotongan waktu memerlukan konfigurasi plugin perangkat, Anda tidak dapat menerapkan konfigurasi pemotongan waktu pada node Mode Otomatis EKS.

  • Time-slicing perubahan konfigurasi: Plugin perangkat NVIDIA tidak memantau pemotongan waktu ConfigMap untuk perubahan. Mulai ulang plugin perangkat setelah Anda memperbarui konfigurasi.

Opsi konfigurasi

Anda dapat menggunakan pengiris waktu untuk GPU NVIDIA dengan AMI NVIDIA EKS-optimized AL2023 dan Bottlerocket. Pengaturan pemotongan waktu bervariasi berdasarkan apakah Anda menggunakan driver NVIDIA DRA atau plugin perangkat NVIDIA.

NVIDIA DRA driver

AMI yang EKS-optimized dipercepat tidak termasuk driver NVIDIA DRA. Jika Anda menggunakan Bottlerocket, Anda harus menonaktifkan plugin perangkat NVIDIA bawaan sebelum menggunakan driver NVIDIA DRA dengan menyetel data pengguna node, yang memerlukan Bottlerocket versi 1.63.0 atau yang lebih baru. settings.kubelet-device-plugins.nvidia.enabled = false Untuk informasi selengkapnya, lihat Instal driver NVIDIA DRA.

Dengan driver NVIDIA DRA, pemotongan waktu dikonfigurasi melalui. ResourceClaimTemplates intervalBidang mengontrol durasi irisan waktu CUDA.

Interval Deskripsi

Default

Menggunakan interval default bawaan driver GPU NVIDIA

Pendek

Interval lebih pendek; konteks beralih lebih sering

Sedang

Interval menengah

Panjang

setiap konteks berjalan lebih lama per putaran sebelum didahului

NVIDIA device plugin
  • Bottlerocket - AMI menyertakan plugin perangkat NVIDIA yang sudah diinstal sebelumnya. Anda mengonfigurasi pemotongan waktu melalui pengaturan Bottlerocket, tanpa instalasi plugin perangkat terpisah, bagan Helm, atau. ConfigMap

  • AL2023 - Anda menginstal plugin perangkat NVIDIA seperti yang dijelaskan diInstal plugin perangkat NVIDIA Kubernetes, dan menyediakan konfigurasi pemotongan waktu melalui a. ConfigMap

    Opsi berikut mengontrol cara plugin perangkat NVIDIA mengiklankan dan mengelola GPU yang diiris waktu. Nama bidang berbeda antara pengaturan Bottlerocket dan AL2023ConfigMap, seperti yang ditunjukkan dalam prosedur berikut.

    Opsi Nilai yang disarankan Deskripsi

    Replika

    2—8

    Jumlah slot yang dapat dijadwalkan untuk beriklan per GPU fisik. Nilai yang lebih tinggi memungkinkan lebih banyak berbagi tetapi meningkatkan perselisihan antara Pod.

    Ganti nama secara default

    false

    Kapanfalse, Pods memintanvidia.com/gpu, yang menjaga kompatibilitas dengan manifes yang ada. Kapantrue, plugin perangkat mengiklankan sumber daya sebagainvidia.com/gpu.shared, dan Pod harus meminta nama itu. Setel ini ke true saat Anda menjalankan kumpulan node GPU bersama dan khusus dan ingin beban kerja memilih sumber daya bersama secara eksplisit.

    Permintaan gagal lebih dari satu

    true

    Menolak Pod yang meminta lebih dari satu slot yang diiris waktu. Pod yang meminta lebih dari satu slot tidak menerima komputasi proporsional. Aktifkan pengaturan ini untuk mencegah kesalahan konfigurasi umum.

    Untuk daftar lengkap opsi berbagi GPU dan nilai defaultnya, lihat dokumentasi plugin perangkat NVIDIA Kubernetes di. GitHub

Gunakan pemotongan waktu GPU dengan driver NVIDIA DRA

Dengan driver NVIDIA DRA, Pod berbagi GPU dengan mereferensikan umum ResourceClaim yang meminta gpu.nvidia.com DeviceClass dengan pemotongan waktu. GpuConfig

Driver NVIDIA DRA saat ini mengimplementasikan pem otongan waktu yang dimediasi pengguna: GPU hanya dibagikan di antara Pod dan wadah yang secara eksplisit Anda tunjuk pada klaim yang sama. Karena a ResourceClaim dan a memiliki ResourceClaimTemplate cakupan ruang nama, Pod yang berbagi GPU dengan cara ini harus berada di namespace yang sama. Untuk berbagi GPU di seluruh kontainer dalam satu Pod, minta setiap wadah mereferensikan nama permintaan yang sama dalam klaim. Kontainer yang mereferensikan nama permintaan yang berbeda masing-masing menerima GPU terpisah. Buat interval terpisah ResourceClaimTemplate untuk setiap interval irisan waktu yang Anda butuhkan, dan satu di setiap namespace tempat Anda ingin berbagi GPU.

System-mediatedpemotongan waktu adalah ketika driver berbagi GPU di seluruh klaim independen (termasuk di seluruh ruang nama) berdasarkan kriteria yang ditentukan sistem daripada klaim yang Anda konfigurasikan. Untuk informasi selengkapnya tentang pemotongan waktu yang dimediasi sistem, lihat pemot System-mediated ongan waktu GPU (masalah #659) dan pull request #1257 on. https://github.com/kubernetes-sigs/dra-driver-nvidia-gpu/pull/1257 GitHub

penting

Time-slicing melalui driver DRA memerlukan gerbang TimeSlicingSettings fitur, yang merupakan fitur alfa yang dinonaktifkan secara default. Jika Anda meminta strategi TimeSlicing berbagi tanpa mengaktifkan gerbang fitur ini, pengemudi gagal menyiapkan perangkat dan Pod tetap ContainerCreating mengikuti FailedPrepareDynamicResources acara yang dilaporkanerror validating GPU config: unknown GPU sharing strategy: TimeSlicing. Aktifkan gerbang fitur hanya jika Anda menerima risiko menggunakan kemampuan alfa.

Prasyarat

  • Cluster Amazon EKS yang menjalankan Kubernetes versi 1.34 atau yang lebih baru. Driver NVIDIA DRA didukung dengan penyediaan kapasitas statis di Karpenter, grup node yang dikelola EKS, atau node yang dikelola sendiri.

  • Node dengan tipe instans GPU NVIDIA menggunakan EKS-optimized AL2023 NVIDIA AMI.

  • Driver NVIDIA DRA diinstal seperti yang dijelaskan diInstal driver NVIDIA DRA, dengan gerbang TimeSlicingSettings fitur diaktifkan.

Prosedur

  1. Buat ResourceClaim yang meminta GPU dengan strategi TimeSlicing berbagi. Beberapa Pod yang mereferensikan klaim ini berbagi GPU fisik yang sama.

    cat <<EOF | kubectl apply -f - apiVersion: resource.k8s.io/v1 kind: ResourceClaim metadata: name: shared-timeslice-gpu spec: devices: requests: - name: gpu exactly: deviceClassName: gpu.nvidia.com count: 1 config: - requests: ["gpu"] opaque: driver: gpu.nvidia.com parameters: apiVersion: resource.nvidia.com/v1beta1 kind: GpuConfig sharing: strategy: TimeSlicing timeSlicingConfig: interval: Long EOF
  2. Terapkan dua atau lebih Pod yang mereferensikan nama yang ResourceClaim dibagikan. Setiap Pod mereferensikan klaim melalui resourceClaims danresources.claims.

    cat <<EOF | kubectl apply -f - apiVersion: v1 kind: Pod metadata: name: share-a spec: tolerations: - key: nvidia.com/gpu operator: Exists effect: NoSchedule containers: - name: cuda image: nvidia/cuda:12.6.0-base-ubuntu22.04 command: ["nvidia-smi", "-L"] resources: claims: - name: gpu resourceClaims: - name: gpu resourceClaimName: shared-timeslice-gpu restartPolicy: OnFailure EOF
  3. Verifikasi bahwa Pod berbagi GPU fisik yang sama. Jalan nvidia-smi -L kan di setiap Pod dan konfirmasikan mereka melaporkan UUID GPU yang sama.

    kubectl logs share-a

    Contoh output adalah sebagai berikut. Pod kedua yang mereferensikan klaim yang sama melaporkan GPU UUID yang identik, yang menegaskan bahwa kedua Pod berbagi satu GPU fisik.

    GPU 0: NVIDIA L4 (UUID: GPU-b41973ee-5d0a-cde8-6287-12b53f861f02)

Gunakan pemotongan waktu GPU pada node Bottlerocket dengan plugin perangkat NVIDIA

Pada Bottlerocket, AMI yang EKS-optimized dipercepat menyertakan plugin perangkat NVIDIA. Anda mengaktifkan pemotongan waktu melalui settings.kubelet-device-plugins.nvidia pengaturan, yang dirender Bottlerocket ke dalam konfigurasi plugin perangkat saat node melakukan booting.

Prasyarat

  • Cluster Amazon EKS. Prosedur berikut menyediakan node GPU NVIDIA dengan EKS-optimized Bottlerocket NVIDIA AMI.

  • Karpenter diinstal dan dikonfigurasi di cluster Anda, karena prosedur berikut menggunakan Karpenter EC2NodeClass untuk menyediakan pengaturan pemotongan waktu dalam data pengguna node Bottlerocket. Untuk informasi selengkapnya, lihat Mem ulai dengan Karpenter di situs web Karpenter.

  • kubectldikonfigurasi untuk berkomunikasi dengan cluster Anda, lihat Instal atau perbarui kubectl untuk informasi selengkapnya.

Prosedur

Tambahkan pengaturan pemotongan waktu ke data pengguna Bottlerocket untuk node GPU Anda. Contoh berikut mengkonfigurasi empat slot per GPU. Cara Anda menyediakan data pengguna tergantung pada bagaimana Anda menyediakan node. Contoh berikut menunjukkan KarpenterEC2NodeClass.

cat <<EOF | kubectl apply -f - apiVersion: karpenter.k8s.aws/v1 kind: EC2NodeClass metadata: name: gpu-bottlerocket-timeslicing spec: amiFamily: Bottlerocket amiSelectorTerms: - alias: bottlerocket@latest role: eksctl-KarpenterNodeRole-<cluster-name> subnetSelectorTerms: - tags: karpenter.sh/discovery: <cluster-name> securityGroupSelectorTerms: - tags: karpenter.sh/discovery: <cluster-name> userData: | [settings.kubelet-device-plugins.nvidia] device-sharing-strategy = "time-slicing" [settings.kubelet-device-plugins.nvidia.time-slicing] replicas = 4 rename-by-default = false fail-requests-greater-than-one = true EOF

Ketika node yang disediakan dengan pengaturan ini bergabung dengan cluster, plugin perangkat mengiklankan empat nvidia.com/gpu slot untuk setiap GPU fisik. Anda memintanya dalam spesifikasi beban kerja Anda dengan permintaan atau batasan sumber daya kontainer untuk sumber daya yang nvidia.com/gpu diperluas.

Gunakan pemotongan waktu GPU pada node AL2023 dengan plugin perangkat NVIDIA

Pada AL2023, Anda menginstal plugin perangkat NVIDIA seperti yang dijelaskan dalamInstal plugin perangkat NVIDIA Kubernetes, dan menyediakan konfigurasi pemotongan waktu di a. ConfigMap

Prasyarat

  • Cluster Amazon EKS dengan node yang menggunakan tipe instans GPU NVIDIA dan EKS-optimized AL2023 NVIDIA AMI.

  • Helm diinstal di lingkungan baris perintah Anda, lihat petunjuk Peng aturan Helm untuk informasi selengkapnya.

  • kubectldikonfigurasi untuk berkomunikasi dengan cluster Anda, lihat Instal atau perbarui kubectl untuk informasi selengkapnya.

Prosedur

  1. Buat pemotongan waktu ConfigMap di nvidia namespace, tempat Anda menginstal plugin perangkat. Instal plugin perangkat NVIDIA Kubernetes Contoh ini mengonfigurasi empat slot per GPU.

    cat <<EOF | kubectl apply -f - apiVersion: v1 kind: ConfigMap metadata: name: nvidia-device-plugin-config namespace: nvidia data: config.yaml: | version: v1 sharing: timeSlicing: renameByDefault: false failRequestsGreaterThanOne: true resources: - name: nvidia.com/gpu replicas: 4 EOF
  2. Perbarui rilis plugin perangkat NVIDIA yang ada untuk mereferensi ConfigMap kan dengan config.name nilainya. --reuse-valuesBendera mempertahankan nilai yang Anda tetapkan saat Anda menginstal plugin perangkatInstal plugin perangkat NVIDIA Kubernetes.

    helm upgrade nvdp nvdp/nvidia-device-plugin \ --namespace nvidia \ --reuse-values \ --set config.name=nvidia-device-plugin-config
catatan

Plugin perangkat tidak memuat ulang secara otomatis saat Anda mengubahConfigMap. Setelah Anda memperbarui konfigurasi pemotongan waktu, mulai ulang plugin perangkat Pod untuk menerapkan perubahan.

Verifikasi bahwa pemotongan waktu GPU aktif

Setelah node teriris waktu AndaReady, konfirmasikan bahwa plugin perangkat mengiklankan jumlah slot yang diharapkan dan bahwa Pod berbagi GPU fisik.

catatan

Pemeriksaan UUID bersama dalam prosedur ini menunjukkan pemotongan waktu dengan paling jelas ketika Pod mendarat pada GPU fisik yang sama. Pada node dengan GPU tunggal, plugin perangkat mengiklankan empat slot dan keempat Pod berbagi GPU itu, sehingga mereka melaporkan UUID yang sama. Pada node dengan beberapa GPU fisik, penjadwal dapat menempatkan Pod pada GPU yang berbeda. Pod tersebut melaporkan UUID yang berbeda meskipun pemotongan waktu aktif. Untuk mendemonstrasikan berbagi pada satu GPU, jadwalkan beban kerja ke jenis instance GPU tunggal. Misalnya, tambahkan pemilih node seperti node.kubernetes.io/instance-type: g6.2xlarge ke spesifikasi Pod.

  1. Konfirmasikan bahwa node mengiklankan jumlah slot GPU yang dikonfigurasi. Dengan empat slot per GPU, node dengan satu GPU fisik melaporkan4.

    kubectl get nodes "-o=custom-columns=NAME:.metadata.name,GPU:.status.allocatable.nvidia\.com/gpu"

    Contoh output adalah sebagai berikut.

    NAME GPU ip-192-168-11-225.us-west-2.compute.internal 4
  2. Buat penerapan yang menjalankan empat replika, masing-masing meminta satu slot GPU.

    cat <<EOF | kubectl apply -f - apiVersion: apps/v1 kind: Deployment metadata: name: timeslicing-demo spec: replicas: 4 selector: matchLabels: app: timeslicing-demo template: metadata: labels: app: timeslicing-demo spec: tolerations: - key: nvidia.com/gpu operator: Exists effect: NoSchedule containers: - name: cuda image: nvidia/cuda:12.6.0-base-ubuntu22.04 command: ["bash", "-c", "nvidia-smi --query-gpu=uuid --format=csv,noheader; sleep infinity"] resources: limits: nvidia.com/gpu: 1 EOF
  3. Konfirmasikan bahwa keempat Pod dijadwalkan pada node yang sama.

    kubectl get pods -l app=timeslicing-demo -o wide
  4. Konfirmasikan bahwa keempat Pod melaporkan UUID GPU yang sama. Satu UUID bersama di keempat Pod mengonfirmasi bahwa satu GPU fisik sedang dimultipleks waktu.

    kubectl logs -l app=timeslicing-demo --prefix

    Contoh output adalah sebagai berikut.

    [pod/timeslicing-demo-xxxxxxxxxx-aaaaa/cuda] GPU-c0583cce-87c5-c736-db7f-6d3128c84d03 [pod/timeslicing-demo-xxxxxxxxxx-bbbbb/cuda] GPU-c0583cce-87c5-c736-db7f-6d3128c84d03 [pod/timeslicing-demo-xxxxxxxxxx-ccccc/cuda] GPU-c0583cce-87c5-c736-db7f-6d3128c84d03 [pod/timeslicing-demo-xxxxxxxxxx-ddddd/cuda] GPU-c0583cce-87c5-c736-db7f-6d3128c84d03