模型訓練完成后,通常會被部署成推理服務。推理服務的調用量會隨著業務需求動態變化,這就需要服務器能彈性擴縮容來節省成本。在大規模高并發的節點需求情況下,常規的部署方案無法滿足此類需求。阿里云容器服務提供了彈性節點池,可以基于彈性節點池部署模型推理服務,滿足彈性伸縮的需求。本文介紹如何基于ECS運行彈性推理工作負載。
前提條件
操作步驟
創建彈性節點池。
登錄容器服務管理控制臺。
在控制臺左側導航欄,單擊集群。
在集群列表頁面,單擊目標集群名稱或者目標集群右側操作列下的詳情。
在集群管理頁左側導航欄,選擇 。
在節點池頁面,單擊創建節點池。
在創建節點池對話框中配置參數,然后單擊確認配置。以下為重點參數配置,其他參數,請參見創建ACK Pro版集群。
參數
說明
自動伸縮
選中開啟自動伸縮。
付費類型
選擇搶占式實例。
節點標簽
單擊對話框底部的顯示高級選項,設置節點標簽的鍵為
inference
,節點標簽的值為tensorflow
。擴縮容策略
單擊對話框底部的顯示高級選項,選擇成本優化策略,設置按量實例所占比例為30%,并開啟允許按量實例補償。
將訓練模型上傳到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
執行以下命令,部署推理服務。
arena serve tensorflow \ --name=bert-tfserving \ --model-name=chnsenticorp \ --selector=inference:tensorflow \ --gpus=1 \ --image=tensorflow/serving:1.15.0-gpu \ --data=model-pvc:/models \ --model-path=/models/tensorflow \ --version-policy=specific:1623831335 \ --limits=nvidia.com/gpu=1 \ --requests=nvidia.com/gpu=1
參數
說明
selector
selector
參數根據標簽選擇用于選擇TensorFlow訓練任務所需的Pods。本例設置為inference: tensorflow
。limits: nvidia.com/gpu
最多可使用的GPU卡數量。
requests: nvidia.com/gpu
需要使用的GPU卡數量。
model-name
模型的名稱。
model-path
模型的訪問路徑。
創建HPA(Horizontal Pod Autoscaler)。HPA可以根據不同負載情況,自動調整Kubernetes中的Pod副本數量。
創建
hpa.yaml
。apiVersion: autoscaling/v2beta1 kind: HorizontalPodAutoscaler metadata: name: bert-tfserving-hpa spec: scaleTargetRef: apiVersion: apps/v1 kind: Deployment name: bert-tfserving-202107141745-tensorflow-serving minReplicas: 1 maxReplicas: 10 metrics: - type: External external: metricName: sls_ingress_qps metricSelector: matchLabels: sls.project: "k8s-log-c210fbedb96674b9eaf15f2dc47d169a8" sls.logstore: "nginx-ingress" sls.ingress.route: "default-bert-tfserving-202107141745-tensorflow-serving-8501" targetAverageValue: 10
參數
說明
scaleTargetRef
設置當前HPA綁定的對象,配置為推理服務對應的Deployment名稱。
minReplicas
最小副本數。
maxReplicas
最大副本數。
sls.project
集群的日志項目名稱,配置規則為
k8s-log-{cluster id}
。sls.logstore
日志庫的名稱,默認值為
nginx-ingress
。sls.ingress.route
Ingress路由,配置規則為
{namespace}-{service name}-{service port}
。metricname
指標名稱,本文配置為
sls_ingress_qps
。targetaverageValue
觸發彈性擴容的QPS值。本文配置為
10
,表示當QPS大于10時,觸發彈性擴容。執行以下命令,部署HPA。
kubectl apply -f hpa.yaml
配置公網Ingress。
通過
arena serve tensorflow
命令部署的推理服務默認提供的是ClusterIP,不能直接通過公網訪問。因此需要為推理服務創建一個公網Ingress,方便進行訪問。登錄容器服務管理控制臺,在左側導航欄選擇集群。
在集群列表頁面,單擊目標集群名稱,然后在左側導航欄,選擇 。
在路由頁面上方,選擇推理服務所在的命名空間,然后單擊創建Ingress,配置如下參數。關于參數的更多信息,請參見創建Nginx Ingress。
名稱:本文配置為
bert-tfserving
。規則:
域名:自定義域名,例如:
test.example.com
。路徑映射
路徑:不做配置,保留根路徑
/
。匹配規則:默認(ImplementationSpecific)。
服務名稱:通過執行
kubectl get service
命令獲取。端口:本文配置為8501。
- 路由創建成功后,您可以在路由頁面的規則列獲取到Ingress地址。
使用獲取的Ingress地址對推理服務進行壓測。
登錄運維控制臺。具體操作,請參見訪問AI運維控制臺。
重要在登錄運維控制臺前,您需要安裝和配置訪問方式,具體步驟,請參見安裝云原生AI套件。
在運維控制臺導航欄選擇
,單擊推理任務頁簽,查看推理服務的詳情。擴容得到的Pod,都運行在ECS實例上。其中既有按量付費實例,也有搶占式實例(Spot),且數量比例等于創建節點池時配置的比例。