
在 Kubernetes(k8s)集群中部署AI大模型 ollama并启用GPU加速
进入 Ollama 服务对应的 pod 内部,执行 ollama run llama3 命令进行模型安装。若提前构建了模型的镜像并在部署步骤中进行了部署,则可省略此手动安装步骤。命令,即可获取模型对职场冲突处理相关问题的回答,展示了 Ollama 服务在 Kubernetes 环境中正常运行并能够对外提供大模型服务的能力。模型安装完成后,在 namespace 下的其他 pod 中可通过 curl
一、引言
在本教程中,你将会进行以下操作:
- 使用 K3s 在按需实例上搭建单节点 Kubernetes 集群。
- 安装 NVIDIA GPU Operator,以便集群能够使用实例的 GPU。
- 在集群中部署 Ollama 来提供 llama3模型服务。
最终实现在 Kubernetes(k8s)集群中部署AI大模型 ollama并启用GPU加速。
二、搭建单节点 Kubernetes 集群
- 启动实例:如果尚未操作,可使用仪表板或云 API 启动一个实例,然后通过 SSH 连接到该实例。
- 安装 K3s(Kubernetes):运行以下命令来安装 K3s:
curl -sfL https://get.k3s.io | K3S_KUBECONFIG_MODE=644 sh -s - --default-runtime=nvidia
- 验证集群状态:通过运行以下命令验证 Kubernetes 集群是否准备就绪:
k3s kubectl get nodes
你应该会看到类似如下的输出:
NAME STATUS ROLES AGE VERSION
104-171-203-164 Ready control-plane,master 100s v1.30.5+k3s1
- 安装 socat:运行以下命令安装 socat,它在后续步骤中用于启用端口转发:
sudo apt -y install socat
三、安装 NVIDIA GPU Operator
在 Kubernetes 集群中运行以下命令来安装 NVIDIA GPU Operator:
cat <<EOF | k3s kubectl apply -f -
apiVersion: v1
kind: Namespace
metadata:
name: gpu-operator
---
apiVersion: helm.cattle.io/v1
kind: HelmChart
metadata:
name: gpu-operator
namespace: gpu-operator
spec:
repo: https://helm.ngc.nvidia.com/nvidia
chart: gpu-operator
targetNamespace: gpu-operator
EOF
几分钟后,通过运行以下命令验证集群是否检测到实例的 GPU:
k3s kubectl describe nodes | grep nvidia.com
你应该会看到类似如下的输出,表明集群检测到了相应的 GPU 信息:
nvidia.com/cuda.driver-version.full=535.129.03
nvidia.com/cuda.driver-version.major=535
nvidia.com/cuda.driver-version.minor=129
nvidia.com/cuda.driver-version.revision=03
nvidia.com/cuda.driver.major=535
nvidia.com/cuda.driver.minor=129
nvidia.com/cuda.driver.rev=03
nvidia.com/cuda.runtime-version.full=12.2
nvidia.com/cuda.runtime-version.major=12
nvidia.com/cuda.runtime-version.minor=2
nvidia.com/cuda.runtime.major=12
nvidia.com/cuda.runtime.minor=2
nvidia.com/gfd.timestamp=1727461913
nvidia.com/gpu-driver-upgrade-state=upgrade-done
nvidia.com/gpu.compute.major=7
nvidia.com/gpu.compute.minor=0
nvidia.com/gpu.count=8
nvidia.com/gpu.deploy.container-toolkit=true
nvidia.com/gpu.deploy.dcgm=true
nvidia.com/gpu.deploy.dcgm-exporter=true
nvidia.com/gpu.deploy.device-plugin=true
nvidia.com/gpu.deploy.driver=pre-installed
nvidia.com/gpu.deploy.gpu-feature-discovery=true
nvidia.com/gpu.deploy.node-status-exporter=true
nvidia.com/gpu.deploy.operator-validator=true
nvidia.com/gpu.family=volta
nvidia.com/gpu.machine=Standard-PC-Q35-ICH9-2009
nvidia.com/gpu.memory=16384
nvidia.com/gpu.mode=compute
nvidia.com/gpu.present=true
nvidia.com/gpu.product=Tesla-V100-SXM2-16GB
nvidia.com/gpu.replicas=1
nvidia.com/gpu.sharing-strategy=none
nvidia.com/mig.capable=false
nvidia.com/mig.strategy=single
nvidia.com/mps.capable=false
nvidia.com/vgpu.present=false
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 服务器:
cat <<EOF | k3s kubectl apply -f -
apiVersion: v1
kind: Namespace
metadata:
name: ollama
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: ollama
namespace: ollama
spec:
strategy:
type: Recreate
selector:
matchLabels:
name: ollama
template:
metadata:
labels:
name: ollama
spec:
containers:
- name: ollama
image: ollama/ollama:latest
env:
- name: PATH
value: /usr/local/nvidia/bin:/usr/local/cuda/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
- name: LD_LIBRARY_PATH
value: /usr/local/nvidia/lib:/usr/local/nvidia/lib64
- name: NVIDIA_DRIVER_CAPABILITIES
value: compute,utility
ports:
- name: http
containerPort: 11434
protocol: TCP
resources:
limits:
nvidia.com/gpu: 1
tolerations:
- key: nvidia.com/gpu
operator: Exists
effect: NoSchedule
---
apiVersion: v1
kind: Service
metadata:
name: ollama
namespace: ollama
spec:
type: ClusterIP
selector:
name: ollama
ports:
- port: 11434
name: http
targetPort: http
protocol: TCP
EOF
- 验证 Ollama 服务器状态:几分钟后,运行以下命令验证 Ollama 服务器是否接受连接并正在使用 GPU:
kubectl logs -n ollama -l name=ollama
你应该会看到类似如下的输出,最后一行表明 Ollama 正在使用单个 Tesla V100 - SXM2 - 16GB GPU:
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:]"
time=2024-09-27T18:51:55.719Z level=INFO source=images.go:753 msg="total blobs: 0"
time=2024-09-27T18:51:55.719Z level=INFO source=images.go:760 msg="total unused blobs removed: 0"
time=2024-09-27T18:51:55.719Z level=INFO source=routes.go:1200 msg="Listening on [::]:11434 (version 0.3.12)"
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]"
time=2024-09-27T18:51:55.720Z level=INFO source=gpu.go:199 msg="looking for compatible GPUs"
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 环境中正常运行并能够对外提供大模型服务的能力。
更多推荐
所有评论(0)