尝试在 Kubernetes 集群上用阿里云 GPU 实例部署 Ollama + DeekSeek-R1

news/2025/2/19 17:47:29/文章来源:https://www.cnblogs.com/dudu/p/18713973

在前一篇博文中尝试了使用阿里云 GPU 实例 ECS 单机部署了 DeekSeek-R1 7b 模型 。

这篇博文记录一下在 k8s 集群上用阿里云 GPU 实例部署 DeekSeek R1 大模型的尝试过程,部署的也是 deepseek-r1:7b 模型。

先准备一台阿里云 GPU 实例,选用了共享型 GPU 实例 sgn7i,8核31G,4G显存。

在阿里云 ECS 控制台创建实例后,将这台服务器加入已有的 k8s 集群并设置为 drain 状态,先不让部署任何 pod 进来。

NAME                 STATUS                     ROLES           AGE      VERSION
kube-deekseek-r1     Ready,SchedulingDisabled   <none>          45s      v1.27.1

通过 k8s 的 taint 功能将这台服务器设置为专用于部署 deepseek r1

kubectl taint nodes kube-deekseek-r1 dedicated=deepseek:NoSchedule

并且给节点打上标签

kubectl label node kube-deekseek-r1 dedicated=deepseek

然后解除 drain 状态

kubectl uncordon kube-deekseek-r1

到此,部署 deepseek r1 的节点就准备好了。

接下来准备容器镜像——包含 deepseek-r1:7b 模型的 ollama 镜像

继续用 docker hub 上的 mazurkatarzyna/ollama-deepseek-r1-7b 镜像,将之推送至内部用的镜像仓库,以方便 k8s 节点下载镜像

docker tag mazurkatarzyna/ollama-deepseek-r1-7b .../cnblogs/ollama-deepseek-r1-7b
docker push registry-vpc.cn-hangzhou.aliyuncs.com/cnblogs/ollama-deepseek-r1-7b

部署采用 Helm chart for Ollama on Kubernetes https://github.com/otwld/ollama-helm

添加 ollama-helm helm repository

helm repo add ollama-helm https://otwld.github.io/ollama-helm/
helm repo update

准备 helm 清单文件 ollama-deepseek-values.yaml

image:repository: x.x.x/cnblogs/ollama-deepseek-r1-7btag: latest imagePullSecrets: - name: regcredpodLabels:app: ollama-deepseekollama:mountPath: "/root/.empty"tolerations:- key: "dedicated"operator: "Equal"value: "deepseek"effect: "NoSchedule"nodeSelector:dedicated: deepseek

注:上面的 mountPath: "/root/.empty" 是为了避免 mount /root/.ollama,因为镜像中已经包含了 deepseek-r1:7b 模型。

运行 helm 命令部署

helm upgrade --install ollama-deepseek ollama-helm/ollama --values ollam-deepseek-values.yaml

部署成功,pod 正常启动

# kubectl get pods -l app=ollama-deepseek    
NAME                              READY   STATUS    RESTARTS   AGE
ollama-deepseek-755d5659b-ztt4x   1/1     Running   0          6m3s

容器中可以看到 deepseek-r1:7b 模型

# kubectl exec -it deployment/ollama-deepseek -- ollama list
NAME              ID              SIZE      MODIFIED    
deepseek-r1:7b    0a8c26691023    4.7 GB    2 weeks ago 

进入其他 pod 用 curl 命令请求 ollama api

kubectl exec -it deployment/q-web -- curl http://ollama-deepseek:11434/api/tags | jq

响应内容如下,可以看到 deepseek-r1:7b 模型的信息

{"models": [{"name": "deepseek-r1:7b","model": "deepseek-r1:7b","modified_at": "2025-01-29T11:07:32Z","size": 4683075271,"digest": "0a8c266910232fd3291e71e5ba1e058cc5af9d411192cf88b6d30e92b6e73163","details": {"parent_model": "","format": "gguf","family": "qwen2","families": ["qwen2"],"parameter_size": "7.6B","quantization_level": "Q4_K_M"}}]
}

还可以通过下面的命令查看更多模型信息

kubectl exec -it deployment/q-web -- curl http://ollama-deepseek:11434/api/show -d '{ "model": "deepseek-r1:7b" }' | jq

查看正在运行的模型

kubectl exec -it deployment/q-web -- curl http://ollama-deepseek:11434/api/ps | jq

发现没有模型在运行

{"models": []
}

用 ollama run 命令手动运行模型

kubectl exec -it deployment/ollama-deepseek -- ollama run deepseek-r1:7b 

然后在命令行下就可以和 deepseek-r1:7b 模型对话了

ollama ps 命令查看一下模型运行信息

# kubectl exec -it deployment/ollama-deepseek -- ollama ps                
NAME              ID              SIZE      PROCESSOR    UNTIL              
deepseek-r1:7b    0a8c26691023    5.5 GB    100% CPU     3 minutes from now   

发现用的还是 CPU。

改进 helm 部署清单文件,启用 GPU 支持,并且容器启动时就运行 deepseek-r1:7b 模型

ollama:mountPath: "/root/.empty"gpu:enabled: truemodels:run:- deepseek-r1:7b

用新的清单部署后,pod 无法启动,错误日志如下:

FailedScheduling  1 Insufficient nvidia.com/gpu

需要安装 NVIDIA Container Toolkit⁠,k8s 节点没有使用 docker,用的是 containerd,通过下面的命令完成安装

curl -fsSL https://nvidia.github.io/libnvidia-container/gpgkey \| sudo gpg --dearmor -o /usr/share/keyrings/nvidia-container-toolkit-keyring.gpg
curl -s -L https://nvidia.github.io/libnvidia-container/stable/deb/nvidia-container-toolkit.list \| sed 's#deb https://#deb [signed-by=/usr/share/keyrings/nvidia-container-toolkit-keyring.gpg] https://#g' \| sudo tee /etc/apt/sources.list.d/nvidia-container-toolkit.list
sudo apt-get update
sudo apt-get install -y nvidia-container-toolkit
sudo nvidia-ctk runtime configure --runtime=containerd
sudo systemctl restart containerd

安装后问题依旧,网上搜了一下,找到 github 仓库 https://github.com/NVIDIA/k8s-device-plugin ,还需要安装 NVIDIA device plugin for Kubernetes

通过下面的命令完成安装

helm repo add nvdp https://nvidia.github.io/k8s-device-plugin
helm repo update
helm upgrade -i nvdp nvdp/nvidia-device-plugin \--namespace nvidia-device-plugin \--create-namespace \--version 0.17.0

安装后还是问题依旧。

在网上找到一篇参考博文 A Practical Guide to Running NVIDIA GPUs on Kubernetes,文章中没有安装 NVIDIA device plugin for Kubernetes,安装的是 NVIIDA GPU Operator,准备换成安装 Operator 试试。

现在根据这篇博文检查一下 NVIDIA GPU 驱动是否正常安装。

lspci 命令查看 nvidia 设备型号

# sudo lspci | grep NVIDIA
00:07.0 VGA compatible controller: NVIDIA Corporation Device 2236 (rev a1)

nvidia-smi 命令查询驱动版本

nvidia-smi --query-gpu=driver_version --format=csv,noheader
nvidia-smi: command not found

这才发现驱动没有安装,这台阿里云 ECS 云服务器用的是共享型 GPU实例 ecs.sgn7i-vws,通过云助手安装 GRID 驱动,即下面的安装命令

acs-plugin-manager --exec --plugin grid_driver_install

安装完成之后就可以查询到驱动版本号了

# nvidia-smi --query-gpu=driver_version --format=csv,noheader
470.239.06

通过以下命令进一步检查驱动信息

# cat /proc/driver/nvidia/version
NVRM version: NVIDIA UNIX x86_64 Kernel Module  470.239.06  Sat Feb  3 06:03:07 UTC 2024
GCC version:  gcc version 9.4.0 (Ubuntu 9.4.0-1ubuntu1~20.04.1) # ls /dev/ | grep 'nvidia[0-9]\+'
nvidia0

驱动确认安装好了。

再确认一下 nvidia-container-toolkit 是否安装成功,运行下面的命令启动容易进行检查

nerdctl run -it --rm --gpus all nvidia/cuda:12.3.1-base-ubuntu20.04 nvidia-smi

确认已安装成功。

驱动的问题解决了,但 pod 无法启动的问题还是依旧。

看来只能试试安装 NVIIDA GPU Operator 了,先卸载 helm 安装的 NVIDIA device plugin

在安装 NVIIDA GPU Operator 之前突然想到有更简单的解决方法。

在 ollama-helm 清单中将 ollama.gpu.enabled 设置为 true,仅仅是启用下面的配置,选择声明了 nvidia.com/gpu taint 的节点

tolerations:
- effect: NoSchedulekey: nvidia.com/gpuoperator: Exists

我们这里部署的阿里云 GPU 实例本来就专用于部署 ollama+deepseek-r1,已经通过 taints/tolerations 完成了选择,不需要再选择了,修改清单,取消 ollama.gpu.enabled。

ollama:gpu:enabled: false

更新部署后 pod 启动成功了,但现在还是没有使用 gpu

# kubectl exec -it deployment/ollama-deepseek -- ollama ps
NAME              ID              SIZE      PROCESSOR    UNTIL              
deepseek-r1:7b    0a8c26691023    5.5 GB    100% CPU     4 minutes from now 

而使用 gpu,只需要运行容器默认使用 nvidia runtime 就行了。

通过参考博文中的下面这段话

There’s also an option to set the NVIDIA runtime as the default runtime using --nvidia-set-as-default.

知道了一行命令就能搞定

nvidia-ctk runtime configure --runtime=containerd  --set-as-default=true

运行这个命令会修改 /etc/containerd/config.tomldefault_runtime_name 配置,将 runc 改为 nvidia

default_runtime_name = "nvidia"

哦,一行命令不够,还需要在 gpu 节点上重启 containerd 并在 master 节点时重新部署 pod

systemctl restart containerd
kubectl rollout restart deploy ollama-deepseek

pod 启动成功后就可以看到使用了 gpu

# kubectl exec -it deployment/ollama-deepseek -- ollama ps
NAME              ID              SIZE      PROCESSOR          UNTIL              
deepseek-r1:7b    0a8c26691023    6.0 GB    38%/62% CPU/GPU    2 minutes from now

通过命令行与 deepseek-r1:7b 对话测试一下

对话成功,终于搞定!

参考资料:

  • A Practical Guide to Running NVIDIA GPUs on Kubernetes

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/884478.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于SOA海鸥优化算法的三维曲面最高点搜索matlab仿真

1.程序功能描述 基于SOA海鸥优化算法的三维曲面最高点搜索matlab仿真,输出收敛曲线以及三维曲面最高点搜索结果。 2.测试软件版本以及运行结果展示MATLAB2022A版本运行 3.核心程序for ij = 1:Mgen% 初始化本代最佳适应度及对应解yfit = 0.0;xbest = zeros(1,2); % 初…

Tomasulo 调度算法实现架构分析

虽然早在 1967 年就已经提出了 Tomasulo 调度算法 [1],但网上仍很少找到关于落到模块粒度的教程文档。从零复现一遍成本太大,因此用画原理图的方式做思想实验,尝试理解 Tomasulo 在电路上如何实现。 处理数据 首先明细几个概念指令(Instruction):包含指令类型(ADD、MUL、…

最新VMware Workstation虚拟机下载并安装

[2025年]最新VMware Workstation虚拟机下载并安装 1.最新VMware Workstation下载地址 2024年5月5日之后,VMware workstation不能直接在vmware官网进行下载了,需要在broadcom博通网站上进行下载 博通收购Vmware后(将workstation免费了),如下 旧的地址点击下载的时候会跳转到…

js之prototype

var TestPrototype = function () {this.propA = 1;this.methodA = function() {return this.propA;} }TestPrototype.prototype = {methodB: function() {return this.propA;} }var objA = new TestPrototype();objA.methodA() // 1 objA.methodB() // 1JavaScript 中, 任何函…

LGP4211_1 [LNTS 2014] LCA 学习笔记

LGP4211_1 [LNTS 2014] LCA 学习笔记 本题一题多解,此处记录其树剖+线段树做法。 Luogu Link 题意简述 给出一棵 \(n\) 个结点的树,以 \(1\) 为根。令 \(dep[1]=1\)。\(m\) 次询问,每次给定 \(l,r,z\),求 \(\sum_{i=l}^r dep[\text{lca}(i,z)]\)。 \(n,m\le 5^10^4\)。 做法…

LGP4211 [LNTS 2014] LCA 学习笔记

LGP4211_1 [LNTS 2014] LCA 本题一题多解,此处记录其树剖+线段树做法。 Luogu Link 题意简述 给出一棵 \(n\) 个结点的树,以 \(1\) 为根。令 \(dep[1]=1\)。\(m\) 次询问,每次给定 \(l,r,z\),求 \(\sum_{i=l}^r dep[\text{lca}(i,z)]\)。 \(n,m\le 5^10^4\)。 做法解析 题目…

自然语言处理入门【第4章】:认知语言智能

4.1 对话与问答 4.1.1 问答系统 问答系统(Question Answering System,QA System)是人工智能与自然语言处理领域的重要研究方向,旨在通过计算机技术实现对人类自然语言提问的精准理解与高效响应。与传统的搜索引擎不同,问答系统不仅需要检索相关信息,还需对问题进行语义解…

V-Control:一个基于 .NET MAUI 的开箱即用的UI组件库

前言 今天大姚给大家分享一个基于 .NET MAUI 的开源免费、开箱即用的UI组件库:V-Control。 V-Control项目介绍 V-Control 是一个适用于 .NET MAUI 的开源(MIT license)、免费的 UI 组件库,它提供了一组开箱即用的 UI 控件,可快速搭建面向业务的应用程序界面。.NET MAUI介绍 …

[AI/GPT/LLM] 大模型评估的综述:现状、挑战与未来方向

一、背景大语言模型(LLM)的复杂性和开放性带来了诸多评估挑战。准确、全面地评估大语言模型的性能,对于确保其在实际应用中的可靠性、安全性和有效性至关重要。 本文将深入探讨大语言模型评估的现状、挑战以及未来的发展方向,旨在为相关领域的研究人员和实践者提供有价值的…

CTF-web4

一、菜狗杯TapTapTap一个js小游戏,我们在js里面找。找一会儿可以看到一串可疑代码。把它放到控制台console上,可以看到flag位置。传入php中就能拿到flag了。二、菜狗杯化零为整看代码,我们需要传入长度为一的字符拼成“大牛”。用url编码“大牛”得到 payload:/?1=%E5&…

佐证资料

一、ABB控制系统虚拟机仿真平台 二、工作过程文件三、自己梳理纯碱控制系统系统架构图四、纯碱工艺流程梳理与学习

Win32汇编学习笔记10.OD插件

原文链接:https://www.bpsend.net/thread-223-1-1.html 筛选器异常插件 被调试程序: 📎TestUnh.zip 我们用OD条试试发现,无法断下 筛选器异常 异常产生之后 异常首先会给调试器 调试器不处理就会给 SEH , SEH 不处理的话有又给调试器, 调试器不处理的话就会给筛选器 , 筛选器…