在 Kubernetes(k8s)集群中部署AI大模型 ollama并启用GPU加速

打印 上一主题 下一主题

主题 676|帖子 676|积分 2028

一、弁言

在本教程中,你将会举行以下利用:

  • 使用 K3s 在按需实例上搭建单节点 Kubernetes 集群。
  • 安装 NVIDIA GPU Operator,以便集群能够使用实例的 GPU。
  • 在集群中部署 Ollama 来提供 llama3模型服务。
    终极实如今 Kubernetes(k8s)集群中部署AI大模型 ollama并启用GPU加速。
二、搭建单节点 Kubernetes 集群


  • 启动实例:如果尚未利用,可使用仪表板或云 API 启动一个实例,然后通过 SSH 连接到该实例。
  • 安装 K3s(Kubernetes):运行以下下令来安装 K3s:
  1. curl -sfL https://get.k3s.io | K3S_KUBECONFIG_MODE=644 sh -s - --default-runtime=nvidia
复制代码

  • 验证集群状态:通过运行以下下令验证 Kubernetes 集群是否准备就绪:
  1. k3s kubectl get nodes
复制代码
你应该会看到类似如下的输出:
  1. NAME              STATUS   ROLES                  AGE    VERSION
  2. 104-171-203-164   Ready    control-plane,master   100s   v1.30.5+k3s1
复制代码

  • 安装 socat:运行以下下令安装 socat,它在后续步骤中用于启用端口转发:
  1. sudo apt -y install socat
复制代码
三、安装 NVIDIA GPU Operator

在 Kubernetes 集群中运行以下下令来安装 NVIDIA GPU Operator:
  1. cat <<EOF | k3s kubectl apply -f -
  2. apiVersion: v1
  3. kind: Namespace
  4. metadata:
  5.   name: gpu-operator
  6. ---
  7. apiVersion: helm.cattle.io/v1
  8. kind: HelmChart
  9. metadata:
  10.   name: gpu-operator
  11.   namespace: gpu-operator
  12. spec:
  13.   repo: https://helm.ngc.nvidia.com/nvidia
  14.   chart: gpu-operator
  15.   targetNamespace: gpu-operator
  16. EOF
复制代码
几分钟后,通过运行以下下令验证集群是否检测到实例的 GPU:
  1. k3s kubectl describe nodes | grep nvidia.com
复制代码
你应该会看到类似如下的输出,表明集群检测到了相应的 GPU 信息:
  1. nvidia.com/cuda.driver-version.full=535.129.03
  2. nvidia.com/cuda.driver-version.major=535
  3. nvidia.com/cuda.driver-version.minor=129
  4. nvidia.com/cuda.driver-version.revision=03
  5. nvidia.com/cuda.driver.major=535
  6. nvidia.com/cuda.driver.minor=129
  7. nvidia.com/cuda.driver.rev=03
  8. nvidia.com/cuda.runtime-version.full=12.2
  9. nvidia.com/cuda.runtime-version.major=12
  10. nvidia.com/cuda.runtime-version.minor=2
  11. nvidia.com/cuda.runtime.major=12
  12. nvidia.com/cuda.runtime.minor=2
  13. nvidia.com/gfd.timestamp=1727461913
  14. nvidia.com/gpu-driver-upgrade-state=upgrade-done
  15. nvidia.com/gpu.compute.major=7
  16. nvidia.com/gpu.compute.minor=0
  17. nvidia.com/gpu.count=8
  18. nvidia.com/gpu.deploy.container-toolkit=true
  19. nvidia.com/gpu.deploy.dcgm=true
  20. nvidia.com/gpu.deploy.dcgm-exporter=true
  21. nvidia.com/gpu.deploy.device-plugin=true
  22. nvidia.com/gpu.deploy.driver=pre-installed
  23. nvidia.com/gpu.deploy.gpu-feature-discovery=true
  24. nvidia.com/gpu.deploy.node-status-exporter=true
  25. nvidia.com/gpu.deploy.operator-validator=true
  26. nvidia.com/gpu.family=volta
  27. nvidia.com/gpu.machine=Standard-PC-Q35-ICH9-2009
  28. nvidia.com/gpu.memory=16384
  29. nvidia.com/gpu.mode=compute
  30. nvidia.com/gpu.present=true
  31. nvidia.com/gpu.product=Tesla-V100-SXM2-16GB
  32. nvidia.com/gpu.replicas=1
  33. nvidia.com/gpu.sharing-strategy=none
  34. nvidia.com/mig.capable=false
  35. nvidia.com/mig.strategy=single
  36. nvidia.com/mps.capable=false
  37. nvidia.com/vgpu.present=false
  38. nvidia.com/gpu-driver-upgrade-enabled: true
复制代码
其中,nvidia.com/gpu.count=8 表示集群检测到 8 个 GPU,nvidia.com/gpu.product=Tesla-V100-SXM2-16GB 表明检测到的 GPU 是 Tesla V100 SXM2 16GB GPU。
留意:在本教程中,Ollama 只会使用 1 个 GPU。
四、在 Kubernetes 集群中部署 Ollama


  • 启动 Ollama 服务器:在 Kubernetes 集群中运行以下下令来启动 Ollama 服务器:
  1. cat <<EOF | k3s kubectl apply -f -
  2. apiVersion: v1
  3. kind: Namespace
  4. metadata:
  5.   name: ollama
  6. ---
  7. apiVersion: apps/v1
  8. kind: Deployment
  9. metadata:
  10.   name: ollama
  11.   namespace: ollama
  12. spec:
  13.   strategy:
  14.     type: Recreate
  15.   selector:
  16.     matchLabels:
  17.       name: ollama
  18.   template:
  19.     metadata:
  20.       labels:
  21.         name: ollama
  22.     spec:
  23.       containers:
  24.       - name: ollama
  25.         image: ollama/ollama:latest
  26.         env:
  27.         - name: PATH
  28.           value: /usr/local/nvidia/bin:/usr/local/cuda/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
  29.         - name: LD_LIBRARY_PATH
  30.           value: /usr/local/nvidia/lib:/usr/local/nvidia/lib64
  31.         - name: NVIDIA_DRIVER_CAPABILITIES
  32.           value: compute,utility
  33.         ports:
  34.         - name: http
  35.           containerPort: 11434
  36.           protocol: TCP
  37.         resources:
  38.           limits:
  39.             nvidia.com/gpu: 1
  40.       tolerations:
  41.       - key: nvidia.com/gpu
  42.         operator: Exists
  43.         effect: NoSchedule
  44. ---
  45. apiVersion: v1
  46. kind: Service
  47. metadata:
  48.   name: ollama
  49.   namespace: ollama
  50. spec:
  51.   type: ClusterIP
  52.   selector:
  53.     name: ollama
  54.   ports:
  55.   - port: 11434
  56.     name: http
  57.     targetPort: http
  58.     protocol: TCP
  59. EOF
复制代码

  • 验证 Ollama 服务器状态:几分钟后,运行以下下令验证 Ollama 服务器是否接受连接并正在使用 GPU:
  1. kubectl logs -n ollama -l name=ollama
复制代码
你应该会看到类似如下的输出,最后一行表明 Ollama 正在使用单个 Tesla V100 - SXM2 - 16GB GPU:
  1. 2024/09/27 18:51:55 routes.go:1153: INFO server config env="map[CUDA_VISIBLE_DEVICES: GPU_DEVICE_ORDINAL: HIP_VISIBLE_DEVICES: HSA_OVERRIDE_GFX_VERSION: HTTPS_PROXY: HTTP_PROXY: NO_PROXY: OLLAMA_DEBUG:false OLLAMA_FLASH_ATTENTION:false OLLAMA_GPU_OVERHEAD:0 OLLAMA_HOST:http://0.0.0.0:11434 OLLAMA_INTEL_GPU:false OLLAMA_KEEP_ALIVE:5m0s OLLAMA_LLM_LIBRARY: OLLAMA_LOAD_TIMEOUT:5m0s OLLAMA_MAX_LOADED_MODELS:0 OLLAMA_MAX_QUEUE:512 OLLAMA_MODELS:/root/.ollama/models OLLAMA_NOHISTORY:false OLLAMA_NOPRUNE:false OLLAMA_NUM_PARALLEL:0 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_SCHED_SPREAD:false OLLAMA_TMPDIR: ROCR_VISIBLE_DEVICES: http_proxy: https_proxy: no_proxy:]"
  2. time=2024-09-27T18:51:55.719Z level=INFO source=images.go:753 msg="total blobs: 0"
  3. time=2024-09-27T18:51:55.719Z level=INFO source=images.go:760 msg="total unused blobs removed: 0"
  4. time=2024-09-27T18:51:55.719Z level=INFO source=routes.go:1200 msg="Listening on [::]:11434 (version 0.3.12)"
  5. time=2024-09-27T18:51:55.720Z level=INFO source=common.go:49 msg="Dynamic LLM libraries" runners="[cpu_avx cpu_avx2 cuda_v11 cuda_v12 cpu]"
  6. time=2024-09-27T18:51:55.720Z level=INFO source=gpu.go:199 msg="looking for compatible GPUs"
  7. time=2024-09-27T18:51:55.942Z level=INFO source=types.go:107 msg="inference compute" id=GPU-d8c505a1-8af4-7ce4-517d-4f57fa576097 library=cuda variant=v12 compute=7.0 driver=12.2 name="Tesla V100-SXM2-16GB" total="15.8 GiB" available="15.5 GiB"
复制代码
五、访问 Ollama 服务

进入 Ollama 服务对应的 pod 内部,执行 ollama run llama3 下令举行模型安装。若提前构建了模型的镜像并在部署步骤中举行了部署,则可省略此手动安装步骤。
模型安装完成后,在 namespace 下的其他 pod 中可通过 curl 下令向 Ollama 服务哀求已安装的模型。
例如,执行
$ curl -L 'http://ollama:11434/api/generate' -H 'Content-Type: application/json' -d '{"model": "llama3", "prompt": "如那边理职场辩论", "format": "json", "stream": false}'
下令,即可获取模型对职场辩论处置惩罚相关题目的回答,展示了 Ollama 服务在 Kubernetes 环境中正常运行并能够对外提供大模型服务的能力。

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

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

诗林

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表