轻松搭建TensorFlow Serving集群
本文是系列中的第二篇文章,将带您快速了解Tensorflow Serving的原理和使用,并利用阿里云容器服务轻松在云端搭建TensorFlow Serving集群。如果您需要学习TensorFlow请参考基于Docker的TensorFlow实验环境
TensorFlow Serving是Google开源的一个灵活的、高性能的机器学习模型服务系统,能够简化并加速从模型到生产应用的过程。它除了原生支持TensorFlow模型,还可以扩展支持其他类型的机器学习模型。
TensorFlow Serving的典型的流程如下:学习者(Learner,比如TensorFlow)根据输入数据进行模型训练。等模型训练完成、验证之后,模型会被发布到TensorFlow Serving系统服务器端。客户端提交请求,由服务端返回预测结果。客户端和服务端之间的通信采用的是RPC协议。
原图来自于 First Contact With TensorFlow
本机运行TensorFlow Serving示例
TensorFlow Serving也提供了Docker的方式来安装或使用,但是目前并没有提供官方镜像或者提供Dockerfile来进行自动构建。现在需要通过手工方式来构建TensorFlow Serving镜像。
为了简化部署,我提供了两个预构建的TensorFlow Serving的示例镜像来进行测试。
registry.cn-hangzhou.aliyuncs.com/denverdino/tensorflow-serving : TensorFlow Serving的基础镜像
registry.cn-hangzhou.aliyuncs.com/denverdino/inception-serving : 基于上述基础镜像添加Inception模型实现的服务镜像
我们利用Docker命令启动名为 “inception-serving” 容器作为TF Serving服务器
docker run -d --name inception-serving registry.cn-hangzhou.aliyuncs.com/denverdino/inception-serving
之后利用Docker命令以交互式方式启动 “tensorflow-serving” 镜像作为客户端,并定义容器link,允许在容器内部通过“serving”别名来访问“inception-serving”容器
docker run -ti --name client --link inception-serving:serving registry.cn-hangzhou.aliyuncs.com/denverdino/tensorflow-serving
在客户端容器,我们执行下面的脚本,可以方便地利用“inception-serving”服务来进行图像识别。
# persian cat
curl http://f.hiphotos.baidu.com/baike/w%3D268%3Bg%3D0/sign=6268660aafec8a13141a50e6cf38f6b2/32fa828ba61ea8d3c85b36e1910a304e241f58dd.jpg -o persian_cat_image.jpg
/serving/bazel-bin/tensorflow_serving/example/inception_client --server=serving:9000 --image=$PWD/persian_cat_image.jpg
# garfield cat
curl http://a2.att.hudong.com/60/11/01300000010387125853110118750_s.jpg -o garfield_image.jpg
/serving/bazel-bin/tensorflow_serving/example/inception_client --server=serving:9000 --image=$PWD/garfield_image.jpg
注:客户端代码 inception_client.py 通过"serving:9000"访问"inception-serving"容器提供的gRPC服务
Inception模型可以方便地把我们的猫咪正确分类
一个TensorFlow Serving服务节点的计算能力是有限的,在生产环境使用需要利用一个集群实现负载均衡和高可用。TensorFlow目前提供一个基于Kubernetes的集群部署原型,也在提供对其他容器编排技术的支持。
利用容器服务部署TensorFlow Serving分布式集群
阿里云容器服务提供了简单而强大的容器编排能力,可以方便地在云端部署和管理 TensorFlow Serving 集群,并利用阿里云SLB进行负载均衡。
我们可以用如下的docker-compose模板在阿里云上一键部署Serving分布式集群
version: '2'services: serving: image: registry.cn-hangzhou.aliyuncs.com/denverdino/inception-serving ports:
- 9000:9000
labels:
aliyun.scale: "3"
aliyun.lb.port_9000: tcp://inception-serving:9000
注:阿里云的扩展标签如下
aliyun.scale
指明需要3个容器实例提供 serving 服务aliyun.lb.port_9000
指明通过名为"inception-serving"的SLB为容器的9000服务端口提供负载均衡
首先,我们需要创建一个负载均衡实例,然后编辑名称设置为"inception-serving"
然后添加监听端口TCP/9000,对应后端端口9000,如下
几分钟之后编排模板部署完毕,每个“serving”容器在宿主机上暴露了9000端口,相应节点被容器服务自动绑定到"inception-serving" SLB作为后端服务器。
我们可以从刚才本机创建的client容器中执行下面的命令将预测请求发送给阿里云上的云服务器,注:请将其中gRPC服务器地址换为负载均衡实例的地址。
/serving/bazel-bin/tensorflow_serving/example/inception_client --server=<SLB_IP>:9000 --image=$PWD/garfield_image.jpg
执行结果如下
D0922 14:31:39.463336540 31 ev_posix.c:101] Using polling engine: poll
outputs {
key: "classes"
value {
dtype: DT_STRING
tensor_shape {
dim {
size: 1
}
dim {
size: 5
}
}
string_val: "tabby, tabby cat"
string_val: "Egyptian cat"
string_val: "tiger cat"
string_val: "Persian cat"
string_val: "lynx, catamount"
}
}
outputs {
key: "scores"
value {
dtype: DT_FLOAT
tensor_shape {
dim {
size: 1
}
dim {
size: 5
}
}
float_val: 8.45185947418
float_val: 7.37638807297
float_val: 7.24321079254
float_val: 7.21496248245
float_val: 4.0578494072
}
}
E0922 14:31:41.027554353 31 chttp2_transport.c:1810] close_transport: {"created":"@1474554701.027514401","description":"FD shutdown","file":"src/core/lib/iomgr/ev_poll_posix.c","file_line":427}
我们的加菲猫就妥妥地被识别出来了。
总结
利用阿里云容器服务我们可以在云端快速测试、部署深度学习应用,让机器学习不再高冷。阿里云为机器学习提供了丰富的基础设施,从弹性计算、负责均衡到对象存储,日志、监控等等。容器服务可以优雅地将这些能力整合起来,释放深度学习应用的威力。
同时TensorFlow Serving 非常适于持续训练和基于真实数据动态调整的多重模型,可以和阿里云容器服务的DevOps能力结合起来将简化和模型优化的测试发布流程。
阿里云容器服务还会和高性能计算(HPC)团队一起配合,之后在阿里云上提供结合GPU加速和Docker集群管理的机器学习解决方案,在云端进一步提升机器学习的效能。