全部产品
Search
文档中心

Container Service for Kubernetes:Bekerja dengan GPU sharing

更新时间:Dec 26, 2025

Topik ini menjelaskan cara menggunakan fitur berbagi GPU untuk menjadwalkan dan mengisolasi sumber daya GPU pada node Lingjun dalam klaster terkelola Container Service for Kubernetes (ACK) Lingjun.

Prasyarat

Klaster terkelola ACK Lingjun telah dibuat dan mencakup node Lingjun yang dipercepat oleh GPU. Untuk informasi lebih lanjut, lihat Buat klaster Lingjun dengan ACK diaktifkan.

Catatan

Secara default, komponen berbagi GPU diinstal di klaster terkelola ACK Lingjun. Anda dapat menambahkan label tertentu ke node yang dipercepat oleh GPU untuk mengaktifkan berbagi GPU. Untuk informasi lebih lanjut, lihat Label untuk mengaktifkan kebijakan penjadwalan GPU.

Menggunakan penjadwalan GPU bersama

Berbagi GPU berlaku dalam skenario berikut:

  • Aktifkan berbagi GPU tanpa isolasi memori GPU: Dalam skenario ini, beberapa pod dapat berbagi GPU yang sama, dan memori GPU yang dialokasikan ke sebuah pod tidak diisolasi dari memori GPU yang dialokasikan ke pod lainnya. Konten memori GPU mungkin ditangani atau tidak oleh aplikasi lapisan atas.

  • Aktifkan berbagi GPU dengan isolasi memori GPU: Dalam skenario ini, beberapa pod dapat berbagi GPU yang sama, tetapi memori GPU yang dialokasikan ke sebuah pod diisolasi dari memori GPU yang dialokasikan ke pod lainnya. Ini menangani konten memori GPU di antara pod.

Skenario 1: Berbagi tanpa isolasi

Dalam beberapa kasus, Anda mungkin memerlukan berbagi GPU tanpa isolasi memori GPU. Beberapa beban kerja menyediakan isolasi memori GPU. Misalnya, saat meluncurkan aplikasi Java, Anda dapat mengonfigurasi opsi Java untuk menentukan jumlah maksimum memori GPU yang dapat digunakan oleh aplikasi. Jika modul isolasi GPU diinstal, konflik sumber daya mungkin terjadi. Untuk menghindari masalah ini, Anda dapat mengaktifkan berbagi GPU tanpa menginstal modul isolasi GPU di beberapa node.

Langkah 1: Aktifkan berbagi GPU untuk sebuah node

  1. Periksa apakah file /etc/lingjun_metadata ada.

    • Jika file tersebut ada, jalankan perintah nvidia-smi. Jika output-nya normal, node tersebut adalah node Lingjun dan Anda dapat melanjutkan ke langkah berikutnya.

    • Jika file tersebut tidak ada, node tersebut bukan node Lingjun. Anda tidak dapat mengaktifkan berbagi GPU untuk node tersebut. Untuk mengaktifkan berbagi GPU dalam kasus ini, Anda perlu membuat node Lingjun. Untuk informasi lebih lanjut, lihat Ikhtisar kumpulan node Lingjun.

  2. Jalankan perintah berikut untuk menambahkan label ack.node.gpu.schedule ke node guna mengaktifkan GPU sharing.

    kubectl label node <NODE_NAME> ack.node.gpu.schedule=share

Langkah 2: Gunakan sumber daya GPU bersama

  1. Buat file tensorflow.yaml menggunakan contoh berikut.

    apiVersion: batch/v1
    kind: Job
    metadata:
      name: tensorflow-mnist-share
    spec:
      parallelism: 1
      template:
        metadata:
          labels:
            app: tensorflow-mnist-share
        spec:     # Template YAML menentukan pekerjaan yang menggunakan dataset TensorFlow MNIST. Pekerjaan tersebut membuat satu pod dan pod tersebut meminta 4 GiB memori GPU.
          containers:
          - name: tensorflow-mnist-share
            image: registry.cn-beijing.aliyuncs.com/ai-samples/gpushare-sample:tensorflow-1.5
            command:
            - python
            - tensorflow-sample-code/tfjob/docker/mnist/main.py
            - --max_steps=100000
            - --data_dir=tensorflow-sample-code/data
            resources:     # Jika Anda ingin pod meminta 4 GiB memori GPU, tentukan aliyun.com/gpu-mem: 4 dalam parameter resources.limits konfigurasi pod.
              limits:
                aliyun.com/gpu-mem: 4  # Pod meminta 4 GiB memori GPU.
            workingDir: /root
          restartPolicy: Never
  2. Jalankan perintah berikut untuk mengirimkan pekerjaan:

    kubectl apply -f tensorflow.yaml

Langkah 3: Verifikasi berbagi GPU tanpa isolasi memori GPU

Kueri pod yang dibuat oleh pekerjaan dan jalankan perintah berikut:

kubectl get pod | grep tensorflow

kubectl exec -ti tensorflow-mnist-share-xxxxx -- nvidia-smi

Output yang diharapkan:

Wed Jun 14 06:45:56 2023
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 515.105.01   Driver Version: 515.105.01   CUDA Version: 11.7     |
|-------------------------------+----------------------+----------------------+
| GPU  Name        Persistence-M| Bus-Id        Disp.A | Volatile Uncorr. ECC |
| Fan  Temp  Perf  Pwr:Usage/Cap|         Memory-Usage | GPU-Util  Compute M. |
|                               |                      |               MIG M. |
|===============================+======================+======================|
|   0  Tesla V100-SXM2...  On   | 00000000:00:09.0 Off |                    0 |
| N/A   35C    P0    59W / 300W |    334MiB / 16384MiB |      0%      Default |
|                               |                      |                  N/A |
+-------------------------------+----------------------+----------------------+

+-----------------------------------------------------------------------------+
| Processes:                                                                  |
|  GPU   GI   CI        PID   Type   Process name                  GPU Memory |
|        ID   ID                                                   Usage      |
|=============================================================================|
+-----------------------------------------------------------------------------+

Output tersebut menunjukkan bahwa pod dapat menggunakan semua memori yang disediakan oleh GPU, yaitu sebesar 16.384 MiB. Ini berarti berbagi GPU diimplementasikan tanpa isolasi memori GPU. Jika modul isolasi GPU diinstal, ukuran memori yang ditampilkan dalam output sama dengan jumlah memori yang diminta oleh pod.

Penting

Dalam contoh ini, GPU V100 digunakan dan 4 GiB memori GPU diminta oleh pod. Konfigurasi aktual tergantung pada lingkungan Anda.

Aplikasi perlu membaca nilai memori GPU yang dapat digunakan dari dua variabel lingkungan berikut.

ALIYUN_COM_GPU_MEM_CONTAINER=4 # Memori GPU yang tersedia untuk pod.
ALIYUN_COM_GPU_MEM_DEV=16 # Ukuran memori setiap GPU.

Anda dapat menghitung persentase total memori GPU yang digunakan oleh aplikasi dari dua variabel lingkungan di atas.

persentase = ALIYUN_COM_GPU_MEM_CONTAINER / ALIYUN_COM_GPU_MEM_DEV = 4 / 16 = 0,25

Skenario 2: Aktifkan berbagi GPU dengan isolasi memori GPU

Untuk memastikan stabilitas kontainer, Anda harus mengisolasi sumber daya GPU yang dialokasikan ke setiap kontainer. Saat menjalankan beberapa kontainer pada satu GPU, sumber daya GPU dialokasikan ke setiap kontainer sesuai permintaan. Namun, jika satu kontainer menggunakan sumber daya GPU secara berlebihan, kinerja kontainer lainnya mungkin terpengaruh. Untuk menyelesaikan masalah ini, banyak solusi tersedia di industri komputasi, seperti NVIDIA vGPU, Multi-Process Service (MPS), vCUDA, dan eGPU, yang memungkinkan pembagian GPU secara halus. Bagian berikut menjelaskan cara menggunakan eGPU.

Langkah 1: Aktifkan berbagi GPU untuk sebuah node

  1. Periksa apakah file /etc/lingjun_metadata ada.

    • Jika file tersebut ada, jalankan perintah nvidia-smi. Jika output-nya normal, node tersebut adalah node Lingjun dan Anda dapat melanjutkan ke langkah berikutnya.

    • Jika file tersebut tidak ada, node tersebut bukan node Lingjun. Anda tidak dapat mengaktifkan berbagi GPU untuk node tersebut. Untuk mengaktifkan berbagi GPU dalam kasus ini, Anda perlu membuat node Lingjun. Untuk informasi lebih lanjut, lihat Ikhtisar kumpulan node Lingjun.

  2. Jalankan perintah berikut untuk menambahkan label ack.node.gpu.schedule ke node guna mengaktifkan GPU sharing.

    kubectl label node <NODE_NAME> ack.node.gpu.schedule=egpu_mem
Catatan
  • Jika Anda menetapkan nilai label menjadi egpu_mem, hanya isolasi memori GPU yang diaktifkan. Dalam contoh sebelumnya, nilai label diatur menjadi egpu_mem.

  • Jika Anda menetapkan nilai label menjadi egpu_core_mem, baik isolasi memori GPU maupun isolasi daya komputasi diaktifkan.

  • Daya komputasi GPU harus diajukan bersama Memori GPU. Namun, Anda dapat mengajukan Memori GPU secara terpisah.

Langkah 2: Gunakan sumber daya GPU bersama

  1. Tunggu hingga informasi GPU dilaporkan oleh node.

  2. Jalankan perintah berikut untuk menanyakan sumber daya yang disediakan oleh node:

kubectl get node <NODE_NAME> -oyaml

Output yang diharapkan:

  allocatable:
    aliyun.com/gpu-count: "1"
    aliyun.com/gpu-mem: "80"
    ...
    nvidia.com/gpu: "0"
    ...
  capacity:
    aliyun.com/gpu-count: "1"
    aliyun.com/gpu-mem: "80"
    ...
    nvidia.com/gpu: "0"
    ...

Output yang diharapkan menunjukkan bahwa aliyun.com/gpu-mem ada dalam daftar resource node. Node tersebut memiliki satu kartu GPU dengan total memori GPU sebesar 80 GB.

Catatan

Jika suatu Pod perlu dijadwalkan ke dan menggunakan seluruh perangkat, tambahkan label ack.gpushare.placement=require-whole-device ke Pod tersebut. Kemudian, tentukan jumlah memori GPU menggunakan gpu-mem. Pod tersebut kemudian akan dijadwalkan ke GPU utuh yang memiliki jumlah memori yang ditentukan.

Langkah 3: Jalankan pekerjaan untuk memverifikasi berbagi GPU

  1. Gunakan file YAML berikut untuk mengirimkan pekerjaan benchmarking:

    apiVersion: batch/v1
    kind: Job
    metadata:
      name: benchmark-job
    spec:
      parallelism: 1
      template:
        spec:
          containers:
          - name: benchmark-job
            image: registry.cn-beijing.aliyuncs.com/ai-samples/gpushare-sample:benchmark-tensorflow-2.2.3
            command:
            - bash
            - run.sh
            - --num_batches=500000000
            - --batch_size=8
            resources:
              limits:
                aliyun.com/gpu-mem: 10  # Pekerjaan meminta 10 GB memori.
            workingDir: /root
          restartPolicy: Never
          hostNetwork: true
          tolerations:
            - operator: Exists
  2. Jalankan perintah berikut untuk mengirimkan pekerjaan:

    kubectl apply -f benchmark.yaml
  3. Setelah pod berjalan, jalankan perintah berikut untuk mengakses pod:

    kubectl exec -ti benchmark-job-xxxx bash
  4. Jalankan perintah berikut di dalam pod untuk menanyakan informasi isolasi GPU:

    vgpu-smi

    Output yang diharapkan:

    +------------------------------------------------------------------------------+
    |    VGPU_SMI 460.91.03     DRIVER_VERSION: 460.91.03     CUDA Version: 11.2   |
    +-------------------------------------------+----------------------------------+
    | GPU  Name                Bus-Id           |        Memory-Usage     GPU-Util |
    |===========================================+==================================|
    |   0  xxxxxxxx            00000000:00:07.0 |  8307MiB / 10782MiB   100% /  100% |
    +-------------------------------------------+----------------------------------+

    Output tersebut menunjukkan bahwa 10 GB memori GPU dialokasikan ke pod.

FAQ

Bagaimana cara memeriksa apakah komponen berbagi GPU diinstal di klaster saya?

Jalankan perintah berikut untuk memeriksa apakah komponen berbagi GPU berbasis eGPU diinstal:

kubectl get ds -nkube-system | grep gpushare

Output yang diharapkan:

NAME                                 DESIRED   CURRENT   READY   UP-TO-DATE   AVAILABLE   NODE SELECTOR                    AGE
gpushare-egpu-device-plugin-ds       0         0         0       0            0           <none>
gpushare-egpucore-device-plugin-ds   0         0         0       0            0           <none>

Output tersebut menunjukkan bahwa komponen berbagi GPU diinstal.