在我的上一篇文章中,我分享了如何在云 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 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 ...
使用 YAML 文件来创建 nvidia
运行时类型
apiVersion: node.k8s.io/v1 kind: RuntimeClass metadata: name: nvidia handler: nvidia # 这是一个定义了nvidia作为运行时类处理器的k8s配置片段。
在 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 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”。