全部产品
Search
文档中心

Container Service for Kubernetes:Gunakan KubeQueue pada instance Fleet dan jadwalkan PyTorchJob dengan gang scheduling

更新时间:Jul 02, 2025

PyTorch adalah kerangka pembelajaran mesin yang banyak digunakan untuk mengimplementasikan pekerjaan pelatihan terdistribusi multi-mesin dan multi-GPU. Di Kubernetes, Anda dapat menggunakan PyTorchJob untuk mengirimkan pekerjaan pembelajaran mesin dalam kerangka PyTorch. Topik ini menjelaskan cara menggunakan KubeQueue untuk mengelola pekerjaan pada instance Fleet dan menerapkan fitur gang scheduling saat menetapkan sumber daya pada instance Fleet.

Arsitektur

Untuk mendukung pelatihan terdistribusi multi-mesin dan multi-GPU serta memastikan bahwa pod dari pekerjaan pelatihan berjalan sesuai harapan, beban kerja harus mematuhi semantik gang scheduling selama proses penjadwalan. Semua beban kerja dari pekerjaan pelatihan harus berjalan bersama atau tidak ada yang boleh berjalan. Instance Fleet menggunakan KubeQueue dan ACK Scheduler untuk menjadwalkan PyTorchJob lintas beberapa kluster, memastikan bahwa semantik gang yang dideklarasikan dalam PyTorchJob dipertahankan selama penjadwalan.

Prasyarat

  • Suite AI Cloud-Native telah diinstal di sub-kluster. Anda hanya perlu menerapkan Arena.

  • Kebijakan Resource Access Management (RAM) AliyunAdcpFullAccess telah dilampirkan ke pengguna RAM. Untuk informasi lebih lanjut, lihat Memberikan Izin kepada Pengguna RAM.

  • Alat baris perintah AMC telah diinstal. Untuk informasi lebih lanjut, lihat Gunakan AMC.

  • (Opsional) Jika pemesanan sumber daya diaktifkan untuk kluster, instance Fleet menggunakan pemesanan sumber daya untuk memastikan hasil penjadwalan instance Fleet sama dengan hasil penjadwalan sub-kluster. Jika pemesanan sumber daya dinonaktifkan, instance Fleet mengevaluasi sumber daya dan menjadwalkan pekerjaan dengan membandingkan total sumber daya tersisa dari semua node di sub-kluster dengan total sumber daya yang dibutuhkan. Bagian berikut menjelaskan cara mengaktifkan pemesanan sumber daya.

    Catatan

    Untuk mengaktifkan pemesanan sumber daya, versi Kubernetes kluster harus 1.28 atau lebih baru dan versi scheduler harus 6.8.0 atau lebih baru.

    1. Masuk ke Konsol ACK. Di panel navigasi kiri, klik Clusters.

    2. Di halaman Clusters, temukan kluster yang ingin Anda kelola dan klik namanya. Di panel navigasi kiri, klik Add-ons.

    3. Di halaman Add-ons, temukan komponen Kube Scheduler, klik Configuration untuk masuk ke halaman Kube Scheduler Parameters, atur parameter enableReservation menjadi true, lalu klik OK.

(Opsional) Langkah 1: Gunakan ack-kube-queue untuk menambahkan antrian pekerjaan dan mengelola kuota

Dalam Fleet multi-kluster, Anda dapat menggunakan ElasticQuotaTree untuk mengelola kuota dan mengonfigurasi antrian. Ini membantu Anda menambahkan sejumlah besar pekerjaan dalam skenario multi-pengguna.

  1. Contoh kode berikut menunjukkan cara mengirimkan ElasticQuotaTree.

    Administrator kluster dapat mengirimkan ElasticQuotaTree pada instance Fleet untuk mengonfigurasi antrian pekerjaan. Dalam contoh ini, kuota di namespace default dikonfigurasi, mencakup total 10.000 CPU, 10.000 GiB memori, 10.000 GPU, dan 1 pekerjaan.

    apiVersion: scheduling.sigs.k8s.io/v1beta1
    kind: ElasticQuotaTree
    metadata:
      name: elasticquotatree # Hanya satu ElasticQuotaTree yang didukung.
      namespace: kube-system # Grup kuota elastis hanya berlaku jika Anda membuat grup di namespace kube-system.
    spec:
      root:
        name: root # Jumlah maksimum sumber daya untuk root harus sama dengan jumlah minimum sumber daya untuk root.
        max:
          cpu: 999900
          memory: 400000Gi
          kube-queue/max-jobs: 10000000000
          nvidia.com/gpu: 100000
        min:
          cpu: 999900
          memory: 400000Gi
          kube-queue/max-jobs: 10000000000
          nvidia.com/gpu: 100000
        children:
        - name: child-2
          max:
            # Hanya satu pekerjaan yang dapat dikeluarkan dari antrian pada satu waktu.
            kube-queue/max-jobs: 1
            cpu: 10000
            nvidia.com/gpu: 10000
            memory: 10000Gi
          namespaces: # Konfigurasikan namespace.
            - default
  2. Jalankan perintah berikut pada instance Fleet untuk melihat ElasticQuotaTree dan antrian yang dibuat oleh KubeQueue:

    kubectl get queue -n kube-queue

    Output yang diharapkan:

    NAME                 AGE
    root-child-2-v5zxz   15d
    root-kdzw7           15d

Langkah 2: Kirim PyTorchJob untuk penjadwalan multi-kluster

  1. Kirim PropagationPolicy pada instance Fleet dan atur Kebijakan Kustom ke Gang.

    Gunakan hanya kebijakan gang scheduling

    Saat menggunakan fitur gang scheduling, tentukan parameter customSchedulingType=Gang dalam PropagationPolicy yang dikirimkan.

    apiVersion: policy.one.alibabacloud.com/v1alpha1
    kind: PropagationPolicy
    metadata:
      name: example-policy # Namespace default adalah `default`.
    spec:
      propagateDeps: true
      # Jadwalkan ulang pekerjaan ketika pekerjaan gagal berjalan.
      failover:
        application:
          decisionConditions:
            tolerationSeconds: 30
          purgeMode: Immediately
      placement:
        replicaScheduling:
          replicaSchedulingType: Divided
          # Gunakan gang scheduling.
          customSchedulingType: Gang
      resourceSelectors:
        - apiVersion: kubeflow.org/v1
          kind: PyTorchJob

    Gunakan ElasticQuotaTree dan gang scheduling

    Tentukan parameter customSchedulingType=Gang dalam PropagationPolicy yang dikirimkan, dan atur .Spec.Suspension.Scheduling menjadi true. Dengan cara ini, pekerjaan dapat ditambahkan ke antrian untuk penjadwalan.

    apiVersion: policy.one.alibabacloud.com/v1alpha1
    kind: PropagationPolicy
    metadata:
      name: example-policy # Namespace default adalah `default`.
    spec:  
      suspension:
        scheduling: true
      propagateDeps: true
      # Batalkan penjadwalan pekerjaan ketika pekerjaan gagal berjalan.
      failover:
        application:
          decisionConditions:
            tolerationSeconds: 30
          purgeMode: Immediately
      placement:
        replicaScheduling:
          replicaSchedulingType: Divided
          # Gunakan gang scheduling.
          customSchedulingType: Gang
      resourceSelectors:
        - apiVersion: kubeflow.org/v1
          kind: PyTorchJob
  2. Contoh kode berikut menunjukkan cara mengirimkan PyTorchJob pada instance Fleet.

    Lihat File YAML Contoh

    apiVersion: kubeflow.org/v1
    kind: PyTorchJob
    metadata:
      labels:
        app: pytorchjob
      name: pytorch-test
      namespace: default
    spec:
      cleanPodPolicy: None
      pytorchReplicaSpecs:
        Master:
          replicas: 1
          restartPolicy: Never
          template:
            metadata:
              labels:
                app: pytorchjob
              name: pytorch-test
            spec:
              schedulerName: default-scheduler
              containers:
              - command:
                - sh
                - -c
                - sleep 1h
                env:
                - name: NVIDIA_VISIBLE_DEVICES
                  value: void
                - name: gpus
                  value: "0"
                - name: workers
                  value: "8"
                image: registry-cn-hangzhou.ack.aliyuncs.com/acs/nginx
                imagePullPolicy: Always
                name: pytorch
                resources:
                  limits:
                    cpu: "3"
                  requests:
                    cpu: "10m"
                volumeMounts:
                - mountPath: /dev/shm
                  name: dshm
                workingDir: /root
              volumes:
              - emptyDir:
                  medium: Memory
                  sizeLimit: 2Gi
                name: dshm
        Worker:
          replicas: 2
          restartPolicy: OnFailure
          # restartPolicy: Never
          template:
            metadata:
              labels:
                app: pytorchjob
              name: pytorch-test
            spec:
              containers:
              - command:
                - bash
                - -c
                - |
                  #!/bin/bash
                  #sleep 180
                  echo "$WORKER_INDEX"
                  #if [[ "$WORKER_INDEX" == "0" ]]
                  #then
                  #  exit -1
                  #fi
                  sleep 1h
                env:
                - name: WORKER_INDEX
                  valueFrom:
                    fieldRef:
                      fieldPath: metadata.labels['pytorch-replica-index']
                - name: NVIDIA_VISIBLE_DEVICES
                  value: void
                - name: gpus
                  value: "0"
                - name: workers
                  value: "8"
                image: registry-cn-hangzhou.ack.aliyuncs.com/acs/nginx
                imagePullPolicy: Always
                name: pytorch
                resources:
                  limits:
                    cpu: "2"
                  requests:
                    cpu: "2"
                    memory: "2Gi"
                volumeMounts:
                - mountPath: /dev/shm
                  name: dshm
                workingDir: /root
              volumes:
              - emptyDir:
                  medium: Memory
                  sizeLimit: 2Gi
                name: dshm

Langkah 3: Lihat status pekerjaan

  1. Jalankan perintah berikut pada instance Fleet untuk memeriksa status PyTorchJob:

    kubectl get pytorchjob

    Output yang diharapkan:

    NAME           STATE     AGE
    pytorch-test   Created   3m44s
  2. Jalankan perintah berikut pada instance Fleet untuk memeriksa kluster terkait mana PyTorchJob dijadwalkan:

    kubectl describe pytorchjob pytorch-test

    Output yang diharapkan:

     Normal   ScheduleBindingSucceed  4m59s                   default-scheduler                   Binding has been scheduled successfully. Result: {cfxxxxxx:0,[{master 1} {worker 2}]}
  3. Jalankan perintah berikut pada instance Fleet untuk memeriksa status PyTorchJob di kluster terkait:

    kubectl amc get pytorchjob -M

    Output yang diharapkan:

    NAME           CLUSTER    STATE     AGE     ADOPTION
    pytorch-test   cfxxxxxx   Running   6m23s   Y
  4. Jalankan perintah berikut pada instance Fleet untuk memeriksa status pod:

    kubectl amc get pod -M   

    Output yang diharapkan:

    NAME                    CLUSTER    READY   STATUS      RESTARTS   AGE
    pytorch-test-master-0   cfxxxxxx   1/1     Running     0          7m16s
    pytorch-test-worker-0   cfxxxxxx   1/1     Running     0          7m16s
    pytorch-test-worker-1   cfxxxxxx   1/1     Running     0          7m16s
  5. Jalankan perintah berikut pada instance Fleet untuk melihat detail PyTorchJob di kluster terkait:

    kubectl amc get pytorchjob pytorch-test -m ${member clusterid} -oyaml