暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

K8S 低成本 AI 推理方案

Azure云科技 2024-04-17
327

最新发现一个很不错的开源工具,可以帮助我们降低深度学习推理的成本。

Karpenter 是一个用于 Kubernetes 集群的节点自动配置工具,它通过 AKS Karpenter Provider 在 AKS 集群上启用节点自动配置功能。Karpenter 的主要功能包括监控 Kubernetes 调度器标记为不可调度的 Pods,评估 Pods 请求的调度约束(资源请求、节点选择器、亲和性、容忍性和拓扑扩散约束),根据这些约束配置满足要求的节点,并在这些节点不再需要时移除它们。此外,Karpenter 还能够将现有节点整合到更便宜、利用率更高的节点上 。

使用场景方面,Karpenter 适用于需要动态调整 Kubernetes 集群资源配置的场景,特别是在工作负载变化较大、需要频繁调整节点配置以适应不同工作负载需求的环境中。例如,对于需要根据实际使用情况自动扩展或缩减节点数量的应用,Karpenter 可以自动化这一过程,提高资源配置的灵活性和效率  。

总的来说,Karpenter 是一个强大的工具,能够帮助用户更高效、更经济地管理 Kubernetes 集群的资源配置。




总的来说,Karpenter 是一个强大的工具,能够帮助用户更高效、更经济地管理 Kubernetes 集群的资源配置。

在 AKS 的深度学习推理中,我们可以用 SpotVM 当成 AKS 的 worker 节点。



把多个 SpotVM 作为 AKS 的 worker node,然后针对 GPU 推理的 K8S SVC 在多个 worker node 上创建多个副本,那么即使一个 worker node 被驱逐,业务也不受影响;如果能承受短时可能的短暂的业务中断,一个 pod 也可以,Karpenter 发现 worker 节点被驱逐,能将 pod 在其他节点重启。多 pod 副本需要使用 SVC 和 K8S 的 ingress。




创建多个 Node pool,其中一个 node pool 使用 spotvm,另外一个 nodepool 可以使用正常的 GPU VM。然后针对不同的 nodepool 设置不同的 weight。这样 GPU pod 的 deployment 就会先选择 weight 高的 pool 进行部署。

参照如下链接部署好一个支持Karpenter的AKS。

🔗 https://learn.microsoft.com/en-us/azure/aks/node-autoprovision?tabs=azure-cli


然后创建一个GPU pod的deployment,初始副本数设置为1:

xinyu [ ~ ]$ kubectl get deployment

    NAME          READY   UP-TO-DATE   AVAILABLE   AGE
    samples-gpu   0/1     1            0           2m24s


    此时 Azure 开始创建 spot gpu vm,如下所示:



    xinyu [ ~ ]$ kubectl get nodeclaims.karpenter.sh

      NAME             TYPE                       ZONE              NODE   READY   AGE
      gpu-spot-57p8w   Standard_NC24ads_A100_v4   southeastasia-2          False   2m18s


      xinyu [ ~ ]$ kubectl describe deployment samples-gpu

        Name:                   samples-gpu
        Namespace:              default
        CreationTimestamp:      Sun, 24 Mar 2024 02:06:56 +0000
        Labels:                 app=samples-tf-mnist-demo
        Annotations:            deployment.kubernetes.io/revision: 1
        Selector:               app=samples-tf-mnist-demo
        Replicas:               1 desired | 1 updated | 1 total | 0 available | 1 unavailable
        StrategyType:           RollingUpdate
        MinReadySeconds:        0
        RollingUpdateStrategy:  25% max unavailable, 25% max surge
        Pod Template:
        Labels:  app=samples-tf-mnist-demo
        Containers:
        samples-tf-mnist-demo:
        Image:      mcr.microsoft.com/azuredocs/samples-tf-mnist-demo:gpu
        Port:       <none>
        Host Port:  <none>
        Args:
        --max_steps
        50000
        Limits:
        nvidia.com/gpu:  1
        Environment:       <none>
        Mounts:            <none>
        Volumes:             <none>
        Conditions:
        Type           Status  Reason
        ----           ------  ------
        Available      False   MinimumReplicasUnavailable
        Progressing    True    ReplicaSetUpdated
        OldReplicaSets:  <none>
        NewReplicaSet:   samples-gpu-95b9c58b6 (1/1 replicas created)
        Events:
        Type    Reason             Age    From                   Message
        ----    ------             ----   ----                   -------
        Normal  ScalingReplicaSet  2m42s  deployment-controller  Scaled up replica set samples-gpu-95b9c58b6 to 1

        大约2-3分钟,查看 AKS 节点,已经多个一个 GPU VM。

        xinyu [ ~ ]$ kubectl get nodes

          NAME                                STATUS   ROLES   AGE   VERSION
          aks-gpu-spot-57p8w                  Ready    agent   33s   v1.27.9
          aks-nodepool1-34768744-vmss000000   Ready    agent   54m   v1.27.9
          aks-nodepool1-34768744-vmss000001   Ready    agent   54m   v1.27.9
          aks-nodepool1-34768744-vmss000002   Ready    agent   54m   v1.27.9


          xinyu [ ~ ]$ kubectl get pods

            NAME                          READY   STATUS    RESTARTS   AGE
            samples-gpu-95b9c58b6-nbg8g   1/1     Running   0          4m10s


            登录 pod,查看其中的 GPU 资源:

            xinyu [ ~ ]$ kubectl exec -ti samples-gpu-95b9c58b6-nbg8g -- bin/sh


              NAME          READY   UP-TO-DATE   AVAILABLE   AGE
              samples-gpu   0/1     1            0           2m24s



              xinyu [ ~ ]$ kubectl get deployment

                NAME          READY   UP-TO-DATE   AVAILABLE   AGE
                samples-gpu   1/1     1            1           4m56s


                将 GPU Pod 的副本数增加为2:

                xinyu [ ~ ]$ kubectl scale deployment samples-gpu --replicas=2

                deployment.apps/samples-gpu scaled

                xinyu [ ~ ]$ kubectl get deployment

                  NAME          READY   UP-TO-DATE   AVAILABLE   AGE
                  samples-gpu   1/2     2            1           7m28s


                  过了1-2分钟,增加完毕:

                  xinyu [ ~ ]$ kubectl exec -ti samples-gpu-95b9c58b6-nbg8g -- bin/sh

                    NAME          READY   UP-TO-DATE   AVAILABLE   AGE
                    samples-gpu   2/2     2            2           11m


                    再次查看 AKS 节点,又多了一个 GPU VM。

                    xinyu [ ~ ]$ kubectl get nodes

                      NAME                                STATUS   ROLES   AGE    VERSION
                      aks-gpu-spot-57p8w                  Ready    agent   10m    v1.27.9
                      aks-gpu-spot-p9vh8                  Ready    agent   3m1s   v1.27.9
                      aks-nodepool1-34768744-vmss000000   Ready    agent   63m    v1.27.9
                      aks-nodepool1-34768744-vmss000001   Ready    agent   63m    v1.27.9
                      aks-nodepool1-34768744-vmss000002   Ready    agent   63m    v1.27.9


                      查看 karpenter 对应的三个 CRD:

                      xinyu [ ~ ]$ kubectl get crd |grep -i kar

                        aksnodeclasses.karpenter.azure.com               2024-03-24T01:18:01Z
                        nodeclaims.karpenter.sh                          2024-03-24T01:18:01Z
                        nodepools.karpenter.sh                           2024-03-24T01:18:01Z


                        查看 karpenter claim 的节点,有两个:

                        xinyu [ ~ ]$ kubectl get nodeclaims.karpenter.sh

                          NAME             TYPE                       ZONE              NODE                 READY   AGE
                          gpu-spot-57p8w   Standard_NC24ads_A100_v4   southeastasia-2   aks-gpu-spot-57p8w   True    15m
                          gpu-spot-p9vh8   Standard_NC24ads_A100_v4   southeastasia-2   aks-gpu-spot-p9vh8   True    8m11s


                          此时查看 Azure VM,有两个 GPU SpotVM:



                          将 deployments 副本数设置为0,AKS 会剔除对应节点,Azure 也会删除 GPU SpotVM。

                          xinyu [ ~ ]$ kubectl scale deployment samples-gpu --replicas=0

                            deployment.apps/samples-gpu scaled


                            xinyu [ ~ ]$ kubectl get deployment

                              NAME          READY   UP-TO-DATE   AVAILABLE   AGE
                              samples-gpu   0/0     0            0           26m




                              本文作者



                              魏新宇

                               微软资深云解决方案架构师

                              《OpenShift在企业中的实战:PaaS DevOps微服务》、《云原生应用构建:基于OpenShift》、《金融级IT架构与运维》书第一作者。在云原生、加速计算方面有着丰富的经验。




                              文章转载自Azure云科技,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

                              评论