K8s GPU 資源管理探索:在 KubeSphere 上部署 AI 大模型 Ollama

kubesphere發表於2024-07-10

作者:運維有術星主
隨著人工智慧、機器學習、AI 大模型技術的迅猛發展,我們對計算資源的需求也在不斷攀升。特別是對於需要處理大規模資料和複雜演算法的 AI 大模型,GPU 資源的使用變得至關重要。對於運維工程師而言,掌握如何在 Kubernetes 叢集上管理和配置 GPU 資源,以及如何高效部署依賴這些資源的應用,已成為一項不可或缺的技能。

今天,我將帶領大家深入瞭解如何在 KubeSphere 平臺上,利用 Kubernetes 強大的生態和工具,實現 GPU 資源的管理和應用部署。以下是本文將要探討的三個核心主題:

  1. 叢集擴容與 GPU 節點整合:我們將透過 KubeKey 工具,擴充套件 Kubernetes 叢集並增加具備 GPU 能力的 Worker 節點,為 AI 應用提供必要的硬體支援。
  2. GPU 資源的 Kubernetes 整合:使用 Helm 安裝和配置 NVIDIA GPU Operator,這是 NVIDIA 官方提供的一個解決方案,旨在簡化 Kubernetes 叢集中 GPU 資源的呼叫和管理。
  3. 實戰部署:Ollama 大模型管理工具:我們將在 KubeSphere 上部署 Ollama,一個專為 AI 大模型設計的管理工具,以驗證 GPU 資源是否能夠被正確排程和高效使用。

透過閱讀本文,您將獲得 Kubernetes 上 管理 GPU 資源的知識和技巧,幫助您在雲原生環境中,充分利用 GPU 資源,推動 AI 應用的快速發展。

KubeSphere 最佳實戰「2024」 系列文件的實驗環境硬體配置和軟體資訊如下:

實戰伺服器配置(架構1:1復刻小規模生產環境,配置略有不同)

主機名 IP CPU 記憶體 系統盤 資料盤 用途
ksp-registry 192.168.9.90 4 8 40 200 Harbor 映象倉庫
ksp-control-1 192.168.9.91 4 8 40 100 KubeSphere/k8s-control-plane
ksp-control-2 192.168.9.92 4 8 40 100 KubeSphere/k8s-control-plane
ksp-control-3 192.168.9.93 4 8 40 100 KubeSphere/k8s-control-plane
ksp-worker-1 192.168.9.94 4 16 40 100 k8s-worker/CI
ksp-worker-2 192.168.9.95 4 16 40 100 k8s-worker
ksp-worker-3 192.168.9.96 4 16 40 100 k8s-worker
ksp-storage-1 192.168.9.97 4 8 40 300+ ElasticSearch/Ceph/Longhorn/NFS/
ksp-storage-2 192.168.9.98 4 8 40 300+ ElasticSearch//Ceph/Longhorn
ksp-storage-3 192.168.9.99 4 8 40 300+ ElasticSearch//Ceph/Longhorn
ksp-gpu-worker-1 192.168.9.101 4 16 40 100 k8s-worker(GPU NVIDIA Tesla M40 24G)
ksp-gpu-worker-2 192.168.9.102 4 16 40 100 k8s-worker(GPU NVIDIA Tesla P100 16G)
ksp-gateway-1 192.168.9.103 2 4 40 自建應用服務代理閘道器/VIP:192.168.9.100
ksp-gateway-2 192.168.9.104 2 4 40 自建應用服務代理閘道器/VIP:192.168.9.100
ksp-mid 192.168.9.105 4 8 40 100 部署在 k8s 叢集之外的服務節點(Gitlab 等)
合計 15 56 152 600 2000

實戰環境涉及軟體版本資訊

  • 作業系統:openEuler 22.03 LTS SP3 x86_64
  • KubeSphere:v3.4.1
  • Kubernetes:v1.28.8
  • KubeKey: v3.1.1
  • Containerd:1.7.13
  • NVIDIA GPU Operator:v24.3.0
  • NVIDIA 顯示卡驅動:550.54.15

1. 前置條件

1.1 準備帶有顯示卡的 Worker 節點

鑑於資源和成本的限制,我沒有高階物理主機和顯示卡來做實驗。只能增加兩臺配備入門級 GPU 顯示卡的虛擬機器,作為叢集的 Worker 節點。

  • 節點 1,配置 GPU NVIDIA Tesla M40 24G 顯示卡。唯一優點 24G 大視訊記憶體,效能低。
  • 節點 2,配置 GPU NVIDIA Tesla P100 16G 顯示卡。視訊記憶體小,但是速度快於 M40、P40 等顯示卡。

儘管這些顯示卡在效能上不及高階型號,但它們足以應對大多數學習和開發任務,在資源有限的情況下,這樣的配置為我提供了寶貴的實踐機會,讓我能夠深入探索 Kubernetes 叢集中 GPU 資源的管理和排程策略。

1.2 作業系統初始化配置

請參考 Kubernetes 叢集節點 openEuler 22.03 LTS SP3 系統初始化指南,完成作業系統初始化配置。

初始化配置指南中沒有涉及作業系統升級的任務,在能聯網的環境初始化系統的時候一定要升級作業系統,然後重啟節點。

2. 使用 KubeKey 擴容 GPU Worker 節點

接下來我們使用 KubeKey 將新增加的 GPU 節點加入到已有的 Kubernetes 叢集,參考官方說明文件,整個過程比較簡單,僅需兩步。

  • 修改 KubeKey 部署時使用的叢集配置檔案
  • 執行增加節點的命令

2.1 修改叢集配置檔案

在 Control-1 節點,切換到部署用的 kubekey 目錄,修改原有的叢集配置檔案,我們實戰中使用的名字為 ksp-v341-v1288.yaml,請根據實際情況修改 。

主要修改點:

  • spec.hosts 部分:增加新的 worker 節點的資訊。
  • spec.roleGroups.worker 部分:增加新的 worker 節點的資訊

修改後的示例如下:

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
    
# 下面的內容保持不變

2.2 使用 KubeKey 增加節點

在增加節點之前,我們再確認一下當前叢集的節點資訊。

$ 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

接下來我們執行下面的命令,使用修改後的配置檔案將新增的 Worker 節點加入叢集。

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

上面的命令執行後,KubeKey 先檢查部署 Kubernetes 的依賴及其它配置是否符合要求。透過檢查後,系統將提示您確認安裝。輸入 yes 並按 ENTER 繼續部署。

部署完成需要大約 5 分鐘左右,具體時間看網速、機器配置、增加的節點數量。

部署完成後,您應該會在終端上看到類似於下面的輸出。

......
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

3. 擴容後叢集狀態驗證

3.1 KubeSphere 管理控制檯驗證叢集狀態

我們開啟瀏覽器訪問 Control-1 節點的 IP 地址和埠 30880,登陸 KubeSphere 管理控制檯的登入頁面。

進入叢集管理介面,單擊左側「節點」選單,點選「叢集節點」檢視 Kubernetes 叢集可用節點的詳細資訊。

3.2 Kubectl 命令列驗證叢集狀態

  • 檢視叢集節點資訊

在 Control-1 節點執行 kubectl 命令獲取 Kubernetes 叢集的節點資訊。

kubectl get nodes -o wide

在輸出結果中可以看到,當前的 Kubernetes 叢集有 8個節點,並詳細展示每個節點的名字、狀態、角色、存活時間、Kubernetes 版本號、內部 IP、作業系統型別、核心版本和容器執行時等資訊。

$ 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

至此,我們完成了利用 Kubekey 在現有的 3個 Master 節點和 3個 Worker 節點組成的 Kubernetes 叢集中增加 2 個 Worker 節點的全部任務。

接下來我們安裝 NVIDIA 官方出品的 NVIDIA GPU Operator,實現 K8s 排程 Pod 使用 GPU 資源。

4. 安裝配置 NVIDIA GPU Operator

4.1 安裝 NVIDIA 顯示卡驅動

NVIDIA GPU Operator 支援自動安裝顯示卡驅動,但是隻 CentOS 7、8 和 Ubuntu 20.04、22.04 等版本,並不支援 openEuler,所以需要手工安裝顯示卡驅動。

請參考 KubeSphere 最佳實戰:openEuler 22.03 LTS SP3 安裝 NVIDIA 顯示卡驅動,完成顯示卡驅動安裝。

4.2 前提條件

Node Feature Discovery (NFD) 檢測功能檢查。

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

上面的命令執行結果為 true, 說明 NFD 已經在叢集中執行。如果NFD已經在叢集中執行,那麼在安裝 Operator 時必須禁用部署 NFD。

說明: 使用 KubeSphere 部署的 K8s 叢集預設不會安裝配置 NFD。

4.3 安裝 NVIDIA GPU Operator

  1. 新增 NVIDIA Helm repository
helm repo add nvidia https://helm.ngc.nvidia.com/nvidia && helm repo update
  1. 安裝 GPU Operator

使用預設配置檔案,禁用自動安裝顯示卡驅動功能,安裝 GPU Operator。

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

注意: 由於安裝的映象比較大,所以初次安裝過程中可能會出現超時的情形,請檢查你的映象是否成功拉取!可以考慮使用離線安裝解決該類問題。

  1. 使用自定義 values 安裝 GPU Operator(可選,離線或是自定義配置時使用
helm install -f gpu-operator-values.yaml -n gpu-operator --create-namespace gpu-operator nvidia/gpu-operator --set driver.enabled=false

正確執行輸出結果如下:

$ 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

4.4 命令列檢查 GPU Operator 部署狀態

執行安裝 GPU Operator 的命令後請耐心等待所有映象成功拉取,所有 Pod 都處於 Running 狀態。

  1. 命令列檢查 pods 狀態
$ 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. 檢視節點可分配的 GPU 資源
$ 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

說明: 重點關注 nvidia.com/gpu: 欄位的值。

4.5 KubeSphere 控制檯檢視 GPU Operator 部署狀態

建立成功的工作負載如下:

  • Deployments

  • Daemonsets

5. GPU 功能驗證測試

5.1 測試示例1-驗證測試 CUDA

GPU Operator 正確安裝完成後,使用 CUDA 基礎映象,測試 K8s 是否能正確建立使用 GPU 資源的 Pod。

  1. 建立資源清單檔案,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. 建立資源
kubectl apply -f cuda-ubuntu.yaml
  1. 檢視建立的資源

從結果中可以看到 pod 建立在了 ksp-gpu-worker-2 節點(該節點顯示卡型號 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. 檢視 Pod 日誌
kubectl logs pod/cuda-ubuntu2204

正確執行輸出結果如下:

$ 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. 清理測試資源
kubectl apply -f cuda-ubuntu.yaml

5.2 測試示例 2-官方 GPU Applications 示例

執行一個簡單的 CUDA 示例,用於將兩個向量(vectors)相加。

  1. 建立資源清單檔案,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. 執行命令建立 Pod
$ kubectl apply -f cuda-vectoradd.yaml
  1. 檢視 Pod 執行結果

Pod 建立成功,啟動後會執行 vectorAdd 命令並退出。

$ kubectl logs pod/cuda-vectoradd

正確執行輸出結果如下:

[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. 清理測試資源
kubectl delete -f cuda-vectoradd.yaml

6. KubeSphere 部署 Ollama

透過上面的驗證測試,證明可以在 K8s 叢集上建立使用 GPU 的 Pod 資源,接下來我們結合實際使用需求,利用 KubeSphere 在 K8s 叢集建立一套大模型管理工具 Ollama。

6.1 建立部署資源清單

本示例屬於簡單測試,儲存選擇了 hostPath 模式,實際使用中請替換為儲存類或是其他型別的持久化儲存。

  1. 建立資源清單,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

特殊說明: KubeSphere 的管理控制檯支援圖形化配置 Deployment 等資源使用 GPU 資源,配置示例如下,感興趣的朋友可以自行研究。

6.2 部署 Ollama 服務

  • 建立 Ollama
kubectl apply -f deploy-ollama.yaml
  • 檢視 Pod 建立結果

從結果中可以看到 pod 建立在了 ksp-gpu-worker-1 節點(該節點顯示卡型號 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>
  • 檢視容器 log
[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"

6.3 拉取 Ollama 使用的大模型

  • Ollama 拉取模型

本示例為了節省時間,採用阿里開源的 qwen2 1.5b 小尺寸模型作為測試模型。

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

正確執行輸出結果如下:

[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
  • 檢視模型檔案的內容

ksp-gpu-worker-1 節點執行下面的檢視命令

$ 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

6.4 模型能力測試

  • 呼叫介面測試
curl http://192.168.9.91:31434/api/chat -d '{
  "model": "qwen2:1.5b",
  "messages": [
    { "role": "user", "content": "用20個字,介紹你自己" }
  ]
}'
  • 測試結果
$ 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}

6.5 檢視 GPU 分配資訊

  • 檢視 Worker 節點已分配的 GPU 資源
$ 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
  • Ollama 執行時物理 GPU 使用情況

在 Worker 節點上執行 nvidia-smi -l 觀察 GPU 的使用情況。

免責宣告:

  • 筆者水平有限,儘管經過多次驗證和檢查,盡力確保內容的準確性,但仍可能存在疏漏之處。敬請業界專家大佬不吝指教。
  • 本文所述內容僅透過實戰環境驗證測試,讀者可學習、借鑑,但嚴禁直接用於生產環境由此引發的任何問題,作者概不負責

本文由部落格一文多發平臺 OpenWrite 釋出!

相關文章