模型训练完成后,通常会被部署成推理服务。推理服务的调用量会随着业务需求动态变化,这就需要服务器能弹性扩缩容来节省成本。在大规模高并发的节点需求情况下,常规的部署方案无法满足此类需求。阿里云容器服务提供了弹性节点池,可以基于弹性节点池部署模型推理服务,满足弹性伸缩的需求。本文介绍如何基于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。url
:OSS的访问路径。akId
:账号的AccessKey ID,该账号需要拥有访问OSS的权限。akSecret
:账号的AccessKey Secret,该账号需要拥有访问OSS的权限。
- 执行以下命令,创建PV和PVC。
kubectl apply -f pvc.yaml
- 创建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
重要 您需要通过--selector参数设置,把模型部署到步骤1中创建的节点池中。推理服务参数说明如下:
nodeSelector
:设置为弹性节点池的节点标签,推理服务通过nodeSelector把Pod调度到弹性节点池。本例设置为inference: tensorflow
。limits: nvidia.com/gpu
:最多可使用的GPU卡。requests: nvidia.com/gpu
:需要使用的GPU卡。model-name
:模型的名称。model-path
:模型的访问路径。
- 创建HPA。
- 创建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
HPA参数说明如下:
scaleTargetRef
:当前HPA绑定的对象。minReplicas
:最小副本数。maxReplicas
:最大副本数。sls.project
:集群的日志项目名称,配置规则为k8s-log-{cluster id}
。sls.logstore
:日志库的名称。sls.ingress.route
:Ingress路由,配置规则为{namespace}-{service name}-{service port}
。metricName
:QPS的指标名称。targetAverageValue
:触发弹性扩容的QPS值。本例设置为10,表示当QPS大于10时,触发弹性扩容。
- 执行以下命令,部署HPA。
kubectl apply -f hpa.yaml
- 创建hpa.yaml。
- 配置公网Ingress。具体操作,请参见创建Nginx Ingress。说明 通过
arena serve tensorflow
部署的推理服务默认提供的是ClusterIP,不能直接访问。您需要为推理服务创建Ingress,具体参数设置如下:- 命名空间选择inference。
- 服务的端口配置为8501端口(RESTFUL)。
- 路由创建成功后,您可以在路由页面的规则列获取到Ingress地址。
- 对推理服务进行压测,然后登录运维控制台。在登录运维控制台前,您需要安装和配置访问方式,具体步骤,请参见安装云原生AI套件。
- 在运维控制台导航栏选择 ,查看推理服务详情。可以看到扩容出来的Pod中,都运行在ECS实例上。其中既有按量付费实例,也有抢占式实例(Spot),且数量比例等于创建节点池时配置的比例。