继续浏览精彩内容
慕课网APP
程序员的梦工厂
打开
继续
感谢您的支持,我会继续努力的
赞赏金额会直接到老师账户
将二维码发送给自己后长按识别
微信支付
支付宝支付

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

慕桂英3389331
关注TA
已关注
手记 377
粉丝 43
获赞 187

在我的上一篇文章中,我分享了如何在云 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”。

打开App,阅读手记
0人推荐
发表评论
随时随地看视频慕课网APP