基于ECI的彈性推理
模型訓(xùn)練完成后,通常會被部署成推理服務(wù)。推理服務(wù)的調(diào)用量會隨著業(yè)務(wù)需求動態(tài)變化,這就需要服務(wù)器能彈性擴(kuò)縮容來節(jié)省成本。在大規(guī)模高并發(fā)的節(jié)點(diǎn)需求情況下,常規(guī)的部署方案無法滿足此類需求。阿里云提供了基于彈性容器實(shí)例ECI(Elastic Container Instance)的運(yùn)行工作負(fù)載能力,滿足推理服務(wù)的彈性伸縮的需求。本文介紹如何基于ECI運(yùn)行彈性推理服務(wù)。
前提條件
操作步驟
將訓(xùn)練模型上傳到OSS上。具體操作,請參見控制臺上傳文件。
創(chuàng)建PV和PVC。
使用以下模板創(chuàng)建
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
參數(shù)
說明
bucket
OSS的Bucket名稱,在OSS范圍內(nèi)全局唯一。更多信息,請參見存儲空間命名。
url
OSS文件的訪問URL。更多信息,請參見如何獲取單個(gè)或多個(gè)文件的URL。
akId
訪問OSS的AccessKey ID和AccessKey Secret。建議使用RAM用戶訪問,更多信息,請參見創(chuàng)建AccessKey。
akSecret
otherOpts
掛載OSS時(shí)支持定制化參數(shù)輸入。
-o max_stat_cache_size=0
代表禁用屬性緩存,每次訪問文件都會從 OSS 中獲取最新的屬性信息。-o allow_other
代表允許其他用戶訪問掛載的文件系統(tǒng)。
參數(shù)設(shè)置的更多信息,請參見ossfs支持的設(shè)置參數(shù)選項(xiàng)。
執(zhí)行以下命令,創(chuàng)建PV和PVC。
kubectl apply -f pvc.yaml
部署推理服務(wù)。
執(zhí)行以下命令,部署推理服務(wù)。
部署推理服務(wù)時(shí),您可以通過Annotation指定申請的資源類型,關(guān)鍵參數(shù)說明如下:
參數(shù)
說明
alibabacloud.com/burst-resource
取值如下:
默認(rèn)不配置:只使用集群現(xiàn)有的ECS資源。
eci
:當(dāng)前集群ECS資源不足時(shí),使用ECI彈性資源。eci_only
:只使用ECI彈性資源,不使用集群的ECS資源。
k8s.aliyun.com/eci-use-specs
如果需要使用ECI GPU資源,需要通過該Annotation指定GPU實(shí)例規(guī)格。
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
執(zhí)行以下命令,查看服務(wù)狀態(tài)。
arena serve list
預(yù)期輸出:
NAME TYPE VERSION DESIRED AVAILABLE ADDRESS PORTS GPU bert-tfserving Tensorflow 202207181536 1 1 172.16.52.170 GRPC:8500,RESTFUL:8501 1
執(zhí)行以下命令,查看Pod狀態(tài)。
kubectl get pods -o wide
預(yù)期輸出:
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>
由預(yù)期輸出得到,
Node
類型為virtual-kubelet-cn-beijing-h
,表示Pod被部署在ECI上。
創(chuàng)建HPA(Horizontal Pod Autoscaler)。HPA可以根據(jù)不同負(fù)載情況,自動調(diào)整Kubernetes中的Pod副本數(shù)量。
執(zhí)行以下命令,查看推理服務(wù)對應(yīng)的Deployment。
kubectl get deployment
預(yù)期輸出:
NAME READY UP-TO-DATE AVAILABLE AGE bert-tfserving-202207181536-tensorflow-serving 1/1 1 1 2m18s
執(zhí)行以下命令,查看推理服務(wù)對應(yīng)的Service。
kubectl get service
預(yù)期輸出:
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
使用以下模板創(chuàng)建
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
關(guān)鍵參數(shù)說明如下:
參數(shù)
說明
scaleTargetRef
設(shè)置當(dāng)前HPA綁定的對象,本文配置為步驟a中,推理服務(wù)對應(yīng)的Deployment名稱。
minReplicas
最小副本數(shù)。
maxReplicas
最大副本數(shù)。
sls.project
集群的日志項(xiàng)目名稱,配置規(guī)則為
k8s-log-{cluster id}
。sls.logstore
日志庫的名稱,默認(rèn)值為
nginx-ingress
。sls.ingress.route
Ingress路由,配置規(guī)則為
{namespace}-{service name}-{service port}
。metricname
指標(biāo)名稱,本文配置為
sls_ingress_qps
。targetaverageValue
觸發(fā)彈性擴(kuò)容的QPS值。本文配置為
10
,表示當(dāng)QPS大于10時(shí),觸發(fā)彈性擴(kuò)容。執(zhí)行以下命令,查看HPA狀態(tài)。
kubectl get hpa
預(yù)期輸出:
NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE bert-tfserving-eci-hpa Deployment/bert-tfserving-202207181536-tensorflow-serving 0/10 (avg) 1 10 1 116s
配置公網(wǎng)Ingress。
通過
arena serve tensorflow
命令部署的推理服務(wù)默認(rèn)提供的是ClusterIP,不能直接通過公網(wǎng)訪問。因此需要為推理服務(wù)創(chuàng)建一個(gè)公網(wǎng)Ingress,方便進(jìn)行訪問。登錄容器服務(wù)管理控制臺,在左側(cè)導(dǎo)航欄選擇集群。
在集群列表頁面,單擊目標(biāo)集群名稱,然后在左側(cè)導(dǎo)航欄,選擇 。
在路由頁面上方,選擇推理服務(wù)所在的命名空間,然后單擊創(chuàng)建Ingress,配置如下參數(shù)。關(guān)于參數(shù)的更多信息,請參見創(chuàng)建Nginx Ingress。
名稱:本文配置為
bert-tfserving
。規(guī)則:
域名:自定義域名,例如:
test.example.com
。路徑映射:
路徑:不做配置,保留根路徑
/
。匹配規(guī)則:默認(rèn)(ImplementationSpecific)。
服務(wù)名稱:本文配置為步驟b中獲取的服務(wù)名稱
bert-tfserving-202207181536-tensorflow-serving
。端口:本文配置為8501。
在路由頁面的規(guī)則列下,查看目標(biāo)Ingress的地址。
使用步驟5獲取的地址,對推理服務(wù)進(jìn)行壓測。當(dāng)QPS大于HPA中配置的
averageValue
時(shí),觸發(fā)擴(kuò)容,Pod數(shù)量不超過maxReplicas
;當(dāng)QPS小于averageValue
時(shí),觸發(fā)縮容。