Dibandingkan dengan scheduler Kubernetes native, ACK memperluas kemampuan penjadwalan melalui Gang Scheduling, CPU topology-aware scheduling, ECI elastic scheduling, dan lainnya. Instal add-on ack-co-scheduler pada kluster terdaftar untuk menggunakan penjadwalan ACK di kluster lokal Anda serta meningkatkan efisiensi beban kerja data besar, AI, dan beban kerja komputasi-intensif lainnya.
Prasyarat
Pastikan Anda telah:
-
Kluster Kubernetes yang dikelola sendiri Anda terhubung ke kluster terdaftar ACK One.
-
Memiliki komponen sistem dalam versi berikut:
Component Version Kubernetes 1.18.8 atau yang lebih baru Helm 3.0 atau yang lebih baru Docker 19.03.5 Operating system CentOS 7.6, CentOS 7.7, Ubuntu 16.04, Ubuntu 18.04, Alibaba Cloud Linux
Catatan penggunaan
Atur .template.spec.schedulerName menjadi ack-co-scheduler dalam spesifikasi pekerjaan Anda agar Pod diarahkan melalui co-scheduler ACK, bukan scheduler default.
Instal komponen ack-co-scheduler
Gunakan onectl untuk lingkungan berbasis skrip atau Konsol untuk pendekatan berbasis antarmuka pengguna.
Instal menggunakan onectl
-
Instal onectl di mesin Anda.
-
Instal ack-co-scheduler:
onectl addon install ack-co-schedulerOutput yang diharapkan:
Addon ack-co-scheduler, version **** installed.
Instal menggunakan Konsol
-
Login ke Container Service Management Console. Di panel navigasi kiri, klik Clusters.
-
Klik nama kluster Anda. Di panel navigasi kiri, klik Add-ons.
-
Pada halaman Add-ons, klik tab Others. Temukan ack-co-scheduler dan klik Install.
-
Pada kotak dialog, klik OK.
Gang scheduling
Gang scheduling menerapkan penempatan Pod secara all-or-nothing: semua Pod dalam satu kelompok dijadwalkan bersamaan atau tidak sama sekali. Pendekatan ini mencegah deadlock sumber daya pada pekerjaan terdistribusi seperti MPI dan pelatihan AI, yang memerlukan semua worker berjalan secara simultan.
Kirim pekerjaan terdistribusi TensorFlow
Contoh ini mengirim pekerjaan pelatihan terdistribusi TensorFlow dengan Gang Scheduling. Baik Pod PS maupun Worker menggunakan label pod-group.scheduling.sigs.k8s.io untuk membentuk kelompok Pod.
apiVersion: "kubeflow.org/v1"
kind: "TFJob"
metadata:
name: "tf-smoke-gpu"
spec:
tfReplicaSpecs:
PS:
replicas: 1
template:
metadata:
creationTimestamp: null
labels:
pod-group.scheduling.sigs.k8s.io/name: tf-smoke-gpu
pod-group.scheduling.sigs.k8s.io/min-available: "2"
spec:
schedulerName: ack-co-scheduler # Arahkan Pod melalui co-scheduler ACK.
containers:
- args:
- python
- tf_cnn_benchmarks.py
- --batch_size=32
- --model=resnet50
- --variable_update=parameter_server
- --flush_stdout=true
- --num_gpus=1
- --local_parameter_device=cpu
- --device=cpu
- --data_format=NHWC
image: registry.cn-hangzhou.aliyuncs.com/kubeflow-images-public/tf-benchmarks-cpu:v20171202-bdab599-dirty-284af3
name: tensorflow
ports:
- containerPort: 2222
name: tfjob-port
resources:
limits:
cpu: '10'
workingDir: /opt/tf-benchmarks/scripts/tf_cnn_benchmarks
restartPolicy: OnFailure
Worker:
replicas: 4
template:
metadata:
creationTimestamp: null
labels:
pod-group.scheduling.sigs.k8s.io/name: tf-smoke-gpu
pod-group.scheduling.sigs.k8s.io/min-available: "2"
spec:
schedulerName: ack-co-scheduler
containers:
- args:
- python
- tf_cnn_benchmarks.py
- --batch_size=32
- --model=resnet50
- --variable_update=parameter_server
- --flush_stdout=true
- --num_gpus=1
- --local_parameter_device=cpu
- --device=gpu
- --data_format=NHWC
image: registry.cn-hangzhou.aliyuncs.com/kubeflow-images-public/tf-benchmarks-cpu:v20171202-bdab599-dirty-284af3
name: tensorflow
ports:
- containerPort: 2222
name: tfjob-port
resources:
limits:
cpu: 10
workingDir: /opt/tf-benchmarks/scripts/tf_cnn_benchmarks
restartPolicy: OnFailure
Bidang utama:
| Field | Description |
|---|---|
pod-group.scheduling.sigs.k8s.io/name |
Mengelompokkan Pod ke dalam satu kelompok Pod. Pod dengan nama yang sama dijadwalkan bersamaan. |
pod-group.scheduling.sigs.k8s.io/min-available |
Jumlah minimum Pod yang harus dapat dijadwalkan sebelum Pod mana pun dalam kelompok tersebut mulai berjalan. Pada contoh ini, minimal 2 dari 5 Pod (1 PS + 4 Worker) harus dapat dijadwalkan secara simultan. |
schedulerName: ack-co-scheduler |
Mengarahkan Pod melalui co-scheduler ACK. Atur ini pada setiap templat Pod dalam pekerjaan. |
Verifikasi Penjadwalan Gang
Setelah mengirim pekerjaan, verifikasi bahwa Pod masuk ke status pending secara bersamaan:
kubectl get pods -l pod-group.scheduling.sigs.k8s.io/name=tf-smoke-gpu
Pod tetap dalam status Pending hingga jumlah minimal Pod yang ditentukan oleh min-available dapat dijadwalkan secara simultan. Ini merupakan perilaku yang diharapkan. Jika Pod tetap dalam status pending, periksa Events untuk pesan penjadwalan:
kubectl describe pod <pod-name>
Lihat Use Gang scheduling.
CPU topology-aware scheduling
CPU topology-aware scheduling mengikat core CPU kontainer ke node Non-Uniform Memory Access (NUMA) yang sama, sehingga mengurangi latensi memori lintas node. Fitur ini bermanfaat bagi beban kerja intensif CPU seperti inferensi real-time dan layanan yang sensitif terhadap latensi.
Prasyarat
Komponen resource-controller telah dideploy. Lihat Manage add-ons.
Aktifkan CPU topology-aware scheduling
Tambahkan anotasi cpuset-scheduler: "true" ke templat Pod Deployment Anda dan atur schedulerName menjadi ack-co-scheduler:
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-numa
labels:
app: nginx-numa
spec:
replicas: 2
selector:
matchLabels:
app: nginx-numa
template:
metadata:
annotations:
cpuset-scheduler: "true" # Aktifkan CPU topology-aware scheduling.
labels:
app: nginx-numa
spec:
schedulerName: ack-co-scheduler # Arahkan Pod melalui co-scheduler ACK.
containers:
- name: nginx-numa
image: nginx:1.13.3
ports:
- containerPort: 80
resources:
requests:
cpu: 4
limits:
cpu: 4
Bidang utama:
| Field | Description |
|---|---|
cpuset-scheduler: "true" |
Mengikat core CPU Pod ke satu node NUMA. Atur di bawah template.metadata.annotations. |
schedulerName: ack-co-scheduler |
Mengarahkan Pod melalui co-scheduler ACK. |
resources.requests.cpu / resources.limits.cpu |
Permintaan dan batas sumber daya CPU untuk kontainer. |
Verifikasi CPU topology-aware scheduling
Setelah berjalan, konfirmasi bahwa Pod dijadwalkan dengan pengikatan cpuset:
kubectl get pods -l app=nginx-numa -o wide
Untuk mengonfirmasi pengikatan NUMA, login ke node dan periksa cpuset kontainer:
cat /sys/fs/cgroup/cpuset/kubepods/pod<pod-uid>/<container-id>/cpuset.cpus
Jika semua core yang tercantum termasuk dalam satu node NUMA yang sama, maka pengikatan cpuset aktif.
ECI elastic scheduling
ECI elastic scheduling mengontrol apakah Pod berjalan di node Elastic Compute Service (ECS), sumber daya Elastic Container Instance (ECI), atau hanya burst ke ECI ketika kapasitas ECS tidak mencukupi. Gunakan fitur ini untuk beban kerja dengan permintaan sumber daya fluktuatif guna menghindari over-provisioning node ECS.
Prasyarat
Komponen ack-virtual-node telah dideploy. Lihat Use ECI in ACK.
Aktifkan ECI elastic scheduling
Tambahkan anotasi alibabacloud.com/burst-resource ke templat Pod Deployment Anda:
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx
labels:
app: nginx
spec:
replicas: 4
selector:
matchLabels:
app: nginx
template:
metadata:
name: nginx
annotations:
alibabacloud.com/burst-resource: eci # Gunakan ECI ketika kapasitas ECS tidak mencukupi.
labels:
app: nginx
spec:
schedulerName: ack-co-scheduler # Arahkan Pod melalui co-scheduler ACK.
containers:
- name: nginx
image: nginx
resources:
limits:
cpu: 2
requests:
cpu: 2
Nilai anotasi untuk `alibabacloud.com/burst-resource`:
| Value | Behavior |
|---|---|
| Tidak diatur | Gunakan hanya node ECS dalam kluster. |
eci |
Gunakan node ECS terlebih dahulu; burst ke ECI ketika kapasitas ECS tidak mencukupi. |
eci_only |
Gunakan hanya sumber daya ECI. |
Verifikasi ECI elastic scheduling
Setelah deployment, periksa node tempat Pod berjalan:
kubectl get pods -l app=nginx -o wide
Lihat Menggunakan ElasticResource untuk Menerapkan Penjadwalan Elastis ECI (Tidak Digunakan Lagi).
Shared GPU scheduling
Shared GPU scheduling memungkinkan beberapa Pod berbagi satu GPU, sehingga meningkatkan pemanfaatan GPU untuk inferensi dan beban kerja yang tidak memerlukan GPU penuh.
Lihat: