在Kubernetes中用NVIDIA GPU运行自己的OLLMAMA服务
在我的上一篇文章中,我分享了如何在云 Kubernetes (K8s) 集群中托管自己的 Ollama 服务。这次,让我们更上一层楼,通过 GPU 来提升你的 Ollama 服务。
我会用和之前一样的设置,并强调所做的改动。首先,在你的K8s集群中,你需要添加一个带有GPU的节点。我的集群位于Google Cloud上,我在那里添加了一个带有NVIDIA T4 GPU的节点。
安装 GPU 驱动程序关于如何使用包管理器安装显卡驱动的信息,请参阅以下链接(点击此处):NVIDIA 驱动安装快速入门指南。或者,您还可以从NVIDIA 官方驱动页面(点击此处)下载.run
安装包并进行安装。
$ nvidia-smi
2024年8月16日 星期五 21:54:53
+---------------------------------------------------------------------------------------+
| NVIDIA-SMI 535.183.01 驱动版本: 535.183.01 CUDA 版本: 12.2 |
|-----------------------------------------+----------------------+----------------------+
| GPU 名称 持久性-M | 总线-ID 显示输出-A | 易失性未校正错误ECC |
| 风扇速度 温度 性能 功耗:使用/最大值 | 内存使用 | GPU利用率 计算 |
| | | MIG |
|=========================================+======================+======================|
| 0 Tesla T4 关闭 | 00000000:00:04.0 关闭 | 0 |
| N/A 67°C P0 29W / 70W | 6104MiB / 15360MiB | 0% 默认 |
| | | N/A |
+-----------------------------------------+----------------------+----------------------+
+---------------------------------------------------------------------------------------+
| 进程: |
| GPU GI CI PID 类型: 进程名称: GPU 内存使用 |
| ID ID |
|=======================================================================================|
| 0 N/A N/A 81441 C ...unners/cuda_v11/ollama_llama_server 6100MiB |
+---------------------------------------------------------------------------------------+
安装NVIDIA容器工具包(步骤)
安装NVIDIA的容器工具包(NVIDIA Container Toolkit):NVIDIA Container Toolkit
检查你的容器运行时的状态,使用 kubectl get nodes -o wide
。在我的情况里是 containerd://1.7.12
$ kubectl get nodes -o wide
NAME 状态: 角色: 年龄: 版本: 内部IP: 外部IP: 操作系统镜像: 内核版本: 容器运行时:
ollama-gpu 就绪 无 105m v1.30.3 10.148.0.2 无 Ubuntu 20.04.6 LTS 5.15.0-1066-gcp containerd://1.7.12
接下来,按照此处的指引安装NVIDIA容器工具包。
使用 nvidia-ctk
命令在 GPU 节点上进行容器运行时的设置
运行如下命令以配置containerd运行时使用NVIDIA容器工具包: $ sudo nvidia-ctk runtime configure --runtime=containerd
nvidia-ctk
命令会修改主机上的 /etc/containerd/config.toml
文件,使其适合使用 NVIDIA 容器运行时,这样 containerd
就可以使用该运行时了。
有效的处理器配置在运行时部分中设置。
[plugins."io.containerd.grpc.v1.cri".containerd.runtimes.${HANDLER_NAME}] /* ${HANDLER_NAME} 是一个变量或占位符 */
/* 以下配置用于指定插件的运行时环境 */
/* 这是一个插件配置中的部分 */
检查 config.toml
,处理器是 nvidia
。我们将使用该处理器在 Runtime 类中。
$ cat /etc/containerd/config.toml
disabled_plugins = []
imports = []
oom_score = 0
plugin_dir = ""
required_plugins = []
root = "/var/lib/containerd"
state = "/run/containerd"
version = 2
[plugins]
[plugins."io.containerd.grpc.v1.cri"]
[plugins."io.containerd.grpc.v1.cri".containerd]
[plugins."io.containerd.grpc.v1.cri".containerd.runtimes]
[plugins."io.containerd.grpc.v1.cri".containerd.runtimes.nvidia]
base_runtime_spec = ""
container_annotations = []
pod_annotations = []
privileged_without_host_devices = false
runtime_engine = ""
runtime_root = ""
runtime_type = "io.containerd.runc.v2"
[plugins."io.containerd.grpc.v1.cri".containerd.runtimes.nvidia.options]
BinaryName = "/usr/bin/nvidia-container-runtime"
CriuImagePath = ""
CriuPath = ""
CriuWorkPath = ""
IoGid = 0
IoUid = 0
NoNewKeyring = false
NoPivotRoot = false
Root = ""
ShimCgroup = ""
SystemdCgroup = true
...
创建运行时环境类(Runtime 类)
使用 YAML 文件来创建 nvidia
运行时类型
apiVersion: node.k8s.io/v1
kind: RuntimeClass
metadata:
name: nvidia
handler: nvidia
# 这是一个定义了nvidia作为运行时类处理器的k8s配置片段。
创建 OLLAMA 服务吧
在 pod spec 中指定 runtimeClassName: nvidia
,并将节点分配到名为 nodeName: ollama-gpu
的 GPU 节点上。下面是一个示例 YAML 文件:
apiVersion: v1
kind: Pod
metadata:
name: 示例 Pod
spec:
runtimeClassName: nvidia
nodeName: ollama-gpu
containers:
- name: 示例容器
image: tensorflow:latest-gpu
apiVersion: apps/v1
kind: Deployment
metadata:
name: ollama
namespace: ollama
spec:
replicas: 1
selector:
matchLabels:
name: ollama
template:
metadata:
labels:
name: ollama
spec:
runtimeClassName: nvidia
nodeName: ollama-gpu
containers:
- name: ollama
image: ollama/ollama:0.3.5
volumeMounts:
- mountPath: /root/.ollama
name: ollama-storage
ports:
- name: http
containerPort: 11434
protocol: TCP
env:
- name: PRELOAD_MODELS
value: "llama3.1"
- name: OLLAMA_KEEP_ALIVE
value: "12h"
lifecycle:
postStart:
exec:
command: ["/bin/sh", "-c", "for model in $PRELOAD_MODELS; do ollama run $model \"\"; done"]
volumes:
- hostPath:
path: /opt/ollama
type: DirectoryOrCreate
name: ollama-storage
---
apiVersion: v1
kind: Service
metadata:
name: ollama
namespace: ollama
spec:
type: ClusterIP
selector:
name: ollama
ports:
- port: 80
name: http
targetPort: http
protocol: TCP
检查 OLLAMA 是否正在运行
检查一个 OLLAMA pod 内的运行情况,应该显示 100% GPU
使用率:
$ kubectl get po -n ollama
NAME READY STATUS RESTARTS AGE
ollama-55ddc567bd-zmd9f 1/1 Running 0 177m
$ kubectl exec -it -n ollama ollama-55ddc567bd-zmd9f -- bash
root@ollama-55ddc567bd-zmd9f:/# ollama ps
NAME ID 6.7 GB 100% GPU 从现在起11小时后
SIZE UNTIL
就这样,搞定啦!你现在有了一个在带有GPU的K8s上运行的托管的OLLAMA服务。
你可以使用WebUI来测试,并享受流畅体验。如果有上下文明确指Python库而非API,则维持“Python库”。否则建议改为“Python库或Python API”。
共同学习,写下你的评论
评论加载中...
作者其他优质文章