在Kubernetes中用NVIDIA GPU运行自己的OLLMAMA服务

2024/12/30 21:03:22

本文主要是介绍在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”。



这篇关于在Kubernetes中用NVIDIA GPU运行自己的OLLMAMA服务的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!


扫一扫关注最新编程教程