基于 Kubernetes 的 Ollama DeepSeek-R1 模型部署
基于 Kubernetes 的 Ollama DeepSeek-R1 模型部署
一、理论背景
1. Ollama
Ollama是由Ollama公司开发的AI模型工具,专注于将大规模语言模型(如GPT-3、BERT、T5等)本地化部署。它的主要特点如下:
- 私有化部署:允许在本地机器上运行AI模型,避免将敏感数据上传到外部服务器。
- 支持多种语言模型:如GPT、T5等。
- 高效性:本地部署提高了对数据安全的控制。
- 易于集成:提供简单的API接口,便于与现有应用集成。
2. DeepSeek
DeepSeek是一个智能搜索和深度学习驱动的工具,旨在提升大规模数据集的处理能力,尤其是在NLP和文本数据搜索方面。它的主要特点包括:
- 深度学习驱动的搜索:通过深度学习技术优化传统的搜索引擎。
- 语义搜索:提供更精准的搜索结果。
- 大规模数据处理:适用于新闻、电商、科研等行业。
- 自学习能力:能够根据用户行为进行自我优化。
二、硬件与环境要求
1. 硬件要求
由于部署的模型是大规模的671B参数模型,建议的硬件配置如下:
- 计算资源:至少32 vCPU,推荐64 vCPU。
- 内存:至少128GB内存,推荐256GB内存。
- 存储:每个节点最好配备1TB SSD或以上存储。
- 网络要求:内部网络带宽至少10Gbps。
2. Kubernetes集群要求
- Kubernetes版本:1.20-1.30
- 集群配置:多节点部署,支持资源调度与扩展。
- GPU支持:如果需要加速计算,建议启用GPU资源。
三、部署前准备步骤
1. 获取模型Docker镜像
确保已经获取到Ollama和DeepSeek-R1的Docker镜像。使用以下命令拉取镜像:ctr -n=k8s.io images pull ollama/ollama-model:latestctr -n=k8s.io images pull deepseek-r1/deepseek-r1-model:671b如过容器运行时是docker:
docker pull ollama/ollama-model:latest
docker pull deepseek-r1/deepseek-r1-model:671b
2. 安装Nvidia 显卡 和 切换容器运行时为nvidia
Nvidia显卡,执行nvidia-smi 没有输出则说明没有装显卡驱动
国产显卡执行npu-smi info
怎么检查服务器是不是带有显卡?
lspci | grep -i nvidia
将下载的 gpu 驱动文件上传到服务器安装即可
直接安装即可,视情况加参数
chmod a+x NVIDIA-Linux-x86_64-535.154.05.run
./NVIDIA-Linux-x86_64-535.154.05.run
3.K8S中如何使用GPU资源
nvidia-docker 并不会与已经安装好的 Docker 冲突。nvidia-docker 是一个额外的工具,用于在 Docker 中更方便地使用 gpu,它与 Docker 共存并为其提供额外的功能。在安装过程中,nvidia-docker 会检测系统是否安装了 Docker,并会自动地与 Docker 进行集成,以提供对 gpu 容器的支持。因此,安装 nvidia-docker 后,可以继续使用已经安装好的 Docker 工具,并能够在 Docker 中更方便地使用 gpu。 nvidia-docker 属于旧一代的工具,适用于 docker19.3 以下版本,目前,官方推荐使用 nvidia-container-toolkit
4. 安装K8S nvidia 插件
查看某GPU节点资源情况
这说明 k8s 节点没有识别到 gpu 资源,即使当前节点有 gpu 资源
k8s 中要识别 gpu 资源,需要安装 nvidia-device-plugin 插件,注册分配 gpu 主要由 device-plugin 插件完成
官网:https://github.com/NVIDIA/k8s-device-plugin
wget https://raw.githubusercontent.com/NVIDIA/k8s-device-plugin/v0.14.1/nvidia-device-plugin.ymlvim nvidia-device-plugin.yml #该文件存在 hostpath 的卷,注意确认 kubelet 的安装路径正确.kubectl apply -f nvidia-device-plugin.yml
kubectl get pod -n kube-system | grep nvidia-device-plugin #查看 k8s 的 gpu 节点资源情况就可以显示 gpu 资源了
四、准备Kubernetes配置文件
1. Ollama部署配置
vim ollama-deployment.yaml
apiVersion: apps/v1
kind: StatefulSet
metadata:name: ollamanamespace: ollama
spec:serviceName: "ollama"replicas: 1selector:matchLabels:app: ollamatemplate:metadata:labels:app: ollamaspec:containers:- name: ollamaimage: swr.cn-south-1.myhuaweicloud.com/migrator/ollama:0.5.7ports:- containerPort: 11434resources:requests:cpu: "1000m"memory: "2Gi"# nvidia.com/gpu: "4" # 如果要用英伟达GPU,请声明下GPU卡的数量limits:cpu: "4000m"memory: "4Gi"volumeMounts:- name: ollama-volumemountPath: /root/.ollamatty: truevolumeClaimTemplates:- metadata:name: ollama-volumespec:storageClassName: sfsturbo-subpath-scaccessModes: ["ReadWriteOnce"]resources:requests:storage: 200Gi # 确保磁盘容量能存储下所有待下载的大模型
---
apiVersion: v1
kind: Service
metadata:name: ollamanamespace: ollamalabels:app: ollama
spec:type: ClusterIPports:- port: 11434protocol: TCPtargetPort: 11434selector:app: ollama
2.Deepseek-R1部署配置
vim deepseek-r1-deployment.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:name: deepseek-pvc
spec:accessModes:- ReadWriteMany # NFS 支持多个节点同时读写resources:requests:storage: 2TstorageClassName: nfs-storage # 使用定义的 StorageClass
---
apiVersion: apps/v1
kind: Deployment
metadata:name: deepseek-r1-model
spec:replicas: 1selector:matchLabels:app: deepseek-r1template:metadata:labels:app: deepseek-r1spec:containers:- name: deepseek-r1image: deepseek-r1/deepseek-r1-model:671bresources:requests:memory: "128Gi"cpu: "32"nvidia.com/gpu: 1 # 请求 1 个 NVIDIA GPUlimits:memory: "256Gi"cpu: "64"nvidia.com/gpu: 1 # 限制最多使用 1 个 NVIDIA GPUports:- containerPort: 8081volumeMounts:- name: deepseek-storagemountPath: /mnt/modelsvolumes:- name: deepseek-storagepersistentVolumeClaim:claimName: deepseek-pvc
---
apiVersion: v1
kind: Service
metadata:name: deepseek-r1-service
spec:selector:app: deepseek-r1ports:- protocol: TCPport: 8081 # 服务端口targetPort: 8081 # 容器端口nodePort: 30001 # 分配一个静态端口,确保在所有节点上都能访问type: NodePort
3.部署到Kubernetes
通过以下命令将Kubernetes资源应用到集群中:
kubectl apply -f ollama-deployment.yaml
kubectl apply -f deepseek-r1-deployment.yaml
4.检查POD 状态
kubectl get pods -n namespace
确保所有Pod都正常运行。如果Pod未启动,可以使用 kubectl describe pod <pod-name> 来查看详细的错误信息。
5.检查服务状态
kubectl get svc #--通过NodePort端口访问。你可以在浏览器或者API客户端中使用这个外部IP访问模型接口,例如:
- Ollama模型API:http://<external-ip>:30000- DeepSeek-R1模型API:http://<external-ip>:30001
6.调用接口模型
如果模型提供了RESTful API,你可以通过HTTP请求调用。例如,使用curl进行推理请求:
# 假设Ollama模型提供一个推理接口
curl -X POST http://<external-ip>:30000/inference -d '{"input": "your text input"}'