模型訓練完成後,通常會被部署成推理服務。推理服務的調用量會隨著業務需求動態變化,這就需要伺服器能彈性擴縮容來節省成本。在大規模高並發的節點需求情況下,常規的部署方案無法滿足此類需求。阿里雲提供了基於Elastic Container Instance(Elastic Container Instance)的運行工作負載能力,滿足推理服務的Auto Scaling的需求。本文介紹如何基於ECI運行彈性推理服務。
前提條件
操作步驟
將訓練模型上傳到OSS上。具體操作,請參見控制台上傳檔案。
建立PV和PVC。
使用以下模板建立
pvc.yaml檔案。apiVersion: v1 kind: PersistentVolume metadata: name: model-csi-pv spec: capacity: storage: 5Gi accessModes: - ReadWriteMany persistentVolumeReclaimPolicy: Retain csi: driver: ossplugin.csi.alibabacloud.com volumeHandle: model-csi-pv # 需要和pv名稱一致。 volumeAttributes: bucket: "Your Bucket" url: "Your oss url" akId: "Your Access Key Id" akSecret: "Your Access Key Secret" otherOpts: "-o max_stat_cache_size=0 -o allow_other" --- apiVersion: v1 kind: PersistentVolumeClaim metadata: name: model-pvc spec: accessModes: - ReadWriteMany resources: requests: storage: 5Gi參數
說明
bucket
OSS的Bucket名稱,在OSS範圍內全域唯一。更多資訊,請參見儲存空間命名。
url
OSS檔案的訪問URL。更多資訊,請參見如何擷取單個或多個檔案的URL。
akId
訪問OSS的AccessKey ID和AccessKey Secret。建議使用RAM使用者訪問,更多資訊,請參見建立AccessKey。
akSecret
otherOpts
掛載OSS時支援定製化參數輸入。
-o max_stat_cache_size=0代表禁用屬性緩衝,每次訪問檔案都會從 OSS 中擷取最新的屬性資訊。-o allow_other代表允許其他使用者訪問掛載的檔案系統。
參數設定的更多資訊,請參見ossfs支援的設定參數選項。
執行以下命令,建立PV和PVC。
kubectl apply -f pvc.yaml
部署推理服務。
執行以下命令,部署推理服務。
部署推理服務時,您可以通過Annotation指定申請的資源類型,關鍵參數說明如下:
參數
說明
alibabacloud.com/burst-resource取值如下:
預設不配置:只使用叢集現有的ECS資源。
eci:當前叢集ECS資源不足時,使用ECI彈性資源。eci_only:只使用ECI彈性資源,不使用叢集的ECS資源。
k8s.aliyun.com/eci-use-specs如果需要使用ECI GPU資源,需要通過該Annotation指定GPU執行個體規格。
arena serve tensorflow \ --namespace=default \ --name=bert-tfserving \ --model-name=chnsenticorp \ --gpus=1 \ --image=tensorflow/serving:1.15.0-gpu \ --data=model-pvc:/data \ --model-path=/data/models/tensorflow/chnsenticorp \ --version-policy=specific:1623831335 \ --annotation=alibabacloud.com/burst-resource=eci_only \ --annotation=k8s.aliyun.com/eci-use-specs=ecs.gn6i-c4g1.xlarge執行以下命令,查看服務狀態。
arena serve list預期輸出:
NAME TYPE VERSION DESIRED AVAILABLE ADDRESS PORTS GPU bert-tfserving Tensorflow 202207181536 1 1 172.16.52.170 GRPC:8500,RESTFUL:8501 1執行以下命令,查看Pod狀態。
kubectl get pods -o wide預期輸出:
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES bert-tfserving-202207181536-tensorflow-serving-547797c546-djh58 1/1 Running 0 114s 192.168.0.246 virtual-kubelet-cn-beijing-h <none> <none>由預期輸出得到,
Node類型為virtual-kubelet-cn-beijing-h,表示Pod被部署在ECI上。
建立HPA(Horizontal Pod Autoscaler)。HPA可以根據不同負載情況,自動調整Kubernetes中的Pod副本數量。
執行以下命令,查看推理服務對應的Deployment。
kubectl get deployment預期輸出:
NAME READY UP-TO-DATE AVAILABLE AGE bert-tfserving-202207181536-tensorflow-serving 1/1 1 1 2m18s執行以下命令,查看推理服務對應的Service。
kubectl get service預期輸出:
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE bert-tfserving-202207181536-tensorflow-serving ClusterIP 172.16.52.170 <none> 8500/TCP,8501/TCP 2m45s使用以下模板建立
bert-tfserving-eci-hpa.yaml檔案。apiVersion: autoscaling/v2beta2 kind: HorizontalPodAutoscaler metadata: name: bert-tfserving-eci-hpa namespace: default spec: scaleTargetRef: apiVersion: apps/v1 kind: Deployment name: bert-tfserving-202207181536-tensorflow-serving minReplicas: 1 maxReplicas: 10 metrics: - type: External external: metric: name: sls_ingress_qps selector: matchLabels: sls.project: "k8s-log-{cluster id}" sls.logstore: "nginx-ingress" sls.ingress.route: "default-bert-tfserving-202207181536-tensorflow-serving-8501" target: type: AverageValue averageValue: 10關鍵參數說明如下:
參數
說明
scaleTargetRef設定當前HPA綁定的對象,本文配置為步驟a中,推理服務對應的Deployment名稱。
minReplicas最小副本數。
maxReplicas最大副本數。
sls.project叢集的記錄項目名稱,配置規則為
k8s-log-{cluster id}。sls.logstore日誌庫的名稱,預設值為
nginx-ingress。sls.ingress.routeIngress路由,配置規則為
{namespace}-{service name}-{service port}。metricname指標名稱,本文配置為
sls_ingress_qps。targetaverageValue觸發彈性擴容的QPS值。本文配置為
10,表示當QPS大於10時,觸發彈性擴容。執行以下命令,查看HPA狀態。
kubectl get hpa預期輸出:
NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE bert-tfserving-eci-hpa Deployment/bert-tfserving-202207181536-tensorflow-serving 0/10 (avg) 1 10 1 116s
配置公網Ingress。
通過
arena serve tensorflow命令部署的推理服務預設提供的是ClusterIP,不能直接通過公網訪問。因此需要為推理服務建立一個公網Ingress,方便進行訪問。登入Container Service管理主控台,在左側導覽列選擇叢集列表。
在叢集列表頁面,單擊目的地組群名稱,然後在左側導覽列,選擇。
在路由頁面,選擇推理服務所在的命名空間,然後單擊建立 Ingress,配置如下參數。關於參數的更多資訊,請參見建立Nginx Ingress。
名稱:本文配置為
bert-tfserving。規則:
網域名稱:自訂網域名,例如:
test.example.com。路徑映射:
路徑:不做配置,保留根路徑
/。匹配規則:預設(ImplementationSpecific)。
服務名稱:本文配置為步驟b中擷取的服務名稱
bert-tfserving-202207181536-tensorflow-serving。連接埠:本文配置為8501。
在路由頁面的規則列下,查看目標Ingress的地址。
使用步驟5擷取的地址,對推理服務進行壓測。當QPS大於HPA中配置的
averageValue時,觸發擴容,Pod數量不超過maxReplicas;當QPS小於averageValue時,觸發縮容。