ToB企服应用市场:ToB评测及商务社交产业平台

标题: K8s GPU 资源管理探索:在 KubeSphere 上部署 AI 大模型 Ollama [打印本页]

作者: 拉不拉稀肚拉稀    时间: 2024-7-10 12:58
标题: K8s GPU 资源管理探索:在 KubeSphere 上部署 AI 大模型 Ollama
作者:运维有术星主
随着人工智能、呆板学习、AI 大模型技术的迅猛发展,我们对计算资源的需求也在不断攀升。特别是对于需要处置惩罚大规模数据和复杂算法的 AI 大模型,GPU 资源的使用变得至关重要。对于运维工程师而言,掌握如何在 Kubernetes 集群上管理和设置 GPU 资源,以及如何高效部署依赖这些资源的应用,已成为一项不可或缺的技能。
今天,我将领导大家深入了解如何在 KubeSphere 平台上,使用 Kubernetes 强大的生态和工具,实现 GPU 资源的管理和应用部署。以下是本文将要探讨的三个核心主题:
通过阅读本文,您将得到 Kubernetes 上 管理 GPU 资源的知识和本领,资助您在云原生情况中,充分使用 GPU 资源,推动 AI 应用的快速发展。
KubeSphere 最佳实战「2024」 系列文档的实行情况硬件设置和软件信息如下:
实战服务器设置(架构1:1复刻小规模生产情况,设置略有不同)
主机名IPCPU内存系统盘数据盘用途ksp-registry192.168.9.904840200Harbor 镜像仓库ksp-control-1192.168.9.914840100KubeSphere/k8s-control-planeksp-control-2192.168.9.924840100KubeSphere/k8s-control-planeksp-control-3192.168.9.934840100KubeSphere/k8s-control-planeksp-worker-1192.168.9.9441640100k8s-worker/CIksp-worker-2192.168.9.9541640100k8s-workerksp-worker-3192.168.9.9641640100k8s-workerksp-storage-1192.168.9.974840300+ElasticSearch/Ceph/Longhorn/NFS/ksp-storage-2192.168.9.984840300+ElasticSearch//Ceph/Longhornksp-storage-3192.168.9.994840300+ElasticSearch//Ceph/Longhornksp-gpu-worker-1192.168.9.10141640100k8s-worker(GPU NVIDIA Tesla M40 24G)ksp-gpu-worker-2192.168.9.10241640100k8s-worker(GPU NVIDIA Tesla P100 16G)ksp-gateway-1192.168.9.1032440自建应用服务代理网关/VIP:192.168.9.100ksp-gateway-2192.168.9.1042440自建应用服务代理网关/VIP:192.168.9.100ksp-mid192.168.9.1054840100部署在 k8s 集群之外的服务节点(Gitlab 等)合计15561526002000实战情况涉及软件版本信息
1. 前置条件

1.1 准备带有显卡的 Worker 节点

鉴于资源和成本的限制,我没有高端物理主机和显卡来做实行。只能增加两台配备入门级 GPU 显卡的虚拟机,作为集群的 Worker 节点。
尽管这些显卡在性能上不及高端型号,但它们足以应对大多数学习和开发任务,在资源有限的情况下,这样的设置为我提供了名贵的实践机会,让我能够深入探索 Kubernetes 集群中 GPU 资源的管理和调度策略。
1.2 操纵系统初始化设置

请参考 Kubernetes 集群节点 openEuler 22.03 LTS SP3 系统初始化指南,完成操纵系统初始化设置。
初始化设置指南中没有涉及操纵系统升级的任务,在能联网的情况初始化系统的时间肯定要升级操纵系统,然后重启节点。
2. 使用 KubeKey 扩容 GPU Worker 节点

接下来我们使用 KubeKey 将新增加的 GPU 节点加入到已有的 Kubernetes 集群,参考官方阐明文档,整个过程比较简朴,仅需两步。
2.1 修改集群设置文件

在 Control-1 节点,切换到部署用的 kubekey 目录,修改原有的集群设置文件,我们实战中使用的名字为 ksp-v341-v1288.yaml,请根据现实情况修改 。
主要修改点:
修改后的示例如下:
  1. apiVersion: kubekey.kubesphere.io/v1alpha2
  2. kind: Cluster
  3. metadata:
  4.   name: opsxlab
  5. spec:
  6.   hosts:
  7.   ......(保持不变)
  8.   - {name: ksp-gpu-worker-1, address: 192.168.9.101, internalAddress: 192.168.9.101, user: root, password: "OpsXlab@2024"}
  9.   - {name: ksp-gpu-worker-2, address: 192.168.9.102, internalAddress: 192.168.9.102, user: root, password: "OpsXlab@2024"}
  10.   roleGroups:
  11.     ......(保持不变)
  12.     worker:
  13.     ......(保持不变)
  14.     - ksp-gpu-worker-1
  15.     - ksp-gpu-worker-2
  16.    
  17. # 下面的内容保持不变
复制代码
2.2 使用 KubeKey 增加节点

在增加节点之前,我们再确认一下当前集群的节点信息。
  1. $ kubectl get nodes -o wide
  2. NAME            STATUS   ROLES           AGE   VERSION   INTERNAL-IP    EXTERNAL-IP   OS-IMAGE                    KERNEL-VERSION                       CONTAINER-RUNTIME
  3. 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
  4. 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
  5. 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
  6. 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
  7. 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
  8. 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 节点加入集群。
  1. export KKZONE=cn
  2. ./kk add nodes -f ksp-v341-v1288.yaml
复制代码
上面的命令执行后,KubeKey 先检查部署 Kubernetes 的依赖及其它设置是否符合要求。通过检查后,系统将提示您确认安装。输入 yes 并按 ENTER 继续部署。
部署完成需要大约 5 分钟左右,具体时间看网速、呆板设置、增加的节点数目。
部署完成后,您应该会在终端上看到类似于下面的输出。
  1. ......
  2. 19:29:26 CST [AutoRenewCertsModule] Generate k8s certs renew script
  3. 19:29:27 CST success: [ksp-control-2]
  4. 19:29:27 CST success: [ksp-control-1]
  5. 19:29:27 CST success: [ksp-control-3]
  6. 19:29:27 CST [AutoRenewCertsModule] Generate k8s certs renew service
  7. 19:29:29 CST success: [ksp-control-3]
  8. 19:29:29 CST success: [ksp-control-2]
  9. 19:29:29 CST success: [ksp-control-1]
  10. 19:29:29 CST [AutoRenewCertsModule] Generate k8s certs renew timer
  11. 19:29:30 CST success: [ksp-control-2]
  12. 19:29:30 CST success: [ksp-control-1]
  13. 19:29:30 CST success: [ksp-control-3]
  14. 19:29:30 CST [AutoRenewCertsModule] Enable k8s certs renew service
  15. 19:29:30 CST success: [ksp-control-3]
  16. 19:29:30 CST success: [ksp-control-2]
  17. 19:29:30 CST success: [ksp-control-1]
  18. 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 集群的节点信息。
  1. kubectl get nodes -o wide
复制代码
在输出结果中可以看到,当前的 Kubernetes 集群有 8个节点,并详细展示每个节点的名字、状态、角色、存活时间、Kubernetes 版本号、内部 IP、操纵系统类型、内核版本和容器运行时等信息。
  1. $ kubectl get nodes -o wide
  2. NAME               STATUS     ROLES           AGE   VERSION   INTERNAL-IP     EXTERNAL-IP   OS-IMAGE                    KERNEL-VERSION                        CONTAINER-RUNTIME
  3. 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
  4. 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
  5. 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
  6. 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
  7. 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
  8. 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
  9. 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
  10. 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)  检测功能检查。
  1. $ 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. helm repo add nvidia https://helm.ngc.nvidia.com/nvidia && helm repo update
复制代码
使用默认设置文件,禁用自动安装显卡驱动功能,安装 GPU Operator。
  1. helm install -n gpu-operator --create-namespace gpu-operator nvidia/gpu-operator --set driver.enabled=false
复制代码
注意: 由于安装的镜像比较大,所以初次安装过程中可能会出现超时的情形,请检查你的镜像是否乐成拉取!可以考虑使用离线安装解决该类问题。
  1. helm install -f gpu-operator-values.yaml -n gpu-operator --create-namespace gpu-operator nvidia/gpu-operator --set driver.enabled=false
复制代码
正确执行输出结果如下:
  1. $ helm install -n gpu-operator --create-namespace gpu-operator nvidia/gpu-operator --set driver.enabled=false
  2. NAME: gpu-operator
  3. LAST DEPLOYED: Tue Jul  2 21:40:29 2024
  4. NAMESPACE: gpu-operator
  5. STATUS: deployed
  6. REVISION: 1
  7. TEST SUITE: None
复制代码
4.4 命令行检查 GPU Operator 部署状态

执行安装 GPU Operator 的命令后请耐烦等候全部镜像乐成拉取,全部 Pod 都处于 Running 状态。
  1. $ kubectl get pods -n gpu-operator
  2. NAME                                                          READY   STATUS      RESTARTS   AGE
  3. gpu-feature-discovery-czdf5                                   1/1     Running     0          15m
  4. gpu-feature-discovery-q9qlm                                   1/1     Running     0          15m
  5. gpu-operator-67c68ddccf-x29pm                                 1/1     Running     0          15m
  6. gpu-operator-node-feature-discovery-gc-57457b6d8f-zjqhr       1/1     Running     0          15m
  7. gpu-operator-node-feature-discovery-master-5fb74ff754-fzbzm   1/1     Running     0          15m
  8. gpu-operator-node-feature-discovery-worker-68459              1/1     Running     0          15m
  9. gpu-operator-node-feature-discovery-worker-74ps5              1/1     Running     0          15m
  10. gpu-operator-node-feature-discovery-worker-dpmg9              1/1     Running     0          15m
  11. gpu-operator-node-feature-discovery-worker-jvk4t              1/1     Running     0          15m
  12. gpu-operator-node-feature-discovery-worker-k5kwq              1/1     Running     0          15m
  13. gpu-operator-node-feature-discovery-worker-ll4bk              1/1     Running     0          15m
  14. gpu-operator-node-feature-discovery-worker-p4q5q              1/1     Running     0          15m
  15. gpu-operator-node-feature-discovery-worker-rmk99              1/1     Running     0          15m
  16. nvidia-container-toolkit-daemonset-9zcnj                      1/1     Running     0          15m
  17. nvidia-container-toolkit-daemonset-kcz9g                      1/1     Running     0          15m
  18. nvidia-cuda-validator-l8vjb                                   0/1     Completed   0          14m
  19. nvidia-cuda-validator-svn2p                                   0/1     Completed   0          13m
  20. nvidia-dcgm-exporter-9lq4c                                    1/1     Running     0          15m
  21. nvidia-dcgm-exporter-qhmkg                                    1/1     Running     0          15m
  22. nvidia-device-plugin-daemonset-7rvfm                          1/1     Running     0          15m
  23. nvidia-device-plugin-daemonset-86gx2                          1/1     Running     0          15m
  24. nvidia-operator-validator-csr2z                               1/1     Running     0          15m
  25. nvidia-operator-validator-svlc4                               1/1     Running     0          15m
复制代码
  1. $ kubectl describe node ksp-gpu-worker-1 | grep "^Capacity" -A 7
  2. Capacity:
  3.   cpu:                4
  4.   ephemeral-storage:  35852924Ki
  5.   hugepages-1Gi:      0
  6.   hugepages-2Mi:      0
  7.   memory:             15858668Ki
  8.   nvidia.com/gpu:     1
  9.   pods:               110
复制代码
阐明: 重点关注 nvidia.com/gpu:     字段的值。
4.5 KubeSphere 控制台查看 GPU Operator 部署状态

创建乐成的工作负载如下:


5. GPU 功能验证测试

5.1 测试示例1-验证测试 CUDA

GPU Operator 正确安装完成后,使用 CUDA 基础镜像,测试 K8s 是否能正确创建使用 GPU 资源的 Pod。
  1. apiVersion: v1
  2. kind: Pod
  3. metadata:
  4.   name: cuda-ubuntu2204
  5. spec:
  6.   restartPolicy: OnFailure
  7.   containers:
  8.   - name: cuda-ubuntu2204
  9.     image: "nvcr.io/nvidia/cuda:12.4.0-base-ubuntu22.04"
  10.     resources:
  11.       limits:
  12.         nvidia.com/gpu: 1
  13.     command: ["nvidia-smi"]
复制代码
  1. kubectl apply -f cuda-ubuntu.yaml
复制代码
从结果中可以看到 pod 创建在了 ksp-gpu-worker-2 节点(该节点显卡型号 Tesla P100-PCIE-16GB)。
  1. $ kubectl get pods -o wide
  2. NAME                      READY   STATUS      RESTARTS   AGE   IP             NODE               NOMINATED NODE   READINESS GATES
  3. cuda-ubuntu2204           0/1     Completed   0          73s   10.233.99.15   ksp-gpu-worker-2   <none>           <none>
  4. ollama-79688d46b8-vxmhg   1/1     Running     0          47m   10.233.72.17   ksp-gpu-worker-1   <none>           <none>
复制代码
  1. kubectl logs pod/cuda-ubuntu2204
复制代码
正确执行输出结果如下:
  1. $ kubectl logs pod/cuda-ubuntu2204
  2. Mon Jul  8 11:10:59 2024
  3. +-----------------------------------------------------------------------------------------+
  4. | NVIDIA-SMI 550.54.15              Driver Version: 550.54.15      CUDA Version: 12.4     |
  5. |-----------------------------------------+------------------------+----------------------+
  6. | GPU  Name                 Persistence-M | Bus-Id          Disp.A | Volatile Uncorr. ECC |
  7. | Fan  Temp   Perf          Pwr:Usage/Cap |           Memory-Usage | GPU-Util  Compute M. |
  8. |                                         |                        |               MIG M. |
  9. |=========================================+========================+======================|
  10. |   0  Tesla P100-PCIE-16GB           Off |   00000000:00:10.0 Off |                    0 |
  11. | N/A   40C    P0             26W /  250W |       0MiB /  16384MiB |      0%      Default |
  12. |                                         |                        |                  N/A |
  13. +-----------------------------------------+------------------------+----------------------+
  14. +-----------------------------------------------------------------------------------------+
  15. | Processes:                                                                              |
  16. |  GPU   GI   CI        PID   Type   Process name                              GPU Memory |
  17. |        ID   ID                                                               Usage      |
  18. |=========================================================================================|
  19. |  No running processes found                                                             |
  20. +-----------------------------------------------------------------------------------------+
复制代码
  1. kubectl apply -f cuda-ubuntu.yaml
复制代码
5.2 测试示例 2-官方 GPU Applications 示例

执行一个简朴的 CUDA 示例,用于将两个向量(vectors)相加。
  1. apiVersion: v1
  2. kind: Pod
  3. metadata:
  4.   name: cuda-vectoradd
  5. spec:
  6.   restartPolicy: OnFailure
  7.   containers:
  8.   - name: cuda-vectoradd
  9.     image: "nvcr.io/nvidia/k8s/cuda-sample:vectoradd-cuda11.7.1-ubuntu20.04"
  10.     resources:
  11.       limits:
  12.         nvidia.com/gpu: 1
复制代码
  1. $ kubectl apply -f cuda-vectoradd.yaml
复制代码
Pod 创建乐成,启动后会运行 vectorAdd 命令并退出。
  1. $ kubectl logs pod/cuda-vectoradd
复制代码
正确执行输出结果如下:
  1. [Vector addition of 50000 elements]
  2. Copy input data from the host memory to the CUDA device
  3. CUDA kernel launch with 196 blocks of 256 threads
  4. Copy output data from the CUDA device to the host memory
  5. Test PASSED
  6. Done
复制代码
  1. kubectl delete -f cuda-vectoradd.yaml
复制代码
6. KubeSphere 部署 Ollama

通过上面的验证测试,证明可以在 K8s 集群上创建使用 GPU 的 Pod 资源,接下来我们结合现实使用需求,使用 KubeSphere 在 K8s 集群创建一套大模型管理工具 Ollama。
6.1 创建部署资源清单

本示例属于简朴测试,存储选择了 hostPath 模式,现实使用中请替换为存储类或是其他类型的持久化存储。
  1. kind: Deployment
  2. apiVersion: apps/v1
  3. metadata:
  4.   name: ollama
  5.   namespace: default
  6.   labels:
  7.     app: ollama
  8. spec:
  9.   replicas: 1
  10.   selector:
  11.     matchLabels:
  12.       app: ollama
  13.   template:
  14.     metadata:
  15.       labels:
  16.         app: ollama
  17.     spec:
  18.       volumes:
  19.         - name: ollama-models
  20.           hostPath:
  21.             path: /data/openebs/local/ollama
  22.             type: ''
  23.         - name: host-time
  24.           hostPath:
  25.             path: /etc/localtime
  26.             type: ''
  27.       containers:
  28.         - name: ollama
  29.           image: 'ollama/ollama:latest'
  30.           ports:
  31.             - name: http-11434
  32.               containerPort: 11434
  33.               protocol: TCP
  34.           resources:
  35.             limits:
  36.               nvidia.com/gpu: '1'
  37.             requests:
  38.               nvidia.com/gpu: '1'
  39.           volumeMounts:
  40.             - name: ollama-models
  41.               mountPath: /root/.ollama
  42.             - name: host-time
  43.               readOnly: true
  44.               mountPath: /etc/localtime
  45.           imagePullPolicy: IfNotPresent
  46.       restartPolicy: Always
  47. ---
  48. kind: Service
  49. apiVersion: v1
  50. metadata:
  51.   name: ollama
  52.   namespace: default
  53.   labels:
  54.     app: ollama
  55. spec:
  56.   ports:
  57.     - name: http-11434
  58.       protocol: TCP
  59.       port: 11434
  60.       targetPort: 11434
  61.       nodePort: 31434
  62.   selector:
  63.     app: ollama
  64.   type: NodePort
复制代码
特殊阐明: KubeSphere 的管理控制台支持图形化设置 Deployment 等资源使用 GPU 资源,设置示例如下,感兴趣的朋友可以自行研究。

6.2 部署 Ollama 服务

  1. kubectl apply -f deploy-ollama.yaml
复制代码
从结果中可以看到 pod 创建在了 ksp-gpu-worker-1 节点(该节点显卡型号 Tesla M40 24GB)。
  1. $ kubectl get pods -o wide
  2. NAME                      READY   STATUS    RESTARTS   AGE   IP             NODE               NOMINATED NODE   READINESS GATES
  3. k   1/1     Running   0          12s   10.233.72.17   ksp-gpu-worker-1   <none>           <none>
复制代码
  1. [root@ksp-control-1 ~]# kubectl logs ollama-79688d46b8-vxmhg
  2. 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:]"
  3. time=2024-07-08T18:24:27.829+08:00 level=INFO source=images.go:730 msg="total blobs: 5"
  4. time=2024-07-08T18:24:27.829+08:00 level=INFO source=images.go:737 msg="total unused blobs removed: 0"
  5. time=2024-07-08T18:24:27.830+08:00 level=INFO source=routes.go:1111 msg="Listening on [::]:11434 (version 0.1.48)"
  6. time=2024-07-08T18:24:27.830+08:00 level=INFO source=payload.go:30 msg="extracting embedded files" dir=/tmp/ollama2414166698/runners
  7. 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]"
  8. 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 使用的大模型

本示例为了节省时间,采用阿里开源的 qwen2 1.5b 小尺寸模型作为测试模型。
  1. kubectl exec -it ollama-79688d46b8-vxmhg -- ollama pull qwen2:1.5b
复制代码
正确执行输出结果如下:
  1. [root@ksp-control-1 ~]# kubectl exec -it ollama-79688d46b8-vxmhg -- ollama pull qwen2:1.5b
  2. pulling manifest
  3. pulling 405b56374e02... 100% ▕█████████████████████████████████████████████████████▏ 934 MB
  4. pulling 62fbfd9ed093... 100% ▕█████████████████████████████████████████████████████▏  182 B
  5. pulling c156170b718e... 100% ▕█████████████████████████████████████████████████████▏  11 KB
  6. pulling f02dd72bb242... 100% ▕█████████████████████████████████████████████████████▏   59 B
  7. pulling c9f5e9ffbc5f... 100% ▕█████████████████████████████████████████████████████▏  485 B
  8. verifying sha256 digest
  9. writing manifest
  10. removing any unused layers
  11. success
复制代码
ksp-gpu-worker-1 节点执行下面的查看命令
  1. $ ls -R /data/openebs/local/ollama/
  2. /data/openebs/local/ollama/:
  3. id_ed25519  id_ed25519.pub  models
  4. /data/openebs/local/ollama/models:
  5. blobs  manifests
  6. /data/openebs/local/ollama/models/blobs:
  7. sha256-405b56374e02b21122ae1469db646be0617c02928fd78e246723ebbb98dbca3e
  8. sha256-62fbfd9ed093d6e5ac83190c86eec5369317919f4b149598d2dbb38900e9faef
  9. sha256-c156170b718ec29139d3653d40ed1986fd92fb7e0959b5c71f3c48f62e6636f4
  10. sha256-c9f5e9ffbc5f14febb85d242942bd3d674a8e4c762aaab034ec88d6ba839b596
  11. sha256-f02dd72bb2423204352eabc5637b44d79d17f109fdb510a7c51455892aa2d216
  12. /data/openebs/local/ollama/models/manifests:
  13. registry.ollama.ai
  14. /data/openebs/local/ollama/models/manifests/registry.ollama.ai:
  15. library
  16. /data/openebs/local/ollama/models/manifests/registry.ollama.ai/library:
  17. qwen2
  18. /data/openebs/local/ollama/models/manifests/registry.ollama.ai/library/qwen2:
  19. 1.5b
复制代码
6.4 模型能力测试

  1. curl http://192.168.9.91:31434/api/chat -d '{
  2.   "model": "qwen2:1.5b",
  3.   "messages": [
  4.     { "role": "user", "content": "用20个字,介绍你自己" }
  5.   ]
  6. }'
复制代码
  1. $ curl http://192.168.9.91:31434/api/chat -d '{
  2.   "model": "qwen2:1.5b",
  3.   "messages": [
  4.     { "role": "user", "content": "用20个字,介绍你自己" }
  5.   ]
  6. }'{"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 分配信息

  1. $ kubectl describe node ksp-gpu-worker-1 | grep "Allocated resources" -A 9
  2. Allocated resources:
  3.   (Total limits may be over 100 percent, i.e., overcommitted.)
  4.   Resource           Requests        Limits
  5.   --------           --------        ------
  6.   cpu                487m (13%)      2 (55%)
  7.   memory             315115520 (2%)  800Mi (5%)
  8.   ephemeral-storage  0 (0%)          0 (0%)
  9.   hugepages-1Gi      0 (0%)          0 (0%)
  10.   hugepages-2Mi      0 (0%)          0 (0%)
  11.   nvidia.com/gpu     1               1
复制代码
在 Worker 节点上执行  nvidia-smi -l  观察 GPU 的使用情况。

免责声明:

本文由博客一文多发平台 OpenWrite 发布!

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4