Berbagi teknologi

Eksplorasi manajemen sumber daya GPU K8: Menerapkan AI model besar Ollama di KubeSphere

2024-07-12

한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina

Penulis: Pengoperasian dan Pemeliharaan Youshu Star Master Dengan pesatnya perkembangan kecerdasan buatan, pembelajaran mesin, dan teknologi model besar AI, permintaan kami akan sumber daya komputasi juga meningkat. Khususnya untuk model AI berukuran besar yang perlu memproses data berskala besar dan algoritma yang kompleks, penggunaan sumber daya GPU menjadi sangat penting. Bagi para insinyur operasi dan pemeliharaan, menguasai cara mengelola dan mengonfigurasi sumber daya GPU di kluster Kubernetes, dan cara menerapkan aplikasi yang mengandalkan sumber daya ini, merupakan suatu keterampilan yang sangat diperlukan.

Hari ini, saya akan memandu Anda untuk mendapatkan pemahaman mendalam tentang cara menggunakan ekosistem dan alat Kubernetes yang kuat untuk mencapai manajemen sumber daya GPU dan penerapan aplikasi pada platform KubeSphere. Berikut adalah tiga tema inti yang akan dieksplorasi artikel ini:

  1. Perluasan cluster dan integrasi node GPU: Kami akan menggunakan alat KubeKey untuk memperluas cluster Kubernetes dan menambahkan node Pekerja dengan kemampuan GPU untuk memberikan dukungan perangkat keras yang diperlukan untuk aplikasi AI.
  2. Integrasi Kubernetes untuk sumber daya GPU: Gunakan Helm untuk menginstal dan mengkonfigurasi Operator GPU NVIDIA, yang merupakan solusi resmi yang disediakan oleh NVIDIA dan dirancang untuk menyederhanakan pemanggilan dan pengelolaan sumber daya GPU di cluster Kubernetes.
  3. Penerapan praktis: Alat manajemen model besar Ollama: Kami akan menerapkan Ollama, alat manajemen yang dirancang khusus untuk model AI besar, di KubeSphere untuk memverifikasi apakah sumber daya GPU dapat dijadwalkan dengan benar dan digunakan secara efisien.

Dengan membaca artikel ini, Anda akan memperoleh pengetahuan dan keterampilan untuk mengelola sumber daya GPU di Kubernetes, membantu Anda memanfaatkan sepenuhnya sumber daya GPU di lingkungan cloud-native dan mendorong perkembangan pesat aplikasi AI.

Praktik Terbaik KubeSphere "2024" Konfigurasi perangkat keras lingkungan eksperimental dan informasi perangkat lunak dari rangkaian dokumen adalah sebagai berikut:

Konfigurasi server aktual (arsitektur replika 1:1 dari lingkungan produksi skala kecil, konfigurasinya sedikit berbeda)

nama CPUAKU PprosesorPenyimpanandisk sistemdisk datamenggunakan
pendaftaran ksp192.168.9.904840200Gudang cermin pelabuhan
ksp-kontrol-1192.168.9.914840100KubeSphere/bidang-kontrol-k8s
ksp-kontrol-2192.168.9.924840100KubeSphere/bidang-kontrol-k8s
ksp-kontrol-3192.168.9.934840100KubeSphere/bidang-kontrol-k8s
pekerja-ksp-1192.168.9.9441640100k8s-pekerja/CI
pekerja-ksp-2192.168.9.9541640100k8s-pekerja
pekerja-ksp-3192.168.9.9641640100k8s-pekerja
penyimpanan-ksp-1192.168.9.974840300+ElasticSearch/Ceph/Longhorn/NFS/
penyimpanan-ksp-2192.168.9.984840300+ElasticSearch//Ceph/Longhorn
penyimpanan-ksp-3192.168.9.994840300+ElasticSearch//Ceph/Longhorn
ksp-gpu-pekerja-1192.168.9.10141640100k8s-pekerja (GPU NVIDIA Tesla M40 24G)
ksp-gpu-pekerja-2192.168.9.10241640100k8s-pekerja (GPU NVIDIA Tesla P100 16G)
gerbang-ksp-1192.168.9.1032440Gerbang proksi layanan aplikasi/VIP yang dibuat sendiri: 192.168.9.100
gerbang-ksp-2192.168.9.1042440Gerbang proksi layanan aplikasi/VIP yang dibuat sendiri: 192.168.9.100
ksp-tengah192.168.9.1054840100Node layanan dikerahkan di luar kluster k8s (Gitlab, dll.)
total15561526002000

Lingkungan pertarungan sebenarnya melibatkan informasi versi perangkat lunak

  • sistem operasi:bukaEuler 22.03 LTS SP3 x86_64
  • KubeSphere:Bahasa Inggris v3.4.1
  • Kubernetes:Bahasa Inggris: v1.28.8
  • Kunci Kube: Bahasa Inggris v3.1.1
  • Kontainer:1.7.13
  • Operator GPU NVIDIA:Bahasa Inggris v24.3.0
  • Driver kartu grafis NVIDIA:550.54.15

1. Prasyarat

1.1 Siapkan node Pekerja dengan kartu grafis

Karena keterbatasan sumber daya dan biaya, saya tidak memiliki host fisik dan kartu grafis kelas atas untuk bereksperimen. Hanya dua mesin virtual yang dilengkapi dengan kartu grafis GPU tingkat pemula yang dapat ditambahkan sebagai node pekerja dalam cluster.

  • Node 1 dikonfigurasi dengan kartu grafis GPU NVIDIA Tesla M40 24G. Satu-satunya keuntungan adalah memori video 24G yang besar dan kinerja yang rendah.
  • Node 2 dikonfigurasi dengan kartu grafis GPU NVIDIA Tesla P100 16G. Memori grafisnya kecil, tetapi kecepatannya lebih cepat dari M40, P40 dan kartu grafis lainnya.

Meskipun kartu grafis ini tidak sekuat model kelas atas, namun cukup untuk sebagian besar tugas pembelajaran dan pengembangan. Dengan sumber daya yang terbatas, konfigurasi seperti itu memberi saya peluang langsung yang berharga untuk mengeksplorasi sumber daya GPU secara mendalam dalam manajemen dan cluster Kubernetes strategi penjadwalan.

1.2 Konfigurasi inisialisasi sistem operasi

Silakan merujuk ke Panduan inisialisasi sistem node cluster Kubernetes openEuler 22.03 LTS SP3, selesaikan konfigurasi inisialisasi sistem operasi.

Panduan konfigurasi awal tidak melibatkan tugas pemutakhiran sistem operasi. Saat menginisialisasi sistem di lingkungan dengan akses Internet, Anda harus memutakhirkan sistem operasi dan kemudian memulai ulang node.

2. Gunakan KubeKey untuk memperluas node GPU Worker

Selanjutnya, kami menggunakan KubeKey untuk menambahkan node GPU yang baru ditambahkan ke cluster Kubernetes yang ada. Lihat dokumentasi resminya.

  • Ubah file konfigurasi cluster yang digunakan saat menerapkan KubeKey
  • Jalankan perintah untuk menambahkan node

2.1 Memodifikasi file konfigurasi cluster

Pada node Control-1, beralih ke direktori kubekey untuk penerapan dan ubah file konfigurasi cluster asli ksp-v341-v1288.yaml, harap modifikasi sesuai dengan situasi sebenarnya.

Poin modifikasi utama:

  • bagian spec.hosts: Tambahkan informasi simpul pekerja baru.
  • bagian spec.roleGroups.worker: Tambahkan informasi simpul pekerja baru

Contoh yang dimodifikasi adalah sebagai berikut:

apiVersion: kubekey.kubesphere.io/v1alpha2
kind: Cluster
metadata:
  name: opsxlab
spec:
  hosts:
  ......(保持不变)
  - {name: ksp-gpu-worker-1, address: 192.168.9.101, internalAddress: 192.168.9.101, user: root, password: "OpsXlab@2024"}
  - {name: ksp-gpu-worker-2, address: 192.168.9.102, internalAddress: 192.168.9.102, user: root, password: "OpsXlab@2024"}
  roleGroups:
    ......(保持不变)
    worker:
    ......(保持不变)
    - ksp-gpu-worker-1
    - ksp-gpu-worker-2

# 下面的内容保持不变
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

2.2 Gunakan KubeKey untuk menambahkan node

Sebelum menambahkan node, mari konfirmasi informasi node dari cluster saat ini.

$ kubectl get nodes -o wide
NAME            STATUS   ROLES           AGE   VERSION   INTERNAL-IP    EXTERNAL-IP   OS-IMAGE                    KERNEL-VERSION                       CONTAINER-RUNTIME
ksp-control-1   Ready    control-plane   24h   v1.28.8   192.168.9.91   <none>        openEuler 22.03 (LTS-SP3)   5.10.0-182.0.0.95.oe2203sp3.x86_64   containerd://1.7.13
ksp-control-2   Ready    control-plane   24h   v1.28.8   192.168.9.92   <none>        openEuler 22.03 (LTS-SP3)   5.10.0-182.0.0.95.oe2203sp3.x86_64   containerd://1.7.13
ksp-control-3   Ready    control-plane   24h   v1.28.8   192.168.9.93   <none>        openEuler 22.03 (LTS-SP3)   5.10.0-182.0.0.95.oe2203sp3.x86_64   containerd://1.7.13
ksp-worker-1    Ready    worker          24h   v1.28.8   192.168.9.94   <none>        openEuler 22.03 (LTS-SP3)   5.10.0-182.0.0.95.oe2203sp3.x86_64   containerd://1.7.13
ksp-worker-2    Ready    worker          24h   v1.28.8   192.168.9.95   <none>        openEuler 22.03 (LTS-SP3)   5.10.0-182.0.0.95.oe2203sp3.x86_64   containerd://1.7.13
ksp-worker-3    Ready    worker          24h   v1.28.8   192.168.9.96   <none>        openEuler 22.03 (LTS-SP3)   5.10.0-182.0.0.95.oe2203sp3.x86_64   containerd://1.7.13
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

Selanjutnya, kami menjalankan perintah berikut dan menggunakan file konfigurasi yang dimodifikasi untuk menambahkan node Pekerja baru ke cluster.

export KKZONE=cn
./kk add nodes -f ksp-v341-v1288.yaml
  • 1

Setelah perintah di atas dijalankan, KubeKey terlebih dahulu memeriksa apakah dependensi dan konfigurasi lain untuk penerapan Kubernetes memenuhi persyaratan. Setelah melewati pemeriksaan, Anda akan diminta untuk mengkonfirmasi instalasi.memasukiYa dan tekan ENTER untuk melanjutkan penerapan.

Diperlukan waktu sekitar 5 menit untuk menyelesaikan penerapan. Waktu spesifiknya bergantung pada kecepatan jaringan, konfigurasi mesin, dan jumlah node yang ditambahkan.

Setelah penerapan selesai, Anda akan melihat keluaran seperti berikut di terminal Anda.

......
19:29:26 CST [AutoRenewCertsModule] Generate k8s certs renew script
19:29:27 CST success: [ksp-control-2]
19:29:27 CST success: [ksp-control-1]
19:29:27 CST success: [ksp-control-3]
19:29:27 CST [AutoRenewCertsModule] Generate k8s certs renew service
19:29:29 CST success: [ksp-control-3]
19:29:29 CST success: [ksp-control-2]
19:29:29 CST success: [ksp-control-1]
19:29:29 CST [AutoRenewCertsModule] Generate k8s certs renew timer
19:29:30 CST success: [ksp-control-2]
19:29:30 CST success: [ksp-control-1]
19:29:30 CST success: [ksp-control-3]
19:29:30 CST [AutoRenewCertsModule] Enable k8s certs renew service
19:29:30 CST success: [ksp-control-3]
19:29:30 CST success: [ksp-control-2]
19:29:30 CST success: [ksp-control-1]
19:29:30 CST Pipeline[AddNodesPipeline] execute successfully
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

3. Verifikasi status cluster setelah perluasan

3.1 Konsol manajemen KubeSphere untuk memverifikasi status klaster

Kami membuka browser dan mengakses alamat IP dan port node Control-1 30880, masuk ke halaman login konsol manajemen KubeSphere.

Masuk ke antarmuka manajemen cluster, klik menu "Node" di sebelah kiri, dan klik "Cluster Node" untuk melihat informasi rinci tentang node yang tersedia di cluster Kubernetes.

3.2 Baris perintah Kubectl untuk memverifikasi status klaster

  • Lihat informasi simpul cluster

Jalankan perintah kubectl pada node Control-1 untuk mendapatkan informasi node cluster Kubernetes.

kubectl get nodes -o wide

    Seperti yang bisa Anda lihat di output, cluster Kubernetes saat ini memiliki 8 node, dan nama, status, peran, waktu bertahan, nomor versi Kubernetes, IP internal, jenis sistem operasi, versi kernel, dan runtime container dari setiap node ditampilkan secara detail. .dan informasi lainnya.

    $ kubectl get nodes -o wide
    NAME               STATUS     ROLES           AGE   VERSION   INTERNAL-IP     EXTERNAL-IP   OS-IMAGE                    KERNEL-VERSION                        CONTAINER-RUNTIME
    ksp-control-1      Ready      control-plane   25h   v1.28.8   192.168.9.91    <none>        openEuler 22.03 (LTS-SP3)   5.10.0-182.0.0.95.oe2203sp3.x86_64    containerd://1.7.13
    ksp-control-2      Ready      control-plane   25h   v1.28.8   192.168.9.92    <none>        openEuler 22.03 (LTS-SP3)   5.10.0-182.0.0.95.oe2203sp3.x86_64    containerd://1.7.13
    ksp-control-3      Ready      control-plane   25h   v1.28.8   192.168.9.93    <none>        openEuler 22.03 (LTS-SP3)   5.10.0-182.0.0.95.oe2203sp3.x86_64    containerd://1.7.13
    ksp-gpu-worker-1   Ready      worker          59m   v1.28.8   192.168.9.101   <none>        openEuler 22.03 (LTS-SP3)   5.10.0-199.0.0.112.oe2203sp3.x86_64   containerd://1.7.13
    ksp-gpu-worker-2   Ready      worker          59m   v1.28.8   192.168.9.102   <none>        openEuler 22.03 (LTS-SP3)   5.10.0-199.0.0.112.oe2203sp3.x86_64   containerd://1.7.13
    ksp-worker-1       Ready      worker          25h   v1.28.8   192.168.9.94    <none>        openEuler 22.03 (LTS-SP3)   5.10.0-182.0.0.95.oe2203sp3.x86_64    containerd://1.7.13
    ksp-worker-2       Ready      worker          25h   v1.28.8   192.168.9.95    <none>        openEuler 22.03 (LTS-SP3)   5.10.0-182.0.0.95.oe2203sp3.x86_64    containerd://1.7.13
    ksp-worker-3       Ready      worker          25h   v1.28.8   192.168.9.96    <none>        openEuler 22.03 (LTS-SP3)   5.10.0-182.0.0.95.oe2203sp3.x86_64    containerd://1.7.13
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    Sampai disini kita telah menyelesaikan seluruh tugas penggunaan Kubekey untuk menambahkan 2 node Worker pada cluster Kubernetes yang sudah ada yang terdiri dari 3 node Master dan 3 node Worker.

    Selanjutnya, kami menginstal Operator GPU NVIDIA yang diproduksi secara resmi oleh NVIDIA untuk mewujudkan Pod penjadwalan K8 untuk menggunakan sumber daya GPU.

    4. Instal dan konfigurasikan Operator GPU NVIDIA

    4.1 Instal driver kartu grafis NVIDIA

    Operator GPU NVIDIA mendukung instalasi otomatis driver grafis, tetapi hanya CentOS 7, 8 dan Ubuntu 20.04, 22.04 dan versi lainnya tidak mendukung openEuler, jadi Anda perlu menginstal driver grafis secara manual.

    Silakan merujuk ke Praktik terbaik KubeSphere: openEuler 22.03 LTS SP3 menginstal driver kartu grafis NVIDIA, selesaikan instalasi driver kartu grafis.

    4.2 Prasyarat

    Node Feature Discovery (NFD) mendeteksi pemeriksaan fitur.

     $ kubectl get nodes -o json | jq '.items[].metadata.labels | keys | any(startswith("feature.node.kubernetes.io"))'

      Hasil eksekusi dari perintah di atas adalah true, menjelaskan NFD Sudah berjalan di cluster. Jika NFD sudah berjalan di cluster, penerapan NFD harus dinonaktifkan saat menginstal operator.

      menjelaskan: Kluster K8 yang disebarkan menggunakan KubeSphere tidak akan menginstal dan mengonfigurasi NFD secara default.

      4.3 Instal Operator GPU NVIDIA

      1. Tambahkan repositori NVIDIA Helm
      helm repo add nvidia https://helm.ngc.nvidia.com/nvidia && helm repo update
        1. Instal Operator GPU

        Gunakan file konfigurasi default, nonaktifkan instalasi otomatis driver kartu grafis, dan instal Operator GPU.

        helm install -n gpu-operator --create-namespace gpu-operator nvidia/gpu-operator --set driver.enabled=false

          Catatan: Karena gambar yang diinstal relatif besar, waktu tunggu mungkin terjadi selama instalasi awal. Silakan periksa apakah gambar Anda berhasil ditarik! Anda dapat mempertimbangkan untuk menggunakan instalasi offline untuk mengatasi masalah jenis ini.

          1. Instal Operator GPU dengan nilai khusus (Opsional, digunakan offline atau untuk konfigurasi khusus
          helm install -f gpu-operator-values.yaml -n gpu-operator --create-namespace gpu-operator nvidia/gpu-operator --set driver.enabled=false

            Hasil keluaran dari eksekusi yang benar adalah sebagai berikut:

            $ helm install -n gpu-operator --create-namespace gpu-operator nvidia/gpu-operator --set driver.enabled=false
            NAME: gpu-operator
            LAST DEPLOYED: Tue Jul  2 21:40:29 2024
            NAMESPACE: gpu-operator
            STATUS: deployed
            REVISION: 1
            TEST SUITE: None
            • 1
            • 2
            • 3
            • 4
            • 5
            • 6

            4.4 Periksa status penerapan Operator GPU menggunakan baris perintah

            Setelah menjalankan perintah untuk menginstal Operator GPU, harap menunggu dengan sabar hingga semua image berhasil ditarik dan semua Pod berada dalam status Running.

            1. Periksa status pod dari baris perintah
            $ kubectl get pods -n gpu-operator
            NAME                                                          READY   STATUS      RESTARTS   AGE
            gpu-feature-discovery-czdf5                                   1/1     Running     0          15m
            gpu-feature-discovery-q9qlm                                   1/1     Running     0          15m
            gpu-operator-67c68ddccf-x29pm                                 1/1     Running     0          15m
            gpu-operator-node-feature-discovery-gc-57457b6d8f-zjqhr       1/1     Running     0          15m
            gpu-operator-node-feature-discovery-master-5fb74ff754-fzbzm   1/1     Running     0          15m
            gpu-operator-node-feature-discovery-worker-68459              1/1     Running     0          15m
            gpu-operator-node-feature-discovery-worker-74ps5              1/1     Running     0          15m
            gpu-operator-node-feature-discovery-worker-dpmg9              1/1     Running     0          15m
            gpu-operator-node-feature-discovery-worker-jvk4t              1/1     Running     0          15m
            gpu-operator-node-feature-discovery-worker-k5kwq              1/1     Running     0          15m
            gpu-operator-node-feature-discovery-worker-ll4bk              1/1     Running     0          15m
            gpu-operator-node-feature-discovery-worker-p4q5q              1/1     Running     0          15m
            gpu-operator-node-feature-discovery-worker-rmk99              1/1     Running     0          15m
            nvidia-container-toolkit-daemonset-9zcnj                      1/1     Running     0          15m
            nvidia-container-toolkit-daemonset-kcz9g                      1/1     Running     0          15m
            nvidia-cuda-validator-l8vjb                                   0/1     Completed   0          14m
            nvidia-cuda-validator-svn2p                                   0/1     Completed   0          13m
            nvidia-dcgm-exporter-9lq4c                                    1/1     Running     0          15m
            nvidia-dcgm-exporter-qhmkg                                    1/1     Running     0          15m
            nvidia-device-plugin-daemonset-7rvfm                          1/1     Running     0          15m
            nvidia-device-plugin-daemonset-86gx2                          1/1     Running     0          15m
            nvidia-operator-validator-csr2z                               1/1     Running     0          15m
            nvidia-operator-validator-svlc4                               1/1     Running     0          15m
            • 1
            • 2
            • 3
            • 4
            • 5
            • 6
            • 7
            • 8
            • 9
            • 10
            • 11
            • 12
            • 13
            • 14
            • 15
            • 16
            • 17
            • 18
            • 19
            • 20
            • 21
            • 22
            • 23
            • 24
            1. Lihat sumber daya GPU yang dapat dialokasikan oleh sebuah node
            $ kubectl describe node ksp-gpu-worker-1 | grep "^Capacity" -A 7
            Capacity:
              cpu:                4
              ephemeral-storage:  35852924Ki
              hugepages-1Gi:      0
              hugepages-2Mi:      0
              memory:             15858668Ki
              nvidia.com/gpu:     1
              pods:               110
            • 1
            • 2
            • 3
            • 4
            • 5
            • 6
            • 7
            • 8

            menjelaskan: Fokusnvidia.com/gpu: Nilai lapangan.

            4.5 Periksa status penerapan Operator GPU di konsol KubeSphere

            Beban kerja yang berhasil dibuat adalah sebagai berikut:

            • Penempatan

            • Kumpulan Daemon

            5. Uji verifikasi fungsi GPU

            5.1 Contoh uji 1-Uji verifikasi CUDA

            Setelah Operator GPU terinstal dengan benar, gunakan image dasar CUDA untuk menguji apakah K8 dapat membuat Pod yang menggunakan sumber daya GPU dengan benar.

            1. Buat file manifes sumber daya,vi cuda-ubuntu.yaml
            apiVersion: v1
            kind: Pod
            metadata:
              name: cuda-ubuntu2204
            spec:
              restartPolicy: OnFailure
              containers:
              - name: cuda-ubuntu2204
                image: "nvcr.io/nvidia/cuda:12.4.0-base-ubuntu22.04"
                resources:
                  limits:
                    nvidia.com/gpu: 1
                command: ["nvidia-smi"]
            • 1
            • 2
            • 3
            • 4
            • 5
            • 6
            • 7
            • 8
            • 9
            • 10
            • 11
            • 12
            1. Buat sumber daya
            kubectl apply -f cuda-ubuntu.yaml
              1. Lihat sumber daya yang dibuat

              Dari hasilnya, Anda dapat melihat bahwa pod dibuat pada node ksp-gpu-worker-2 (Model kartu grafis simpul Tesla P100-PCIE-16GB)。

              $ kubectl get pods -o wide
              NAME                      READY   STATUS      RESTARTS   AGE   IP             NODE               NOMINATED NODE   READINESS GATES
              cuda-ubuntu2204           0/1     Completed   0          73s   10.233.99.15   ksp-gpu-worker-2   <none>           <none>
              ollama-79688d46b8-vxmhg   1/1     Running     0          47m   10.233.72.17   ksp-gpu-worker-1   <none>           <none>
              • 1
              • 2
              • 3
              1. Lihat log Pod
              kubectl logs pod/cuda-ubuntu2204

                Hasil keluaran dari eksekusi yang benar adalah sebagai berikut:

                $ kubectl logs pod/cuda-ubuntu2204
                Mon Jul  8 11:10:59 2024
                +-----------------------------------------------------------------------------------------+
                | NVIDIA-SMI 550.54.15              Driver Version: 550.54.15      CUDA Version: 12.4     |
                |-----------------------------------------+------------------------+----------------------+
                | 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 P100-PCIE-16GB           Off |   00000000:00:10.0 Off |                    0 |
                | N/A   40C    P0             26W /  250W |       0MiB /  16384MiB |      0%      Default |
                |                                         |                        |                  N/A |
                +-----------------------------------------+------------------------+----------------------+
                
                +-----------------------------------------------------------------------------------------+
                | Processes:                                                                              |
                |  GPU   GI   CI        PID   Type   Process name                              GPU Memory |
                |        ID   ID                                                               Usage      |
                |=========================================================================================|
                |  No running processes found                                                             |
                +-----------------------------------------------------------------------------------------+
                • 1
                • 2
                • 3
                • 4
                • 5
                • 6
                • 7
                • 8
                • 9
                • 10
                • 11
                • 12
                • 13
                • 14
                • 15
                • 16
                • 17
                • 18
                • 19
                • 20
                1. Bersihkan sumber daya pengujian
                kubectl apply -f cuda-ubuntu.yaml

                  5.2 Contoh Pengujian 2-Contoh Aplikasi GPU Resmi

                  Terapkan contoh CUDA sederhana untuk menjumlahkan dua vektor.

                  1. Buat file manifes sumber daya,vi cuda-vectoradd.yaml
                  apiVersion: v1
                  kind: Pod
                  metadata:
                    name: cuda-vectoradd
                  spec:
                    restartPolicy: OnFailure
                    containers:
                    - name: cuda-vectoradd
                      image: "nvcr.io/nvidia/k8s/cuda-sample:vectoradd-cuda11.7.1-ubuntu20.04"
                      resources:
                        limits:
                          nvidia.com/gpu: 1
                  • 1
                  • 2
                  • 3
                  • 4
                  • 5
                  • 6
                  • 7
                  • 8
                  • 9
                  • 10
                  • 11
                  1. Jalankan perintah untuk membuat Pod
                  $ kubectl apply -f cuda-vectoradd.yaml
                    1. Lihat hasil eksekusi Pod

                    Pod berhasil dibuat dan akan dijalankan setelah startup. vectorAdd perintah dan keluar.

                    $ kubectl logs pod/cuda-vectoradd

                      Hasil keluaran dari eksekusi yang benar adalah sebagai berikut:

                      [Vector addition of 50000 elements]
                      Copy input data from the host memory to the CUDA device
                      CUDA kernel launch with 196 blocks of 256 threads
                      Copy output data from the CUDA device to the host memory
                      Test PASSED
                      Done
                      • 1
                      • 2
                      • 3
                      • 4
                      • 5
                      1. Bersihkan sumber daya pengujian
                      kubectl delete -f cuda-vectoradd.yaml

                        6. KubeSphere menerapkan Ollama

                        Melalui pengujian verifikasi di atas, terbukti bahwa sumber daya Pod menggunakan GPU dapat dibuat di cluster K8s. Selanjutnya, kami menggunakan KubeSphere untuk membuat alat manajemen model besar Ollama di cluster K8s berdasarkan kebutuhan penggunaan sebenarnya.

                        6.1 Membuat daftar sumber daya penerapan

                        Contoh ini adalah tes sederhana, dan penyimpanan dipilih jalurhosting Mode, silakan ganti dengan kelas penyimpanan atau jenis penyimpanan persisten lainnya yang digunakan sebenarnya.

                        1. Buat daftar sumber daya,vi deploy-ollama.yaml
                        kind: Deployment
                        apiVersion: apps/v1
                        metadata:
                          name: ollama
                          namespace: default
                          labels:
                            app: ollama
                        spec:
                          replicas: 1
                          selector:
                            matchLabels:
                              app: ollama
                          template:
                            metadata:
                              labels:
                                app: ollama
                            spec:
                              volumes:
                                - name: ollama-models
                                  hostPath:
                                    path: /data/openebs/local/ollama
                                    type: ''
                                - name: host-time
                                  hostPath:
                                    path: /etc/localtime
                                    type: ''
                              containers:
                                - name: ollama
                                  image: 'ollama/ollama:latest'
                                  ports:
                                    - name: http-11434
                                      containerPort: 11434
                                      protocol: TCP
                                  resources:
                                    limits:
                                      nvidia.com/gpu: '1'
                                    requests:
                                      nvidia.com/gpu: '1'
                                  volumeMounts:
                                    - name: ollama-models
                                      mountPath: /root/.ollama
                                    - name: host-time
                                      readOnly: true
                                      mountPath: /etc/localtime
                                  imagePullPolicy: IfNotPresent
                              restartPolicy: Always
                        ---
                        kind: Service
                        apiVersion: v1
                        metadata:
                          name: ollama
                          namespace: default
                          labels:
                            app: ollama
                        spec:
                          ports:
                            - name: http-11434
                              protocol: TCP
                              port: 11434
                              targetPort: 11434
                              nodePort: 31434
                          selector:
                            app: ollama
                          type: NodePort
                        • 1
                        • 2
                        • 3
                        • 4
                        • 5
                        • 6
                        • 7
                        • 8
                        • 9
                        • 10
                        • 11
                        • 12
                        • 13
                        • 14
                        • 15
                        • 16
                        • 17
                        • 18
                        • 19
                        • 20
                        • 21
                        • 22
                        • 23
                        • 24
                        • 25
                        • 26
                        • 27
                        • 28
                        • 29
                        • 30
                        • 31
                        • 32
                        • 33
                        • 34
                        • 35
                        • 36
                        • 37
                        • 38
                        • 39
                        • 40
                        • 41
                        • 42
                        • 43
                        • 44
                        • 45
                        • 46
                        • 47
                        • 48
                        • 49
                        • 50
                        • 51
                        • 52
                        • 53
                        • 54
                        • 55
                        • 56
                        • 57
                        • 58
                        • 59
                        • 60
                        • 61
                        • 62
                        • 63

                        Instruksi Khusus: Konsol manajemen KubeSphere mendukung konfigurasi grafis Deployment dan sumber daya lainnya untuk menggunakan sumber daya GPU. Contoh konfigurasinya adalah sebagai berikut.

                        6.2 Menyebarkan layanan Ollama

                        • Buat Ollama
                        kubectl apply -f deploy-ollama.yaml
                          • Lihat hasil pembuatan Pod

                          Dari hasilnya, Anda dapat melihat bahwa pod dibuat pada node ksp-gpu-worker-1 (Model kartu grafis simpul Tesla M40 24GB)。

                          $ kubectl get pods -o wide
                          NAME                      READY   STATUS    RESTARTS   AGE   IP             NODE               NOMINATED NODE   READINESS GATES
                          k   1/1     Running   0          12s   10.233.72.17   ksp-gpu-worker-1   <none>           <none>
                          • 1
                          • 2
                          • Lihat log kontainer
                          [root@ksp-control-1 ~]# kubectl logs ollama-79688d46b8-vxmhg
                          2024/07/08 18:24:27 routes.go:1064: INFO server config env="map[CUDA_VISIBLE_DEVICES: GPU_DEVICE_ORDINAL: HIP_VISIBLE_DEVICES: HSA_OVERRIDE_GFX_VERSION: OLLAMA_DEBUG:false OLLAMA_FLASH_ATTENTION:false OLLAMA_HOST:http://0.0.0.0:11434 OLLAMA_INTEL_GPU:false OLLAMA_KEEP_ALIVE: OLLAMA_LLM_LIBRARY: OLLAMA_MAX_LOADED_MODELS:1 OLLAMA_MAX_QUEUE:512 OLLAMA_MAX_VRAM:0 OLLAMA_MODELS:/root/.ollama/models OLLAMA_NOHISTORY:false OLLAMA_NOPRUNE:false OLLAMA_NUM_PARALLEL:1 OLLAMA_ORIGINS:[http://localhost https://localhost http://localhost:* https://localhost:* http://127.0.0.1 https://127.0.0.1 http://127.0.0.1:* https://127.0.0.1:* http://0.0.0.0 https://0.0.0.0 http://0.0.0.0:* https://0.0.0.0:* app://* file://* tauri://*] OLLAMA_RUNNERS_DIR: OLLAMA_SCHED_SPREAD:false OLLAMA_TMPDIR: ROCR_VISIBLE_DEVICES:]"
                          time=2024-07-08T18:24:27.829+08:00 level=INFO source=images.go:730 msg="total blobs: 5"
                          time=2024-07-08T18:24:27.829+08:00 level=INFO source=images.go:737 msg="total unused blobs removed: 0"
                          time=2024-07-08T18:24:27.830+08:00 level=INFO source=routes.go:1111 msg="Listening on [::]:11434 (version 0.1.48)"
                          time=2024-07-08T18:24:27.830+08:00 level=INFO source=payload.go:30 msg="extracting embedded files" dir=/tmp/ollama2414166698/runners
                          time=2024-07-08T18:24:32.454+08:00 level=INFO source=payload.go:44 msg="Dynamic LLM libraries [cpu cpu_avx cpu_avx2 cuda_v11 rocm_v60101]"
                          time=2024-07-08T18:24:32.567+08:00 level=INFO source=types.go:98 msg="inference compute" id=GPU-9e48dc13-f8f1-c6bb-860f-c82c96df22a4 library=cuda compute=5.2 driver=12.4 name="Tesla M40 24GB" total="22.4 GiB" available="22.3 GiB"
                          • 1
                          • 2
                          • 3
                          • 4
                          • 5
                          • 6
                          • 7

                          6.3 Tarik model besar yang digunakan Ollama

                          • Model tarik Ollama

                          Untuk menghemat waktu, contoh ini menggunakan model ukuran kecil qwen2 1.5b open source Alibaba sebagai model pengujian.

                          kubectl exec -it ollama-79688d46b8-vxmhg -- ollama pull qwen2:1.5b

                            Hasil keluaran dari eksekusi yang benar adalah sebagai berikut:

                            [root@ksp-control-1 ~]# kubectl exec -it ollama-79688d46b8-vxmhg -- ollama pull qwen2:1.5b
                            pulling manifest
                            pulling 405b56374e02... 100% ▕█████████████████████████████████████████████████████▏ 934 MB
                            pulling 62fbfd9ed093... 100% ▕█████████████████████████████████████████████████████▏  182 B
                            pulling c156170b718e... 100% ▕█████████████████████████████████████████████████████▏  11 KB
                            pulling f02dd72bb242... 100% ▕█████████████████████████████████████████████████████▏   59 B
                            pulling c9f5e9ffbc5f... 100% ▕█████████████████████████████████████████████████████▏  485 B
                            verifying sha256 digest
                            writing manifest
                            removing any unused layers
                            success
                            • 1
                            • 2
                            • 3
                            • 4
                            • 5
                            • 6
                            • 7
                            • 8
                            • 9
                            • 10
                            • Lihat isi file model

                            ada ksp-gpu-pekerja-1 Node menjalankan perintah tampilan berikut

                            $ ls -R /data/openebs/local/ollama/
                            /data/openebs/local/ollama/:
                            id_ed25519  id_ed25519.pub  models
                            
                            /data/openebs/local/ollama/models:
                            blobs  manifests
                            
                            /data/openebs/local/ollama/models/blobs:
                            sha256-405b56374e02b21122ae1469db646be0617c02928fd78e246723ebbb98dbca3e
                            sha256-62fbfd9ed093d6e5ac83190c86eec5369317919f4b149598d2dbb38900e9faef
                            sha256-c156170b718ec29139d3653d40ed1986fd92fb7e0959b5c71f3c48f62e6636f4
                            sha256-c9f5e9ffbc5f14febb85d242942bd3d674a8e4c762aaab034ec88d6ba839b596
                            sha256-f02dd72bb2423204352eabc5637b44d79d17f109fdb510a7c51455892aa2d216
                            
                            /data/openebs/local/ollama/models/manifests:
                            registry.ollama.ai
                            
                            /data/openebs/local/ollama/models/manifests/registry.ollama.ai:
                            library
                            
                            /data/openebs/local/ollama/models/manifests/registry.ollama.ai/library:
                            qwen2
                            
                            /data/openebs/local/ollama/models/manifests/registry.ollama.ai/library/qwen2:
                            1.5b
                            • 1
                            • 2
                            • 3
                            • 4
                            • 5
                            • 6
                            • 7
                            • 8
                            • 9
                            • 10
                            • 11
                            • 12
                            • 13
                            • 14
                            • 15
                            • 16
                            • 17
                            • 18
                            • 19
                            • 20
                            • 21
                            • 22
                            • 23
                            • 24

                            6.4 Uji kemampuan model

                            • Tes antarmuka panggilan
                            curl http://192.168.9.91:31434/api/chat -d '{
                              "model": "qwen2:1.5b",
                              "messages": [
                                { "role": "user", "content": "用20个字,介绍你自己" }
                              ]
                            }'
                            • 1
                            • 2
                            • 3
                            • 4
                            • 5
                            • Hasil tes
                            $ curl http://192.168.9.91:31434/api/chat -d '{
                              "model": "qwen2:1.5b",
                              "messages": [
                                { "role": "user", "content": "用20个字,介绍你自己" }
                              ]
                            }'
                            {"model":"qwen2:1.5b","created_at":"2024-07-08T09:54:48.011798927Z","message":{"role":"assistant","content":"我"},"done":false}
                            {"model":"qwen2:1.5b","created_at":"2024-07-08T09:54:48.035291669Z","message":{"role":"assistant","content":"是一个"},"done":false}
                            {"model":"qwen2:1.5b","created_at":"2024-07-08T09:54:48.06360233Z","message":{"role":"assistant","content":"人工智能"},"done":false}
                            {"model":"qwen2:1.5b","created_at":"2024-07-08T09:54:48.092411266Z","message":{"role":"assistant","content":"助手"},"done":false}
                            {"model":"qwen2:1.5b","created_at":"2024-07-08T09:54:48.12016935Z","message":{"role":"assistant","content":","},"done":false}
                            {"model":"qwen2:1.5b","created_at":"2024-07-08T09:54:48.144921623Z","message":{"role":"assistant","content":"专注于"},"done":false}
                            {"model":"qwen2:1.5b","created_at":"2024-07-08T09:54:48.169803961Z","message":{"role":"assistant","content":"提供"},"done":false}
                            {"model":"qwen2:1.5b","created_at":"2024-07-08T09:54:48.194796364Z","message":{"role":"assistant","content":"信息"},"done":false}
                            {"model":"qwen2:1.5b","created_at":"2024-07-08T09:54:48.21978104Z","message":{"role":"assistant","content":"和"},"done":false}
                            {"model":"qwen2:1.5b","created_at":"2024-07-08T09:54:48.244976103Z","message":{"role":"assistant","content":"帮助"},"done":false}
                            {"model":"qwen2:1.5b","created_at":"2024-07-08T09:54:48.270233992Z","message":{"role":"assistant","content":"。"},"done":false}
                            {"model":"qwen2:1.5b","created_at":"2024-07-08T09:54:48.29548561Z","message":{"role":"assistant","content":""},"done_reason":"stop","done":true,"total_duration":454377627,"load_duration":1535754,"prompt_eval_duration":36172000,"eval_count":12,"eval_duration":287565000}
                            • 1
                            • 2
                            • 3
                            • 4
                            • 5
                            • 6
                            • 7
                            • 8
                            • 9
                            • 10
                            • 11
                            • 12
                            • 13
                            • 14
                            • 15
                            • 16
                            • 17

                            6.5 Melihat informasi alokasi GPU

                            • Lihat sumber daya GPU yang dialokasikan dari node Pekerja
                            $ kubectl describe node ksp-gpu-worker-1 | grep "Allocated resources" -A 9
                            Allocated resources:
                              (Total limits may be over 100 percent, i.e., overcommitted.)
                              Resource           Requests        Limits
                              --------           --------        ------
                              cpu                487m (13%)      2 (55%)
                              memory             315115520 (2%)  800Mi (5%)
                              ephemeral-storage  0 (0%)          0 (0%)
                              hugepages-1Gi      0 (0%)          0 (0%)
                              hugepages-2Mi      0 (0%)          0 (0%)
                              nvidia.com/gpu     1               1
                            • 1
                            • 2
                            • 3
                            • 4
                            • 5
                            • 6
                            • 7
                            • 8
                            • 9
                            • 10
                            • Penggunaan GPU fisik runtime Ollama

                            Jalankan pada node Pekerja nvidia-smi -l Amati penggunaan GPU.

                            Penafian:

                            • Level penulis terbatas. Meskipun ia telah melalui banyak verifikasi dan pemeriksaan serta berusaha semaksimal mungkin untuk memastikan keakuratan konten,Namun, mungkin masih terdapat kelalaian . Jangan ragu untuk memberi kami saran dari pakar industri.
                            • Konten yang dijelaskan dalam artikel ini hanya diverifikasi dan diuji di lingkungan pertempuran sebenarnya, namun pembaca dapat belajar dan belajar darinyaDilarang keras untuk digunakan langsung di lingkungan produksiPenulis tidak bertanggung jawab atas masalah apa pun yang disebabkan oleh hal ini

                            Artikel ini diterbitkan oleh Platform Posting Ganda Artikel Blog One BukaTulis melepaskan!