欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 文旅 > 艺术 > 劲省85%云成本!在K8s上使用Karpenter私有部署DeepSeek-R1

劲省85%云成本!在K8s上使用Karpenter私有部署DeepSeek-R1

2025/2/10 3:47:53 来源:https://blog.csdn.net/cloudpilot_ai/article/details/145516043  浏览:    关键词:劲省85%云成本!在K8s上使用Karpenter私有部署DeepSeek-R1

在本教程中,我们将初步尝试在阿里云ACK上托管DeepSeek-R1模型,并使用Karpenter阿里云Provider动态扩缩GPU节点资源。

GitHub 地址:

https://github.com/cloudpilot-ai/karpenter-provider-alibabacloud

通过Karpenter的自动化调度能力,我们可以根据需求灵活调整计算资源(如竞价实例),确保模型推理高效运行,同时优化成本。

为什么在K8s上私有化部署DeepSeek-R1模型

在阿里云 ACK 上部署 DeepSeek 模型,主要有以下几个关键优势:

首先,许多大企业在部署AI模型时,通常有数据私有化的要求,特别是涉及敏感数据或关键业务时。

其次,Kubernetes提供了灵活的底层计算资源管理能力,企业可以根据自身需求进行资源调度、分配和优化。通过阿里云ACK集群,企业能够精细化管理计算资源,并进行自定义配置,以确保模型训练和推理任务能够在最适合的GPU资源上高效运行。

此外,本地部署还能够有效避免频繁的宕机和服务不可用问题(如下图),保障系统的高可用性。同时,不受敏感词等外部限制,增强了灵活性和自主性。

在这里插入图片描述

创建ACK集群

本文使用Terraform快速创建ACK,使用的区域为ap-northeast-2(首尔)。

详细创建步骤请查看:

https://github.com/cloudpilot-ai/examples/tree/main/clusters/ack-spot-flannel

安装Karpenter

参考官方安装文档安装Karpenter (仅需完成前5步即可)

https://docs.cloudpilot.ai/karpenter/alibabacloud/v0.1/getting-started/set-up-a-cluster-and-add-karpenter

同时,部署如下NodePool和NodeClass,定义弹性GPU节点的配置:

# nodeclass.yaml  apiVersion: karpenter.k8s.alibabacloud/v1alpha1  
kind: ECSNodeClass  
metadata:  name: defaultnodeclass  
spec:  systemDisk:  size: 300  categories:  - cloud  - cloud_ssd  - cloud_efficiency  - cloud_essd  - cloud_auto  - cloud_essd_entry  vSwitchSelectorTerms:  - tags:  karpenter.sh/discovery: "deepseek" # replace with your cluster name  securityGroupSelectorTerms:  - tags:  karpenter.sh/discovery: "deepseek" # replace with your cluster name  imageSelectorTerms:  # ContainerOS only support x86_64 linux nodes, and it's faster to initialize  - alias: AlibabaCloudLinux3
  • nodepool中的node.kubernetes.io/instance-type定义候选的节点类型,这里使用A10GPU。

  • 使用karpenter.sh/capacity-type将节点计费类型设置为 Spot,相比按需计费可节省85%,甚至低于包年费用(375,853.84元) 。未来结合 HPA 的自动扩缩容策略,预计还能降低更多成本。

数据来源:spot.cloudpilot.ai
数据来源:spot.cloudpilot.ai

在这里插入图片描述

NOTE: 查询计费数据详情,请访问:https://spot.cloudpilot.ai/alibabacloud?instance=ecs.gn7i-c32g1.32xlarge#region=ap-northeast-2

安装好Karpenter后,运行如下命令即可:

kubectl apply -f nodepool.yaml          
kubectl apply -f nodeclass.yaml

检查nodepool status,READY为True即可:

NAME          NODECLASS          NODES   READY   AGE
ecsnodepool   defaultnodeclass   1       True    3h10m

在业务流量高峰期,系统可充分利用 GPU 资源以满足计算需求,而在请求低谷时,闲置的资源仍在运行则会造成不必要的成本浪费。

假设1天内仅有8小时处于流量高峰,那么通过采用弹性策略,用户可以根据实际负载动态调整资源,在处于低负载的16小时中自动缩容 Pod 至 0,释放空闲的 GPU 资源,至少可以减少 60% 云成本。

在这里插入图片描述

部署DeepSeek-R1模型

1.创建YAML文件

创建deepseek.yaml,内容如下,也可以将deepseek-ai/DeepSeek-R1-Distill-Qwen-32B修改为任意你想要的其他模型:

apiVersion: v1  
kind: Namespace  
metadata:  name: deepseek  
---  
apiVersion: apps/v1  
kind: Deployment  
metadata:  name: deepseek-deployment  namespace: deepseek  labels:  app: deepseek  
spec:  replicas: 1  selector:  matchLabels:  app: deepseek  template:  metadata:  labels:  app: deepseek  spec:  tolerations:  - key: "nvidia.com/gpu"  operator: "Exists"  effect: "NoSchedule"  volumes:  - name: cache-volume  hostPath:  path: /tmp/deepseek  type: DirectoryOrCreate  # vLLM needs to access the host's shared memory for tensor parallel inference.  - name: shm  emptyDir:  medium: Memory  sizeLimit: "2Gi"  containers:  - name: deepseek  image: cloudpilotai-registry.cn-hangzhou.cr.aliyuncs.com/cloudpilotai/vllm-openai:latest  command: ["/bin/sh", "-c"]  args: [  "vllm serve deepseek-ai/DeepSeek-R1-Distill-Qwen-32B --max_model_len 2048 --tensor-parallel-size 4"  ]  env:  # - name: HF_ENDPOINT  #   value: https://hf-mirror.com  - name: HF_HUB_ENABLE_HF_TRANSFER  value: "0"  # - name: VLLM_USE_MODELSCOPE  #   value: "True"  ports:  - containerPort: 8000  resources:  requests:  nvidia.com/gpu: "4"  limits:  nvidia.com/gpu: "4"  volumeMounts:  - mountPath: /root/.cache/huggingface  name: cache-volume  - name: shm  mountPath: /dev/shm  
---  
apiVersion: v1  
kind: Service  
metadata:  name: deepseek-svc  namespace: deepseek  
spec:  ports:  - name: http  port: 80  protocol: TCP  targetPort: 8000  # The label selector should match the deployment labels & it is useful for prefix caching feature  selector:  app: deepseek  type: ClusterIP

其中--tensor-parallel-size 4表示使用单机4卡GPU并行推理(也可以改为单卡,速度会慢一点)。

此处附上不同参数模型对显卡和显存的要求,大家可以根据要求选择合适GPU计算资源:

在这里插入图片描述

2.部署YAML

运行如下命令,部署业务:

kubectl apply -f deepseek.yaml

此时,Karpenter会根据要求的4卡GPU,创建4卡的Spot单节点(4卡并行,提升Token响应速度):

$ kubectl get nodeclaim -A  
NAME                TYPE                      CAPACITY   ZONE              NODE                          READY   AGE  
ecsnodepool-knc9p   ecs.gn7i-c32g1.32xlarge   spot       ap-northeast-1c   ap-northeast-1.172.16.2.174   True    136m

等待一段时间后,查看相关Pod日志,显示如下内容即Ready:

...  
INFO 02-05 05:16:52 launcher.py:27] Route: /invocations, Methods: POST  
INFO:     Started server process [7]  
INFO:     Waiting for application startup.  
INFO:     Application startup complete.  
...

3.使用UI聊天交互

首先运行如下命令,将服务在本地暴露:

kubectl port-forward svc/deepseek-svc -n deepseek 8080:80

然后,访问网页:https://app.nextchat.dev/

点击左下角配置:

在这里插入图片描述

依次选择和输入:

  • OpenAI
  • http://localhost:8080
  • deepseek-ai/DeepSeek-R1-Distill-Qwen-32B
  • deepseek-ai/DeepSeek-R1-Distill-Qwen-32B

最后,通过聊天窗口即可使用 DeepSeek-R1模型:

在这里插入图片描述

体验A10 4卡,响应速度还是很快的!

结论

经过初步体验,在Kubernetes环境下结合Karpenter,能够快速启动LLM所需的GPU节点资源。此教程仅为初步体验,要实现生产级别的安装和部署,还需要结合一些解决方案,克服以下几个问题:

  • 镜像加速 : 避免长时间无法拉取镜像,如使用Dragonfly等。
  • 模型文件加载加速:防止模型文件下载时间过长。
  • 超大模型支持:通常超大模型需要多个节点才能运行,需要通过vLLM进行多节点多GPU推理的配置。
  • 弹性扩缩容 :根据请求量动态调整Pod数量,以应对请求波动;在长时间无请求时,将Pod缩容至0,并释放空闲的GPU资源,进一步节省成本。

接下来,我们将继续deep seek,为大家呈现完整的DeepSeek-R1全量模型生产环境部署(大概率使用KServe+Karpenter),以及弹性方案!

推荐阅读

15条 Karpenter 最佳实践,轻松掌握弹性伸缩

服务600+客户的3D生成AIGC公司如何实现GPU成本降低70%?

全球最大分类广告商的Karpenter实践:减负运维、减少中断、每月省21万(上)

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com