Tensorflow-Serving-on-Kubernetes
概述
TensorFlow Serving is a flexible, high-performance serving system for machine learning models, designed for production environments.
在 Tensorflow 给的官方例子中 Use TensorFlow Serving with Kubernetes,是将模型拷贝到镜像里的,这里是会有点不太灵活,因为更新模型就要重新构建镜像,并且再去更新对应的 Pod。
由于 Tensorflow Serving 本身就提供了滚动更新模型的能力,而 TenC 提供的 Ceph 存储可以让 Tensorflow Serving 通过 S3 来直接读取模型文件。
关于 Demo,希望大家可以通过 Amazon S3 Tools Usage,了解一下 s3cmd
的用法,在 TenC 环境中,可以通过 hub.oa.com/public/s3cmd:latest
镜像来操作 Ceph 存储里的文件。
这个简单的 Demo 可以在这里找到: tensorflow-serving。
Practice
在 Kubernetes 上通过 Workload 来部署模型,和随时更新模型,需要提前准备下面的材料。
- Serving 镜像
- 模型文件和 s3cmd 的环境
Serving镜像
Serving 镜像可以在 Tensorflow Serving 官方的镜像仓库获取。选择镜像的时候,务必注意是否为 GPU 版本。然后 tag
为自己的镜像仓库。
|
|
模型文件和s3cmd环境
这是 tensorflow/serving 提供的例子。模型所在的地址在这里。
|
|
由于目前 TenC Ceph 存储只允许上传单个文件,此处的操作方式是先打包这个模型文件夹,再上传,通过 Volumes 挂载到 Jobflow 的 Pod 上,然后在 Pod 里面解压,最后通过 s3cmd put
来递归上传整个模型文件夹。
假设大家对 s3cmd
有所了解了,可以在 TenC 上部署的 s3cmd 环境。如果需要访问项目下面的 bucket
,需要 Access key
和 Secret key
,可以按照下图的方式找到项目对应的 Ceph 存储的两个 Key。
关于 s3cmd
环境的部署可以参考 S3_CMD 这个 Jobflow,本文不赘述了,等节点运行起来之后,登录容器再进行下列操作。
|
|
部署Workload
这里需要在创建 Workload 的时候,传入跟 Tensorflow 与 S3 相关的几个环节变量,否则 Serving 是无法加载 S3 的模型。
|
|
更新模型
这里测试的更新方式是直接上传一个 version
更大的模型文件夹。然后再通过 s3cmd put
上传到 Ceph 存储。
|
|
然后再通过 curl
来查看模型服务的情况,可以发现 version
为 124 的模型是 AVAILABLE
的,而 123 的模型变成 END
,这是由 Serving 默认的 Version Policy 决定的,会自动加载模型版本号更大的模型。
|
|
测试
下面我们通过几个简单的 curl
请求来测试一下我们部署的 tensorflow-serving Workload。测试的环境可以参考 Serving_Curl。
|
|
下面通过 curl
已经部署的 Pod IP 和 HTTP 对应的8501端口,查看部署模型的 metadata
信息,将会输出 signature_def
等信息。
|
|
可以通过 Serving Pod 对应的 Serving 的 name 和集群 IP 来请求结果,分别是 tensorflow-serving
和 172.17.91.182
见下图。所以就算更新了 Pod,Pod IP 变化了,通过上述两种方法,依然可以路由到 serving 的服务。
|
|
总结
目前通过 Workload 来部署 Tensorflow Serving 还是非常便利的,同时通过 S3 来管理模型,也提供了滚动更新模型的能力。
参考资料
- Use TensorFlow Serving with Kubernetes
- Train and serve a TensorFlow model with TensorFlow Serving
- tensorflow/serving
- TensorFlow on S3
- Tensorflow Serving RESTful API
- Amazon S3 Tools Usage