ACK One多叢集艦隊在多地區應用服務部署情境下,針對多地區資源撫平的難題設計並實現了基於庫存感知的智能調度器。本文介紹庫存感知的工作原理以及如何開啟和使用庫存感知調度能力。
能力介紹
在GPU推理服務情境中,使用者普遍面臨兩大挑戰:
各地區GPU供給在動態變化,難以保證即時可用。
GPU價格昂貴,預先建立會導致高昂的成本。
庫存感知調度機制配合即時彈性可以很好地解決這兩大難題,當艦隊管理的多個叢集現有資源不足時,會將應用服務調度到有庫存的叢集中,該叢集的即時彈性會進行擴容所需節點來承接相關的應用服務。通過這個能力,最大化保證了需要GPU等稀缺資源的應用的成功調度,同時顯著降低了GPU使用成本。
此能力目前處於邀測階段。如需體驗,請提交工單申請。
工作原理
當某個叢集資源不足時,在艦隊中建立應用觸發的整體工作流程如下:
建立應用和分發策略。
調度器感知子叢集資源不足,無法進行調度。
調度器觸發子叢集ACK GOATScaler對於庫存的檢查,然後擷取檢查結果。
根據庫存結果,調度器進行重新調度,然後進行應用分發。
應用分發到子叢集之後,叢集開始擴容節點,應用正常運行。
前提條件
若子叢集已經開啟了節點自動調整,請根據開啟節點即時彈性功能切換為節點即時彈性。
GPU執行個體規格和成本預估
在推理階段主要佔用顯存的是模型參數,可以通過以下公式計算。
以一個預設精度為FP16的7B模型為例,模型參數量為:7B(即70億),精度資料類型位元組數為:預設精度16位浮點數 / 8位每位元組 = 2位元組。
除了載入模型佔用的顯存之外,還需要考慮運算時所需的KV Cache大小和GPU使用率,通常會預留一部分buffer,因此推薦使用24GiB顯存的GPU執行個體ecs.gn7i-c8g1.2xlarge或ecs.gn7i-c16g1.4xlarge。關於GPU執行個體規格和計費的詳情,請參見GPU計算型執行個體規格類型系列和GPU雲端服務器計費。
準備工作
本步驟將準備qwen3-8b推理服務的模型檔案並分別在子叢集中建立對應的OSS儲存卷。
下載模型。
說明請確認是否已安裝git-lfs外掛程式,如未安裝可執行
yum install git-lfs或者apt-get install git-lfs安裝。更多的安裝方式,請參見安裝git-lfs。git lfs install GIT_LFS_SKIP_SMUDGE=1 git clone https://huggingface.co/Qwen/Qwen3-8B cd Qwen3-8B git lfs pull在OSS中建立目錄,將模型上傳至OSS。
說明關於ossutil工具的安裝和使用方法,請參見安裝ossutil。
ossutil mkdir oss://<your-bucket-name>/models/Qwen3-8B ossutil cp -r ./Qwen3-8B oss://<your-bucket-name>/models/Qwen3-8B分別在子叢集中建立PV和PVC。具體操作,請參見使用ossfs 1.0靜態儲存卷。
步驟一:為子叢集配置節點池
建立或編輯節點池,設定執行個體規格為ecs.gn7i-c8g1.2xlarge,擴縮容模式選擇自動,節點池期望節點數為0。具體操作和配置參數,請參見建立和管理節點池。
調整節點伸縮配置時,可以通過調整縮容觸發時延來縮短後續步驟的等待時間。
步驟二:在艦隊叢集建立應用和分發策略
建立deploy.yaml。
apiVersion: apps/v1 kind: Deployment metadata: labels: app: qwen3-8b name: qwen3-8b namespace: default spec: replicas: 4 selector: matchLabels: app: qwen3-8b template: metadata: labels: app: qwen3-8b spec: volumes: - name: qwen3-8b persistentVolumeClaim: claimName: qwen3-8b - name: dshm emptyDir: medium: Memory sizeLimit: 20Gi containers: - command: - sh - -c - vllm serve /models/qwen3-8b --port 8000 --trust-remote-code --served-model-name qwen3-8b --tensor-parallel=1 --max-model-len 8192 --gpu-memory-utilization 0.95 --enforce-eager image: kube-ai-registry.cn-shanghai.cr.aliyuncs.com/kube-ai/vllm-openai:v0.9.1 name: vllm ports: - containerPort: 8000 readinessProbe: tcpSocket: port: 8000 initialDelaySeconds: 30 periodSeconds: 30 resources: limits: nvidia.com/gpu: "1" volumeMounts: - mountPath: /models/qwen3-8b name: qwen3-8b - mountPath: /dev/shm name: dshm建立PropagationPolicy.yaml。
apiVersion: policy.one.alibabacloud.com/v1alpha1 kind: PropagationPolicy metadata: name: demo-policy spec: # 此欄位表示開啟庫存感知的彈性調度 autoScaling: ecsProvision: true preserveResourcesOnDeletion: false conflictResolution: Overwrite resourceSelectors: - apiVersion: apps/v1 kind: Deployment name: qwen3-8b namespace: default placement: replicaScheduling: replicaSchedulingType: Divided weightPreference: dynamicWeight: AvailableReplicas clusterAffinity: clusterNames: - ${cluster1-id} # 請替換為實際的子叢集ID - ${cluster2-id} # 請替換為實際的子叢集ID使用艦隊的kubeconfig部署應用和分發策略。
kubectl apply -f deploy.yaml kubectl apply -f PropagationPolicy.yaml一段時間後,可以觀察到cluster1和cluster2的GPU節點池開始自行擴容。
步驟三:驗證彈性擴縮容
查看工作負載調度情況。
kubectl get resourcebinding預期輸出:
NAME SCHEDULED FULLYAPPLIED OVERRIDDEN ALLAVAILABLE AGE qwen3-8b-deployment True True True False 7m47s可以看到,
SCHEDULED為TRUE,說明工作負載已成功調度。等待Pod狀態處於
Running後,查看Pod分布情況。kubectl amc get deploy qwen3-8b -M預期輸出:
NAME CLUSTER READY UP-TO-DATE AVAILABLE AGE ADOPTION qwen3-8b cxxxxxxxxxxxxxx 2/2 2 2 3m22s Y qwen3-8b cxxxxxxxxxxxxxx 2/2 2 2 3m22s Y可以看到,子叢集在沒有可用的GPU節點的情況下,工作負載的所有副本都成功調度並且正常運行。
修改
qwen3-8b的副本數為2,更新工作負載。也可以選擇直接刪除工作負載,類比副本數縮容到0的情況。
kubectl apply -f deploy.yaml等待十分鐘,可以看到子叢集的GPU節點池縮容到一個節點。
若選擇刪除工作負載,則節點數量會縮容到0。
從完整流程可以看到,艦隊的庫存感知調度能力確保在子叢集現有資源不足時通過感知庫存成功調度分發應用,隨後進行節點擴容來承載應用,在應用縮容、刪除後,自動縮容空閑節點,釋放資源以降低成本。