本文介绍如何通过Arena将TensorFlow模型部署成推理服务。
前提条件
操作步骤
本文采用TensorFlow 1.15训练的Bert模型部署推理服务,并导出为saved model。
执行以下命令,检查集群中可用的GPU资源。
arena top node
预期输出:
NAME IPADDRESS ROLE STATUS GPU(Total) GPU(Allocated) cn-beijing.192.168.0.100 192.168.0.100 <none> Ready 1 0 cn-beijing.192.168.0.101 192.168.0.101 <none> Ready 1 0 cn-beijing.192.168.0.99 192.168.0.99 <none> Ready 1 0 --------------------------------------------------------------------------------------------------- Allocated/Total GPUs of nodes which own resource nvidia.com/gpu In Cluster: 0/3 (0.0%)
从上述输出可知,该集群有3个GPU节点可以用来部署模型。
将模型上传到阿里云OSS对应的Bucket中。
重要上传到OSS的步骤以Linux系统为例,其他系统的上传操作,请参见命令行工具ossutil命令参考。
创建名称为
examplebucket
的存储空间。输入以下命令创建
examplebucket
。ossutil64 mb oss://examplebucket
以下输出结果表明已成功创建
examplebucket
。0.668238(s) elapsed
将模型上传到新建的
examplebucket
中。ossutil64 cp model.savedmodel oss://examplebucket
创建PV和PVC。
使用以下模板创建
Tensorflow.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 Tensorflow.yaml
执行以下命令,启动名称为
bert-tfserving
的tensorflow serving
实例。arena serve tensorflow \ --name=bert-tfserving \ --model-name=chnsenticorp \ --gpus=1 \ --image=tensorflow/serving:1.15.0-gpu \ --data=model-pvc:/models \ --model-path=/models/tensorflow \ --version-policy=specific:1623831335
预期输出:
configmap/bert-tfserving-202106251556-tf-serving created configmap/bert-tfserving-202106251556-tf-serving labeled configmap/bert-tfserving-202106251556-tensorflow-serving-cm created service/bert-tfserving-202106251556-tensorflow-serving created deployment.apps/bert-tfserving-202106251556-tensorflow-serving created INFO[0003] The Job bert-tfserving has been submitted successfully INFO[0003] You can run `arena get bert-tfserving --type tf-serving` to check the job status
执行以下命令,查看当前运行的服务列表。
arena serve list
当前只有
bert-tfserving
服务在运行:NAME TYPE VERSION DESIRED AVAILABLE ADDRESS PORTS bert-tfserving Tensorflow 202106251556 1 1 172.16.95.171 GRPC:8500,RESTFUL:8501
执行以下命令,查看推理服务
bert-tfserving
详情。arena serve get bert-tfserving
预期输出:
Name: bert-tfserving Namespace: inference Type: Tensorflow Version: 202106251556 Desired: 1 Available: 1 Age: 4m Address: 172.16.95.171 Port: GRPC:8500,RESTFUL:8501 Instances: NAME STATUS AGE READY RESTARTS NODE ---- ------ --- ----- -------- ---- bert-tfserving-202106251556-tensorflow-serving-8554d58d67-jd2z9 Running 4m 1/1 0 cn-beijing.192.168.0.88
从上述输出可知,通过
tensorflow serving
部署模型成功,并提供了8500(GRPC)和8501(HTTP)两个API端口。通过
arena serve tensorflow
部署的推理服务默认提供ClusterIP,需要配置公网Ingress才能直接访问。在集群列表页面,单击目标集群名称,然后在左侧导航栏,选择
。在页面顶端的命名空间列表,选择第6步中推理服务所在的命名空间
inference
。单击页面右上角的创建Ingress。关于参数的更多信息,请参见创建Nginx Ingress。
名称:本文配置为
Tensorflow
。规则:
域名:自定义域名,例如
test.example.com
。路径映射:
路径:不做配置,保留根路径
/
。匹配规则:默认(ImplementationSpecific)。
服务名称:通过执行
kubectl get service
命令获取。端口:本文配置为8501。
路由创建成功后,在路由页面的规则列获取Ingress地址。
执行以下命令,调用推理服务接口。更多关于
tensorflow serving
的信息,请参见API文档Tensorflow Serving API。curl "http://<Ingress地址>"
预期输出:
{ "model_version_status": [ { "version": "1623831335", "state": "AVAILABLE", "status": { "error_code": "OK", "error_message": "" } } ] }