大数跨境

企业级省钱攻略!私有化部署DeepSeek-R1,狂省85%云成本

企业级省钱攻略!私有化部署DeepSeek-R1,狂省85%云成本 云妙算
2025-02-06
0
导读:告别“服务器繁忙”!高性价比部署方案,比包年套餐更划算!

点击上方卡片,关注「CloudPilot AI」

5分钟,降低50%云成本


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


GitHub 地址:

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


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


01/

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


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


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


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


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

02/

创建ACK集群


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


详细创建步骤请查看:

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


03/

安装Karpenter


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

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


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

# nodepool.yaml
apiVersion: karpenter.sh/v1
kind: NodePool
metadata:
  name: ecsnodepool
spec:
  disruption:
    budgets:
      - nodes: 95%
    consolidationPolicy: WhenEmptyOrUnderutilized
    consolidateAfter: 1m
  template:
    spec:
      requirements:
        - key: node.kubernetes.io/instance-type
          operator: In
          values:
          - "ecs.gn7i-c8g1.2xlarge"
          - "ecs.gn7i-c16g1.4xlarge"
          - "ecs.gn7i-2x.8xlarge"
          - "ecs.gn7i-4x.8xlarge"
          - "ecs.gn7i-c32g1.8xlarge"
          - "ecs.gn7i-c48g1.12xlarge"
          - "ecs.gn7i-c56g1.14xlarge"
          - "ecs.gn7i-c32g1.16xlarge"
          - "ecs.gn7i-c32g1.32xlarge"
        - key: kubernetes.io/arch
          operator: In
          values: [ "amd64" ]
        - key: kubernetes.io/os
          operator: In
          values: ["linux"]
        - key: karpenter.sh/capacity-type
          operator: In
          values: ["spot"]
      nodeClassRef:
        group: "karpenter.k8s.alibabacloud"
        kind: ECSNodeClass
        name: defaultnodeclass
 ---
 # 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 定义候选的节点类型,这里使用A10 GPU。

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



数据来源: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% 云成本。

04/

部署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-2c   ap-northeast-2.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卡,响应速度还是很快的!


05/

结论


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


  1. 镜像加速:避免长时间无法拉取镜像,如使用Dragonfly等。

  2. 模型文件加载加速:防止模型文件下载时间过长。

  3. 超大模型支持:通常超大模型需要多个节点才能运行,需要通过vLLM进行多节点多GPU推理的配置。

  4. 弹性扩缩容:根据请求量动态调整Pod数量,以应对请求波动;在长时间无请求时,将Pod缩容至0,并释放空闲的GPU资源,进一步节省成本。


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


推荐阅读

手把手带你使用Karpenter减少K8s集群资源浪费

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

云从业者必读!2025年5个云成本管理趋势


公司介绍

CloudPilot AI 是一家全球领先的 Karpenter 托管云服务提供商,致力于通过智能化、自动化的云资源调度和编排技术,帮助企业最大化云资源利用率。我们秉持“让客户在云中花费的每一分钱都物超所值”的使命,为客户提升10倍的资源效率,同时将云成本降低50%以上。


目前,开源K8s弹性伸缩器 Karpenter 已为全球超500家知名企业在生产环境中提供服务,包括阿迪达斯、Anthropic、Slack、Figma等。CloudPilot AI 已为数十家全球顶尖科技公司提供服务,累计为客户节省超过30万美金,平均节省67%。 选择CloudPilot AI,让每一笔支出都更智慧。


免费试用,2步5分钟,降低50%云成本:

cloudpilot.ai

【声明】内容源于网络
0
0
云妙算
让您在云中花费的每一分钱都物超所值
内容 0
粉丝 0
云妙算 让您在云中花费的每一分钱都物超所值
总阅读0
粉丝0
内容0