全部产品
Search
文档中心

Container Service for Kubernetes:Aktifkan Penjadwalan dengan Kesadaran Topologi NUMA

更新时间:Dec 17, 2025

Dalam skenario di mana CPU dan GPU sering berkomunikasi satu sama lain, akses memori lintas node Non-Uniform Memory Access (NUMA) dapat menyebabkan masalah seperti latensi yang meningkat dan bandwidth terbatas. Masalah ini memengaruhi kinerja keseluruhan aplikasi. Untuk mengatasi hal tersebut, Container Service for Kubernetes (ACK) mendukung penjadwalan dengan kesadaran topologi NUMA berdasarkan kerangka kerja penjadwalan Kubernetes untuk menjadwalkan pod ke node NUMA optimal. Hal ini mengurangi akses memori lintas node NUMA guna mengoptimalkan kinerja aplikasi Anda.

Cara kerjanya

Node NUMA adalah unit dasar dari sistem NUMA. Beberapa node NUMA pada satu node kluster membentuk satu set NUMA, yang digunakan untuk mengalokasikan sumber daya komputasi secara efisien serta mengurangi persaingan akses memori antar prosesor. Sebagai contoh, server berperforma tinggi yang memiliki delapan GPU biasanya mencakup beberapa node NUMA. Jika tidak ada core CPU yang diikat ke aplikasi atau jika CPU dan GPU tidak dialokasikan ke node NUMA yang sama, kinerja aplikasi mungkin menurun akibat kontes CPU atau komunikasi lintas node NUMA antara CPU dan GPU. Untuk memaksimalkan kinerja aplikasi Anda, Anda dapat mengalokasikan CPU dan GPU ke node NUMA yang sama.

Solusi asli berdasarkan kebijakan CPU kubelet dan kebijakan topologi NUMA dapat membantu Anda mengalokasikan CPU dan GPU ke node NUMA yang sama pada satu server. Namun, solusi ini mungkin menghadapi tantangan berikut dalam sebuah kluster:

  • Penjadwal tidak mengetahui CPU dan GPU spesifik yang dialokasikan ke node NUMA. Dalam kasus ini, penjadwal tidak dapat menentukan apakah sumber daya CPU dan GPU yang tersisa dapat memenuhi persyaratan kualitas layanan (QoS) dari pod. Akibatnya, sejumlah besar pod masuk ke status AdmissionError setelah penjadwalan. Dalam kasus parah, kluster mungkin berhenti bekerja.

  • Alokasi CPU dan GPU tidak terkendali di lapisan atas. Di Kubernetes asli, kebijakan topologi kubelet hanya dapat dilihat di parameter startup proses node, tetapi tidak dapat diperoleh di tingkat kluster menggunakan metode seperti label node. Oleh karena itu, ketika Anda mengirimkan pekerjaan, Anda tidak dapat menentukan bahwa beban kerja dijalankan pada node NUMA yang dialokasikan baik CPU maupun GPU. Akibatnya, kinerja aplikasi Anda sangat bervariasi.

  • Kebijakan topologi tidak mudah digunakan. Kebijakan topologi NUMA dideklarasikan pada node, sehingga satu node hanya dapat membawa satu kebijakan topologi NUMA. Sebelum Anda mengirimkan pekerjaan dan menggunakan kebijakan topologi, administrator sumber daya kluster harus secara manual membagi node kluster dengan menambahkan label khusus ke node dan mengonfigurasi pengaturan nodeAffinity untuk menjadwalkan pod ke node dengan label yang cocok. Selain itu, pod dengan kebijakan berbeda tidak dapat dijadwalkan ke node yang sama meskipun mereka tidak saling mengganggu. Ini mengurangi pemanfaatan sumber daya kluster.

Untuk mengatasi masalah di atas dari solusi kubelet asli, ACK mendukung penjadwalan dengan kesadaran topologi NUMA berdasarkan kerangka kerja penjadwalan Kubernetes. ACK menggunakan komponen gputopo-device-plugin dan ack-koordlet dari komponen ack-koordinator untuk melaporkan topologi CPU dan GPU pada node. Kedua komponen ini dikembangkan oleh Alibaba Cloud. ACK juga mendukung kemampuan untuk mendeklarasikan kebijakan topologi NUMA pada beban kerja. Gambar berikut menunjukkan arsitektur penjadwalan dengan kesadaran topologi NUMA.

Prasyarat

Kluster

  • Sebuah ACK Pro cluster yang menjalankan Kubernetes 1.24 atau lebih baru telah dibuat. Untuk informasi lebih lanjut, lihat Buat Kluster Terkelola ACK. Untuk informasi lebih lanjut tentang cara memperbarui kluster ACK, lihat Tingkatkan Kluster.

Node

Komponen

  • Versi komponen kube-scheduler lebih baru dari V6.4.4. Untuk informasi lebih lanjut, lihat kube-scheduler. Untuk memperbarui komponen kube-scheduler, lakukan operasi berikut: Masuk ke konsol ACK. Pada halaman Kluster, klik nama kluster yang ingin Anda kelola. Di panel navigasi di sebelah kiri, pilih Operations > Add-ons. Temukan dan perbarui komponen.

  • Komponen ack-koordinator diinstal. Komponen ini sebelumnya dikenal sebagai ack-slo-manager. Untuk informasi lebih lanjut, lihat ack-koordinator (FKA ack-slo-manager).

    • ACK Lingjun cluster: Instal komponen ack-koordinator.

    • ACK Pro cluster: Saat Anda mengonfigurasi parameter untuk komponen ack-koordinator, masukkan NodeTopologyReport=true untuk parameter agentFeatures.

      image

  • Komponen penjadwalan GPU dengan kesadaran topologi diinstal. Untuk informasi lebih lanjut, lihat Instal Komponen Penjadwalan GPU dengan Kesadaran Topologi.

    Penting

    Jika Anda menginstal komponen penjadwalan GPU dengan kesadaran topologi sebelum Anda menginstal komponen ack-koordinator, Anda harus me-restart komponen penjadwalan GPU dengan kesadaran topologi setelah komponen ack-koordinator diinstal.

Batasan

  • Anda tidak dapat menggunakan penjadwalan dengan kesadaran topologi NUMA bersamaan dengan penjadwalan CPU dengan kesadaran topologi atau penjadwalan GPU dengan kesadaran topologi.

  • Penjadwalan dengan kesadaran topologi NUMA hanya berlaku untuk skenario di mana CPU dan GPU dialokasikan ke node NUMA.

  • Jumlah core CPU yang diminta oleh semua kontainer dalam pod harus berupa bilangan bulat dan sama dengan batas jumlah core CPU.

  • Sumber daya GPU dari semua kontainer dalam pod harus diminta menggunakan aliyun.com/gpu. Jumlah GPU yang diminta harus berupa bilangan bulat.

Tagihan

Untuk menggunakan fitur ini, Anda harus menginstal suite AI cloud-native, yang mungkin menghasilkan biaya tambahan. Untuk informasi lebih lanjut, lihat Tagihan Suite AI Cloud-Native.

Tidak ada biaya yang dikenakan saat Anda menginstal atau menggunakan komponen ack-koordinator. Namun, biaya mungkin dikenakan dalam skenario berikut:

  • ack-koordinator adalah komponen non-managed yang menggunakan sumber daya node pekerja setelah diinstal. Anda dapat menentukan jumlah sumber daya yang diminta oleh setiap modul saat Anda menginstal komponen.

  • Secara default, ack-koordinator mengekspos metrik pemantauan fitur seperti profil sumber daya dan penjadwalan granular sebagai metrik Prometheus. Jika Anda mengaktifkan metrik Prometheus untuk ack-koordinator dan menggunakan Managed Service for Prometheus, metrik ini dianggap sebagai metrik kustom dan biaya dikenakan untuk metrik ini. Biaya tergantung pada faktor-faktor seperti ukuran kluster Anda dan jumlah aplikasi. Sebelum Anda mengaktifkan metrik Prometheus, kami sarankan Anda membaca topik Tagihan Managed Service for Prometheus untuk mempelajari tentang kuota gratis dan aturan tagihan metrik kustom. Untuk informasi lebih lanjut tentang cara memantau dan mengelola penggunaan sumber daya, lihat Kueri Jumlah Data Observabel dan Tagihan.

Konfigurasikan penjadwalan dengan kesadaran topologi NUMA

Anda dapat menambahkan anotasi berikut ke file YAML pod untuk mendeklarasikan persyaratan untuk penjadwalan dengan kesadaran topologi NUMA:

apiVersion: v1
kind: Pod
metadata:
  annotations:
    cpuset-scheduler: required                           # Menentukan apakah akan mengalokasikan CPU dan GPU ke node NUMA.
    scheduling.alibabacloud.com/numa-topology-spec: |    # Persyaratan pod untuk kebijakan topologi NUMA.
      {
        "numaTopologyPolicy": "SingleNUMANode",
        "singleNUMANodeExclusive": "Preferred",
      }
spec:
  containers:
  - name: example
    resources:
      limits:
        aliyun.com/gpu: '4'
        cpu: '24'
      requests:
        aliyun.com/gpu: '4'
        cpu: '24'

Tabel berikut menjelaskan parameter penjadwalan dengan kesadaran topologi NUMA.

Parameter

Deskripsi

cpuset-scheduler

Menentukan apakah akan mengalokasikan CPU dan GPU ke node NUMA.

Atur nilainya menjadi required.

numaTopologyPolicy

Kebijakan topologi NUMA yang akan digunakan selama penjadwalan pod. Nilai valid:

  • SingleNUMANode: Mengalokasikan CPU dan GPU ke node NUMA yang sama. Jika tidak ada node yang memenuhi persyaratan ini, pod tidak dapat dijadwalkan.

  • Restricted: Mengalokasikan CPU dan GPU ke set NUMA yang sama. Jika tidak ada node yang memenuhi persyaratan ini, pod tidak dapat dijadwalkan.

  • BestEffort: Mencoba mengalokasikan CPU dan GPU ke node NUMA yang sama. Jika tidak ada node yang memenuhi persyaratan ini, pod dijadwalkan ke node optimal.

singleNUMANodeExclusive

Menentukan apakah akan menjadwalkan pod ke node NUMA tertentu selama penjadwalan pod. Nilai valid:

Catatan

Jenis node NUMA:

  • single: Menjalankan pod yang hanya dapat dijalankan pada satu node NUMA.

  • shared: Menjalankan pod yang dapat dijalankan lintas node NUMA.

  • idle: Tidak menjalankan pod dan tersedia untuk semua pod.

  • Required (default): Menjadwalkan pod ke node NUMA tunggal tipe idle atau single jika pod hanya dapat dijalankan pada satu node NUMA, atau menjadwalkan pod ke beberapa node NUMA tipe idle atau shared jika pod dapat dijalankan lintas node NUMA.

  • Preferred: Tidak membatasi jenis node NUMA selama penjadwalan pod.

Bandingkan kinerja

Dalam contoh ini, proses pemuatan model digunakan untuk menguji peningkatan kinerja sebelum dan sesudah penjadwalan dengan kesadaran topologi NUMA diaktifkan. Alat text-generation-inference digunakan untuk memuat model pada dua GPU. Alat NSight digunakan untuk membandingkan kecepatan pemuatan GPU sebelum dan sesudah penjadwalan dengan kesadaran topologi NUMA diaktifkan.

Node Lingjun digunakan dalam contoh ini. Untuk informasi lebih lanjut tentang cara mengunduh alat text-generation-inference, lihat Text Generation Inference. Untuk informasi lebih lanjut tentang cara mengunduh alat NSight, lihat Panduan Instalasi.

Penting

Hasil pengujian mungkin bervariasi berdasarkan alat pengujian yang digunakan. Data perbandingan kinerja dalam contoh ini hanya merupakan hasil pengujian yang diperoleh menggunakan alat NSight. Data aktual tergantung pada lingkungan operasi Anda.

Sebelum penjadwalan dengan kesadaran topologi NUMA diaktifkan

Kode sampel berikut menunjukkan file YAML aplikasi dalam skenario pengujian sebelum penjadwalan dengan kesadaran topologi NUMA diaktifkan:

Lihat File YAML

apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: tgi
  name: tgi-deployment-basic
  namespace: test
spec:
  replicas: 1
  selector:
    matchLabels:
      app: tgi
  template:
    metadata:
      labels:
        app: tgi
    spec:
      containers:
        - command:
            - sleep
            - 3600d
          image: >-
            ghcr.io/huggingface/text-generation-inference:1.4
          imagePullPolicy: IfNotPresent
          name: tgi
          ports:
            - containerPort: 80
              protocol: TCP
          resources:
            limits:
              cpu: '24'
              nvidia.com/gpu: '4'
            requests:
              cpu: '24'
              nvidia.com/gpu: '4'
          terminationMessagePath: /dev/termination-log
          terminationMessagePolicy: File
          volumeMounts:
            - mountPath: /llm
              name: volume-1710932083254
      restartPolicy: Always
      schedulerName: default-scheduler
      volumes:
        - name: volume-1710932083254
          persistentVolumeClaim:
            claimName: model

Periksa durasi proses pemuatan model. Hasil pengujian menunjukkan bahwa proses ini membutuhkan waktu sekitar 15,9 detik.

image.png

Setelah penjadwalan dengan kesadaran topologi NUMA diaktifkan

Kode sampel berikut menunjukkan file YAML aplikasi dalam skenario pengujian setelah penjadwalan dengan kesadaran topologi NUMA diaktifkan:

Lihat File YAML

apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: tgi-numa
  name: tgi-numa-deployment-basic
  namespace: yueming-test
spec:
  replicas: 1
  selector:
    matchLabels:
      app: tgi-numa
  template:
    metadata:
      annotations:
        cpuset-scheduler: required
        scheduling.alibabacloud.com/numa-topology-spec: |
          {
            "numaTopologyPolicy": "SingleNUMANode"
          }
      labels:
        app: tgi-numa
    spec:
      containers:
        - command:
            - sleep
            - 3600d
          image: >-
            ghcr.io/huggingface/text-generation-inference:1.4
          imagePullPolicy: IfNotPresent
          name: numa
          resources:
            limits:
              aliyun.com/gpu: '4'
              cpu: '24'
            requests:
              aliyun.com/gpu: '4'
              cpu: '24'
          volumeMounts:
            - mountPath: /llm
              name: volume-1710932083254
      restartPolicy: Always
      schedulerName: default-scheduler
      volumes:
        - name: volume-1710932083254
          persistentVolumeClaim:
            claimName: model

Periksa durasi proses pemuatan model. Hasil pengujian menunjukkan bahwa proses ini membutuhkan waktu sekitar 5,4 detik. Durasi dipersingkat sebesar 66%.

image

Referensi